Przerwanie TIMER0

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Dawid2379
Użytkownik
Posty: 318
Rejestracja: 17 lis 2010, 19:42
Lokalizacja: Kluczbork
Kontakt:

Przerwanie TIMER0

Post autor: Dawid2379 » 12 kwie 2012, 17:00

Panowie dlaczego program czepia się przerwania ISR(TIMER0_OVF_vect)
Taki jest komunikat:
../ijo.c:67: warning: 'TIMER0_OVF_vect' appears to be a misspelled signal handler

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

const PROGMEM uint8_t g_ledrida[5] PROGMEM ={
0b111111,
0b000000,
0b111111,
0b000000,
0b111111,
};

const PROGMEM uint8_t g_ledpolb[11] PROGMEM ={
0b111111,
0b111000,
0b111111,
0b111000,
0b111111,
0b111111,
0b000111,
0b111111,
0b000111,
0b111111,
0b111111,
};
 
volatile uint8_t m=0; 
 
 int main(void)
 {
 
	
  
    DDRB = 0xFD; //Port B jako wyjscia
    PORTB = 0xFF; //na poczatek ledy wygaszone
    TCCR0B |= (1 << CS01);       
    TIMSK0 |= (1<<OCIE0B);  
 
    sei(); //Globalne uruchomienie przerwań 
 
	while(1){
 
 
            if(!(PINB & 1<<PB1)){ 
			  _delay_ms(400);
                 if(!(PINB & 1<<PB1)){
				   _delay_ms(400);
 
				 { 
				  m++; 
				 } 
				   if(m>4)
                   {                
				   m=0; 
				   }
				         if(m==0)
                          {      			           
                          PORTB = 0xFF;
                           }
 
                 }
	       }         
 
     }
}
ISR(TIMER0_OVF_vect)
{
static uint8_t t,s,g,c;
 
                if(m==1)
                {                  
				 PORTB = pgm_read_byte(&g_ledrida[s]);				
				   s++; 
	                if(s>4)
                   s=0;
				  }    
                
                else if(m==2)
                {  
				 PORTB = pgm_read_byte(&g_ledpolb[c]);	   
				   c++; 
	                if(c>10)
                   c=0; 
                 }
                else if(m==3)
                { 
				 g++;
                    if(g>4)                      
					     g=0;
                 PORTB = pgm_read_byte(&g_ledpolb[t]);
				   t++; 
	                if(t>10)
                   t=0;
                 }   
 
         
}

Awatar użytkownika
Dawid2379
Użytkownik
Posty: 318
Rejestracja: 17 lis 2010, 19:42
Lokalizacja: Kluczbork
Kontakt:

Post autor: Dawid2379 » 12 kwie 2012, 17:16

Już mam, poszperałem w nocie katalogowej, i ma być ISR(TIM0_OVF_vect)
Jak już pisze, chciałbym aby w tej linijce poniżej włączał się tryb Power down, a wybudzał uC poprzez zmianę stanu na przycisku podłączonego do PB1 czyli INT0/PCINT1 albo na zbocze(jak widać ten przycisk służy tez do zmiany wartości zmiennej "m" w gł. pętli), nie wiem jak to zrealizować pomoże ktoś? Tzn podpowie.

Kod: Zaznacz cały

if(m==0)
                          {                             
                          PORTB = 0xFF;
                           } 

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 13 kwie 2012, 6:42

Na przyszłość zestawienie wektorów przerwań: http://www.nongnu.org/avr-libc/user-man ... rupts.html

Co do POWER_DOWN - jeśli chodzi o piny INT to wybudzenie możliwe TYLKO I WYŁĄCZNIE poziomem na nich, a nie zboczami, patrz tabelka: Active Clock Domains and Wake-up Sources in the Different Sleep Modes

Do trybów usypiania użyj: http://www.nongnu.org/avr-libc/user-man ... sleep.html

Nie podałeś jaki to mikrokontroler.

Awatar użytkownika
Dawid2379
Użytkownik
Posty: 318
Rejestracja: 17 lis 2010, 19:42
Lokalizacja: Kluczbork
Kontakt:

Post autor: Dawid2379 » 13 kwie 2012, 20:36

Mam Tiny13.
Ustawiam tryb POWER DOWN:
MCUCR |= (1 << SM01);
Następnie aby przy jakiejś wartości uśpić procka;
if(m<=52)
sleep_mode();
A wybudzi się zmianą stanu na pinie?? tak to rozumieć wg. tabelki INT0 albo pin change, wystarczy zdefiniować jakiś pin jako wejściowy?

ODPOWIEDZ