Sida 1 av 1

Djävulsbesatt Timer0 ATmega168

Postat: 21 augusti 2011, 21:54:59
av wolie
Försöker porta lite djävulsbesatt C-kod:

Kod: Markera allt

/*Globals*/

unsigned char Timer, OverTime;
void init_timer0 (void)
{
TCCR0B = 0x00;
TCNT0 = 184;
bit_set(TIMSK0,TOIE0);
TCCR0B = 0x05;
}


ISR (TIMER0_OVF_vect)
{
TCNT0 = 184;
if (Timer != 0)
{ 
Timer--; 
} else { 
OverTime = 1;
bit_flip(PORTB,PB0);
Timer = 0;
}
So far so good, PB0 tänds.
MEEEEEN i main:

Kod: Markera allt

...
while (1)
{
  if (OverTime == 1) {
     break;
  }
_delay_ms(10);
}
...
Så hoppar den aldrig ur while-loopen. Har provat med olika typer av while och for loopar men resultatet är detsamma: Att OverTime blivit 1 ignoreras totalt.
Tankar på det? :(

Re: Djävulsbesatt Timer0 ATmega168

Postat: 21 augusti 2011, 22:00:16
av sm5tfx
Deklarera OverTime som volatile så att kompilatorn inte optimerar bort läsningarna i loopen.

Re: Djävulsbesatt Timer0 ATmega168

Postat: 21 augusti 2011, 22:01:06
av Micke_s
volatile är det nog du bör lägga till framför OverTime, annars så kommer/kan kompilatorn optimera lite till din nackdel.
Edit: var inte riktigt först.

Re: Djävulsbesatt Timer0 ATmega168

Postat: 21 augusti 2011, 22:06:15
av wolie
Jahh, just det. Tack! :)

Körde iofs. med -O0 men gcc envisas alltså med optimeringar i alla fall? :humm:

Re: Djävulsbesatt Timer0 ATmega168

Postat: 22 augusti 2011, 09:52:27
av Icecap
Nu tycker jag ju att sättet programmet är skrivit på är synnerligt fel men det kan ju bara vara en test-case och att det finns anledning att ha den struktur ändå, jag har dock svårt att förstå att det behövs.

Nåväl, kompilern kanske "anser" att det inte har med optimeringar att göra eller hur?

Re: Djävulsbesatt Timer0 ATmega168

Postat: 22 augusti 2011, 21:05:11
av jesse
Varför har du delay_ms(10) inuti while-loopen?
Det finns väl ingen anledning att inte kolla flaggan (OverTime) hela tiden?

Re: Djävulsbesatt Timer0 ATmega168

Postat: 23 augusti 2011, 00:11:41
av wolie
Precis som jesse och Icecap påpekar är koden jag tagit ur main bara tillfällig test-kod. Det ska inte se ut så alls.
Om någon har liknande problem rekommenderar jag http://en.wikipedia.org/wiki/Volatile_variable
Intressant är dock att om du kör gcc -O0 på 'without' exemplet på wikipediasidan så fungerar det utmärkt.