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
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?
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.
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
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.
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;
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.
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.
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
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.
Yeet schrieb:> Schreib halt mal objektiv was dir nicht passt an:
1
voidzahl2(){
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.
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.
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.
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.
@ 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)
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
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!!!
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
.
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.
Die Variable nummernPos wird sowohl im Hauptcode als auch in der ISR
verwendet.
Vor daher muss sie volatile definiert werden, also:
Alt:
1
unsignedcharnummernPos=20;
Neu:
1
volatileunsignedcharnummernPos=20;
Dasselbe gilt für die Variable menueUeb.
Also:
1
volatileintmenueUeb=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.
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.
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
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.