Steun onze actie WeGoSTEM

Voor onze actie WeGoSTEM zoeken we nog vrijwilligers. Doe mee via WeGoSTEM.be/meedoen

ProjectsI/O Aansturen

30 October 2014

Evarne

Zou je graag alle pinnen van het Dwengo bord willen benutten? Door gebruik van de input/output poorten kan je in totaal wel 32 pinnen aansturen en uitlezen! We bekijken de mogelijkheden, de configuratie en het gebruik van de I/O en sluiten af met twee kleine projectjes.


Description

Wat is I/O?

I/O staat voor input/output. Dit zijn pinnen op de µC (microcontroller) die men hoog en laag kan aansturen en uitlezen. De pic18f4550 in het Dwengo board heeft 32 I/O pinnen. Heel wat pinnen kunnen ook voor meer geavanceerde functies gebruikt worden zoals analoge input en datacommunicatie (bv. I2C en SPI). De I/O zijn onderverdeeld in verschillende poorten, namelijk A, B, C, D en E. Elke poort bevat maximaal 8 pinnen en wordt dan ook bestuurd met een 8-bits variabele. Van poorten A en E zijn enkele pinnen niet naar buiten gebracht. Voor referentie kan je altijd hoofdstuk 10 van de pic18f4550 datasheet raadplegen.

Verschillende staten van een poort

Elke I/O kan drie verschillende staten hebben:

Status Eigenschap pin Data richting
High met de 5V kortgesloten output
Low met de ground (-) kortgesloten output
High impedance zwevend – er staat geen spanning op input

Gebruik van de poorten

De poorten worden bestuurd met registers. Er zijn in totaal drie registers:

  • TRIS register: configuratie data richting (1 voor input, 0 voor output)
  • PORT register: als output: data schrijven naar poort, als input: data lezen van poort
  • LAT register: bevat de naar de poort geschreven waarden.

Elke poort heeft zijn eigen drie registers. Omdat we vooral geïnteresseerd zijn in de TRIS en PORT registers gaan we het LAT register niet verder bekijken.

Configuratie van de poort

Voor gebruik moeten we de poort configureren als input of als output en maken we dus gebruik van het TRIS register. Enkele voorbeeldjes.

  1. TRISC=0; // de gehele poort C als output configureren.
  2. TRISC=0b11010000; // pinnen RC7, RC6 en RC4 als input, de rest als output configureren.
  3. TRISCbits.TRISC5=1; // pin RC5 als input configureren.

Door enkel de betreffende pin aan te sturen zoals in lijn 3 worden de andere pinnen van die poort niet beïnvloed. Voor gebruik van poort A als input moeten we eerst de ADC functie uitschakelen (zie datasheet p.115 en p.267 van de datasheet).

Gebruik als output

Zo kunnen we dingen aansturen. Elke poort kan ongeveer 20mA aan – net genoeg voor één LEDje dus. Poort D is de parallelle poort en is verbonden met het LCD en de LEDjes. Je kan daarom best deze poort gebruiken om de outputs te testen. Aangezien de LEDjes in de plus geschakeld zijn gaan ze aan als de desbetreffende pinnen hoog zijn.

  1. TRISD=0; // de gehele poort D als output configureren.
  2. PORTD=255; // alle pinnen hoog (5V) zetten.
  3. PORTD=0b10101010; // de pinnen afwisselend hoog en laag zetten.
  4. PORTDbits.RD0=1; // pin D5 hoog zetten.

Pas wel op! Als er teveel stroom getrokken wordt (>20mA) kan de microcontroller schade oplopen.

Gebruik als input

We kunnen de poort ook gebruiken om digitale waarden uit te lezen.

  1. BYTE portdata; // variabele voor toestand poort.
  2. TRISA=255; // de gehele poort A als input configureren.
  3. portdata=PORTA; // de toestand van poort A inladen in de variabele.
  4. LEDS=portdata; // ledjes zetten volgens data.

Het is natuurlijk ook mogelijk om een enkele pin uit te lezen.

  1. BYTE pinstate; // variabele voor toestand pin.
  2. TRISAbits.TRISA0=1; // pin RA0 als input configureren.
  3. pinstate= PORTAbits.RA0; // de toestand van pin RA0 inladen in de variabele.
  4. LED0=pinstate; // ledje schakelen volgens data.

Projectje

Met wat we nu geleerd hebben kunnen we aan de slag gaan.

  • Schakeling 1: drukknop – input en output
  • Schakeling 2: ledjes – gebruik van de drie staten

Schakeling 1

We lezen de status van een drukknop uit en geven die weer op het LCD.

Nodig:

  • Dwengo board en breadboard
  • Drukknop
  • 10kOhm weerstand
  • Draad

Schema: alt text

De 10kOhm weerstand functioneert hier als pull-up weerstand om poort RA0 hoog te houden als de schakelaar niet gesloten is. De pic18f4550 heeft ook geïntegreerde pull-up weerstanden op enkle pinnen. Deze zijn o.a. gebruikt voor de drukknopjes op het bordje zelf. Je kan deze natuurlijk aan- en uitschakelen.

Code:

  1. #include <dwengoConfig.h>
  2. #include <dwengoBoard.h>
  3.  
  4. void main(void) {
  5. // variabele voor opslaan data poort.
  6. unsigned char pinstate;
  7. initBoard();
  8. backlightOn();
  9. // poort A voor digitale input configureren (datasheet p.115 en p.267).
  10. ADCON1=0b00001111;
  11. // pin RA0 als input configureren.
  12. TRISAbits.TRISA0=1;
  13. while (TRUE) {
  14. // de toestand van pin RA0 inladen in de variabele.
  15. pinstate=PORTAbits.RA0;
  16. // LCD scherm leegmaken.
  17. printStringToLCD(" ",0,0);
  18. printStringToLCD("Status: ",0,0);
  19. // Indien de pin hoog is (schakelaar open) "off" weergeven.
  20. if(pinstate==1) appendStringToLCD("OFF");
  21. // en anders "on" tonen.
  22. else appendStringToLCD("ON");
  23. // even wachten.
  24. delay_ms(100);
  25. }
  26. }

Het C bestand is te downloaden in bijlage.

Vragen:

  • Kan je de schakelaar ook op een andere wijze aansluiten, nl. met een pull-down weerstand?
  • Klopt de weergegeven status op het LCD dan nog?
  • Is de waarde van de weerstand belangrijk? Wat als de weerstand te klein is? Reken dit uit. Neem als maximale stroom 5mA.
  • Is het verstandig om een zeer hoge weerstand te gebruiken i.v.m. betrouwbaarheid?

Schakeling 2

We gaan de drie staten van een pin gebruiken om ledjes aan te sturen. Door de staat van pin RA1 te veranderen gaan we de twee ledjes op drie wijzen laten oplichten: eerst de bovenste, dan de onderste en vervolgens beide. Omdat in het derde geval de stroom door de twee weerstanden moet, zullen de ledjes minder oplichten.

Nodig:

  • Dwengo board en breadboard
  • twee ledjes
  • 2x weerstand 150Ohm
  • Draad

Schema: alt text

Code:

  1. #include <dwengoConfig.h>
  2. #include <dwengoBoard.h>
  3.  
  4. void main(void) {
  5. initBoard();
  6. backlightOn();
  7. while (TRUE) {
  8. // pin RA1 als output configureren.
  9. TRISAbits.TRISA1=0;
  10. // pin RA1 laag zetten.
  11. PORTAbits.RA1=0;
  12. clearLCD();
  13. appendStringToLCD("Status: output, low");
  14. // even wachten.
  15. delay_s(1);
  16.  
  17. // pin RA1 hoog zetten.
  18. PORTAbits.RA1=1;
  19. clearLCD();
  20. appendStringToLCD("Status: output, high");
  21. delay_s(1);
  22.  
  23. // pin RA1 als input (high impedance) configureren.
  24. TRISAbits.TRISA1=1;
  25. clearLCD();
  26. appendStringToLCD("Status: high im-pedance");
  27. delay_s(1);
  28. }
  29. }

Vragen:

  • Maak de draad naar RA0 los en observeer de status van de LED’s.
  • Wat toont dit aan?

Additional Materials