ATMega328

Fra Holstebro HTX Wiki
Skift til: navigering, søgning

ATMega328 er en microcontroller der nok ikke er så simpel at starte med, da den er relativ kompliceretmed mange indbyggede funktioner som er til at arbejde med. Det er en 28 bens microcontroller, hvor de 22 ben kan bruges mere eller mindre som IO og et normalt kun anvendes som reset og et er analog reference.

Som pinout antyder, så kan den meget mere:

ATMega328 Pinout

Udviklingsboard

Boardet er endnu ikke testet

ATMega328 Udviklingsboard

Layoutet for ATMega328 Udviklingsboard

En del af denne beskrivelse bygger på det viste udviklingsboard, der er en del af en serie udviklet ved Holstebro HTX, for at gøre de forskellige Atmel-typer lettere tilgængelige.

Udviklingsboardet er lagt ud i Eagle med schematic og board liggende i en zip-fil, der kan fremstilles som enkelt-sidet print, dog med enkelte lus.

Der er også dele i denne beskrivelse, der bygger på de generelle egenskaber der er for PIC'en, og der hvor beskrivelsen ikke slår til, må man fordybe sig i databladet for PIC'en.

Databladet for PIC'en ligger i vores samling af datablade som dækker de fleste aktve komponenter vi arbejder med.

ATMega328 Udviklingsboard
Diagram over ATMega328 Udviklingsboard

Test af udviklingsboard

For at kunne teste udviklingsboardet, så kan det være en fordel at smide noget test-kode i ATTinyen, og koble lidt hardware på, for at se om den rent faktisk fungerer.

Der er en ZIP-fil med et kodeeksempel der løber gennem alle 22 udgange. Man kan teste ved at sætte 22 LED'er med tilhørende begrænsnings-modstande på udgangene.

I ZIP-filen ligger der batch-job til at Builde, brænde, erase og brænde fuses. De kræver at WinAVR er installeret.

Bootloader til Arduino

I zipfilen ligger ligeledes en hex-fil med Arduinoens bootloader, så man kan brænde en ny ATMega328 til Arduinoen, så den kan fungere som en Arduino.

Til dette formål skal man først anvende Set Fuses til 16 MHz X-tal og derefter Burn Bootloader

Fordeling af port-ben

De tre porte er fordelt som følgende tabel viser:

Ben-funktionerne er endnu ikke korrekte

Port B - Stik SV1

Ben Digital Analog Funktion
1 PB0 - Digital, CLKO. ICP1, Interrupt 0
2 PB1 - Digital, PWM, Interrupt 1
3 PB2 - Digital, /SS, PWM, Interrupt 2
4 PB3 - Digital, Prog. MOSI, PWM, Interrupt 3
5 PB4 - Digital, Prog. MISO, Interrupt 4
6 PB5 - Digital, Prog. CLK, Interrupt 5
7 PB6 - Digital, XTAL1, Interrupt 6
8 PB7 - Digital, XTAL2, Interrupt 7
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Port C - Stik SV2

Ben Digital Analog Funktion
1 PC0 ADC0 Digital, Analog, Interrupt 8
2 PC1 ADC1 Digital, Analog, Interrupt 9
3 PC2 ADC2 Digital, Analog, Interrupt 10
4 PC3 ADC3 Digital, Analog, Interrupt 11
5 PC4 ADC4 Digital, Analog, I2C SDA, Interrupt 12
6 PC5 ADC5 Digital, Analog, I2C SCL, Interrupt 13
7 PC6 - Reset - Er ikke forbundet til porten
8 - AREF Analog reference
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Port D - Stik SV3

Ben Digital Analog Funktion
1 PD0 - Digital, Serial RXD, Interrupt 16
2 PD1 - Digital, Serial TXD, Interrupt 17
3 PD2 - Digital, INT0, Interrupt 18
4 PD3 - Digital, INT1, PWM, Interrupt 19
5 PD4 - Digital, Timer input, Interrupt 20
6 PD5 - Digital, Timer input, PWM, Interrupt 21
7 PD6 - Digital, Analog comperator, PWM, Interrupt 22
8 PD7 - Digital, Analog comperator, Interrupt 23
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Digitale I/O ben

Port B har 8 digitale ben, der er betegnet PB0 til PB7 der kan være både input og output, PB6 og PB7 kan dog også anvendes til et eksternt krystal. Port C har 6 digitale ben, der er betegnet PC0 til PC5, der alle kan være både input og output, samt analoge input. PC6 vil normalt bare anvendes til reset og programmering - den kan kobles til andet, men det kræver så at man anvender 12,5V programmering, som vi ikke har adgang til umiddelbart. Port D har 8 digitale ben, hvor PD0 og PD1 normalt vil anvendes til en seriel port.

Analoge input

De ben der er benævnt ADC0 til ADC5 er analoge input, der hver kan måle enten i området 0-5V (ved 5V forsyning) eller i området 0 til Aref (ben 21) der sidder sammen med Port C.

Målingen giver et 10 bit tal, ved at man angiver hvilken kanal man vil måle på, starter konverteringen og aflæser tallet, når konverteringen er slut, så man kan kun måle en kanal ad gangen, men det er relativt hurtigt at gøre, så det betyder ikke det store.

Comperatorer

Der er to comperatorer indbygget, der kan sættes til at sammenligne 2 analoge spændinger.

I øvrigt skal man her lige være opmærksom på, at den analoge inputspænding skal være mellem VSS og VDD. Årsagen er – som man kan se på nedenstående figur fra databladet – at inputtet er adskilt fra forsyning og stel med dioder. Så der vil kunne løbe strøm gennem dioderne, hvis spændingen ikke var derimellem.

Reset og Programmeringsspænding

Ben 1 (PC6) har to specielle funktioner.

Den ene er angivet ved VPP, der betyder at der skal kredsen have en speciel programmeringsspænding, når man skal brænde et nyt program ind i den. Denne form for programmering anvender vi ikke.

Den anden er at man kan resette kredsen ved hjælp af et eksternt signal, så koden starter forfra. Denne funktion har vi normalt slået til, så vi ikke kan bruge dette ben til andet.

Programmerings-ben

USCK, MISO og MOSI (PB3-PB5) er de tre ben der modtager koden når microcontrolleren skal have brændt ny kode ind.

Indbyggede countere/timere

Der er to indbyggede countere, der kan sættes op enten som counter fra PA3 og PA4, eller fra en fast frekvens, så de kan virke som timere - begge dele kan tilkobles interrupt. Den sidste kan kun virke som timer.

Timer 0 / counter 0 er 8 bits, så den kan kun tælle til 255. Timer 1 / counter 1 er 16 bits, så den kan tælle til 65535.

Hardware interrupt

Der er forskellige ben der kan sættes til Interrupt, så programmet kan reagere meget hurtigt, selvom koden er i gang med noget andet. Det kan være både på forkant, bagkant eller skift af niveau der interruptes.

Puls-bredde output

En lidt speciel måde at angive et analogt output på er ved at sætte et outputben højt i en %-del af tiden og lavt i resten af tiden, så hvis det f.x. er højt i 40% af tiden, så vil det give 2V ud gennemsnitligt.

Hvilke ben PB1-PB3, PD3, PD5 og PD6 har denne funktion indbygget.

Pulse width modulation er en måde at simulere en spænding, ved et digitalt output. Det fungerer sådan, at selvom outputtet enten 0V eller 5V, så kan man ved at lave kortere eller længere impulser af det høje output, lave noget der praktisk fungere som en spænding imellem 0V og 5V. Typisk kan PWM have en værdi/spænding mellem 0 og 255, hvilket svarer til 8bit, men der kan lægges større opløsning i signalet. Jo hurtigere impulserne kommer efter hinanden, jo mere ”flydende” vil spænding blive. Så hvis det er en microcontroller med hurtig frekvens af instruktioner, så vil spændingen opleves mere jævn. Man kan med en kondensator el. Jævne ekstra ud, selvom det i de fleste tilfælde ikke er nødvendigt. En pære eller diode, vil ihvertfald opleves, som lysende jævnt, ved brug af PWM.

EEPROM

I PIC'en er der en EEPROM, det står for en Electrically Erasable Programmable Read Only Memory, altså en hukommelse der normalt kun kan læses, men som er programmerbar og som kan slettes elektrisk.

Det er samme princip som flash-hukommelse, og har den gode egenskab, at indholdet huskes også efter en strømafbrydelse, modsat RAM, hvor indholdet forsvinder, hvis strømmen har været væk.

Der er 256 bytes EEPROM i denne PIC.

Oscillator

Som vi normalt kobler Atmels microcontrollere op, så arbejder de med 8 MHz, der deles ned, så en maskininstruktion tager 4 svingninger, altså 2us IKKE verificeret. På XTAL1 og XTAL2 (PB0 og PB1) er det muligt at koble en resonator eller et krystal på, som enten kan få den til at arbejde hurtigere (op til 20 MHz), hvis kodetiden betyder noget, eller man kan få den til at arbejde langsommere, hvis man vil spare på strømmen.

På dette udviklingsboard er der ikke gjort plads til en resonator, da de fleste applikationer klarer sig fint med 8 MHz.

Strømforsyning

Printet kan få strøm fra to forskellige kilder. Det kan altså enten være Arduino-brænderen der forsyner printet med 5.0V (standard for USB). Den anden mulighed er via en ekstern strømforsynings und gennem portstikket, hvor man kan forsyne med 2,7V - 5,5V. Man kan endda arbejde ned til 1,8V, men så kan man kun arbejde med op til 4 MHz clock-frekvens.