UART Registers. De AVR - UART



Vergelijkbare documenten
Seriële bluetooth verbinding ATmega128

De Arduino-microcontroller in de motorvoertuigentechniek (4)

ES1 Project 1: Microcontrollers

Hoofdstuk 7. Computerarchitectuur

AVR-DOPER MINI ASSEMBLAGE HANDLEIDING + LAYOUT. Geschreven door: Tom Vocke

DDS chips. DDS = Direct Digital (frequency) Synthesis. Output = sinusvormig signaal. Maximum frequentie = ½ klokfrequentie

Microcontrollers. Week 5 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/

Toets In2305-ii Embedded Programming Dinsdag 28 November 2006, 15:45-16:30

Microcontrollers Week 5 Interrupts, Timer/Counter 0 Jesse op den Brouw INLMIC/

IDAgeChecker BDX118T11xx Manual V02.00

Koppelen Centix Datacollecter aan RS-232 device d.m.v. de W&T 58631

Inhoud vandaag. Interrupts. Algemeen ARM7 AIC

Gebruiksaanwijzing AVR910 USB Programmer

De Arduino-microcontroller in de motorvoertuigentechniek (8)

Arduino CURSUS. door Willy - 09-juni-2017

Tinyserir-RC5. Datasheet. Tinyserir-RC5 Page: 1 of 8

Programma HCC!Forth komende zaterdag

USB-stick aan de controller

FORTH op de 80C535 processor met het ATS535 board.

De seriële poort Jan Genoe KHLIM

MiniPlex-41 NMEA-0184 multiplexer Handleiding

Wireless PC Interface installatie handleiding

IDGetter BDX118 T1121 Manual V

MULTIMEDIABOX.nl Custom made solutions hardware & software. Advanced Menu

Pulse generator. Output compare. Timer/Counter0. T/C0 count-ingang. T/C0 Output Compare. Microcontroller Programmeren in C. MICPRG 15 januari 2014

Wat is een busverbinding?

API...1 Identificatie...1 Opties...2 Acties...3 Webserver...6 Heartbeat...6 Buffer groottes...8

Snelle start instructie TXD(u) en RXD(u) voor CJ1/CS1-PLC Boards en Units

Getalformaten, timers en tellers

ES1 Project 1: Microcontrollers

APPINVENTOR is een 100% gratis online tool waarmee je zelf apps kan maken voor Android devices (niet voor Apple).

Bedieningspaneel. Drukknoppen en Ds

Handleiding AP-UPR4 Lange afstandslezer

Digitale interface protocols Jan Genoe KHLim

ATmega op het web (1)

Microcontrollers Week 4 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (4)

Deel 8: stappenmotoren en interrupts

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (8)

Gebruikershandleiding Version 1.2

GEÏNTEGREERDE PROEF. VTI Sint-Laurentius. Pakketweegschaal. Industriële informatie & communicatietechnologie SCHOOLJAAR

18 Embedded systemen 1

Sequentiële Logica. Processoren 24 november 2014

Handleiding voor installatie en gebruik van

Hoofdstuk 19. Embedded systemen

MyDHL+ ProView activeren in MyDHL+

A Quick Start Guide: AVR programmeren

Programma HCC!Forth komende zaterdag

Advies, Productie, Reproductie, Faciliteiten, Presentatie, Verhuur, Verkoop

Gebruikershandleiding Scan-It NEN 3140 Version: 1.1

Seriële kommunikatie via de universele l/o-bus

Inhoud. 1 De Microcontroller 1. 2 De taal C Declaraties Functies In- en uitvoer Voorwaardelijke opdrachten 41

Een Simpele RF Ontvanger

Koppelen Centix Datacollecter aan RS-485 device d.m.v. de W&T 58631

Deel 2 S7 Graph Ont4 - GA3

Het koppelen van een FC51, via Modbus RTU, aan een AC500-eco.

De Arduino-microcontroller in de motorvoertuigentechniek (3)

Weerstation. Wireless connectie PC en Arduino C.G.N. van Veen. HiSPARC. 1 Weerstation. 2 APC module installeren. 2.1 Zenden en ontvangen

een reëel systeem met BASIC537

Technisch ontwerp positiebepaling Smart Blocks

MODBUS remote I/O-unit type MODBUS4S110

16F877A development board cursus deel 1

IDGetter BDX118 T110x Manual V

Hoofdstuk 1 Aansluitschema... blz 2. Hoofdstuk 2 Het inbedrijfstellen... blz 3

PTP-PROTOCOL VOOR SERIËLE DATACOMMUNICATIE

RCL Arduino Workshop 1

Thijs Assies. DMX-512 met een PICmicro

Besturingspaneel v Raam E-systeem functie omschrijving v109

Hoofdstuk 10. Datacommunicatie

EmSE presentatie. Starten met de ATtiny2313: Een RGB powerled driver Kees Moerman, 13 juli 2010

L.Net s88sd16-n aansluitingen en programmering.

Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files

Hoofdstuk 18. Embedded systemen

DIGITALE MODE MET POWER SDR

De CPU in detail Hoe worden instruc4es uitgevoerd? Processoren 28 februari 2012

Modbuskoppeling Verdyn - Priva (engineering in Priva)

S88XPressNetLI v1.0. Installatie- en gebruikershandleiding en naslagwerk KDesign Electronics, PCB ontwerp door RoSoft

Het koppelen van de Wago aan de AC500-eco via Modbus RTU. A quick start guide. Jaap Ruiten

Voorblad tentamen ENG

adres dekoder adres dekoder 6502 CPU-kaart features

GPS repeater. Inleiding

L.Net s88sd16-n aansluitingen en programmering.

Bluetooth Software Update Manual for Windows 7 IVE-W530BT

TC_DCM Inleiding Input

Beknopte informatie voor GBS leverancier t.b.v. NIBE warmtepomp 1145/1245/1155/1255/1345

Oefeningen Interpretatie I Reeks 6 : Registermachines

Installatiehandleiding

Projectwerk microcontrollers:

FA23 Aansluitschema Onderdeel nr:

ID-er/sequencer. Beschrijving. Pag 1/6

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (6)

Dynamic Publisher Twee handige hulpjes voor DP

VTI Sint-Laurentius De school voor Wetenschap, Techniek en Technologie Pr. Thuysbaertlaan Lokeren info@vti-lokeren.

Camera Link. Samenvatting van de Camera Link standard Voor het aansluiten van Digitale cameras op Frame Grabbers. Opmerkingen

Sensor Test Unit TSK40A

Fig. 5.1: Blokschema van de 555

PIC Callgever Door PA1RUM

TECHNISCHE UNIVERSITEIT EINDHOVEN FACULTEIT DER TECHNISCHE NATUURKUNDE

De CB channel controller TMS1022NL/NLL en TMS1023NL/NLL. ( Dit is een maskrom-programmed version van de Texas Instruments TMS1000 family)

DATACOMMUNICATIE. Serieel of parallel. Begrippen. Snelheid van een verbinding

Transcriptie:

De AVR - UART DE AVR UART is een zeer krachtige en nuttige periferie en gebruikt in vele projecten. Het kan gebruikt worden voor het debuggen van code, als gebruikersinterface, of voor het verzenden en ontvangen van gegevens en dan loggen op een PC. Hieronder het blokschema van de UART (gebaseerd op AT90S2313 UART) : De AVR UART kan worden opgezet voor het verzenden van 8 of 9 bits, geen pariteit, één stopbit. De UART filtert de ontvangen gegevens en detecteert ook overrun errors en framing errors. Het heeft drie interrupts en het laat hoogst efficiënte gegevensstroom toe via softwarebuffers. In het blokschema ziet u dat de zender en de ontvanger UDR delen (uart-data gegevens). Eigenlijk delen zij slechts het adres UDR: Het echte register is verdeeld in een zenderregister en een ontvangstregister zodat de ontvangen gegevens geen gegevens kunnen overschrijven in het transmit-register. Bijgevolg kunt u geen gegevens terug lezen die u in het zenderregister geschreven hebt. De beide delen van UART, de zender en de ontvanger, gebruiken de baudrate Generator en de controle-registers. UART Registers UDR Natuurlijk, heeft de UART een Data Register (UDR). Het is gebufferd in de ontvangstrichting, zodat een volledig ontvangen byte kan worden gelezen terwijl volgende data binnengeschoven wordt. Het zenderdeel van dit register is niet gebufferd. De transmissie wordt in werking gesteld wanneer data naar UDR wordt geschreven. Wanneer van UDR wordt gelezen, wordt de byte gelezen die door het ontvangersdeel wordt ontvangen. U kunt niet de laatste overgedrage byte nog eens lezen. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 1 / 15

UBRR Het Uart Baudrate register wordt gebruikt bij de klok van het UART-schuifregister. Zie het deel van de baudrate Generator voor details. In snelle AVR s (mega s) is een 16 bits-register gebruikt dat lage baudrates toelaat bij hoge CPU snelheden. UCR : Het UART Control Register controleert de ontvanger- en zenderfuncties en de interrupts. Bit 7 Bit 0 RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 RXCIE: Receive Complete Interrupt Enable Als deze bit wordt geset, zal de ontvangst van een byte van buitenaf een UART-Interrupt genereren tenminste als de globale Interrupt was toegelaten. TXCIE: transmit complete interrupt Enable Hetzelfde als RXCIE, maar geeft een transmit-interrupt. UDRIE: : UART Data Register Empty Interrupt Enable Indien deze bit wordt geset, wordt een interrupt gegeneerd als UDR leeg is. Dat laat toe de volgende byte te schrijven naar UDR terwijl dat de momentele byte in het verschuivingsregister wordt verzonden. Ook goed als bij de transmit complete interrupt niet de volgende byte naar UDR geschreven wordt. Het laat ook interrupt driven start van een transmission toe. RXEN: Receiver Enable Als deze bit wordt geset, wordt de ontvanger van de UART geactiveerd en de RXD-pen wordt als inputpen gezet die met UART wordt verbonden. Alle vorige settings zijn nu gedisabled, maar niet overschreven: Het disabelen van de ontvanger zal opnieuw de oude settings herstellen. TXEN: Transmitter Enable Als deze bit wordt geset, wordt de UART-zender geactiveerd en de pen TXD wordt als outputpen gezet die met de zender wordt verbonden. CHR9: 9 bit karakters Deze bit laat de grootte van 9 bitskarakter toe. Default, wordt deze bit geplaatst op 0 en 8 bits worden gebruikt. Als de 9 bit-karakters worden toegelaten, wordt het 9de bitje gevonden in RXB8 en TXB8. RXB8: Als CHR9 wordt geset, is dit het 9de ontvangen bitje. TXB8: Als CHR9 wordt geset, is dit het 9de bitje dat moet worden overgebracht. Als de 9 bitstransmissies worden toegelaten, moet eerst naar TXB8 worden geschreven alvorens te schrijven naar de lagere 8 bits van UDR. RXB8 is geldig nadat de ontvangen gegeven van het RX-register zijn overgebracht. Het is eveneens gebufferd, zodat het niet veranderd totdat een nieuwe byte volledig is ontvangen. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 2 / 15

USR Het UART statusregister bevat de statusvlaggen zoals interrupt vlaggen, overflow en framing error vlaggen. Bit 7 Bit 0 RXC TXC UDRE FE OR --- --- --- RXC: Receive Complete Dit is de interrupt-vlag die wordt geset wanneer de UART een karakter volledig heeft ontvangen. U kunt het in software resetten door een 1 ernaar toe te schrijven. U kunt het ook gebruiken om de AVR een interrupt routine te laten uitvoeren of poll het in een loop terwijl de interrupts gedisabled zijn. TXC: Transmit Complete Deze vlag wordt geset wanneer transmit voltooid is. Het kan op de zelfde manier worden gebruikt als RXC (betreffende het clearen in software). UDRE: UART Data Register Empty Deze vlag wordt geset als UDR leeg is. Deze voorwaarde komt voor wanneer een karakter van UDR naar het transmit schuifregister wordt gebracht. Als het volgende karakter naar UDR wordt geschreven, zal het niet overgedragen worden naar UDR totdat het momentele karakter volledig is uitgeschoven. Deze vlag kan worden gebruikt om maximum transfer te verzekeren door gebruik te maken van een softwarebuffer. Derhalve moet UDRE ISR UDR schrijven: Anders zal de interrupt opnieuw voorkomen totdat de gegevens naar UDR zijn geschreven of de vlag UDRIE is gecleared. UDRE wordt geset om erop te wijzen dat de zender klaar is. FE: Framing Error Deze vlag wordt geset als de stopbit niet correct wordt ontvangen. Dit is het geval als de toestand van de stopbit laag werd gezien. En dat is verkeerd. Als in de FE- bit 1 gelezen wordt door de software, moet u ernstige noise problemen of een andere hardwarefout hebben. OF: OverRun De overrun-vlag is zeer nuttig, om te ontdekken of de inkomende gegevens snel genoeg behandeld werden: Het wordt geset wanneer een karakter van het RX-register naar UDR wordt overgebracht alvorens het eerder ontvangen karakter werd gelezen. Het wordt opnieuw gecleared wanneer het volgende karakter wordt gelezen. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 3 / 15

De Baud Rate Generator De UART Baudrate generator bepaalt de snelheid van het verzenden en het ontvangen van gegevens via de UART. In tegenstelling tot de timer klok, die prescaled kan zijn in ruwe stappen, kan de klok UART zeer precies worden ingesteld, resulterend in een juiste en foutloze gegevensoverdracht. U zou kunnen opgemerkt hebben dat de baudrate door 16 wordt gedeeld alvorens het naar de registers van het schuifregister Rx/Tx wordt gestuurd. De klok die door de UART baudrate generator wordt geproduceerd is 16 keer hoger dan de baudrate bij het overbrengen van gegevens. De klok gebruikt voor het inschuiven van de ontvangen data is 16X hoger dan de baudrateklok om minder fouten te krijgen. In het midden van een databit dat ontvangen moet worden, worden drie steekproeven genomen: Als twee (of drie) gelijke steekproeven hoog zijn, is het bitje dat in het schuifregister wordt geplaatst Rx eveneens hoog. Als twee steekproeven verkeerd zijn, zijn de gegevens in het schuifregister ook verkeerd, maar dat is slechts mogelijk als de verbinding werkelijk slecht is. De klok die voor het verschuiven van de gegevens wordt gebruikt wordt dan gedeeld door 16 (zie diagram) en beantwoordt daarom aan de baudrate. Aangezien er geen behoefte is aan steekproefgegevens bij het Tx schuifregister, wordt het direct geklokt door de baudrate. De formule voor het berekenen van Baudrate dat een specifieke waarde in UBRR (het Baudrate Register) geeft is in de AVR- informatiebladen voorgesteld door deze formule: BAUD= fck/(16 (UBRR+1)) Voorbeeld: De Klok van het systeem is 8 Mhz en wij hebben 9600 Baud nodig. UBRR = (fck / (16*Baud)) - 1 Als we de waarde van hierboven gebruiken (8 Mhz en 9600 baud) krijgen wij de waarde van 51.08333333 voor UBRR. Dit wordt 51. De fout die wij maken is de daadwerkelijke baudrate gedeeld door de gewenste baudrate: De daadwerkelijke baudrate is 9615 baud, dus krijgen we een fout van 0.16%. Dit zal werken, maar het is niet perfect. Dit is de reden waarom u kristallen met rare frequenties tegenkomt, zoals 7.3728 Mhz : Als we deze kristal zouden gebruiken voor 9600 baud (2de formule) wordt UBRR = 47 en geeft geen fout. U kunt lijsten Technisch Instituut H.Hart Hasselt AVR- UART Blz. 4 / 15

met diverse klok/baud combinaties in de AVR- informatiebladen vinden. Als u niet de gepaste kristal kunt vinden, gebruik dan de formules hierboven. De UART zender De zender verzendt gegevens van AVR naar een ander apparaat (datalogger, PC,..enz.) bij een gespecificeerde Baudrate. De transmissie wordt in werking gesteld door gegevens naar UDR te schrijven. Die gegevens worden dan overgebracht naar het TX schuifregister. Wanneer de byte volledig is uitgeschoven kan de volgende byte naar UDR worden geschreven. Wanneer een byte wordt overgebracht naar het TX schuifregister, wordt de vlag UDRE gezet. UDRE ISR kan de volgende byte naar UDR schrijven zonder de lopende transmissie te storen. Wanneer een byte volledig uitgeschoven is, worden geen gegevens naar UDR geschreven door UDRE ISR, voodat de vlag TXC gezet is. Hoe de zender-interrupt-vlag werkt kan vrij gemakkelijk met de volgende flowchart begrepen worden: Technisch Instituut H.Hart Hasselt AVR- UART Blz. 5 / 15

Deze flowchart hangt af van een software FIFO buffer die een niet alledaagse flowchart is, maar het verklaart wel de vlaggen vrij goed denk ik: De transmission complete flag zal slechts geplaatst worden als de transmissie werkelijk volledig is: Door de buffersoftware te schrijven vertelt U de UART wanneer de transmissie volledig is. De ontvanger UART De ontvanger UART is fundamenteel hetzelfde opgebouwd als de zender, maar met de aangewezen supplementen voor het ontvangen van gegevens: De data recovery logic om Technisch Instituut H.Hart Hasselt AVR- UART Blz. 6 / 15

gegevens te bemonsteren en enkel één interrupt te genereren voor de voltooiing van gegevensontvangst. Het gebruikt dezelfde baudrate setting als de zender. De data wordt in het midden van het te ontvangen bitje bemonsterd: De kleine lijnen bij de bodem van de figuur (samen met de drie steekproeven) zijn de klok die door de baudrategenerator wordt geproduceerd. Dit zou ook duidelijk moeten maken waarom de baudrate 16 keer hoger is dan nodig. Deze hogere baudrate wordt gebruikt voor bemonstering/ filtreren. belangrijke Nota van de Hardware : Als u uw AVR met een PC wilt verbinden moet u RS-232 spanningsniveaus gebruiken. De spanningsniveaus die door een AVR worden gebruikt zijn normale niveaus TTL (5V of 3.3V voor hoog en 0V voor lage niveaus). Bij RS-232 zijn de niveaus +- 15V. Om de logicaniveaus naar RS-232 om te zetten hebt u een normale niveauconvertor zoals MAX232 nodig. Het is een vrij goedkope IC en komt in verschillende pakketten voor en is bijna overal beschikbaar. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 7 / 15

De UART programmeren. De Omzetting van het spanningsniveau De AVR UART is een zeer krachtige periferie. U kunt het gebruiken om berichten te verzenden naar uw PC en de data dan te tonen door een eindprogramma op het scherm (voor debug doeleinden of als gebruikersinterface), of ook met een zelf geschreven programma communiceren om geregistreerde gegevens te analyseren. Aangezien de UART zich streng op de timing (voor het produceren van de correcte baudrate) baseert, moet u weten op welke frequentie uw AVR draait en met welke snelheid u wilt communiceren met de buitenwereld. Het is ook belangrijk om de correcte drivercircuit te gebruiken tussen uw AVR en de PC, aangezien de COM-poort RS232 spanningsniveaus gebruikt. Zij zijn verschillend van CMOS niveaus en zonder een driver chip zult u uw AVR opstoken. Een veel gebruikt IC is de MAX232 die enkel wat condensatoren en een voedingsspanning vergt om te werken. Hier is een diagram van MAX232: WAARSCHUWING! Dit is een diagram van MAX202 van het Max232- informatieblad. Gebruik 10µF voor MAX232! De condensator verbonden tussen VCC en grond moet 0.1µF zijn. Om de UART te laten werken moet u een driver per richting hebben : een Zender (T1 of T2 in het diagram) van de AVR naar PC en een ontvanger (R1 of R2 in het diagram) van de PC naar de AVR. De kabel De kabel van uw circuit naar de PC zal meestal een kabel zijn met een 9-pen D-Type connector. De signalen die we nodig hebben zijn ground, receive data en transmit data. Hieronder is een tabel van de noodzakelijke verbindingen. De signaalnaam verwijst naar de kant van de PC. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 8 / 15

Signal PC side (male) Device Side (female) MAX232 pin to connector AVR pin to MAX232 Ground 5 5 15 (ground) Tx 3 3 13 or 8 RxD Rx 2 2 14 or 7 TxD Setup van de UART U moet het volgende weten om de UART te configureren: - De klokfrequentie van uw AVR - gewenste baudrate - dataformaat (hoeveel bits per transmissie) De klokfrequentie en de gewenste baudrate hebben we nodig voor het berekenen van de waarde van UBRR. Met de formule van het informatieblad of de AVR Architectuur kunnen de instellingen van de UART in geen tijd worden berekend. Veronderstel een snelheid 3.6864 Mhz en een gewenste baudrate van 38400, krijgen wij een waarde van 5. Dit moet naar UBRR worden geschreven. Het dataformaat zal gewoonlijk 8 bits per overdracht zijn. Soms worden 9 bits gebruikt. Mega s hebben zelfs meer opties, maar het formaat met 8 bits is nu voldoende. De volgende vraag is: interrupt driven of polling? Interrupt gedreven is natuurlijk efficiënter, maar bij het verzenden van strings of pakketten van gegevens, is polling gemakkelijker, aangezien de interrupt gedreven UART software buffers voor efficiënte stringoverdracht nodig heeft. Deze kunnen worden toegevoegd, maar dan is het geen eenvoudig voorbeeld meer. De voorbeeldcode hieronder toont hoe polling te gebruiken. De zender en de ontvanger moeten enabled worden om gebruik van de UART mogelijk te maken. De setup code setup_uart: ldi r16, 5 out UBRR, r16 ldi r16, 0b00011000 out UCR, r16 ret we can call this as a subroutine during intitialisation write correct clock divider value to UBRR set Rx and Tx enable bits write them to the UART Control Register done. Nothing more to do! Hieronder een eenvoudig voorbeeld met de UART, wij willen de gegevens terugsturen die wij van de PC hebben ontvangen Bij het typen van karakters op een terminal, zouden wij de ASCII-code moeten ontvangen en terug sturen zodat wij op de terminal tweemaal hetzelfde karakter zouden zien (veronderstellend een lokale echo in de PC). Voor het ontvangen van gegevens wachten wij tot de vlag RXC in USR ( UART Status Register) is gezet en dan kunnen we de gegevens van UDR (Het UART dataregister) lezen. Dan kunnen wij deze data opnieuw verzenden door de data terug naar UDR te schrijven. Als wij data naar UDR schrijven terwijl een byte wordt ontvangen zal dit niet storen omdat UDR verdeeld is in twee registers, voor elke richting. Alvorens data naar UDR te schrijven moeten wij wachten totdat de UDRE-vlag gezet is, wat erop wijst dat het karakter overgebracht is naar het UART schuifregister. Dan pas kan een nieuw karakter naar de UDR worden geschreven. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 9 / 15

Code voorbeeld.org 0x0000 rjmp reset reset: ldi r16, low(ramend) out SPL, r16 rcall setup_uart loop: rcall rx_uart rcall tx_uart rjmp loop rx_uart: in r16, USR sbrs r16, RXC rjmp rx_uart in r16, UDR ret tx_uart: in r17, USR sbrs r17, UDRE rjmp tx_uart out UDR, r16 ret include setup_uart here! reset interrupt vector for startup initialise Stack Pointer initialise the UART then loop back the characters received from the PC receive data and transmit it again and do this forever receive routine: get UART Status Register and see if Rx Complete flag is set if not, go back to rx_uart data came in. RXC is cleared by reading UDR, UDR is stored in r16 return transmit routine: get UART Status Register (r17 this time, the data is in r16!!!) and see if UDR is free for transfer if not, go back to rx_uart send the data, UDRE will be cleared by hardware return Na het overlopen van de code zou u tot de conclusie kunnen komen dat de controle van het statusregister voor het overbrengen van gegevens niet noodzakelijk is, aangezien de gegevens met een zeer lage snelheid binnen komen (zo snel als u kunt typen) en daarom wordt een echo gestuurd alvorens het volgende karakter komt en kan opnieuw worden overgebracht. Bij andere toepassingen waar gegevens bij hogere snelheid worden verzonden, zoals het geval is bij het verzenden van datapakketten of strings, zal de toepassing een karakter sturen, het volgende karakter van het geheugen halen en zal het zo spoedig mogelijk verzenden. Interrupt gedreven Voorbeeld. Interrupt gedreven voorbeeld blijft niet controleren of de data zijn binnen gekomen. In plaats daarvan wordt de Rx complete interrupt gebruikt om te bepalen wanneer de gegevens klaar staan. Het wordt dan weergalmd (echo) terug door RXC ISR (in service routine). Om interrupt gedreven echo mogelijk te maken, moet de RXC-interrupt toegelaten worden (RXCIE in UCR zetten) en, natuurlijk, de globale interrupt moet eveneens worden toegestaan. De volledige interrupt vector zal ook moeten worden geinstalleerd..org 0x0000 rjmp reset.org 0x0007 rjmp UART_RXC reset: ldi r16, low(ramend) out SPL, r16 ldi r16, 5 out UBRR, r16 reset vector address: handle reset UART Receive Complete Interrupt vector: go to UART_RXC jump here at reset stack setup clock divider value for 38400 baud @ 3.6864 MHz Technisch Instituut H.Hart Hasselt AVR- UART Blz. 10 / 15

ldi r16, 0b10011000 out UCR, r16 sei loop: rjmp loop UART_RXC: in r17, UDR out UDR, r17 reti enable Rx Complete Int, enable receiver and transmitter enable interrupts loop here (do nothing) UART Rx complete interrupt handler: get data we received write it to UDR return from int Dit voorbeeld, behalve dat het interrupt gedreven is, is het ook verschillend van het eerste: De ISR (inservice routine) controleert niet of het toegestaan is om naar de UDR te schrijven, zodoende kunnen botsingen voorkomen als het vorige karakter nog niet werd overgebracht. Dit zou met een ISR kunnen worden gedaan in het UART data register empty interrupt. De flowchart toont aan hoe we met de twee ISR moeten communiceren via UDRE-interrupt enable bit (UDRIE):.org 0x0000 rjmp reset.org 0x0007 rjmp UART_RXC rjmp UART_DRE reset: ldi r16, low(ramend) out SPL, r16 ldi r16, 5 out UBRR, r16 ldi r16, 0b10011000 out UCR, r16 sei loop: rjmp loop UART_RXC: in r17, UDR same as above here's the Rx Complete vector here's the UDRE Int vector (.org 0x0008) stack setup set baud rate enable Rx and Tx, enable Rx Complete Interrupt UDRIE is NOT(!) set!!! This is done by the RXC ISR enable Interrupts do nothing as long as power is present UART Rx Complete ISR: get data Technisch Instituut H.Hart Hasselt AVR- UART Blz. 11 / 15

in r16, UCR sbr r16, 0b00100000 out UCR, r16 reti UART_DRE: in r16, UCR cbr r16, 0b00100000 out UCR, r16 out UDR, r17 reti get UART Control Register and set UDRIE bit store UART Control Register again and that's it. UART Data Register Empty ISR: Will be called as soon as UART_RXC returns! Get UCR clear UDRIE bit and store UCR again send data return from ISR Deze voorbeelden zouden u een idee moeten gegeven over het gebruik van de UART. Het laatste voorbeeld (met RXC en UDRE interrupts) is bijna klaar voor FIFO buffergebruik. Technisch Instituut H.Hart Hasselt AVR- UART Blz. 12 / 15

Enkele voorbeelden in BASCOM : Voorbeeld 1: $regfile = "m16def.dat" $crystal = 3690000 $baud = 19200 ' of ATmega8 ' voor STK500 Dim A As Integer Do Input "getal ingeven: ", A Print "het ingegeven getal is : " A Waitms 500 Loop End Voorbeeld 2 : $regfile = "m16def.dat" $crystal = 3690000 $baud = 19200 ' ATmega8 ' voor STK500 Dim A As Byte Dim B As Word Do Inputbin A, B Printbin A B Print Loop ' ingeven van byte en woord End Technisch Instituut H.Hart Hasselt AVR- UART Blz. 13 / 15

Voorbeeld 3 : $regfile = "m16def.dat" $crystal = 3690000 $baud = 19200 ' ATmega8 ' voor STK500 Dim A As Byte Print "Waitkey - onderbreken met ESC" Do A = Waitkey() Print Chr(a) " is ASCII " A Loop Until A = 27 ' wacht op het ingeven van tekens Print "Inkey - onderbreken met ESC" Do A = Inkey() Print Chr(a) " is ASCII " A Waitms 100 Loop Until A = 27 ' lezen van een karakter Print "Ischarwaiting & Inkey - onderbreken met ESC" Do A = Ischarwaiting() If A = 1 Then A = Inkey() Print Chr(a) " is ASCII " A End If Loop Until A = 27 ' karakter in Buffer? ' lezen van karakter End Technisch Instituut H.Hart Hasselt AVR- UART Blz. 14 / 15

Voorbeeld 4 : $regfile = "m8def.dat" ' ATmega8 $crystal = 3690000 ' voor STK500 $baud = 19200 Dim A As Byte Dim B As Byte Open "COMD.6:9600,8,N,1,inverted" For Output As #1 Open "COMD.7:9600,8,N,1,inverted" For Input As #2 ' PD6 is TxD ' PD7 is RxD Do Print "Een karakter ingeven - onderbreken met ESC: " A = Waitkey() Print "ingegeven karakter was " Chr(a) Print " verzonden karakter was " Chr(a) Printbin #1, A Inputbin #2, B Print " ontvangen karakter was " Chr(b) Print Loop Until A = 27 Close #1 Close #2 End Voorbeeld 5 : $regfile = "M32DEF.DAT" $crystal = 14745600 $baud = 38400 Yellowled Alias Portc.3 'Gosub Init_staver24 Dim A As Byte ' 14.7456 MHz Oscillator ' USART Baudrate ' Gele LED Cls : Lcd "Test M8-M32" Open "COMD.7:9600,8,N,1,inverted" For Output As #1 Open "COMD.6:9600,8,N,1,inverted" For Input As #2 ' PD7 ist TxD ' PD6 ist RxD Do Inputbin #2, A Reset Yellowled Waitms 500 Set Yellowled Incr A Printbin #1, A Loop ' Blinken gele LED End '$include "init_staver24.bas" Technisch Instituut H.Hart Hasselt AVR- UART Blz. 15 / 15