Guten Morgen zusammen, ich habe seit einigen Tagen den Gefallen am Programmieren des Atmega8 gefunden. Ich versuche mich am Assembler. Dazu habe ich schon ein passendes Projekt gefunden. Ich möchte eine Aquariumsteuerung für meine selbstgebaute LED Beleuchtung schreiben. Dabei möchte ich ganz klein anfangen und mich dann steigern. Bis das Projekt fertig ist. Ziel ist es einzelne Bereiche der LED Beleuchtung über Taster seperat ein bzw auszuschalten. Anschließend soll das Ein- und Ausschalten via PWM gedimmt werden. Dabei werden regelbare Konstantstromquellen zum einsatzkommen. Diese gibt von MeanWell Bez. LDD 350L / 700L. Zum guten Schluß soll eine Zeitschaltuhr und Temperaturauswertung Programmiert werden.... Das hört sich denke ich nach ganz schön viel arbeit an! :) Ich habe mich hier im Forum schon umgeschaut und das eine oder andere gefunden was sehr hilfreich war. Dafür ein dickes DANKESCHÖN an alle die hier die vielen Beiträge schreiben!!!!!! Habe allerdings eine LED Ein aud Ausschaltung mit einem Taster und das im Assembler nicht gefunden..... Eine einfache LED Ein und Ausschaltung habe ich bereits geschrieben. Was mir allerdings noch nicht gelingt ist es die LED über einen Taster zu schalten! Sowohl EIN als auch AUS. Bis jetzt mache ich es über zwei Taster. ; Beschalten der PORTS als Ein- bzw Ausgang cbi DDRD,2 ; Eingang => Taster 1 sbi PORTD,2 ; PUllup cbi DDRD,3 ; Eingang => Taster 2 sbi PORTD,3 ; Pullup sbi DDRD,4 ; Ausgang => LED 1 sbi DDRD,5 ; Ausgang => LED 2 sbi DDRD,6 ; Ausgang => LED 3 ;----------------------------------------------------------------------- - mainloop: wdr ; Entscheidung ob LED eingeschalte werden muss, oder ausgeschaltet cpi r18, 1 ; Entscheidung ob LED breits an? breq ledoff ; wenn ja dann springe nach Ledoff rcall ledon ; sonst nach Ledon rjmp mainloop ;----------------------------------------------------------------------- - ledon: ; Taster 1 einlesen ;sbi PORTD,5 in r17, PIND ; PORTD einlesen und in r17 ablegen sbrs r17, 2 ; Überspringe .... rcall sw1 ret sw1: ; hier wird nun die LED eingeschaltet sbi PORTD,4 ; Ausgang setzen ldi r18, 0x01 ; Bit für LEDON setzen ret ledoff: ; Taster 2 einlesen in r17, PIND ; PORTD einlesen und in r17 ablegen sbrs r17, 3 ; Überspringe nächsten Befehl wenn Bit 2 vom PORTD gesetzt rcall sw2 ret sw2: ; hier wird nun die LED eingeschaltet cbi PORTD,4 ; Ausgang rücksetzen ldi r18,0x00 ; Bit für LEDOFF rücksetzten Ich hätte eine Idee wie man das über einen Taster realisieren könnte. Wenn ich zum Beispiel den Zustand der LEDs abfragen könnte. Dann könnte ich sagen wenn die LED an ist dann springe in den Pfad Ledoff und prüfe dort den Eingang des Taster 1. Wenn die LED aus ist dann springe in den Ledon Pfad und checke dort den Taster 1. Aber ich weiß noch nicht wie ich die Ausgänge abfragen kann! Danke im Voraus! Gruß Rafael
:
Bearbeitet durch User
Willkommen in der Atmelwelt ;) Schön dass du den Code sauber kommentiert hast, da kann sich manch "professioneller Entwickler" mal ein Beispiel nehmen. Zu deinem Problem der Lösungsansatz - das Übertragen in Code bekommst du schon hin: Wenn Taster gedrückt dann überprüfe aktuellen Zustand des LED ausgangs und invertiere diesen. Dann passiert: *taster gedrückt" -> Prüfung Ausgang, wenn 0 dann wird 1, wenn 1 dann wird null. usw. Der Code wird also sehr kurz ausfallen ;) Aber keine Sorge es ist normal dass man den Wald vor lauter Bäumen nicht sieht - die stehen irgendwie immer im Weg.
Tu dir einen Gefallen und implementiere so früh wie möglich die Testenentprellung und -abfrage nach PeDas Timerroutine: https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29 Timer wirst du sowieso früher oder später brauchen und die 'wasserdichte' Routine von PeDa erledigt nebenbei komfortabel die Tasten. Der Timer kann gleich als Ticker dienen und z.B. eine Uhr nebenbei machen. Rafael S. schrieb: > Aber ich weiß noch nicht wie > ich die Ausgänge abfragen kann! Wenn du einen als Ausgang definierten Port liest, gibt er trotzdem den entsprechenden Zustand im PIN Register zurück. Das lässt sich mit
1 | check: sbis PINB,2 ; ist Ausgang PB2 low? |
2 | rjmp pb2islow |
3 | pb2ishigh: |
4 | nop ; PB ist high, dann gehts hier weiter |
abfragen.
:
Bearbeitet durch User
Hallo, @ As-I-Roved-Out: DANJE!!!!! für deine Antwort. Und danke für den Lob was das Auskommentieren der Programmzeilen angeht. Ich versuche mir das einfach anzugewöhnen, schon alleine für mich. Damit ich es auch später nachvollziehen kann. Und für das Forum hier ist es auch ein +! Jeder kann sich da schneller zurecht finden. Ich habe mich schon gedanklich an die Arbeit gemacht. :) Gruß @ Matthias Sch. danke ebenfalls für die schnelle und ausführliche Antwort! DANKE! puhh.... der Peter Dannegger ist aber sehr gut unterwegs!!! Man man man.. da brauche ich etwas um da durchzusteigen. Brauche ich auch die Includedatei .include "c:\avr\inc\1200def.inc" ?? diese ist bei mir noch nicht eingebunden. Und im Installationsverzeichnis von WorkpadPlus finde ich sie auch nicht!? Desweiteren: der Peter Dannegger nutzt Register im Unteren Bereich... also r0, r1 usw. Ich dachte diese würden beim Atmega8 für anderes reserviert?!? Deshalb habe ich mich nur an die ab R16 getraut :) Die Ausgangsabfrage werde ich auch gleich testen ! :) freu!!!! Gruß
:
Bearbeitet durch User
Hi >der Peter Dannegger nutzt Register im Unteren Bereich... >also r0, r1 usw. Ich dachte diese würden beim Atmega8 für anderes >reserviert?!? Deshalb habe ich mich nur an die ab R16 getraut :) Wofür sollen die denn in Assembler reserviert sein? Du solltest lediglich beachten, das für r0..r15 ein etwas eingeschränkter Befehlssatz vorhanden ist. MfG Spess
hi Spess, ahh okay... dann war es das was ich über die 16 Register gehört habe. Sorry !! Mein fehler! :) Wieder was dazu gelernt! :) Gruß Rafael
:
Bearbeitet durch User
Hallo, sooo... ich habe mein Programm überarbeitet und dadurch deutlich verkürzt. Problem: die LED geht nicht bei jedem tasten ein bzw. aus. Hat das mit der Entprellung zu tun??? Hier das Prog: ; Beschalten der PORTS als Ein- bzw Ausgang cbi DDRD,2 ; Eingang => Taster 1 sbi PORTD,2 ; PUllup cbi DDRD,3 ; Eingang => Taster 2 sbi PORTD,3 ; Pullup sbi DDRD,4 ; Ausgang => LED 1 sbi DDRD,5 ; Ausgang => LED 2 sbi DDRD,6 ; Ausgang => LED 3 ;----------------------------------------------------------------------- - mainloop: wdr ; Entscheidung ob LED eingeschalt oder ausgeschalt werden muss sbis PORTD, 4 ; Prüfe ob LED an oder aus rcall ledon ; überpringe ledoff wenn led off ist. rcall ledoff rjmp mainloop ;----------------------------------------------------------------------- - ledon: ; Taster 1 einlesen sbis PIND,2 ; Prüfe ob Taster 1 gedrückt sbi PORTD,4 ; Ausgang setzen ret ledoff: ; Taster 2 einlesen sbis PIND,2 ; Prüfe ob Taster 1 gedrückt cbi PORTD,4 ; Ausgang rücksetzen ret Jetzt wewrde ich mir mal das Programm von Peter Dennegger vornehmen :) Bin schon gespannt ob es klappt ?! :D Noch eine Frage: wie kann ich im Workpad Registern Namen zuweisen? Also .def led = r10 geht nicht.... da kommt ein Fehler!
:
Bearbeitet durch User
Rafael S. schrieb: > Und danke für den Lob was das > Auskommentieren der Programmzeilen angeht. Ich versuche mir das einfach > anzugewöhnen, schon alleine für mich. Damit ich es auch später > nachvollziehen kann. Und für das Forum hier ist es auch ein +! Jeder > kann sich da schneller zurecht finden. Auskommentieren ist was Anderes. Und mit dem Zurechfinden ist es auch so eine Sache, wenn die Kommentare wegen Copy&Paste nicht stimmen.
Okay.. mit Auskommentieren meinte ich eingentlich das Kommentieren an sich! sorry war von mir falsch geschrieben. Und ja da muss man darauf aufpassen dass sich die Zeilen nicht verschieben beim Copy&Paste...
As-I-Roved-Out schrieb: > Schön dass du den Code sauber kommentiert hast, da kann sich manch > "professioneller Entwickler" mal ein Beispiel nehmen. Das ist in Assembler schon fast "Pflicht", jede Zeile zu kommentieren, wenn man den Code mal etwas später wieder herauskramt und auch verstehen will, was da passiert. Weiter so.
Gutenn Morgen, ich habe mir heute Morgen den Programmcode von dem Peter Dennegger vorgenommen und ins WorkpadPlus in Assembler eingehackt. Alles funzt. Nur habe ich versucht den Code, der im Interrupt "get8key" druchzuspielen und bleibe iwie an paar Dingen hängen! :( https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29 Meine Frage: die Bit- Tabelle der Register neben dem Code. Woher kommt das erste Bitmuster im key_old und key_state?? Wird es angenommen?? Ich habe versucht das ganze für mich durchzuspielen und es funzt nicht wirklich.... :( Kann mir da jemand einen Tipp geben ?! Danke !!!!! Gruß
:
Bearbeitet durch User
1 | .include "c:\avr\inc\1200def.inc" |
Das ersetzt du natürlich durch die Definitionen für deinen MC. Wimre heisst das dann 'm8.def' oder so. Als nächstes wirst du die Initialisierung des Timers an deinen Mega8 anpassen müssen. Du solltest ihn so anpassen, das er regelmässig alle ungefähr 10ms überläuft und den Timer Overflow Interrupt auslöst. In PeDas Beispiel wird PORTB komplett als Ausgang mit 8 LED beschaltet und PORTD ist als Eingang für 8 Taster beschaltet. Dann wird je nach gedrückter Taste die entsprechende LED getoggelt, das passiert in main. Für dich ist es also am besten, wenn du deine Tasten ausmaskierst mit z.B. ANDI und dann nur auf key_press auf diesen ausmaskierten Tasten reagierst. D
:
Bearbeitet durch User
Guten Morgen, @ Matthias: danke für deine Antwort und die vielen Tipps! Habe das Prog im WorkpadPlus ( im Assembler) hinbekommen und es läuft auch. Was ich nur noch an dem Programm nicht verstehe ist die Interrupt Routine "get8key". Wenn ich diese Routine mit den vorgegebenen Werten in der ersten Zeite aus der Tabelle neben dem Code durchspiele dann passt alles. Nur soweit ich das tatsächliche Byte vom PIND (key_port) nehme (also wenn irgend ein Taster betätigt wird) und das ganze durchspiele, dann komme ich nicht auf die richtige Ausgabe am PORTB. Dabei macht das Programm alles richtig. Gruß Rafael
Ja, Puh - icke und Assembler... Ist schon eine Weile her, aber das System sollte so sein: ISR vergleicht alten Tastenzustand mit neuem Tastenzustand. Wenn eine neue Taste im Vergleich zum vorigen Durchlauf entdeckt wurde, wird das erstmal gespeichert, aber es wird noch kein key_press signalisiert. Erst, wenn beim nächsten Durchlauf das immer noch entdeckt ist, wird key_press gesetzt. Ist also eine zweistufige Prüfung zur Entprellung. Im Hauptprogramm wird key_press untersucht und wenn ein Bit gesetzt ist, wird das mit dem gleichen Bit im Zwischenspeicher (leds) EOR'ed, also getoggelt. Der Zwischenspeicher wird dann auf den Ausgangsport geschrieben. Dann löscht das Hauptprogramm key_press, um für einen weiteren Tastendruck bereit zu sein - sozusagen als Quittung, das der Tastendruck ausgewertet wurde. Du hast da einen Simulator? Dann lass doch die ISR einmal mit allen Tasten auf high, also 0xFF in PIND durchlaufen. Beim nächsten Mal setzt mal ein Bit in PIND auf 0, also PIND z.B. auf 0xFE, was bedeutet, das die Taste auf PD0 gedrückt wurde. Wenn alles gut geht, müsste nach dieser Änderung und 2 Durchläufen der ISR key_press auf 0x01 stehen und dir damit die Taste auf PD0 signalisieren. Ich klopp das mal in AVR Studio und hoffe, das mein Simulator noch anspringt, in letzter Zeit crasht er zumindest bei C Programmen regelmässig. Edit: Ok, der Simu läuft, für den Mega8 muss man nur noch SP initialisieren und ich habe die Pullups an den Tasten mal angeschaltet. Ich hänge dir mal meine Version an, allerdings musst du für dich die .def Dingse wieder auf die Syntax deiner IDE anpassen. Ach so, wunder dich nicht, ich schreibe immer gleich die komplette ISR Vektortabelle in meine Programme und lege unbenutzte ISR auf einen Stub. Dann muss ich nicht jedesmal die Vektornamen und Adresslage nachschlagen. Edit: Oh, noch was, ich habe den Timer unverschämt schnell eingestellt. Zum Simulieren wurscht, im realen Leben setzt du wieder CS02, das ich genullt habe.
:
Bearbeitet durch User
Rafael S. schrieb: > da brauche ich etwas um da durchzusteigen Tu Dir einen Gefallen und nim nichts von dem Vorgefertigten Kram, sondern entstelle eine Entprellung selber, ob mit oder ohne Timer. Dann investierst Du deine Zeit besser als fremden Code zu interpretieren und verstehst am Ende selber wirklich wie es geht. Das ist alles kein Hexenwerk!
Hi zusammen, @Thomas Holmes: du hast sicherlich recht damit und das wird auch so sein. Nur habe ich grade ein privates Projekt, das ich dringend umsetzen möchte. @ Matthias Sch.: 1000 Dank für die ausführliche Erläuterung! Das ist mir eine große Hilfe. Danke! Ich habe bisher nur mit dem WorkpadPlus gearbeitet. Habe mir gestern aber AVR Studio 6 bei ATMEL runtergeladen. Da muss ich mich auch erst zurechtfinden. Werde gleich das ganze mit dem Studio 6 ausprobieren. Simulator... hmm das WorkpadPlus hat sowas nicht. Meines Wissens nach. Was bedeutes SP und IDE ?? Gruß Rafael
Rafael S. schrieb: > Was bedeutes SP und IDE ?? SP steht für Stackpointer und IDE heisst 'Integrated Development Environment' und steht für Entwicklungsumgebung, wie Workpad oder Atmel Studio. Thomas H. schrieb: > Tu Dir einen Gefallen und nim nichts von dem Vorgefertigten Kram, > sondern entstelle eine Entprellung selber, ob mit oder ohne Timer. Die Entprellungsroutinen von hier sind allerdings schon dutzendfach erprobt und funktionieren gut, solange man einmal verstanden hat, wie es gemeint ist. Da braucht man das Rad nicht noch einmal zu erfinden.
:
Bearbeitet durch User
Guten Morgen!, Matthias S. schrieb: > Die Entprellungsroutinen von hier sind allerdings schon dutzendfach > erprobt und funktionieren gut, solange man einmal verstanden hat, wie es > gemeint ist. Da braucht man das Rad nicht noch einmal zu erfinden. Ja da hast du wohl recht Matthias.... das RAD braucht man nicht wirklich immer wieder neu erfinden. Und ja... die meisten Programme, in diesem Fall das von Peter D., sind wirklich sehr gut und vor allem X- fach getestet. Sie funktionieren einfach. Der Nachteil: die fertigen Programme haben keinen großen Lerneffekt... :( Für einen Anfänger wie mich ist es halt am Anfang sehr schwierig rein zu kommen. Ich denke der beste Weg ist es aus beidem zu lernen ... ein Teil fertige Programme und ein Teil selbst geschriebenes... Man muss halt am Ball bleiben! Ich muss sagen ich habe in den letzten zwei Wochen eine Menge dazu gelernt. Alles mit EURER Hilfe hier !!!! Dafür noch einmal ein dickes DANKESCHÖN an alle!!!!! Das mit "IDE" habe ich gestern noch herausgefunden. Das mit dem Steckpointer.. da wäre ich nicht drauf gekommen. Auch wenn ich weiß was ein Steckpointer ist :-) Gruß
Rafael S. schrieb: > Der Nachteil: die fertigen Programme haben keinen großen Lerneffekt... > :( > Für einen Anfänger wie mich ist es halt am Anfang sehr schwierig rein zu > kommen. In diesem Fall brauchst du dir nicht viele Sorgen zu machen, zum Einen sind das ja auch keine einfachen Copy&Paste Schnipsel, zum anderen lernt man ja auch daraus, wie es die Anderen machen. Dir bleibt sowieso die Anpassung an deine Tastenanordnung und die Ausmaskierung der nicht in deinem Projekt vorhandenen Tasten. Rafael S. schrieb: > Das mit dem Steckpointer nanana - es gibt auch ein deutsches Wort für diese Einrichtung, aber die klingt noch bescheuerter: Kellerspeicherzeiger.... und nu' sag mir, was dir lieber ist :-P
Hi, Matthias S. schrieb: > Dir bleibt sowieso die > Anpassung an deine Tastenanordnung und die Ausmaskierung der nicht in > deinem Projekt vorhandenen Tasten. > ja... da werde ich mich als nächstes dran machen. Aye.. ich hoffe ich komme da gut durch... ich möchte, dass zu jeder Taster eine LED gedimmt ein bzw ausgeschaltet wird. Mal schauen wie ich das lösen werde. ;-) > nanana - es gibt auch ein deutsches Wort für diese Einrichtung, aber die > klingt noch bescheuerter: > Kellerspeicherzeiger.... und nu' sag mir, was dir lieber ist :-P Also ich wäre definitiv für Steckpointer! Hört sich so professionell und wissenschaftlich an. ;D Kellerspeicherzeiger => So habe ich es noch nie gehört :D :D Wobei heißt nicht Stack Stapel ?! Demnach Stapelzeiger ;-P Gruß
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.