AVR studio 4 mega88 problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

AVR studio 4 mega88 problem

Inlägg av almerase »

Jag har ett lite lustigt problem som jag inte vet hur jag skall lösa... Jag har ett program där jag läser in från PINB och ena gången fungerar det bra och i nästa program med samma kod bara utökat fungerar det inte...
Jag har inte testat om det bara är simuleringen det är fel på men det känns konstigt att simuleringen fungerar ena gången men inte andra utan orsak

Fungerande kod:

Kod: Markera allt

#include <avr/io.h>

unsigned char get_value();
unsigned char et_value();

void init()
{
	DDRD=0xFF; //alla portar utgångar
	PORTD=0x00; //sätter portarna till 0V
	DDRB=0x00; //alla portar ingångar
	PORTB=0xFF; //pullup aktiverat
}

int main()
{
	init();

	unsigned char tal;

	while(1)
	{
		tal = get_value();
		et_value(tal);	
	}
}

unsigned char get_value() //hämtar värde på portB
{
	unsigned char a;
	a = PINB;
	return a;
}

unsigned char et_value(tal)
{
	PORTD=tal;
	return 0; 
}
Icke fungerande kod:

Kod: Markera allt

#include <avr/io.h>

unsigned char get_value();
unsigned char merge();

int main()
{
	init(); //samma init som ovan har plockat bort koden för att göra det lite kortare
    unsigned char tal;
	while(1)
	{
		tal = get_value(); //<-- kommer aldrig från denna funktion
		merge(tal);
	}
}

unsigned char get_value()
{
	unsigned char a;
	a = PINB; //<-- fastnar här
	return a;
}

unsigned char merge(tal)
{
	unsigned char tal2, resultat;

	if(tal<8)
		tal2=3;

	else if(tal==8)
		tal2=2;

	else if(tal>8)
		tal2=1;

	resultat=(tal2<<4)|tal; //shiftar resultatet och ellrar med orginalvärdet

	return resultat;
}
Jag har provat att skapa nytt program och växlat mellan simulator 1 och 2 men inget har fått den nedre koden att fungera... Någon som har någon ide?
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: AVR studio 4 mega88 problem

Inlägg av SvenW »

Kontrollera att optimeringsflaggan är avslagen när du kompilerar.
Optimeringen plockar bort många variabler som då blir osynliga vid simulering.
Ett alternativt sätt är att deklarera variablerna 'volatile'.
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

Re: AVR studio 4 mega88 problem

Inlägg av almerase »

Ingen optimering är påslagen
volatile gör att den pendlar mellan

Kod: Markera allt

unsigned char get_value()
{
   volatile unsigned char a;
   a = PINB; //<-- denna 
   return a; //<-- och denna 
}
dock så får tal ett värde men programmet fortsätter inte förbi denna programsnutt
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

Re: AVR studio 4 mega88 problem

Inlägg av almerase »

När jag deklarerade alla variabler volatile fungerade det bra... Det känns som om den i så fall optimerar bort kod som den inte borde ha optimerat bort...

men tack för hjälpen :) Nu fungerar det som det ska oavsett :)
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: AVR studio 4 mega88 problem

Inlägg av SvenW »

>> den inte borde ha optimerat bort...

Du och kompilatorn kan ha olika meningar om vad som bör göras :)

Min erfarenhet av avr-gcc är att den är ganska smart.
Den gör oftast ett bättre jobb än vad jag själv klarar av med assemblerprogrammering. Och den gör dessutom oftast rätt, till skillnad från mig själv.
(Jag antar att det är avr-gcc som ligger i botten i AVR studio.)
Man kan även köra simulatorn i den kompilatorgenererade assemblerkoden. Då är det lättare att förstå vad som händer.
I ditt fall kanske hela subrutinen merge() försvinner i en enda assemblerinstruktion, dess lokala variabler är bortoptimerade, och assemblerinstruktionen för 'call subroutine' rationaliseras bort.
Titta gärna i assemblerkoden.
Eftersom resultatet för övrigt inte används så kanske alltihop rationaliseras bort!
almerase
Inlägg: 7
Blev medlem: 17 september 2009, 13:25:19

Re: AVR studio 4 mega88 problem

Inlägg av almerase »

Jag är inte så van med assembler/C-programmering så det problemet hade jag inte ens tänkt på men nu när du påpekar det så låter det väldigt vettigt :)

Ja avr-gcc är ett tillbehör annars kan du bara programmera assembler om jag inte missminner mig :)

Problematiken vad en annan tänker och vad ens kod gör är dock extremt välbekant :D
Skriv svar