Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Conto Alla Rovescia Con Pic O Qualsiasi Altra Cosa - Vi prego... dovrebbe avere i centesimi.


Messaggi consigliati

Inserito:

Ciao!

E' la prima volta che posto qui.

Sono due anni che nel mio ristrettissimo tempo libero mi dedico a qualche stupidagine di eletronica e diciamo che le cose di base sembro averele imparate.

Da poco ho iniziato la sperimentazione con qualche PIC e sono riuscito a costruirmi qualche bel circuito decorativo (Supercar....).

Adesso vorrei passare a qualcosa di più serio...

Vorrei costruirmi un timer che conti alla rovescia che abbia le seguenti caratteristiche:

- visualizzi almeno i decimi di secondo (se è possiible anche i centesimi)

- dato che visualizzo i decimi, mi basta che conti da 900 secondi...

- date le precedenti caratteristiche, se non ci sono i minuti non me ne frega niente, ma se si possono implementare senza fatica sarebbe meglio...

- abbia pulsanti di Start/Stop/Pause

- Allo zero attivi un relè e soprattutto emani un suono, del tipo un cicalino per circa due secondi...

- il tutto dovrebbe essere il + economico possibile

- + piccolo possibile

- funzionante anche con una pila da 9v

IL TUTTO REALIZZABILE DOVREBBE ESSERE REALIZZABILE CON I PIC (anche + DI 1) SE E' IMPOSSIBILE VANNO BENE ANCHE ALTRI PROCESSORI L'IMPORTANTE E' CHE NON COSTINO TROPPO E CHE SIANO FACILMENTE PROGRAMMABILI...

Grazie 10000000000000000000 a che vorrà darmi una mano, anche piccola... magari anche modificando un progetto esistente.


Inserita:

Il lavoro è pittosto semplice....se le tue conoscenze HW & Sw sono discrete. In pratica ti basta usare un PIC con un quarzo, per avere una buona precisione, poi usando l'interrupt del timer 0 puoi programmare tutti i tempi che vuoi, sia in avanti che indietro. Non specifichi cosa vuoi usare come interfaccia Tastierino + display? pulsanti up-down più sette segmenti?

Inserita:

Grazie 10000 per la disponibilità...

Beh, come interfaccia vorrei la cosa più semplice possibile, non mi importa... più facile è meglio è.

comunque intendo usare i display 7 segmenti...

per me andrebbe bene 000:0 =(secondi:decimi)

oppure se non comporta grosse complicazioni 000:00 =(secondi:centesimi)

oppure ancora (ma credo che le grosse complicazioni le comporti) 00:00:0/0 =(minuti:secondi:decimi o centesimi)

.

Se magari potessi dirmi qualcosa di più dettagliato te ne sarei grato...

ad esempio ricordo che per pilotare i display c'era bisogno di un driver per ogni segmento...

ma poi come dico di scrivere in ogni display una cifra diversa?

Ciao!

Inserita:

Da quello che ho capito , vuoi il progetto completo di schema e software o vuoi dei consigli?

Con un pic puoi fare tutto , dipende dalla tua esperienza .

In rete ci sono molti progetti con pic QUESTO e' un esempio.

Inserita: (modificato)

modificalo in base al tuo PIC e impsta il prescaler in base al tuo quarzo

Conta da 1 a 9,999 secondi , quindi anche con i millesimi

I display sono multiplexati e pilotati da 4 transistor BC337

TITLE 'TEMPORIZZATORE CICLICO A 4 DISPLAY'

LIST F=INHX8M, P=16C57 ;xt 3.2768mhz wdt=yes

;------------------ definizione costanti per temporizzazioni ----------------

MSEC5 equ .128 ;settaggio prescaler per ottenere 5ms

MSEC1 equ .50 ;conteggi da 20ms per un totale di 1s

MAXIM equ .99 ;massimo valore ammesso per il display

INTER1 equ .40 ;tempo tra primi due incrementi basso (x 20ms)

INTER2 equ .1 ;tempo tra due incrementi alto (x 20ms)

;--------------------- definizione costanti per display ---------------------

ZER_O equ 003H ;associa label a 003H

UNO equ 09FH ;associa label a 09FH

DUE equ 025H ;associa label a 025H

TRE equ 00DH ;associa label a 00DH

QUATT equ 099H ;associa label a 099H

CINQUE equ 049H ;associa label a 049H

SEI equ 041H ;associa label a 041H

SETTE equ 01FH ;associa label a 01FH

OTTO equ 001H ;associa label a 001H

NOVE equ 009H ;associa label a 009H

;----------------------------------------------------------------------------

FZERO equ 0 ;associa label a 0

RTCC equ 1 ;associa label a 1

F2 equ 2 ;associa label a 2

F3 equ 3 ;associa label a 3

FSR equ 4 ;associa label a 4

F5 equ 5 ;associa label a 5

F6 equ 6 ;associa label a 6

F7 equ 7 ;associa label a 7

F8 equ 8 ;conteggio bit 93

F9 equ 9 ;byte 93

F10 equ 0AH ;ritardo scrittura eeprom

F11 equ 0BH ;ritardo scrittura eeprom

F12 equ 0CH ;registro conteggio 1s

F13 equ 0DH ;registro conteggio 00-99 dx tempo lavoro

F14 equ 0EH ;registro conteggio 00-99 sx tempo lavoro

F15 equ 0FH ;registro conteggio 00-99 dx tempo pausa

F16 equ 10H ;registro conteggio 00-99 sx tempo pausa

F17 equ 11H ;bit 0: 0--> pausa 1--> lavoro

;bit 1: 0--> prog pausa 1--> prog lavoro

;bit 2: 1--> memoria pulsante stop premuto

;bit 3: 1--> memoria puls. avanti premuto

;bit 4: 1--> memoria puls. indietro premuto

;bit 5: 1--> memoria ritorno da stop in timer

;bit 6: 1--> memoria stop premuto

;bit 7:

Modificato: da walterword
Inserita:

F18 equ 12H ;contatore per lampeggio led in programmazione

F19 equ 13H ;contatore per passo pulsanti indietro in prog.

F20 equ 14H ;contatore per passo pulsanti avanti in prog.

F21 equ 15H ;associa label a 15H

F22 equ 16H ;associa label a 16H

F23 equ 17H ;associa label a 17H

F24 equ 18H ;associa label a 18H

F25 equ 19H ;associa label a 19H

F26 equ 1AH ;associa label a 1AH

F27 equ 1BH ;registro visualizzazione decine

F28 equ 1CH ;registro visualizzazione unita

F29 equ 1DH ;copia f13 per conversione

F30 equ 1EH ;copia f14 per conversione

F31 equ 1FH ;copia per controllo numero > 99

;----------------------------------------------------------------------------

CS equ 7 ;chip select f6,7

CLK equ 6 ;clock f6,6

DI equ 5 ;data input f6,5

DO equ 4 ;data output f6,4

RELE equ 0 ;rele f6,0

LEDR equ 1 ;led rosso f6,1

LEDV equ 2 ;led verde f6,2

J1 equ 3 ;jumper per ciclico f6,3

;----------------------------------------------------------------------------

ORG 0 ;pagina 0

;---------------------- routine di attesa fine 5ms --------------------------

WAI5MS clrwdt ;azzera watchdog

movf RTCC,0 ;controllo se finiti 5ms

SKPZ ;equivale a btfss 3,2

goto WAI5MS ;vai a WAI5MS

movlw MSEC5 ;copia in W il numero MSEC5

movwf RTCC ;copia W nel registro RTCC

retlw 0 ;ritorna da subroutine con W = 0

; -------------------- subroutine tx stop 93 --------------------------------

STO93 bcf F6,CLK ;azzera bit x del registro F6

bcf F6,DI ;azzera bit x del registro F6

bcf F6,CS ;azzera bit x del registro F6

retlw 0 ;ritorna da subroutine con W = 0

; --------------- subroutine tx stop 93 in scrittura ------------------------

STO93W bcf F6,DI ;azzera bit x del registro F6

bcf F6,CS ;azzera bit x del registro F6

bsf F6,CS ;setta bit x del registro F6

movlw .200 ;copia in W il numero .200

movwf F10 ;copia W nel registro F10

DE0 movlw 0B1H ;copia in W il numero 0B1H

movwf F11 ;copia W nel registro F11

DE1 clrwdt ;azzera watchdog

bcf F6,CLK ;azzera bit x del registro F6

btfsc F6,DO ;testa bit x del registro F6 e salta se = 0

goto SCRIT ;vai a SCRIT

bsf F6,CLK ;setta bit x del registro F6

decfsz F11 ;decrementa registro F11 salta se = 0 -> F11

goto DE1 ;vai a DE1

decfsz F10 ;decrementa registro F10 salta se = 0 -> F10

goto DE0 ;vai a DE0

SCRIT bcf F6,CS ;azzera bit x del registro F6

retlw 0 ;ritorna da subroutine con W = 0

; -------------------- subroutine tx byte 93 --------------------------------

; f8 = conteggio bit f9 = byte da tx

; ---------------------------------------------------------------------------

STA93 bsf F6,CS ;setta bit x del registro F6

bsf F6,DI ;setta bit x del registro F6

bsf F6,CLK ;setta bit x del registro F6

TX93 movlw 08H ;copia in W il numero 08H

movwf F8 ;copia W nel registro F8

LPTX93 clrwdt ;azzera watchdog

bcf F6,CLK ;azzera bit x del registro F6

rlf F9 ;shifta a sinistra il registro F9 -> F9

bcf F6,DI ;azzera bit x del registro F6

btfsc F3,0 ;testa bit 0 del registro F3 e salta se = 0

bsf F6,DI ;setta bit x del registro F6

bsf F6,CLK ;setta bit x del registro F6

decfsz F8 ;decrementa registro F8 salta se = 0 -> F8

goto LPTX93 ;vai a LPTX93

retlw 0 ;ritorna da subroutine con W = 0

; -------------------- subroutine rx byte 93 --------------------------------

; f8 = conteggio bit f9 = byte ricevuto

Inserita:

; ---------------------------------------------------------------------------

RX93 movlw .8 ;copia in W il numero .8

movwf F8 ;copia W nel registro F8

clrf F9 ;azzera registro F9

LP93 clrwdt ;azzera watchdog

bcf F6,CLK ;azzera bit x del registro F6

bcf F3,0 ;azzera bit 0 del registro F3

rlf F9 ;shifta a sinistra il registro F9 -> F9

btfsc F6,DO ;testa bit x del registro F6 e salta se = 0

bsf F9,0 ;setta bit 0 del registro F9

bsf F6,CLK ;setta bit x del registro F6

decfsz F8 ;decrementa registro F8 salta se = 0 -> F8

goto LP93 ;vai a LP93

retlw 0 ;ritorna da subroutine con W = 0

;---------------------- conversione bcd decimale ----------------------------

; in w va passato il byte da convertire

BINBCD movwf F29 ;ritorna unita

movwf F31 ;copia per controllo > 99

clrf F30 ;ritorna decine

GTENT movlw .10 ;copia in W il numero .10

subwf F29,0 ;sottrai W da registro F29 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto OVER ;vai a OVER

movwf F29 ;copia W nel registro F29

incf F30 ;incrementa registro F30 -> F30

goto GTENT ;vai a GTENT

OVER movlw MAXIM + 1 ;copia in W il numero MAXIM + 1

subwf F31 ;sottrai W da registro F31 -> F31

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

retlw 0 ;ritorna da subroutine con W = 0

movlw .1 ;numero > 99

movwf F29 ;unita

movwf F14 ;copia W nel registro F14

movwf F16 ;copia W nel registro F16

clrf F30 ;decine

clrf F13 ;azzera registro F13

clrf F15 ;azzera registro F15

retlw 0 ;ritorna da subroutine con W = 0

; ------------------- presentazione cifre su porta c ------------------------

; in w la cifra da visualizzare

DISPL addwf F2,1 ;somma W al registro F2 -> F2

retlw ZER_O ;numero 0

retlw UNO ;numero 1

retlw DUE ;numero 2

retlw TRE ;numero 3

retlw QUATT ;numero 4

retlw CINQUE ;numero 5

retlw SEI ;numero 6

retlw SETTE ;numero 7

retlw OTTO ;numero 8

retlw NOVE ;numero 9

retlw ZER_O ;non ammesso

; ------------------ test pressione pulsante di stop ------------------------

TSTSTP movlw 0EFH ;copia in W il numero 0EFH

movwf F7 ;copia W nel registro F7

clrwdt ;azzera watchdog

btfss F7,3 ;testa bit 3 del registro F7 e salta se = 1

goto TESTAS ;pulsante stop premuto

bcf F17,6 ;clear memoria stop premuto

retlw 0 ;ritorna da subroutine con W = 0

TESTAS btfsc F17,6 ;testo se riconferma stop premuto

goto STOP ;vai a STOP

bsf F17,6 ;setto memoria stop premuto

retlw 0 ;ritorna da subroutine con W = 0

;------------------------ leggi dati da eeprom ------------------------------

READ93 clrwdt ;azzera watchdog

movlw 080H ;leggi da memoria 0

movwf F9 ;copia W nel registro F9

call STA93 ;salta alla subroutine STA93

bcf F6,CLK ;dummy load

bsf F6,CLK ;setta bit x del registro F6

call RX93 ;salta alla subroutine RX93

movf F9,0 ;copia registro F9 -> W

movwf F13 ;primo byte

call RX93 ;salta alla subroutine RX93

movf F9,0 ;copia registro F9 -> W

movwf F14 ;secondo byte

call STO93 ;salta alla subroutine STO93

movlw 081H ;leggi da memoria 1

movwf F9 ;copia W nel registro F9

call STA93 ;salta alla subroutine STA93

bcf F6,CLK ;dummy load

bsf F6,CLK ;setta bit x del registro F6

call RX93 ;salta alla subroutine RX93

movf F9,0 ;copia registro F9 -> W

movwf F15 ;primo byte

call RX93 ;salta alla subroutine RX93

movf F9,0 ;copia registro F9 -> W

movwf F16 ;secondo byte

call STO93 ;salta alla subroutine STO93

retlw 0 ;ritorna da subroutine con W = 0

;------------------------ visualizzazione numero ----------------------------

VISUAL btfsc F17,0 ;testo se in lavoro o in pausa

goto STATLA ;vai a STATLA

movf F15,0 ;copia registro F15 -> W

movwf F27 ;copia W nel registro F27

movf F16,0 ;copia registro F16 -> W

movwf F28 ;copia W nel registro F28

goto VISU ;vai a VISU

STATLA movf F13,0 ;copia registro F13 -> W

movwf F27 ;copia W nel registro F27

movf F14,0 ;copia registro F14 -> W

movwf F28 ;copia W nel registro F28

VISU clrw ;azzera W

TRIS F7 ;porta c out

movf F27,0 ;copia registro F27 -> W

call BINBCD ;salta alla subroutine BINBCD

movf F30,0 ;copia registro F30 -> W

call DISPL ;salta alla subroutine DISPL

movwf F7 ;copia W nel registro F7

bcf F5,0 ;azzera bit 0 del registro F5

call WAI5MS ;salta alla subroutine WAI5MS

bsf F5,0 ;setta bit 0 del registro F5

movf F29,0 ;copia registro F29 -> W

call DISPL ;salta alla subroutine DISPL

movwf F7 ;copia W nel registro F7

bcf F5,1 ;azzera bit 1 del registro F5

call WAI5MS ;salta alla subroutine WAI5MS

bsf F5,1 ;setta bit 1 del registro F5

movf F28,0 ;copia registro F28 -> W

call BINBCD ;salta alla subroutine BINBCD

movf F30,0 ;copia registro F30 -> W

call DISPL ;salta alla subroutine DISPL

movwf F7 ;copia W nel registro F7

bcf F5,2 ;azzera bit 2 del registro F5

call WAI5MS ;salta alla subroutine WAI5MS

bsf F5,2 ;setta bit 2 del registro F5

movf F29,0 ;copia registro F29 -> W

call DISPL ;salta alla subroutine DISPL

movwf F7 ;copia W nel registro F7

bcf F5,3 ;azzera bit 3 del registro F5

call WAI5MS ;salta alla subroutine WAI5MS

bsf F5,3 ;setta bit 3 del registro F5

movlw 00FH ;copia in W il numero 00FH

TRIS F7 ;porta c0..c3 in altre out

movlw 0FFH ;copia in W il numero 0FFH

movwf F7 ;copia W nel registro F7

retlw 0 ;ritorna da subroutine con W = 0

;----------------------------------------------------------------------------

START movlw B'0000' ;porta a out

TRIS F5 ;copia W nel registro TRIS

movlw B'1111' ;copia in W il numero B'1111'

movwf F5 ;copia W nel registro F5

movlw 018H ;copia in W il numero 018H

TRIS F6 ;porta b0..b2,b5..b7 out b3,b4 in

movlw 01EH ;copia in W il numero 01EH

movwf F6 ;copia W nel registro F6

clrw ;azzera W

TRIS F7 ;porta c out

movlw 0FFH ;copia in W il numero 0FFH

movwf F7 ;copia W nel registro F7

movlw B'00000100' ;rtcc interno con prescaler 1:32

OPTION ;copia W nel registro option

movlw MSEC5 ;copia in W il numero MSEC5

movwf RTCC ;copia W nel registro RTCC

clrf FSR ;azzera registro FSR

bcf F17,5 ;memoria ritorno start non da timer

INI call READ93 ;leggi tempi in eeprom

MAIN movlw MSEC1 ;inizializzo contatore ad 1s

movwf F12 ;copia W nel registro F12

bsf F17,0 ;memoria ciclo lavoro

bcf F17,6 ;clear memoria stop premuto

btfss F6,J1 ;testo se ciclico o timer

goto CICLIC ;vai a CICLIC

goto TIMER ;vai a TIMER

;----------------------------------------------------------------------------

TIMER clrwdt ;azzera watchdog

bcf F6,RELE ;rele off

bsf F6,LEDR ;led rosso off

bcf F6,LEDV ;led verde on

btfsc F17,5 ;vedo se ritorno da timer

goto LPTIM ;vai a LPTIM

RILSTA call VISUAL ;salta alla subroutine VISUAL

bcf F7,4 ;attesa eventuale rilascio

clrwdt ;azzera watchdog

btfss F7,0 ;aspetto pulsante start-timer

goto RILSTA ;vai a RILSTA

call WAI5MS ;salta alla subroutine WAI5MS

LPTIM call VISUAL ;salta alla subroutine VISUAL

bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

btfss F7,0 ;aspetto pulsante start-timer

goto CICLIC ;vai a CICLIC

bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

btfsc F7,3 ;aspetto stop x programmazione

goto LPTIM ;vai a LPTIM

goto ATTESA ;vai a ATTESA

;----------------------------------------------------------------------------

CICLIC bcf F6,LEDR ;led rosso on

bsf F6,RELE ;rele on

bsf F6,LEDV ;led verde off

bsf F17,0 ;memoria ciclo lavoro

bcf F17,5 ;memoria ritorno start non in timer

LPCIC1 call VISUAL ;salta alla subroutine VISUAL

call TSTSTP ;controllo se premuto pulsante stop

decfsz F12 ;controllo se scaduto 1s

goto LPCIC1 ;vai a LPCIC1

movlw MSEC1 ;ripristino conteggio 1s

movwf F12 ;copia W nel registro F12

decfsz F14,1 ;sottraggo unita

goto NO_ZE ;vai a NO_ZE

movf F13,0 ;unita < 0

SKPNZ ;equivale a btfsc 3,2

goto LPCIC2 ;decine = 0

goto LPCIC1 ;vai a LPCIC1

NO_ZE movlw MAXIM ;copia in W il numero MAXIM

subwf F14,0 ;sottrai W da registro F14 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto LPCIC1 ;vai a LPCIC1

decf F13,1 ;decrementa registro F13 -> F13

movlw MAXIM ;decine >= 0

movwf F14 ;copia W nel registro F14

movlw MAXIM ;copia in W il numero MAXIM

subwf F13,0 ;sottrai W da registro F13 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto LPCIC1 ;vai a LPCIC1

goto LPCIC2 ;vai a LPCIC2

;

LPCIC2 bsf F6,LEDR ;led rosso off

bcf F6,RELE ;rele off

bcf F17,0 ;memoria ciclo pausa

btfsc F6,J1 ;testo se ciclico o timer

goto INI ;vai a INI

bcf F6,LEDV ;led verde on

call VISUAL ;salta alla subroutine VISUAL

call TSTSTP ;controllo se premuto pulsante stop

decfsz F12 ;controllo se scaduto 1s

goto LPCIC2 ;vai a LPCIC2

movlw MSEC1 ; ripristino conteggio 1s

movwf F12 ;copia W nel registro F12

;

decfsz F16,1 ;sottraggo unita

goto NO_ZER ;vai a NO_ZER

movf F15,0 ;unita < 0

SKPNZ ;equivale a btfsc 3,2

goto ENDCIC ;decine = 0

goto LPCIC2 ;vai a LPCIC2

NO_ZER movlw MAXIM ;copia in W il numero MAXIM

subwf F16,0 ;sottrai W da registro F16 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto LPCIC2 ;vai a LPCIC2

decf F15,1 ;decrementa registro F15 -> F15

movlw MAXIM ;decine >= 0

movwf F16 ;copia W nel registro F16

movlw MAXIM ;copia in W il numero MAXIM

subwf F15,0 ;sottrai W da registro F15 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto LPCIC2 ;vai a LPCIC2

goto ENDCIC ;vai a ENDCIC

;

ENDCIC bsf F6,LEDV ;led verde off

goto INI ;vai a INI

;--------------------------------------------------

STOP bcf F6,RELE ;rele off

bsf F6,LEDR ;led rosso off

bcf F6,LEDV ;led verde on

LPSTP call VISUAL ;salta alla subroutine VISUAL

bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

btfss F7,3 ;aspetto rilascio

goto LPSTP ;vai a LPSTP

goto ATTESA ;vai a ATTESA

;----------------------------------------------------------------------------

ATTESA clrwdt ;azzera watchdog

call VISUAL ;salta alla subroutine VISUAL

bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

btfsc F6,J1 ;vedo se in timer per saltare pulsante start

goto SI_TIM ;vai a SI_TIM

btfsc F7,0 ;aspetto start

goto ATT1 ;vai a ATT1

call WAI5MS ;salta alla subroutine WAI5MS

btfsc F7,0 ;controllo se falsa partenza

goto ATT1 ;vai a ATT1

goto START ;vai a START

SI_TIM bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

btfss F7,0 ;aspetto pulsante start-timer

goto ENDATT ;vai a ENDATT

NOSTAR bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

ATT1 btfsc F7,3 ;aspetto stop x programmazione

goto ATTESA ;vai a ATTESA

bsf F17,1 ;programmazione lavoro (fase)

bsf F17,0 ;programmazione lavoro (tempi)

bsf F17,2 ;memoria pulsante stop premuto

call READ93 ;salta alla subroutine READ93

goto PROGR ;vai a PROGR

ENDATT call WAI5MS ;salta alla subroutine WAI5MS

btfsc F7,0 ;controllo se falsa partenza

goto NOSTAR ;vai a NOSTAR

bsf F17,5 ;memoria ritorno start in timer

goto INI ;vai a INI

Inserita:

;----------------------------------------------------------------------------

PROGR bsf F6,LEDV ;led verde off

bsf F6,LEDR ;led rosso off

bcf F6,RELE ;rele off

bcf F17,3 ;clear memoria pulsante avanti premuto

bcf F17,4 ;clear memoria pulsante indietro premuto

movlw INTER1 ;copia in W il numero INTER1

movwf F19 ;tempo di step con pressione pulsanti continua

movlw INTER1 ;copia in W il numero INTER1

movwf F20 ;tempo di step con pressione pulsanti continua

movlw .10 ;copia in W il numero .10

movwf F18 ;contatore per lampeggio led

LPPRG call VISUAL ;salta alla subroutine VISUAL

bcf F7,4 ;azzera bit 4 del registro F7

clrwdt ;azzera watchdog

btfsc F7,2 ;aspetto pulsante indietro

goto NOIND ;vai a NOIND

btfss F17,4 ;testa bit 4 del registro F17 e salta se = 1

goto INDIE ;vai a INDIE

decfsz F19 ;decrementa registro F19 salta se = 0 -> F19

goto GIRO ;vai a GIRO

movlw INTER2 ;copia in W il numero INTER2

movwf F19 ;copia W nel registro F19

goto INDIE ;vai a INDIE

NOIND btfsc F7,1 ;aspetto pulsante avanti

goto NOAVA ;vai a NOAVA

btfss F17,3 ;testa bit 3 del registro F17 e salta se = 1

goto AVANT ;vai a AVANT

decfsz F20 ;decrementa registro F20 salta se = 0 -> F20

goto GIRO ;vai a GIRO

movlw INTER2 ;copia in W il numero INTER2

movwf F20 ;copia W nel registro F20

goto AVANT ;vai a AVANT

NOAVA bcf F17,3 ;clear memoria pulsante avanti premuto

bcf F17,4 ;clear memoria pulsante indietro premuto

movlw INTER1 ;copia in W il numero INTER1

movwf F19 ;tempo di step con pressione pulsanti continua

movlw INTER1 ;copia in W il numero INTER1

movwf F20 ;tempo di step con pressione pulsanti continua

btfsc F7,3 ;aspetto stop x passaggio a programmazione pausa

goto RILST ;vai a RILST

btfsc F17,2 ;aspetto rilascio

goto GIRO ;vai a GIRO

btfss F17,1 ;testo se programmazione pausa o lavoro

goto ENDPRG ;fine programmazione

btfsc F6,J1 ;vedo se in timer (pausa non settabile)

goto ENDPRG ;vai a ENDPRG

bcf F17,1 ;setto programmazione pausa (fase)

bcf F17,0 ;setto programmazione pausa (tempi)

bsf F17,2 ;setto memoria pulsante stop premuto

goto GIRO ;vai a GIRO

;

INDIE bsf F17,4 ;setto memoria puls. indietro premuto

btfss F17,1 ;testa bit 1 del registro F17 e salta se = 1

goto INDPAU ;vai a INDPAU

decf F14,1 ;decrementa registro F14 -> F14

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F14,0 ;sottrai W da registro F14 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto GIRO ;vai a GIRO

movlw MAXIM ;copia in W il numero MAXIM

movwf F14 ;copia W nel registro F14

decf F13,1 ;decrementa registro F13 -> F13

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F13,0 ;sottrai W da registro F13 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto GIRO ;vai a GIRO

movlw MAXIM ;copia in W il numero MAXIM

movwf F13 ;copia W nel registro F13

goto GIRO ;vai a GIRO

;

INDPAU decf F16,1 ;decrementa registro F16 -> F16

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F16,0 ;sottrai W da registro F16 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto GIRO ;vai a GIRO

movlw MAXIM ;copia in W il numero MAXIM

movwf F16 ;copia W nel registro F16

decf F15,1 ;decrementa registro F15 -> F15

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F15,0 ;sottrai W da registro F15 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto GIRO ;vai a GIRO

movlw MAXIM ;copia in W il numero MAXIM

movwf F15 ;copia W nel registro F15

goto GIRO ;vai a GIRO

;

AVANT bsf F17,3 ;setto memoria puls. avanti premuto

btfss F17,1 ;controllo se programmazione pausa o lavoro

goto AVAPAU ;vai a AVAPAU

incf F14,1 ;incrementa registro F14 -> F14

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F14,0 ;sottrai W da registro F14 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto GIRO ;vai a GIRO

clrf F14 ;azzera registro F14

incf F13,1 ;incrementa registro F13 -> F13

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F13,0 ;sottrai W da registro F13 -> W

btfsc F3,0 ;testa bit 0 del registro F3 e salta se = 0

clrf F13 ;azzera registro F13

goto GIRO ;vai a GIRO

;

AVAPAU incf F16,1 ;incrementa registro F16 -> F16

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F16,0 ;sottrai W da registro F16 -> W

btfss F3,0 ;testa bit 0 del registro F3 e salta se = 1

goto GIRO ;vai a GIRO

clrf F16 ;azzera registro F16

incf F15,1 ;incrementa registro F15 -> F15

movlw MAXIM + 1; ;copia in W il numero MAXIM + 1;

subwf F15,0 ;sottrai W da registro F15 -> W

btfsc F3,0 ;testa bit 0 del registro F3 e salta se = 0

clrf F15 ;azzera registro F15

goto GIRO ;vai a GIRO

;

GIRO btfss F17,3 ;testa bit 3 del registro F17 e salta se = 1

goto NOPRES ;vai a NOPRES

decfsz F19 ;decrementa registro F19 salta se = 0 -> F19

goto NOPRES ;vai a NOPRES

bcf F17,3 ;clear memoria pulsante avanti indietro premuto

movlw INTER2 ;copia in W il numero INTER2

movwf F19 ;tempo di step con pressione pulsanti continua

NOPRES decfsz F18 ;decrementa registro F18 salta se = 0 -> F18

goto LPPRG ;vai a LPPRG

btfss F17,1 ;testa bit 1 del registro F17 e salta se = 1

goto TOGV ;vai a TOGV

movlw B'00000010' ;copia in W il numero B'00000010'

xorwf F6 ;togglo led rosso

bsf F6,LEDV ;led verde off

goto TOGR ;vai a TOGR

TOGV movlw B'00000100' ;copia in W il numero B'00000100'

xorwf F6 ;togglo led verde

bsf F6,LEDR ;led rosso off

TOGR movlw .10 ;copia in W il numero .10

movwf F18 ;contatore per lampeggio led

goto LPPRG ;vai a LPPRG

;

RILST bcf F17,2 ;azzera bit 2 del registro F17

goto GIRO ;vai a GIRO

ENDPRG goto MEMO93 ;vai a MEMO93

;------------------ memorizza nuovo numero su eeprom ------------------------

MEMO93 movf F13,0 ;copia registro F13 -> W

addwf F14,0 ;somma W al registro F14 -> W

btfsc F3,2 ;testa bit 2 del registro F3 e salta se = 0

incf F14,1 ;incrementa registro F14 -> F14

movf F15,0 ;copia registro F15 -> W

addwf F16,0 ;somma W al registro F16 -> W

btfsc F3,2 ;testa bit 2 del registro F3 e salta se = 0

incf F16,1 ;incrementa registro F16 -> F16

movlw 030H ;abilitazione scrittura

movwf F9 ;copia W nel registro F9

call STA93 ;salta alla subroutine STA93

call STO93 ;fine comando abilitazione scrittura

clrwdt ;azzera watchdog

movlw 040H ;scrivi a partire dalla memoria 0

movwf F9 ;copia W nel registro F9

call STA93 ;salta alla subroutine STA93

movf F13,0 ;copia registro F13 -> W

movwf F9 ;copia W nel registro F9

call TX93 ;primo byte

movf F14,0 ;copia registro F14 -> W

movwf F9 ;copia W nel registro F9

call TX93 ;secondo byte

call STO93W ;salta alla subroutine STO93W

movlw 041H ;scrivi a partire dalla memoria 1

movwf F9 ;copia W nel registro F9

call STA93 ;salta alla subroutine STA93

movf F15,0 ;copia registro F15 -> W

movwf F9 ;copia W nel registro F9

call TX93 ;primo byte

movf F16,0 ;copia registro F16 -> W

movwf F9 ;copia W nel registro F9

call TX93 ;secondo byte

call STO93W ;salta alla subroutine STO93W

clrf F9 ;disabilitazione scrittura

call STA93 ;salta alla subroutine STA93

call STO93 ;fine comando disabilitazione scrittura

goto STOP ;vai a STOP

;----------------------------------------------------------------------------

ORG 07FFH ;istruzione successiva a indirizzo 07FFH

goto START ;vai a START

END ;fine del programma

Inserita:

Grazie dell'aiuto Walterword, ma 9 secondi sono troppo pochi... come dicevo me ne servono almeno 900 secondi... poi se non ci sono i millesimi o neanche i centesimi poco importa...

Per DLGCOM

si, effettivamente vorrei + di un consiglio... come dicevo magari andrebbero bene anche le modifiche da apportare a un progetto esistente...

quello che mi hai segnalato tu lo conoscevo gia, ma non sapevo come modificarlo perche non visualizza nemmeno i decimi di secondo...

Se avete pazeinza per potermi dare altre dritte ve ne sarei grato...

Grazie 1000 comunque per l'aiuto parziale!

Ciao!

Inserita:

se studi bene il codice

vedrai che potrai fare quello che vuoi

tutto sta a decidere il decremento , e poi puoi aggiungere anche altri display , il cui valore e' un registro che si incrementa con quello minore

per esempio , mi basta avare un clock di 10 ms per incrementare quello dei secondi , dei minuti e delle ore

purtroppo in questo momento non riesco a dirti di piu , ho delle cose urgenti da consegnare oltre al progetto on line del rabbit

ciao

walter

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