Vai al contenuto
PLC Forum


Routine Di Ritardo Pic


stive882003

Messaggi consigliati

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..

Link al commento
Condividi su altri siti


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: da Livio Orsini
Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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....

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...