Tasterabfragen Problem

OP (Firma: RTL Raus aus den Schulden) #4469224
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
Moderator (Firma: Titel) Persönliche Seite #4469229
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...
OP (Firma: RTL Raus aus den Schulden) #4469237
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
Gast #4469248
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
#4469262
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.
Gast #4469280
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
OP (Firma: RTL Raus aus den Schulden) #4469295
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.
Gast #4469388
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);
}
Angehängte Dateien:
Gast #4469398
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 !
OP (Firma: RTL Raus aus den Schulden) #4469401
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
Moderator (Firma: Titel) Persönliche Seite #4469429
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?
OP (Firma: RTL Raus aus den Schulden) #4469445
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
OP (Firma: RTL Raus aus den Schulden) #4469449
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++;
  }
}
OP (Firma: RTL Raus aus den Schulden) #4469543
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.
Gast #4469591
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren