Gingl Zoltán, 2017, Szeged Mikrovezérlők Alkalmazástechnikája 18 jan. 1
Processzoroknál tipikusan párhuzamos átvitel adatbusz címbusz vezérlőjelek, szinkronizálás Mikrovezérlőknél soros átvitel Kevés vezeték illetve jel Modulációt igényel az információt alakítsuk akár egyetlen skalár jellé, bitfolyammá Demoduláció szükséges Információhordozó feszültség, áram, fény, elekromágneses hullám, hang Forma: amplitúdó, frekvencia, fáziskülönbség 18 jan. 2
18 jan. 3
Nem minden C8051Fxxx processzoron elérhető Fő cél: külső SRAM elérése (XRAM) Elérés: Assembler: movx utasítás C: xdata unsigned char x; Más külső perifáriák elérésére is jó (ADC, DAC,...) Hardver: Címvonalak 16 vezeték (kevesebb is elég lehet) Adatvonalak 8 vezeték Vezérlő jelek 3 vezeték: RD, WR, ALE 18 jan. 4
C8051Fxxx A[15..0] A[15..0] SRAM D[7..0] D[7..0] /RD /WR /CE /OE /WR 18 jan. 5
A[15..8] A[7..0] D[7..0] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 P2/P6 DPL, R0, R1 P2/P6 P3/P7 DATA P3/P7 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 18 jan. 6
A[15..8] A[7..0] D[7..0] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 P2/P6 DPL, R0, R1 P2/P6 P3/P7 DATA P3/P7 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 18 jan. 7
C8051Fxxx A[15..8] A[15..8] SRAM ALE AD[7..0] 74AHC573 C D Q A[7..0] /RD /WR D[7..0] /CE /OE /WR 18 jan. 8
A[15..8] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 AD[7..0] P2/P6 DPL, R0, R1 DATA P2/P6 ALE P0.5/P4.5 P0.5/P4.5 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 18 jan. 9
A[15..8] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 AD[7..0] P2/P6 DPL, R0, R1 DATA P2/P6 ALE P0.5/P4.5 P0.5/P4.5 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 18 jan. 10
DATA ADDR /WR /RD /CE /OE /CE DATA C8051F ADDRESS DECODER /CE /RD DATA ADC ADDRESS /RD /WR DATA /CE /OE DATA DAC SRAM FIFO RAM 18 jan. 11
Az írás/olvasás időzítése állítható A perifériák sebességéhez kell igazítani Push-pull kimeneteket célszerű választani Olvasáskor automatikusan bemeneti mód Csak az utasítás idejére használja a portot 18 jan. 12
18 jan. 13
Processzorok és eszközök közti kommunikációhoz Egy byte átvitele bitenként Egyetlen kétállapotú jel Nincs szinkronizáló jel Az átvitel bármikor történhet Az átvitel kezdetét detektálni kell a vevőnek A kommunikáló eszközök azonos időalappal küldik és fogadják a biteket (baud rate=bit/s) Gyakran használt Sokféle hardveres megoldás (RS232, RS485, stb.) 18 jan. 14
t t t t t t t t t t START BIT B0 B1 B2 B3 B4 B5 B6 B7 STOP BIT bit sampling Start bit (logikai 0), átvitel detektálására Stop bit (logikai 1), minimum szünet küldések között Byte átviteli idő: 10 t 9 bites átvitel is választható: az utolsó bit külön programozható (TB8, olvasáskor RB8) paritásbitként, multiprocesszoros adatátvitelhez 11 t byte átviteli idő 18 jan. 15
FULL DUPLEX SIMPLEX C Device C Device TX TX TX TX RX RX RX RX HALF DUPLEX SIMPLEX C Device C Device TX TX TX TX RX RX RX RX TX KIKAPCSOLHATÓ 18 jan. 16
Timer túlcsordulások vezérlik, kétféle megoldás: Baud rate = Timer overflow rate / 16 (pl. F120) Baud rate = Timer overflow rate / 2 (pl. F410) Egy (Timer1) vagy több (Timer1-4) timer Néhány processzoron akár más TX és RX ráta Maximális ráta SYSCLK/16 vagy SYSCLK/2 18 jan. 17
Baud rate = Timer overflow rate / 16 (pl. F120) Timer 1 : TH1=256-SYSCLK/(16*Baud rate) Timer 2-4 : TMRRL=65536-SYSCLK/(16*Baud rate) Baud rate = Timer overflow rate / 2 (pl. F410) Timer 1 : TH1=256-SYSCLK/(2*Baud rate) Érdemes figyelni a kerekítési hibára! A C-ben az egész osztás nem a legközelebbire kerekít! Mindig ellenőrizzük a beállított érték okozta hibát! 18 jan. 18
Az időalapok különbözők lehetnek Az egységek órajele nem egzakt A beállítás frekvencia egésszel osztásával nem pontosan a kívánt érték A kettő eltérése mennyi lehet? maximum 3%, szigorúbban 2% teljesül? http://pdfserv.maximintegrated.com/en/an/an2141.pdf 18 jan. 19
t START BIT B0 B1 B2 B3 B4 B5 B6 B7 STOP BIT 1,03 t Az adó és vevő hibája együttesen hat hogyan? A detektálás ideálisan a bitek közepén lenne A start bit detektálása sem pontos A megbízhatóság függ a jelváltások időtartamától Függ a 2-szeres vagy 16-szoros leosztási értéktől 18 jan. 20
t t BIT BIT t/8 0,75 t 0,25 t 0,75 t BIT BIT t/4 0,5 t 0,5 t 0,5 t BIT BIT 18 jan. 21
Tegyük fel elég rövid jelváltási idők, 3% tolerancia megengedett 9600 bit/s kívánt érték F410 beállítás SYSCLK = 191406Hz 2% Timer1 8-bit auto reload mode: TH1 = 246 Baud rate = 191406Hz 2% /10/2=9570Hz 2% void Timer1_Init() { TMOD = 0x20; // 8-bit auto reload CKCON = 0x08; // timer clock = system clock TH1 = 0xF6; // reload value = 246 TL1 = 0xFF; // one step from overflow TCON = 0x40; // run timer } 18 jan. 22
Baud rate = 191406Hz/10/2 = 9570Hz 9570Hz 2% Megfelel? 9600 3% 9312-9888 9570 2% 9378-9761 A másik eszköz hibáját nem vettük figyelembe! 18 jan. 23
A szinkron módokkal nem tárgyaljuk 8 vagy 9 bites aszinkron mód Az adat fogadása engedélyezhető, tiltható A stop bit detektálása engedélyezhető csak akkor van vett adat, ha a stop bit értéke 1 9-bites módban a 9. bitet vizsgálja! Ez alkalmas címzésre, multiprocesszoros kommunikációra Ha a 9. bit 1, akkor cím érdekezik a vevőkhöz A címzett vevő kikapcsolja a bit monitorozását a vétel idejére 18 jan. 24
void UART_Init() { SCON0 = 0x10; // 8-bit, variable baud mode TI=1; // assume empty output buffer } unsigned char UARTIn(void) { while (!RI); // wait for a byte RI=0; // clear flag (prepare for next reception) return SBUF; // return the byte } void UARTOut(char a) { while (!TI); // wait for end of previous transmission TI=0; // clear flag SBUF=a; // transmit a byte, don t wait for end } 18 jan. 25
#define BUFFERSIZE 8 // ring buffers volatile unsigned char TxBuffer[BUFFERSIZE]; volatile unsigned char RxBuffer[BUFFERSIZE]; // TX buffer read and RX buffer write pointers // used in the interrupt routine volatile unsigned char TxReadPtr=0, RxWritePtr=0; // TX buffer write and RX buffer read pointers unsigned char TxWritePtr=0, RxReadPtr=0; // Number of data in the buffers volatile unsigned char TxNumberOfData=0; volatile unsigned char RxNumberOfData=0; 18 jan. 26
void UARTInterrupt(void) interrupt UART_VECTOR { if (RI) { RI=0; if (RxNumberOfData < BUFFERSIZE) { RxBuffer[RxWritePtr]=SBUF; RxWritePtr = (RxWritePtr+1) % BUFFERSIZE; RxNumberOfData++; } } 18 jan. 27
} if (TI) { TI=0; if (TxNumberOfData) { SBUF=TxBuffer[TxReadPtr]; TxReadPtr = (TxReadPtr+1) % BUFFERSIZE; TxNumberOfData--; } } 18 jan. 28
unsigned char UARTIn(unsigned char *c) { if (RxNumberOfData) { RxNumberOfData--; *c=rxbuffer[rxreadptr]; RxReadPtr = (RxReadPtr+1) % BUFFERSIZE; return 0; } return 1; } 18 jan. 29
unsigned char UARTOut(unsigned char c) { if (TxNumberOfData < BUFFERSIZE) { TxNumberOfData++; TxBuffer[TxWritePtr]=c; TxWritePtr = (TxWritePtr+1) % BUFFERSIZE; return 0; } return 1; } 18 jan. 30
Meghajtó áramkörök nélkül Meghajtóáramkörökkel nagyobb távolságok PLC-k Műszerek oszcilloszkóp DVM Speciális eszközök 18 jan. 31
V I/O VOLTAGE CONVERTER V+ V- TX RX R OUT T IN R IN T OUT RS232 SIGNALS C RS232 TRANSCEIVER MAX202, MAX3232 18 jan. 32
18 jan. 33
18 jan. 34
V I/O DIFFERENTIAL RS422 SIGNALS TX R OUT R IN+ R IN- C RX T IN T OUT+ T OUT- RS422 TRANSCEIVER 2 x MAX485 18 jan. 35
V I/O RTS TX TXEN R OUT D+ D- DIFFERENTIAL RS485 SIGNALS RX T IN C RS485 TRANSCEIVER MAX485, MAX3485 18 jan. 36
18 jan. 37
18 jan. 38
V I/O TX OPTICAL FIBER RX C 18 jan. 39
USB CONNECTOR USB CONNECTOR LDO REG LDO REG 5V RTS RTS CTS TX CTS TX USB-UART TRANSCEIVER D+ D- RX RX C FT232R GND USB CABLE 18 jan. 40
18 jan. 41
Bluetooth modulok UART interfésszel SPP (Serial Port Profile) standard protokoll pl. BTM112 18 jan. 42
Timer beállítás, engedélyezés A timer másra nem használható Ne keverjük: polling és interrupt mód TX legyen push-pull rövid jelváltási idők Baud rate hibájának figyelembe vétele 18 jan. 43
stdio átirányítás? printf? void putchar(char c) { UARTOut(c); // UART, SPI, SMBus, stb. } char getchar(void) { return UARTIn(c); // UART, SPI, SMBus, stb. } printf("x=%d",x); // write 18 jan. 44
18 jan. 45
Processzorok, integrált áramkörök között Szinkron soros adatátvitel Órajel váltásaikor érvényes a bit Master és slave eszközök Az órajelet adó a master Az órajel garantálja az azonos időzítést a két oldalon Full duplex kimenet: MOSI (master out/slave in) bemenet: MISO (master in/slave out) órajel: SCK (serial clock) Engedélyező vonal (NSS, negated slave select) 18 jan. 46
SCK CPOL=1 CPOL=0 MOSI MISO B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 CPHA=0 MOSI MISO B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 CPHA=1 2018. 01. 10. 18:12 Kommunikációs áramkörök és használatuk 47
Az adó és vevő oldal azonos módban legyen (POL, PHA) Az egyik SCK él a kimenő bitet beállítja, a másik a bejövő bitet olvassa Slave: Mikor kezdődik az adat átvitele? Csak az órajel indulása nem feltétlen elég Kieshet a szinkronból az átvitel Megoldás: Slave select (NSS) jel 18 jan. 48
SCK POL=1 POL=0 NSS MOSI MISO B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 PHA=0 2018. 01. 10. 18:12 Kommunikációs áramkörök és használatuk 49
GPIO NSS MISO MISO MISO MISO MOSI MOSI MOSI MOSI SCK SCK SCK SCK NSS GPIO Master Master Master Slave 18 jan. 50
MISO MOSI SCK NSS GPIO Master MISO MOSI SCK NSS Slave MISO MOSI SCK NSS Slave Több slave Egyszerre egy aktív Slave NSS választ NSS adatkezdet is 18 jan. 51
void SPIOut(unsigned char c) { SELECT = 0; SPIF = 0; SPI0DAT = c; while (!SPIF); SELECT = 1; } unsigned char SPIIn(void) { SELECT = 0; SPIF = 0; SPI0DAT = 0; // dummy write starts SPI clock while (!SPIF); SELECT = 1; return SPI0DAT; } 18 jan. 52
18 jan. 53
System Management Bus IIC vagy I²C: Inter-Integrated Circuit Áramkörök közötti egyszerű, kétvezetékes busz SCL: Órajel (100kHz vagy 400kHz) SDA: Adat Két irány (half duplex) Master, slave, multimaster Párhuzamosan kapcsolhatók eszközök 7-bites címzés Tipikusan: szenzorok, A/D, RTC, EEPROM, stb. 18 jan. 54
CROSSBAR CLOCK CONTROL FILTER SCL SHIFT REGISTER 7 6 5 4 3 2 1 0 FILTER SDA SDA CONTROL ACK 18 jan. 55
R R Vdd=5V Vdd=5V Vdd=3V Vdd=5V Vdd=3V Master 1 Master 2 Slave 1 Slave 2 SCL SDA 18 jan. 56
START ACK NACK STOP SDA SCL A6 A0 R/W D7 D0 7-bit address and direction bit 8-bit data Bármelyik vezetéket az adó és vevő is 0-ba tudja húzni SCK: csak a masterek húzhatják 0-ba Több byte is küldhető egy tranzakcióban ACK minden byte vételekor szükséges a vevőtől NACK: nem nyugtáz a vevő, vagy utolsó byte (master) STOP: a tranzakció befejezése 18 jan. 57
MASTER IRQ IRQ IRQ IRQ S ADDR W A DATA A DATA A P S ADDR W A DATA A DATA A P SLAVE IRQ IRQ IRQ 18 jan. 58
MASTER IRQ IRQ IRQ IRQ S ADDR R A DATA A DATA N P S ADDR R A DATA A DATA N P SLAVE IRQ IRQ IRQ 18 jan. 59
Master SFR-bitek STA, STO írása a jelek generáláshoz ACK írása és olvasása is SI flag (megszakítás is) 1-re vált, ha egy fázis kész A busz áll, amíg SI=1, folytatódik, ha töröljük Ezért mindig SI=0 előtt kell írni az SFR regisztereket Slave SFR-bitek STA, STO olvasása ACK írása és olvasása is 18 jan. 60
void SMBusOut(unsigned char address, unsigned char c) { STO = 0; STA = 1; // start transfer SI = 0; // continue while (!SI); // wait for start complete STA = 0; // manually clear STA SMB0DAT = address << 1; // A6..A0 + write SI = 0; // continue while (!SI); // wait for complete if (!ACK) // not acknowledged, stop { STO = 1; // stop condition bit } SI = 0; return; } SMB0DAT = c; SI = 0; while (!SI); STO = 1; SI = 0; // generate stop condition // put data into shift register // continue // wait for complete // stop condition bit // generate stop condition 18 jan. 61
unsigned char SMBusIn(unsigned char address) { STO = 0; STA = 1; // start transfer while (!SI); // wait for start complete STA = 0; // manually clear STA SMB0DAT = (address << 1) 1; // A6..A0 + read SI = 0; // continue while (!SI); // wait for complete if (!ACK) // not acknowledged, stop { STO = 1; // stop condition bit } SI = 0; return; } ACK = 0; SI = 0; while (!SI); STO = 1; SI = 0; return SMB0DAT; // generate stop condition // NACK, last byte // continue // wait for complete // stop condition bit // generate stop condition 18 jan. 62
18 jan. 63
CAN: Controller Area Network LIN: Local Interconnect Network USB: Universal Serial Bus Vezeték nélküli kommunikációs áramkörök 18 jan. 64