Arduino Timer avbryter (4 / 6 steg)

Steg 4: Exempel 2: seriell kommunikation



Detta projekt är en 4 x 4 bakgrundsbelyst knapp pad. Projektet ansluter till datorn via usb, skickar information om knapparna till datorn och får information om hur att lysa upp lamporna. Här är en video:

För detta projekt använde jag timer2 avbrott att regelbundet kontrollera om det fanns någon inkommande seriell data, läsa den och spara den i matrisen "ledData []". Om du tar en titt på koden kommer du se att det viktigaste kretsar av skissen är vad som faktiskt ansvarar för med info i ledData att lysa upp den korrekta lysdioder och kontrollera status för knapparna (en funktion som kallas "shift()"). Rutinen avbrott är så kort som möjligt - bara kontroll för inkommande byte och lagra dem på lämpligt sätt.

Här är inställningarna för timer2:

(CLI); //stop avbrott
Ange timer2 avbryta varje 128us
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera för 7,8 khz steg
OCR2A = 255; / / = (16 * 10 ^ 6) / (7812.5 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR2A | = (1 << WGM21);
Ange CS21 bit för 8 prescaler
TCCR2B | = (1 << CS21);
Aktivera timern jämför avbrott
TIMSK2 | = (1 << OCIE2A);
SEI (); //allow avbrott

Här är den kompletta Arduino skissen:

KNAPPEN TEST / 74HC595 och 74HC165 och seriell kommunikation
av Amanda Ghassaei
Juni 2012

/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 2 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/

denna firmware kommer att skicka data fram och tillbaka med maxmsp patch "beat slicer"

PIN-anslutningar
#define ledLatchPin A1
#define ledClockPin A0
#define ledDataPin A2
#define buttonLatchPin 9
#define buttonClockPin 10
#define buttonDataPin A3

looping variabler
byte i.
byte j;
byte k;
byte ledByte;

lagring för ledde staterna, 4 byte
byte ledData [] = {0, 0, 0, 0};
lagring för knappar, 4 byte
byte buttonCurrent [] = {0,0,0,0}.
byte buttonLast [] = {0,0,0,0}.
byte buttonEvent [] = {0,0,0,0}.
byte buttonState [] = {0,0,0,0}.
knappen Dämpningstid counter - 16 byte
byte buttonDebounceCounter [4] [4].

void setup() {
DDRC = 0xF7; //set A0-2 och A4-5 utgång, A3-ingång
DDRB = 0xFF; //digital stift 8-13 utgång

Serial.BEGIN(57600);

(CLI); //stop avbrott

Ange timer2 avbryta varje 128us
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera för 7,8 khz steg
OCR2A = 255; / / = (16 * 10 ^ 6) / (7812.5 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR2A | = (1 << WGM21);
Ange CS21 bit för 8 prescaler
TCCR2B | = (1 << CS21);
Aktivera timern jämför avbrott
TIMSK2 | = (1 << OCIE2A);

SEI (); //allow avbrott

}

buttonCheck - kontrollerar status för en viss knapp.
denna buttoncheck funktion är i stort sett kopierade från monome 40h firmware brian crabtree och joe sjö
void buttonCheck (byte rad, byte index)
{
om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) & & / / om det aktuella fysiska knapp läget skiljer sig från den
((buttonCurrent [rad] ^ buttonState[row]) & (1 << index))) {/ / last fysisk knapp staten och nuvarande debounced staten

om (buttonCurrent [rad] & (1 << index)) {/ / om nuläget fysisk knapp trycks
buttonEvent [rad] = 1 << index; köa upp en ny knapp händelse omedelbart
buttonState [rad] | = (1 << index); och ställa in debounced ner.
}
annat {
buttonDebounceCounter [rad] [index] = 12.
} / / annars knappen tidigare var deprimerad och nu
har släppts så vi våra debounce counter.
}
annars om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) == 0 & & / / om det aktuella fysiska knapp läget är samma som
(buttonCurrent [rad] ^ buttonState[row]) & (1 << index)) {/ / den senaste fysiskt knappen stat men den nuvarande fysiskt
knappläge skiljer sig från den nuvarande debounce
statliga...
om (buttonDebounceCounter [rad] [index] > 0 & &--buttonDebounceCounter [rad] [index] == 0) {/ / om den räknaren debounce har
varit minskas till 0 (menande den
knappen har varit upp i
kButtonUpDefaultDebounceCount
iterationer / / /

buttonEvent [rad] = 1 << index; köa en knapp staten change-händelse

om (buttonCurrent [rad] & (1 << index)) {/ / och växla knapparna debounce staten.
buttonState [rad] | = (1 << index);
}
annat {
buttonState [rad] & = ~ (1 << index);
}
}
}
}

{Ogiltig shift()

för (jag = 0; jag < 4; i ++) {

buttonLast [i] = buttonCurrent [i];

byte dataToSend = (1 << (jag + 4)) | (15 & ~ ledData[i]);

ställa in spärren pin låg så lysdioderna inte ändra samtidigt skickas i bitar
digitalWrite (ledLatchPin, låg);
flytta ut bitarna av dataToSend
shiftOut (ledDataPin, ledClockPin, LSBFIRST, dataToSend);
ställa in spärren pin hög så lysdioderna kommer att få nya uppgifter
digitalWrite (ledLatchPin, hög);

När en rad har ställts in hög, ta emot data från knappar
ställa in spärren pin hög
digitalWrite (buttonLatchPin, hög);
skifta i data
buttonCurrent [i] = shiftIn (buttonDataPin, buttonClockPin, LSBFIRST) >> 3.
latchpin låg
digitalWrite (buttonLatchPin, låg);

för (k = 0; k < 4; k ++) {
buttonCheck(i,k);
om (buttonEvent [i] << k) {
om (buttonState [i] & 1 << k) {
Serial.write(((3-k) << 3) + (i << 1) + 1);
}
annat {
Serial.write(((3-k) << 3) + (i << 1) + 0);
}
buttonEvent [i] & = ~ (1 << k);
}
}
}
}

ISR(TIMER2_COMPA_vect) {
göra {
om (Serial.available()) {
ledByte = Serial.read (); //000xxyys
booleska ledstate = ledByte & 1.
byte ledy = (ledByte >> 1) & 3;
byte ledx = (ledByte >> 3) & 3;
om (ledstate) {
ledData [ledy] | = 8 >> ledx;
}
annat {
ledData [ledy] & = ~ (8 >> ledx);
}
} //end om seriell tillgängliga
} //end gör
medan (Serial.available() > 8);
}

void loop() {
Skift (); //updates lysdioder och tar emot data från knappar
}

Ladda ner MaxMSP nedanstående patch (det kommer att köras i Max Runtime också).

Se Steg
Relaterade Ämnen

Arduino kitchen timer med en introduktion till timer avbryter

Välkommen till min första instructable,Jag beslöt att göra ett ganska enkla projekt för att ange instructable värld. Detta projekt handlar om att göra en enkel kitchen timer med en Arduino Uno. Således kommer jag ge en liten introduktion 2.2" tft dis...

Timer avbryter på DP32

Timers! Jag är glada att äntligen att täcka timers på min favorit ombord, DP32!Kom ihåg vägen tillbaka när jag skrev om externa avbrott? Om inte du är bekant med avbrott och hur de fungerar, rekommenderar jag att kontrollera denna tutorial ut först....

Arduino Time-Lapse Controller

detta projekt som ursprungligen började med några enkla delar kastas tillsammans för att skapa en mycket enkel time-lapse controller för en DSLR-kamera. När jag var nöjd med den första prototypen, ville jag göra en slutlig version som planeringen av...

Använd Timer avbryta på pcDuino

Timer avbrott kan du utföra en aktivitet på mycket specifikt tidsinställdaintervall oavsett vad som händer i din kod.Steg 1: Steg 1: använda timer avbrott på pcDuinoNär pcDuino kör Ubuntu, som är en version av Linux, Linuxger en timer mekanism, som ä...

Jontofores kontrolleras av arduino timer

DIY Jontofores enhet drivs av Arduino med timerfunktiondessa enheter kommer att ha en polaritet switch på det inställda tidsintervallet (ON och OFF).Steg 1: bakgrund HISTORIA:Hyperhidros är det tillstånd som kännetecknas av onormalt ökad svettning, [...

Göra en Arduino timer

Hi, så jag och min kompis sätter upp så att vi kan göra PCB´s. Vi för närvarande gör en UV exponering låda (eventuellt annan instrucable) och för detta rutan, vi behövde en timer, så detta är vad vi har gjort hittills och vad vi ska göra.Detta projek...

Arduino Timer

Hej alla, detta instructable handlar om hur man bygger ett stoppur / Timer med Arduino.Dragen av denna Timer: (kolla mer i djup Detaljer hur du använder dessa funktioner i "Kod/skiss" avsnitt1. du kan ange ett tidsmål för en händelse och också k...

STM32F103 Timer avbryta (med Keil och STMCubeMX)

I denna tutorial kommer jag Visa användning av avbrott med timers.Avbrottet är helt enkelt för att växla LED på vår STM32 styrelse.Denna handledning är uppdelad i tre steg:Steg 1: Skapa projekt i STM32CubeMXSteg 2: Programmering i KeilSteg 3: Visuali...

Arduino Time-Lapse Panorama Controller

Panorama Controller för GoPro kamerorStyrenheten kommer att rotera din GoPro över en set vinkel för en uppsättning varaktighet eller roterar du GoPro för full rotation för en uppsättning varaktighet.Detta projekt bygger på ursprungliga instructable m...

Arduino - Time BOMB Airsoft använder KYX 5461AS 4-siffriga 7 segment Display

Hej världen! Idag gjorde jag en enkel bomb med en 4 siffrig 7 segment Display (produkt nummer: KYX 5461AS). Det är mycket enkelt och igen kan användas för flera saker naturligtvis! Du utlösa det med en knapp, återställs automatiskt med watchog. AVR/W...

Arduino Vocal effekter Box

Detta Arduino-powered vocal effekter box pitch skiftar och snedvrider inkommande ljudsignalerna att producera ett brett utbud av vocal effekter. Detta projekt är min första experiment med realtid digital signalbehandling med Arduino. Det tar prov en...

3 kanal-Dimmer/fader för Arduino eller andra microcontroller

I ett tidigare instructable jag fram en enkel AC TRIAC-fader/dimmer som kan styras med en Arduino. I olika reaktioner jag fick, uttryckte ett antal personer sitt intresse för en 3 kanalfadern RGB. Men eftersom jag inte har sett några resultat av dess...

Arduino kontrollerade ljus dimmer

Varning: Vissa människor försöka bygga detta med en optocoupler med zerocrossing coz "som är bättre" rätt? Vissa får även höra i elektronik butiker är det bättre att använda sådan optocoupler. FEL. Detta fungerar endast med en random brand optoc...

Arduino hem basket Hoop poäng Detection System aka ScoreKeeper

Min lillasyster och jag hittade denna inomhus basket hoop (bilden ovan) på en container för några veckor sedan. Vi kom hem från kyrkan precis som två personer lossning det från sin lastbil. Vi beslutade att ta tag i det, tillsammans med tabellen air...

Arduino för växthusgaser, trädgården eller Growbox / uppdaterad April 2016

Jag har använt Attiny marker för bevattning uppgifter i min trädgård, men har planer på att bygga ett växthus, en Arduino tycktes vara vägen att gå eftersom det har fler portar. Jag vet, det finns många "Garduino" typ projekt redan, inklusive tw...

PIR rörelsedetektor med Arduino: Drivs på lägsta energiläge som konsumtion

Denna video visar snabbt och lätt strategi för att minska energiförbrukningen för ATMEGA 328P baserade Arduino styrelser med cirka 70-75% med PIR eller PID sensorer för rörelsedetektering.Detta projekt införs efter saker-1) gränssnitt Pyroelectric/Pa...

Från Arduino och perfboard att PCB med fristående MCU

Detta Instructable är en direkt efterföljare av denna. I slutet av detta bygga upp är min skivspelare projekt nästan klar (äntligen).Målet är att utveckla en snygg och arbetar PCB med SMD elektronisk med en arbetande ATtiny85 + programvara!Så är det...

Skicka och ta emot MIDI med Arduino

Detta instructable visar dig hur du använder en Arduino att skicka och ta emot en mängd olika MIDI-meddelanden så att du kan börja bygga din egen MIDI-controllers och instrument. Första jag ska prata lite om MIDI-protokollet, om du bara letar exempel...

Förbättrad Arduino Rotary Encoder behandlingen

Roterande pulsgivare är stor indataenheter för elektronik projekt - förhoppningsvis detta Instructable kommer att inspirera och hjälpa dig att använda en i ditt nästa projekt.Varför skriva rotationsencoder kod?Jag ville använda en låg kostnad rotatio...