Pagina 1 di 2

Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 1 apr 2015, 15:04
da carlomusumeci
PIC16F84A
Salve qualcuno puo indicarmi una subroutine che mi generi 5 ms di ritardo (delay) con quarzo 4 MHz ?
la dovrei utilizzare per la gestione in multiplexer...
Scritta in assembly...anche qualcosa di semplice decrementando qualche registro...
non vorrei utilizzare il Tmr0...

voi solitamente quanti ms di ritardo utilizzate per il multiplex?

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 1 apr 2015, 15:38
da Paolino
Puoi provare a visitare questa pagina.
Inserendo i dati che vuoi tu (Fosc = 4MHz, ritardo di 5ms), ottieni qualcosa del tipo:

Codice: Seleziona tutto
; Delay = 0.005 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.005 seconds = 5000 cycles
; Error = 0 %

   cblock
   d1
   d2
   endc

Delay
         ;4993 cycles
   movlw   0xE6
   movwf   d1
   movlw   0x04
   movwf   d2
Delay_0
   decfsz   d1, f
   goto   $+2
   decfsz   d2, f
   goto   Delay_0

         ;3 cycles
   goto   $+1
   nop

         ;4 cycles (including call)
   return
; Generated by http://www.golovchenko.org/cgi-bin/delay (December 7, 2005 version)
; Wed Apr 1 13:37:40 2015 GMT
; See also various delay routines at http://www.piclist.com/techref/microchip/delays.htm


Non so quanto possa essere preciso, qualche misura la farei.

Perché no vuoi scomodare il TMR0?

Ciao.

Paolo.

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 1 apr 2015, 16:48
da carlomusumeci
non so non è sprecato utilizzare il tmr0 per il multiplexer? la cosa verrebbe piu semplificata?
poi volevo sapere quanti ms usate solitamente per fare l'operazione del multiplex...5ms ? 100ms?

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 1 apr 2015, 17:16
da Paolino
Dovresti illustrare che cosa devi multiplexzare. Display? Di che tipo? Oppure qualcos'altro?

Se fossero display, ad esempio 4, personalmente impiegherei un timer (TMR0 ad esempio) con la gestione dell'interrupt. Sull'evento overflow del timer, si scatena l'interrupt che permette di pilotare la linea multiplex desiderata.

Quantificare il tempo è ancora una questione da chiarire sulla base dell'applicazione. Con i display (ancora loro) devi garantire che ci siano una buona luminosità dei caratteri e l'assenza di sfarfallii (flickering), davvero fastidiosi. Se hai fino a 4 display, credo che 50ms può essere una base di partenza dalla quale poi scostarsi gradatamente per ottimizzare il tutto.

Ciao.

Paolo.

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 1 apr 2015, 21:30
da carlomusumeci
Ciao Foto UtentePaolino grazie devo pilotare un riquadro pieno di led...per esempio prendo un quadro 4x4 = 16 led... ma che successivamente potrebbe diventare un 8x8 per visualizzare caratteri (lettere) piu chiari...
li piloto tramite la sola portb... dal bit 0 al bit 3 piloto le basi da bit 4 a bit 7 piloto le linee orizzontali...
mettiamo il caso voglio visualizzare il numero "11" (poco chiaro,ma è un esempio) faccio così...dimmi se giusto

Codice: Seleziona tutto
visual11
movlw B'01001000'
movwf portb
call     5ms
movlw B'11110100'
movwf portb
call     5ms
movlw B'01000010'
movwf portb
call     5ms
movlw B'11110001'
movwf portb
call     5ms
goto    visual11


è sbagliato il meccanismo?


Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 2 apr 2015, 13:08
da Dryden
non programmo in assembly ma:

Non ti conviene fare una macro con dentro tutti i numeri da visualizzare e poi chiamare la macro all'interrupt?

I led li devi pilotare insieme, devi vederlo come "led unico che forma il numero desiderato"

Calcola che devi "accendere" i led con una frequenza di almeno 25/30hz altrimenti vedrai sfarfallii

il ritardo va posto tra la fine del numero visualizzato e l'aggiornamento dei led con il numero nuovo.

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 2 apr 2015, 13:37
da WALTERmwp
Ciao Foto UtenteDryden,
Dryden ha scritto:Non ti conviene fare una macro con dentro tutti i numeri da visualizzare e poi chiamare la macro all'interrupt?
se hai inteso scrivere che la macro verrebbe eseguita all'interno della routine di interrupt questo non costituisce proprio una corretta soluzione.
Questo, naturalmente, a prescindere dal linguaggio che si utilizza.

Saluti

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 2 apr 2015, 17:45
da carlomusumeci
Ciao,grazie della risposta...credo che la chiamata del ritardo lo messa al punto giusto...certamente poi verrà strutturata meglio la visualizzazione dei numeri con le macro..è giusto il codice che ho scritto?

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 5 apr 2015, 16:04
da carlomusumeci
Grazie ragazzi sono riuscitto nella realizzazione del multiplexer...allego un video che ho girato...[url]https://www.youtube.com/watch?v=[/url]

inizialmente visualizzavo il numero '11' poi mi sono "divertito" e ho creato qualche gioco carino
Grazie

Re: Subroutine 5ms con quarzo 4 MHz 16F84A

MessaggioInviato: 6 apr 2015, 8:23
da Paolino
Ciao Foto Utentecarlomusumeci.
Complimenti per la realizzazione :ok:

Una domanda: come hai poi realizzato la temporizzazione? RItardo fisso o interrupt di TMR0?

Ciao.

Paolo.