- Messaggi: 24
- Ringraziamenti ricevuti 0
PIC 12F509 e conteggio Timer0
- shark2
- Autore della discussione
- Giovane Utente
-
Less
Di più
11 Anni 4 Mesi fa #1
da shark2
PIC 12F509 e conteggio Timer0 è stato creato da shark2
Ciao ragazzi,
sto utilizzando questo piccolo pic che avevo in giro per casa per realizzare un semplice conteggio con il timer interno, la funzione è molto semplice...all'avvio il led è acceso, dopo 2 minuti il led viene spento e subito riacceso dopo 2 secondi e così via ciclicamente...considerando che con una frequenza di 4MHz a cui lavora il pic tramite OSC interno non è possibile raggiungere tempi così lunghi, ho fatto due calcoli in modo che assegnando un prescaler di 256 ed un preload al timer di 61, avrei avuto un overflow dopo 50mS...di conseguenza conti alla mano ho buttato tutto in un ciclo for in modo da ripetere l'operazione per quante volte necessario a raggiungere il tempo finale voluto e di volta in volta incrementare la variabile "count"...successivamente facendo un controllo sul valore di tale variabile viene detto al led cosa fare...la cosa dovrebbe essere semplice, appena programmato o comunque appena avviato il tutto funziona solo per la prima volta, dopo 2 minuti stacca e subito riattacca il led ma poi non ripete più tale operazioni e resta impallato con il led sempre acceso, suppongo vada in blocco...non riesco a trovare l'inghippo, qualcuno saprebbe dirmi come mai?
Di seguito riporto il codice in cui sono "commentate" le configurazioni del PIC (per quante ne abbia tale modello)...il programma è stato compilato in MPLAB+HITECC
Thanks
sto utilizzando questo piccolo pic che avevo in giro per casa per realizzare un semplice conteggio con il timer interno, la funzione è molto semplice...all'avvio il led è acceso, dopo 2 minuti il led viene spento e subito riacceso dopo 2 secondi e così via ciclicamente...considerando che con una frequenza di 4MHz a cui lavora il pic tramite OSC interno non è possibile raggiungere tempi così lunghi, ho fatto due calcoli in modo che assegnando un prescaler di 256 ed un preload al timer di 61, avrei avuto un overflow dopo 50mS...di conseguenza conti alla mano ho buttato tutto in un ciclo for in modo da ripetere l'operazione per quante volte necessario a raggiungere il tempo finale voluto e di volta in volta incrementare la variabile "count"...successivamente facendo un controllo sul valore di tale variabile viene detto al led cosa fare...la cosa dovrebbe essere semplice, appena programmato o comunque appena avviato il tutto funziona solo per la prima volta, dopo 2 minuti stacca e subito riattacca il led ma poi non ripete più tale operazioni e resta impallato con il led sempre acceso, suppongo vada in blocco...non riesco a trovare l'inghippo, qualcuno saprebbe dirmi come mai?
Di seguito riporto il codice in cui sono "commentate" le configurazioni del PIC (per quante ne abbia tale modello)...il programma è stato compilato in MPLAB+HITECC
Thanks
Code:
#define _XTAL_FREQ 4000000
#include <pic.h>
//OSC - Internal Oscillator 4MHz
//WatchDog Disabilitato
//Code Protection Disabilitato
//MCLR Disabilitato
__CONFIG (0x0FEA);
#define LED GP4
void main (void)
{
int i = 0;
int count = 0;
//OPTION_REGISTER
//bit 7 - GPWU - Enable Wake-Up on Pin Change bit - Disabilitato
//bit 6 - GPPU - Enable Weak Pull-ups bit - Disabilitato
//bit 5 - T0CS - Timer0 Clock Source Select bit - Internal instruction cycle clock FOSC/4
//bit 4 - T0SE - Timer0 Source Edge Select bit - Increment on high-to-low transition on the T0CKI pin
//bit 3 - PSA - Prescaler Assignment bit - Prescaler assigned to Timer0
//bit 2,1,0 - Prescaler Rate Select bits - Prescaler settato a 256
OPTION = 0b11010111;
TMR0 = 61;
GPIO = 0;
TRISGPIO = 0b00101111;
LED = 1;
while (1)
{
for (i=0;i<2380;i++)
{
TMR0 = 61;
while (1)
{
if (TMR0 == 255)
{
count++;
break;
}
}
}
TMR0 = 61;
if (count == 2380) LED = 0;
__delay_ms (2000);
LED = 1;
}
}
Si prega Accesso o Crea un account a partecipare alla conversazione.
- firstcolle
-
- Platino Utente
-
Less
Di più
- Messaggi: 362
- Ringraziamenti ricevuti 39
11 Anni 4 Mesi fa - 11 Anni 4 Mesi fa #2
da firstcolle
Risposta da firstcolle al topic PIC 12F509 e conteggio Timer0
se il pic fa solo questo potresti usare solo i delay
accendo il led, ciclo for da 60 delay di 2s, spengo il led, delay 2 secondi e riparte da capo.
altrimenti potresti usare gli interrupt sul timer0, usato cosi non ha molto senso secondo me
una cosa tipo:
accendo il led, ciclo for da 60 delay di 2s, spengo il led, delay 2 secondi e riparte da capo.
altrimenti potresti usare gli interrupt sul timer0, usato cosi non ha molto senso secondo me
una cosa tipo:
Code:
while(1){
LED = 1;
for (char i=0; i<60; i++) {
__delay_ms(2000);
}
LED = 0;
__delay_ms(2000);
}
Ultima Modifica 11 Anni 4 Mesi fa da firstcolle.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- shark2
- Autore della discussione
- Giovane Utente
-
Less
Di più
- Messaggi: 24
- Ringraziamenti ricevuti 0
11 Anni 4 Mesi fa #3
da shark2
Risposta da shark2 al topic PIC 12F509 e conteggio Timer0
il 12F509 è della serie che più "base" non si può...non ha interrupt e niente, solo quei due registri da configurare ed il timer0...alla fine avevo già adottato la soluzione come proposta da te e sembra funzionare senza problemi...volevo però capire lo stesso il perchè si blocchi e casomai pensavo che utilizzare il timer rendesse il tutto più preciso oltre che "fatto meglio"

Si prega Accesso o Crea un account a partecipare alla conversazione.
- firstcolle
-
- Platino Utente
-
Less
Di più
- Messaggi: 362
- Ringraziamenti ricevuti 39
11 Anni 4 Mesi fa - 11 Anni 4 Mesi fa #4
da firstcolle
Risposta da firstcolle al topic PIC 12F509 e conteggio Timer0
nel tuo codice originale una volta spento e riacceso il led non resetti il contatore count. che continuerà fino al valore massimo della variabile.
potresti addirittura eliminare la variabile count e ridurre tutto a:
potresti addirittura eliminare la variabile count e ridurre tutto a:
Code:
while (1) {
LED = 1; // accendi il led
for (i=0;i<2380;i++) { // ciclo for eseguito 2380 volte
TMR0 = 61; // preload del timer
while (TMR0 != 255); // resta qui fin che il timer arriva a 255
continue; // poi continua e riparte il ciclo for
}
LED = 0; // dopo 2380 esecuzioni del ciclo spegne il led
__delay_ms (2000); // delay 2 secondi e riparte da capo
}
Ultima Modifica 11 Anni 4 Mesi fa da firstcolle.
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti