I denna kursen så kommer ni att få gå igenom ett (av tusentals) sätt att programmera en microprocessor.
Vi kommer att använda oss av egen version av Arduino IDEn (alt. den version du har installerat på din dator), en AVRISP mkII programmerare, ett kretskort med processorn på samt säkerligen en del koffein för att klara av våran uppgift.
Kursinnehåll
Vi kommer att gå igenom:
En grundläggande genomgång om man går tillväga att programmera en microprocessor.
Olika koncept såsom register, bit shifting och bitmasking.
En enklare genomgång av C kommer även att göras där vi går igenom vad som kommer att vara användbart under dagen.
Serieprotokoll såsom ICSP, JTAG, SPI, UART och I2C
När detta är klart kommer vi att hålla i en livedemo över hur våran toolchain (,sättet vi använder för att programmera våran microprocessor) går till och efter det kommer vi förklara vad ni ska utföra i laborationsdelen av kursen.
Kursdelmoment med ökande svårighetsgrad:
Se nedan för exempelkod och användbara resurser.
Blinka LED (Register, shifta, timer)
PWM-dimmra LEDs
Styra LED via LDR (Light Dependent Resistor)
Styr LED-intensitet via PWM baserat på LDR input
Konfigurera UART och kommunicera med omvärlden (Extramaterial)
Styr LED som ovan, fast med en PID-kontroller ( Ph.D level of excellence and supreme knowledge ;) )
Efter dagens slut så bör ni ha fått ett grundläggande begrepp över hur man programmerar microprocessorer.
Bra att tänka på
Även om kursen i sig inte har några förkunskapaskrav så kommer vi att använda C som programmeringsspråk och det kan vara bra att se en film eller läsa en bok för att komma igång med det.
Learning to Program in C
Material
Det material som ni ska ha med er är:
Vilja att lära
Gott humör
(Optional) Egen dator
(Optional) Kunskap av att programmera i C
Ni bör av handledarna ha fått:
Ett kretskort med microprocessorn (ATmega168)
En programmerare (AVRISP mkII)
USB-kablar för att koppla ovan nämda till en dator
Nedladdningslänk till ett .zip arkiv innehållande Arduino IDEn, datablad samt ett “pinout” dokument
Arduino
Installation
Ladda hem .zip filen windows-custom-arduino-java.zip och extrahera .zip filen direkt i Nedladdnings-mappen och forstätt sedan med att installera Board Managern nedan.
Detta är en specialversion som behövs för att fungera med egen board-manager på LTUs labbdatorer. Arduinoklienten är modifierad för att spara allting i Mina Dokument istället för %APPDATA%.
OBS På egen datar behövs ej denna specialversion, ladda ned direkt från arduino
Boards Manager
För att installera den board manager som vi vill så
Startar Arduino IDEn som ni just har tankat hem.
Går till Fil→Inställningar alt. File→Settings/Preferences
I fältet Additional Boards Manager URLsfyller ni i https://raw.githubusercontent.com/carlosefr/atmega/master/package_carlosefr_atmega_index.json
Trycker på OK
Går till Verktyg→Kort:XXXXXXXXX→Boards Manager...
Väntar ett tag tills den blå “baren” i nedkanten på fönstret försvunnit
I fönstret som kom upp skrollar ni längs ner och trycker på elementet med namn Barebones ATmega Chips (no bootloader) by Carlos Rodrigues
Det bör då har kommit fram en drop-down meny och en knapp med namn Installera
Se till att i drop-down menyn välja 1.3.0och sedan trycka på Installera
Du har nu installerat en egen board manager, Grattis!
Inställningar för vilket kort vi använder
Grönt XP-el MPPK-kort: Processor = ATmega168
Blått XP-el MPPK-kort: Processor = ATmega168p
I menyn Verktyg så ställer ni in så att det ser ut som följande om ni har ett grönt kort:
Kursdelmoment med ökande svårighetsgrad:
Se nedan för exempelkod och användbara resurser.
Blinka LED (Register, shifta, timer)
Testkod
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
int main(void) // Main execution function
{
DDRD = 0b11111111; // Setting the Data DiRection of port register D to OUTPUTS
while(1) // An infinite loop
{
PORTD = 0b01000000; // Sets the 7:th bit in register D to 1
// Sets the first LED to turn on (and the second to turn off)
_delay_ms(1000); // Waits one second
PORTD = 0x00; // Clears PORTD i.e sets all bits in the register to 0, but in hex ;)
PORTD |= 1 << 6; // Shifts in a 1 into the 7:th bit (6 steps in from position 1) of the PORTD register
_delay_ms(1000); // Waits one second
}
}
PWM-dimmra LEDs
# Initiera PWM
void InitPWM(void)
{
// Clears the compareators and sets the PWM to buttom. Sets the PWM module to use the Fast PWM mode
TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00);
// Sets the PWM module to not use a prescaler
TCCR0B = (1 << CS00);
}
Sätt PWM duty cycle
void SetPWM(uint8_t val)
{
// Sets a 8bit value to the compare register the PWM module uses to create its duty cycle
OCR0A = val;
}
Styra LED via LDR (Light Dependent Resistor)
# Initiera ADCn
void InitADC(void)
{
// Enables and sets prescaler of the ADC.
ADCSRA = (1 << ADEN)|(1 << ADPS1)|(1 << ADPS0);
// sets the ADC to work in 8bit mode and read from the ADC0 pin.
ADMUX = (1 << ADLAR)|(0 << MUX1);
}
# Läsa av ADCn
uint8_t ReadADC(void)
{
// Tells the ADC to start a conversion
ADCSRA |= (1 << ADSC);
// The ADC will reset the start conversion bit after the conversion is done.
while (ADCSRA & (1 << ADSC));
// When the conversion is done the converted data can be read from the ADCH register.
return ADCH;
}
Styr LED-intensitet via PWM baserat på LDR input
Kombinera kod ovan
Konfigurera UART och kommunicera med omvärlden (Extramaterial)
Öppna Databladet för processorn (se nedan), hitta kapitlet om USART.
Lokalisera exempelkoden i underkapitlet om USART Initialisation, ändra FOSC till 16000000 då systemklockan är 16MHz.
Sen finns det även exempelkod för att skicka och ta emot. UDRE ska kompletteras till UDRE0 för att kompilationen skall lyckas.
Styr LED som ovan, fast med en PID-kontroller ( Ph.D level of excellence and supreme knowledge ;) )