Sei sulla pagina 1di 2

VERIFICA SISTEMI PROGRAMMAZIONE 2560 TIMER

#define F_CPU 16000000UL void IPI(){


#include <avr/io.h> if((PINL&1)==0)I00=acc;
#define acc 255 else I00=0;
#include <avr/interrupt.h> if((PINL&2)==0)I01=acc;
else I01=0;
int i=0, k=0, j=0, l=0; if((PINL&4)==0)I02=acc;
char I00=0,I01=0,I02=0,I03=0,I04=0,I05=0,I06=0,I07=0; else I02=0;
char Q00=0,Q01=0,Q02=0,Q03=0,Q04=0,Q05=0,Q06=0,Q07=0; if((PINL&8)==0)I03=acc;
char M00=0,M01=0,M02=0,M03=0,M04=0,M05=0,M06=0,M07=0; else I03=0;
typedef struct { if((PINL&16)==0)I04=acc;
char IN; else I04=0;
char OUT; if((PINL&32)==0)I05=acc;
unsigned int PV; else I05=0;
unsigned int RT; if((PINL&64)==0)I06=acc;
} temporizzatore; else I06=0;
temporizzatore temp[9]; if((PINL&128)==0)I07=acc;
ISR(TIMER1_COMPB_vect){ else I07=0;
for(k=0;k<10;k++){ }
if(temp[k].IN==acc){
if(temp[k].OUT==0) temp[k].RT++; void IPU(){
if(temp[k].RT==temp[k].PV) temp[k].OUT=acc; if(Q00==0) PORTA=PORTA&0b11111110;
} else PORTA=PORTA|0b00000001;
else { if(Q01==0) PORTA=PORTA&0b11111101;
temp[k].OUT=0; else PORTA=PORTA|0b00000010;
temp[k].RT=0; if(Q02==0) PORTA=PORTA&0b11111011;
} else PORTA=PORTA|0b00000100;
} if(Q03==0) PORTA=PORTA&0b11110111;
TCNT1=0; else PORTA=PORTA|0b00001000;
} if(Q04==0) PORTA=PORTA&0b11101111;
void IPI(); else PORTA=PORTA|0b00010000;
void IPU(); if(Q05==0) PORTA=PORTA&0b11011111;
int main(void) else PORTA=PORTA|0b00100000;
{ if(Q06==0) PORTA=PORTA&0b10111111;
for(k=0;k<10;k++){ else PORTA=PORTA|0b01000000;
temp[k].IN=0; if(Q07==0) PORTA=PORTA&0b01111111;
temp[k].OUT=0; else PORTA=PORTA|0b10000000;
temp[k].PV=0; }
temp[k].RT=0;
}
DDRA=0XFF;
DDRL=0X00;
PORTL=0xFF;
TCCR1C=0;
TCCR1A = 0x00
TCCR1B = 0x02;
TIMSK1=0X04;
OCR1B = 2000;
sei();
while (1){
IPI();
Q00=I00;
temp[0].PV=100;
temp[0].IN=Q00;
Q01=temp[0].OUT;
IPU();

}}

v
1. Commenta le righe di programma evidenziate cercando di spiegare il ruolo delle
istruzioni in esse inserite in funzione dell’obiettivo che secondo te tali istruzioni
hanno nel programma
2. Spiega con parole tue come è possibile che i ritardi vengano gestiti con interrupt e
quale è il vantaggio rispetto all’istruzione delay
3. Indica quali cambiamenti apportare al programma in modo da ottenere, con il
minor numero di modifiche possibile, che il ritardo dell’accensione di Q01 diventi di
1,5 secondi
4. Supponi che il pulsante cablato nell’Arduino che adesso fa parte della porta L e che
ha la sua immagine in I00 debba essere per forza spostato (assieme a tutti gli altri
non presenti nel programma) nella porta C. Quali sono le modifiche che devi
apportare al codice? Se ci sono modifiche ripetitive illustrane una e indica quante
ripetizioni sono necessarie
5. Come potresti modificare il programma per fare in modo che tutti i temporizzatori
contassero in centesimi di secondo anziché in millesimi?
6. Modifica il funzionamento della logica del programma in modo da spegnere Q01
dopo 1 secondo da quando è acceso

Potrebbero piacerti anche