Seriële communicatie

Wanneer je gegevens wil uitwisselen tussen het Dwengo-bord en een computer of een andere elektrische component zoals een kompas of bluetooth-chip, dan kan dit eenvoudig via het RS232-protocol. Dit protocol wordt ook door jouw pc gebruikt wanneer je iets aansluit op de seriële poort. De Dwengo-bibliotheek is voorzien van de nodige functionaliteit om seriële communicatie tot stand te brengen. In deze handige tip gaan we dieper in op hoe je alles zelf kan instellen.

Je begint met het inladen van de nodige bibliotheken:

  1. #include <p18f4550.h>
  2. #include <delays.h>
  3. #include <usart.h>

Vervolgens moet je de USART-module van de microcontroller initialiseren. Dit houdt in dat je de snelheid van de communicatie kiest, aangeeft of je een interrupt wil laten genereren wanneer er data toekomt, hoeveel databits er zijn, enzovoort. Een volledig overzicht van alle mogelijkheden staat beschreven in de datasheet van de microcontroller External link. Met de functie OpenUSART kan je de USART-module initialiseren.

  1.  
  2. // open connection
  3. OpenUSART (USART_TX_INT_OFF &
  4. USART_RX_INT_OFF &
  5. USART_ASYNCH_MODE &
  6. USART_EIGHT_BIT &
  7. USART_CONT_RX &
  8. USART_BRGH_LOW, 77); // cfr table 20-3

De meegegeven parameters stellen de eigenschappen van de verbinding in.

  • USART_TX_INT_OFF: uitschakelen van interrupt bij het verzenden van data
  • USART_RX_INT_OFF: uitschakelen van interrupt bij het ontvangen van data
  • USART_ASYNCH_MODE: de RS232-standaard werkt met asynchrone communicatie, dit wil zeggen dat de communicatie niet gestuurd wordt door middel van een klok.
  • USART_EIGHT_BIT: het aantal databits instellen op 8
  • USART_CONT_RX: continue ontvangst mogelijk maken
  • USART_BRGH_LOW, 77: in dit voorbeeld wordt gewerkt met een lage baudrate (snelheid) van 9600 baud, dus kiezen we voor USART_BRGH_LOW. 77 staat voor 9600 baud. De berekening van deze waarde in functie van de baudrate staat uitgeschreven in hoofdstuk 20 van de PIC18F4550 datasheet External link en gebeurt als volgt: Fosc/(baudrate*64)-1. Hier is dit dus 48.000.000/(9600*64)-1 wat afgerond gelijk is aan 77.
  • 9600 baud volstaat voor de meeste toepassingen. Merk op dat de microcontroller ook sneller kan werken (tot 115200 baud).

Wanneer je geen seriële communicatie meer wenst kan je de USART-module ook weer sluiten door CloseUSART() op te roepen.

De communicatie zelf verloopt typisch volgens het volgende stramien:

  1. Boodschap versturen naar de computer.
  2. Wachten totdat de computer iets terug verstuurt.
  3. Inlezen van boodschap verzonden door de computer.
  4. Antwoord verzenden naar de computer.

Een eenvoudige boodschap kan verzonden worden met de functie putrsUSART((const far rom char *) "boodschap"). Vervolgens wachten we op het antwoord van de computer. Dit kunnen we controleren met de functie DataRdyUSART() die de waarde TRUE teruggeeft wanneer de microcontroller data ontvangen heeft via de USART-module. Daarom maken we een while-lus aan die blijft lopen zolang de functie DataRdyUSART() FALSE teruggeeft.

  1. // while no new data is available
  2. while (!DataRdyUSART());

Wanneer de computer nieuwe data naar het Dwengo-bord verstuurt, springen we uit deze while-lus. In het volgende stukje code tonen we hoe die data karakter per karakter kan worden ingelezen. Hierbij is buffer een rij van karakters (char).

  1. // read something from USART
  2. position = 0;
  3. do {
  4. while (!DataRdyUSART());
  5. buffer[position] = getcUSART();
  6. }
  7. while (buffer[position++] != '\r');

Eventueel kan een vaste hoeveelheid bytes ook uitgelezen worden in een buffer met behulp van de functie getsUSART. Meer informatie over de functies kan je vinden in de documentatie van de C18-bibliotheek External link.