Hallo zusammen, mal wieder ein Prolbem eventuell mit den Taster. Ich baue im Moment einen Funktonsgenerator auf DDS-Basis AD5932 als Abschlussarbeit. Jetzt habe ich das Problem, dass meine Steuerung über 4 Taster nicht richtig geht. Ich möchte ein Menü damit Steuern und die Signalform und die Frequenz einstellen können. Ich habe jetzt schon mit vielen Entprellvorschlägen rum gemacht, weil ich denke es könnte nicht richtig entprellt sein. Im Anhang mal den Menücode. Ich hatte eigentlich vor alles in einer entprell.h zu schreiben und im Menue aufzurufen. Als Controller habe ich einen Atmega 328p bzw. Atmega8. Das Display und die Taster hängen wie beim MiniMexle an PortC. Ich schalte also einmal auf Ausgang und einmal auf Eingang am PortC0 bis PC3. Da hängen die Taster dran. Mein Display ist ein simples LCD 2x16Zeichen. Ich hoffe es kann mir jemand helfen. Martin
Hier noch der Plan der Schaltung. PD4 geht auf RS vom Display und Interrupt des AD5932 auf PD6. Das ist im Plan noch falsch. Martin
Wie genau funktioniert das mit den Tastern? Was passiert, wenn kein Taster gedrückt ist? Enable ist dann unbeschaltet, das ist keine so gute Idee. Grüße, Peter
hallo, wenn kein Taster gedrückt ist soll er im aktuellen menüpunkt stehen bleiben. Mit S1 soll man die Menüs durchblättern, mit S2 und S3 umschalten (z.B. Frequenz erhöhen) und Taster S4 kann eventuell noch für Zusatzoptionen Aufruf eines weiteren optionenmenue, wo man z.B. das Ausgangsfilter überbrücken kann bzw. später vielleicht mal einen wobbelbetrieb machen kann, der aber eher nicht so sinnvoll ist, weil ja die Ausgangstufe usw. leider nicht ganz ideal gewählt sind. Können Sie mir eine entprell.h schreiben sicher gehet? Ich kann sonst meinen Fehler nicht weiter einkreisen. Martin
Martin Ernst schrieb: > Können Sie mir eine entprell.h schreiben sicher gehet? Ich kann sonst > meinen Fehler nicht weiter einkreisen. Du mußt sie doch nur aus der Codesammlung kopieren. Da sind kürzlich sogar einige lustige Erweiterungen erfolgt. Es gibt also nichts, was damit nicht möglich wäre. Sie kann quasi sogar Knoten in den Fingern erkennen. Deine "entprell.h" taugt, sehr höflich ausgedrückt, nichtmal soviel, wie das Schwarze unterm Fingernagel. Und eine Source heißt immer *.c, nie *.h. Peter
Hallo Peter, was würde Sie empfehlen? Welche Version sollte ich kopieren? Wieso kann ich keine entprell.h schreiben? Ich wollte es halt in einer separaten Datei haben, die im eigenltichen Menue eingebunden wird. Ich muss alt beachten, dass am PortC auch das display hängt. Wie erweitere ich die entsprechende Funktion? Bitte halten sie mich nicht für dumm, aber ich bin langsam Betribsblind, weil ich schon soviel probiere! Wäre toll wenn Sie mir dazu den Code schreiben bzw. den passenden mit der Umschaltung des Prot C auf Ausgang und eingang sodass das Display auch noch geht. Ich weiß normalerweise sollte ich das selber hinbekommen, aber die Zeit dräängt un ich brauche jetzt dinge die sicher sind! Vielen Dank! Martin
Martin Ernst schrieb: > was würde Sie empfehlen? Welche Version sollte ich kopieren? Beitrag "Universelle Tastenabfrage" > Wieso kann > ich keine entprell.h schreiben? Man kann alles, aber es gibt Konventionen, die sich bewährt haben. z.B. mehrere C-Files den Linker linken zu lassen. Die meisten IDEs haben deshalb die Option, ein C-File dem Build hinzuzufügen. > Ich muss alt > beachten, dass am PortC auch das display hängt. Auweia, das wird richtig tricky. Das LCD wird ja im Main-Kontext geschrieben, Tasten aber im Interrupt entprellt. Das beißt sich, da fällt mir erstmal keine Lösung ein. Kannst Du die Tasten nicht umlegen? Da sind doch noch Leitungen frei. Z.B. die SPI-Leitungen, werden ja zur Laufzeit nicht mehr benötigt. Peter
hi, wogenau sollte ich diese schöne funktion am besten setzen? Wieso um pflanzen? sind doch dioden mit drin. Außerdem geht es jetzt leider nicht mehr. Würde ich auch nicht mehr so machen! Martin
Hallo, die Funktion von Peter, war mir im Moment zu heavy. Ich habe mein Programm jetzt etwas umgestrickt und wollte versuchen ob es damit in den Griff zu bekommen ist oder ob ich endgültig massiv an der Hardware nach dem Fehler suchen muss. Im Anhang meine C-Files. Ich bekomme nun beim compelieren folgende Fehlermeldung: ../main.c:240: error: static declaration of '__vector_16' follows non-static declaration ../main.c:240: error: previous declaration of '__vector_16' was here Was kann das sein? Ich habe es so oft gesehen und meine es so gelernt zu haben. Was mache ich von der Syntax her falsch? LG Martin
takt10ms, takt100ms als volatile. Variablen, die ein Interrupt setzt und das Main abfragt, müssen volatile sein. Peter
Vergiss dein entprell. Nach jeder der 4 Tasten 100ms zu warten, ist Unsinn. Dein Hauptprogramm main hat ja schon eine 10msec Schleife, länger prellen deine Tasten nicht. uint8_t tasten_bisher=0,tasten; #define T1 (1<<PC0) #define T2 (1<<PC1) #define T3 (1<<PC2) #define T4 (1<<PC3) if (takt10ms == true) { DDRC &= ~( (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3)); PORTC |= T1|T2|T3|T4; delay_ms(1); tasten=~PINC & 0x0F; // invertiert, aktive Taste = 1 if(tasten!=tasten_bisher) // hast sich Tastenmässig was geändert... { uint8_t pressed=(tasten^tasten_bisher)&tasten; S1 = (pressed&T1) != 0; // Taster S1 gerade runtergedrückt S2 = (pressed&T2) != 0; // Taster S2 gerade runtergedrückt S3 = (pressed&T3) != 0; // Taster S3 gerade runtergedrückt S4 = (pressed&T4) != 0; // Taster S4 gerade runtergedrückt // vergiss den Kram mit S1_alt und S1_neu, // S1 ist nur in dem Durchlauf 1 wenn die Taste runtergedrückt wurde // statt if((s1_neu==0) && (s1_alt==1)) schreibst du nur if(S1) // willst du wissen, ob gleichzeitig noch T2 gedrückt ist frage nach: // tasten&T2 tasten_bishr=tasten; } PORTC = 0x00; //Pullupwiderstände deaktivieren DDRC |= ( (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3)); : : Auswertcode der Tasten, kann direkt auf Display schreiben weil Port : schon wieder auf Ausgang gesetzt und kein Synchronproblem auftritt : } : :
Hi Peter das mit dem volatile wollte ich probieren aber am Ende der Main meckert der Compiler, aber warum? Das mit dem static und non static vector beim Interrupt ist immer noch als Fehler da. Habe ich das mit dem volatile falsch verstanden? Kannst du bitte nocheinam schauen? ../DDS_1_4_mit_Menue.c:311: error: expected declaration or statement at end of input make: *** [DDS_1_4_mit_Menue.o] Error 1 ../DDS_1_4_mit_Menue.c:246: error: static declaration of '__vector_16' follows non-static declaration ../DDS_1_4_mit_Menue.c:246: error: previous declaration of '__vector_16' was here Das C-File, wo der Fehler auftritt habe ich angehängt. Was meinst du eigentlich zu meiner kleinen Entprellung? MaWin meint es sei so unötig. Kannst du das bestätigen? Vielen Danke! Martin
Hallo zusammen, ich bin mit meinem Latein am ende und muss doch die Arbeit abgeben, damit ich meine Ausbildung zum Techniker auf die Reihe bekomme. Ich hatte eine Version, die auf meinem MiniMexle scheinbar ging aber jetzt an der konkreten Hardware nicht mehr. Bitte helfen Sie mir! Das Problem mit dem static und non static habe ich jetzt scheinbar behoben bekommen, aber was jetzt noch mehr stört ist, dass mein Menü nicht so funktioniert wie gedacht und ich brauche es doch um die eigentlichen eventuelle Hardwarefehler meines Generators zu finden. Es macht gerade was es will und die entsprechende Auswahl wird auch nicht korrekt am Display angezeigt. Ich wollte für das Display die Funktion display() nutzen und für Menue menue(). Das Display wollte ich alle 100ms erneuern und das Menue alle 10ms, damit das Display nicht filimmert. Ist die Abtastung so fürs Menue und Display eine gute Wahl oder sollte ich ein gleiches Intervall für beide wählen? Wie sollte ich mein Menue schreiben, wenn folgendes funkttionieren soll: Taster Menuefunktion S1 Menue durchblättern (von Signalform --> Frequenz --> Signalform) S2 Signallform ändern ( TRI --> SIN --> REC) Freqeunen erhöhen ob Signalform oder Frequenz verstellt wirt hängt von der Menueebene ab S3 Signalform in umgekehrter Reihenfolge ändern bzw. Frequenz erniedrigen S4 im Moment unbenutzt
Nein da ist mir inzwischen nichts mehr sicher. Ich probiere schon so viel und weil die Zeit kanpp ist kann ich scheinbar nicht mehr klargenug und ruhig denken. Wie würden Sie es schreiben? Test halber habe ich mal das Minimexle, statt der Endhardware angeschlossen und im Moment springt er immer auf TRI zurück. Können Sie mir mal bitte zeigen wie Sie so ein Menue ungefähr aufbauen würden? Ich bin mir im Moment ziemlich unsicher. Vielen Dank für ihre guten Tipps. Martin Ernst
Vielleicht mal statt S1...S4 nen Namen vergeben (KEY_UP, KEY_MENU, KEY_DOWN), dann fallen Schreibfehler besser auf. Peter
> Sicher?
Das stimmt schon, da die Tasten low-aktiv sind,
und er den Übergang zwischen losgelassen nach gedrückt erkennen will.
Weil so was verwirrt, hab ich gleich ~PINC geschrieben :-)
Aber es ist natürlich Humbug, in einer 10msec Routine zu 100msec Delays
zu greifen.
NB: Wenn du Relais direkt an µC-Ausgänge hängst, dann solltest du Schottky-Dioden als Freilaufdioden verwenden, um den Pegel des Pins im zulässigen Rahmen zu halten.
Hallo Zusammen, vielen Dank schoneinmal für die vielen Tipps. Martin
Hi Martin! Ich würde es gern bauen, Sie würden kann, um zu tun, ein arbeitender übersetzte.hex Datei und Stromkreis-Diagramm!?
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.