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
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...
@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
Peter Z. schrieb: > Das switch case funktioniert ja tadelos. Ich sehe in Deinem Programm kein switch case.
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
Siehe Netiquette Den Code reduzieren bis zum eigentlichen Problem und dann den kompletten Code posten und zwar einen compilierbaren.
> 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
> 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
>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.
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 ..
Also warten wir auf deinen kompletten Schaltplan und das reduzierte übersetzbare Programm ! Nebst deinem Makefile.
>Der Schalter schaltet nicht gegen GND. >Der Taster ist kein Öffner, bereits getestet. Da hat das eine mit dem anderen aber nix zutun.
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); }
@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!
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 !
Sorry Peter, das ist kein übersetzbares Programm (-stück). Das muss schon alle Defines, Konstanten, Typedefs, Enums, Variable, Funktionen und das Mainprogramm enthalten.
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
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.
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?
#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
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
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.
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
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"
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
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
Lediglich das mit einem Tastendruck das Variable a erhöht wird b war nur zu Testzwecken da.
Peter Z. schrieb: > Ab hier funktioniert es nicht mehr Kleiner Tipp: bitte Bedienungsanleitung lesen und [c] Tags verwenden...
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.