Buttons op de ATMega328
Algemene Informatie
De ATMega328 heeft 3 poorten: PORTB, PORTC en PORTD.
LEDS – Simpel
● PORTB = LEDS
● PORTC = Buttons
● PORTD = Display
● Per poort: 3 registers
Let op:
● PORTx bepaalt op welke poort je werkt, bijvoorbeeld PORTB, PORTC, PORTD.
● Voor LED’s is pin 7 t/m 13 (dus PORTB, pin 2 t/m 5).
Registers
DDRx: Data Direction Register
● Hiermee stel je in of een pin een input of output is.
PORTx: Output Register
● Als output: hoog of laag signaal op de pin.
● Als input: intern pull-up aanzetten (als je die wilt gebruiken).
PINx: Input Register
, ● Wordt gebruikt om van een pin te lezen.
Voorbeeld LED
DDRB = 0b00000100; // Zet PB2 als output
PORTB = 0b00000000; // Zet LED aan
PORTB = 0b00000100; // Zet LED uit op PB2
LEDS – Extra
DDRB |= (1 << PB2); // 1 verschuiven naar PB2-positie → 00000100
PORTB |= (1 << PB2); // LED uit
PORTB &= ~(1 << PB2); // LED aan
Let op: bitmasking wordt gebruikt om alleen de gewenste pin aan te passen.
PORTB &
PORTB &= ~(1 << PB2);
● &= ~() → zet een bit op 0.
● |= → zet een bit op 1.
● ^= → toggelt een bit (0 wordt 1 en 1 wordt 0).
Button – Uitleg
We gebruiken 3 knoppen op A1, A2 en A3 → dus pinnen PC1, PC2, PC3.
We willen een button (drukknop) kunnen inlezen die is aangesloten op pin PC1 van een
microcontroller (bijv. een AVR-chip zoals de ATmega328p).
1. Pin instellen als input
DDRC &= ~(1 << PC1);
, ● DDRC = Data Direction Register voor poort C.
● Elke bit bepaalt of de bijbehorende pin een input (0) of output (1) is.
● &= ~(1 << PC1) zorgt ervoor dat bit 1 van DDRC op 0 wordt gezet, dus PC1
wordt input.
We moeten dit doen om van PC1 een invoerpin te maken, zodat we signalen van
buitenaf kunnen "lezen", zoals een knop die wordt ingedrukt.
2. Pull-up weerstand aanzetten
PORTC |= (1 << PC1);
● PORTC regelt twee dingen:
○ Als de pin een output is, stuurt PORTC een hoog of laag signaal.
○ Als de pin een input is, zet PORTC een interne pull-up weerstand aan (als
er een 1 wordt geschreven).
Een pull-up weerstand trekt het ingangssignaal naar +5V (logische 1) als
de knop niet is ingedrukt.
Wat is een pull-up weerstand?
Een pull-up weerstand voorkomt dat de pin in de lucht hangt ("floating") als de knop niet
wordt ingedrukt. Zonder pull-up zou de pin onvoorspelbare waarden kunnen lezen (ruis).
3. De knop uitlezen via het PIN register
if ((PINC & (1 << PC1)) == 0)
Wat doet deze regel?
● PINC is het register dat de huidige toestand van de pinnen op poort C weergeeft.