Attiny13 ein Taster 2 funktionen?

Gast #4023035
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
Gast #4023053
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 ...
Gast #4023079
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
Gast #4023096
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 ...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.