Hallo ich versuche mit ei ATtiny13A eine LED über ein Taster ein- und auszuschalten. Irgendwie stehe ich gerade aufm Schlauch. Die LED will einfach nicht schalten. Kann mir jmd. helfen und sagen was ich hier falsch mache? Der CODE ************************************************************************ **** /* * Button_test.c * * Created: 21.02.2015 17:33:34 * Author: Sonja */ #include <avr/io.h> #include <avr/interrupt.h> // fixed variable register unsigned char btn_states asm("r8");//bit0:up(0),down(1) //global variable unsigned char btn_state_last = 0; //macro #define BTN_PRESSED (btn_states & 0x08) #define BTN_TIPPED (btn_states & 0x02) inline void init() { DDRB = 0x08;//Directions XXXX 1XXX as output PORTB = 0xF8;//Pull Ups } inline void readinput() { //button 1 select channel: PB1 xxxx xx1x if(PINB &(1<<PB1)) { btn_states &= 0xFE; } else { btn_states |= 0x01; } } inline void getButtonStates() { if((btn_states & 0x01) != (btn_state_last = 0x01)) { if(btn_states & 0x01) { btn_states |= 0x08; } else { btn_states &= 0xFB; } } btn_state_last = btn_states; } int main(void) { unsigned char switch_on_marker = 0; char global_on_off = 0; btn_states = 0x00; // Bit0:up(0)/down(1), bit1:tipped(1), bit2:hold(1), bit3:untouched(1) btn_state_last = btn_states; int button = 0; int release = 0; while(1) { if(BTN_PRESSED) { btn_states &= 0xF7; if(global_on_off == 0) //was off -> on { DDRB |= 0x08; PORTB |= 0x08; global_on_off = 1; switch_on_marker = 1;// remember button state and dont turn of when release } } else if(BTN_TIPPED) { btn_states &= 0xDF; if(switch_on_marker == 1) { if(global_on_off == 1) { DDRB &= 0xFF; PORTB &= 0xFF; global_on_off = 0; switch_on_marker = 0; } } } } } ************************************************************************ ******* Danke Gruß Dima
So,,, bist die Sonja oder der Dima? Auf d schnelle finde ich nichts außer dass die Pullups falsch gesetzt sind. Gruß Male
kopfkratz Wo ist die Entprellung des Tasters ? Warum so kompliziert mt Register als Variable ? Oder soll das von einer externen Quelle kommen, dann wäre ein IRQ wohl die bessere wahl ? Also wie immer wieder zuwenige Infos WAS es eigentlich tun soll ! Beschreibung der Hardware wäre auch sinnvoll ...
kopfkratzer schrieb: > kopfkratz > Wo ist die Entprellung des Tasters ? > Warum so kompliziert mt Register als Variable ? > Oder soll das von einer externen Quelle kommen, dann wäre ein IRQ wohl > die bessere wahl ? > Also wie immer wieder zuwenige Infos WAS es eigentlich tun soll ! > Beschreibung der Hardware wäre auch sinnvoll ... Ich wusste nicht wie es anders gehen soll(bin rooky was C angeht) HW: ein Taster an portb PB1 soll an Portb PB3 LED einschalten und beim zweitenmal ausschalten. Mehr hängt da nicht. Hast du dazu ein Bsp Prog. Gruß Dima
Dima schrieb: > if((btn_states & 0x01) != (btn_state_last = 0x01)) was soll das werden, Zuweisungen in Bedingungen sind sehr fehlerträchtig, auf jeden Fall aber unübersichtlich und von Entprellung sehe ich auch nichts im Programm
male schrieb: > kopfkratzer schrieb: >> kopfkratz >> Wo ist die Entprellung des Tasters ? >> Warum so kompliziert mt Register als Variable ? >> Oder soll das von einer externen Quelle kommen, dann wäre ein IRQ wohl >> die bessere wahl ? >> Also wie immer wieder zuwenige Infos WAS es eigentlich tun soll ! >> Beschreibung der Hardware wäre auch sinnvoll ... > > Ich wusste nicht wie es anders gehen soll(bin rooky was C angeht) > > HW: ein Taster an portb PB1 soll an Portb PB3 LED einschalten und beim > zweitenmal ausschalten. > > Mehr hängt da nicht. > > Hast du dazu ein Bsp Prog. > Gruß Dima Ahaaa :-P Nein Deine Hausaufgabe mache ich nicht. Es gibt C-Tutorials hier und wenn Du Entprellung suchst findest Du eine gute von PeDa. Du brauchst auch nur eine globale Variable die den Status enthält, kein Register extra dafür deklarieren. Also lies erstmal http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Dann geht's weiter ...
Alles klar. Danke ich probier es aus und melde mich nochmal. Danke
Dima schrieb: > inline void init() > { > DDRB = 0x08;//Directions XXXX 1XXX as output > PORTB = 0xF8;//Pull Ups > } > int main(void) > { // where is init() ? > }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.