Mikrokontrollerit S-108.2010 Elektroniset mittaukset 18.2.2008 Mikrokontrolleri integrointi säästää tilaa piirilevyllä usein ratkaisu helpompi ja nopeampi toteuttaa ohjelmallisesti prosessori 4-64 bittinen Harvard-arkkitehtuuri muistia RAM, ROM, EPROM, EEPROM, flash I/O-rajapinta UART, I2 C, SPI, CAN... lisäominaisuuksia A/D, D/A, ajastimia, watchdog, USB, RFrajapinta
Valmistajia Analog Devices Atmel Freescale (entinen Motorola) Microchip STMicroelectronics Texas Instruments Atmel AVR 8-bittinen ATtiny, ATmega, Application specific AVR suorituskykyinen, edullinen, uusi ilmainen assembler ja koodikirjasto valmistajalta helposti ohjelmoitava
Freescale Laaja valikoima 6800-, 68000-sarjat, PowerPC-pohjaiset, useita ARM-pohjaisia yleinen, softaa saatavilla vanha arkkitehtuuri, heikko suorituskyky Parallax Propeller 8 kpl 32-bittistä ydintä yksinkertainen ALU (ei jakolaskua) 32 khz - 80 MHz 160 MIPS @ 80 MHz (i486 54 MIPS @ 66 MHz) SPIN tai Assembler
Parallax Propeller 8 ydintä (32 bit) Max 80 MHz 32 kb RAM, 32 kb ROM (32 bit) 32 I/O-linjaa Suora tuki videolle (NTSC, PAL, VGA, LCD), PS/2-liitäntä, RF-rajapinta yms. Hinta ~ 10! Microchip PIC harrastajien suosiossa helppo ohjelmointi softaa saatavilla helposti paljon erilaisia malleja pääasiassa 8-bittinen PIC10, PIC12, PIC16, (PIC17), PIC18 16-bittiset PIC24 ja dspic
PIC - MPLAB IDE kehitysympäristö assembler- ja C-ohjelmointi simulaattori, debuggeri ohjelmointi piirille myös jotkut omatekoiset ohjelmointilaitteet toimii MPLABilla PICit osaavat ohjelmoida itse itseään (bootloader) Ohjelmointilaite ICD2 kotitekoinen
Esimerkkipiirit PIC10F200 16 B RAM 4 I/O-linjaa $0,39 0,375 kb ohjelmamuistia PIC18F8722 3936 B RAM 1 kb data EEPROM 128 kb ohjelmamuistia 70 I/O-linjaa 16 x 10 bit ADC @ 100 ksps 2 x UART, 2 x I2 C, SPI $7,41 Case: Sählypallon nopeuden mittaus
<STX>, 0x00, lukema ASCII-merkkeinä, 0x00,<CR> oma 7-bit lähetysrutiini Alku Alustus Näytön nollaus Odotetaan pulssia A/D-muuntimet pois keskeytykset pois kaikki muukin pois prescaler asetus 24-bittinen luku muistiin Jos timerin ylivuoto, nopeus on 0. Muussa tapauksessa jaetaan alussa tallennettu 24 bit luku 16 bit timerin tuloksella. Pulssi havaittu Keskeytykset + timer päälle Lasketaan nopeus Nopeus näytölle RB0 keskeytys Timer0 ylivuoto Lähetetään, odotetaan pari sekuntia. Osoite äänipiirille + liipaisu.
ODOTA btfss PORTB,1 goto ODOTA ; Odotellaan signaalia B1:n, ; loopataan tässä kunnes sellainen tulee MITTAUS movlw b'10110000 ; Keskeytykset päälle movwf INTCON clrf TMR0L clrf TMR0H ; Nollataan timerin tulos bsf T0CON,TMR0ON ; Timer päälle LOOPPI goto LOOPPI ; Loopataan tässä keskeytykseen asti Epätarkkuus: Viive 1. pulssista timerin käynnistykseen pahimmillaan 8 kellojaksoa, eli (1/20 MHz) * 4 = 0,2 µs Timerin arvo kasvaa 32 kellojakson välein (prescaler), joten virhe merkityksetön Nopeuden laskenta 1. Keskeytys ylivuodosta vai portista? 2. Siirretään timerin tulos nimittäjään 3. Jaetaan 4. Siirretään timerin tulos osoittajaan ja jakojäännös nimittäjään 5. Jaetaan, jos tulos on alle 2, lisätään nopeuteen 1 (pyöristys käsin ) 6. Muunnetaan 16 bit binääriluku viideksi desimaaliksi 7. Tarkastetaan ettei tulos ole yli 999,9 (jos on, muutetaan tulos muotoon 999,9) 8. Muutetaan desimaalit ASCII-numeroiksi (lisätään 0x30) 9. Muutetaan mahdoliset ylimääräiset nollat tyhjämerkeiksi
LASKU btfss INTCON,TMR0IF ; Johtuiko keskeytys timerin ylivuodosta goto LASKU2 ; Jos ei, lasketaan nopeus bcf INTCON,TMR0IF ; Jos keskeytys tuli timerin ylivuodosta, clrf COUNT0 ; nollataan timerin interrupt flag, clrf COUNT1 ; laitetaan mittaustulokseksi nolla, clrf COUNT2 goto LASKU4 ; ja hypätään jakolaskun yli. LASKU2 movff TMR0L,BARGB1 ; Timerin tulos nimittäjäksi movff TMR0H,BARGB0 ; Jakolaskurutiinissa xargb0 on MSB ja xargb2 on LSB clrf TMR0L ; Nollataan timerin tulos clrf TMR0H LASKU3 call FXD2416U ; Jaetaan movff movff movff AARGB0,COUNT2 ; Siirretään tulos muualle desimaalimunnosta varten AARGB1,COUNT1 ; HUOM! COUNT2 on MSB ja COUNT0 on LSB AARGB2,COUNT0 clrf AARGB0 ; Siirretään timerin tulos osoittajaksi movff BARGB0,AARGB1 movff BARGB1,AARGB2 movff REMB1,BARGB1 ; Jakojäännös nimittäjäksi movff REMB0,BARGB0 call FXD2416U ; Jaetaan, movlw d'0' ; Ja katsellaan mitä tuli tulokseksi, cpfseq AARGB0 goto LASKU4 cpfseq AARGB1 goto LASKU4 movlw d'2' ; jos tulos on alle 2, eli jakojäännös on cpfslt AARGB2 ; yli puolet jakajasta, goto LASKU4 bcf STATUS,C ; nollataan varmuuden vuoksi carry bit incf COUNT0 ; ja lisätään alkuperäisen nopeuslaskun tulokseen ; 1, eli pyöristetään tulos oikein. btfsc STATUS,C incf COUNT1 ; Tarkastetaan carry bit pariin kertaan btfsc STATUS,C ; ja lisäillään muihin tavuihin yksi jos on tarvetta. incf COUNT2 LASKU4 call BINDEC ; Muutetaan tulos desimaaleiksi movlw d'0' ; Testataan ettei ole yli 999,9 km/h cpfsgt DIGIT5 goto NAYTOLLE movlw d'9' ; Jos on, muutetaan 4 vähiten merkitsevää movwf DIGIT1 ; numeroa yseiksi movwf DIGIT2 movwf DIGIT3 movwf DIGIT4