...in Sistemi Programmabili, a scuola, stiamo programmando un orologio regolabile in C per microcontrollore 16F877.
Il PIC è addoperato in una scheda che offre la modalità di programmazione e la modalità di collaudo mediante un selettore; in modalità di collaudo si "attivano", diciamo, le porte (port a, b, c, d), la dove applichiamo tramite cavi flat (piatti) le periferiche (basette con serie di led, display, pulsanti, lcd...).
Ci è stata data consegna, quindi, di realizzare un OROLOGIO REGOLABILE, oltre alla scheda pricipale, va usato:
- serie di pulsanti, dove utilizzandone 2 bisognerà, attraverso questi, rispettivamente con P1 selezionare le "sezioni" (hh oppure mm) da regolare e con l'altro (P2) incrementare di un valore la "sezione" selezionata; da stato normale dell'orologio, un "click" di P1 seleziona le ore (tenendo spenta la sezione mm), due "click", si seleziona mm tenendo spento hh, tre "click" si ritorna allo stato di visualizzazione normale dell'orologio (i pulsanti si attivano al rilascio, tenendo premuto non succede niente);
- serie di led, dove scegliedo un led a caso, quando regolo l'orologio dovrà stare acceso, mentre quando è in visualizzazione normale dovrà lampeggiare alla frequenza di un secondo;
- serie di 4 display, collegati in modalità MUX, per visulizzare ore e minuti dell'ora, i primi due logicamente dovranno visualizzare le ore, i secondi due i minuti (a due cifre), in modalità 24 ore.
Consecutivamente il codice in C per PIC 16F877; utilizzando come compilatore MikroC, il programma compila senza alcun problema il programma, pertanto come sintassi è corretta, però in pratica, nel collaudo, non funziona, o meglio funziona male in quanto mi conta lui, ma in una maniera assurda difficile anche da spiegare:
codice:
unsigned int tempo,mux = 0;
char minuti_unita = 0;
char minuti_decine = 0;
char ore_unita = 0;
char ore_decine = 0;
char sec = 0;
char uti = 0;
char ore = 0;
char a,set= 0 ;
char display [10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};
char attivo = 0; //1 --> conteggio on, 0 --> conteggio off
void interrupt(){
if(INTCON&0x04)
{
if(attivo == 1) tempo++; //per conteggio time
mux++; //per scambio display
INTCON=0x20;
}
}
void main(){
trisd = 0; //coleggamento dati display
portd = 0;
trisc = 0b01100000; // c6,c7 pulsanti input, co,c1,c2,c3,c4 out seleziona display
portc = 0;
portb.F4 = 1; //led acceso perche all'inizio si deve impostare l'ora corrente
//--- Settaggio Timer-----
OPTION_REG=0x80;
TMR0=5;
PIR1=0x00;
PIE1=0x40;
INTCON=0xE0;
//---------------
while(1) //inizio loop infinito
{
//pulsante P1*************************************
if(portc.F5 == 1) //P1
{
attivo = 0;
tempo = 0;
porta.F0 = 1;
set++;
delay_ms(5); //ritardo per antirimbalzo
if(set > 2) set = 0,attivo = 1,portb.F4 = 0;
}
//************************************************
//pulsante P2*************************************
if(porta.F1 == 1) //P2
{
if(set == 1) //imposta minuti
{
uti++;
minuti_unita ++;
if (minuti_unita > 9)
{
minuti_unita = 0;
minuti_decine ++;
}
if(uti==59)
{
uti = 0;
minuti_unita = 0;
minuti_decine = 0;
}
delay_ms(100);
}
if(set == 2) //imposta ore
{
ore++;
ore_unita++;
if (ore_unita > 9)
{
ore_unita = 0;
ore_decine++;
}
if(ore = 24)
{
ore = 0;
ore_unita = 0;
ore_decine = 0;
}
delay_ms(5);
}
}
//************************************************
if(mux == 100) //ogni 10msec cambia display
{
mux = 0;
a++;
if(a > 4) a = 1;
if(a == 1) //stampa minuti_unita
{
portc.F0 = 0;
portc.F1 = 0;
portc.F2 = 0;
portc.F3 = 1;
portd = display[minuti_unita];
}
if(a == 2)//stampa minuti_decine
{
portc.F0 = 0;
portc.F1 = 0;
portc.F2 = 1;
portc.F3 = 0;
portd = display[minuti_decine];
}
if(a == 3)//stampa ore_unita
{
portc.F0 = 0;
portc.F1 = 1;
portc.F2 = 0;
portc.F3 = 0;
portd = display[ore_unita];
}
if(a == 4)//stampa ore_decine
{
portc.F0 = 1;
portc.F1 = 0;
portc.F2 = 0;
portc.F3 = 0;
portd = display[ore_decine];
}
}
if(tempo == 10000) //tempo = 1 sec.
{
tempo = 0;
sec ++;
portc.F4 = ~ portc.F4; //lampeggio led ad intervallo di 1 secondo
if(sec == 59)
{
sec = 0;
uti++;
minuti_unita++;
if (minuti_unita > 9)
{
minuti_unita = 0;
minuti_decine++;
}
if(uti==59)
{
uti = 0;
minuti_unita,minuti_decine = 0;
ore++;
ore_unita++;
if (ore_unita > 9)
{
ore_unita = 0;
ore_decine++;
}
if(ore = 24)
{
ore = 0;
ore_unita, ore_decine = 0;
}
}
}
}
} //fine loop
}
Qualcuno sa qualcosa in materia?
Qualcuno è disposto ad aiutarmi?
Se necessario ci si può sentire su msn per una migliore comunicazione.
Grazie raga!!!