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

Reply via email to