In SX Microcontrollers, SX/B Compiler and SX-Key Tool, loojade wrote: Hallo everybody I nebie with SXB and I don't know assembly... I write a program and it seems correct, but when I try to run it some errors appear. The main problem is that the errors are in assembly code (geneterd by SX KEY I think). This is my SXB code : [code] ' ------------------------------------------------------------------------- ' Program Description ' ------------------------------------------------------------------------- ' ' GRIPOne è sensibile agli interrupts forniti dai due sensori di prossimità ' dai giri motore e dai due pulsanti per la gestionedei parametri di ' configurazione ' ------------------------------------------------------------------------- ' Device Settings ' ------------------------------------------------------------------------- DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX FREQ 4_000_000 IRC_CAL IRC_4MHZ 'ID "GRIPOne_001" 'WATCH anyVariable ' ------------------------------------------------------------------------- ' IO Pins ' ------------------------------------------------------------------------- fr_sensor VAR RB.0 'impulsi da sensore ruota anteriore rr_sensor VAR RB.1 'impulsi da sensore ruota posteriore rpm_sensor VAR RB.2 'impulsi da giri motore button_1 VAR RB.3 'pulsante di scelta button_2 VAR RB.4 'pulsante di incremento t_control VAR RB.5 'uscita controllo di trazione start_reset VAR RB.6 'uscita on/off sistema rpm_control VAR RB.7 'uscita controllo rpm SDA VAR RA.0 SCL VAR RA.1 ' ------------------------------------------------------------------------- ' Constants ' ------------------------------------------------------------------------- SlaveID CON $A0 ' for 24LC16B Ack CON 0 Nak CON 1 nr_parametri CON 6 'numero di parametri memorizzabili tramite i pulsanti ' ------------------------------------------------------------------------- ' Variables ' ------------------------------------------------------------------------- vettore1 VAR byte(16) 'array di variabili byte del bank1 counter_fr_l VAR vettore1(0) counter_fr_h VAR vettore1(1) counter_rr_l VAR vettore1(2) counter_rr_h VAR vettore1(3) counter_rpm_l VAR vettore1(4) counter_rpm_h VAR vettore1(5) last_fr_l VAR vettore1(6) last_fr_h VAR vettore1(7) last_rr_l VAR vettore1(8) last_rr_h VAR vettore1(9) last_rpm_l VAR vettore1(10) last_rpm_h VAR vettore1(11) spinning_l VAR vettore1(12) spinning_h VAR vettore1(13) appoggio_l VAR vettore1(14) appoggio_h VAR vettore1(15) vettore2 VAR byte(16) 'array di variabili byte del bank1 interrupts_signal VAR vettore2(0) 'byte per verificare quale interrupt è stato avvertito eeprom_adr VAR vettore2(1) 'byte per puntare sulla eeprom byte_interrupt VAR vettore2(2) '0=fr, 1=rr, 2=rpm, 3=pulsante1, 4=pulsante2 addr VAR Word ' address in 24LC16B addrLo VAR addr_LSB addrHi VAR addr_MSB outVal VAR vettore2(3) ' to 24LC16B inVal VAR vettore2(4) ' from 24LC16B tmpW1 VAR Word ' work vars tmpB1 VAR vettore2(5) tmpB2 VAR vettore2(6) tmpB3 VAR vettore2(7) tmpB4 VAR vettore2(8) demoltiplicatore VAR vettore2(8) word_appoggio1 VAR Word word_appoggio2 VAR Word word_appoggio3 VAR Word WATCH addr ' for Debug/Poll mode WATCH outVal WATCH inVal ' ------------------------------------------------------------------------- ' Subroutine Declarations ' ------------------------------------------------------------------------- CHECK_SPINNING SUB 0 ' MEM_OUT SUB 3 ' write value to memory MEM_IN SUB 2 ' read byte from memory ' ------------------------------------------------------------------------- INTERRUPT 50_000 ' ------------------------------------------------------------------------- ISR_Start: Ch1: IF fr_sensor = byte_interrupt.0 THEN ' if not, try next IF counter_fr_l < 255 THEN INC counter_fr_l GOTO Ch2 ELSE counter_fr_l = 0 IF counter_fr_h < 255 THEN INC counter_fr_h ENDIF GOTO Ch2 ENDIF ELSE IF byte_interrupt.0 = 0 THEN byte_interrupt.0 = 1 ELSE byte_interrupt.0 = 0 ENDIF last_fr_l = counter_fr_l last_fr_h = counter_fr_h counter_fr_l = 0 counter_fr_h = 0 ENDIF Ch2: IF rr_sensor = byte_interrupt.1 THEN ' if not, try next IF counter_rr_l < 255 THEN INC counter_rr_l GOTO Ch3 ELSE counter_rr_l = 0 IF counter_rr_h < 255 THEN INC counter_rr_h ENDIF GOTO Ch3 ENDIF ELSE IF byte_interrupt.1 = 0 THEN byte_interrupt.1 = 1 ELSE byte_interrupt.1 = 0 ENDIF last_rr_l = counter_rr_l last_rr_h = counter_rr_h counter_rr_l = 0 counter_rr_h = 0 ENDIF Ch3: IF rpm_sensor = byte_interrupt.2 THEN ' if not, try next IF counter_rpm_l < 255 THEN INC counter_rpm_l GOTO Ch4 ELSE counter_rpm_l = 0 IF counter_rpm_h < 255 THEN INC counter_rpm_h ENDIF GOTO Ch4 ENDIF ELSE IF byte_interrupt.2 = 0 THEN byte_interrupt.2 = 1 ELSE byte_interrupt.2 = 0 ENDIF last_rpm_l = counter_rpm_l last_rpm_h = counter_rpm_h counter_rpm_l = 0 counter_rpm_h = 0 ENDIF Ch4: IF button_1 <> byte_interrupt.3 THEN 'istruzione pulsante di selezione IF byte_interrupt.3 = 0 THEN 'inverto il valore di riferimento byte_interrupt.3 = 1 ELSE byte_interrupt.3 = 0 ENDIF IF addr > nr_parametri THEN 'se l'indirizz supera il numero dei parametri allora lo azzero addr = 0 ENDIF MEM_OUT addr, inVal 'send to 24LC16 addr = addr + 2 'incremento di 2 l'indirizzo di riferimento alla eeprom di 2 inVal = MEM_IN addr 'leggo il valore del parametro memorizzato nella eeprom ENDIF Ch5: IF button_2 <> byte_interrupt.4 THEN ' if not, try next IF byte_interrupt.4 = 0 THEN 'inverto il valore di riferimento byte_interrupt.4 = 1 ELSE byte_interrupt.4 = 0 ENDIF PAUSE 500 ' delay for Debug/Poll mode INC inVal ' get from 24LC16 ENDIF GOTO ISR_Exit IF demoltiplicatore < 200 THEN INC demoltiplicatore ELSE demoltiplicatore = 0 GOTO CHECK_SPINNING ENDIF ISR_Exit: RETURNINT ' ========================================================================= PROGRAM Start ' ========================================================================= ' ------------------------------------------------------------------------- ' Program Code ' ------------------------------------------------------------------------- Start: TRIS_B = %00011111 ' imposto gli ingressi e le uscite della porta B TRIS_C = %00000000 ' imposto gli ingressi e le uscite della porta C counter_fr_l = 255 counter_fr_h = 255 counter_rr_l = 255 counter_rr_h = 255 counter_rpm_l = 255 counter_rpm_h = 255 last_fr_l = 255 last_fr_h = 255 last_rr_l = 255 last_rr_h = 255 last_rpm_l = 255 last_rpm_h = 255 demoltiplicatore = 0 Main: DO LOOP ' ------------------------------------------------------------------------- ' Subroutines Code ' ------------------------------------------------------------------------- ' ' CHECK_SPINNING: RETURN ' Use: MEM_OUT address, value ' -- writes 'value' to 24LC16B location at 'address' MEM_OUT: tmpW1 = __WPARAM12 ' copy address tmpB1 = __PARAM3 ' copy value I2CSTART SDA tmpW1_MSB = tmpW1_MSB & $03 ' get block value tmpW1_MSB = tmpW1_MSB << 1 tmpW1_MSB = tmpW1_MSB | SlaveID ' create control byte tmpW1_MSB.0 = 0 ' set RW bit for write I2CSEND SDA, tmpW1_MSB ' send slave ID I2CSEND SDA, tmpW1_LSB ' send word address I2CSEND SDA, tmpB1 ' send data byte I2CSTOP SDA ' finish RETURN ' ------------------------------------------------------------------------- ' Use: value = MEM_IN address ' -- reads 'value' from 24LC16B location at 'address' MEM_IN: tmpW1 = __WPARAM12 ' copy address I2CSTART SDA tmpW1_MSB = tmpW1_MSB & $03 ' get block value tmpW1_MSB = tmpW1_MSB << 1 tmpW1_MSB = tmpW1_MSB | SlaveID ' create control byte tmpW1_MSB.0 = 0 ' set RW bit for write I2CSEND SDA, tmpW1_MSB ' send slave ID I2CSEND SDA, tmpW1_LSB ' send word address I2CSTART SDA ' restart for read tmpW1_MSB.0 = 1 ' set RW bit for Read I2CSEND SDA, tmpW1_MSB ' resend slave ID I2CRECV SDA, tmpB1, Nak ' get one byte I2CSTOP SDA RETURN tmpB1 [/code] When I rus this code (or compile) the assembly code is the following: [code] ; *** COMPILED WITH SX/B VERSION 1.51.03 09/21/2006 *** ;' ------------------------------------------------------------------------- ;' Program Description ;' ------------------------------------------------------------------------- ;' ;' GRIPOne è sensibile agli interrupts forniti dai due sensori di prossimità ;' dai giri motore e dai due pulsanti per la gestionedei parametri di ;' configurazione ;' ------------------------------------------------------------------------- ;' Device Settings ;' ------------------------------------------------------------------------- DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX ;DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX ; DEFINE SYSTEM VARIABLES __RAM EQU $00 RBC EQU $06 RBC_LSB EQU $06 RBC_MSB EQU $07 __PARAM1 EQU $08 __PARAM2 EQU $09 __PARAM3 EQU $0A __PARAM4 EQU $0B __PARAM5 EQU $0C __PARAMCNT EQU $0C __WPARAM12 EQU $08 __WPARAM12_LSB EQU $08 __WPARAM12_MSB EQU $09 __WPARAM23 EQU $09 __WPARAM23_LSB EQU $09 __WPARAM23_MSB EQU $0A __WPARAM34 EQU $0A __WPARAM34_LSB EQU $0A __WPARAM34_MSB EQU $0B __TRISA EQU $FA TRIS_A EQU $FA __TRISB EQU $FB TRIS_B EQU $FB __TRISC EQU $FC TRIS_C EQU $FC __INTPARAMFSR EQU $F5 __REMAINDER EQU $08 __WREMAINDER EQU $08 __WREMAINDER_LSB EQU $08 __WREMAINDER_MSB EQU $09 ; Define ShiftIn & ShiftOut Constants LSBFIRST EQU 0 MSBFIRST EQU 1 MSBPRE EQU 0 LSBPRE EQU 1 MSBPOST EQU 2 LSBPOST EQU 3 FREQ 4000000 ;FREQ 4_000_000 __FREQMHZ EQU 4 LIST Q=2 ;IRC_CAL IRC_4MHZ IRC_CAL IRC_4MHZ LIST Q=-2 ;'ID "GRIPOne_001" ;'WATCH anyVariable ;' ------------------------------------------------------------------------- ;' IO Pins ;' ------------------------------------------------------------------------- fr_sensor EQU RB.0 ;fr_sensor VAR RB.0 'impulsi da sensore ruota anteriore rr_sensor EQU RB.1 ;rr_sensor VAR RB.1 'impulsi da sensore ruota posteriore rpm_sensor EQU RB.2 ;rpm_sensor VAR RB.2 'impulsi da giri motore button_1 EQU RB.3 ;button_1 VAR RB.3 'pulsante di scelta button_2 EQU RB.4 ;button_2 VAR RB.4 'pulsante di incremento t_control EQU RB.5 ;t_control VAR RB.5 'uscita controllo di trazione start_reset EQU RB.6 ;start_reset VAR RB.6 'uscita on/off sistema rpm_control EQU RB.7 ;rpm_control VAR RB.7 'uscita controllo rpm SDA EQU RA.0 ;SDA VAR RA.0 SCL EQU RA.1 ;SCL VAR RA.1 ;' ------------------------------------------------------------------------- ;' Constants ;' ------------------------------------------------------------------------- SlaveID EQU $A0 ;SlaveID CON $A0 ' for 24LC16B Ack EQU 0 ;Ack CON 0 Nak EQU 1 ;Nak CON 1 nr_parametri EQU 6 ;nr_parametri CON 6 'numero di parametri memorizzabili tramite i pulsanti ;' ------------------------------------------------------------------------- ;' Variables ;' ------------------------------------------------------------------------- vettore1 EQU 0x30 ;vettore1 VAR byte(16) 'array di variabili byte del bank1 counter_fr_l EQU vettore1+0 ;counter_fr_l VAR vettore1(0) counter_fr_h EQU vettore1+1 ;counter_fr_h VAR vettore1(1) counter_rr_l EQU vettore1+2 ;counter_rr_l VAR vettore1(2) counter_rr_h EQU vettore1+3 ;counter_rr_h VAR vettore1(3) counter_rpm_l EQU vettore1+4 ;counter_rpm_l VAR vettore1(4) counter_rpm_h EQU vettore1+5 ;counter_rpm_h VAR vettore1(5) last_fr_l EQU vettore1+6 ;last_fr_l VAR vettore1(6) last_fr_h EQU vettore1+7 ;last_fr_h VAR vettore1(7) last_rr_l EQU vettore1+8 ;last_rr_l VAR vettore1(8) last_rr_h EQU vettore1+9 ;last_rr_h VAR vettore1(9) last_rpm_l EQU vettore1+10 ;last_rpm_l VAR vettore1(10) last_rpm_h EQU vettore1+11 ;last_rpm_h VAR vettore1(11) spinning_l EQU vettore1+12 ;spinning_l VAR vettore1(12) spinning_h EQU vettore1+13 ;spinning_h VAR vettore1(13) appoggio_l EQU vettore1+14 ;appoggio_l VAR vettore1(14) appoggio_h EQU vettore1+15 ;appoggio_h VAR vettore1(15) vettore2 EQU 0x50 ;vettore2 VAR byte(16) 'array di variabili byte del bank1 interrupts_signal EQU vettore2+0 ;interrupts_signal VAR vettore2(0) 'byte per verificare quale interrupt è stato avvertito eeprom_adr EQU vettore2+1 ;eeprom_adr VAR vettore2(1) 'byte per puntare sulla eeprom byte_interrupt EQU vettore2+2 ;byte_interrupt VAR vettore2(2) '0=fr, 1=rr, 2=rpm, 3=pulsante1, 4=pulsante2 addr EQU 0x0D ;addr VAR Word ' address in 24LC16B addr_LSB EQU addr addr_MSB EQU addr+1 addrLo EQU addr_LSB ;addrLo VAR addr_LSB addrHi EQU addr_MSB ;addrHi VAR addr_MSB outVal EQU vettore2+3 ;outVal VAR vettore2(3) ' to 24LC16B inVal EQU vettore2+4 ;inVal VAR vettore2(4) ' from 24LC16B tmpW1 EQU 0x0F ;tmpW1 VAR Word ' work vars tmpW1_LSB EQU tmpW1 tmpW1_MSB EQU tmpW1+1 tmpB1 EQU vettore2+5 ;tmpB1 VAR vettore2(5) tmpB2 EQU vettore2+6 ;tmpB2 VAR vettore2(6) tmpB3 EQU vettore2+7 ;tmpB3 VAR vettore2(7) tmpB4 EQU vettore2+8 ;tmpB4 VAR vettore2(8) demoltiplicatore EQU vettore2+8 ;demoltiplicatore VAR vettore2(8) word_appoggio1 EQU 0x11 ;word_appoggio1 VAR Word word_appoggio1_LSB EQU word_appoggio1 word_appoggio1_MSB EQU word_appoggio1+1 word_appoggio2 EQU 0x13 ;word_appoggio2 VAR Word word_appoggio2_LSB EQU word_appoggio2 word_appoggio2_MSB EQU word_appoggio2+1 word_appoggio3 EQU 0x15 ;word_appoggio3 VAR Word word_appoggio3_LSB EQU word_appoggio3 word_appoggio3_MSB EQU word_appoggio3+1 WATCH addr,16,UDEC ;WATCH addr ' for Debug/Poll mode WATCH outVal,8,UDEC ;WATCH outVal WATCH inVal,8,UDEC ;WATCH inVal ;' ------------------------------------------------------------------------- ;' Subroutine Declarations ;' ------------------------------------------------------------------------- __CHECK_SPINNING: ;CHECK_SPINNING SUB 0 ' JMP @CHECK_SPINNING __MEM_OUT: ;MEM_OUT SUB 3 ' write value to memory JMP @MEM_OUT __MEM_IN: ;MEM_IN SUB 2 ' read byte from memory JMP @MEM_IN ;' ------------------------------------------------------------------------- ORG $000 ; INTERRUPT 50_000 MOV FSR,#__INTPARAMFSR MOV IND,M INC FSR MOV IND,__PARAM1 INC FSR MOV IND,__PARAM2 INC FSR MOV IND,__PARAM3 INC FSR MOV IND,__PARAM4 BANK $00 ;' ------------------------------------------------------------------------- ISR_Start: ;ISR_Start: Ch1: ;Ch1: CLR __PARAM1 ; IF fr_sensor = byte_interrupt.0 THEN ' if not, try next ADDB __PARAM1,fr_sensor MOV FSR,#byte_interrupt ADDB __PARAM1,IND.0 BANK $00 JB __PARAM1.0,@__ELSE_1 MOV FSR,#counter_fr_l ; IF counter_fr_l < 255 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#255,@__ELSE_2 MOV FSR,#counter_fr_l ; INC counter_fr_l INC IND BANK $00 JMP @Ch2 ; GOTO Ch2 JMP @__ENDIF_2 ; ELSE __ELSE_2: MOV FSR,#counter_fr_l ; counter_fr_l = 0 CLR IND BANK $00 MOV FSR,#counter_fr_h ; IF counter_fr_h < 255 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#255,@__ELSE_3 MOV FSR,#counter_fr_h ; INC counter_fr_h INC IND BANK $00 __ELSE_3: ; ENDIF __ENDIF_3: JMP @Ch2 ; GOTO Ch2 __ENDIF_2: ; ENDIF JMP @__ENDIF_1 ; ELSE __ELSE_1: MOV FSR,#byte_interrupt ; IF byte_interrupt.0 = 0 THEN MOV __PARAM1,IND BANK $00 JB __PARAM1.0,@__ELSE_4 MOV FSR,#byte_interrupt ; byte_interrupt.0 = 1 SETB IND.0 BANK $00 JMP @__ENDIF_4 ; ELSE __ELSE_4: MOV FSR,#byte_interrupt ; byte_interrupt.0 = 0 CLRB IND.0 BANK $00 __ENDIF_4: ; ENDIF MOV FSR,#counter_fr_l ; last_fr_l = counter_fr_l MOV __PARAM2,IND BANK $00 MOV FSR,#last_fr_l MOV IND,__PARAM2 BANK $00 MOV FSR,#counter_fr_h ; last_fr_h = counter_fr_h MOV __PARAM2,IND BANK $00 MOV FSR,#last_fr_h MOV IND,__PARAM2 BANK $00 MOV FSR,#counter_fr_l ; counter_fr_l = 0 CLR IND BANK $00 MOV FSR,#counter_fr_h ; counter_fr_h = 0 CLR IND BANK $00 __ENDIF_1: ; ENDIF Ch2: ;Ch2: CLR __PARAM1 ; IF rr_sensor = byte_interrupt.1 THEN ' if not, try next ADDB __PARAM1,rr_sensor MOV FSR,#byte_interrupt ADDB __PARAM1,IND.1 BANK $00 JB __PARAM1.0,@__ELSE_5 MOV FSR,#counter_rr_l ; IF counter_rr_l < 255 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#255,@__ELSE_6 MOV FSR,#counter_rr_l ; INC counter_rr_l INC IND BANK $00 JMP @Ch3 ; GOTO Ch3 JMP @__ENDIF_6 ; ELSE __ELSE_6: MOV FSR,#counter_rr_l ; counter_rr_l = 0 CLR IND BANK $00 MOV FSR,#counter_rr_h ; IF counter_rr_h < 255 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#255,@__ELSE_7 MOV FSR,#counter_rr_h ; INC counter_rr_h INC IND BANK $00 __ELSE_7: ; ENDIF __ENDIF_7: JMP @Ch3 ; GOTO Ch3 __ENDIF_6: ; ENDIF JMP @__ENDIF_5 ; ELSE __ELSE_5: MOV FSR,#byte_interrupt ; IF byte_interrupt.1 = 0 THEN MOV __PARAM1,IND BANK $00 JB __PARAM1.1,@__ELSE_8 MOV FSR,#byte_interrupt ; byte_interrupt.1 = 1 SETB IND.1 BANK $00 JMP @__ENDIF_8 ; ELSE __ELSE_8: MOV FSR,#byte_interrupt ; byte_interrupt.1 = 0 CLRB IND.1 BANK $00 __ENDIF_8: ; ENDIF MOV FSR,#counter_rr_l ; last_rr_l = counter_rr_l MOV __PARAM2,IND BANK $00 MOV FSR,#last_rr_l MOV IND,__PARAM2 BANK $00 MOV FSR,#counter_rr_h ; last_rr_h = counter_rr_h MOV __PARAM2,IND BANK $00 MOV FSR,#last_rr_h MOV IND,__PARAM2 BANK $00 MOV FSR,#counter_rr_l ; counter_rr_l = 0 CLR IND BANK $00 MOV FSR,#counter_rr_h ; counter_rr_h = 0 CLR IND BANK $00 __ENDIF_5: ; ENDIF Ch3: ;Ch3: CLR __PARAM1 ; IF rpm_sensor = byte_interrupt.2 THEN ' if not, try next ADDB __PARAM1,rpm_sensor MOV FSR,#byte_interrupt ADDB __PARAM1,IND.2 BANK $00 JB __PARAM1.0,@__ELSE_9 MOV FSR,#counter_rpm_l ; IF counter_rpm_l < 255 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#255,@__ELSE_10 MOV FSR,#counter_rpm_l ; INC counter_rpm_l INC IND BANK $00 JMP @Ch4 ; GOTO Ch4 JMP @__ENDIF_10 ; ELSE __ELSE_10: MOV FSR,#counter_rpm_l ; counter_rpm_l = 0 CLR IND BANK $00 MOV FSR,#counter_rpm_h ; IF counter_rpm_h < 255 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#255,@__ELSE_11 MOV FSR,#counter_rpm_h ; INC counter_rpm_h INC IND BANK $00 __ELSE_11: ; ENDIF __ENDIF_11: JMP @Ch4 ; GOTO Ch4 __ENDIF_10: ; ENDIF JMP @__ENDIF_9 ; ELSE __ELSE_9: MOV FSR,#byte_interrupt ; IF byte_interrupt.2 = 0 THEN MOV __PARAM1,IND BANK $00 JB __PARAM1.2,@__ELSE_12 MOV FSR,#byte_interrupt ; byte_interrupt.2 = 1 SETB IND.2 BANK $00 JMP @__ENDIF_12 ; ELSE __ELSE_12: MOV FSR,#byte_interrupt ; byte_interrupt.2 = 0 CLRB IND.2 BANK $00 __ENDIF_12: ; ENDIF MOV FSR,#counter_rpm_l ; last_rpm_l = counter_rpm_l MOV __PARAM2,IND BANK $00 MOV FSR,#last_rpm_l MOV IND,__PARAM2 BANK $00 MOV FSR,#counter_rpm_h ; last_rpm_h = counter_rpm_h MOV __PARAM2,IND BANK $00 MOV FSR,#last_rpm_h MOV IND,__PARAM2 BANK $00 MOV FSR,#counter_rpm_l ; counter_rpm_l = 0 CLR IND BANK $00 MOV FSR,#counter_rpm_h ; counter_rpm_h = 0 CLR IND BANK $00 __ENDIF_9: ; ENDIF Ch4: ;Ch4: CLR __PARAM1 ; IF button_1 <> byte_interrupt.3 THEN 'istruzione pulsante di selezione ADDB __PARAM1,button_1 MOV FSR,#byte_interrupt ADDB __PARAM1,IND.3 BANK $00 JNB __PARAM1.0,@__ELSE_13 MOV FSR,#byte_interrupt ; IF byte_interrupt.3 = 0 THEN 'inverto il valore di riferimento MOV __PARAM1,IND BANK $00 JB __PARAM1.3,@__ELSE_14 MOV FSR,#byte_interrupt ; byte_interrupt.3 = 1 SETB IND.3 BANK $00 JMP @__ENDIF_14 ; ELSE __ELSE_14: MOV FSR,#byte_interrupt ; byte_interrupt.3 = 0 CLRB IND.3 BANK $00 __ENDIF_14: ; ENDIF CJB addr_MSB,#nr_parametri >> 8,@__ELSE_15 ; IF addr > nr_parametri THEN 'se l'indirizz supera il numero dei parametri allora lo azzero JNZ @$+8 CJBE addr_LSB,#nr_parametri & 255,@__ELSE_15 CLR addr_LSB ; addr = 0 CLR addr_MSB __ELSE_15: ; ENDIF __ENDIF_15: MOV __PARAM1,addr_LSB ; MEM_OUT addr, inVal 'send to 24LC16 MOV __PARAM2,addr_MSB MOV FSR,#inVal MOV __PARAM3,IND BANK $00 CALL @__MEM_OUT ADD addr_LSB,#2 & 255 ; addr = addr + 2 'incremento di 2 l'indirizzo di riferimento alla eeprom di 2 ADDB addr_MSB,C ADD addr_MSB,#2 >> 8 MOV __PARAM1,addr_LSB ; inVal = MEM_IN addr 'leggo il valore del parametro memorizzato nella eeprom MOV __PARAM2,addr_MSB CALL @__MEM_IN MOV FSR,#inVal MOV IND,__PARAM1 BANK $00 __ELSE_13: ; ENDIF __ENDIF_13: Ch5: ;Ch5: CLR __PARAM1 ; IF button_2 <> byte_interrupt.4 THEN ' if not, try next ADDB __PARAM1,button_2 MOV FSR,#byte_interrupt ADDB __PARAM1,IND.4 BANK $00 JNB __PARAM1.0,@__ELSE_16 MOV FSR,#byte_interrupt ; IF byte_interrupt.4 = 0 THEN 'inverto il valore di riferimento MOV __PARAM1,IND BANK $00 JB __PARAM1.4,@__ELSE_17 MOV FSR,#byte_interrupt ; byte_interrupt.4 = 1 SETB IND.4 BANK $00 JMP @__ENDIF_17 ; ELSE __ELSE_17: MOV FSR,#byte_interrupt ; byte_interrupt.4 = 0 CLRB IND.4 BANK $00 __ENDIF_17: ; ENDIF MOV __PARAM1,#2 ; PAUSE 500 ' delay for Debug/Poll mode MOV __PARAM2,#244 MOV __PARAM3,#4 MOV __PARAM4,#28 DJNZ __PARAM4,@$ DJNZ __PARAM3,@$-3 DJNZ __PARAM2,@$-10 DJNZ __PARAM1,@$-13 MOV FSR,#inVal ; INC inVal ' get from 24LC16 INC IND BANK $00 __ELSE_16: ; ENDIF __ENDIF_16: JMP @ISR_Exit ; GOTO ISR_Exit MOV FSR,#demoltiplicatore ; IF demoltiplicatore < 200 THEN MOV __PARAM1,IND BANK $00 CJAE __PARAM1,#200,@__ELSE_18 MOV FSR,#demoltiplicatore ; INC demoltiplicatore INC IND BANK $00 JMP @__ENDIF_18 ; ELSE __ELSE_18: MOV FSR,#demoltiplicatore ; demoltiplicatore = 0 CLR IND BANK $00 JMP @CHECK_SPINNING ; GOTO CHECK_SPINNING __ENDIF_18: ; ENDIF ISR_Exit: ;ISR_Exit: MOV FSR,#__INTPARAMFSR ; RETURNINT MOV M,IND INC FSR MOV __PARAM1,IND INC FSR MOV __PARAM2,IND INC FSR MOV __PARAM3,IND INC FSR MOV __PARAM4,IND MOV W,#176 RETIW ;' ========================================================================= RESET __PROGSTART ; PROGRAM Start __PROGSTART: JNB TO,@__RESTORETRIS JB PD,@__POWERUP CLR W MODE $09 MOV !RB,W MOV FSR,W MODE $0F CJE FSR,#0,@__POWERUP CJNE FSR,#$FF,@__RESTORETRIS __POWERUP: CLR RA CLR RB CLR RC MOV FSR,#$08 SB FSR.3 SETB FSR.4 CLR IND IJNZ FSR,@$-3 MOV FSR,#__TRISA MOV IND,#255 INC FSR MOV IND,W INC FSR MOV IND,W __RESTORETRIS: MOV FSR,#__TRISA MOV !RA,IND INC FSR MOV !RB,IND INC FSR MOV !RC,IND MOV !OPTION,#136 CLR FSR JMP @Start ORG $+2 ; FOR DEBUGGER ;' ========================================================================= ;' ------------------------------------------------------------------------- ;' Program Code ;' ------------------------------------------------------------------------- Start: ;Start: MOV FSR,#TRIS_B ;TRIS_B = %00011111 ' imposto gli ingressi e le uscite della porta B MOV IND,#%00011111 MODE $0F MOV !RB,IND BANK $00 MOV FSR,#TRIS_C ;TRIS_C = %00000000 ' imposto gli ingressi e le uscite della porta C CLR IND MODE $0F MOV !RC,IND BANK $00 MOV FSR,#counter_fr_l ;counter_fr_l = 255 MOV IND,#255 BANK $00 MOV FSR,#counter_fr_h ;counter_fr_h = 255 MOV IND,#255 BANK $00 MOV FSR,#counter_rr_l ;counter_rr_l = 255 MOV IND,#255 BANK $00 MOV FSR,#counter_rr_h ;counter_rr_h = 255 MOV IND,#255 BANK $00 MOV FSR,#counter_rpm_l ;counter_rpm_l = 255 MOV IND,#255 BANK $00 MOV FSR,#counter_rpm_h ;counter_rpm_h = 255 MOV IND,#255 BANK $00 MOV FSR,#last_fr_l ;last_fr_l = 255 MOV IND,#255 BANK $00 MOV FSR,#last_fr_h ;last_fr_h = 255 MOV IND,#255 BANK $00 MOV FSR,#last_rr_l ;last_rr_l = 255 MOV IND,#255 BANK $00 MOV FSR,#last_rr_h ;last_rr_h = 255 MOV IND,#255 BANK $00 MOV FSR,#last_rpm_l ;last_rpm_l = 255 MOV IND,#255 BANK $00 MOV FSR,#last_rpm_h ;last_rpm_h = 255 MOV IND,#255 BANK $00 MOV FSR,#demoltiplicatore ;demoltiplicatore = 0 CLR IND BANK $00 Main: ;Main: __DO_1: ; DO JMP @__DO_1 ; LOOP __LOOP_1: ;' ------------------------------------------------------------------------- ;' Subroutines Code ;' ------------------------------------------------------------------------- ;' ;' CHECK_SPINNING: ;CHECK_SPINNING: RETP ;RETURN ;' Use: MEM_OUT address, value ;' -- writes 'value' to 24LC16B location at 'address' MEM_OUT: ;MEM_OUT: MOV tmpW1_LSB,__WPARAM12_LSB ; tmpW1 = __WPARAM12 ' copy address MOV tmpW1_MSB,__WPARAM12_MSB MOV FSR,#tmpB1 ; tmpB1 = __PARAM3 ' copy value MOV IND,__PARAM3 BANK $00 MOV FSR,#__TRISA ; I2CSTART SDA MODE $0F SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.0 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ JNB RA.1,@$ BANK $00 AND tmpW1_MSB,#$03 ; tmpW1_MSB = tmpW1_MSB & $03 ' get block value MOV __PARAM1,tmpW1_MSB ; tmpW1_MSB = tmpW1_MSB << 1 CLC RL __PARAM1 MOV tmpW1_MSB,__PARAM1 OR tmpW1_MSB,#SlaveID ; tmpW1_MSB = tmpW1_MSB | SlaveID ' create control byte CLRB tmpW1_MSB.0 ; tmpW1_MSB.0 = 0 ' set RW bit for write MOV __PARAM1,tmpW1_MSB ; I2CSEND SDA, tmpW1_MSB ' send slave ID MOV FSR,#__TRISA MODE $0F MOV __PARAM2,#9 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOVB IND.0,__PARAM1.7 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND STC RL __PARAM1 DJNZ __PARAM2,@$-31 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MOV __PARAM1,tmpW1_LSB ; I2CSEND SDA, tmpW1_LSB ' send word address MOV FSR,#__TRISA MODE $0F MOV __PARAM2,#9 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOVB IND.0,__PARAM1.7 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND STC RL __PARAM1 DJNZ __PARAM2,@$-31 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MOV FSR,#tmpB1 ; I2CSEND SDA, tmpB1 ' send data byte MOV __PARAM1,IND MOV FSR,#__TRISA MODE $0F MOV __PARAM2,#9 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOVB IND.0,__PARAM1.7 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND STC RL __PARAM1 DJNZ __PARAM2,@$-31 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MODE $0F ; I2CSTOP SDA ' finish MOV FSR,#__TRISA MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.0 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 RETP ; RETURN ;' ------------------------------------------------------------------------- ;' Use: value = MEM_IN address ;' -- reads 'value' from 24LC16B location at 'address' MEM_IN: ;MEM_IN: MOV tmpW1_LSB,__WPARAM12_LSB ; tmpW1 = __WPARAM12 ' copy address MOV tmpW1_MSB,__WPARAM12_MSB MOV FSR,#__TRISA ; I2CSTART SDA MODE $0F SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.0 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ JNB RA.1,@$ BANK $00 AND tmpW1_MSB,#$03 ; tmpW1_MSB = tmpW1_MSB & $03 ' get block value MOV __PARAM1,tmpW1_MSB ; tmpW1_MSB = tmpW1_MSB << 1 CLC RL __PARAM1 MOV tmpW1_MSB,__PARAM1 OR tmpW1_MSB,#SlaveID ; tmpW1_MSB = tmpW1_MSB | SlaveID ' create control byte CLRB tmpW1_MSB.0 ; tmpW1_MSB.0 = 0 ' set RW bit for write MOV __PARAM1,tmpW1_MSB ; I2CSEND SDA, tmpW1_MSB ' send slave ID MOV FSR,#__TRISA MODE $0F MOV __PARAM2,#9 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOVB IND.0,__PARAM1.7 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND STC RL __PARAM1 DJNZ __PARAM2,@$-31 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MOV __PARAM1,tmpW1_LSB ; I2CSEND SDA, tmpW1_LSB ' send word address MOV FSR,#__TRISA MODE $0F MOV __PARAM2,#9 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOVB IND.0,__PARAM1.7 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND STC RL __PARAM1 DJNZ __PARAM2,@$-31 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MOV FSR,#__TRISA ; I2CSTART SDA ' restart for read MODE $0F SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.0 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ JNB RA.1,@$ BANK $00 SETB tmpW1_MSB.0 ; tmpW1_MSB.0 = 1 ' set RW bit for Read MOV __PARAM1,tmpW1_MSB ; I2CSEND SDA, tmpW1_MSB ' resend slave ID MOV FSR,#__TRISA MODE $0F MOV __PARAM2,#9 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOVB IND.0,__PARAM1.7 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND STC RL __PARAM1 DJNZ __PARAM2,@$-31 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MOV FSR,#__TRISA ; I2CRECV SDA, tmpB1, Nak ' get one byte MODE $0F MOV __PARAM2,#8 MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ RL __PARAM1 MOVB __PARAM1.0,RA.0 DJNZ __PARAM2,@$-27 CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.1 MOV !RA,IND CLRB RA.1 MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ MOV FSR,#tmpB1 MOV IND,__PARAM1 BANK $00 MODE $0F ; I2CSTOP SDA MOV FSR,#__TRISA MOV __PARAM4,#4 DJNZ __PARAM4,@$ CLRB IND.0 MOV !RA,IND CLRB SDA MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.1 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ SETB IND.0 MOV !RA,IND MOV __PARAM4,#4 DJNZ __PARAM4,@$ BANK $00 MOV FSR,#tmpB1 ; RETURN tmpB1 MOV __PARAM1,IND BANK $00 RETP [/code] So, SXkey tell me about 6 errors with same description: "overwrite same program counter location" The error are localized on INTERRUPT code (first 6 line): [code] ... ORG $000 ; INTERRUPT 50_000 MOV FSR,#__INTPARAMFSR MOV IND,M INC FSR MOV IND,__PARAM1 INC FSR MOV IND,__PARAM2 INC FSR MOV IND,__PARAM3 INC FSR MOV IND,__PARAM4 BANK $00 ;' ------------------------------------------------------------------------- ISR_Start: ;ISR_Start: ... [/code] Some one can help me to resolve this problem??? :confused: :confused: Thanks in advance. Loojade ---------- End of Message ---------- You can view the post on-line at: http://forums.parallax.com/forums/default.aspx?f=7&p=1&m=251649 Need assistance? Send an email to the Forum Administrator at forumadmin@parallax.com The Parallax Forums are powered by dotNetBB Forums, copyright 2002-2008 (http://www.dotNetBB.com)