raga ho inserito il multiplex nell'interrupt, e funziona, però non so per quale arcano motivo, ora ho perso il contatore che mi incrementa secondi minuti e ore... eppure ho aggiunto solo il multiplex, ora v posto il codice saprete dirmi sicuramente se c'è qualcosa che non va
Codice:
#include <pic.h>
#include <delay.c>
unsigned char DISPLAY[10] = {192, 249, 164, 176, 153, 146, 130, 248, 128, 144}; //array con i numeri
unsigned char bjt, sec=0, min, ore, uniM, decM, uniO, decO; // unita',decine, variabile
unsigned int count=0;
void main()
{
TRISA=0b10000; //setto da RA0 a RA3 come uscite e RA4 come entrata
TRISB=0; //setto tutte le porte RB come uscite
bjt=0;
// Fosc :4MHz
// Timer0 preload :8
// Prescaler :4
// Interrupt time :1,0000mS
// OPTION
// bit 0 -> PS0 Prescaler Rate Select bit 0
// bit 1 -> PS1 Prescaler Rate Select bit 1
// bit 2 -> PS2 Prescaler Rate Select bit 2
// bit 3 -> PSA Prescaler assegnato a Timer0 (1=Watchdog Timer)
// bit 4 -> T0SE Timer0 Signal Edge: 0=low->high 1=high->low
// bit 5 -> T0CS Timer0 Clock Select: internal clock (1=T0CKI transition)
// bit 6 -> INTEDG INTerrupt Edge (1=raise 0=fall)
// bit 7 -> RBPU PortB PullUp (0=off 1=on)
OPTION=0b00000001;
// INTCON
// bit 0 -> RBIF PortB Interrupt Flag
// bit 1 -> INTF RB0/INT Interrupt Flag
// bit 2 -> T0IF Timer0 Interrupt Flag
// bit 3 -> RBIE PortB Interrupt Enable (off)
// bit 4 -> INTE INT Interrupt Enable (off)
// bit 5 -> TMR0IE Timer0 Interrupt Enable (on)
// bit 6 -> PEIE PEripheral Interrupt Enable (off)
// bit 7 -> GIE Global Interrupt Enable (on)
INTCON=0b10100000;
// Preload Timer0
TMR0=8;
while(1)
{
if(RA4==0) //se il pulsante su RA4 viene premuto aumenta i minuti
{
DelayMs(50); // antirimbalzo
if(RA4==0)
{
min++;
if(min>=60) // e se i minuti arrivano a 60 li azzera e incrementa le ore
{
min=0;
ore++;
if(ore==24)ore=0; // se le ore arrivano a 24 le azzera
}
}
}
}
}
// INTERRUPT SERVICE ROUTINE
void interrupt isr(void)
{
// questo interrupt si verifica ogni millisecondo come da impostazioni
if (T0IF)
{
// Ricarico subito il Timer0
TMR0=8;
//calcolo valori da visualizzare
uniM=min%10;
decM=(min/10)%10;
uniO=ore%10;
decO=(ore/10)%10;
if(bjt==4)bjt=0; //azzera bjt in caso arrivi a 4 per nn andare oltre
bjt++; //variabile di supporto per multiplex
count++; // incremento il contatore per incremento secondi (siccome l'interrupt è ogni ms dopo 1000ms
incremento il secondo
if (count==1000) //ovvero questo
{
count=0; // azzero il contatore
sec++; //incremento i secondi
if(sec>=60){ //se i secondi sono arrivati a 60
sec=0; //li azzero
min++;// e incremento i minuti
if(min>=60){//se i minuti sono arrivati a 60
min=0;//li azzero
ore++;//e incremento le ore
if(ore>=24){//se le ore arrivano a 24
ore=0;//è arrivata mezzanotte e azzero XD
}
}
}
}
//quì inizia il blocco multiplex, ogni ms la variabile bjt viene incrementata e ogni ms viene visualizzato un display diverso
if(bjt==1)
{
// unità minuti
PORTB=0;
PORTA=0b01110;
PORTB=DISPLAY[uniM];
}
if(bjt==2)
{
// decine minuti
PORTB=0;
PORTA=0b01101;
PORTB=DISPLAY[decM];
}
if(bjt==3)
{
// unità ore
PORTB=0;
PORTA=0b01011;
PORTB=DISPLAY[uniO];
}
if(bjt==4)
{
PORTB=0;
PORTA=0b00111;
PORTB=DISPLAY[decO];
}
T0IF=0;// Reset flag interrupt su timer 0
} // End T0IF
} // End ISR
Tecnicamente dovrebbe andare, perchè prima che inserissi il multiplex il blocco per l'orologio mi andava, ora che l'ho inserito l'orologio nn va più ma il multiplex funziona...