Forum: Mikrocontroller und Digitale Elektronik Tasterabfragen Problem


von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

Hey,

ich hab ein Problem mit meinem ATmega 328p und zwar funktioniert das 
auslesen der Taster überhaupt gar nicht.

Pull Up
PORTB |= (1<<Test_1);
Eingänge
DDRB &= ~(1<<Test_1);

.....
...
..
.

if (PINB & (1<<Test_1)) Case(1);

Das Problem hierbei ist, dass besagte if PIN Abfrage nicht eingelesen 
und verarbeitet wird.

Mfg,
euer Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter Z. schrieb:
> das auslesen der Taster überhaupt gar nicht
Wie sind denn die Taster angeschlossen?

> Das Problem hierbei ist, dass besagte if PIN Abfrage nicht eingelesen
> und verarbeitet wird.
Wie stellst du das fest?
Was erwartest du?
Und was passiert stattdessen?

Um es kurz zu fassen: das Problem liegt primär nicht im geposteten 
Code...

von grundschüler (Gast)


Lesenswert?

Peter Z. schrieb:
> if (PINB & (1<<Test_1))

bisdahin sieht das ok aus.

das case dann nicht mehr

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

@Lothar
>Wie sind denn die Taster angeschlossen?
Vom internen Pin Register per Draht zum Taster

>Wie stellst du das fest?
>Was erwartest du?
>Und was passiert stattdessen?

Das diese anfrage übersprungen wird und das Programm ab da stecken 
bleibt und nicht weiter läuft, egal was ich tue. Nur per reset besteht 
die Möglichkeit raus zu kommen.

@grundschüler
Das switch case funktioniert ja tadelos.

Mfg,
Peter

von Käse (Gast)


Lesenswert?

Peter Z. schrieb:
> Das switch case funktioniert ja tadelos.

Ich sehe in Deinem Programm kein switch case.

von Karl M. (Gast)


Lesenswert?

Peter,

Du meinst bestimmt der Taster ist zwischen AVR µC Eingang und Masse 
angeschlossen ?

So ein Taster prellt leider und hat nicht gleich zu Anfang und Ende eine 
definierten Zustand.

Dann fehlt Dir noch eine Flankenerkennung- Taster gedrückt und 
losgelassen.

Maxim/ Dallas hat das sehr schön auf Seite 3 abgebildet:

http://datasheets.maximintegrated.com/en/ds/MAX6816-MAX6818.pdf

Auf Seite 4 sieht man eine Hardware Entprellung, die mach auch "einfach" 
mit einem AVR µC programmieren kann.


Hier findest Du noch ein Übersicht der Möglichkeiten.
Einen weiteren Beitrag auch hier im Forum.
# http://www.lothar-miller.de/s9y/categories/5-Entprellung

von Der Andere (Gast)


Lesenswert?

Siehe Netiquette
Den Code reduzieren bis zum eigentlichen Problem und dann den kompletten 
Code posten und zwar einen compilierbaren.

von Chris L. (kingkernel)


Lesenswert?

> if (PINB & (1<<Test_1)) Case(1);
die if-Abfrage ist ok. Das Case nicht. Case(1) würde eine Funktion 
"Case" mit dem Parameter 1 aufrufen. Da muss der Compiler meckern, weil 
case ein reserviertes Wort ist.
Ausserdem ist es ziemlich redundant, wenn nicht sogar falsch, if und 
case gleichzeitig zu verwenden.

: Bearbeitet durch User
von Werner (Gast)


Lesenswert?

> Du meinst bestimmt der Taster ist zwischen AVR µC Eingang und Masse
> angeschlossen ?

> if (PINB & (1<<Test_1)) Case(1);
> die if-Abfrage ist ok.

Was denn nu?

Wenn der Taster gegen GND schaltet, ist wohl eher

if (~PINB & (1<<Test_1))
{
  // do sth.
}

die richtige Abfrage für Taster gedrückt.

Oder ist der Taster ein Öffner (das glaube ich nicht, Tim...)

Wernder

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

>Ich sehe in Deinem Programm kein switch case.
Der Progammcode ist nicht vollständig

@Karl M
Das mit den flanken ist selbstverständlich selbstverständlich, aber 
selbst dann würde er ja eigentlich teilweise funktionieren.

@ Der Andere
Der restliche Code funktioniert problemlos, es hängt momentan nur an den 
PIN Abfragen, bereits getestet mit Case(1); Case(3) etc..

@Chris L
Heißt im tatsächlichen Code GeheZu(1);

@Werner
Der Schalter schaltet nicht gegen GND.
Der Taster ist kein Öffner, bereits getestet.

von Karl M. (Gast)


Lesenswert?

Hallo Peter,

ich kann mir auch nicht Vorstellen, was man unter Case(1) verstehen 
sollte außer eine Funktion. Aber dann wäre da noch die Namensgebung zu 
switch case  ..

von grundschüler (Gast)


Lesenswert?

Peter Z. schrieb:
> Der Schalter schaltet nicht gegen GND.

Dann stimmt der pullup nicht

von Karl M. (Gast)


Lesenswert?

Also warten wir auf deinen kompletten Schaltplan und das reduzierte 
übersetzbare Programm !

Nebst deinem Makefile.

von schalter (Gast)


Lesenswert?

>Der Schalter schaltet nicht gegen GND.
>Der Taster ist kein Öffner, bereits getestet.

Da hat das eine mit dem anderen aber nix zutun.

von Peter Zwegat (Gast)


Angehängte Dateien:

Lesenswert?

So hier das Board mal simple dargestellt mit der Verkablung

Das reduzierte Programm wäre

Pull Up
PORTB |= (1<<Test_1);
Eingänge
DDRB &= ~(1<<Test_1);

switch case();
case(1);
etc....

LCD Display init

Auf LCD Display Werte ausgeben

Externer Interrupt(1)
{
Code
}
Externer Interrupt(0)
{
if (PINB & (1<<Test_1)) Case(1);
}

von Dietrich L. (dietrichl)


Lesenswert?

@Peter Z.:
grundschüler schrieb:
> Peter Z. schrieb:
>> Der Schalter schaltet nicht gegen GND.
>
> Dann stimmt der pullup nicht

Dazu solltest Du noch was sagen!

von Karl M. (Gast)


Lesenswert?

Hallo,

ich habe aus meinen Anfängen auch solch ein Board noch ohne USB ISP 
Adapter und hier sind die beiden Taster fest mit GND verbunden.

Aber ich sehe kein Programm noch habe ich ein Idee was das für 
Codefragmente sein sollen.

Und ich kann Hardware entwickeln und programmieren..
1
PINB & (1<<Test_1) Case(1);
fragt dein Eingang Test_1 auf <> 0 (true) ab.

Was da dieser Funktionsaufruf Case(1) soll, ist immer noch unklar, da 
die Funktion nicht definiert ist !

von Karl M. (Gast)


Lesenswert?

Sorry Peter,

das ist kein übersetzbares Programm (-stück).
Das muss schon alle Defines, Konstanten, Typedefs, Enums, Variable, 
Funktionen und das Mainprogramm enthalten.

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

Karl M. schrieb:
> Hallo,
>
> ich habe aus meinen Anfängen auch solch ein Board noch ohne USB ISP
> Adapter und hier sind die beiden Taster fest mit GND verbunden.
>
> Aber ich sehe kein Programm noch habe ich ein Idee was das für
> Codefragmente sein sollen.
>
> Und ich kann Hardware entwickeln und programmieren..
> PINB & (1<<Test_1) Case(1);fragt dein Eingang Test_1 auf <> 0 (true) ab.
>
> Was da dieser Funktionsaufruf Case(1) soll, ist immer noch unklar, da
> die Funktion nicht definiert ist !


case 1:
zeit(1000);
if (ss<61) ss++;
break;
etc...
sprich ein simple Uhr die ISR Abfragen sind für das Einstellen der Uhr

von F. F. (foldi)


Lesenswert?

Peter Z. schrieb:
>// Pull Up              auskommentiert?
> PORTB |= (1<<Test_1);
>// Eingänge             auskommentiert?
> DDRB &= ~(1<<Test_1);
>
> .....
>
> if (PINB & (1<<Test_1)) Case(1); Wenn irgendwas nicht funktioniert, dann mach 
doch mal eine Led statt dessen.
Ich nenne das Led-Debugging.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter Zwegat schrieb:
> Das reduzierte Programm wäre
Du sollst das Programm nicht bis zur Unverwendbarkeit reduzieren, 
sondern so weit, dass du noch deinen Fehler hast, aber ein übersetzbares 
und lauffähiges Programm vorliegt.

> So hier das Board mal simple dargestellt mit der Verkablung
Elektroniker unterhalten sich mit Schaltplänen. An fertigen Boards 
muss man immer erst Reverse-Engineering betreiben...

Hast du mal am uC-Pin gemessen, ob sich da was tut, wenn du den Taster 
drückst? Und wenn ja: was tut sich?

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

#include <avr/io.h>
#include <avr/interrupt.h>
#include "Zeit.h"
#include "myLcd.h"

//Taster Definitonen
#define Menu_Taster PC0
#define LED PC1





int main(void)
{
  DDRC |= (1<<LED);
  DDRC &= ~(1<<Menu_Taster);
  PORTC |= (1<<Menu_Taster);
    while(1)
    {
     if (PINC & (1<<Menu_Taster)) PORTC &= ~(1<<LED);
     else PORTC |= (1<<LED);
  }
}

So funktioniert zumindest schon einmal die Taster Abfrage richtig

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

Ab hier funktioniert es nicht mehr

int b = 0;
int a = 0;



int main(void)
{  //LCD Config
  lcd_initialisieren();
  lcd_led(1);

  DDRC |= (1<<LED);
  DDRC &= ~(1<<Menu_Taster);
  PORTC |= (1<<Menu_Taster);
  lcd_zahl(1,1, a, 2);
  lcd_zahl(1,4, b, 2);
    while(1)
    {
     if (PINC & (1<<Menu_Taster)) a++;
     else b++;
  }
}

: Bearbeitet durch User
von F. F. (foldi)


Lesenswert?

Peter Z. schrieb:
> So funktioniert zumindest schon einmal die Taster Abfrage richtig

Dann ist ja elektrisch schon mal alles klar und das Led-Debugging 
funktioniert.

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

F. F. schrieb:
> Peter Z. schrieb:
>> So funktioniert zumindest schon einmal die Taster Abfrage richtig
>
> Dann ist ja elektrisch schon mal alles klar und das Led-Debugging
> funktioniert.

Jaaa glücklicherweise nur ich hab keinen Plan wo es im Code liegen 
sollte

von Karl M. (Gast)


Lesenswert?

Peter,

ich hatte es schon geschrieben.
1
if (PINC & (1<<Menu_Taster)) { }
Hier fragst Du den Eingang auf nicht gedrückt ab !

Stichwort für Dich "Bitmanipulation"

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

Karl M. schrieb:
> Peter,
>
> ich hatte es schon geschrieben.
>
1
if (PINC & (1<<Menu_Taster)) { }
> Hier fragst Du den Eingang auf nicht gedrückt ab !
>
> Stichwort für Dich "Bitmanipulation"

Hab mir das mal genauer angeschaut, aber irgendwie bin ich auf keinerlei 
Lösung gekommen

Theoretisch wäre es ja ==0 oder !=0

Edit alles ausgetestet nichts hat funktoniert.

: Bearbeitet durch User
von Werner (Gast)


Lesenswert?

Peter Z. schrieb:
> Ab hier funktioniert es nicht mehr
>
> int b = 0;
> int a = 0;
>
> int main(void)
> {  //LCD Config
>   lcd_initialisieren();
>   lcd_led(1);
>
>   DDRC |= (1<<LED);
>   DDRC &= ~(1<<Menu_Taster);
>   PORTC |= (1<<Menu_Taster);
>   lcd_zahl(1,1, a, 2);
>   lcd_zahl(1,4, b, 2);
>     while(1)
>     {
>      if (PINC & (1<<Menu_Taster)) a++;
>      else b++;
>   }
> }

WAS funktioniert nicht mehr? Wir können alle nicht Hellsehen!
Was erwartest du?
Wenn if (PINC & (1<<Menu_Taster)) nicht zutrifft, ist deine Variable b 
nach schätzungsweise 32 ms übergelaufen und fängt wieder bei -(MAXINT) 
an zu zählen!?!?
Und auf dem Display wirst du diese Variable nie sehen, da Du sie ja nur 
einmal ausgibst. Und zwar bevor irgendetwas spektakuläres passsieren 
könnte.

Werner

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

Lediglich das mit einem Tastendruck das Variable a erhöht wird b war nur 
zu Testzwecken da.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Peter Z. schrieb:
> Ab hier funktioniert es nicht mehr
Kleiner Tipp: bitte Bedienungsanleitung lesen und [c] Tags verwenden...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter Z. schrieb:
> Ab hier funktioniert es nicht mehr
>      if (PINC & (1<<Menu_Taster)) a++;
>      else b++;
Sicher funktioniert das. Der uC zählt je nach Tasterstellung mit Vollgas 
entweder die eine oder die andere Variable hoch. Er macht, was du 
programmiert hast...

Aber sag doch mal, was wolltest du programmieren?

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Peter Z. schrieb:
> Edit alles ausgetestet nichts hat funktoniert.

ich vermisse immer noch Antworten:

Warum wird ein pullup eingeschaltet wenn der Taster nicht nach GND 
abgefragt wird?

Wenn der Taster doch nach GND abgefragt wird wo ist die Invertierung vom 
Inputport zur Maskierung vom Taster.

von Peter Z. (Firma: RTL Raus aus den Schulden) (peterzwegat)


Lesenswert?

Fixxed #deletequest

von Werner (Gast)


Lesenswert?

ne ne ne

nicht so einfach. Vielleicht gibst Du noch mal eine Antwort, woran es 
lag. Dann haben andere, die diesen Thread finden auch noch ne Chance zu 
lernen?!

Werner

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.