Hi,
don't know if this is SDCC related but I might as well as ask here:
my code looks like:
void usbcdc_putchar(char c)wparam
{
while (ep2_i.STAT & UOWN) {
}
cdc_tx_buffer[tx_len++]=c;
if (tx_len>=sizeof(cdc_tx_buffer)) {
usbcdc_write();
}
}
calling usbcdc_putchar() hangs on the first call, but
if I change the code to:
void wait2() {
while (ep2_i.STAT & UOWN) {
}
}
void usbcdc_putchar(char c)wparam
{
wait2();
cdc_tx_buffer[tx_len++]=c;
if (tx_len>=sizeof(cdc_tx_buffer)) {
usbcdc_write();
}
}
then it works like a charm.
The compiled code looks ok, see below, so any ideas what could be the problem?
br Kusti
this does not work:
0000 01711 _usbcdc_putchar:
01712 ; .line 193; usbcdc.c void usbcdc_putchar(char
c)wparam
0000 CFD9 FFE5 01713 MOVFF FSR2L, POSTDEC1
0004 CFE1 FFD9 01714 MOVFF FSR1L, FSR2L
0008 C000 FFE5 01715 MOVFF r0x00, POSTDEC1
000C C000 FFE5 01716 MOVFF r0x01, POSTDEC1
0010 C000 FFE5 01717 MOVFF r0x02, POSTDEC1
0014 6E00 01718 MOVWF r0x00
0016 01719 _00128_DS_:
0016 0000 01720 BANKSEL _ep2_i
01721 ; .line 195; usbcdc.c while (ep2_i.STAT & UOWN) {
0018 BF00 01722 BTFSC _ep2_i, 7, B
001A D000 01723 BRA _00128_DS_
01724 ; .line 198; usbcdc.c cdc_tx_buffer[tx_len++]=c;
001C C000 F000 01725 MOVFF _tx_len, r0x01
0020 2B00 01726 INCF _tx_len, F, B
0022 6A00 01727 CLRF r0x02
0024 0E00 01728 MOVLW LOW(_cdc_tx_buffer)
this works:
0000 01749 _wait2:
01750 ; .line 186; usbcdc.c void wait2() {
0000 CFD9 FFE5 01751 MOVFF FSR2L, POSTDEC1
0004 CFE1 FFD9 01752 MOVFF FSR1L, FSR2L
0008 01753 _00117_DS_:
0008 0000 01754 BANKSEL _ep2_i
01755 ; .line 187; usbcdc.c while (ep2_i.STAT & UOWN) {
000A BF00 01756 BTFSC _ep2_i, 7, B
000C D000 01757 BRA _00117_DS_
000E CFE4 FFD9 01758 MOVFF PREINC1, FSR2L
0012 0012 01759 RETURN
0000 01711 _usbcdc_putchar:
01712 ; .line 193; usbcdc.c void usbcdc_putchar(char
c)wparam
0000 CFD9 FFE5 01713 MOVFF FSR2L, POSTDEC1
0004 CFE1 FFD9 01714 MOVFF FSR1L, FSR2L
0008 C000 FFE5 01715 MOVFF r0x00, POSTDEC1
000C C000 FFE5 01716 MOVFF r0x01, POSTDEC1
0010 C000 FFE5 01717 MOVFF r0x02, POSTDEC1
0014 6E00 01718 MOVWF r0x00
01719 ; .line 197; usbcdc.c wait2();
0016 EC00 F000 01720 CALL _wait2
01721 ; .line 198; usbcdc.c cdc_tx_buffer[tx_len++]=c;
001A C000 F000 01722 MOVFF _tx_len, r0x01
001E 0000 01723 BANKSEL _tx_len
0020 2B00 01724 INCF _tx_len, F, B
0022 6A00 01725 CLRF r0x02
0024 0E00 01726 MOVLW LOW(_cdc_tx_buffer)
0026 2600 01727 ADDWF r0x01, F
0028 0E00 01728 MOVLW HIGH(_cdc_tx_buffer)
gpasm-0.13.6 beta ../obj/usbcdc.asm2-26-2010 23:30:55
PAGE 33
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
002A 2200 01729 ADDWFC r0x02, F
002C C000 FFE9 01730 MOVFF r0x01, FSR0L
0030 C000 FFEA 01731 MOVFF r0x02, FSR0H
0034 C000 FFEF 01732 MOVFF r0x00, INDF0
01733 ; .line 199; usbcdc.c if
(tx_len>=sizeof(cdc_tx_buffer)) {
0038 0E20 01734 MOVLW 0x20
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user