Bra komma igångguider för AVR + C ?
Bra komma igångguider för AVR + C ?
Som topic lyder, vet ni om några bra komma igångguider för avr i C, alla jag sett är för assembler. Är helt grön på µC så guiden får gärna ha bra exempel och på samma gång förklara hur koden fungerar.
Tänkte använda WinAVR.
Tänkte använda WinAVR.
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
http://www.microschematic.com/inde.html
http://www.avrbeginners.net/
http://freespace.virgin.net/seant.ellis/avrrobot.htm (Assambler om jag minns rätt, men kul projekt)
Ha det så kuligt med Programmers Notepad
http://www.avrbeginners.net/
http://freespace.virgin.net/seant.ellis/avrrobot.htm (Assambler om jag minns rätt, men kul projekt)
Ha det så kuligt med Programmers Notepad

Tycker du ska lära dig C först, om du inte redan kan det. Det som sedan är AVR-specifikt är inte så där jättetungt. Eller jo visst är det en del. Men kan du C så räcker det att kolla på ett eller två kodexempel så är du igång. I början räcker det med att du lär dig _tre_ register; nämligen DDRn, PORTn och PINn (där n kan vara t ex B). Med DDRn ställer du in om en pinne ska vara ut- eller ingång. Men PORTn ställer du in om porten ska vara hög eller låg (om den är utgång) eller om den ska ha pullup eller inte (om den är ingång). Med PINn kollar du om pinnen är hög eller låg, om pinnen är satt som ingång i DDRn. Genom att kunna skriva och läsa pinnarna kan du ju göra vad som helst egentligen, förutsatt att du kan C dvs.
Delar du upp det så att du lär dig C först och sedan AVR:en så slipper du lära dig två saker samtidigt. Se till att du får kläm på bit-hantering i C. Du kommer har _stor_ nytta av att kunna bolla med bitarna på rätt sätt.
Delar du upp det så att du lär dig C först och sedan AVR:en så slipper du lära dig två saker samtidigt. Se till att du får kläm på bit-hantering i C. Du kommer har _stor_ nytta av att kunna bolla med bitarna på rätt sätt.
MicaelKarlsson, rätt intressanta länkar, men AVRBeginners och den andra var assembler.
cykze, PHP är väl rätt likt C, eller har jag helt misstagit mig?
Jag kan PHP någolunda "flytande", och C skrivs väl på ungefär samma sätt?
C skulle knappast vara till skada att kunna, men tror jag föredrar att lära mig det på samma gång jag lär mig avr.
Just nu sitter jag och blinkar med lite leds, men hur skall man räkna ut vilken led som slocknar? Lägger jag PORTB = 0xFF; så är alla av, 0x80 släcker bara första leden, 0x40 andra osv. ända till 0x10, 0x05 släcker 8 och 10an och inte 5an som jag vill.
cykze, PHP är väl rätt likt C, eller har jag helt misstagit mig?
Jag kan PHP någolunda "flytande", och C skrivs väl på ungefär samma sätt?
C skulle knappast vara till skada att kunna, men tror jag föredrar att lära mig det på samma gång jag lär mig avr.
Just nu sitter jag och blinkar med lite leds, men hur skall man räkna ut vilken led som slocknar? Lägger jag PORTB = 0xFF; så är alla av, 0x80 släcker bara första leden, 0x40 andra osv. ända till 0x10, 0x05 släcker 8 och 10an och inte 5an som jag vill.
Jaha, kan du PHP så kan du det mesta i C förutom pekare och troligtvis inte bitoperationer.
Använd inte hexadecimalvärden. Det är betydligt tydligare att OR:a bitarna du vill sätta istället. Alltså, istället för att skriva,
PORTB = 0x05;
så skriver du,
PORTB = _BV(PB0) | _BV(PB2);
eller möjligtvis i binär form,
PORTB = 0b00000101;
Då ser du direkt att PB0 och PB2 kommer bli höga och resten låga.
När det gäller bitoperationer så kanske mitt inlägg här kan vara till lite hjälp. En förklaring av _BV().
Använd inte hexadecimalvärden. Det är betydligt tydligare att OR:a bitarna du vill sätta istället. Alltså, istället för att skriva,
PORTB = 0x05;
så skriver du,
PORTB = _BV(PB0) | _BV(PB2);
eller möjligtvis i binär form,
PORTB = 0b00000101;
Då ser du direkt att PB0 och PB2 kommer bli höga och resten låga.
När det gäller bitoperationer så kanske mitt inlägg här kan vara till lite hjälp. En förklaring av _BV().
Har kört fast lite nu, så långt jag hittat exempel (mest på ledblinkare) förstår jag ungefär vad koden gör, men hur skall jag göra om jag t.ex. vill att PB0 skall bli hög sålänge jag tynger på knapp1 (kopplad mellan gnd och PD2) och PB1 hög när jag tynger på knapp två (kopplad mellan gnd och PD3)?
Måste väl finnas någon kommaigångguide, verkar ju halvt omöjligt att lära sig annars. Finns det någon manual med typ alla kommandon till WinAVR och förklaring på vad de gör?
Hur har ni andra lärt er? När jag började med php kom man ganska långt med att läsa manualen.
Måste väl finnas någon kommaigångguide, verkar ju halvt omöjligt att lära sig annars. Finns det någon manual med typ alla kommandon till WinAVR och förklaring på vad de gör?
Hur har ni andra lärt er? När jag började med php kom man ganska långt med att läsa manualen.
Då behöver du en "if-sats"
ex:
("måsvingarna" ( "{" och "}" ) kan uteslutas om det bara är en rad som ska köras under "if")
*do something* kommer endast ske OM x är exakt lika med y
(det går att använda !=, <, <=, >, >= också)
för att läsa en port använder du PINx (ex. a=PINB vilket gör att variablen a får värdet port B har för tillfället)
för att läsa en pinne kan "PINx.y" fungera x=porten, y=pinnen (0~7)
annars får man använda sig av bitoperationer.
Hoppas detta kan hjälpa dig lite, hör annars av dig.
Edit:
såg att du använder WinAVR, den kompilatorn tror jag inte stödjer ex. "a=PINB.2" som jag förklarade ovan, du blir tvungen att använda "a=PINB & 0x00000010"
ex:
Kod: Markera allt
if( x == y)
{
*do something*
}
*do something* kommer endast ske OM x är exakt lika med y
(det går att använda !=, <, <=, >, >= också)
för att läsa en port använder du PINx (ex. a=PINB vilket gör att variablen a får värdet port B har för tillfället)
för att läsa en pinne kan "PINx.y" fungera x=porten, y=pinnen (0~7)
annars får man använda sig av bitoperationer.
Hoppas detta kan hjälpa dig lite, hör annars av dig.
Edit:
såg att du använder WinAVR, den kompilatorn tror jag inte stödjer ex. "a=PINB.2" som jag förklarade ovan, du blir tvungen att använda "a=PINB & 0x00000010"
Halloj!
Kan inge om just AVR, men har programmerat en del C/C++. Jag antar att PORTB och PORTD är 2 stycken 8 bittars register (1 byte vardera), så isåfall skulle din kod som kopierar PORTD's värd till PORTB vara:
Två likhetstecken används enbart när man skall kontrollera ett värde. Ett likhetstecken används om man vill tilldela ett värde t.ex:
Kollar om PORTB innehåller värdet 45. Om inte, så behåller PORTB det värde det hade, medans:
Tilldelar PORTB värdet 45. D.v.s om PORTB var 77 innan if-statsen så är den 45 nu. Detta kan vara användbart vid vissa tillfällen, men också orsaka massa konstiga buggar om man tabbar sig. OBS! Ovanstående kod ger alltid sant, eftersom du tilldelar PORTB 45 så är ju PORTB 45. Jag reserverar mig dock lite, eftersom jag inte säkert vet hur det fngerar på hårdvaruregister, men normalt så ger det alltid sant.
Så en god regel är att ha koll på == och =.
Jag skulle dock rekommendera en god nybörjarbok i C först så du lär dig själva C-syntaxen, speciellt pekare och hur binära operationer fungerar. När det gäller microcontrollers så är ett kunnande om bitar, adresser och bytes a och o.
mvh Mats
Kan inge om just AVR, men har programmerat en del C/C++. Jag antar att PORTB och PORTD är 2 stycken 8 bittars register (1 byte vardera), så isåfall skulle din kod som kopierar PORTD's värd till PORTB vara:
Kod: Markera allt
PORTB = PORTD;
Kod: Markera allt
if (PORTB == 45)
Kod: Markera allt
if (PORTB = 45)
Så en god regel är att ha koll på == och =.
Jag skulle dock rekommendera en god nybörjarbok i C först så du lär dig själva C-syntaxen, speciellt pekare och hur binära operationer fungerar. När det gäller microcontrollers så är ett kunnande om bitar, adresser och bytes a och o.
mvh Mats
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt: