Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef F_CPU
- #define F_CPU 1000UL
- #include <avr/io.h>
- #include <avr/delay.h>
- #include <avr/interrupt.h>
- void timer() {
- TCCR0 = (1<<CS02) | (1<<CS00); /* Timer0, tryb normal mode, /1024 preskaler */
- TCNT0 = 0x80; /* Wczytaj TCNT0, policz do 1000ms */
- while((TIFR&0x01)==0); /* Zaczekaj TOV0 sie wyzeruje */
- TCCR0 = 0;
- TIFR = 0x1; /* Ustaw flage TOV0 */
- }
- void timer1(int n) //procedura sprawdzajaca
- //przepelnienie flagi i zerujaca zegar
- {
- int i = 0;
- while (1) {
- if (TIFR & (1<<TOV0)) {
- // przy teoretycznie 4MHz to daje okolo 1.4s
- TCNT0 = 220; // ustawienie aktualnego stanu zliczonych impulsow 50ms
- TIFR |= _BV(TOV0); // wyzerowanie bitu flagi przepelnienia
- //PORTA ^= 1;
- i ++;
- }
- if (i == n) {
- PORTA ^= 1;
- break;
- }
- }
- }
- void set_timer_interrupt() {
- DDRA = 0xFF;
- sei();
- TIMSK = (1<<TOIE0); // aktywacja przerwan przepelnienia t0
- TCNT0 = 1;
- TCCR0 = (1<<CS02) | (1<<CS00);
- }
- char check(char nr_row, char stable) {
- char p = 0;
- switch (stable) {
- case 8:
- p = nr_row * 4 + 1;
- break;
- case 4:
- p = nr_row * 4 + 2;
- break;
- case 2:
- p = nr_row * 4 + 3;
- break;
- case 1:
- p = nr_row * 4 + 4;
- break;
- }
- return p;
- }
- ISR(TIMER0_OVF_vect) {
- char p = 0;
- char stable = 0;
- char state = 0;
- char help_p = 0;
- while(1) {
- for (int i = 7 ; i >= 4 ; i --) {
- DDRB = (1 << i); // ddr na kolejne wiersze
- PORTB = ~DDRB; // podciagniecie rezystorow w kolejnym wierszu (ustawienie 0 aby poplynal prad)
- _delay_ms(5); // delay po zmianie ddr
- state = PINB; // debounce
- _delay_ms(5); // delay w celu unikniecia drgan
- stable = (~PINB) & (~state); // przypisanie zer z pinb
- stable &= 0b00001111; // ignorowanie 4 najstarszych bitow
- p = check(7 - i, stable); // uzyskanie wartosci ktora zostanie wyswietlona
- if(p) {
- help_p = p;
- break;
- }
- }
- //if (TIFR & (1<<TOV0)) {
- //TCNT0 = 1; // ustawienie aktualnego stanu zliczonych impulsow 50ms
- //TIFR |= _BV(TOV0); // wyzerowanie bitu flagi przepelnienia
- // TCNT0 = 1; // ustawienie aktualnego stanu zliczonych impulsow 50ms
- //PORTA ^= 1;
- //break;
- //}
- if (help_p) timer1(help_p);
- }
- }
- int main() {
- DDRA = 0xFF;
- PORTA = 0x00;
- TCCR0 = (1<<CS02) | (1<<CS00); /* Timer0, tryb normal mode, /1024 preskaler */
- TCNT0 = 1; /* Wczytaj TCNT0, policz do 50ms */
- set_timer_interrupt();
- while (1) {
- }
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement