You are on page 1of 4

b).

DDRD |= 1<<7
DDRD &=~ 1<<2
DDRD &=~ 1<<5
PORTD |= 1<<2
PORTD |= 1<<5

c). Fast PWM

int ms=0, l, h, poz=0, value;


void display(char p, char c)
{
PORTA &= 0b11110000;
PORTC &= 0b00000000;

switch(c){
case 0: PORTC|=0b00111111; break;
case 1: PORTC|=0b00000110; break;
case 2: PORTC|=~0b10100100; break;
case 3: PORTC|=~0b10110000; break;
case 4: PORTC|=~0b10011001; break;
case 5: PORTC|=~0b10010010; break;
case 6: PORTC|=~0b10000010; break;
case 7: PORTC|=~0b11111000; break;
case 8: PORTC|=~0b10000000; break;
case 9: PORTC|=~0b10010000; break;
}
switch(p){
case 1: PORTA|=0b00000001; break;
case 2: PORTA|=0b00000010; break;
case 3: PORTA|=0b00000100; break;
case 4: PORTA|=0b00001000; break;
}
// Delay_ms(1); // #include <util/delay.h>
}

void init_adc()
{
ADMUX = 0b01000000;
ADCSRA= 0b10000111;
}

int adc(char ch)


{
ADMUX &= 0b11100000;
ADMUX |= ch;
ADCSRA|=(1<<6);
while(ADCSRA&(1<<6));
l = ADCL;
h = ADCH;
return h << 8 | l;
}

void init_timer()
{
TCCR0 = 0b00001011;
TCNT0 = 0;
OCR0 = 125;
TIMSK|= 0b00000010; //activeaza intreruperea de Output Compare Match
(comparare la iesire)
}

void init_PWM(){
TCCR2 = 0b01101001;
OCR2 = 128; //factor de umplere 50%
}

//ISR
void ISR_Timer0() iv IVT_ADDR_TIMER0_COMP ics ICS_AUTO {

poz++;
switch(poz){
case 1: display(1,value%10);break;
case 2: display(2,(value/10)%10);break;
case 3: display(3,(value/100)%10);break;
case 4: display(4,(value/1000)%10); poz=0;break;
}

if (ms==100){
value = (adc(6)/4);
OCR2 = value;
ms=0;
}
else ms++;
}

void main(){
DDRA = 0b00001111; //seteaza pinii de iesire
DDRC = 0b01111111;
DDRD |=1<<7; //PD7 - output
init_adc();
init_timer();
init_PWM();
SREG |= 1<<7; //set enable interrupt - activeaza intreruperile

for(;;){
}
}

d). Numaratoeul incrementeaza din sec in sec + potentiometrul??


void init_timer1()
{
TCCR1A=0;
TCCR1B=0B00001100;
TCNT1H=0;
TCNT1L=0;
OCR1AH=31250>>8;
OCR1AL=31250;
TIMSK|=(1<<4);
SREG|=1<<7;
}

void display(char p, char c)


{
PORTA&=0B11110000;
PORTC&=0B00000000;
switch(c)
{
case 0: PORTC|=0B00111111;
break;
case 1: PORTC|=0B00000110;
break;
case 2: PORTC|=0b01011011;
break;
case 3: PORTC|=0b01001111;
break;
case 4: PORTC|=0B01100110;
break;
case 5: PORTC|=0B01101101;
break;
case 6: PORTC|=0B01111101;
break;
case 7: PORTC|=0B00000111;
break;
case 8: PORTC|=0B01111111;
break;
case 9: PORTC|=0B01101111;
break;
}
switch(p)
{
case 1: PORTA|=0B00000001;
break;
case 2: PORTA|=0B00000010;
break;
case 3: PORTA|=0B00000100;
break;
case 4: PORTA|=0B00001000;
break;
}
}

int s,poz;

void NUME_NORMAL_INTRERUPERE() iv IVT_ADDR_TIMER1_COMPA ics ICS_AUTO


{
s++;
}

void NUME_NORMAL_INTRERUPERE2() iv IVT_ADDR_TIMER0_COMP ics ICS_AUTO{


poz++;
switch(poz){
case 1: display(1,s%10);break;
case 2: display(2,(s/10)%10); poz=0; break;
} }

void init_adc(){
ADMUX = 0b01000000;
ADCSRA= 0b10000111;
}

int adc(char ch){


ADMUX &= 0b11100000;
ADMUX |= ch;
ADCSRA |= (1<<6);
while(ADCSRA & (1<<6));
l = ADCL;
h = ADCH;
return (h << 8 | l);
}

void main()
{
DDRA|=0b00001111;
DDRC|=0b11111111;
DDRD&=~(1<<2);
TCCR0=0b00000011;
TCNT0=0;
TIMSK|=1<<1;
s=0;

init_timer1();

for(;;)
{

if(PINB&(1<<0))
{
TCNT0=0;
s=0;

}
}

e). Numaratorul decrementeaza

void Timer0_ISR() iv IVT_ADDR_TIMER0_COMP{


digit++;
switch(digit)
{ case 1: display(4,s%10);break;
case 2: display(3,(s/10)%10);break;
case 3: display(2,(m%10);break;
case 4: display(1,(m/10)%10); digit=0;break;
}

if(ms==1000){
s--;
if(s=0){
s=60
m--}
ms=0
}
else ms++;

You might also like