www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Langes Drücken funktioniert nur bei einem Taster


Autor: Bastian F. (bastian_f)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Angelehnt an http://www.rn-wissen.de/index.php/Taster-Abfrage_in_C habe 
ich etwas rumgespielt und auch noch versucht den Code zu verstehen.
Beides hat noch nicht ganz funktioniert...
Es funktioniert nur das lange Drücken von Taster 1.
Bei 0 und 2 passiert nichts.
Alle Taster sind gleich geschaltet (Pull Down mit 10k).
(Habe auch die Taster selber mal getauscht um einen Hardware"schaden" 
auszuschließen, änderte aber nichts)
Kann mir jemand erklären woran das liegen könnte?

Hier der Code:
#define F_CPU 1000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> 
#include "taster.h"
#include "taster.c"

SIGNAL (SIG_OVERFLOW0)
{
    static unsigned char count_ovl0;
    unsigned char ovl0 = count_ovl0+1;

    if (ovl0 >= 39)
    {
        get_taster (0, PINB & (1<<PB0));
    get_taster (1, PIND & (1<<PD7));
    get_taster (2, PIND & (1<<PD6));
        
        ovl0 = 0;
    }

    count_ovl0 = ovl0;
}

void ioinit()
{

  PORTD |= 1 << PD7;
  PORTD |= 1 << PD6;
  PORTB |= 1 << PB0;
 
    /* Timer0 ohne Prescaler starten */
    TCCR0 = 1 << CS00;
 
    /* Timer0-Overflow-Interrupt aktivieren */
    TIMSK |= (1 << TOIE0);
}

int main()
{
   
     DDRC = 255;
    ioinit();
 
    /* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */
    tasten[0].mode = TM_SHORT;
    tasten[1].mode = TM_LONG;
    tasten[2].mode = TM_REPEAT;
 
    /* Interrupts global aktivieren */
    sei();

    /* Hauptschleife */
    while (1)
    {
        signed char tast = taster;
  
        switch (tast)
        {
            default:
            case NO_TASTER:
  
            break;
    
            case 0:
            
        PORTC |= (1 << PC3);
      
      break;
            
      case 0+TASTER_LONG:
            
          PORTC &= ~( (1 << PC5) | (1 << PC4) | (1 << PC3) );

            break;    

            case 1:
             
        PORTC |= (1 << PC4);

            break;
        
            case 1+TASTER_LONG:
        
        PORTC &= ~( (1 << PC5) | (1 << PC4) | (1 << PC3) );
                
            break;

      case 2:

        PORTC |= (1 << PC5);
      
      break; 

      case 2+TASTER_LONG:

        PORTC |= (1 << PC5) | (1 << PC4) | (1 << PC3);
        
      break;
        }
  
        if (tast != NO_TASTER)
            taster = NO_TASTER;

        /* ********************************** */
        /* Weiterer Code in der Hauptschleife */
    }
}

Autor: Bastian F. (bastian_f)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon gut...
Habs grade selber gesehen...

Lesen und verstehen for the win:

    /* Taster konfigurieren (#define NUM_TASTER 3 in taster.h) */
    tasten[0].mode = TM_SHORT;
    tasten[1].mode = TM_LONG;
    tasten[2].mode = TM_REPEAT;

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.