Forum: Mikrocontroller und Digitale Elektronik Nummerneingabe SwitchCase AVR


von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich bin momentan an einem größeren Projekt und hänge momentan an der 
Eingabe einer Telefonnummer.
Ich wollte es mit Switch Case Funktionen realisieren. Hierbei sollte 
INT1 als ENTER Taste dienen und nach der Zahlenauswahl über die PCINT 
Tasten das weiterspringen ermöglichen.
Leider klappt es nicht, so wie gewollt.

Den Quelltext hab ich als PDF angehängt... hoffe das ist ok.
Ich weiß, dass dort einige #include drin sind, die ich hier nicht 
benötige, als auch einige andere Programmteile, jedoch benötige ich 
diese in meinem Gesamtprogramm.

... ja ich weiß, dass man keine _delays in der ISR ausführt und habe es 
dennoch gemacht :D


Wäre super, wenn mir jemand helfen könnte.

Herzlichen Dank und beste Grüße
Christoph

von Zensur (Gast)


Lesenswert?

Christoph schrieb:
> Den Quelltext hab ich als PDF angehängt... hoffe das ist ok.

Nein ist es nicht.

Alle Hinweise beim Posten beachten!

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

Vielleicht passt das besser...

von Max B. (citgo)


Lesenswert?

Christoph schrieb:
> Vielleicht passt das besser...

Noch schlechter!!

Ich blicke da im Moment aber nicht ganz durch.
Woher kommen die Zahleneingaben? Und was genau funktioniert nicht? Wieso 
muss ENTER per Interrupt gemacht werden?

von Christoph (Gast)


Lesenswert?

Mit den PCINT- Tasten zählt die Variable z1... zn durch und wird auf dem 
LCD ausgegeben.
Wenn die Zahl gewählt wurde, soll mit Enter INT 1 die nächste Zahl 
angesprungen werden um wieder mit den PCINT- Tasten  die Zahl wählen zu 
können.

Das Problem ist das Bestätigen und weiter springen zur nächsten Zahl, 
hier durchläuft es alle Abschnitte der ISR INT1 und gibt mir dann die 
Zahlen 10,11,12,13,... auf dem Bildschirm aus.

ENTER habe ich über Interrupt ausgeführt, da ich kein polling möchte, 
bzw. weil diese Nummerneingabe nur ein Teil meines Programms ist und ich 
somit diesen Programmteil einfacher in das weitere Programm einbinden 
könnte.

von Nick M. (Gast)


Lesenswert?

Wenn ich sowas sehe:
1
void zahl11 (){
2
  if(z11<9
3
    {z11++;}
4
  else
5
   z11=0;
6
  ...
höre ich sofort zu lesen auf.

von Christoph (Gast)


Lesenswert?

Sehr geehrter Herr Mueller,

es tut mir äußerst Leid ihre wertvolle Zeit geraubt zu haben und 
scheinbar bin ich auch soweit gegangen, dass Sie sich gezwungen gefühlt 
haben, diese Frage meinerseits zu kommentieren.

Glauben Sie mir bitte, könnte ich perfekt programmieren und würde mir 
Programme mal geschwind aus dem Ärmel zaubern, hätte ich hier keine 
Frage gestellt. Ich versuche die Programme erst selbst zum laufen zu 
bringen und wende mich erst wenn ich wirklich am verzweifeln bin  an die 
Gemeinde hier.

Da ich aber kein Programmier- Gott bin und dennoch versuche etwas hin zu 
bekommen habe ich mich erdreistet hier meinen unprofessionellen 
Quelltext einzustellen. Darum bitte ich Sie es doch einfach wie beim 
Unfall auf der Autobahn zu machen: Handy weg, Augen gerade aus und 
einfach dran vorbei fahren. Hilft denen die Helfen wollen und schützt 
die die Hilfe brauchen.

Herzlichen Dank für Ihr Verständnis!

Mit freundlichen Grüßen Christoph

von Nick M. (Gast)


Lesenswert?

Christoph schrieb:
> Hilft denen die Helfen wollen und schützt die die Hilfe brauchen.

Verhindert nicht, dass man ohne Führerschein keine Kraftfahrzeuge 
bedienen sollte.

von Yeet (Gast)


Lesenswert?

Nick M. schrieb:
> Verhindert nicht, dass man ohne Führerschein keine Kraftfahrzeuge
> bedienen sollte.

Und man soll auch keine Fahrschule (mikrocontoller.net) nutzen um das 
Fahren zu erlernen und einen Führerschein zu erlangen? Schreib halt mal 
objektiv was dir nicht passt
an:
void zahl11 (){
  if(z11<9
    {z11++;}
  else
   z11=0;

von Nick M. (Gast)


Lesenswert?

Yeet schrieb:
> Schreib halt mal
> objektiv was dir nicht passt

Dass der Code demonstriet, dass der Schreibsler sich absolut keine 
Gedanken gemacht hat, was er so schreibt.
Ich werfe mal den Begriff "array" aufs Spielfeld.

von vn nn (Gast)


Lesenswert?

Eine erste Idee wäre ja, den Quellcode als *.c-File anzuhängen wie 
normale Menschen das tun. Ihn in ein PDF zu drucken und das dann 
anzuhängen, das hat schon was.

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

> Eine erste Idee wäre ja, den Quellcode als *.c-File anzuhängen wie
> normale Menschen das tun.

Damit kann der unnormale Mensch dienen. :D

von Oliver S. (oliverso)


Lesenswert?

Christoph schrieb:
> Das Problem ist das Bestätigen und weiter springen zur nächsten Zahl,
> hier durchläuft es alle Abschnitte der ISR INT1 und gibt mir dann die
> Zahlen 10,11,12,13,... auf dem Bildschirm aus.

Je nun, der Computer ist doof, und macht immer genau das, was du ihm ins 
Programm schreibst.

Geh den Code halt Zeile für Zeile durch, und überlege, was da passiert.

Oliver

von Brummbär (Gast)


Lesenswert?

Christoph schrieb:
> Leider klappt es nicht, so wie gewollt.

Dann schreibe bitte auch hin, was das Programm tun soll und was es 
stattdessen tut. Das erleichtert einiges.

Christoph schrieb:
> hier durchläuft es alle Abschnitte der ISR INT1 und gibt mir dann die
> Zahlen 10,11,12,13,... auf dem Bildschirm aus.

Meine erste Idee, ohne den Quellcode gesehen zu haben, sind prellende 
Tasten.
Du brauchst also zunächst eine saubere Entprellung.

Da ich doch noch kurz auf den Quellcode gesehen habe, rate ich Dir, 
etwas über Arrays und Funktionsparameter zu lesen.

Auch der Delay in der INT-Routine ist sträflich. Wenn Du es doch tust, 
obwohl Du weißt, das man sowas nur in begründeten Ausnahmefällen macht, 
darfst Du dich nicht wundern, dass es nicht geht.

von Adam P. (adamap)


Lesenswert?

Yeet schrieb:
> Schreib halt mal objektiv was dir nicht passt an:
1
void zahl2 (){
2
  if(z2<9){
3
    z2++;}
4
    else
5
    z2=0;

Bei so einer Code-Gestaltung darf man sich nicht wundern, wenn man den 
Überblick verliert.

Brummbär schrieb:
> Meine erste Idee, ohne den Quellcode gesehen zu haben, sind prellende
> Tasten.

Dies würde ich auch nicht ausschließen.


Nick M. schrieb:
> Ich werfe mal den Begriff "array" aufs Spielfeld.

Ja das würde vieles erleichtern und du kannst auch ALLE deine zahl() 
Funktionen durch 1 ersetzen.


Versuch dir mal zu überlegen, was eigentlich passieren soll und pack die 
ganze Logik nicht in die ISR.

Im Interrupt kannst du dir ein Flag setzen, das wars dann auch.
In der main kannst dann deine Entprellung machen und daraus ein "Event" 
generieren (im einfachsten Fall wieder ein Flag).

Dann kannst du darauf reagieren und die Eingabe weiter verarbeiten.

Leider kann ich auf anhieb die Logik deines Codes nicht nachvollziehen, 
geschweige verstehen, was du eigentlich vorhast.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Christoph schrieb:
> Nummerneingabe.pdf

Was ist DAS ?

Tasteneingabe per PinChange Interrupt,
AUF und AB auf einem Taster.

Bitte erst mal Grundlagen lesen
und an Beispielen lernen.

von Brummbär (Gast)


Lesenswert?

MaWin schrieb:
> AUF und AB auf einem Taster.

Sieht nur nach "AUF" aus. Jedenfalls habe ich weder "--" noch eine 
Prüfung auf "<0" gesehen.

Beitrag #6131962 wurde von einem Moderator gelöscht.
von Tom (Gast)


Lesenswert?

Das ist echt traurig was ihr hier abzieht. Wenn er's besser wüsste hätte 
er nicht gefragt

: Wiederhergestellt durch Moderator
Beitrag #6132108 wurde von einem Moderator gelöscht.
von Nick M. (Gast)


Lesenswert?

Tom schrieb:
> Das ist echt traurig was ihr hier abzieht. Wenn er's besser wüsste hätte
> er nicht gefragt

Damit es mancher versteht "was hier abgezogen" wird:
Ich mach mir öfters den Spass Fehler in fremden Code zu finden. Ich mach 
das freiwillig und zu meinem Vergnügen. Wenn ich aber einen Quältext ... 
ähhh ... Quelltext sehe, der nur Kraut & Rüben ist, dann vergeht mir die 
Lust ganz schnell.
Ich denk mir dann, dass der TO sich selbst doch "etwas" mehr Gedanken 
machen soll, bevor er zig Andere damit beschäftigt. Und grad hier ist es 
so, dass es dem TO an Grundlagenwissen fehlt. Letztendlich müsste ihm 
jemand den Senf komplett neu schreiben. Viel Glück dabei!

Ja, ich selbst mach auch dumme Fehler! Ich behaupte sogar, dass meine 
Fehler brilliant sind!

Aber hier geht es nicht um einen Fehler, hier geht es um eine kaputte 
Gesamtstruktur. Und die sollte sich der TO doch bitte selbst erarbeiten, 
paar Hinweise hat er ja schon.

Beitrag #6132133 wurde von einem Moderator gelöscht.
Beitrag #6132296 wurde von einem Moderator gelöscht.
von Adam P. (adamap)


Lesenswert?

Nick M. schrieb:
> Ich mach mir öfters den Spass Fehler in fremden Code zu finden. Ich mach
> das freiwillig und zu meinem Vergnügen.

Genau so sehe ich es auch!

Aber wie bereits erwähnt:

Nick M. schrieb:
> Aber hier geht es nicht um einen Fehler, hier geht es um eine kaputte
> Gesamtstruktur.

Tom schrieb:
> Das ist echt traurig was ihr hier abzieht. Wenn er's besser wüsste hätte
> er nicht gefragt

Ich denke, hier sind die meisten sehr hilfsbereit und wären die letzten 
die nicht helfen wollen würden - aber das Problem (die Probleme / 
Fehler) vom TO lassen sich nicht mit einer Antwort erledigen.

Da muss erstmal an der Grundstruktur was geändert werden, dann kann man 
gerne über "Fehler" sprechen und sie gemeinsam lösen.

Fürs erste kann man da leider nur grundlegende Tipps geben.

von Adam P. (adamap)


Lesenswert?

@ Christoph (Gast)

Hab da ein paar Fragen:

Welchen AVR nutzt du?

Wie sieht dein Hardwareaufbau aus? (evtl. kleine Skizze)
Hast du nur eine Taste für die Eingabe aller 10 Zahlen?

Vllt. erläuterst du mir nochmal kurz wie der Ablauf sein soll.


Edit:

Adam P. schrieb:
> Leider kann ich auf anhieb die Logik deines Codes nicht nachvollziehen,
> geschweige verstehen, was du eigentlich vorhast.

Ok, jetzt versteh ich was du vorhast...
Aber die Eingabe auf eine fixe Länge festzulegen ist nicht so optimal.

Bsp.:
- 0301234 (7 Stellen)
- 015112345678 (12 Stellen)

: Bearbeitet durch User
von Michael M. (michael89)


Lesenswert?

Hallo Zusammen,

> void zahl2 (){
>   if(z2<9){
>     z2++;}
>     else
>     z2=0;

Was dir hier noch durch die Blume vermittelt worden ist, guck dir 
erstmal die Syntax an dein else pfad ist falsch ;)

Zusammen gefasst das man dir überhaupt helfen kann.

1.) Skizze vom der Hardware (am besten ein Schaltplan)
2.) Falls das nicht aus dem Schaltplan hervorgeht..welchen µController 
benutzt du, welche Peripherie
3.) Was macht die Schaltung --> Was sollte die Schaltung machen.

Abgesehen davon Syntax der Sprache angucken.

UND WENN MAN WEIß DAS MAN WAS NICHT MACHEN SOLL NICHT MACHEN !! Kein 
Delay in einer ISR wenn man davon keine Ahnung hat.


Hoffe das hilft dir weiter um uns zu helfen dir zu helfen ;)

Gruß
Michael

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,


ich nutze das Xplained mini 328PB.

Mir reicht es völlig, wenn die Zahlen in einer Schleife hoch gezählt 
werden können. Das hochzählen hat mit meinem Quältext (was hab ich 
gelacht) funktioniert, ist wohl aber nicht zielführend.

Bei PD3 handelt es sich um den "ENTER/Bestätigen" Taster.
Zum switchen der Zahlen habe ich einen weiteren Taster an PD5 oder PD6.

Mein Ziel war es die einzelnen Zahlen in ein Array zu schreiben, dieses 
Array an meinen AT- Befehl zu übergeben und diesen anschließend an das 
GSM-Modul zu übermitteln. Das übermitteln von festgelegten Arrays 
(Nummern) funktioniert bereits.
Es geht lediglich um die Eingabe und das schreiben in das Array.

Der gedachte Ablauf wäre:
Auswahl im bereits vorhandenen Menü => Nummer eingeben
Dann die nicht vorhandene Maske um die Nummer einzugeben, welche dann in 
ein Array gespeichert wird.




Noch eine kurze Info in eigenem Interesse. Ich bin kein Depp, der mit 
seiner Zeit nichts anzufangen weiß und sich gedacht hat ich programmiere 
mal was mit dem Wissen es nicht zu schaffen. Genau sowenig ist es meine 
Absicht hier jemanden auf den Sack zu gehen.
Dass mein Quelltext weit weg von professionell ist habe ich verstanden 
und mir auch vorab schon gedacht (Ich reflektiere mein Können durchaus).
Jedoch muss ich ein schulisches Projekt bearbeiten und versuche dies 
nach bestem Wissen und Gewissen zu tun.
Leider wurde mir im Unterricht lediglich beigebracht, wie die 
Grundfunktionen ablaufen, das integrieren von Programmteilen war leider 
kein Inhalt. Somit versuche ich derzeit unter Zeitdruck mit rudimentärem 
Wissen ein laufendes Programm zustande zubringen.
Hierbei möchte ich erneut anmerken, dass ich mich vorab durchaus 
versucht habe zu informieren, sei es hier auf microcontroller.net oder 
mit diversen Büchern. Jedoch ist das Anlegen eines Array etwas anderes, 
als es dann in Programm und Hardware einzubinden.

Ich möchte weißgott kein Mitleid, sondern dachte an konstruktive Hilfe.
Diese Hilfestellung wurde von einigen hier auch absolut gegeben!!!
Aber vor allem Herr Nick Mueller scheinen es zu genießen mich immer 
wieder mit seinen Kommentaren zu erniedrigen. Herr Mueller, bitte ich 
habe es verstanden, danke!

Für die Hilfsbereitschaft möchte ich sehr danken und wünsche einen 
schönen Abend!!!

von Timo N. (tnn85)


Lesenswert?

Verstehe trotz Quelltext und deiner Programmablauferklärung nicht genau, 
was du vorhast.

Ich versuche es mir mal herzuleiten:
Einsprungpunkt in dein Programm soll ein Menüeintrag sein, der - nachdem 
er ausgewählt wurde - den Benutzer dazu auffordert eine Telefonnummer in 
eine "Maske" auf einem kleinen LCD Display einzugeben. (ist das so ein 
2x16 Zeichen LCD Display?)
Die Eingabe der Telefonnummer erfolgt zeichenweise und der Bediener kann 
mit einer Auf- und einer Abtaste den Ziffernwert einstellen ( 0 bis 9) 
und mit der dritten Taste "Enter" springt der Cursor zur nächsten 
Ziffer.
Nach 11 Ziffern ist die Eingabe abgeschlossen und die eingegebene Nummer 
soll als Array gespeichert werden um dann von anderen Programmteilen 
über ein AT-Befehl an ein GSM-Modul geschickt werden?


1. "Jedoch ist das Anlegen eines Array etwas anderes, als es dann in 
Programm und Hardware einzubinden." -> Wo musst du ein Array in Hardware 
einbinden? Es sollte eigentlich kein Verständnisproblem geben, wenn man 
sich ein C-Buch/C-Tutorial angeschaut hat, wie man ein Array anlegt, auf 
die Elemente zugreift und das Array als Funktionsparameter übergibt 
(Stichwort "Pointer"). Mit
1
char masch1[12];
 wurde in deinem Code ja schon ein Array angelegt.
(http://www.cplusplus.com/doc/tutorial/arrays/)

2. Schau dir mal hier auf Mikrocontroller.net den folgenden Artikel an:
(https://www.mikrocontroller.net/articles/Entprellung)

3. Wie schon vorgeschlagen verwende einen Array als Variable für deine 
Telefonnummer und nicht 12 x
1
int z1,z2....
.

4. Was soll das hier bewirken (gleiches gilt für die Interruptroutine 
ISR(PCINT2_vect) )?
1
ISR(INT1_vect){ //Taster ENTER
2
3
EIMSK&=~(1<<INT1);
4
_delay_ms(150);
5
EIMSK|=1<<INT1;

Wenn du innerhalb der Interruptserviceroutine den Interrupt für den Pin 
des "Enter-Tasters" für 150ms ausmaskierst, dann verschwendest du nur 
150ms Zeit, aber sonst erreichst du nichts. Standardmäßig kann während 
des Ausführens des Codes in der ISR die ISR (oder andere ISRs) nicht 
nochmal aufgerufen werden. Wolltest du damit etwa das Entprellen des 
Tasters verwirklichen? Das geht anders (siehe Artikel oben)

5. Was soll ist case 20, 21 und 22? Was macht die Variable menueUeb ? 
Versuch das alles mehr zu kommentieren. Eventuell würde man es 
verstehen, wenn der Quellcode nicht so unverständlich wäre, aber so 
macht es das eben noch schwerer zu verstehen, was du eigentlich vorhast.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Die Variable nummernPos wird sowohl im Hauptcode als auch in der ISR 
verwendet.

Vor daher muss sie volatile definiert werden, also:
Alt:
1
unsigned char nummernPos=20;

Neu:
1
volatile unsigned char nummernPos = 20;

Dasselbe gilt für die Variable menueUeb.

Also:
1
volatile int menueUeb = 0;

Noch ein Tipp: Alle globalen Variablen, die aussschließlich in main.c 
verwendet werden, sollte man static definieren. Das hilft dem Compiler 
beim Optimieren ungemein.

: Bearbeitet durch Moderator
von Nick M. (Gast)


Lesenswert?

Christoph schrieb:
> Aber vor allem Herr Nick Mueller scheinen es zu genießen mich immer
> wieder mit seinen Kommentaren zu erniedrigen. Herr Mueller, bitte ich
> habe es verstanden, danke!

Da hätte ich zwei verschiedene Antworten darauf:
Die erste, schmerzhafte: "Heul doch!"

Die längere:
Du musst lernen, mit Kritik umgehen zu können. Insbesondere wenn du 
programmierst. Das fängt mit Selbstkritik an.
Deine Postings sind ordentlich strukturiert und geschrieben (sag ich 
ganz ohne Sarkassmus). Genau so solltest du deine Programme 
strukturieren. Überlegen was du willst und Schritt für Schritt 
systematisch aufteilen und detailieren. C ist auch nur eine Sprache.
Mach es gleich wie im Deutschen, überleg dir was du sagst und wie du 
argumentierst.
Überleg dir was du willst und wie du das in kleinere Happen unterteilst 
die für sich klar und einfach sind.

Und wenn du dir danach den Code selbstkritsch anschaust und sagst "Sieht 
eher schlampig aus", dann ist das ein Signal dein Vorgehen zu 
überdenken. Bei einem Anfänger kommt das oft vor. Bei mir passiert das 
auch gelegentlich und ich setzt mich hin und mach es ordentlich. Wird 
dann auch kürzer und klarer erkennbar was eigentlich passiert.

So, jetzt schau dir nochmal deinen code an und vergleich den mit deinen 
Postings. Ist dein code eine ordentliche Beschreibung?

Und dann, wenn dein code ordentlich strukturiert ist, findest du auch 
Fehler. Du kannst Funktion für Funktion ohne Seiteneffekte testen 
(printf, Debugger) und schnell(er) Fehler finden.

von Michael M. (michael89)


Angehängte Dateien:

Lesenswert?

Hallo Christoph (Gast),

um dir mal ein Beispiel zu geben was Nick M. versucht dir in seiner 
langen Form zu vermitteln,
hab ich dir mal ein zwei Jahre alten Code hochgeladen den ich mal für ne 
Gartenhütten Steuerung geschrieben hab.

Da wird der Unterscheid zwischen sauber-überschaubaren-Code zu "unsauber 
aber zum glück funktioniert der" deutlich.

Das Programm hat zwar nichts mit dein Problem zu tun aber ich lern gerne 
an Beispielen evtl. ist das ja bei dir auch so.

Beide Codes machen das selbe.


Und hab dir mal ein Codeschnipsel hochgeladen wie ich Tastenfeld 
Eingaben in ein array geschrieben hab. Bei mir wird geguckt ob die 
Eingabe richtig war, bei dir schickste das array einfach weg.

Hoffe das ist hilfreich, wenn nicht sehe es wie ein Super Markt an:
Was dir gefällt nimm mit ...den Rest lass einfach im Regal liegen ;)

Gruß
Michael

von Christoph (Gast)


Lesenswert?

Hallo Zusammen,

danke für die Hilfe, extra Dank geht an Michael M. für die Erläuterung.

Bin die letzten Tage etwas vorwärts gekommen und hab die Nummerneingabe 
nun funktionsfähig.

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.