Mikael Svenstrup Datamaters arkitektur og programmering 1/24 Datamaters arkitektur og programmering MM11: Seriel kommunikation 2 (SW)
Indhold Mikael Svenstrup Datamaters arkitektur og programmering 2/24 Tidligere har i hørt om: Hardware til seriel kommunikation Simpel software til seriel kommunikation Idag skal vi snakke om: Watchdog Timer: Hunden der holder øje med om computeren laver fejl. Interrupt basert seriel kommunikation. Fejldetektion på seriel kommunikation. Seriel kommunikation med buffere.
Seriel kom. resume Mikael Svenstrup Datamaters arkitektur og programmering 3/24 Seriel Kommunikation Resume
Seriel kom. resume Mikael Svenstrup Datamaters arkitektur og programmering 4/24 Seriel kommunikation har en TX og en RX linje. RS232: +-12V 1200, 4800, 9600, 19200, 38400, 57600, 115200 DB9 stik: Signal Type Abbr. Dir. DE-9 Common Ground G 5 Transmitted Data TxD Out 3 Received Data RxD In 2 Data Terminal Ready DTR Out 4 Data Set Ready DSR In 6 Vi bruger kun: 5 (GND) og RX, TX (2, 3) Request To Send RTS Out 7 Clear To Send CTS In 8 Carrier Detect DCD In 1 Ring Indicator RI In 9
Seriel kom. resume Mikael Svenstrup Datamaters arkitektur og programmering 5/24 Opsætning: Baudrate (fx 19200) Databits (8 bits) Parity? Stop bits (1 eller 2)
Seriel kom. resume Mikael Svenstrup Datamaters arkitektur og programmering 6/24 Opsætning på MSP430 (UART0): Set baudrate i U0BR0 og U0BR1 (og evt. modulation i U0MCTL) Set stopbits, datalængde osv. i U0CTL Enable UARTEN i ME1 Opsæt ben P3.4 og P3.5 til henholdsvis output og input Opsæt ben P3.4 og P3.5 til UART funktion Sende fra MSP430: Check at flaget UTXIFG (i IFG1) er sat hvilket indikerer at TX bufferen er tom og klar til ny data. Placer byte der skal sendes i U0TXBUF Modtage på MSP430: Check at flaget URXIFG (i IFG1) er sat hvilket indikerer at der er ny data i RX bufferen. Læs byten fra U0RXBUF
Watchdog Timer Mikael Svenstrup Datamaters arkitektur og programmering 7/24 Watchdog Timer Hvad sker der hvis/når man har lavet en fatal kode fejl og systemet fryser?
Watch Dog Timer Mikael Svenstrup Datamaters arkitektur og programmering 8/24 En watchdog timer (WDT) er en hardware timer enhed der udløser et system reset, hvis hoved-programmet ikke servicerer watchdog en (kaldet kicking the watchdog ) med jævne mellemrum. Dette sker hvis programmet hænger fast et sted og wathdog en sørger så for at systemet kommer tilbage til normal operation. Er smart til embedded systemer hvor der ikke er nogen bruger til at trykke på reset når der kommer blue screen of death.
Watch Dog Timer Mikael Svenstrup Datamaters arkitektur og programmering 9/24 WDT på MSP430: Kan også benyttes som alm. timer, men her fokuserer vi på WDT funktionaliteten. WDT control registreret er password beskyttet. Er default ON efter en opstart! 16-bit op-tæller, resetter på overflow. 3 registre: WDTCTL, til opsætning af selve timeren IE1, interrupt enable for timer-mode (ikke WDT) IFG1, WDT overflow interrupt, kan bruges til at håndtere system crach
Watch Dog Timer Mikael Svenstrup Datamaters arkitektur og programmering 10/24 Kick the dog: MOV #WDTPW+WDTCNTCL,&WDTCTL //asm WDTCTL = WDTPW + WDTCNTCL; // C Stop the dog MOV #WDTPW+WDTHOLD,&WDTCTL //asm WDTCTL = WDTPW + WDTHOLD; // C Timeout for default WDT: 16 bit register = 65536 default tællefrekvens (DCOCLK) = 750 khz Timeout = 750000^-1 * 65536 ~= 87 ms
Kommunikationsfejl Mikael Svenstrup Datamaters arkitektur og programmering 11/24 Fejl på seriel kommunikation Hvordan ved vi at vi mister data på kommunikationen og hvordan får vi de data igen?
Kommunikationsfejl Mikael Svenstrup Datamaters arkitektur og programmering 12/24 Framing error: Lav stop bit
Kommunikationsfejl Mikael Svenstrup Datamaters arkitektur og programmering 13/24 Break Condition: Timeout på tiden mellem start og stop bit.
Kommunikationsfejl Mikael Svenstrup Datamaters arkitektur og programmering 14/24 Parity Error: Kræver selvfølgelig at der benyttes kommunikation med paritet slået til. Paritet tæller antallet af 1-taller i den sendte byte og sættes derefter. Man kan vælge even og odd paritet. Even = parity bit er 0 hvis lige antal 1- taller og 1 hvis ulige antal. Odd paritet er lige omvendt.
Kommunikationsfejl Mikael Svenstrup Datamaters arkitektur og programmering 15/24 Buffer overrun: Fortæller om du er gået glip af modtaget data fordi du har haft for travlt til at checke din postkasse. (1) Der modtages en byte og den puttes i RX bufferen (2) RX bufferen læses. (3) Der modtages en byte og den puttes i RX bufferen (4) Der modtages en byte og den puttes i RX bufferen (5) Buffer overrun flaget sættes.
Kommunikationsfejl Mikael Svenstrup Datamaters arkitektur og programmering 16/24 Receiver overrun error: Når der ankommer en ny byte i RX bufferen uden at den gamle byte er blevet læst. Framing error: Når der detekteres en lav stop bit. Break Condition: Når signalet falder ud således at der går for lang tid mellem start og stop bit. Parity error: Når pariteten af det af data ikke modsvarer paritets bit. Ved de tre sidste bliver den fejl behæftede byte smidt væk. Ved den første har man allerede mistet byten.
Seriel kommunikation 2 Mikael Svenstrup Datamaters arkitektur og programmering 17/24 Seriel kommunikation med interrupts og buffer Når vores programmer bliver større og mere avancerede har vi brug for noget mere end polling.
Interruptbaseret RS232 Mikael Svenstrup Datamaters arkitektur og programmering 18/24 Sidst prøvede vi seriel kommunikation til og fra MSP430 med software med polling. Som vi snakkede om i mm7, er der ulemper forbundet med polling og derfor prøver vi denne gang at lave interrupt baseret kommunikation
Interruptbaseret RS232 Mikael Svenstrup Datamaters arkitektur og programmering 19/24 Uafhængige interrupts for TX og RX. Enable interrupts: UTXIE0 = 1 URXIE0 = 1 GIE = 1
Interruptbaseret RS232 Mikael Svenstrup Datamaters arkitektur og programmering 20/24 Interrupts når: Byte i TX bufferen er blevet sendt og er klar til en ny byte. UTXIFG0 bliver sat og slettes når der skrives en ny byte til TX bufferen. Der er en ny byte klar i RX bufferen. URXIFG0 bliver sat og slettes når der læses fra bufferen.
Ring buffer Mikael Svenstrup Datamaters arkitektur og programmering 21/24 Bufferet I/O: Benyttes fx når sender leverer data i bursts og modtager kører periodisk. I/O uden buffer: Ved fx. real tids regulerings systemer skal controlleren have data når de kommer. Circular buffer User process Seriel line
Ring buffer Mikael Svenstrup Datamaters arkitektur og programmering 22/24 Circular buffer: Meget simpel data buffer struktur. Nyttig i forbindelse med interrupt baseret seriel driver. Seriel driveren henter data fra RX bufferen når den er klar og putter den i ring bufferen. Hoved programmet kan så hente fra ring bufferen når den er klar. Vice versa for at sende. Man bør tænke over: -Buffer full -Buffer empty afhængig af hvad man bruger bufferen til.
Ring buffer (SW eks) Mikael Svenstrup Datamaters arkitektur og programmering 23/24 // Dummy code for circular buffer without buffer empty or full checking int circ_buffer[buf_length]; /* circular buffer for data */ int circ_buffer_in = 0; /* in-pointer of the buffer */ int circ_buffer_out = 0; /* out-pointer of the buffer */ int circ_buffer_count = 0; void feed_buffer(int n) { circ_buffer[circ_buffer_in] = n; if (circ_buffer_in < (BUF_LENGTH-1)) circ_buffer_in++; else circ_buffer_in = 0; circ_buffer_count ++; } int get_data() { int m; m = circ_buffer[circ_buffer_out]; if (circ_buffer_out < (BUF_LENGTH-1)) circ_buffer_out++; else circ_buffer_out = 0; circ_buffer_count--; return m; }
Opgaver Mikael Svenstrup Datamaters arkitektur og programmering 24/24 Watch Dog Timer Ringbuffer til seriel kommunikation