Forum: Mikrocontroller und Digitale Elektronik Aquariumsteuerung - LED über ein Taster Ein und Aus


von Rafael S. (rafi)


Lesenswert?

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
von As-I-Roved-Out (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Rafael S. (rafi)


Lesenswert?

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
von spess53 (Gast)


Lesenswert?

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

von Rafael S. (rafi)


Lesenswert?

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
von Rafael S. (rafi)


Lesenswert?

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
von Kommentator (Gast)


Lesenswert?

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.

von Rafael S. (rafi)


Lesenswert?

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

von Der E. (rogie)


Lesenswert?

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.

von Rafael S. (rafi)


Lesenswert?

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
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Rafael S. (rafi)



Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

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
von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

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!

von Rafael S. (rafi)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Rafael S. (rafi)


Lesenswert?

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ß

von Steckpointer (Gast)


Lesenswert?

Steckpointer?

Ferkel !;-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

von Rafael S. (rafi)


Lesenswert?

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