Füvesi Viktor Elektrotechnikai és Elektronikai Tanszék 2008. május. 8
Alapkapcsolások Kommunikáció uc k közti Programozási példák, egyszerű progik
Tápegység Nyomógomb Billentyűzet LED meghajtás Potencióméter Relé vezérlés Optikai leválasztás Motor vezérlés
230 V AC Tápegység Tr ~ - + 7805 + C 1 C 2 + C 3 +5 V DC ~
Nyomógomb S1 +5V 1k 470? 1k-470Ω S2 270Ω 270?
Billentyűzetek RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 Sor (Kimenet) Oszlop (Megszakításos bement) Soros Mátrix
Billentyűzetek Billentyűzet ellenálláscsoport A/D konverter Analóg Kiérteékelés
LED meghajtás I/O LED 0 ON 1 OFF I/O LED 0 OFF 1 ON
Analóg jel digitalizálása Feszültség osztás Potméterrel Mérési határ szűkítése Mérési határ bővítése V be A/D konverter Bináris szám
(1 - x) * 10k 10k x * 10k Feszültség osztó és potenciométer +5V +5V RB0 RB1 RB2 R2 R1 V be V dd (1 (1 x)10k x)10k x10k RB0 RB1 RB2
Mérési határ szűkítés 2k A 1 2k 1k 3 V mért 1k (0-1.7V) +5V - + 10k 100n (0-5V) RA0 RA1 RA2 Nem invertáló bementről vezérelt erősítő használata
Mérési határ bővítés +5V V mért (-15-15V) 50k 25k 16.7k (-5-5V) 100n RA0 RA1 RA2
Relé vezérlés (+5-12V) relé 1k npn
Optoleválasztás +5V +24V
DC motor vezérlés Sebesség változtatás Középfeszültség változtatás Négyszögjelek használata Impulzus szélesség változtatás Frekvencia változtatás Forgásirány változtatás Áramirány változtatás H híd kapcsolás
DC motor vezérlés V ki V max V közép Sebesség változtatás Középfeszültség változtatás Négyszögjelek használata Impulzus szélesség változtatás Frekvencia változtatás w T T V közép V max T w V max w f t
DC motor vezérlés Forgásirány változtatás Áramirány változtatás H híd kapcsolás VDD VDD S1 S2 S1 S2 S1 S2 S3 S4 Állapot 1 0 0 1 Forgás jobbra 0 1 1 0 Forgás balra 0 0 0 0 Lassú megállás M M 0 0 1 1 Hirtelen megállás S3 S4 S3 S4 VSS VSS
Vezérlés Leválasztás Meghajtás DC motor vezérlés VDD Teljesítmény modul Érzékelők S1 S2 Védelem M S3 S4 µc Fordulatszám érzékelők VSS
Az uc perifériák területén a legnagyobb fejlődésen a kommunikációs perifériák mentek keresztül. A modern eszközök nagy sebességigényének kiszolgálására megjelentek új perifériák. A legnépszerűbb interfészek: I2C SPI USART LIN CAN USB
I2C IIC = Inter Integrated Circuit IC-k közötti busz Philips fejlesztette ki 2 vezeték SDA: Serial Data SCL: Serial Clock EEPROM SDA SCL Sebesség: 100-400 kb/s Félduplex (felváltva adás-vétel) Atmega169 I 2 C-busz Fram A/D PIC
I2C
I2C Alaphelyzet: SDA és SCL H állapotban vannak Az eszközök tranzisztora L szintre tudja húzni a vezetéket Szerepek MST: Mester kezdeményezi az átvitelt és órajelet generál SLV: Slave a mester által megcímzett egység Funkciók TRX: Transmitter Egység amelyik adatot küld a sinre RCV: Receiver Egység amelyik adatot fogad a buszról
I2C Egyszerre 1 MST vezérelheti a buszt Multi-master kialakítás lehetséges Bájt átvitel
START ACK ACK ACK ACK STOP I2C szolga cím 4 bit: típuscím 3 bit: hardvercím 1 bit: i/o bit Mester küldi A szolga címe 0 X MSB Memória cím LSB Memória cím Adat bájt Szolga küldi FRAM adott címre történő írása
SPI Serial Peripherial Interface Motorola μp-nál vezették be 4 vezetékes kommunikáció Multimaster kialakítás lehetséges Mester adja az órajelet Duplex (adás és vétel történhet egyszerre) Mhz-es adatátviteli sebesség Shift regiszterek vannak két vonalon összekötve
SPI MISO: Master Input Slave Output MOSI: Master Output Slave Input SCK: Slave Clock SS: Slave Select MISO MESTER MOSI SZOLGA Órajel generátor SCK SS
SPI
USART Universal Synchronous Asynchronous Receiver Transmitter Soros adatátvitel Szinkron / aszinkron átviteli módszer Küldés és fogadás egyaránt lehetséges Teljes duplex kommunikáció PC-vel való kommunikációhoz használják főleg
USART Logika TTL RS-232 High (H) +2V +5V -15V -3V Low (L) 0V +0.8V +3V +15V
USART PIC 2 PC
USART Csatlakozó 1. CD Carrier Detect 2. RXD Receive Data 3. TXD Transmit Data 4. DTR Data terminal Ready 5. GND Ground 6. DSR Data Set Ready 7. RTS Request To Send 9 tűs D SUB micro csatlakozó (kani) 8. CTS Clear To Send 9. RI Ring Indicator
USART MAX232
USART Protokoll Adatbit szám 4,5,7,8 Paritásbit Páros,páratlan Stopbitek száma 1,1.5,2 Adatátviteli sebesség 110 9600 115200 921600
USART
USART
USART Regiszterek SPBRG Baud arány beállító regiszter Másodpercenként a jelváltások száma (baud = bps) TXSTA Adó státusz és vezérlő regiszter RCSTA Vevő státusz és vezérlő regiszter TXREG Küldött adat regiszter RXREG - Fogadott adat regiszter PIR1 periféria megszakítás flag regiszter PIE1 periféria megszakítás engedélyező regiszter
USART Baud beállítása SPBRG regiszter segítségével Baud = Fosc / (n * (SPBRG + 1) ) SPBRG = ( Fosc / (n * baud) ) 1 n = 16, BRGH = 1 n= 64, BRGH = 0
USART Példa 4Mhz kvarc Kívánt átviteli sebesség: 9600 baud SPBRG = ( 4000000 / (16 * 9600) ) 1 = 25.04 SPBRG = ( 4000000 / (64 * 9600) ) 1 = 5.51
LIN Local Interconnect Network Európai autóipar által kifejlesztett hálózat jellemzők Rövid távolság: max 40m Alacsony sebesség: 20 kbps Kétirányú kommunikációt valósít meg 1 vezetékes
LIN RS232 és I2C keveréke Alapállapotban H szinten van a sin, amit bármelyik eszköz L jelszintre húzhat Minden bájt START és STOP bitekkel kerül kiküldésre Tápfesz: 9-18V Egységeknek max. 40V-ot el kell tudni viselni Állapot: H : recessziv L: domináns Mester vezérli a kommunikációt Szolgák között csak a mesteren keresztül történhet adatcsere
LIN 30k 30k 30k
LIN Kommunikáció folyamata 13 bitidőnyi L szint (Sync break) 1 bájt adat = 01010101B (Sync Field) Bitidő megállapítására 4 egymást követő lefutóél összidejének = t Bitidő = t / 8 << 3 Azonosító bájt (Ident field) Szolga címe (4 bit) üzenet hossza (2,4,8 bájt) paritás
CAN Controller Area Network Robert Bosch cég definiálta 1980-as évek végén, hogy növelje a gépjárművek megbízhatóságát, komfortfokozatát és egyszerűsítse a kábelezést A szabvány nem tesz említést a kommunikáció közegéről Jelvezeték + föld Csavart érpár Galvanikusan leválasztott Rádiófrekvenciás infravörös
CAN A buszra csomópontok csatlakoznak (node) A node-ok azonos jogokkal rendelkeznek Könnyű leválasztás 2 vezeték (CANH és CANL) az információt a két vezeték közti feszültség hordozza
U CAN min. 1 sec 3,5V 2,5V 1,5V CANH CANL recesszív domináns recesszív 1 0 1 V CANH = V CANL = 2.5V idő V CANH = 3.5V V CANL = 1.5V
CAN Max adatátvitel 1Mbps, 40m vezetékhossz esetén Szinkron soros adatátvitel Nincs órajel Start/stop keretezés Bit-stuffing (bitbeszúrás 5. azonos polaritású bit után beszúr egy ellentétes polaritásút Üzenet-alapú kommunikáció Nincsenek címek Az üzenetet mindenki megkapja és a ID alapján a megfelelő eszköz dolgozza fel Bármikor új csomópont fűzhető fel vagy távolítható el
CAN Üzenettipusok (adatkeretek) Standard adatkeret Kibővített adatkeret Adatkérő-keret Túlterhelés-keret hibakeret
CAN Protokoll Standard adatkeret
CAN Protokoll Startbit A szinkronizációban játszik szerepet Keretet ad a kommunikációnak
CAN Protokoll Üzenet azonosító Távoli adatkérés bit Távoli üzenetkérést pótló bit ID kibővítés Kibővített ID
CAN Protokoll Hány adatbit lesz a kereten belül
CAN Protokoll
CAN Protokoll CRC lezáró bit
CAN Protokoll
CAN Protokoll Adó 0-ba állítja Ack lezáró bit
CAN Protokoll
Szintaktika Értékadás Ciklusok Példák Port kezelés Időzítő kezelés
Szintaktika Értékadás PORTB = 0b10110101 TRISB = 0xB5 T1CON = 32+16+1 Ciklusok for(i = 0; i < 10; i++) { } do { } while(k < 10) while(k < 10) { } T1CKPS1-0: 1. időzítő előosztójának beállítása (11=1:8;10=1:4;01=1:2;00=1:1) TMR1ON: időzítő be (1) v. ki(0) kapcsolása
Port kezelés és LED #include <pic.h> #define BUTTON RC1 //bit 1 of PORTC main(void){ unsigned char i, j; TRISB = 0; /* all pins are outputs */ TRISC = 1; /*first pin is input*/ j = 0; for(;;) { PORTB = 0x00; / * turn all on */ for(i = 100 ; i >= 0 ; --i ) continue; PORTB = ~j; /* output value of j */ for(i = 100 ; i >= 0; --i ) continue; if(button == 0) j++; /* if switch pressed, increment */ } }
Példák Időzítő kezelés #include <htc.h> #define PERIOD 1000000 // period in us - one second here #define XTAL 4000000 // crystal frequency - 4MHz #define IPERIOD (4 * 1000000 / XTAL) // Period of instruction clock in useconds #define SCALE 256 // Timer 0 prescaler #define T0_TICKS 256 // Number of counts for interrupt #define TICK_PERIOD (SCALE * IPERIOD) // Period (usec) of one increment of timer 0 #define RELOADS ((PERIOD/T0_TICKS)/TICK_PERIOD) unsigned long seconds; // second count char reload = 0; void interrupt timer0_isr(void){ if(reload == 0){ reload = RELOADS + 1; seconds++; PORTB++; } reload--; T0IF = 0;} main(){ // initialize timer 0; OPTION = 0b0111; // prescale by 256 T0CS = 0; // select internal clock T0IE = 1; // enable timer interrupt GIE = 1; // enable global interrupts TRISB = 0; // output changes on LED for(;;) continue; // let interrupt do its job }
Laborbemutató Egyszerű példaprogram LED időzítő Összetettebb példa Motorvezérlés PWM-mel
Köszönöm a figyelmet!