PDA

View Full Version : problema con programmazione pic18f46k22


simo995
01-05-2014, 16:21
ciao a tutti :)
ho un problema con la programmazione del pic. ho creato questo programma perchè dovrei portarlo alla maturità solo che ho alcuni problemi e non riesco a capire quali siano questi problemi. il programma deve far muovere delle braccia robotiche che picchiano su uno xilofono e producono una sinfonia musicale.
ho creato una routine di avvio cioè ho fatto in modo che finchè la PORTB,6 non va a 1 il programma non parte. solo che quando lo provo nel debug per vedere se funziona devo togliere la routine di avvio e quando provo a farlo partire il programma fa quello che vuole e salta delle istruzioni e non riesco a capire il perchè, qualcuno mi può dare una mano?
grazie a tutti :)
questo è il programma:
87048

das
02-05-2014, 09:26
ciao a tutti :)
ho un problema con la programmazione del pic. ho creato questo programma perchè dovrei portarlo alla maturità solo che ho alcuni problemi e non riesco a capire quali siano questi problemi. il programma deve far muovere delle braccia robotiche che picchiano su uno xilofono e producono una sinfonia musicale.
ho creato una routine di avvio cioè ho fatto in modo che finchè la PORTB,6 non va a 1 il programma non parte. solo che quando lo provo nel debug per vedere se funziona devo togliere la routine di avvio e quando provo a farlo partire il programma fa quello che vuole e salta delle istruzioni e non riesco a capire il perchè, qualcuno mi può dare una mano?
grazie a tutti :)
questo è il programma:
87048

Mi pare che la porta sia portb,0 e non portb,6

avvio:
avvio_1: btfss PORTB,0
bra avvio_1
return

Perchè hai messo l'interrupt ogni 50ms ?
In ogni caso tutte quelle ridondanze rendono complicato trovare gli errori:

delaySOL_V:

movlw d'5'
movwf CONT2
delay_SOL_V1:
decfsz CONT2
bra delay_SOL_V1
return

delayLA:

movlw 0x0a
movwf CONT2
delay_LA1:
decfsz CONT2
bra delay_LA1
return

etc. etc.

ti suggerisco di fare una routine delay a cui fai trovare nel registro w il numero da cui deve contare. Lo stesso dicasi per suonare le note, numeri le note e crei una tabella di abbinamento tra le note e le uscite tipo:
nota 1 ---> portD,1

poi un unica subroutine a cui fai trovare in w un numero da 1 a 7 e via.
Poi anzichè fare tutti quei call La, call Do etc, memorizzi nella eeprom interna una serie di numeri che rappresentano le note. Quando il programma parte va a leggere la eeprom e ti suona le note.

In questo modo se c'è un errore capisci meglio in quale parte del programma si trova.