Review: Interrupts & Timers UBC104 Embedded Systems Review: Interrupts & Timers
Block Diagram UBC 104 Embedded Systems
Definition of ‘Interrupt’ Interrupts Definition of ‘Interrupt’ Event that disrupts the normal execution of a program and causes the execution of special instructions UBC 104 Embedded Systems
Interrupt Handling Code that deals with interrupts: Interrupt Handler or Interrupt Service Routines (ISRs) Possible code: void ISR(void) interrupt 1 { ++interruptcnt; } Interrupt number UBC 104 Embedded Systems
Interrupt Overheads Interrupt Latency Interrupt Termination Interrupt arrives Complete current instruction Save essential register information Vector to ISR Save additional register information Execute body of ISR Restore other register information Return from interrupt and restore essential registers Resume task Interrupt Latency Interrupt Termination UBC 104 Embedded Systems
SFR Map – Timer UBC 104 Embedded Systems
Timer Code Initialization Start of Timer Interrupt Service Routine void TimerInit(void) { T2CON = 0x04; // Load Timer 2 control register TH2 = 0xFC; // Load Timer 2 high byte RCAP2H = 0xFC; // Load Timer 2 reload capt. reg. high byte TL2 = 0x18; // Load Timer 2 low byte RCAP2L = 0x18; // Load Timer 2 reload capt. reg. low byte ET2 = 1; // Enable interrupt TR2 = 1; // Start Timer 2 running } void handleTimer2 (void) interrupt 5 { /* execute interrupt code */ Start of Timer Interrupt Service Routine UBC 104 Embedded Systems
Calculation of Register Settings Oscillator = 24 MHz Timer clock= (24 / 12) MHz = 2 MHz Timer cycle = = 500ns Delay count = delay time / cycle time 1 ms / 500 ns = 2000 Base number= 213-2000 = 8192-2000 = 6192 = 0x1830 2 MHz 1 UBC 104 Embedded Systems
Summary: Interrupts & Timers Event that disrupts the normal execution of a program and causes the execution of special instructions Interrupt Latency: Time from event to execution of service routine Interrupt Response Time: Interrupt latency + Time for service routine Interrupt Termination: Time taken after interrupt service routine Timer: Counter that causes interrupt at overflow UBC 104 Embedded Systems
UBC104 Embedded Systems RS232 Communication
Overview Basics of serial communications RS232 details 8051-support for serial communication UBC 104 Embedded Systems
SFR Map – UART Registers UBC 104 Embedded Systems
UART Registers UBC 104 Embedded Systems
Serial Interface Basics Also called Universal Asynchronus Receiver/ Transmitter (UART) or after the I standards: RS232 (-C) or EIA232 UBC 104 Embedded Systems
Serial Interface Basics also called Universal Asynchronus Receiver/ Transmitter (UART) or the relevant standards: RS232 (-C) or EIA232 2 Receive Data 3 Transmit Data 5 Signal Ground UBC 104 Embedded Systems
Typical 3-wire Interface 2 5 UBC 104 Embedded Systems
uController Pin-Out UBC 104 Embedded Systems
RS232 Signals Signals between +25V and -25V; some say ±15V usually +12V to -12V UBC 104 Embedded Systems
RS232 Signals Signals between +25V and -25V; some say ±15V usually +12V to -12V Logic ‘0’ Logic ‘1’ UBC 104 Embedded Systems
RS232 Signals Signals between +25V and -25V; some say ±15V usually +12V to -12V UBC 104 Embedded Systems
RS232 Signals Signals between +25V and -25V; some say ±15V usually +12V to -12V 8051 runs on 3V or 5V UBC 104 Embedded Systems
RS232 Signals Signals between +25V and -25V; some say ±15V usually +12V to -12V 8051 runs on 3V or 5V Driver chip translates between voltages UBC 104 Embedded Systems
Valid Signals UBC 104 Embedded Systems
Valid Signals Figure courtesy of http://www.camiresearch.com UBC 104 Embedded Systems
MCBx51 Board 3 2 TX0 RX0 UBC 104 Embedded Systems
Basic 3-Wire Connection of Machines TXD RXD GND UBC 104 Embedded Systems
Basic 3-Wire Connection of Machines TXD RXD GND What goes over these wires? UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) Start D0 D1 D2 D3 D4 D5 D6 D7 Stop UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: ‘a’= 0x61 = 0110 0001 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) ‘a’= 0x61 = 0110 0001 Start D0 D1 D2 D3 D4 D5 D6 D7 Stop UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: ‘a’= 0x61 = 0110 0001 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) ‘a’= 0x61 = 0110 0001 Start D0 D1 D2 D3 D4 D5 D6 D7 Stop 1 1 1 1 1 UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: ‘a’= 0x61 = 0110 0001 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) ‘a’= 0x61 = 0110 0001 Start D0 D1 D2 D3 D4 D5 D6 D7 Stop 1 1 1 1 0 1 UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: ‘a’= 0x61 = 0110 0001 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) ‘a’= 0x61 = 0110 0001 Start D0 D1 D2 D3 D4 D5 D6 D7 Stop 1 1 1 1 0 1 0 0 0 0 1 1 0 1 UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: ‘a’= 0x61 = 0110 0001 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) ‘a’= 0x61 = 0110 0001 Start D0 D1 D2 D3 D4 D5 D6 D7 Stop 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 UBC 104 Embedded Systems
RS-232 Frame Every RS-232 consists of: ‘a’= 0x61 = 0110 0001 1 start bit 8 data bits 1 stop bit (optional 1 parity bit) ‘a’= 0x61 = 0110 0001 Start D0 D1 D2 D3 D4 D5 D6 D7 Stop 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 UBC 104 Embedded Systems
Signal Timing ? 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 Start D0 D1 D2 D3 Stop 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 ? UBC 104 Embedded Systems
Signal Timing (continued) Start D0 D1 D2 D3 D4 D5 D6 D7 Stop 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 ? bit period UBC 104 Embedded Systems
Baud Rate Baud specifies the inverse of the bit-period e.g. 9600 Baud = a bit-period of 1/9600 second = 104.2 microseconds Typicall data rates: 75, 110, 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 33600, 56000, 115000 and (rarely) 330000 baud. UBC 104 Embedded Systems
Serial I/O with bare hands #define BIT_PERIOD 1042 sendByte(unsigned char content) { unsigned char mask; mask= 1; P3.1= 0; // Start bit wait (BIT_PERIOD); for (i= 0; i<8; i++) { // Send content P3.1= (content&mask) ? 1 : 0; mask<= 1; } P3.1= 0; // Stop bit P3.1= 1; UBC 104 Embedded Systems
Serial I/O with bare hands #define BIT_PERIOD 1042 sendByte(unsigned char content) { unsigned char mask; mask= 1; P3.1= 0; // Start bit wait (BIT_PERIOD); for (i= 0; i<8; i++) { // Send content P3.1= (content&mask) ? 1 : 0; mask<= 1; } P3.1= 0; // Stop bit P3.1= 1; UBC 104 Embedded Systems
Serial I/O with bare hands You do not need to do this!!! #define BIT_PERIOD 1042 sendByte(unsigned char content) { unsigned char mask; mask= 1; P3.1= 0; // Start bit wait (BIT_PERIOD); for (i= 0; i<8; i++) { // Send content P3.1= (content&mask) ? 1 : 0; mask<= 1; } P3.1= 0; // Stop bit P3.1= 1; UBC 104 Embedded Systems
UART modes Mode 0: 8 data bits (LSB first) are transmitted/received at a fixed baud rate of 1/12 of the oscillator frequency. (synchronus mode) UBC 104 Embedded Systems
UART modes Mode 0: 8 data bits (LSB first) are transmitted/received at a fixed baud rate of 1/12 of the oscillator frequency. (synchronus mode) Mode 1: 10 bits are transmitted (through TXD) or received (through RXD): a start bit (0), 8 data bits (LSB first), and a stop bit (1) at a variable baud rate. UBC 104 Embedded Systems
UART modes Mode 0: 8 data bits (LSB first) are transmitted/received at a fixed baud rate of 1/12 of the oscillator frequency. (synchronus mode) Mode 1: 10 bits are transmitted (through TXD) or received (through RXD): a start bit (0), 8 data bits (LSB first), and a stop bit (1) at a variable baud rate. Mode 2: 11 bits are transmitted (through TXD) or received (through RXD): a start bit (0), 8 data bits (LSB first), a programmable 9th data bit, and a stop bit (1). On transmit, the 9th data bit (TB8 in SCON) can be assigned the value of 0 or 1 (for example, the parity bit (P, in the PSW) could be moved into TB8). On receive, the 9th data bit goes into RB8 in Special Function register SCON. The baud rate is programmable to either 1/32 or 1/64 the oscillator frequency. Mode 3: Mode 3 is the same as Mode 2 in all respects except the baud rate is variable. UBC 104 Embedded Systems
UART modes Mode 0: 8 data bits (LSB first) are transmitted/received at a fixed baud rate of 1/12 of the oscillator frequency. (synchronus mode) Mode 1: 10 bits are transmitted (through TXD) or received (through RXD): a start bit (0), 8 data bits (LSB first), and a stop bit (1) at a variable baud rate. Mode 2: 11 bits are transmitted (through TXD) or received (through RXD): a start bit (0), 8 data bits (LSB first), a programmable 9th data bit, and a stop bit (1). On transmit, the 9th data bit (TB8 in SCON) can be assigned the value of 0 or 1 (for example, the parity bit (P, in the PSW) could be moved into TB8). On receive, the 9th data bit goes into RB8 in Special Function register SCON. The baud rate is programmable to either 1/32 or 1/64 the oscillator frequency. Mode 3: Mode 3 is the same as Mode 2 in all respects except the baud rate is variable. Mode 0 Baud Rate = 12 Oscillator Frequency Mode 2 Baud Rate = 2 SMOD1 x 64 Oscillator Frequency Mode 1/3 Baud Rate = 2 SMOD1 x 32 Timer Overflow Rate UBC 104 Embedded Systems
SMOD1 SMOD1: Double Baud rate SMOD0: Enables framing error detection UBC 104 Embedded Systems
Framing Error Detection UBC 104 Embedded Systems
Timer 1 http://www.keil.com/c51/baudrate.asp Timer Overflow Rate Mode 1/3 Baud Rate = 2 SMOD1 x 32 2 SMOD1 Oscillator Frequency Mode 1/3 Baud Rate = x 32 12 x [256 – TH1] 2 SMOD1 Oscillator Frequency [256 – TH1] = x 32 12 x Baud Rate 2 SMOD1 Oscillator Frequency TH1 = 256 – x 32 12 x Baud Rate http://www.keil.com/c51/baudrate.asp UBC 104 Embedded Systems
Timer 1 Commonly Used BAUD Rates UBC 104 Embedded Systems
SCON Documentation UBC 104 Embedded Systems
SCON & SBUF SCON controls the functionality of the UART device: SM0&SM1 = Determine the mode SM2 = Multiprocessor Flag REN = Receive Enable Flag TB8/RB8 = Transmit/Receive Parity Flag TI/RI = Transmit/Receive Interrupt Flag SBUF is the transmit&receive buffer UBC 104 Embedded Systems
SBUF SBUF is actually two separate registers: a transmit buffer and a receive buffer register: When data is moved to SBUF, it goes to the transmit buffer where it is held for serial transmission; moving a byte to SBUF initiates the transmission. When data is moved from SBUF, it comes from the receive buffer. UBC 104 Embedded Systems
SBUF and TI/RI TRANSMITTER HALF RECEIVER HALF UBC 104 Embedded Systems 8 data SBUF 8 TI Stop bit Start bit Send 8-bit data Transmitter Buffer is empty 10 bit parallel to serial conversion Serial data transmit TRANSMITTER HALF 8 data bits start bit stop Tx bit 8 data SBUF 8 RI Start bit Stop bit Receive 8-bit data data is available 10 bit serial to parallel conversion Serial data receive RECEIVER HALF 8 data bits stop start Rx UBC 104 Embedded Systems
SBUF and Parity Bit in TB8/RB8 UBC 104 Embedded Systems
Timer 1 Example Set T1 for Mode 2 Load TH1 with the initial value Set SCON for Mode 1 Start Timer1 Clear TI Load SBUF with the byte to be transferred Wait until TI becomes 1 Go back to Step5 for next byte TCON= 0x20; TH1= 0xF5; SCON|= 0x50; TR1= 1; TI= 0; do { SBUF= byte[i]; while (!TI); } while(more_bytes); UBC 104 Embedded Systems
Timer 1 Example (continued) Set T1 for Mode 2 Load TH1 with the initial value Set SCON for Mode 1 Start Timer1 Clear RI Wait for byte to be received Copy received byte out of SBUF Return received byte TCON= 0x20; TH1= 0xF5; SCON|= 0x50; TR1= 1; RI= 0; while (!RI); result= SBUF; return SBUF; UBC 104 Embedded Systems
Possible Configurations UBC 104 Embedded Systems
T2CON Documentation UBC 104 Embedded Systems
Timer 2 Commonly Used BAUD Rates UBC 104 Embedded Systems
Timer 2 Calculation Mode 1/3 Baud Rate = (RCAP2H,RCAP2L) = 65535 – Oscillator Frequency Mode 1/3 Baud Rate = 32 x [65536 – (RCAP2H, RCAP2L)] Oscillator Frequency (RCAP2H,RCAP2L) = 65535 – 32 x Baud Rate UBC 104 Embedded Systems
Timer2 Example Set T1 for Mode 2 Load RCAP high/low with the initial value Set SCON for Mode 1 Start Timer1 Clear TI Load SBUF with the byte to be transferred Wait until TI becomes 1 Go back to Step5 for next byte T2CON|= 0x30; RCAP2H = 0xFF; RCAP2L = 0xB2; SCON|= 0x50; TR2= 1; TI= 0; do { SBUF= byte[i]; while (!TI); } while(more_bytes); UBC 104 Embedded Systems
Internal Baud-Rate Generator UBC 104 Embedded Systems
BDRCON UBC 104 Embedded Systems
Using BRL to Transmit Set T1 for Mode 2 Load TH1 with the initial value Set SCON for Mode 1 Start Timer1 Clear TI Load SBUF with the byte to be transferred Wait until TI becomes 1 Go back to Step5 for next byte BDRCON= 0x0E; BRL= 0xF5; SCON|= 0x50; BDRCON|= 0x10; TI= 0; do { SBUF= byte[i]; while (!TI); } while(more_bytes); UBC 104 Embedded Systems