stive882003 Inserito: 29 maggio 2006 Segnala Inserito: 29 maggio 2006 salve a tutti. ho da poco fatto un programmino in asm per un 16f84a dove dovevo effettuare un ritardo di 12 ore. ho provato questo ritardo usando 5 registri con determinati valori che si incrementavano continuamente. l'unica cosa è che il programma non funziona correttamente. siccome in mplab non posso testare dei ritardi così lunghi mi aiutereste a progettare questa routine di ritardo??la precisione non è importante, basta che sia di circa 12 ore...grazie in anticipo..
Livio Orsini Inserita: 30 maggio 2006 Segnala Inserita: 30 maggio 2006 (modificato) Non dici niente sulla frequenza del quarzo che usi. La prima cosa che devi realizzare è l'interrupt sul timer, programmato in modo da avere un interrupt ogni 0.1 sec per esempio. Poi è solo una questione di conteggio.Prova a descrivere quello che hai implemetato e vediamo di metterlo a punto, magari anche con qualche dritta per testarlo più facilmente. Modificato: 30 maggio 2006 da Livio Orsini
stive882003 Inserita: 31 maggio 2006 Autore Segnala Inserita: 31 maggio 2006 si adesso vi posto il programma come era in origine: PROCESSOR 16F84A #INCLUDE "P16F84A.INC" __CONFIG _WDT_OFF & _XT_OSC CONT1 EQU 0CH CONT2 EQU 0DH CONT3 EQU 0EH CONT4 EQU 0FH CONT5 EQU 10H ORG 0 MOVLW 00H TRIS PORTB BSF PORTB,1 CONFIGURORITARDO1: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .180 MOVWF CONT3 MOVLW .64 MOVWF CONT4 MOVLW .60 MOVWF CONT5 RITARDO11: DECF CONT1 MOVFW CONT1 XORLW 00H BZ RITARDO12 GOTO RITARDO11 RITARDO12: MOVLW .250 MOVWF CONT1 DECF CONT2 MOVFW CONT2 XORLW 00H BZ RITARDO13 GOTO RITARDO11 RITARDO13: MOVLW .250 MOVWF CONT1 MOVWF CONT2 DECF CONT3 MOVFW CONT3 XORLW 00H BZ RITARDO14 GOTO RITARDO11 RITARDO14: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .180 MOVWF CONT3 DECF CONT4 MOVFW CONT4 XORLW 00H BZ RITARDO15 GOTO RITARDO11 RITARDO15: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .180 MOVWF CONT3 MOVLW .64 MOVWF CONT4 DECF CONT5 MOVFW CONT5 XORLW 00H BZ ACCENDOPOMPA GOTO RITARDO11 ACCENDOPOMPA: BSF PORTB,0 CONFIGURORITARDOPOMPA: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .80 MOVWF CONT3 MOVLW .60 MOVWF CONT4 RITARDO21: DECF CONT1 MOVFW CONT1 XORLW 00H BZ RITARDO22 GOTO RITARDO21 RITARDO22: MOVLW .250 MOVWF CONT1 DECF CONT2 MOVFW CONT2 XORLW 00H BZ RITARDO23 GOTO RITARDO21 RITARDO23: MOVLW .250 MOVWF CONT1 MOVWF CONT2 DECF CONT3 MOVFW CONT3 XORLW 00H BZ RITARDO24 GOTO RITARDO21 RITARDO24: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .80 MOVWF CONT3 DECF CONT4 MOVFW CONT4 XORLW 00H BZ SPENGOPOMPA GOTO RITARDO21 SPENGOPOMPA: BCF PORTB,0 CONFIGURORITARDO3: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .208 MOVWF CONT3 MOVLW .60 MOVWF CONT4 MOVLW .55 MOVWF CONT5 RITARDO31: DECF CONT1 MOVFW CONT1 XORLW 00H BZ RITARDO32 GOTO RITARDO31 RITARDO32: MOVLW .250 MOVWF CONT1 DECF CONT2 MOVFW CONT2 XORLW 00H BZ RITARDO33 GOTO RITARDO31 RITARDO33: MOVLW .250 MOVWF CONT1 MOVWF CONT2 DECF CONT3 MOVFW CONT3 XORLW 00H BZ RITARDO34 GOTO RITARDO31 RITARDO34: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .208 MOVWF CONT3 DECF CONT4 MOVFW CONT4 XORLW 00H BZ RITARDO35 GOTO RITARDO31 RITARDO35: MOVLW .250 MOVWF CONT1 MOVWF CONT2 MOVLW .208 MOVWF CONT3 MOVLW .60 MOVWF CONT4 DECF CONT5 MOVFW CONT5 XORLW 00H BZ FINE GOTO RITARDO31 FINE: RETURN END però mi ero reso conto che non funzionasse il tutto perchè io ho fatto il conto moltiplicando i vari registri.. poi ho trovato un programmino su internet: http://www.piclist.com/techref/piclist/codegen/delay.htm questo genera automaticamente la routine di ritardo modificata, e di conseguenza ho fatto il programma qui sotto: PROCESSOR 16F84A #INCLUDE "P16F84A.INC" __CONFIG _WDT_OFF & _XT_OSC ORG 0 MOVLW 00H TRIS PORTB INIZIO: BSF PORTB,1 cblock CONT1 CONT2 CONT3 CONT4 CONT1_4 endc RITARDO movlw 0x16 movwf CONT1 movlw 0x6E movwf CONT2 movlw 0x16 movwf CONT3 movlw 0xEB movwf CONT4 movlw 0x01 movwf CONT1_4 RITARDO_0 decfsz CONT1, f goto $+2 decfsz CONT2, f goto $+2 decfsz CONT3, f goto $+2 decfsz CONT4, f goto $+2 decfsz CONT1_4, f goto RITARDO_0 nop ACCENDOPOMPA: BSF PORTB,0 cblock C1 C2 C1_2 C1_3 endc RITARDOPOMPA movlw 0xFE movwf C1 movlw 0x2D movwf C2 movlw 0x32 movwf C1_2 movlw 0x02 movwf C1_3 RITARDOPOMPA_0 decfsz C1, f goto $+2 decfsz C2, f goto $+2 decfsz C1_2, f goto $+2 decfsz C1_3, f goto RITARDOPOMPA_0 goto $+1 goto $+1 goto $+1 nop return SPENGOPOMPA: BCF PORTB,0 cblock CONT5 CONT6 CONT7 CONT8 CONT5_4 endc RITARDO2 movlw 0xFE movwf CONT5 movlw 0x47 movwf CONT6 movlw 0x76 movwf CONT7 movlw 0xE9 movwf CONT8 movlw 0x01 movwf CONT5_4 RITARDO2_0 decfsz CONT5, f goto $+2 decfsz CONT6, f goto $+2 decfsz CONT7, f goto $+2 decfsz CONT8, f goto $+2 decfsz CONT5_4, f goto RITARDO2_0 goto $+1 goto $+1 goto $+1 goto $+1 nop GOTO INIZIO END adesso lo sto testando. siccome devo aspettare 12 ore vi saprò dire domani se funziona o no. comunque il programma deve azionare una pompa..p.s. il quarzo che uso è da 4 mhz
stive882003 Inserita: 1 giugno 2006 Autore Segnala Inserita: 1 giugno 2006 eccomi qua. purtroppo non ha funzionato niente... la parte hardware sembra a posto, l'unica è il software.Quello che mi insospettisce è che una delle prime istruzioni è quella di settare la portb,1, ma dopo avere montato e alimentato il pic, questa porta rimane sempre a livello basso. non so cosa pensare....
rfabri Inserita: 2 giugno 2006 Segnala Inserita: 2 giugno 2006 Io non ne capisco niente di assembler ma hai provato a fare ritardi progressivi per vedere se il tuo programmino funziona e poi pian piano aumentare il tempo,ossia hai provato con ritardi di 10 minuti poi 30 e cosi via tanto per sapere se qualcosa funziona?,BYE.
Livio Orsini Inserita: 2 giugno 2006 Segnala Inserita: 2 giugno 2006 Sevai sul sito di Tanzilli e ti scarichi "PIC by example" ti trovi proprio un bell'esempio di generatore di secondi con PIC16F84 e quarzo a 4MHz che impiega TMR0 r prescaler. Una volta che hai raggiunti il secondo con tre registri in deconteggio è facilissimo arrivare alle 12 ore di ritartdo.
ziopolly Inserita: 2 giugno 2006 Segnala Inserita: 2 giugno 2006 Scrivo da poco tempo programmi in assembler per PIC, ma ti suggerisco vivamente di fare "girare" tutto quello che scrivi su MPLAB: io ho imparato il 90% osservando il comportamento dei vari registri ad ogni passo del nuovo listato da testare!Il problema dei ritardi puo essere facilmente aggirato forzando i vari registri utente a "1" (serve in questo modo un solo decremento per fare proseguire il programma) e forzando il TMR0 a 255 (idem come sopra).Questo sistema ti permette di fare completare tutte le routine senza attendere ore.ciao da ziopolly
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora