mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Komisches Verhalten beim Tastendruck


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend,

Ich habe hier einen Tiny2313 an dem sind drei Taster ein MosFed, ein 
Summer und ein LCD. Der Tiny soll meinen LED Belichter steuern und zwar 
habe ich zwei Taster mit dennen ich die Zeit einstellen kann. Das wäre 
bei checkButtons() die ersten zwei PIND3 u. PIND2.

Die beiden funktionieren einwandfrei. Der dritte Button auf PIND6 aber 
nicht. Wird die Variabel status auf 0 gesetzt steht die Zeitschaltuhr 
still. Bei status 1 läuft die Zeitschaltuhr.

Sobald ich Strom draufgebe Startet die Zeitschaltuhr sofort und das LED 
Array ist an. Das sollte es aber nicht! Sobald ich den Taster an PIND6 
drücke geht es aus. Ich kann mir nicht erklären da die drei Taster 
indentisch eingebaut sind.

THX 4 Help
Daniel

#include "LEDBelichter.h"

uint8_t status;
uint8_t beep;
volatile unsigned long Sekunden=30;
volatile unsigned long Minuten=8;
ISR(TIMER1_COMPA_vect)
{
  if(status == 1)
  {
    if(Minuten == 0 && Sekunden == 0)
    {
      status = 2;
    } 
    else 
    {
      if(Sekunden == 0)
      {
        Minuten--;
        Sekunden = 59;
      }
      else
      {
        Sekunden--;
      }  
    }
  }
}

// PIND0 MosFet [Ausgang]
// PIND1 Summer [Ausgang]
// PIND2 JP2 -> [Eingang]
// PIND3 JP1 -> [Eingang]
// PIND6 JP3 -> [Eingang]
void init()
{
  status = 0;
  beep = 1;
  lcd_init(LCD_DISP_ON);
  //Registerinitialisierung
  TCCR1A = 0b00000000;                      //Timer im CTC-Mode; Prescaler 256; CPU-Clock
  TCCR1B = 0b00001100;                      //Timer im CTC-Mode; Prescaler 256; CPU-Clock
  TCCR1C = 0b00000000;                      //Timer im CTC-Mode; Prescaler 256; CPU-Clock
  TIMSK  = 0b01000000;                      //Interrupt bei Compare Match
  OCR1A  = 62499;                          //genau eine Sekunde; Comparematch-Register

  DDRD &= ~((1<<DDD2)|(1<<DDD3)|(1<<DDD6));
  DDRD |= (1<<DDD1) | (1<<DDD0);    
  PORTD = ((1<<PD2) | (1<<PD3) | (1<<PD6));
  sei();


}

int main(void)
{

    init();
  
  for (;;) 
  { 
     if( (!(PORTD & (1 << PD0))) && status == 1) // LED-Array
     {
      PORTD |= (1<<PD0);

     } else if (status == 0 || status == 2){
      PORTD &= ~(1<<PD0);
     }
     if(status == 2 && beep == 1) //beep
     {
       cli();
      uint8_t i;
      for(i=0;i<4;i++)
      {
        PORTD |= (1<<PD1);
        _delay_ms(1000);
        PORTD &= ~(1<<PD1);  
        _delay_ms(1000);
      }
      beep = 0;
      sei();
     }
     
     checkButtons();
     _delay_ms(100);
     updateLcd();
  }
}

void checkButtons()
{
    if(PIND & (1<<PIND3))
  {
    cli();
    status = 0;
    if(Sekunden <= 55)
    {
      Sekunden += 5;
    } 
    else 
    {
      Sekunden = 0;
      if(Minuten <= 30)
        Minuten++; 
    }

    sei();
  }
  if(PIND & (1<<PIND2))
  {
    cli();
    status = 0;
    if(Sekunden >= 5)
    {
      if(Sekunden == 59)
      {
        Sekunden -= 4;
      } 
      else
      {
        Sekunden -= 5;
      }
    } 
    else 
    {
      Sekunden = 59;
      if(Minuten > 0)
        Minuten--; 
    }

    sei();
  }
  if(PIND & (1<<PIND6))
  {
  
    if(status == 0)
    {
      cli();
      status = 1;  
      beep = 1;
      sei();
    }
    
  }
}



void updateLcd()
{
  lcd_clrscr();
    lcd_gotoxy(0,0);
  lcd_puts("Status: ");
  switch(status)
  {
    case 0:
      lcd_puts("STOP");
    break;
    case 1:
      lcd_puts("RUN");
    break;
    case 2:
      lcd_puts("END");
    break;
    default:
      lcd_puts("NDEF");
  }
  lcd_gotoxy(0,1);
    lcd_puts("Zeit: ");
  lcd_puts(getCharFromInt(Minuten/10));
  lcd_puts(getCharFromInt(Minuten%10));
  lcd_puts(":");
  lcd_puts(getCharFromInt(Sekunden/10));
  lcd_puts(getCharFromInt(Sekunden%10));
}
char *getCharFromInt(uint8_t index){
  switch(index)
  {
    case 0:
      return "0";
    break;
    case 1:
      return "1";
    break;
    case 2:
      return "2";
    break;
    case 3:  
      return "3";
    break;
    case 4:
      return "4";
    break;
    case 5:
      return "5";
    break;
    case 6:
      return "6";
    break;
    case 7:
      return "7";
    break;
    case 8:
      return "8";
    break;
    case 9:
      return "9";
    break;
  }
  return "?";
}

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab mir nur die ersten Zeilen angeschaut;
status sollte auf jeden Fall volatile sein!

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, google mal nach entprellen

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Werner
Prellen kann ein Taster nur wenn er betätigt wird.

Aber ich hab das Problem gelöst. Manchmal hilft einfach etwas Abstand.

Ich bin davon ausgegangen das 2 Taster funktionieren und einer nicht. 
Das war nicht richtig! Alle 3 haben getriggert, nur hat sich 1 und 2 
gegenseitig neutralisiert. Hätte ich die Uhr > 1 Min eingestellt hätte 
ich gesehen das es bei 59 Sekunden stopt.

thx 4 help war mir aber klar das ich irgendwo wieder dünpfiff produziert 
habe^^

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.