Hi, which PIC18F4550 silicon version are you using? It could be affected by the infamous EUSART bug as described here: http://www.ucapps.de/mbhp_usb_pic.html
The bug has been fixed in rev5 Best Regards, Thorsten. Am 23.02.2009 um 19:16 schrieb Kustaa Nyholm: > Hi > > I've managed to prune down my code to single/simple one filer that > reproduces the problem. > > I'd welcome any suggestions, including what list is the best list to > discuss this sort of problem. > > > To re-iterate my problem. I send four bytes ( 4 * 0x55) and receive > from my Mac, with Java > as follows: > > int cnt=0; > while (true) { > cnt++; > m_OutputStream.write(0x55); > m_OutputStream.write(0x55); > m_OutputStream.write(0x55); > m_OutputStream.write(0x55); > for (int i=0; i<4; ++i) { > int > ch=m_InputStream.read(); > if (ch>=0 && ch!=0x55) > > System.out.printf("%d %02X\n",cnt, ch); > } > Thread.sleep(50); > } > > So it expects that the 55's are echoed back: > > The code on the PIC is below. What it does it received characters > using interrupt > and echoes them back. If the character received is not 0x55 it > toggles on output pin, > which I'm monitoring with oscilloscope, as well as the data sent by > my Mac. > > Running this code generates a lot of toggles on the output pin and > on the > Mac console I see errors too. If I add inter character delays on the > Mac side > or remove the sending of echos from the PIC code the errors go away. > Baudrate has no effect. > > So I'm rather baffled, what am I missing? > > br Kusti > > Here is the PIC code: > > #include <stdio.h> > #include "usart.h" > #include "pic18fregs.h" > > code char at 0x300000 CONFIG1L = 0x20; // USBDIV=1, CPUDIV=00, > PLLDIV = 000 > code char at 0x300001 CONFIG1H = 0x0E; // IESO=0, FCMEN=0, FOSC = 1110 > code char at 0x300002 CONFIG2L = 0x20; // Brown out off, PWRT On > code char at 0x300003 CONFIG2H = 0x00; // WDT off > code char at 0x300004 CONFIG3L = 0xff; // Unused configuration bits > code char at 0x300005 CONFIG3H = 0x81; // Yes MCLR, PORTB digital, > CCP2 - RC1 > code char at 0x300006 CONFIG4L = 0x80; // ICD off, ext off, LVP off, > stk ovr off > code char at 0x300007 CONFIG4H = 0xff; // Unused configuration bits > code char at 0x300008 CONFIG5L = 0xff; // No code read protection > code char at 0x300009 CONFIG5H = 0xff; // No data/boot read protection > code char at 0x30000A CONFIG6L = 0xff; // No code write protection > code char at 0x30000B CONFIG6H = 0xff; // No data/boot/table > protection > code char at 0x30000C CONFIG7L = 0xff; // No table read protection > code char at 0x30000D CONFIG7H = 0xff; // No boot table protection > > #define LED_PIN PORTBbits.RB4 > #define LED_TRIS TRISBbits.TRISB4 > > #define CRITICAL(CODE) do { \ > static unsigned char __sdcc_iflags; \ > __sdcc_iflags = (INTCON & 0xC0); \ > INTCON &= ~0xC0; \ > do { CODE; } while (0); \ > INTCON |= __sdcc_iflags; \ > } while(0) > > void stdio_init() { > usart_open(USART_TX_INT_OFF & // > USART_RX_INT_ON & // > USART_BRGH_LOW & // > USART_ASYNCH_MODE & // > USART_EIGHT_BIT, // > 77 // = SPBRG, 9600 baud @ 48 MHz CPU clock > ); > stdout = STREAM_USART; > } > > #pragma nooverlay > > volatile unsigned char flag = 0; > > void usartirq() interrupt 1 > { > if (usart_drdy()) { > unsigned char t; > flag = usart_getc(); > if (flag != 0x55) { > if (LED_PIN==0) > LED_PIN=1; > else > LED_PIN = 0; > } > } > } > > void main() { > int i; > OSCCON = 0x70; > > LED_TRIS = 0; > > INTCON = 0; > > INTCONbits.GIE = 1; // Enable all interrupts. > > INTCONbits.PEIE = 1; // Enable peripheral interrupts. > > stdio_init(); > > while (1) { > unsigned char t; > CRITICAL (t=flag; flag=0); > if (t) > usart_putc(t); > } > > } > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ________________________________________ > From: Kustaa Nyholm [kustaa.nyh...@planmeca.com] > Sent: Sunday, February 22, 2009 9:28 PM > To: sdcc-user@lists.sourceforge.net > Subject: [Sdcc-user] PIC18F4550 USART problems > > Hi, > > I'm having problems with PIC18F4550 USART. I'm using the usart.h > routines, with interrupts enabled for receiving. > > I've got a PC that sends group of three bytes (0x55) through a > serial port at 9600 baud with no pause between bytes and 100 msec > between groups. > > I have an *low* priority interrupt in the PIC that receives bytes > from the USART and toggles on output if the byte received is not > 0x55. No other interrupts are running/enabled. I'm observing the > output with an oscilloscope. The output never toggles, unless I > deliberately send wrong characters. As expected. > > This works at different baudrates and with different delays between > chars and groups. As expected. > > If I enable my main program loop the problems start. The main loop > just checks if a character is received and sends out a char through > the USART. Sending is not interrupt driven. > > Observing the output pin and the PIC USART RX pin I see consistently > that after reception of two character (from PC to PIC) the output > sometimes toggles. Sometimes it also toggles after the third char. > This does not happen all the time but intermittently like once or > twice a second. It never toggles after the first character in the > group. So the problem happens at about the same time the first > character that PIC main program sends completes. > > If I add a 1 ms (about one char time) between chars sent from the > PC , the problem mostly, but not totally, goes away. If I add 5 ms > between chars the problem disappears. > > Changing my receive interrupt to toggle every time a character is > sent I see that sometimes interrupts are missing. > > I've googled a bit and looked the chip errata but not found anything > special, USART and interrupts in PIC seem rather straightforward. > > I'll try to come up with a very small self contained test case, but > meanwhile I'd like to know if there are know issues or things I > should/could check. > > br Kusti > > > ------------------------------------------------------------------------------ > Open Source Business Conference (OSBC), March 24-25, 2009, San > Francisco, CA > -OSBC tackles the biggest issue in open source: Open Sourcing the > Enterprise > -Strategies to boost innovation and cut costs with open source > participation > -Receive a $600 discount off the registration fee with the source > code: SFAD > http://p.sf.net/sfu/XcvMzF8H > _______________________________________________ > Sdcc-user mailing list > Sdcc-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/sdcc-user > > ------------------------------------------------------------------------------ > Open Source Business Conference (OSBC), March 24-25, 2009, San > Francisco, CA > -OSBC tackles the biggest issue in open source: Open Sourcing the > Enterprise > -Strategies to boost innovation and cut costs with open source > participation > -Receive a $600 discount off the registration fee with the source > code: SFAD > http://p.sf.net/sfu/XcvMzF8H > _______________________________________________ > Sdcc-user mailing list > Sdcc-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/sdcc-user ------------------------------------------------------------------------------ Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise -Strategies to boost innovation and cut costs with open source participation -Receive a $600 discount off the registration fee with the source code: SFAD http://p.sf.net/sfu/XcvMzF8H _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user