Envist problem med mega88/AVR studio

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
MBY
Inlägg: 89
Blev medlem: 8 juni 2003, 10:50:01

Inlägg av MBY »

MicaelKarlsson skrev:Detta kan vara något: http://www.avrfreaks.net/modules/Freaks ... DN_033.pdf
Den koden kompilerar som den ska - för 8535, en processor jag varken har eller vet något om.

Ändrar jag direktivet till m[16/48/88/168/103/whatever]def.inc är det samma visa igen.

"Bäst" går det med m16def.inc (mega16 är den processor jag försöker med nu...) - bara två kompileringsfel.

out ADCSR,temp
...
sbi ADCSR,ADSC
...ger felen Undefined symbol: ADCSR

Om jag byter ut "ADCSR" mot "ADCSRA" så funkar det för mega16, men inte för mega88.

Edit: Som läget är nu har jag, tack vare hjälpen här, lyckats göra det jag ska - fast med fel processor.
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

Jag körde igenom den här kodsnutten i avr-gcc:

Kod: Markera allt


int main(void)
{
ADMUX=15;
ADCSRA = 77;
while(1)
	;
return 0;
}

Och den kompilerades till detta:

Kod: Markera allt

00000000 <main>:
   0:	c0 e0       	ldi	r28, 0x00	; 0
   2:	d0 e0       	ldi	r29, 0x00	; 0
   4:	de bf       	out	0x3e, r29	; 62
   6:	cd bf       	out	0x3d, r28	; 61
   8:	8f e0       	ldi	r24, 0x0F	; 15
   a:	80 93 7c 00 	sts	0x007C, r24
   e:	8d e4       	ldi	r24, 0x4D	; 77
  10:	80 93 7a 00 	sts	0x007A, r24
  14:	ff cf       	rjmp	.-2      	; 0x14

Hoppas det kan vara till hjälp.

Edit: uppdaterade koden till att innehålla både ADMUX och ADCSRA.
MBY
Inlägg: 89
Blev medlem: 8 juni 2003, 10:50:01

Inlägg av MBY »

Megge: Vilken processor kompilerade du för? Det verkar som de olika modellerna skiljer sig rätt mycket åt vad platsen för ADMUX ligger beträffar.
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

Det är för ATmega88
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Jag har kört ADC´n på både Mega8 och Mega32 med följande kod.
Kan tyvärr inte klistra in hela koden med tar dom berörda delarna.
Jag initierar ADC´n först. Sen väljer jag kanal att läsa av i read och läser sedan in dom 8 högsta bitarna till "avgas".
Den är inställd så den automatiskt skyfflar bitarna tills ADCH är fullt. (MSB)
Så i ADCL finns bara dom lägsta mest känsliga bitarna. (LSB)

Hoppas det kan hjälpa dig!

Kod: Markera allt

init:
	ldi	temp,0b11000000	;Init AD to 2.56v internal Aref
	out	admux,temp

read:
	ldi	temp,0b11100101		;choose channel 5 from adc
	out	admux,temp
	ldi	temp,0b11000000		;set the register adcsr
	out	adcsr,temp
	rcall	delay2			;Wain until ADC has  stabilized
	in	avgas,adch
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

I appnote avr094 (Replacing ATmega8 by ATmega88)http://www.atmel.com/dyn/resources/prod ... oc2553.pdf så står det på sidan 3 att ATmega88 har fått en utökning av I/O register i området 0x60-0xFF och att man måste använda ST/STS/STD och LD/LDS/LDD för att komma åt dessa. Vilket är precis vad koden från avr-gcc i ett tidigare inlägg gör.
MBY
Inlägg: 89
Blev medlem: 8 juni 2003, 10:50:01

Inlägg av MBY »

Megge skrev:I appnote avr094 (Replacing ATmega8 by ATmega88)http://www.atmel.com/dyn/resources/prod ... oc2553.pdf så står det på sidan 3 att ATmega88 har fått en utökning av I/O register i området 0x60-0xFF och att man måste använda ST/STS/STD och LD/LDS/LDD för att komma åt dessa. Vilket är precis vad koden från avr-gcc i ett tidigare inlägg gör.
AHA! Där satt den. Tror jag. Tack.

Jag trodde dessa instruktioner bara var det "skräp" som kompilatorer behagade introducera i koden, alternativt efterföljande instruktioner som inte var listade i din källkod.

Jag har inte provat ännu, men ska göra det vid tillfälle. Det borde fungera.

Men... Är det inte lite oroväckande, ändå? Det visar ju tydligt att kodportabiliteten inte är så "total" som jag vågade hoppas på.
Skriv svar