AVR reset gond

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
davidpeter
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2010. március 20. szombat, 6:00

AVR reset gond

Hozzászólás Szerző: davidpeter »

Kedves hozzárétők!

Vagy egy AT90USB1287 AVR-em,a mivel kicsit meggyűlt a bajom. Elég misztikus hibákat produkál, amit arra tudtam visszavezetni, hogy UART adatküldéskor resetelődik a kontroller.

A probléma akkor derült ki, amikor visszaküldettem vele a belső adatokat. Kiderült, hogy az UART-ről beolvasott adatokat simán eltárolja, de ha vissza is küldetem, a küldés után minden belső változó újra inicializálódott. Ez a gyakorlatban úgy néz ki, hogy az első UART parancs hatására minden, korábban UART-on kapott adatot visszaküldött, a közvetlenül utána küldött kiolvasó parancsra viszont már csupa null érték jött.

A végletekig egyszerűsítve mutatja a problémát az alábbi forrsákód, melyet futtatva végtelen mennyiségű '?' árasztja el a soros portot.

Kód: Egész kijelölése

int main(void)
{
	callAllInit();
	enableTransciever();
	startRN42();
	WDTCSR = 0;

	sendChar('?');
	
	while(1)
	{
	}
}

Ebből a callAllInit az alábbi USART initet hívja:

void uSARTInit()
{

	UCSR1A = _BV(U2X1); 	//clearing flags, setting double speed (versus normal)
	//UCSR1B = 0; 	//disabling transmitter, setting UCSZ12 in order to provide 8 bit frames
	UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); //8 bit, 1 stop bit, no parity
	UBRR1H = ((unsigned int)(BAUD_PRESCALE) >> 8); 	// Load upper 8-bits of the baud rate value into the high byte of the UBRR register
	UBRR1L = ((unsigned int)(BAUD_PRESCALE)); 		// Load lower 8-bits of the baud rate value into the low byte of the UBRR register 

}

Az enableTransciever ezt a két függvényt hajtja végre:


void enableTransmitter()
{
	UCSR1B = UCSR1B | _BV(TXEN1) | _BV(TXCIE1);		//Transmitter, enable, transmitt complete interrupt enable
}

void enableReciever()
{
	UCSR1B = UCSR1B | _BV(RXEN1) | _BV(RXCIE1);		//Reciever, enable, recieve complete interrupt enable
}

A sendChar() pedig így működik:

void sendChar(char c)
{
	char temp = c;
	while(!rN42ready()); //ez az UART adatokat fogadó modul flow control jeleit ellenörzi.
	while(checkDataRegister());
	UDR1 = temp;
}

Van valakinek ötlete, hogy ez mi lesz?
[/b]
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nagy valószínűséggel Verem túlcsordulás miatt felülíródnak a változóid!
Itt egyáltalán nincsenek vermek dekralálva?
:roll:

Kód: Egész kijelölése

Az initet csak 1* kel végrehajtani! tegyed a Main elé!
callAllInit(); 
enableTransciever(); 
int main(void)  { 
     startRN42(); 
    WDTCSR = 0; 

    sendChar('?'); 

    while(1) { 
   } 
 }
Ja és a lényeg, mivel fordítod le ezt a programot? :?:
Avatar
davidpeter
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2010. március 20. szombat, 6:00

Hozzászólás Szerző: davidpeter »

Használok tömböket, de végignéztem és nem tűnik úgy, mintha bárhol elszabadulna az autoindex. Ráadásul nem egészen verem túlcsordulás, inkább olyan, mintha a PC ráfutna a reset vektorra. Nem kinullázódnak, vagy szeméttel töltődnek fel az értékeim, hanem újrainicializálódnak.

A kódot AVR studio fordítja, AVR GCC modullal. -Os optimalizáció mellett.

Az MCUSR regiszter szerint minden induláskor power up reset volt, azaz nem a reset lábat rántotta meg valami, illetve nem volt watch dog, vagy brown out.

Bármi gond csak UART küldésnél jön elő.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Lekezeletlen Interrupt nem esik be?
Avatar
davidpeter
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2010. március 20. szombat, 6:00

Hozzászólás Szerző: davidpeter »

És igeeeeeeeeeeen!

Fantasztikus vagy!

Az RX complete interrupt nem volt lekezelve. Ugyan nem tudom, hogy hol engedélyeztem (lehet, hogy default?), de adtam neki egy üres függvényt és most nincs reset.

Köszönöm szépen!
Avatar
davidpeter
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2010. március 20. szombat, 6:00

Hozzászólás Szerző: davidpeter »

Még egy kérdés, ami nem szorosan ez:

AVR Studio-ban programozok, AVR GCC fordítóval. Valami miatt a

switch(paraméter)
case x: ... break;
case y: ... break;
default: ... break;

szerkezetben a default ág mindig lefut. Én viszont csak akkor szeretném, ha lefutna, ha nem talált illeszkedést. Mi lehet a gond?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Kihagytad a {}-ket?

Kód: Egész kijelölése

switch (parameter)
{
	case x: ... break; 
	case y: ... break; 
	default: ... break;	
}
Avatar
davidpeter
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2010. március 20. szombat, 6:00

Hozzászólás Szerző: davidpeter »

Konkrétan erről van szó:

Kód: Egész kijelölése

switch(com_buffer[0]){	
		case(0):{
				switch(com_buffer[1]){
			
					case(1): {getExpoLength(com_buffer); break;}
					case(3): {getAFWLength(com_buffer); break;}
					case(5): {getTimeLapseCycle(com_buffer); break;}
					case(7): {getTimeLapseCount(com_buffer); break;}
							
					default: {notImplementedRead(com_buffer); break;}	//nem implementált utasítás
				}


		}
		
		default: {notImplementedRead(com_buffer);  break;} //nem implementált utasítás

	}
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szia!
Tegnap valamiért leállt a Netem!
Szerintem igy kelene:

Kód: Egész kijelölése

		switch(com_buffer[0]){    
			case(0):{ 
				switch(com_buffer[1]){ 
           
					case(1): {getExpoLength(com_buffer); break;} 
					case(3): {getAFWLength(com_buffer); break;} 
					case(5): {getTimeLapseCycle(com_buffer); break;} 
					case(7): {getTimeLapseCount(com_buffer); break;} 
                       
					default: {notImplementedRead(com_buffer); break;}   //nem implementált utasítás 
				}		// END switch(com_buffer[1])		
				break;		// Ide kel még ez!
			}		// END case(0)
			

          default: {notImplementedRead(com_buffer);  break;} //nem implementált utasítás 
      }		// END switch(com_buffer[0])
 
8)
Avatar
davidpeter
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2010. március 20. szombat, 6:00

Hozzászólás Szerző: davidpeter »

Köszönöm szépen, most már minden működik!
Válasz küldése