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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

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

Inlägg 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);
	
}

}
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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. :)
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

tack för hjälpen cykze, det var transmitinterrupten som stukade till det.
Skriv svar