Sida 1 av 2
Initiera ATMega128
Postat: 8 februari 2004, 20:09:43
av Harald
Initiera ATMega128
Jag har försökt initiera ATMega128 med följande utdrag ur kod:
.def Temp = r24
clr Temp
out DDRF,Temp
ser Temp
out DDRG,Temp
När jag gör rebuild i AVR500/501 får jag följande felbesked
Illegal argument type count
Alla andra portar kan initieras utan fel.
Är det något speciellt med port F och G?
/Harald
Postat: 8 februari 2004, 20:43:48
av erixon
Jag har förmej att de hamnade utan för direkt addresserna....
och måste då skrivas till som de vore ram....
Postat: 8 februari 2004, 20:48:53
av Harald
Hur gör man det då?
/Harald
Postat: 8 februari 2004, 21:12:00
av erixon
Inte hundra men jag har förmej att det går så här
.def Temp = r24
clr Temp
sts DDRF,Temp
ser Temp
sts DDRG,Temp
Jag har inte AVRStudio här så jag har inte testat.....
Postat: 8 februari 2004, 21:41:45
av Harald
Det funkar! Tackar!
Kan man lagra vad man vill var man vill i ram. Jag menar om man vill mellanlagra värden etc. Vet du hur man gör det i så fall?
/Harald
Postat: 8 februari 2004, 21:52:40
av henkebenke
Man använder ett högnivåspråk som C och skriver =.
Annars kan man väl pusha och poppa på stacken.
Postat: 8 februari 2004, 22:42:20
av erixon
Värt att kolla
http://www.atmel.com/dyn/resources/prod ... OC0856.PDF
Några exempel på instruktioner rörande RAMet
lds
sts
pop
push
etc...
Postat: 9 februari 2004, 16:42:23
av Harald
Det gick ju bra att initiera genom att skriva direkt mot ramet. Nu kommer nästa problem. Hur ska jag skriva till viss bit i PORTG? Detta funkar inte:
cbi PORTG,3
…
sbi PORTG,3
Jag vill tända och släcka en lysdiod som finns på bit 3 i PORTG…
/Harald
Postat: 9 februari 2004, 17:29:45
av Melker
Antar att du måste läsa in vad som ligger på porten i ett register och sedan sätta biten där och skriva ut det igen. Finns det några andra lösningar borde dom ju rimligtvis stå i databladet, så kolla där.
Tända lysdiod
Postat: 9 februari 2004, 18:52:04
av Ado
Du måste ange bitens namn, som include-filen läser den.
Om du anger ett tal funkar det inte.
sbi PORTG,PG2 ;Sätter 3:e biten i PortG
cbi PORTG,PG2 ;Nollställer
Om du skall "tända" flera samtidigt är det smidigt att ladda ett slask-registet och sedan kopiera över detta till PORTG.
ex:
ldi r16,0b01010101 ;Kan oxå skrivas decimalt eller hex
out PORTG,r16
Postat: 9 februari 2004, 19:33:29
av Melker
Ado tror du missat en del av tråden. För övrigt så fungerar det fint att skriva ett tal (/en bit = 0-7) istället för det definerade namnet på biten.
Taget!!
Postat: 9 februari 2004, 19:58:12
av Ado
Såg inte det inlägget med ram-minne-addressering.
Hade heller ingen susning om att man kunde skriva tal rakt till register om vid användandet av sbi och cbi............
Man lär så länge man lever...
Tända lysdioder mm
Postat: 9 februari 2004, 20:17:24
av Harald
sbi PORTG,PG2 ger samma fel dvs Illegal argument type or count.
Men syntaxen sbi PORTA,7 funkar…
Jag har hittills använt PORT A till E och det har funkat bra. När jag skulle använda PORT F och G tog det tvärstopp redan då jag skulle initiera dem. I databladet står att det finns PORTA, DDRA, PINA till PORTG, DDRG, PING. Det är grafer för alla portarna över hela sidan där man bara bytt ut bokstaven A till B osv. Det ser väldigt imponerande ut men det ger ingen extra info. Det hade räckt att göra en graf för PORT A och så skriva att det gäller samma för alla de övriga… Att F och G ska initieras genom att skriva till dem som RAM står ingenstans vad jag har sett. Hur herr Erixon kommit på detta är en gåta!
Jag hade tänkt använda alla fem bitarna i PORT G som utgångar och använda två för lysdioder och tre för styrning med drivkretsar.
I Instruction Set Summary står ingenting om några begränsningar när det gäller PORT F och G.
Ändå är databladet 377 sidor!
Antingen måste jag hitta någon som på något sätt listat ur hur kretsen funkar vad gäller skrivning till PORT F och G eller också måste jag få tag i en manual eller datablad som förklarar hur kretsen funkar.
Om man läser boken ”Programming and customizing the avr microkontroller” av Dhananjay V. Gadre så inser man snart att han inte vet nästan ett dyft om hur AVR-kretsarna fungerar eller används. Hans kunnande verkar begränsa sig till att kunna tända en lysdiod när man trycker på en knapp. I övrigt tycks han bara skrivit av databladet utan att förstå…
/Harald
Postat: 9 februari 2004, 23:06:28
av erixon
Tyvär är det nog så att man är tvungen att läsa in värdet från porten och manuplera den i ett register och sedan skriva tillbaka...
för sbi och cbi är begränsad till addresserna 0-31... (0-0x1F)
Det står inderekt i data bladet då PORTF har högre address än 0x1F...
Men lite rekomderad läsning
http://www.atmel.com/dyn/resources/prod ... oc2550.pdf
Med till hörande fil
http://www.atmel.com/dyn/resources/prod ... macros.inc
Hoppas att det har varit till hjälp

Postat: 10 februari 2004, 10:54:44
av Harald
Jo, man får alltid hjälp här!
Jag provade med att skriva lds PORTG,Temp och sts PORTG,Temp och det funkar. Fast då får man ju som sagt hålla reda på vad som finns på de 5 bitarna om man bara ska ändra en. En konstig grej är att AVR-programmet ständigt vill pricka för att kretsen är en ATMega103-kompatibel och då kan man inte ha PORT G som utgång…
Den som har skrivit databladet och som gjort AVR-Studio tycker jag kan hoppa i sjön!
Tack för all hjälp!
/Harald