Projectwerk microcontrollers:
Doel van het labo • Kenmerken van microcontrollers bestuderen • Zelfstandig bestuderen van onbekende componenten aan de hand van technische documentatie (datasheets, schema’s, …) • Zelfstandig analyseren en oplossen van een typisch praktisch microcontroller probleem • Realtime debugging technieken
Vereiste voorkennis • Microprocessoren • C (gebruik van pointers !!!) • Basiskennis analoge en digitale elektronica
Evaluatie • 10pt: Voltooiingsgraad opdracht (testbenches niet vergeten !!!) • 5pt: Kwaliteit code – – – –
Commentaar (belangrijk: becommentariëring functies) Modulariteit, parametriseerbaarheid Vermijden van blocking code (wordt verder besproken) Leesbaarheid code (geen spaghetti code!)
• 5pt: Permanente evaluatie – Nakomen van afspraken, efficiëntie in foutoplossen, inzet, …
Praktische afspraken • Cursustekst – Aanwezig in mappen in het labo – Te downloaden van de labowebsite
Belangrijkste kenmerken • • •
MICROCONTROLLER geheugen en interface logica zijn geïntegreerd in één IC Zeer snel in te zetten: als enige externe component is een klokkristal nodig. Criteria voor het gebruik van microcontrollers – – – –
•
Compact (weinig randcomponenten, hoge integratiegraad, kleine package) Zeer zuinig (enkele mA) Goedkoop Flexibel (herprogrammeerbaar) < -- > vaste logica
Toepassingen: – – – – –
•
automotive (parkeersensor, ECU, airbags, ruitenwissers, …) Batterypacks Motorcontrollers Domotica …
De ATMEGA128 is lid van de AVR reeks, gaande van ATTINY controllers met 1kB geheugen, kostprijs ca 1 EUR
tot ATMEGA controllers met 256kB geheugen, kostprijs ca 15 EUR
•
In tegenstelling met 6809 & PC: in de AVR microcontrollers wordt een Harvard architectuur gehanteerd: gescheiden programma en data bus. Voordeel: terwijl data gelezen/geschreven wordt kan de volgende instructie uit het programmageheugen opgehaald worden
zie datasheet p3
Klokoscillator • Microcontroller: synchroon systeem klok nodig • Bron: – Extern signaal (via XTAL1 pin) – Extern klokkristal (via XTAL1 en XTAL2 pinnen) – Interne RC oscillator (minder stabiel)
• Hoe lager de klokfrekwentie hoe minder vermogen verbruik; – 1MHz: 12mW – 20MHz: 200mW
• Ter vergelijking: moderne PC processor: 50-100 W !! • De AVR microcontrollers zijn RISC processoren elke klokcyclus wordt meestal één assembler instructie afgehandeld.
Programma geheugen • 128 kB programmageheugen; genoeg voor ca 20000 regels C code, afhankelijk van de structuur, gebruikte libraries. • Georganiseerd in 64k x 16 bit (instructies zijn 16 bit breed) • Harvard gescheiden van datageheugen • FLASH geheugen: behoudt zijn inhoud bij stroomuitval • Programmeren van het geheugen – – – –
Via een parallele programmeerinterface (weinig gebruikt) Via een JTAG interface Door de microcontroller zelf ( Bootloader !) Via een SPI interface
• ‘C’ file Codevision ‘.ASM’ file ‘Assembler’ ‘.HEX’ file • Nuttig : ‘.LST’ file: gegenereerde ASM code, samen met de oorspronkelijke C code
SPI MOSI
0 1 2 3 4 5 6 7
SCK MISO • een SPI interface is in weze een schuifregister – Data wordt via de MOSI lijn ingeshift (input) – Data wordt via de MISO lijn uitgeshift (output) • Synchrone serïele bus: het kloksignaal wordt via een externe lijn doorgegeven
Const data in FLASH onder Codevision • Codevision C compiler kent een uitbreiding om data in FLASH te stockeren: ‘flash’ keyword • Bv flash char t[]={“Hello world”}; • Deze data is read only! t[0]=‘a’; ongeldig!!
Data A/D bus • 8 bits brede databus, 16 bit brede adres bus • 32 registers waarvan een aantal voor indirecte addressering worden gebruikt Veel meer dan klassieke processoren zoals 6809 • 224 I/O registers (aansturen van randapparatuur) • 64 laagste I/O registers zijn bitadresseerbaar • 4 kB interne data SRAM • Via externe (gemultiplexte) A/D bus uitbreidbaar (ook voor externe randapparatuur)
Organisatie van data memory door de Codevision C -compiler
Functieparameters Lokale variabelen Interrupt context-save data Globale variabelen Static variabelen Functie en interrupt return adressen (PC push) Heap, gebruikt door malloc()
Bitadressering in codevision • Bijvoorbeeld: PORTB.3 = 1; SBI 0x18,4 PORTB = PORTB | 0b00001000; LDS R30,0x18 ORI R30,8 STS 0x18,R30 • Echter alleen mogelijk op onderste 64 IO reg. PORTG.4=1; ongeldig!! (PORTG heeft IO reg adres 69)
AVR C datatypes
• char : 8 bit • int = short : 16 bit
• long: 32 bit • float = double : 32 bit
EEPROM • • • • • • • •
4 kB EEPROM FLASH: wordt gewist, herschreven in blokken (banken) EEPROM: wisbaar en schrijfbaar per byte Toepassing: calibratiegegevens, gebruikersinstellingen,… Toegang via speciale I/O registers. Niet rechtstreeks in A/D bus gemapt Kan ook via programmeerinterface gewist/beschreven worden Schrijven: zeer traag;10ms per beschreven byte Opgelet: gespecifieerd op 100 000 x schrijven/wissen
EEPROM data onder Codevision • Codevision C compiler kent een uitbreiding om data in EEPROM te stockeren: ‘eeprom’ keyword • Bv eeprom int ep_a=45; • Aanrader: EEPROM data manueel bufferen in RAM sneller
IO pinnen • Toegang via IO registers op de A/D bus • In totaal zijn er 45 IO pinnen op de microcontroller; onderverdeeld in PORT A,B,C,D,E,F,G • Elke PORT heeft max 8 lijnen (gecodeerd in een 8 bit register) • Elk van deze lijnen kan onafhankelijk als input of output geschakeld worden (via een Data Direction register). Verder is het mogelijk softwarematig een pull-up weerstand in te schakelen indien een lijn als input wordt gebruikt • Veel van deze lijnen worden ook voor alternatieve functies gebruikt zoals comparators, UARTs, kloklijnen,ADC’s,… In veel gevallen zal deze alternatieve functie de controle over de bijhorende pinnen overnemen.
Interrupts (1) • Signaal (extern of intern) • Onderbreekt de normale programmaflow, dwingt de processor naar een subroutine te springen • Deze subroutine: ISR (Interrupt Service Routine) • Na afloop van de subroutine: RETI instructie: processor hervat de programmaflow • Doel: – dringende hardware gebonden activiteiten afhandelen – Interrupt onder invloed van timer: tijdskritische activiteiten afhandelen
Interrupts (2) • 8 externe interrupt lijnen (op PORTD, PORTE) – Configureerbaar voor interrupt op stijgende / dalende flank / laag niveau
• Verder nog 26 interne interrupt lijnen – Deze lijnen worden door interne randapparatuur (UARTs, ADC, Timer,…) aangesproken
• Aan / uit schakelen van interrupts – Elke interrupt kan via een MASK bit aan/uit geschakeld worden – Een Global Interrupt Enable (GIE) bit schakelt alle interrupts gezamenlijk aan/uit
• Een interrupt die getriggerd is, wordt via een FLAG bit gemarkeerd. Indien MASK actief: ISR wordt uitgevoerd
Interrupts onder Codevision • Interrupt keyword: speciaal type functie: Bv interrupt[EXT_INT0] ExterneInterrupt(void) { … } • Deze functie wordt automatisch aangeroepen, onderbreekt de normale programma flow. • Interrupt definities (zoals EXT_INT0) zijn terug te vinden in mega128.h
USART • USART: Universal Synchronous/Asynchronous Receiver and Transmitter • We gebruiken USART meestal als UART • Deze UART kan mits een spanningsconverter rechtstreeks een RS-232 bus aansturen/uitlezen. • Twee externe lijnen nodig: Transmit, receive • Schrijf en leesoperaties kunnen onder interrupt gebeuren • Instelbaar (baudrate, lengte, startbits, stopbits, interrupts, …) via configuratie registers (UBRRx, UCSRxA, UCSRxB, UCSRxC) • Data schrijven / uitlezen via UDRx register
UART (1) • Asynchrone seriële communicatie (geen klok) • Point to point
UART (2) Protocol: • Rusttoestand: hoog • 1 startbit • 5 – 9 databits (meestal 8) • Optioneel: pariteitsbit • 1 of 2 stopbits (meestal 1) Transmissiesnelheid: • Bepaald door de BAUDRATE = 1/T • Standaardbaudrates (300, 1200, 2400, 4800, 9600, 19200, 38400, 57600,115200)
T
UART (3) ATMEGA128 UART: Logische 0: 0V Logische 1: 5V RS-232 standaard (COM poort PC) Logische 0: 10 tot 15 V Logische 1: -10 tot -15 V Convertor nodig tussen ATMEGA128 UART en COM poort
Timer / Counters (TC’s) • Op de A/D bus: 4 TC’s – TC0, TC2 : 8 bit – TC1,TC3 : 16 bit
• Een TC is opgebouwd rond een binaire teller • Wordt geklokt op een opgedeelde (prescaled) processorklok (bv /4 /8 /64 , … ) • De telstand kan softwarematig gezet/gelezen worden (TCNTx register) • Verschillende werkingsmodes • Configuratie via TCCRxA, TCCRxB, TCCRxC, TIMSK
Normal mode • De teller loopt in opwaartse richting tot de maximale waarde. Daarna springt deze terug naar 0 (overflow) • De maximale waarde (MAX) wordt bepaald door de breedte van de TC. • Bij overflow kan een interrupt gegenereerd worden
Timer output compare: • TCNT (tellerregister) telt in opwaartse richting • Als TCNT = OCR output compare actie! • Output compare actie: – Genereren van een interrupt – Set,reset of toggle van een OC pin (meerdere OC’s per TC)
• Meerdere OC eenheden per TC
Timer output compare: Voorbeeld: Klok: 10MHz, Timer 1 ingesteld op reset van pin PB5 (OC1A) bij output compare actie OCR1A=1000; PB5 TCNT1=0; 0µs 100µs PORTB.5=1; …
Clear Timer on Compare • Grotendeels identiek aan vorige mode • Echter: TCNT start terug op 0 na TCNT=OCR • Nut: blokgolf / interrupts genereren aan een instelbare frequentie • Voorbeeld: Klok: 10MHz, Timer 1 ingesteld in CTC mode, interrupt op TCNT=OCR OCR=1000 Interrupt om de 100 µs
Timer input capture: • TCNT (tellerregister) telt in opwaartse richting • Bij detectie van een instelbare gebeurtenis (set, reset of toggle) van de IC pin wordt de huidige TCNT tellerstand gekopieerd in ICR
Timer input capture: • Voorbeeld: – Inkomende blokgolf op PD4 (IC): – We wensen de periode / frequentie van deze blokgolf te meten
ICR1=TCNT1 IC interrupt
ICR1=TCNT1 IC interrupt
periode=ICR1-oICR1
periode=ICR1-oICR1
oICR1=ICR1
oICR1=ICR1
Pulse Width Modulation (PWM) VPWM IPWM
IMAX tH VMAX
T
• We aanzien R Lamp als constant (geen PTC gedrag)
Pgemiddeld Vmax Imax D tH D T
t
Phase Correct PWM mode (Pulse Width Modulation) • Autonoom genereren van een signaal met continu instelbare pulsbreedte • TCNT loopt van 0 TOP 0 • TOP is instelbaar • Frequentie uitgangssignaal wordt bepaald door bron kloksignaal (processor klok), prescaler en TOP waarde • Pulsbreedte wordt in OCR opgeslagen
Phase correct PWM TCNT OC MAX
TOP OCR
t
ADC • Successive approximation ADC • 10 bit resolutie • Max 15 ksps bij volle resolutie, verlaagde resolutie bij hogere fs – 13 klokcycli per conversie – ADC klok: max resolutie bij fADC < 200 kHz 200 kHz / 13 = 15 ksps – Indien fADC > 200 kHz: verminderde resolutie – fADC: afgeleid van processorklok via prescaler • 8 ingangen (gemultiplext) • Eénpolige of differentiële meting • Differentiële meting: optionele versterker: x10 of x200 • Interne of externe spanningsreferentie • Interrupt bij voltooiing conversie mogelijk • Single shot of freerun mode • Configuratie via ADCSRA en ADMUX register • Uitlezen ADC via ADC register
Eénpolige meting • Gerefereerd t.o.v. GND en Vref ADC
Vin .1024 Vref
• Voordelen: – Eén aansluiting nodig
• Nadelen: – Gevoelig aan storing. Elektrische layout is belangrijk
Differentiële meting • Gerefereerd t.o.v. GND en Vref
ADC
( Vpos Vneg ) A 512 Vref
• Voordelen: – Minder gevoelig aan storing – Offset spanningen / bias spanning op een signaal kan weggewerkt worden voor sampling
• Nadelen: – Twee aansluitingen nodig – Positieve resolutie wordt gehalveerd
Andere randfuncties • • • •
Watchdog Analoge comparator Two Wire Interface SPI interface
Opdrachten • Per groep van 2 studenten • Te kiezen tegen zitting 2 • Overzicht opdrachten: – – – – –
Bewegingsdetector Temperatuursensor 2D elektronische waterpas PWM motor snelheidsregelaar SONAR
AVRCON128 • Zie schema cursustekst