Documente Academic
Documente Profesional
Documente Cultură
Raport
La disciplina: Microprocesoare
Lucrare de laborator Nr.6
2015
Scopul lucrarii:
1) Studiera modulului timer.
2) Aplicarea modulului timer in practica.
Definiia problemei:
S se realizeze o aplicaie pe MCU, unde va fi realizat un cias reprezentat pe 8 indicatoare pe 7 segmente.
Schimbarile indicatoarelor trebuie sa fie efectuate cu ajutorul modulului Timer0 setat la overflow, la o
frecventa 8 Hz. Codul trebuie sa fie mixat intre limbajele de programare C.
Date teoretice:
Registrul TCCR0 are rolul de a selecta i prescala susra semnalului de tact, el avnd forma:
Din acest registru vom folosi numai ultimii 3 bii (CS02, CS01, CS00) pentru setare.Valorile pe
care le poate lua i seminificaiile lor sunt urmtoarele:
000 nu se selecteaz nici o surs de tact;
001 folosete ceasul intern fr prescalare;
010 folosete ceasul intern cu prescalarea 8 (clkT0/8);
011 folosete ceasul intern cu prescalarea 64 (clkT0/64);
100 folosete ceasul intern cu prescalarea 256 (clkT0/256);
101 folosete ceasul intern cu prescalarea 1024 (clkT0/1024);
110 folosete o surs extern de tact la pinul T0.Se ia n considerare frontul descresctor;
111 folosete o surs extern de tact la pinul T0.Se ia n considerare frontul cresctor;
Pentru a se putea genera o cerere de ntrerupere a timer-ului 0 trebuie ca cel mai semnificativ bit
al registrului SREG(bitul I) s fie 1 i cel mai nesemnificativ bit al registrului TIMSK, bitul TOIE0 s fie tot
1.
Modul de lucru:
Figura4. Schema bloc functia main Figura5.Schema bloc pentru functia de intrerupere
Figura6. Schema bloc pentru functia Port_init Figura7.Schema bloc pentru functia TIMER0_init()
Determinare()
;
time[7] ++;
time[7] > 9
Fals Adevar
Fals Adevar
time[6] > 5
time[4] > 5
Fals Adevar
time[4] = 0;time[3] ++;
Fals Adevar
time[3] > 3
time[1] > 6
Fals Adevar
time[1] = 0;
retur
Figura8.Schema bloc pentru functia Determinare()
n
TablouInitiere(secunde,
minute, ore, zile)
Secunde >=1
Fals Adevar
i++;secunde = secunde - 1;
Fals Adevar
minute >=10
Fals Adevar
ore >= 1
PORTD |= (1<<1);
Da PORTA = cifra[time[indicator]]; break;
7 PORTD &= ~(1<<2);
NU
(1<<1);
PORTD |= (1<<2);
6 Da PORTA==cifra1[time[indicator]];
PORTA cifra[time[indicator]]; break;
6 ~(1<<2);
PORTD &= ~(1<<3);
Nu
PORTD |= (1<<3);
(1<<1);
5 Da PORTA
PORTA==cifra[time[indicator]];
cifra[time[indicator]]; break;
5 PORTD &= ~(1<<4);
~(1<<2);
Nu
PORTD |= (1<<4);
Da PORTA = cifra[time[indicator]]; break;
4 PORTD &= ~(1<<5);
Nu
PORTD |= (1<<5);
Da PORTA = cifra[time[indicator]]; break;
3 PORTD &= ~(1<<6);
Nu
PORTD |= (1<<6);
Da PORTA = cifra[time[indicator]]; break;
2 PORTD &= ~(1<<7);
Nu
PORTD |= (1<<7);
Da PORTA = cifra[time[indicator]]; break;
1 PORTD &= ~(1<<0);
Nu
PORTD |= (1<<0);
Da PORTA = cifra[time[indicator]]; break;
0 PORTD &= ~(1<<1);
Fals Adevar
indicator <=
0
indicator = 8;
retur
Figura10.Schema
n bloc pentru functia Afisare ()
2) Proiectam schema electrica pentru simulare in PROTEUS
Codul Programului:
#include <avr/io.h>
#include <avr/interrupt.h>
}
if (indicator <= 0)
{
indicator = 8;
}
indicator--;
asm("nop");
}
void Determinare()
{
if (counter >= 199)
{
time[7] ++;
if (time[7] > 9)
{
time[7] = 0;
time[6]++;
if (time[6] > 5)
{
time[6]=0;
time[5]++;
if (time[5] > 9)
{
time[5] =0;
time[4]++;
if (time[4] > 5)
{
time[4] = 0;
time[3]++;
if (time[3] > 3)
{
time[3] = 0;
time[2]++;
if (time[2] > 1)
{
time[2] = 0;
time[1]++;
if (time[1] > 6)
{
time[1] = 0;
}
}
}
}
}
}
}
}
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = TCNT0_init;
Determinare();
Afisare();
counter ++;
if (counter > 199)
{
counter = 0;
}
asm("nop");
}
void Port_init()
{
DDRA = 0xff;
PORTA = 0b00000000;
DDRB = 0b11111111;
PORTB = 0b11111100;
DDRC = 0b00000000;
PORTC = 0b11111111;
DDRD = 0Xff;
PORTD = 0b11111111;
}
void TIMER0_init()
{
TCNT0 = TCNT0_init;
TIMSK |= (1<<TOIE0);
TCCR0 |= (1 << CS01);
int main(void)
{
Port_init();
TIMER0_init();
unsigned char secunde = 22;
unsigned char minute = 49;
unsigned char ore = 15;
unsigned char zile = 05;
TablouInitiere(secunde, minute,ore,zile);
sei();
while(1)
{
asm("nop");
}
}