Sida 2 av 2
Postat: 3 oktober 2005, 19:55:41
av MBY
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å.