Vai al contenuto
PLC Forum


Routine Di Ritardo Pic


Messaggi consigliati

Inserito:

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


Inserita: (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: da Livio Orsini
Inserita:

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

Inserita:

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

Inserita:

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.

Inserita:

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.

Inserita:

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

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