Stap 2: Prototyping en bestanden!
Deze stap is ook nodig als je gewoon wilt bouwen van het project niet. Ik ga om te praten over de werking van de code en de hardware.
Ik ga nu de code regel voor regel doorlopen :D
De ATtiny24, 44, 84 serie heeft slechts 1 externe interrupt (INT0) [pagina 48 van het gegevensblad]. Dit is de interrupt die we meest vertrouwd zijn met het gebruik op de Arduino. U kunt gewoon gebruik maken van deze interrupt door te zeggen "attachInterrupt()"
Terwijl het had alleen 1 interrupt, ik wilde twee knoppen op mijn klok: één knop om de tijd en een ander aan het verminderen van de tijd te verhogen. Terugkijkend op het gegevensblad, de ATtiny heeft twee Pin wijzigen onderbreken poorten: PCINT0 en PCINT1 [pagina 48].
Het verschil tussen Externe onderbreekt en Pin wijzigen onderbreekt is dat een externe Interrupt eigen ISR (interrupt service routine heeft). PCINTerrupts delen een ISR voor alle pinnen op één poort. Dit betekent dat met Pin wijzigen onderbreekt kunnen we elke pin worden van een interrupt, maar dan moeten we gaan door de moeite om te bepalen welke pin veroorzaakt de interrupt op de poort.
Hier zijn twee echt goede artikelen te lezen. Dit is hoe ik geleerd:
- http://thewanderingengineer.com/2014/08/11/Arduino... PCINT in het algemeen
- http://thewanderingengineer.com/2014/08/11/PIN-Cha... PCINT op de ATtiny
Elk van deze variabelen bepaalt welk nummer wordt weergegeven op elk van de vier cijfers op het display van de zeepbel.
Ik heb verklaard hen volatiele omdat ze zal worden veranderd in de interrupt routines.
Optie 0 betekent wanneer mij zwenking voort mijn klok, zal de telling beginnen om 00:00 (12:00 AM).
Fysieke pinnen, 8(A5), 9(A4) en 10(A3) zal worden gebruikt met de 74HC595 shift register.
Het shift register zal ons toelaten om controle segmenten a, b, c, d, e, f, g en dp met pinnen Q0 Q1, Q2, Q3, Q4, V5, V6 en Q7 respectievelijk.
Als u wilt weergeven van elk cijfer, zullen we worden multiplexing.
Het display van de zeepbel is gemeenschappelijke kathode. Dit betekent dat wanneer het cijfer is geaard of trok naar een digitale laag, het cijfer zal oplichten. We zullen gebruiken fysieke pinnen 13(A0), 12(A1), 11(A2) en 7(A6) om de weergave van elk cijfer op het display van de zeepbel te besturen.
Dit zijn de enige waarden die we gebruiken zullen om de debounce van de twee knoppen wanneer de interrupt wordt geactiveerd. Één druk op de knop kan worden geregistreerd als vijf zonder debouncing, en met behulp van de klok zou vervelend.
Voorbeelden/digitale/ontdendering uit de Arduino controleren als u wilt.
Arduino kan lange variabelen bevatten. Ik zal met behulp van lange variabelen currentMillis en lastMillis te lezen van millis(); Na 49 dagen krijgt de waarde van de millis() te groot voor de microcontroller en overloop terug naar 0.
Dit is een slechte zaak als ik currentMillis en lastMillis om de debounce te vergelijken en de waarde van currentMillis 0 wordt ben. Ik zal later een beetje meer uitleggen.
Initialiseren wat spullen. secTime is de seconden teller en tictoc bepaalt of de stip of niet per seconde worden weergegeven.
In de setup-functie, zal ik verklaren de shift register pinnen en multiplexing pinnen als uitgang
Het volgende is het initialiseren van de Pin wijzigen onderbreekt.
cli(); is een functie die we moeten bellen interrupts uitschakelen.
GIMSK is de Algemene onderbreken masker te registreren, een register over de ATtiny. Check out pagina 51 van het gegevensblad om te kijken naar wat elke bit van het GIMSK-register doet.
0b00110000 draait op de 4e en 5e bits in het register, die PCIE0 en PCIE1 inschakelen. PCIE0 ingeschakeld Pin wijzigen onderbreekt voor de poort die pinnen 0 tot en met 7 heeft. PCIE1 ingeschakeld Pin wijzigen onderbreekt voor het deel dat pinnen 8 tot en met 11 heeft.
PCMSK0 is de Pin masker van het inschakelen van de verandering voor de pinnen 0 tot en met 7. Dit is geactiveerd vanuit de PCIE0. Ik wil om een interrupt op PCINT7 of op de ATtiny44 A7.
Om dit te doen ik activeren bit 7: 0b10000000 [pagina 53]
PCMSK1 is hetzelfde als PCMSK0 met uitzondering van pinnen 8 tot en met 11. Dit is geactiveerd vanuit de PCIE1. Ik wil een interrupt op PCINT10 inschakelen, of 8 pin.
Om dit te doen, mij in staat stellen de 2de bit: 0b00000100 [pagina 52]
Sei(); Hiermee schakelt u de interrupts.
display () is een functie die ik in de volgende stap uitleggen zal. Het is net wat je denkt dat het doet.
De beugel van code schakelt in principe de stip op het display 2 ooit tweede te simuleren tics en inhoudsopgaven.
Kortom, elke 1000 milliseconden, de code controleert of de tictoc 1 of 0 is. Als er 0, het Hiermee schakelt u de stip en tictoc ingesteld op 1. Als er 1, de stip uitgeschakeld en tictoc weer ingesteld op 0.
de + 10 en -10 zal zinvol later
In deze beugel zit ook een toename voor secTime, die telt hoeveel seconden zijn verstreken.
Als secTime 60 bereikt, verhogen we dig4 (minuten)
De volgende als lussen in feite bepalen wanneer het cijfer overloopt en moet opnieuw worden ingesteld. Bijvoorbeeld, als we 9 op dig4 hebben, het volgende moet 0 en dig2 moet worden verhoogd met 1.
Als dig1 (uur tientallen) is 2 en dig2 (uur degenen) is 4, wij herstellen de klok 00.
{ISR(PCINT0_vect)} is de interrupt routine die wordt uitgevoerd wanneer PCINT0 wordt geactiveerd door pin A7.
Deze functie wordt in principe ingesteld secTime op 0 en verlaagt dig4 door 1.
De volgende als lussen in principe omgaan met overloop.
De hele functie wordt omsloten door een debouncing als lus.
{ISR(PCINT1_vect)} is de interrupt routine die wordt uitgevoerd wanneer PCINT1 wordt geactiveerd door pin 8.
Dit doet in principe hetzelfde als de andere interrupt behalve toename in plaats van decrement.
Dit is wat gaande is in de schets van de WATCHG.ino. Om te verblijven georganiseerd, maakte ik een andere sketch ShiftDatas.ino te houden sommige variabelen en functies. In de volgende stap gaan we over die.