Wochenend-Projekt: elektronischer Würfel v1.06

Die Firmware vom Würfel habe ich optimiert. Nun fällt er in den Schlafmodus wenn er nicht gebraucht wird und verbraucht dann nur noch 0.06 µA. Nach dem Tastendruck wacht er wieder auf und wird vom Watchdog resetet.

[pastacode lang=“c“ manual=“%2F*%0A%20*%20Wuerfel_V01_06.c%0A%20*%0A%20*%20Created%3A%2015.04.2018%2020%3A57%3A00%0A%20*%20Author%20%3A%20Bernd%0A%20*%0A%20*%0A%20*%20Chip%20type%3A%20Attiny13a%0A%20*%20Clock%20frequency%3A%20SUT_CKSEL%20auf%20INTRCoSC_128KHZ_14CK_64MS%20(128kHz%20%2F%208%20%3D%2016kHz)%0A%20*%0A%20*%09%09%09%09%09%09%09%09%09%09%09%09%09%20%20%2B——–%2B%0A%20*%20%20%20%20%20%20%20%20%5B%20rest%20(leer)%09%09%09%09%09%09%09(PB5)%20%7C1*%20%20%20%20%208%7C%20(VCC)%20%20Power%09%09%09%09%09%09%09%09%5D%0A%20*%20%20%20%20%20%20%20%20%5B%20Taster%09%09%09%09%09%09%09%09(PB3)%20%7C2%20%20%20%20%20%207%7C%20(PB2)%20%20LEDs%20-%20links%20unten%20%7C%20rechts%20oben%09%5D%0A%20*%20%20%20%20%20%20%20%20%5B%20LEDs%20-%20rechts%20unten%20%7C%20links%20oben%09(PB4)%20%7C3%20%20%20%20%20%206%7C%20(PB1)%20%20LEDs%20-%20mitte%20links%20%7C%20mitte%20rechts%09%5D%0A%20*%20%20%20%20%20%20%20%20%5B%20Ground%09%09%09%09%09%09%09%09(GND)%20%7C4%20%20%20%20%20%205%7C%20(PB0)%20%20LED1%09%09%09%09%09%09%09%09%5D%0A%20*%09%09%09%09%09%09%09%09%09%09%09%09%09%20%20%2B——–%2B%0A%20*%0A%20*%2F%20%0A%0A%23define%20F_CPU%2012800UL%20%2F%2FDalay%20anpassen%20wegen%20Fusebit%0A%2F%2F%23define%20F_CPU%20960000UL%20%2F%2FDalay%20anpassen%20wegen%20Fusebit%0A%0A%23define%20LED1_PIN%20%20%20%20%20%20%20%20PB0%0A%23define%20Taster%09%09%09PB3%0A%23define%20DELAY_MAX%20%20%20%20%20%20%20(512)%0A%23define%20DELAY_MIN%20%20%20%20%20%20%20(0)%0A%0A%23include%20%3Cavr%2Fwdt.h%3E%0A%23include%20%3Cstdint.h%3E%20%0A%23include%20%3Cutil%2Fdelay.h%3E%20%0A%23include%20%3Cavr%2Fio.h%3E%20%0A%23include%20%3Cavr%2Finterrupt.h%3E%20%0A%23include%20%3Cavr%2Fpower.h%3E%20%0A%23include%20%3Cavr%2Fsleep.h%3E%0A%0Aint%20Augenanzahl%20%3D%200%3B%20%2F%2F%20einfacher%20Z%C3%A4hler%20f%C3%BCr%20W%C3%BCrfel%20Augenanzahl%0Auint16_t%20min%2C%20sek%3B%0A%0Aint%20StartStopAni(int%20AnzahlBlinken)%3B%0A%0A%2F%2F%20Leere%20Interrupt-Routine%0AISR(PCINT0_vect)%0A%7B%0A%7D%0A%0A%09%0A%0Aint%20main(void)%0A%7B%0A%0A%09%2F%2FWatchdog%20ausschalten!%0A%09MCUSR%20%26%3D%20~(1%3C%3CWDRF)%3B%0A%09WDTCR%20%7C%3D%20(1%3C%3CWDCE)%20%7C%20(1%3C%3CWDE)%3B%0A%09WDTCR%20%3D%200×00%3B%0A%09%09%0A%09DDRB%20%3D((1%3C%3CLED1_PIN)%20%7C%20(1%3C%3CPB1)%20%7C%20(1%3C%3CPB2)%20%7C%20(1%3C%3CPB4))%3B%20%2F%2F%20Ports%20auf%20Ausgang%0A%09DDRB%3D%20~(1%3C%3CTaster)%3B%09%09%09%09%09%09%09%09%09%09%2F%2F%20Port%20auf%20Eingang%0A%09PORTB%20%7C%3D%20(1%3C%3CTaster)%3B%09%09%09%09%09%09%09%09%09%2F%2F%20Pullup%20f%C3%BCr%20Eingang%0A%09%0A%09StartStopAni(30)%3B%0A%09%0A%09PORTB%20%3D0b00001000%3B%0A%09%0A%09while%20(1)%20%2F%2F%20Endlos%20Schleife%0A%09%7B%20%0A%09%09for%20(min%3D10%3B%20min%3E%3D1%3B%20min–)%20%20%2F%2FSchleifen-konstruckt%2C%20wegen%20Zeit%20bis%20zum%20einschlafen%0A%09%09%7B%0A%09%09%09for%20(sek%3D1500%3B%20sek%3E%3D1%3B%20sek–)%0A%09%09%09%7B%0A%09%09%09%09_delay_ms(50)%3B%0A%09%09%09%09%09%09%09%09%0A%09%09%09%09if%20(!(PINB%20%26%20(1%3C%3CTaster)))%09%2F%2F%20Abfrage%20ob%20Switch%20gedr%C3%BCckt%0A%09%09%09%09%7B%0A%09%09%09%09%09%2F%2F%20Schleifenwerte%20nach%20bet%C3%A4tigen%20der%20Taste%20wieder%20hoch%20setzen%0A%09%09%09%09%09min%3D10%3B%20%0A%09%09%09%09%09sek%3D1500%3B%20%0A%09%09%09%09%09%0A%09%09%09%09%09PORTB%20%3D0b00001000%3B%0A%09%09%09%09%09_delay_ms(500)%3B%09%20%2F%2F%20kurze%20Pause%20-%20alle%20LEDs%20kurz%20aus%2C%20damit%20man%20sieht%20der%20W%C3%BCrfel%20w%C3%BCrfelt.%0A%09%09%09%09%09%0A%09%09%09%09%09switch(Augenanzahl)%09%2F%2F%20i%20Auswerten%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09case%200%3A%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%2F%2F%20Zahl%201%20–%3E%20i%3D0%0A%09%09%09%09%09%09%09PORTB%20%3D0b00000001%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09case%201%3A%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%2F%2F%20Zahl%202%20–%3E%20i%3D1%0A%09%09%09%09%09%09%09PORTB%20%3D0b00000100%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09case%202%3A%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%2F%2F%20Zahl%203%20–%3E%20i%3D2%0A%09%09%09%09%09%09%09PORTB%20%3D0b00000101%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09case%203%3A%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%2F%2F%20Zahl%204%20–%3E%20i%3D3%0A%09%09%09%09%09%09%09PORTB%20%3D0b00010100%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09case%204%3A%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%2F%2F%20Zahl%205%20–%3E%20i%3D4%0A%09%09%09%09%09%09%09PORTB%20%3D0b00010101%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09case%205%3A%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09%2F%2FZahl%206%20–%3E%20i%3D5%0A%09%09%09%09%09%09%09PORTB%20%3D0b00010110%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%7D%0A%09%09%09%09%09%0A%09%09%09%09%09%2F%2F%20Port%20wieder%20auf%20Eingang%20setzen%20(Pullup)%0A%09%09%09%09%20%20%20%20PORTB%20%7C%3D%20(1%3C%3CTaster)%3B%0A%0A%09%09%09%09%7D%0A%09%09%09%09Augenanzahl%2B%2B%3B%09%2F%2F%20bei%20jedem%20Schleifendurchlauf%20i%20Erh%C3%B6hen%0A%09%09%09%09if%20(Augenanzahl%3D%3D6)%20%2F%2F%20Wenn%20i%20%3D%206%20dann%20i%20wieder%20auf%200%20setzen%0A%09%09%09%09%7B%0A%09%09%09%09%09Augenanzahl%3D0%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09%0A%09%09%09StartStopAni(30)%3B%0A%0A%09%09%09%2F%2F%20Den%20ADC%20deaktivieren%2C%20brauchen%20wir%20nicht%20m%C3%BCsste%20aber%20pre%20Default%20aus%20sein.%0A%09%09%09power_adc_disable()%3B%0A%09%09%09%09%0A%09%09%09%2F%2F%20Pin-Change%20Interrupt%20f%C3%BCr%20die%204%20Taster%20erlauben%0A%09%09%09GIMSK%20%3D%20(1%3C%3CPCIE)%3B%0A%09%09%09PCMSK%20%7C%3D%20(1%3C%3CPB3)%3B%0A%09%09%0A%09%09%09sei()%3B%0A%09%09%09%0A%09%09%09PORTB%20%3D0b00001000%3B%20%2F%2F%20Sollten%20LEDs%20noch%20Leuchten%20vor%20Schlafen%20ausschalten.%0A%09%09%09%09%0A%09%09%09set_sleep_mode(SLEEP_MODE_PWR_DOWN)%3B%0A%09%09%09sleep_mode()%3B%0A%09%09%09%09%0A%09%09%09%2F%2F%20****************%20Aufwachen%20und%20alles%20f%C3%BCr%20den%20Reset%20%C3%BCber%20Watchdog%20vorbereiten%20******%0A%09%09%09wdt_enable(WDTO_1S)%3B%20%2F%2F%201s%20Sekunden%09Watchdog%20einstellen%09%0A%09%09%09wdt_enable(WDTO_30MS)%3B%20%2F%2F%2030ms%20Sekunden%09Watchdog%20einstellen%09%09%09%09%0A%09%09%09%09%09%09%09%09%09%09%0A%09%09%09%09%2F%2Ftu%20nix%20und%20warte%20auf%20den%20Biss%20des%20Wachhundes%0A%09%09%09%09_delay_ms(5000)%3B%20%2F%2F%20Der%20Wachhund%20ist%20auf%20eine%20Sek%20gestellt.%20Im%20Delay%20sind%20es%205%20Sekunden.%20-%20Also%20Reset%0A%09%09%09%09%2F%2F%20wdt_reset()%3B%0A%09%09%7D%0A%09%09%0A%09%7D%0A%09return%20(0)%3B%0A%7D%0A%0A%0A%0A%0Aint%20StartStopAni(int%20AnzahlBlinken)%0A%7B%0A%09for%20(int%20blink%3D0%3B%20blink!%3DAnzahlBlinken%3B%20blink%2B%2B)%20%2F%2F%20Blinken%20bis%20der%20Watchdog%20dem%20Spuk%20ein%20Ende%20macht%20oder%20die%20AnzahlBlinken%20erreicht%20ist%0A%09%7B%0A%09%09PORTB%20%5E%3D%20(1%3C%3CLED1_PIN)%3B%20%2F%2FToogle%20(Ein-%2C%20Ausschalten%20der%20LED%0A%09%09_delay_ms(50)%3B%20%2F%2F%20Warten%20damit%20LED%20eine%20Change%20hat%20zu%20blinken%0A%09%7D%0Areturn%20(0)%3B%09%0A%7D%0A%0A%0A%0A%0A%09%09%2F%2F%20wdt_reset()%3B%0A%0A%0A“ message=““ highlight=““ provider=“manual“/]

 

 

Dieser Beitrag wurde unter Elektronik, Microcontroller, Wochenend Projekte veröffentlicht. Setze ein Lesezeichen auf den Permalink.