Stap 3: De programmering
Een AVR-chip kan op verschillende manieren worden geprogrammeerd.
- Installeren van de Arduino Bootloader voor het gebruik van de IDE en taal
- Vergadering gebruiken. Hoewel dit kan zeer moeilijk te lezen en te schrijven, kan het zeer efficiënt.
- Gebruik Atmel's officiële IDE Atmel Studio, maar het is alleen beschikbaar op Windows, geen Linux of Mac
- Programma in uw favoriete C of tekst editor en vervolgens compileren en flash met avr-gcc en avrdude maken.
Dit biedt een mooi compromis tussen leesbaarheid en efficiëntie, alsmede het werkt op alle platformen.
Ik zal de vierde en laatste optie detail.
Veel ontwerpers werkt hiervoor zoals je zal gewoon een C-programma schrijven: Eclipse, notepad ++, vi, evenals veel meer.
Download de bijgevoegde led_flash.c bestand en de makefile.
Ik gebruikte een ATTiny 85 voor dit project.
Ik zal eerst uitleggen van de code.
De eerste coderegel is:
#include <avr/io.h>
De constanten met betrekking tot uw AVR-chip in het programma geïmporteerd. Wanneer u het programma compileert, opgeven u moet het type van AVR-chip die u gebruikt.
De volgende invoer:
#include <util/delay.h>
Het gaat hierbij om de functie om de chip te onderbreken tijdens de lus.
Daarna komt enkele definities:
#define shift_light_up(port) port << 1
#define shift_light_down(port) port >> 1
Hiermee definieert u macro's om te verschuiven van het licht op en neer de keten door één stap.
#define register_set_output(register) register = 0b11111111 #define enable_first_light(port) port = 0b00000001
Hiermee definieert u macro's als u wilt instellen een hele register om uit te voeren en om het eerste licht.
Macro's worden in wezen in deze definities maken zodat we niet hoeven de code aan het eind om later te gebruiken. Het kan de code worden veel leesbaarder dan vóór toestaan.
Het instellen van het register op alle 1's in binaire zorgt ervoor dat alle van de pinnen moet een uitgang in plaats van input.
De poort wordt vervolgens de waarde van de pin ingesteld op hoog of laag.
poort << 1 verschuift de ingeschakelde pin door 1 plaats. poort >> 1 het beweegt in de tegenovergestelde richting.
boolean is_last_pin(uint8_t *port){ if((*port & 0b00010000) > 0) return true; else return false; } boolean is_first_pin(uint8_t *port){ if((*port & 0b00000001) > 0) return true; else return true; }
Twee functies waarmee de gemakkelijke test als de eerste of laatste pennen worden momenteel gebruikt door de lichten.
Nogmaals, dit maakt de latere code beter leesbaar.
int main (void){ register_set_output(DDRB); // Set it all to output enable_first_light(PORTB); // Set the first light to on boolean up = true; while(true){ _delay_ms(100); // Dependent on the chip's clock speed, speed must be set if(is_first_pin(&PORTB) == true) //check if it is at the start up = true; else if(is_last_pin(&PORTB) == true) // check if it is at the end up = false; if(up == true) PORTB = shift_light_up(PORTB); // Shift our light up else PORTB = shift_light_down(PORTB); // Shift our light down } }
Dit is het belangrijkste gedeelte van onze functie. De functie int main(void) wordt aangeroepen wanneer de chip wordt opgestart. We het register B worden alle uitgangen voor het eerst inschakelen. Dan we het eerste licht instelt op en verklaar een Boolean-waarde die welke richting onthoudt te gaan. Elke lus eerste vertragingen voor.2 tweede, vervolgens gecontroleerd als de richting moet veranderen. Het eindelijk het licht in de gegeven richting verschuift en de lus herhaalt.
That's it! het definitieve programma is een beetje geabstraheerd zodat het zeer gemakkelijk leesbaar.
Omhoog volgende: De makefile voor het automatiseren van het compileren en knipperende proces