Hoi allemaal,
Wie kan helpen bij mijn probleempje?
Ik wil elke 10 ms de code in de main functie doorlopen.
Hiervoor gebruik ik Timer0.
Wanneer ik de code (00 optimalisatie) test met de AvrStudio4 simulator loopt het perfect.
Vervolgend compileer ik de code nogmaals maar nu met 0s optimalisatie en schuif de hex-file in de Mega.
Om de een of andere reden worden er geen Timer0 interrupts geactiveerd.
De code staat hieronder.
Wie weet raad?


#include "Init.h" 
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


#define DEBOUNCE_DELAY  0xF
#define COUNTS 		144
#define STARTVALUE_T0	(256 - COUNTS)


void vInitTimer0(void);


unsigned char bToetsBuffer, bToets, bActie,bMainloopflag;
int iInterruptCount, iCount = 1;

void vInitTimer0(void){

	TCCR0 = _BV(CS02);			//prescaler 256 3,86MHz
	TCNT0  = STARTVALUE_T0;
	TIMSK = _BV(TOIE0);

}

ISR(TIMER0_OVF_vect){
	TCNT0  = STARTVALUE_T0;
	bMainloopflag = 1;
}


int main(void)
{

  	DDRB = 0xFF;	//all bits port B output

	vInitTimer0();
	sei();

	while(1){

	while(!bMainloopflag){      //waiting for flag
		PORTB |= _BV(2);
	}

	PORTB &= ~_BV(2);
	bMainloopflag = 0;

	bToets = (PINC & _BV(0));	

	if(bToets)
		PORTB |= _BV(1);
	else
		PORTB &= ~_BV(1);


}


Zet bMainloopflag eens als volatile.

Dus:
volatile unsigned char bMainloopflag;

Daarmee maak je duidelijk aan de compiler dat de variabele kan veranderen door een interrupt en de waarde steeds uit de ram gelezen moet worden.

[Bericht gewijzigd door plantrekker op (47%)]

Hé, zou dat de grap zijn?
Klinkt heel logisch. Omdat de optimalisatie aan staat.
Ga ik proberen. t'Kan een paar daagjes duren, k'heb net m'n opstelling opgeruimd.
Hartelijk dank.

edit: Ja hoor, t'werkt perfect. En dan te bedenken dat ik een paar weken geleden het hoe en waarom van volatiles gelezen had. Grrr.....

[Bericht gewijzigd door drieske op (28%)]