Sida 1 av 1

Byta värde på variabel från interrupt (AVR+ WinAVR)

Postat: 12 september 2005, 18:20:14
av björn
Jag missar något.... Jag vill ändra värdet på "time" när jag skickar ett nytt värde till avren via usarten. Det nya värdet skrivs ut en gång men sen blir det FF igen. HJÄLP

Kod: Markera allt

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define FOSC 1000000 //clock
#define BAUD 4800 //baudrate
#define MYUBRR ((FOSC/16)/BAUD-1)
volatile double  time= 0xff;
void USART_init (unsigned int ubrr){
	/*set uart budrate*/
	UBRRH = (unsigned char)(ubrr>>8);
	UBRRL = (unsigned char)ubrr;
	/*Enable receiver and transmitter uart*/
	UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXEN) | _BV(TXCIE);
	/*set frameformat : 8 databits 1 stop bits (is default)*/
	//UCSRC = (1<<URSEL) |(1<<USBS) | (3<<UCSZ0);

}

SIGNAL (SIG_USART_RECV)
{	
	
	time = UDR;
	
}

int main (void){
USART_init (MYUBRR);
sei();
for (;;){
	_delay_ms(time);
	UDR = time;
	_delay_ms(time);
	
}

}

Postat: 12 september 2005, 22:39:21
av cykze
* Kolla om UDRE-biten är satt innan du tilldelar UDR ett nytt värde.

* time ska vara av typen uint8_t, inte ett flyttal (double).

* Du har aktiverat Transmitinterrupten men du har ingen interruptrutin för denna. Det leder till att AVR:en resetas och time får sitt startvärde, 0xFF, igen.
Du skulle kunna ha lagt till en rolig blinkning eller liknande i början av main() så märker du tydligt om AVR:en resetas. Bara ett tips till någon annan gång.

Hoppas det var det som var fel. :)

Postat: 13 september 2005, 13:42:37
av björn
tack för hjälpen cykze, det var transmitinterrupten som stukade till det.