Forum: Mikrocontroller und Digitale Elektronik Probleme bei der Stueuerung über Taster!


von Martin E. (mrtnernst)


Angehängte Dateien:

Lesenswert?

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

von Martin E. (mrtnernst)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Martin E. (mrtnernst)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Martin E. (mrtnernst)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Martin E. (mrtnernst)


Lesenswert?

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

von Martin E. (mrtnernst)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

takt10ms, takt100ms als volatile.

Variablen, die ein Interrupt setzt und das Main abfragt, müssen volatile 
sein.

Peter

von MaWin (Gast)


Lesenswert?

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
  :
}
:
:

von Martin E. (mrtnernst)


Angehängte Dateien:

Lesenswert?

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

von Martin E. (mrtnernst)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

1
if((s2_neu==0) && (s1_alt==1))

Sicher?


Peter

von Martin E. (mrtnernst)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Vielleicht mal statt S1...S4 nen Namen vergeben (KEY_UP, KEY_MENU, 
KEY_DOWN), dann fallen Schreibfehler besser auf.


Peter

von MaWin (Gast)


Lesenswert?

> 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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Martin E. (mrtnernst)


Lesenswert?

Hallo Zusammen,

vielen Dank schoneinmal für die vielen Tipps.

Martin

von Cseplye Z. (beyond)


Lesenswert?

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
Noch kein Account? Hier anmelden.