Vai al contenuto
PLC Forum


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


mister999

Messaggi consigliati

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.

Link al commento
Condividi su altri siti


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?

Link al commento
Condividi su altri siti

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!

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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
Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

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

Link al commento
Condividi su altri siti

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

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

Link al commento
Condividi su altri siti

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!

Link al commento
Condividi su altri siti

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

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