Forum: Mikrocontroller und Digitale Elektronik Attiny13 ein Taster 2 funktionen?


von Dima (Gast)


Lesenswert?

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

von male (Gast)


Lesenswert?

So,,, bist die Sonja oder der Dima?
Auf d schnelle finde ich nichts außer dass die Pullups falsch gesetzt 
sind.


Gruß Male

von kopfkratzer (Gast)


Lesenswert?

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 ...

von male (Gast)


Lesenswert?

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

von Walter (Gast)


Lesenswert?

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

von kopfkratzer (Gast)


Lesenswert?

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 ...

von male (Gast)


Lesenswert?

Alles klar. Danke ich probier es aus und melde mich nochmal.

Danke

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.