Hallo Gemeinde Ich hab vor ein paar wochen mit dem Thema Microcontroller begonnen.... Naja kleine LED am Board Blinken lassen.... Kleines Lauflicht erstellt. Nun versuch ich mich an den Taster auf dem Board. Wenn ich den Taster drücke bzw gedrückt halte geht nur eine LED an. Wenn ich den Taster loslasse läuft ein Lauflicht durch 8 LED. Das ganze hab ich mit IF gelöst: if ( PIND & (1<<PIND0) ) { .... } else .... 1.Hab ich das Problem das in der art programmierung er nicht umschaltet wenn ich den Taster im Lauflicht drücke, sondern erst wenn er das Lauflicht bzw die IF bedingung verlassen hat und neu prüft ob die bedingung am Taster erfüllt ist. 2.Würde ich gern mit einem Taster hin und her schalten. Bedeutet wenn Taster gedrückt dann ..... Wenn taster erneut gedrückt dann .... Ich hab gelesen das dies mit XOR gelöst wird. er Prüft den zustand und ändert ihn nur wenn ..... Da ich allgemein gerade gedanklich nicht weiter komme als anfänger, und das tutorial schon 3 mal gelesen habe, hoffte ich ihr könntet mir ein paar codeschnipsel mit erklärung posten. Sorry das ich mich etwas blöd anstelle , aber als anfänger ist manchmal etwas viel input aufeinmal.
Sascha Peters schrieb: > Das ganze hab ich mit IF gelöst: > if ( PIND & (1<<PIND0) ) { .... } > else .... > 1.Hab ich das Problem ... Das Problem liegt nicht in diesem Programmausschnitt! > ihr könntet mir ein paar codeschnipsel mit erklärung posten. Du hast offenbar die Richtung verwechselt... Du solltest deinen Code (als Anhang mit Endung *.c) posten. Sonst müsste jeder wieder seine Glaskugel rausholen und rumraten... > Microcontroller Welcher denn? Lies mal deine Frage und überleg, ob du eine sinnvolle Antwort geben könntest, wenn du nur das wüsstest, was da steht. Oder kurz: Netiquette
Entschuldigung .... ist noch etwas neu für mich.. Ich hab nen ATMEGA 16 mit board: http://www.gotronik.pl/zestawyuruchomieniowe/mod_avr_atmega16v2.html
Hallo Sascha! Ich wuerde das Programm ein wenig anders aufbauen. 1. Benutze doch einen Timer anstelle der Delays, wird dir spaeter viele Probleme ersparen. 2. Ich wuerde eine Variable verwenden welche die Richtung des Lauflichts bestimmt. z.B.: 1 = rechts, 0=links In einer einfachen if-Schleife kannst du diese beim erreichen von 0 bzw. 7 aendern. Bin auch kein Experte in Sachen Microcontroller, aber was ich von der Schulzeit in Erinnerung habe, wurde das immer so gemacht... Hoffe ich konnte dir ein bisschen helfen.
ja das programm war dafür eigentlich auch nicht gedacht sondern von mir immer nur weiter geschrieben. Ich kann dies auch besser mit IF und else als mit 2 IF abfragen machen. Wichtig war mir die Tasterfunktionen, da komm ich einfach nicht weiter. So wie ich das in C geschrieben habe würde der C profi die hände über den Kopf zusammen schlagen, aber ich wollte erstmal die funktionen verstehen, und ein bissl was lernen. Deshalb hatte ich auf Codeschnipsel mit erklärung gehofft.
Programmiere Dein Lauflicht erstmal unter Verwendung eines Timers. D.h. Du stellst einen Timer so ein, dass er alle sagen wir mal ~250ms einen Interrupt auslöst. (z.B. 16-Bit Timer nehmen, Vorteiler von 64 und auf Overflow warten) In der Interruptroutine erledigst Du dann das Lauflicht (simple Methode, eleganter wäre es, im Timer nur nen Flag für's Hauptprogramm zu setzen und das Lauflicht dort zu erledigen). Dann brauchst Du noch eine Variable in der Du Dir merkst ob das Lauflicht grade laufen soll oder nicht. Diese Variable kannst Du dann in der Mainloop mit Deinem Taster togglen. Dann wirst Du merken, dass Du ausserdem noch eine Entprellroutine brauchst weil Taster nunmal eben die unangenehme Eigenschaft des Prellens haben. Das merkst Du daran, wenn Dein Programm scheinbar erratisch auf das Drücken des Tasters reagiert und Du einfach keine Erklärung dafür findest... ;) Zum Thema Entprellen gibt's hier in der Codesammlung eine hervorragende Routine von Peter Danegger, einfach mal suchen.
einen Timer hab ich noch nicht programmiert. Ich weiß wohl das das mit dem Internen Takt wohl erledigt wird. Interrupt muß ich mich auch erstmal noch 5 mal einlesen. dachte ich versuchs der reihe nach einlesen und ausgeben.... und dann weiter. Okay werd dann wohl weiter versuchen.. erstmal lauflichter zu bauen.
Philip Z. schrieb: > In einer einfachen if-Schleife http://www.if-schleife.de/ Sascha Peters schrieb: > dachte ich versuchs der reihe nach einlesen und ausgeben.... > und dann weiter. Das ist ja auch grundsätzlich richtig. Aber der nächste Schritt ist jetzt der Timer. Denn das >PORTB &= ~(1 << i); >_delay_ms (500); >PORTB |= (1 << i); ist das, was du nicht haben willst. Der Controller trampelt einfach 500ms auf der Stelle und macht weiter gar nichts. Auch nicht den Taster abfragen. > Okay werd dann wohl weiter versuchen.. > erstmal lauflichter zu bauen. Aber nur mit Timer. Sonst trampelst DU auf der Stelle. mfg.
Timer kann man auch ohne Interrupt zur Zeitmessung benutzen. Statt der Delay-Schleife kann man zum Beispiel am Anfang der Schleife den Counter abfragen, dann die Wartezeit addieren und warten bis der Counter das erwartete Ergebnis erreicht hat. Nun kann in der Warteschleife die Tastenabfrage mit eingebaut werden. So habe ich das als Anfänger vor Jahrzehnten mal programmiert.
habt ihr mal ein paar codeansätze um dies besser zu verstehen? Ich weiß ich bin unhöflich. Ich will nicht das man mir das vorkaut. Ich habe damals als laie hobbytechnisch an HTML gewagt.... als das mir zu blöd wurde bin ich an PHP gegangen. Als ich mich entschieden habe mehr computer als webbasiert zu lernen bin ich richtung c++ gewandert. Allerdings alles nur halb, da ich mir alles selbst angelesen habe. nun spring ich auf die c Schiene aufgrund von microcontroller. Mir fällt es zwar etwas leichter einen code zu lesen. aber nicht immer alles ist gleich verständlich. Ich bin auch erst 2 wochen an dem Thema dran und vorher war alles neuland. Mein Arbeitskollege brachte mich auf das Thema, da er seinen Techniker macht. Nur mal als kleiner anriss warum ich gerade da stehe wo ich stehe. Für mich dient das als Hobbyzweck als beschäftigung. Vielleicht möchte ich das mal mit meinem Hobby Modellbau verbinden, oder auch etwas weiter in die Elektroschiene.
Klaus 2m5 schrieb: > Timer kann man auch ohne Interrupt zur Zeitmessung benutzen. Statt der > Delay-Schleife kann man zum Beispiel am Anfang der Schleife den Counter > abfragen, dann die Wartezeit addieren und warten bis der Counter das > erwartete Ergebnis erreicht hat. Das ist aber nicht sinnvoll.
....bitte ausfüllen.... schrieb: > Klaus 2m5 schrieb: >> Timer kann man auch ohne Interrupt zur Zeitmessung benutzen. Statt der >> Delay-Schleife kann man zum Beispiel am Anfang der Schleife den Counter >> abfragen, dann die Wartezeit addieren und warten bis der Counter das >> erwartete Ergebnis erreicht hat. > > Das ist aber nicht sinnvoll. Wir kommen halt nicht als Experten auf die Welt! Es sollte auch nur als Beispiel dienen, wie man sich an die Implemetierung von Timer-Interrupts herantasten kann.
Wichtig ist für dich zu verstehen das der µC nur eine sache gleichzeitig machen kann(ok stimmt nicht ganz aber für den Anfang) Wenn du nicht mit Timer und Interrupts arbeiten willst, gibt es noch die Möglichkeit eine Sequenze aufzubauen, was bei dem einfachen fall noch geht aber aufwendig ist. Dafür gibt es in c die switch case anweisung. Sieht dann so aus endless loop lese Taster merke Zustand Taster aktuell fall 1 Taster an -> LEDs An fall 2 Taster aus LED N AUS LED N + 1 An warte zeit loop der Vorteil ist das du nach jedem LED umschalten den Taster Abfragst, der Nachteil ist das du den Taster länger als die Warte Zeit gedrückt halten musst
Sascha Peters schrieb: > habt ihr mal ein paar codeansätze um dies besser zu verstehen? FAQ: Timer Und ja, Timer sind wirklich der nächste Schritt. Am Anfang seiner Studien ist _delay_ms ok. Denn irgendwo muss man anfangen und man kann nicht alles gleichzeitig lernen. Aber irgendwann kommt der Punkt, an dem man einsehen muss, dass _delay_ms keine Lösung ist, sondern im Gegenteil oft das Problem darstellt. Ausnahme sind ganz kurze Wartezeiten, aber abgesehen davon ist ein Timer samt Interrupt so gut wie immer die bessere Lösung. Damit fährt der Zug dann in die gewünschte Richtung.
also wenn ich dies nun richtig studiert habe, würde ich mein Projekt so angehen: Ich würde mithilfe des Timers den Taster abfragen. Wenn der Taster gedrückt wurde sollte er den Wert einer Variable eins weiter zählen. Je nachdem welchen Wert dann die Variable hat, kann ich dann durch ein IF die Variable auswerten und ein dementsprechendes Lauflichtprogramm ablaufen lassen. Der Timer löst so oft den ISR in einer Sek. aus das die Abfrage des Tasters in einer Sekunde oft genug abgefragt wird. Das Entprellen wird dort wichtig weil wahrscheinlich sonst der Mikrocontroller die abfrage so oft auswerten wird das er ein Drücken des Tasters als Mehrfachdrücken erkennt. So kann ich dann mit einer Taste unterschiedliche Programme laufen lassen.
Sascha Peters schrieb: > also wenn ich dies nun richtig studiert habe, > würde ich mein Projekt so angehen: > > Ich würde mithilfe des Timers den Taster abfragen. > Wenn der Taster gedrückt wurde > sollte er den Wert einer Variable eins weiter zählen. > > Je nachdem welchen Wert dann die Variable hat, kann ich dann durch ein > IF die Variable auswerten und ein dementsprechendes Lauflichtprogramm > ablaufen lassen. Wobei ein Lauflicht ja auch wiederrum nichts anderes ist, als eine zeitlich geordnete Abfolge von Ausgaben. zeitlich geordnet - und schon wieder ist da ein Timer im Spiel. Das kann sogar derselbe Timer sein. > Das Entprellen wird dort wichtig weil wahrscheinlich sonst der > Mikrocontroller die abfrage so oft auswerten wird das er ein Drücken des > Tasters als Mehrfachdrücken erkennt. Nö. Das hat damit nichts zu tun. Die Tasterauswertung stürzt sich ja sowieso nur auf die Erkennung des Unterschieds 'Taste nicht gedrückt' / 'Taste gedrückt'. Aber hinterhältigerweise kann ein prellender Taster nach dem Drücken noch so ein paar Wechsel 'vortäuschen', die es auszusortieren gilt. > So kann ich dann mit einer Taste unterschiedliche Programme laufen > lassen. wobei. Wenn man es vernünftig macht, dann sind deine 'Programme' gar keine unterschiedlichen Programme im softwaretechnischen Sinne. Das Programm ist immer dasselbe, nur die Daten mit denen ein Programmteil gefüttert wird, sind jeweils unterschiedlich. An diese Stelle kommen dann Arrays ins Spiel, die die Ausgabemuster enthalten, die von einem immer gleichen Programmteil abgearbeitet werden - im Takt des Timers. Auch für etwas vermeintlich simples wie ein Lauflicht muss man, wenn man es universell und vernünftig machen will, schon ein ganze Menge Techniken und Kentnisse seiner Programmiersprache haben. Mit dem Simpelansatz 'Portausgabe - warten - Portausgbabe - warten - ....' kommt man nicht weit, das ist dann schon zu simpel.
es wurde ja schon viel gesagt, ein link ist mir aber bisher noch nicht untergekommen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial und http://www.mikrocontroller.net/articles/AVR-Tutorial ja, ich weiß - das zweite tutorial (eigentlich das erste) ist in assembler. da das aber um einiges mehr informationen enthält würde ich empfehlen, die ersten kapitel (bis inkl. stack) zu machen und ganz wichtig auch zu verstehen. wenn es fragen dazu gibt einfach stellen (evtl. vorher die suchfunktion probieren)... danach empfehle ich die zwei kapitel über timer. wenn du das alles geschafft hast, versuch das ganze in C umzusetzen - keine angst, das klingt schlimmer als es ist...
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.