|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Sep 2008
Città: Mogliano Veneto (TV)
Messaggi: 175
|
[C] Programmazione PIC (16F877) - Orologio regolabile
Ragazzi...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 è disposto ad aiutarmi? Se necessario ci si può sentire su msn per una migliore comunicazione. Grazie raga!!! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
2 cent
Codice:
if(ore = 24) |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Sep 2008
Città: Mogliano Veneto (TV)
Messaggi: 175
|
?? Cosa vuoi dire?
L'orologio dovrebbe contare 24 ore; dopo il primo minuto la consegna del prof. direbbe che dovrebbe comparire 00:01 e proseguire con il conteggio dei minuti e delle ore... Se qualcuno sa/puà aiutarmi ne sarei grato e felice. Grazie mille anticipamente.. |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Sep 2008
Città: Mogliano Veneto (TV)
Messaggi: 175
|
(tengo a precisare che è da ottobre che abbiamo cominciato a prendere in mano il C in classe, io anni fa facevo già qualche cavolata in C ma non così...quindi non ne so molto).
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2781
|
Intendeva dire che dovrebbe essere if(ore == 24)
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Sep 2008
Città: Mogliano Veneto (TV)
Messaggi: 175
|
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Sep 2008
Città: Mogliano Veneto (TV)
Messaggi: 175
|
allora? nessuno sa niente di più?
|
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Sep 2008
Città: Mogliano Veneto (TV)
Messaggi: 175
|
Giovedì dovremo consegnare?
Qualche buon anima che mi può dare una mano? Grazie anticipatamente. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:51.




















