Sida 2 av 2

Postat: 3 oktober 2005, 19:55:41
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.

Postat: 3 oktober 2005, 21:00:29
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.

Postat: 3 oktober 2005, 22:04:04
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.

Postat: 3 oktober 2005, 22:56:08
av Megge
Det är för ATmega88

Postat: 4 oktober 2005, 12:48:56
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

Postat: 4 oktober 2005, 13:21:16
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.

Postat: 4 oktober 2005, 15:37:53
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å.