AVR programmering med Arduino, AVRdude och AVR-gcc (3 / 7 steg)
Steg 3: Programmering
En AVR chip kan programmeras i olika olika sätt.
- Installera Arduino Bootloader för att använda IDE och språk
- Använda församling. Även detta kan vara mycket svårt att läsa och skriva, kan det vara mycket effektivt.
- Användning Atmel officiella IDE Atmel Studio, men det är bara tillgänglig på Windows, inte Linux eller Mac
- Skapa programmet i din favorit C eller text editor och sedan kompilera och flash använder avr-gcc och avrdude.
Detta ger en fin kompromiss mellan läsbarhet och effektivitet som fungerar på alla plattformar.
Jag kommer detalj det fjärde och sista alternativet.
Många redaktörer kommer att arbeta för detta som du ska helt enkelt skriva en C-program: Eclipse, märka ++, vi, samt många fler.
Ladda ner den bifogade led_flash.c filen och makefile.
Jag använde en ATTiny 85 för detta projekt.
Jag kommer först förklara koden.
Den första raden i koden är:
#include < avr/io.h >
Detta importerar de konstanter som avser din AVR chip i programmet. När du kompilerar programmet, ange du måste typ av AVR chip som du använder.
Nästa import:
#include < util/delay.h >
Detta inkluderar funktionen för att pausa chipet under slingan.
Därefter kommer några definitioner:
#define shift_light_up(port) port << 1
#define shift_light_down(port) port >> 1
Definierar makron för att skifta ljus upp och ner kedjan med ett steg.
#define register_set_output(register) register = 0b11111111
#define enable_first_light(port) port = 0b00000001
Definierar makron för att ställa in en hela registret att produktionen och för att det första ljuset.
Dessa definitioner i huvudsak skapa makron så att vi inte behöver använda koden i slutet senare. Det kan låta koden vara mycket mer läsbar än innan.
Ange register till alla 1 i binär orsakar alla stiften att en utgång, i stället för input.
Porten anger sedan värdet av PIN-koden till hög eller låg.
Port << 1 skiftar den aktiverade pin av 1 plats. Port >> 1 flyttar den i motsatt riktning.
booleska is_last_pin(uint8_t *port) {
om ((* port & 0b00010000) > 0)
return true;
annars returnera falskt;
}
booleska is_first_pin(uint8_t *port) {
om ((* port & 0b00000001) > 0)
return true;
annars returnera sant;
}
Två funktioner som gör det lätt testet av om första eller sista stiften används för närvarande av lamporna.
Igen, detta gör senare koden mer lättläst.
int main (void) {
register_set_output(DDRB); Ställa allt till utgång
enable_first_light(PORTB); Ange först ljus till på
booleska upp = sant;
While(true) {
_delay_ms(100); Anhörigen på det chip klockhastighet, hastighet måste anges
om (is_first_pin(&PORTB) == true) //check om det är från början
upp = sant;
annat if (is_last_pin(&PORTB) == true) / / kolla om det är i slutet
upp = false;
om (upp == true)
PORTB = shift_light_up(PORTB); Flytta vårt ljus
annat
PORTB = shift_light_down(PORTB); Flytta vårt ljus
}
}
Detta är den viktigaste delen av vår funktion. Funktionen int main(void) kallas när chipet startar. Vi först aktivera registret B vara alla utgångar. Sedan vi inställd första ljuset på och förklarar ett booleskt värde som minns vilken riktning att gå. Varje slinga första förseningar för 2. andra, kontrollerar sedan om riktning behöver förändras. Det slutligen skiftar ljuset i viss riktning och upprepas loopen.
Det är det! sista programmet är lite frånvarande för att den ska vara väldigt lättläst.
Upp nästa: Den makefile att automatisera sammanställningen och blinkande processen