Hi, Little follow-up on my own post. Tried the same code on the 18f452 (with some small changes to the config to make it run). Thistime using SDCC 2.7.0, as the 2.8 snapshot i was using complained about missing _usart functions.
It runs as it should. Compiling the code for the 18f4520 using SDCC 2.7.0 still doesn't work. Any ideas? Thanks, -Bastiaan van Kesteren On Monday 13 October 2008 14:39:19 Bastiaan van Kesteren wrote: > Hi, > > I'm working on a project using the 18f4520, and i've ran into a problem. It > seems that passing an array to a function results in garbage being read in > the receiving function. > > It seems as if the receiving function is using the wrong address to read > from! I've fiddled with the stack, but this didn't seem to influence the > problem. I'm now using the latest SDCC snapshot (2.8.4 #5250 (Oct 12 2008)) > and gputils 0.13.6 on Linux. Tried SDCC 2.8.0 with similair results (the > garbage output was different, but still garbage..) Also tried to build this > on windows XP on another machine, using the same SDCC snapshot and gputils > version. No change there. > > Some code demonstrating this issue is attached below. I've compiled this > using > > sdcc -mpic16 -p18f4520 main.c > > and loading the resulting main.hex file using and ICD2 programmer from > MPLAB (on the Windows XP machine). > > Output on the uart @ 19200 baud should be "[????]", but I get "[??" > followed by a lot of garbage > > Hope anyone can give me some pointers here! > > Thanks in advance, > -Bastiaan van Kesteren > > --------------the code:-------------- > > #include <pic18fregs.h> > #include <usart.h> > #include <stdio.h> > > /* Initialise a stack of 255 bytes at RAM address 0x300 */ > #pragma stack 0x300 0xFF > > /* Baudrate = FOSC/(16(X+1)): 25 = 19200 @ 8MHz */ > #define BAUDRATE 25 > > /* Oscillator */ > code char at __CONFIG1H _conf0 = _OSC_INTIO67_1H; > > /* Watchdog */ > code char at __CONFIG2H _conf2 = _WDT_OFF_2H; > > /* Power up timeout and brown out detection enabled */ > code char at __CONFIG2L _conf1 = _PWRT_ON_2L & _BOREN_ON_2L; > /* MCLR settings */ > code char at __CONFIG3H _conf3 = _MCLRE_OFF_3H; > /* Low voltage programming disabled, Stack Overflow Reset enabled */ > code char at __CONFIG4L _conf4 = _LVP_OFF_4L & _STVREN_ON_4L; > /* Code protection disabled */ > code char at __CONFIG5L _conf5 = _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & > _CP3_OFF_5L; /* EEPROM read protection disabled, code protection boot > disabled */ code char at __CONFIG5H _conf6 = _CPD_OFF_5H & _CPB_OFF_5H; > /* Table write protection disabled */ > code char at __CONFIG6L _conf7 = _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L > & _WRT3_OFF_6L; /* EEPROM write protection disabled, table write protect > boot disabled, config write protect disabled */ code char at __CONFIG6H > _conf8 = _WRTD_OFF_6H & _WRTB_OFF_6H & _WRTC_OFF_6H; /* Table read protect > disabled */ > code char at __CONFIG7L _conf9 = _EBTR0_OFF_7L & _EBTR1_OFF_7L & > _EBTR2_OFF_7L & _EBTR3_OFF_7L; /* Table read protect boot disabled */ > code char at __CONFIG7H _conf10 = _EBTRB_OFF_7H; > > void serial_init() > { > // BAUDCON - baudrate generation control Register > BAUDCON = 0; // 8 bit baudrate generator, auto-baud disabled > > // SPBRG - Baud Rate Generator Register > SPBRG = BAUDRATE; > > // BRGH - High Baud Rate Select Bit > TXSTAbits.BRGH = 1; // (1 = high speed) > > // SYNC - USART Mode select Bit > TXSTAbits.SYNC = 0; // (0 = asynchronous) > > // TRISC - Tri-state Data Direction Register for port C > // RC6 - 6th pin of port C - used for Serial Transmit > // RC7 - 7th pin of port C - used for Serial Receive > TRISCbits.TRISC6 = 0; // (0 = pin set as output) > TRISCbits.TRISC7 = 1; // (1 = pin set as input) > > // SPEN - Serial Port Enable Bit > RCSTAbits.SPEN = 1; // (1 = serial port enabled) > > // TXIE - USART Transmit Interupt Enable Bit > PIE1bits.TXIE = 0; // (0 = disabled) > > // RCIE - USART Receive Interupt Enable Bit > PIE1bits.RCIE = 1; // (1 = enabled) > > // TX9 - 9-bit Transmit Enable Bit > TXSTAbits.TX9 = 0; // (0 = 8-bit transmit) > > // RX9 - 9-bit Receive Enable Bit > RCSTAbits.RX9 = 0; // (0 = 8-bit reception) > > // CREN - Continuous Receive Enable Bit > RCSTAbits.CREN = 1; // (1 = Enables receiver) > > // TXEN - Trasmit Enable Bit > TXSTAbits.TXEN = 1; // (1 = transmit enabled) > > stdout = STREAM_USER; > } > > void init() > { > /* Internal oscillator @ 8MHz */ > OSCCON &= 0x8F; > OSCCON |= 0x70; > > /* Disable watchdog */ > WDTCONbits.SWDTEN = 0; > } > > void test_puts(data char *str) > { > usart_putc(str[0]); > while( usart_busy() ); > } > > void main(void) > /* > The main function: > Initialises the system, and starts all interrupt based tasks. > */ > { > char tekst[2]; > tekst[0]='?'; > tekst[1]=0; > > init(); > > serial_init(); > > while(1) { > usart_putc('['); > while( usart_busy() ); > > /* (1): Send single character; works */ > usart_putc('?'); > while( usart_busy() ); > > /* (2): Send characters from array; works */ > usart_putc(tekst[0]); > while( usart_busy() ); > > /* (3): Pass array to function, which sends them as (2) does; not > working, sending garbage */ test_puts(tekst); > while( usart_busy() ); > > /* (4): send string using the library-functions; not working, > infinite loop */ usart_puts("?"); > while( usart_busy() ); > > usart_putc(']'); > while( usart_busy() ); > } > } > > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's > challenge Build the coolest Linux based applications with Moblin SDK & win > great prizes Grand prize is a trip for two to an Open Source event anywhere > in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Sdcc-user mailing list > Sdcc-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/sdcc-user ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user