16-nyckel knappsatsen avkodning med en AVR MCU (5 / 7 steg)
Steg 5: Skriva, ladda upp och köra din AVR kod
Har du undrat ännu hur 74C922 destillerar 8 bitar data i bara fyra data rader? Om du har läst min andra instructable du skulle förmodligen ha räknat ut. Tja, har kanske du redan räknat det ut. När du har gjort en sanning bordlägger du har gjort dem alla, rätt? :) De 8 stift från knappsatsen är kodad i binära med fyra data stiften. Jag har gjort en sanning bordlägger för dig.
Om du är oklart vad det innebär, ta en titt på min andra instructables, eller gör en sökning efter "sanningen bordlägger" eller "binär logik" på din favorit sökmotor.
Koden logik
Jag är inte säker på att få in på detaljer i min kod när den är tillgänglig för nedladdning är lämpligt, men jag ska presentera några saker här, och om du är en gammal salt på det här du kan hoppa över det, annars hoppas jag att jag kan lära dig något.
- Kontrollera om en global flagga som indikerar data är redo att processen
- När Data tillgängliga PIN-koden ändras till hög
- Läsa data stift
- Som bitar i ett allmänt register nedan 0xFF
- Ange "data tillgänglig för bearbetning" flagga
- Bearbeta data och göra vad vi vill med det
Avsnitt nummer
Jag har tagit en zip-fil för detta avsnitt som innehåller de viktigaste handlingarna och ett par axillär filer. Du kan ta ut USART grejer och bara sammanställa den huvudsakliga arkivera eller vad du vill. Så, jag ska bara kort täcka hur koden fungerar.
Deklarationer
Detta avsnitt är ganska självklar så jag kommer inte att gå in någon ytterligare utom att uppmärksamma lokala header-filer som jag har tagit med att du kanske eller kanske inte vill använda eller ta bort.
#include "common.h"#include "uart.h"#include < avr/io.h > < util/delay.h > < avr/interrupt.h > #define DATA1 PIND2 #include #include #define DATA2 PIND3 #define uppgifter3 PIND4 #define DATA4 PIND5 #define DATA_AVAIL PIND6void Interrupt_init (void), flyktiga uint8_t bDataReady = 0;
Initiering
Det finns två underavsnitt initiera i detta program:
1. USART systemet
2. avbrottet system för hantering
Det är säkert att ta bort USART grejer om du tar bort alla hänvisningar till det och inte vill kommunicera via USB-kabeln eller en extern seriell konsol via en max232 chip. Därför inte kommer att jag inkludera det nedan eftersom det är utanför omfånget för denna guide.
voidInterrupt_init(void) {BSET(PCICR,PCIE2); / / aktiverar Pin Change Interrupt 2 BSET(PCMSK2,PCINT22); / / aktivera PCINT22 (det är PD6) BSET(SREG,7); / / Set-bit i Status registrera GPIOR0 = 0x00; / / använda allmänna ändamål I/O register}
Avbryta tjänsten hanterare
Detta är pin change avbrottshanterare. Några saker att notera:
1. det är mycket kort
2. inga funktioner kallas inom det
3. detta avbrott kommer att kallas på någon logik nivå förändring, så det betyder när Data tillgängliga går högt (som vi vill) och när det går låg (som vi bryr oss inte om).
4. en global flagga ligger och avbrottshanterare återvänder för att tillåta huvudloop att hantera resten.
5. jag använder en generell I/O registret nedan 0xFF utrymme. Detta innebär tillgång är mycket snabb.
ISR(PCINT2_vect) {om (BCHK(PIND,DATA_AVAIL) == 0) returnera; om (BCHK(PIND,DATA1)) BSET(GPIOR0,GPIOR00); om (BCHK(PIND,DATA2)) BSET(GPIOR0,GPIOR01); om (BCHK(PIND,DATA3)) BSET(GPIOR0,GPIOR02); om (BCHK(PIND,DATA4)) BSET(GPIOR0,GPIOR03); bDataReady = 1;}
Main
Allt vi behöver göra här är loop vid kontroll av om data är tillgängliga för bearbetning. Om det är, göra våra magiska, som våra flaggor och arbetar register noll och tillbaka.
int main () {/ / initiera seriell delsystemet USART_init(BAUD_9600); / / initiera PCI2 Interrupt_init(); uint8_t kodade = 0x00; för (;) {om (bDataReady) {kodade = GPIOR0; USART_tx(Encoded); bDataReady = 0; GPIOR0 = 0X00; } }}