|
18f4550 usb interfacing...
[复制链接]
|
|
发表于 17-2-2009 08:42 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 3-3-2009 03:33 PM
|
显示全部楼层
版主大大,前阵子在忙其他功课。
现在可以继续做project了。
上次说到那个lcd和lm35的部分。
1.请问MPLAB是不是不可以用那个program的啊?
2.那么如果我是用mplab的话,要怎么改啊?会很难吗?
3.另外再问下,请问有没有软件可以在电脑上就可以测试到或看到我自己写的program烧进pic单片后的结果?
4.我今天装了ccs demo version.当我把上面的code放进去compile之后,出现 error90, 说 LCD_INIT_STRING (Attempt to create a pointer to a constant)的错误。
然后我把16f877a.h换成18f4550之后也有问题,不能compile,说unknown device..
希望PIC 版主可以帮我。。
[ 本帖最后由 冷血趙雲 于 4-3-2009 10:47 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 5-3-2009 09:35 AM
|
显示全部楼层
原帖由 冷血趙雲 于 3-3-2009 03:33 PM 发表
1.请问MPLAB是不是不可以用那个program的啊?
不可以。
2.那么如果我是用mplab的话,要怎么改啊?会很难吗?
MPlab只是界面, 不是Compiler, 除非你挂上C18, CCS C, ASM 之类的。
3.另外再问下,请问有没有软件可以在电脑上就可以测试到或看到我自己写的program烧进pic单片后的结果? 参考:【讨论】Proteus VSM
4.我今天装了ccs demo version.当我把上面的code放进去compile之后,出现 error90, 说 LCD_INIT_STRING (Attempt to create a pointer to a constant)的错误。
你修改过源码?
然后我把16f877a.h换成18f4550之后也有问题,不能compile,说unknown device..
建议你要求学校购买CCS C PCWH 完整版。 |
|
|
|
|
|
|
|
发表于 5-3-2009 06:49 PM
|
显示全部楼层
原帖由 pic 于 5-3-2009 09:35 AM 发表
不可以。
MPlab只是界面, 不是Compiler, 除非你挂上C18, CCS C, ASM 之类的。
参考:【讨论】Proteus VSM
你修改过源码?
建议你要求学校购买CCS C PCWH 完整版。
那个源码我没有改变过。
MPLAB我有C18了。也有用microchip所给的example测试过我的电路。
一切顺利。
可是要我自己写一个ADC+LCD的program给18F4550我就真的不会了。。
请问pic版主用的ccs是完整版的吗?
不知道版主可以用你的code compile了hex file给我测试吗?
[ 本帖最后由 冷血趙雲 于 5-3-2009 06:50 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 5-3-2009 09:57 PM
|
显示全部楼层
原帖由 冷血趙雲 于 5-3-2009 06:49 PM 发表
可是要我自己写一个ADC+LCD的program给18F4550我就真的不会了。。
只是把16F877A 改成 18F4550而已
是。
不知道版主可以用你的code compile了hex file给我测试吗?
可以, 只是一次,下不为例。
18F4550_ADC_LCD.zip- #include <18F4520.h>
- #device ADC=10
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- #use delay(clock=20000000)
- ///////////////////////////////////////////////////////////////////////////////
- // LCD Driver
- ///////////////////////////////////////////////////////////////////////////////
- // As defined in the following structure the pin connection is as follows:
- /*
- LCD 16 X 2 line
- PortD.0-> RS
- PortD.1-> RW
- PortD.2-> E
- PortD.3
- PortD.4-> D4
- PortD.5-> D5
- PortD.6-> D6
- PortD.7-> D7
- */
- /////////////////////////////////////////////////////////////////
- // LCD Driver
- struct lcd_pin_map { // This structure is overlayed
- boolean rs; // on to an I/O port to gain
- boolean rw; // access to the LCD pins.
- boolean enable; // The bits are allocated from
- boolean unused; // low order up. ENABLE will
- int data : 4; // be pin B0.
- } lcd;
- #byte lcd = 0x08 // on to port D (at address 0x08)
- byte CONST LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};
- void lcd_send_nibble( byte n )
- {
- lcd.data = n;
- delay_cycles(1);
- lcd.enable = 1;
- delay_us(2);
- lcd.enable = 0;
- }
- void lcd_send_byte( byte address, byte n )
- {
- lcd.rs = 0;
- delay_ms(5);
- lcd.rs = address;
- delay_cycles(1);
- lcd.rw = 0;
- delay_cycles(1);
- lcd.enable = 0;
- lcd_send_nibble(n >> 4);
- lcd_send_nibble(n & 0xf);
- }
- void lcd_init()
- {
- byte i;
- set_tris_d(0);
- lcd.rs = 0;
- lcd.rw = 0;
- lcd.enable = 0;
- delay_ms(15);
- for(i=1;i<=3;++i) {
- lcd_send_nibble(3);
- delay_ms(5);
- }
- lcd_send_nibble(2);
- for(i=0;i<=3;++i)
- {
- lcd_send_byte(0,LCD_INIT_STRING[i]);
- }
- }
- void lcd_gotoxy( byte x, byte y)
- {
- byte address;
- if(y!=1)
- address=0x40;
- else
- address=0;
- address+=x-1;
- lcd_send_byte(0,0x80|address);
- }
- void lcd_putc( char c)
- {
- switch (c) {
- case '\f' : lcd_send_byte(0,1); //delay_ms(5);
- break;
- case '\n' : lcd_gotoxy(1,2); break;
- default : lcd_send_byte(1,c); break;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- void main()
- {
- long value;
- lcd_init();
- delay_ms(6);
- lcd_putc("\fLight Measure");
- lcd_putc("\nBy : PIC @ cArI");
- delay_ms(1000);
- setup_port_a( ALL_ANALOG );
- setup_adc( ADC_CLOCK_INTERNAL );
- set_adc_channel( 0 );
- while(TRUE)
- {
- value = Read_ADC();
- printf(lcd_putc,"\fReading: %lu ",value);
- delay_ms(500);
- }
- }
复制代码
[ 本帖最后由 pic 于 6-3-2009 09:14 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 5-3-2009 10:36 PM
|
显示全部楼层
原帖由 pic 于 5-3-2009 09:57 PM 发表
只是把16F877A 改成 18F4550而已
是。
可以, 只是一次,下不为例。
18F4550_ADC_LCD.zip#include
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
/////////////// ...
真的很感谢版主的帮助!
我把这个做完了的话会整理一下资料给其他网友看,
希望他们也可以得到想我现在得到的帮助!
谢谢。 |
|
|
|
|
|
|
|
发表于 6-3-2009 09:27 AM
|
显示全部楼层
4.我今天装了ccs demo version.当我把上面的code放进去compile之后,出现 error90, 说 LCD_INIT_STRING (Attempt to create a pointer to a constant)的错误。
纠正: 我发现发源码时, 有些字符会消失, 所以, 处了 用 [ code ] [ /code ] 代码, 还要 禁用 Smilies。
还有, 当用copy paste 时, [ i ] 会被误认为是Italic 效果
这是为什么你得到: error90, LCD_INIT_STRING (Attempt to create a pointer to a constant)的错误。- ——--------------
- 不正确:
- 没有禁用 Smilies
- ——--------------
- for(i=0;i<=3;++i)
- {
- lcd_send_byte(0,LCD_INIT_STRING);
- }
- lcd_putc("\fLight Measure";
- lcd_putc("\nBy : PIC @ cArI";
复制代码- ——--------------
- 正确:
- 禁用 Smilies
- ——--------------
- for(i=0;i<=3;++i)
- {
- lcd_send_byte(0,LCD_INIT_STRING[i]);
- }
- lcd_putc("\fLight Measure");
- lcd_putc("\nBy : PIC @ cArI");
复制代码 |
|
|
|
|
|
|
|
发表于 6-3-2009 05:11 PM
|
显示全部楼层
原来啊。。。
我就是发觉怎么一直compile就是还是不对- -
真的谢谢版主啦。
本来还想再问的。。又不好意思。。哈哈。 |
|
|
|
|
|
|
|
发表于 6-3-2009 05:54 PM
|
显示全部楼层
报告版主。。
我的LCD和LM接上电路之后,再把那个hex file用bootloader烧进去。
可是要烧进去之前,它说我的bootloader的config和hex file的config不同,如果照样烧进去的话,以后可能不能用bootloader.
所以第一次我测试就不用hex file的config了。把program烧进去后测试。
看到LCD只是出现上面那列全部都黑色。下方没有东西。
失败了。
那就再烧一次。这次烧进去时候,用hex file 的 config了。一烧完之后,测试一下看还可以用bootloader不。结果不能了。就继续测试刚才那个lcd看可以有什么结果。
结果,和第1次的一样。。。LCD screen上面那行全部都亮,(就是都黑色的意思)。下面那行全部没有亮。。
请问是什么原因呢? |
|
|
|
|
|
|
|
发表于 6-3-2009 10:35 PM
|
显示全部楼层
原帖由 冷血趙雲 于 6-3-2009 05:54 PM 发表
看到LCD只是出现上面那列全部都黑色。下方没有东西。
RV1 有调整了吗?(调Contrast)
注意检查不要接错线。
还有不好意思, 源码有错误,在第33行左右 修正如下。- //#byte lcd = 0x08 // on to port D (at address 0x08)
- #byte lcd = 0xf83 // on to port D 18F MCU (at address 0xf83)
复制代码 ——
下载02
|
|
|
|
|
|
|
|
发表于 7-3-2009 08:01 AM
|
显示全部楼层
原帖由 pic 于 6-3-2009 10:35 PM 发表
RV1 有调整了吗?(调Contrast)
注意检查不要接错线。
还有不好意思, 源码有错误,在第33行左右 修正如下。//#byte lcd = 0x08 // on to port D (at address 0x08)
#byte lcd = 0xf83 ...
版主。请问要如何检查自己的lcd有没有坏呢?
正常的话不接program,他会是如何的?
为什么我只出现上面那排是全部黑的。。
下面的却是没有东西。。
还有我接back light和没有接好像都没有分别。。
你给的program我试了用proteus来测试,是可以走了的。
证明program没有问题。。
可是我的情况还是一样。lcd没有display. |
|
|
|
|
|
|
|
发表于 7-3-2009 09:09 AM
|
显示全部楼层
原帖由 冷血趙雲 于 7-3-2009 08:01 AM 发表
版主。请问要如何检查自己的lcd有没有坏呢?
正常的话不接program,他会是如何的?
不接program, 上电后多数空一片,或乱码(很少)
如果Contrast 不对, 上排会黑一片。
为什么我只出现上面那排是全部黑的。。
下面的却是没有东西。。
请问RV1 有调整了吗?(调Contrast)
答案: 有 或 没有。
要不然就是你接错线。。。
还有我接back light和没有接好像都没有分别。。
你的LCD 有多少pin?14pin? 16 pin?
你能放清楚的照片看看吗?
清楚: 定义就是让人看了明白, 一看就明白, 不会问你长, 问你短,照时请用Macro mode, 对焦(Focus)正确, 清晰的照片,不要那种蒙蒙的, 照片640x480 为佳, 从主要的和不同的角度拍下。 |
|
|
|
|
|
|
|
发表于 7-3-2009 09:29 AM
|
显示全部楼层
原帖由 pic 于 7-3-2009 09:09 AM 发表
不接program, 上电后多数空一片,或乱码(很少)
如果Contrast 不对, 上排会黑一片。
请问RV1 有调整了吗?(调Contrast)
答案: 有 或 没有。
要不然就是你接错线。。。
你的LCD 有多少pin?1 ...
版主,我拍了照片,只是拍那个lcd的而已。。
本身手机拍照像素很差。。。不敢拍完全部。。不然一定“不清楚”的。。- -
link:http://i282.photobucket.com/albums/kk253/game4ulov/20090307.jpg
那么照你这么说。。这个情况是contrast问题??
可是我有接了。。用variable resistor调它也只是那排黑色浅一些或者深一些而已。。
这个是16个pin的。我把A和K分别接去gnd和vcc,没有看到背光。再把2者倒转,也是没有看到背光。。
[ 本帖最后由 冷血趙雲 于 7-3-2009 09:31 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 7-3-2009 10:06 AM
|
显示全部楼层
原帖由 冷血趙雲 于 7-3-2009 09:29 AM 发表
那么照你这么说。。这个情况是contrast问题??
可是我有接了。。用variable resistor调它也只是那排黑色浅一些或者深一些而已。。
请调浅一些, 隐约见到就可以了。
这个是16个pin的。我把A和K分别接去gnd和vcc,没有看到背光。再把2者倒转,也是没有看到背光。。
如没有看到背光, 请接5V,串连大概20ohm 的电阻, 去 A 和K, 如下图。
要有电阻, 不然背光LED可能会烧。
如果不可以,
请试以下的闪灯测试, 量Port D, 应该看到 5V, 0V 交替, 2秒。
如果不可以, 做到可以为止, 如你用Demo CCS C, 可能用18F4520 / 18F452, 或16F877A来compile,
18F4520/ 452 的hex 可能可以在18F4550 上运行, 但不确定, 我没试过。- // 看你是用什么MCU而定
- #include <16F877A.h>
- // #include <18F4550.h>
- // #include <18F4520.h>
- // #include <18F452.h>
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- #use delay(clock=20000000)
- void main()
- {
- while(TRUE)
- {
- output_D(0b11110000) ;
- delay_ms(2000) ;
- output_D(0b00001111) ;
- delay_ms(2000) ;
- }
- }
复制代码 |
|
|
|
|
|
|
|
发表于 7-3-2009 10:53 AM
|
显示全部楼层
原帖由 pic 于 7-3-2009 10:06 AM 发表
请调浅一些, 隐约见到就可以了。
如没有看到背光, 请接5V,串连大概20ohm 的电阻, 去 A 和K, 如下图。
要有电阻, 不然背光LED可能会烧。
如果不可以 ...
版主,我测试了那个program,也compile了不同的版本。。没有一个成功= =
我怀疑是program时候的setting..
我是用bootloader来program的。
所以当我把那个led闪烁的hex file放进去时候,就会prompt这个出来。
如果我按no的话,就可以把程序烧进去。可是setting用回bootloader的。
如果我按yes的话,烧到一半时候,device根本detect不到了。结果按bootload button也没有反应了。
是不是因为这个问题呢? |
|
|
|
|
|
|
|
发表于 7-3-2009 12:21 PM
|
显示全部楼层
- // 看你是用什么MCU而定
- //#include <16F877A.h>
- #include <18F4550.h>
- //#include <18F4520.h>
- //#include <18F452.h>
- #fuses HS,NOWDT,NOPROTECT,NOLVP,NOPBADEN,WRTB,VREGEN,PLL5,HSPLL
- #use delay(clock=20000000)
- void main()
- {
- while(TRUE)
- {
- output_D(0b11110000) ;
- delay_ms(200) ;
- output_D(0b00001111) ;
- delay_ms(200) ;
- }
- }
复制代码 我加多那几项setting之后,没有那个窗口跳出来了。可以直接用bootloader烧进去里面。
可是结果,portD还是不会闪烁。。。把code换去其他的port,还是不能闪烁。。。
可是把program放进去proteus里面走,就一切很正常。
我也有check过我的circuit。可是也没有问题,因为用microchip给的那些demo code放进去的话,也很正常。。。
不知道什么原因。
我做在pcb board的circuit是这样。
我现在打算这样。
我先不要用lcd接上mcu,
而只是想接lm35进去mcu而已。
然后写一个program,看看读到lm35还是不,
不知道那个program要怎样写呢?
最简单的就可以了。
如果读到是ok的。那就应该证明mcu circuit没有问题吧。
只是猜测。。
[ 本帖最后由 冷血趙雲 于 7-3-2009 12:24 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 7-3-2009 02:24 PM
|
显示全部楼层
用这个, 你应该可以用Bootloader。-
- #include <18F4550.h>
- #device adc=10
- #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
- #use delay(clock=48000000)
复制代码我现在打算这样。
我先不要用lcd接上mcu,
而只是想接lm35进去mcu而已。
然后写一个program,看看读到lm35还是不,
不知道那个program要怎样写呢?
最简单的就可以了。
如果读到是ok的。那就应该证明mcu circuit没有问题吧。
只是猜测。。
如果闪灯在PortD 这个最基本的都做不到的话, 其他的都不用试了。 |
|
|
|
|
|
|
|
发表于 7-3-2009 02:43 PM
|
显示全部楼层
原帖由 pic 于 7-3-2009 02:24 PM 发表
用这个, 你应该可以用Bootloader。
#include
#device adc=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
如果闪灯在PortD 这个最基本的都做不到 ...
有好转了!
今早一直都在找关于这个的资料。
结果找到这篇文章。http://www.ccsinfo.com/forum/viewtopic.php?t=31745&highlight=18f4550
所以就试了加几行进去。变成这样- #include <18F4550.h>
- //#include <16F877A.h>
- #device ADC=10
- #fuses HS,NOWDT,NOPROTECT,NOLVP,XT
- #use delay(clock=20000000)
- #define LOADER_END 0x7FF
- #define LOADER_SIZE 0x6FF
- #build(reset=LOADER_END+1, interrupt=LOADER_END+9)
- #org 0, LOADER_END {} // nothing will replace the bootloader memory space
- ///////////////////////////////////////////////////////////////////////////////
- // LCD Driver
- ///////////////////////////////////////////////////////////////////////////////
- // As defined in the following structure the pin connection is as follows:
- /*
- LCD 16 X 2 line
- PortD.0-> RS
- PortD.1-> RW
- PortD.2-> E
- PortD.3
- PortD.4-> D4
- PortD.5-> D5
- PortD.6-> D6
- PortD.7-> D7
- */
- /////////////////////////////////////////////////////////////////
- // LCD Driver
- struct lcd_pin_map { // This structure is overlayed
- boolean rs; // on to an I/O port to gain
- boolean rw; // access to the LCD pins.
- boolean enable; // The bits are allocated from
- boolean unused; // low order up. ENABLE will
- int data : 4; // be pin B0.
- } lcd;
- //#byte lcd = 0x08 // on to port D (at address 0x08)
- #byte lcd = 0xf83 // on to port D (at address 0x08)
- byte CONST LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};
- void lcd_send_nibble( byte n )
- {
- lcd.data = n;
- delay_cycles(1);
- lcd.enable = 1;
- delay_us(2);
- lcd.enable = 0;
- }
- void lcd_send_byte( byte address, byte n )
- {
- lcd.rs = 0;
- delay_ms(5);
- lcd.rs = address;
- delay_cycles(1);
- lcd.rw = 0;
- delay_cycles(1);
- lcd.enable = 0;
- lcd_send_nibble(n >> 4);
- lcd_send_nibble(n & 0xf);
- }
- void lcd_init()
- {
- byte i;
- set_tris_d(0);
- lcd.rs = 0;
- lcd.rw = 0;
- lcd.enable = 0;
- delay_ms(15);
- for(i=1;i<=3;++i) {
- lcd_send_nibble(3);
- delay_ms(5);
- }
- lcd_send_nibble(2);
- for(i=0;i<=3;++i)
- {
- lcd_send_byte(0,LCD_INIT_STRING);
- }
- }
- void lcd_gotoxy( byte x, byte y)
- {
- byte address;
- if(y!=1)
- address=0x40;
- else
- address=0;
- address+=x-1;
- lcd_send_byte(0,0x80|address);
- }
- void lcd_putc( char c)
- {
- switch (c) {
- case '\f' : lcd_send_byte(0,1); //delay_ms(5);
- break;
- case '\n' : lcd_gotoxy(1,2); break;
- default : lcd_send_byte(1,c); break;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- void main()
- {
- long value;
- lcd_init();
- delay_ms(6);
- lcd_putc("\fADC on LCD");
- lcd_putc("\nBy : PIC @ cArI");
- delay_ms(1000);
- setup_port_a( ALL_ANALOG );
- setup_adc( ADC_CLOCK_INTERNAL );
- set_adc_channel( 0 );
- while(TRUE)
- {
- value = Read_ADC();
- printf(lcd_putc,"\fReading: %lu C",value);
- delay_ms(500);
- }
- }
复制代码 当我加了这几行之后。
#define LOADER_END 0x7FF
#define LOADER_SIZE 0x6FF
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)
#org 0, LOADER_END {} // nothing will replace the bootloader memory space
用bootloader烧在mcu之后,可以测试到portd有闪烁了!
然后接好lcd之后,却出现了乱码。。
然后按reset之后呢。
就正常了!!!
现在问题出现了。。
出来的reading是 70多.....然后那个reading一直变动。
1.那么请问版主,到底我加那几行是什么意思呢?
2.我一supply 5v进去时候就是乱码。要按reset才可以看到,是不是因为address不对?
3.reading正常吗?
补上图片:
上面是正常,下面是乱码:
[ 本帖最后由 冷血趙雲 于 7-3-2009 02:53 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 7-3-2009 03:14 PM
|
显示全部楼层
原帖由 冷血趙雲 于 7-3-2009 02:43 PM 发表
1.那么请问版主,到底我加那几行是什么意思呢?
bootloader 是用了0-07ff的开始位置, 那几行是叫CCS compiler reserve 前面的memory。
可以帮我看下面的code 能成功吗?- #include <18F4550.h>
- #build(reset=0x800, interrupt=0x808)
- #org 0x000, 0x7ff { }
- #fuses HSPLL,NOWDT, NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
- #use delay(clock=48000000)
-
复制代码2.我一supply 5v进去时候就是乱码。要按reset才可以看到,是不是因为address不对?
你的18F4550开机时是running mode 吗?
不知道, 你有接电到AN0 吗? |
|
|
|
|
|
|
|
发表于 7-3-2009 06:07 PM
|
显示全部楼层
原帖由 pic 于 7-3-2009 03:14 PM 发表
bootloader 是用了0-07ff的开始位置, 那几行是叫CCS compiler reserve 前面的memory。
可以帮我看下面的code 能成功吗?#include
#build(reset=0x800, interrupt=0x808)
#org 0x000, 0x7ff { }
#fuses HSP ...
对不起版主,迟回复了。
之前出门了。
回到来刚刚就把你的code放进去了。
可以用!
而且没有乱码了!
然后reading从之前的70左右现在变成17左右。。(目前家里面应该有30左右)
而且reading没有那么容易飘了。
AN0有接电,就是接lm35的方法。中间脚去an0.
如果把那脚拆出来的话,reading去到110左右(之前那个program去到200多)
1.为什么不要ADC=10了?
2.fuses加了那几个是什么意思?
[ 本帖最后由 冷血趙雲 于 7-3-2009 06:53 PM 编辑 ] |
|
|
|
|
|
|
| |
本周最热论坛帖子
|