Forum: Mikrocontroller und Digitale Elektronik Hausdrainage-Kontrolle mittels DuoLED und Levelsensor - Anfängerprojekt!


von Ch S. (spelli)


Lesenswert?

Hallo!

Ich möchte mein erstes Programm einer Prüfung unterziehen lassen!

Folgender Hintergund:

Ich habe letztes Jahr ein Haus gekauft. Dies verfügt über einen Keller 
mit Drainage. Diese kann man über einen Kontrollschacht erreichen, indem 
auch eine Pumpe arbeitet.
Genau diese Pumpe hatte einen Defekt. Dadurch sammelte sich im Winter 
viel Wasser in der Drainage an und ich sah es erst, als es fast zu spät 
war. Nämlich erst am Mauerweg IM Keller...

Der Deckel des Schachts ist aus Beton. Nun hatte ich in diesen Deckel 
ein Loch gebohrt und eine Duo-LED (rot/grün) eingeklebt. Verwendet habe 
ich diesen Levelsensor 
http://www.reichelt.de/Reedrelais-Magnete/LEVELSENSOR-1/index.html?;ACTION=3;LA=444;GROUP=C31;GROUPID=3291;ARTICLE=27690;START=0;SORT=preis;OFFSET=500;SID=11Tfcb6H8AAAIAABI2W@0fc838750c363042ba9d3fb67517d8182 
als Schliesser und zwar 2x.
Diese sind so montiert, dass unterhalb eines Füllstands die rote LED 
leuchtet und oberhalb des Füllstands die grüne LED leuchtet. Es liegen 
somit immer unterschiedliche Schaltzustände vor (nicht ganz; es gibt 
auch einen kurzzeitigen Füllstand da sind beide geschlossen).

Tja, die Schaltung war im Prinzip nur eine Leitungsunterbrechung durch 
die beiden Schwimmschalter. Nicht besonders dolle!

Nun habe ich mir folgendes gedacht:

Sensoren bleiben wie gehabt, aber über einen ATmega8 oder ATtiny13 wird 
das ganze vernünftig gesteuert.

Ich habe mich für das Anschliessen der Eingänge über 
Pulldown-Widerstände entschieden, da ich der Meinung bin, dass die 
aussagekräftige grüne LED nur dann leuchten sollte, wenn ein Strom 
fliesst, also bei einer Unterbrechung der Leitung auf gar keinen Fall 
die grüne LED leuchtet.

Ich möchte gerne was lernen und da dachte ich mir, dass dieses Projekt 
nicht schlecht wäre! (Im Moment scheint meine momentane Schaltung nicht 
mehr funktionieren zu wollen...)

Danke und Gruß
Christoph

Achja:

sensor1 (grüne LED)      sensor2 (rote LED)

       1                       0                  Wasser oberhalb

       0                       1                  Wasser unterhalb



1
.include "m8def.inc"
2
 
3
         ldi r16, 0b00000011  
4
         out DDRB, r16               ; PB0 und PB1 sind Ausgänge
5
                             
6
         ldi r16, 0b11111100
7
         out DDRD, r16               ; PD0 und PD1 sind Eingänge
8
         
9
         ldi r16, 0b11111100         ; Pulldown-Widerstände aktivieren     
10
         out PORTD, r16    
11
                      
12
13
                   
14
loop:
15
         in r16, PIND, 0             ; an Port D anliegenden Wert (sensor1 -> 0b00000001 = geschlossen) nach r16 einlesen
16
        
17
         in r17, PIND, 1             ; an Port D anliegenden Wert (sensor2 -> 0b00000001 = geschlossen) nach r17 einlesen
18
19
 
20
21
sensor1:
22
23
         cpi     r16,0b00000001      ; wenn sensor1 ist "geschlossen" -> "1" ehemals grüne LED
24
         brne    sensor1_off         ; wenn sensor1 ist "geöffnet" -> 0
25
         rjmp    sensor2
26
27
28
sensor1_off:
29
30
         cpi     r17,0b00000000      ; wenn sensor2 ist "geöffnet"
31
         brne    sensor_alternative
32
         ldi     r18, 0b00000010     ; 
33
         out     PORTB, r18          ; jetzt leuchtet die rote LED -> Wasser unterhalb Pegel
34
35
36
sensor2:
37
38
         cpi     r17,0b00000000      ; wenn sensor2 ist "geöffnet" -> "0" ehemals rote LED
39
         brne    sensor2_off
40
         ldi     r18, 0b00000001     ; jetzt leuchtet die grüne LED -> Wasser oberhalb Pegel
41
         out     PORTB, r18
42
43
44
 sensor2_off:
45
46
         cpi     r17,0b00000000      ; wenn sensor1 ist "geöffnet"
47
         brne    sensor_alternative
48
         ldi     r18, 0b00000010
49
         out     PORTB, r18
50
51
52
  sensor_alternative:
53
54
         ldi     r19,0b00000011
55
         out     PORTB, r19          ; jetzt leuchten beide LEDs zeitgliech ~ also orange...
56
57
 
58
rjmp loop                            ; Sprung zu "loop:" -> Endlosschleife

von MaWin (Gast)


Lesenswert?

> Diese sind so montiert, dass unterhalb eines Füllstands die rote LED
> leuchtet und oberhalb des Füllstands die grüne LED leuchtet

Cool.

D.h. wenn alles in Ordnung ist leuchtet es rot,
wenn die Pumpe arbeiten sollte nichts oder beide,
und wenn die Pumpe defekt ist und es nicht schafft,
dann die grüne.

> über einen ATmega8 oder ATtiny13 wird
> das ganze vernünftig gesteuert.

Du meinst einen uC der jetzt ein dauernd an 230V angeschlossenes 
Netzteil bekommt, daran ein Relais, und damit die Pumpe steuert, deren 
Schwimmerschalter ausser Betrieb gesetzt wurde, weil nun deine Sensoren 
und der (hoffentlich im Laufe des letztes Jahres wo er nur auf einen 
Schalterwechsel wartete nicht abgestürzte) uC das kontrolliert.

Dir ist schon klar, daß im Laufe der Zeit (PC als Server, Gefrierschank 
im Keller, Schwimmbad im Garten) die Stromrechnung zum grössten Klotz 
der Hauskosten nach den Heizkosten wird ?

Und falls dir nicht ganz klar sein sollte, warum das gut ist: Damit die 
Leute wenigsten EIN WENIG Gehirnschmalz auf's Energiesparen richten, 
denn so lange es ihnen nicht an's Geld geht, merken die ja nix. Auch 
wenn es nur einige Euros in den 30 Jahren sind, die deine Pumpe wohl 
leben soll.

von Ch S. (spelli)


Lesenswert?

Hallo!
Ach nein. Das hätte ich natürlich noch anfügen müssen:

Die Pumpe (mit Schwimmschalter) tut ihren Dienst ganz normal. Wie jede 
andere Pumpe auch!

Ich möchte die LEDs lediglich zur optischen überirdischen Kontrolle 
haben!

Im Prinzip möchte ich mir das Aufhebeln des Betondeckels sparen um zu 
überprüfen, ob die Pumpe vielleicht ausgefallen ist!

Der uC hat also nichts mit der Pumpe zu tun, lediglich mit der Anzeige 
des Füllstandes. Und der ändert sich doch häufig wie ich festgestellt 
habe.

Das hatte ich so leider nicht beschrieben, sorry!

Ziel soll sein:

grün = Wasser ist unter dem Pegel
rot = Wasser ist über dem Pegel

von oszi40 (Gast)


Lesenswert?

Aufwand und Nutzen?
Ein Piezo-Summer bei Hochwasser wäre sicher nützlicher als eine LED, die 
kaum einer sehen wird (außer er geht in den Keller).

von Ch S. (spelli)


Lesenswert?

Naja, ich habe mir schon meine Gedanken gemacht!

Die Drainage ist aussen! Dort ist auch der Schacht. Diesen sehe ich 
immer dann, wenn ich z. B. von der Arbeit nach Hause komme. Dann sehe 
ich z. B. die grüne LED - alles i.O. sehe ich über einen längeren 
Zeitraum die rote LED muss ich mal nachschauen.

Schaue ich allerdings 4 Wochen lang nicht nach und das Ding ist voll, 
sehe ich es erst wieder am Mauerwerk...

Wie ich geschrieben habe ist die Installation bereits vorhanden. Nur die 
"Steuerung/Schaltung" ist miserabel. Über den Winter lief das sehr gut 
und ich erhielt einen Überblick über den Pegelstand.

Nun möchte ich ja lediglich die Steuerung über einen uC realisieren.

Danke,
Christoph

von MaWin (Gast)


Lesenswert?

> Der Deckel des Schachts ist aus Beton. Nun hatte ich in diesen Deckel
> ein Loch gebohrt und eine Duo-LED (rot/grün) eingeklebt.

Klebe dort ein Plastikreagenzklas mit der Öffnung anch unten ein.

Stecke in das Röhrchen einen am Ende rot lackierten Stab der 10 cm 
kürzer ist als daß er bis zum Boden reicht. Steck das untere Ende des 
Stabes in einen Schwimmkörper aus Styropor.

Fertig ist die Anzeige. Stromsparend. Funktioniert immer. Versteht 
jeder.

von Ch S. (spelli)


Lesenswert?

Dann rennt der Hund dagegen und der Tierarzt möchte schön Kohle sehen!

Im ernst:

Die Schwimmschalter etc. sind montiert. Die Stromkosten werden nicht so 
hoch sein, dass ich gegen das Kyoto-Abkommen verstosse.

Ich würde mich freuen, wenn man mir ernsthaft helfen könnte!

von Patrick (Gast)


Lesenswert?

... oder wenns unbedingt was Elektronisches sein soll: 
http://www.zabex.de/site/wassermelder.html hat da einige interessante 
Ideen, z. B. den Zuckerwürfel.

Evtl. in eine Filmdose (Boden nach oben, unten offen), falls Regen o. ä. 
von oben dran kann, und auf gewünschter Höhe einbauen. Paar Strippen 
dran, MaWin's Summer und eine Batterie entsprechend weiter oben 
anbringen, fertig.

Nicht vergessen, alle paar Jahre die Batterie zu erneuern.

von Ch S. (spelli)


Lesenswert?

Kenne ich schon. Zucker wurde auch im 2. Weltkrieg zum scharf machen von 
Minen benutzt.

Ich gebe ja zu, dass ich mich im Anfangsthread nicht klar ausgedrückt 
habe, aber ich möchte es genau so machen, wie beschrieben.

Ist ja auch schon alles montiert. Lediglich die Auswertung soll nun ein 
uC übernehmen...

- Wasserstandssensoren sind schon da
- Drainage Schacht ist aussen, LED immer gut einsehbar
- Pumpe ist hiervon nicht betroffen
- dient nur der optischen Kontrolle

von Patrick (Gast)


Lesenswert?

Also gut, ich versuch mal, ob ich den AVR-Assembler ausm Gedächtnis noch 
zusammenkriege:

- (Hinweis: Du hast den Stackpointer nicht initialisiert. Brauchst Du 
hier zwar nicht, da Du nur mit Registern arbeitest, hab ich aber 
früher(TM) immer gern vergessen ;)

- Die AVRs haben bloß Pull-Up-Widerstände, keine Pull-Down-Widerstände. 
D. h. sinnvollerweise schaltest Du Deine Sensoren zwischen Masse und 
Eingang. Damit musst Du auch alle Abfragen im Programm invertieren.
1
in r16, PIND, 0
2
in r17, PIND, 1

muss
1
in r16, PIND
2
in r17, PIND

sein; Du liest ja ganze Bytes ein.

Damit passt das
1
cpi     r16,0b00000001
2
brne    sensor1_off
3
rjmp    sensor2

natürlich auch nicht mehr; arbeite doch einfach mit "Skip if bit is 
set"; z. B. so oder so ähnlich:
1
sbis    r16,0
2
rjmp    sensor1_off
3
rjmp    sensor2

usw. (Achtung: Mit der Syntax bin ich mir jetzt nicht 100%ig sicher. 
Siehe Tutorial und/oder Manual).


MfG

von Patrick (Gast)


Lesenswert?

Deine Initialisierung
1
ldi r16, 0b00000011  
2
out DDRB, r16               ; PB0 und PB1 sind Ausgänge
3
ldi r16, 0b11111100
4
out DDRD, r16               ; PD0 und PD1 sind Eingänge
5
ldi r16, 0b11111100         ; Pulldown-Widerstände aktivieren     
6
out PORTD, r16

hat auch ein paar Macken: PB2..7 werden damit Tri-State-Eingänge und 
floaten irgendwo rum; wenn nichts angeschlossen ist, mach einfach alle 
zu Ausgängen, ansonsten schalte die Pull-Ups ein.
An PD0 und PD1 schaltest Du die Pull-Up-Widerstände eben NICHT ein, da 
Du die Bits ja mit 0 beschreibst. Besser: 0b11111111 ;)

von Patrick (Gast)


Lesenswert?

Und noch eins: Wenn Du natürlich sowas machst:
1
ldi     r18, 0b00000010     ; 
2
out     PORTB, r18          ; jetzt leuchtet die rote LED -> Wasser unterhalb Pegel

würdest Du PB2..7 wieder floaten lassen, sofern sie immer noch Eingänge 
wären.

So, mehr sticht mir gerade nicht mehr ins Auge ;)

von marrtn (Gast)


Lesenswert?

µC sind zwar schön und gut, aber für den Zweck würde ich dann doch eher 
auf "analoge" Schaltungstechnik zurückgreifen ;-).

Sofern die Schwimmerschalter es schaffen eine LED zu schalten, sollte 
das ganze Problem mit einem Transistor und ein paar Widerständen 
erledigt sein. Anderenfalls sind es zwei Transistoren...

von Ch S. (spelli)


Lesenswert?

Hallo Patrick,

danke für deine Mühe. Ich setzte mich dran!

Man kann das sicher anders oder "passender" machen, aber ich denke, dass 
das ein Einstieg für mich ist, wo ich dann auch was sehe.

Danke trotzdem!

von Thomas (kosmos)


Lesenswert?

ist die Drainage nicht an den Kanal angeschlossen oder wieso bleibt dort 
überhaupt das Wasser stehen. Oder drückts evtl. sogar Wasser aus dem 
Kanal zurück?

Ich würde 2 Schwimmschalter verschiedener Bauformen verwenden und eine 
OR Schaltung aufbauen nicht das mal ein Schwimmer hängt und die Pumpe 
läuft dann wieder nicht.

von Ch S. (spelli)


Lesenswert?

Hallo!
Die Drainage ist an den Kanal angeschlossen, der Zugang zum Kanal ist 
aber sehr weit oben - ist auch gut so, damit es nicht ggf. vom Kanal 
herdrückt.

Die Drainage ist ca. 3 Meter tief. Da unten steht grds. immer Wasser. 
Durch die Pumpe wird es dann von unten in den Kanalzufluss gepumpt, der 
diese übliche Tiefe (von Grasnarbe aus gesehen) von k. A. ca. 70 cm hat; 
das Wasser ist ca. 2,30 Meter tiefer.

Bei der Pumpe handelt es sich auch um eine Baumarktpumpe mit 
integriertem Schwimmschalter. Da will ich nicht viel ändern. Es ist ja 
auch nicht so, dass mir das Haus in 4 Tagen volläuft.

Aber eine schnelle optische Kontrolle ist schon gut. Über eine 
redundante Auslegung der Schwimmschalter der Pumpe habe ich auch schon 
nachgedacht, allerdings wäre dann gleich eine 2. Pumpe sinnvoller...

Die von mir beschriebenen Schwimmschalter haben mit dem Schwimmschalter 
der Pumpe nichts zu tun - diese sollen lediglich die LEDs oben im Deckel 
schalten (2 Schwimmschalter, weil ich vorher so eine miserable Schaltung 
hatte; eine einfache Unterbrechung von + für die rote und für die grüne 
LED...)

Ich stelle mal heute abend Fotos hier rein. Ich habe mich leider 
wirklich am Anfang missverständlich ausgedrückt.

Hier meine Änderungen, ich hatte da auch glaube ich noch zwei 
Sprungmarken nach sensor1_on und sensor2 vergessen:
1
.include "m8def.inc"
2
 
3
         ldi r16, 0b11111111  
4
         out DDRB, r16               ; PB0 und PB1 sind Ausgänge
5
                             
6
         ldi r16, 0b00000000
7
         out DDRD, r16               ; PD0 und PD1 sind Eingänge
8
         
9
         ldi r16, 0b11111111         ; Pullup-Widerstände aktivieren     
10
         out PORTD, r16    
11
                      
12
                   
13
loop:
14
         in r16, PIND                ; an Port D anliegenden Wert/Byte nach r16 einlesen
15
16
17
sensor1:
18
19
   sbic    r16,0               ; Der Befehl sbic ("skip if bit cleared") überspringt den       
20
   rjmp    sensor1_on          ; darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.       
21
   rjmp    sensor2
22
23
24
sensor1_on:
25
26
         sbic    r16,1               ; Der Befehl sbic ("skip if bit cleared") überspringt den      
27
   rjmp    sensor_alternative  ; darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.
28
         sbi     PORTB, 1            ; PB1 auf high setzen, grüne LED leuchtet - unterhalb Pegel
29
         rjmp    loop
30
31
32
sensor2:
33
34
         sbis    r16,1               ; Der Befehl sbis ("skip if bit set") überspringt den 
35
         rjmp    sensor_alternative  ; darauffolgenden Befehl, wenn das angegebene Bit 1 (high) ist. 
36
         sbi     PORTB, 0            ; PB0 auf high setzen, rote LED leuchtet - oberhalb Pegel
37
         rjmp    loop 
38
39
40
sensor_alternative:
41
42
         sbi     PORTB, 0
43
         sbi     PORTB, 1            ; jetzt leuchten beide LEDs zeitgleich ~ also orange...
44
  
45
 
46
rjmp loop                  ; Sprung zu "loop:" -> Endlosschleife

von Ch S. (spelli)


Lesenswert?

Hallo!

Wenn ich diesen Code schreibe, funktioniert alles:
1
.include "m8def.inc"
2
 
3
         ldi r16, 0xFF
4
         out DDRB, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
                           ; Richtungsregister DDRB als Ausgang konfigurieren
6
         ldi r16, 0x00
7
         out DDRD, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
                           ; Richtungsregister DDRD als Eingang konfigurieren
9
 
10
         ldi r16, 0xFF     ; An allen Pins vom Port D die Pullup-Widerstände
11
         out PORTD, r16    ; aktivieren. Dies geht deshalb durch eine Ausgabe
12
                           ; nach PORTD, da ja der Port auf Eingang gestellt ist.
13
loop:
14
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen
15
         out PORTB, r16    ; Inhalt von r16 an Port B ausgeben
16
         rjmp loop         ;  zu "loop:" -> Endlosschleife

Die jeweilige LED leuchtet.

Hier passiert allerdings gar nichts. Theoretisch sollte mindestend eine 
LED leuchten:
1
 .include "m8def.inc"
2
 
3
         ldi r16, 0b11111111  
4
         out DDRB, r16               ; PB0 und PB1 sind Ausgänge
5
                             
6
         ldi r16, 0b00000000
7
         out DDRD, r16               ; PD0 und PD1 sind Eingänge
8
         
9
         ldi r16, 0b11111111         ; Pullup-Widerstände aktivieren     
10
         out PORTD, r16    
11
                      
12
                   
13
          
14
loop:
15
16
17
sensor1:
18
19
   sbic    PIND, 0              ; Der Befehl sbic ("skip if bit cleared") überspringt den       
20
   rjmp    sensor1_on          ; darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.       
21
   rjmp    sensor2
22
23
24
sensor1_on:
25
26
         sbic    PIND, 1              ; Der Befehl sbic ("skip if bit cleared") überspringt den      
27
         rjmp    sensor_alternative  ; darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.
28
         sbi     PORTB, 1            ; PB1 auf high setzen, grüne LED leuchtet - unterhalb Pegel
29
         rjmp    loop
30
31
32
sensor2:
33
34
         sbis    PIND, 1              ; Der Befehl sbis ("skip if bit set") überspringt den 
35
         rjmp    sensor_alternative  ; darauffolgenden Befehl, wenn das angegebene Bit 1 (high) ist. 
36
         sbi     PORTB, 0            ; PB0 auf high setzen, rote LED leuchtet - oberhalb Pegel
37
         rjmp    loop 
38
39
40
sensor_alternative:
41
42
         sbi     PORTB, 0
43
         sbi     PORTB, 1            ; jetzt leuchten beide LEDs zeitgleich ~ also orange...
44
  
45
 
46
rjmp loop                  ; Sprung zu "loop:" -> Endlosschleife

Im AVR Studio wird das "sbic" nicht blau eingefärbt !?

Danke für Eure Hilfe!

von Patrick (Gast)


Lesenswert?

Ch Sp schrieb:
> Im AVR Studio wird das "sbic" nicht blau eingefärbt !?

So lange beim Assemblieren kein Fehler auftritt, weist das bloß auf 
einen Fehler im AVR Studio hin ;)

Wie herum hast Du Deine LEDs angeschlossen? Die LED-Ausgänge werden in 
Deinem Code immer nur auf 1 gesetzt, aber nie wieder zurück auf 0...

Ich vermute, Du hast Deine LEDs zwischen VCC und den Portpin geschaltet? 
Dann geht das Einschalten lediglich so schnell, dass Du es nicht siehst.

von Ch S. (spelli)


Lesenswert?

Guten Morgen!

Ja, Leds hängen mit Vorwiderstand zwischen VCC und Portpin.

Wenn ich das Einschalten aufgrund der Geschwindigkeit nicht sehen kann, 
dann habe ich das alles noch nicht verstanden.

Das Programm ist ja im Prinzip eine Endlosschleife. Beim Starten ist 
kein Taster gedrückt, also müsste doch bei sensor_alternative jeweils 
ein High ausgegeben werden und da sich der Zustand nicht ändert, müsste 
die Schleife wieder zu sensor_alternative kommen...

Du hast geschrieben, dass die LEDs nie auf 0 bzw. low zurückgesetzt 
werden. Das versteh ich nicht?

Weiter oben hattest du den Stackpointer angesprochen. Auch nach Lesen 
und Suchen habe ichs nicht begriffen...

Danke aber für die Hilfe und einen schönen Tag noch!

von Ch S. (spelli)


Lesenswert?

Also hier der weitere Code. Vielleicht kann mir jmd. einen Anstoss 
geben!?

Die Schaltung soll:
- 2 Levelsensoren auswerten (einer zeigt über Pegel, der andere unter 
Pegel an) -> hängen an PD0 und PD1 und würden gegen GND schalten
- 2 LEDs (DuoLED) hängen an PB0 und PB1 gegen VCC

-> bei unterschiedlichen Sensorschaltzuständen (1 und 0 oder 0 und 1) 
leuchtet je nach dem die grüne oder rote LED. Bei 0 und 0 oder 1 und 1 
leuchten beide -> orange Färbung... Soweit mein Vorhaben.

Patrick hat zwei Threads weiter oben eingeschrieben, dass das 
Einschalten so schnell geht, dass ich es nicht sehen kann... Verstehe 
das leider nicht.

Danke, Christoph

1
  .include "m8def.inc"
2
 
3
         ldi r16, 0b11111111  
4
         out DDRB, r16                    ; PB0 und PB1 sind Ausgänge
5
                             
6
         ldi r16, 0b00000000
7
         out DDRD, r16                ; PD0 und PD1 sind Eingänge
8
         
9
         ldi r16, 0b11111111          ; Pullup-Widerstände aktivieren     
10
         out PORTD, r16    
11
        
12
                  
13
.def temp = r16
14
 
15
         ldi temp, HIGH(RAMEND)       ; HIGH-Byte der obersten RAM-Adresse
16
         out SPH, temp
17
         ldi temp, LOW(RAMEND)        ; LOW-Byte der obersten RAM-Adresse
18
         out SPL, temp          
19
20
21
loop:
22
     ldi r16, 0b11111111
23
         out PORTB, r16               ; alle LEDs aus
24
25
26
sensor1:
27
         sbic    PIND, 0              ; Der Befehl sbic ("skip if bit cleared") überspringt den       
28
         rjmp    sensor1_on           ; darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.       
29
         rjmp    sensor2
30
31
32
sensor1_on:
33
         sbic    PIND, 1              ; Der Befehl sbic ("skip if bit cleared") überspringt den      
34
         rjmp    sensor_alternative   ; darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.
35
         sbi     PORTB, 1             ; PB1 auf high setzen, grüne LED leuchtet - unterhalb Pegel
36
         rjmp    loop
37
38
39
sensor2:
40
         sbis    PIND, 1              ; Der Befehl sbis ("skip if bit set") überspringt den 
41
         rjmp    sensor_alternative   ; darauffolgenden Befehl, wenn das angegebene Bit 1 (high) ist. 
42
         sbi     PORTB, 0             ; PB0 auf high setzen, rote LED leuchtet - oberhalb Pegel
43
         rjmp    loop
44
45
46
sensor_alternative:
47
         sbi     PORTB, 0
48
         sbi     PORTB, 1              ; jetzt leuchten beide LEDs zeitgleich ~ also orange...
49
 
50
51
         rjmp    loop                  ; Sprung zu "loop:" -> Endlosschleife

von spess53 (Gast)


Lesenswert?

HI

Mach es dir doch nicht so kompliziert. Deine 2 Schalter können maximal 4 
Zustände haben. In deinem Fall nur 3 da das Wasser nicht gleichzeitig 
über dem oberen und unter dem unteren Schwimmer sein kann.
1
loop:    in r16,PIND
2
         andi r16,0b00000011
3
         brne loop10
4
                             ;PIND1:0 = 00
5
         sbi/cbi   PORTB, 0
6
         sbi/cbi   PORTB, 1
7
8
         rjmp loop
9
10
loop10:  cpi r16,1
11
         brne loop20
12
                             ;PIND1:0 = 01
13
         sbi/cbi   PORTB, 0
14
         sbi/cbi   PORTB, 1
15
16
         rjmp loop
17
18
loop20:  cpi r16,2
19
         brne loop30
20
                             ;PIND1:0 = 10
21
         sbi/cbi   PORTB, 0
22
         sbi/cbi   PORTB, 1
23
24
         rjmp loop
25
26
loop30:  sbi/cbi   PORTB, 0  ;PIND1:0 = 11
27
         sbi/cbi   PORTB, 1
28
29
         rjmp    loop

Suche dir aus dem Code die richtigen Kombinationen aus und setze die 
passenden Ausgänge (sbi/cbi   PORTB, x).

MfG Spess

von Ch S. (spelli)


Lesenswert?

Hallo!

Danke! Das ist aber auf den ersten Blick saukompliziert und dann logisch 
;-)

Mit dem Vergleich hatte ich mir am Anfang auch ein Konstrukt aufgemalt, 
aber da habe ichs mir sehr kompliziert gemacht. So ist es einfach.

Was
1
brne
 angeht muss ich noch lesen, dass habe ich nicht ganz verstanden. Was 
hier im Code passiert kann ich -glaube ich- nachvollziehen!

Danke erst einmal. Einerseits freue ich mich und andererseits ist es 
doch sehr kompliziert... und nicht von mir... :-(

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.