...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:
Qualcuno sa qualcosa in materia?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 è disposto ad aiutarmi?
Se necessario ci si può sentire su msn per una migliore comunicazione.
Grazie raga!!!
![]()

Rispondi quotando
Io ho accettato quei consigli, ma evidentemente se richiedo anche quì è perchè non c'è stato assolutamente un minimo di miglioramento...


