Forum: Mikrocontroller und Digitale Elektronik LED steuer Problem


von Leonard S. (renixor)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe zwei Fragen zu meinem momentanen Projekt!

1.
Vor kurzer Zeit habe ich mir solche DUO-LEDS mit zwei Farben(Rot und 
Grün)gekauft. Nun wollte ich mithlife eines ATMEGA 8 jene so ansteuern, 
dass wenn ein Taster gedrückt wurde die LED zwischen ROT, GRÜN und AUS 
wechselt
Bei meinem Angehängtem-Code stellt sich die LED sofort auf Rot, ohne das 
der Taster überhaupt gedrückt wurde. Wäre nett wenn sich dass mal 
anguckt und mir erklärt was ich jetzt falsch gemacht habe.

Zu der Pin belegung:

   PB1 : Taster
   PD1 : Led Ader
   PD2 : Led Ader

Welche Ader welche Farbe ist, weiss ich nicht, ist aber auch nicht so 
wichtig (denke ich)

2.
Ich möchte mit meinem ATMEGA8 bei einem Motor die Dreh-Richtung 
bestimmem können, ich wollte dies mit den Transitoren  BC845C machen.

Mit Transistoren kenne ich mich nicht so gut aus !
Geht der oben gepostete Schaltplan?

Vielen Dank,

Renixor

von Leonard S. (renixor)


Angehängte Dateien:

Lesenswert?

SRY ! Falsche Datei!

von Karl H. (kbuchegg)


Lesenswert?

Mit dem Project File kann keiner was anfangen.
Wir brauchen schon den Source Code.

Und wenn du schon dabei bist: Wie ist dein Taster angeschlossen?

von Falk B. (falk)


Lesenswert?

@  Leonard S. (renixor)

>Vor kurzer Zeit habe ich mir solche DUO-LEDS mit zwei Farben(Rot und
>Grün)gekauft.

Anschlussbelegung?

> Nun wollte ich mithlife eines ATMEGA 8 jene so ansteuern,
>dass wenn ein Taster gedrückt wurde die LED zwischen ROT, GRÜN und AUS
>wechselt
>Bei meinem Angehängtem-Code

Der fehlt. Du hast nur eine Projektdatei geschickt.

>Welche Ader welche Farbe ist, weiss ich nicht, ist aber auch nicht so
>wichtig (denke ich)

Denken sollte man das nicht nennen. Eines der wesentlichen Dinge beim 
Programmieren ist VOLLSTÄNDIGKEIT und KORREKTHEIT. Lari-Fari kannst du 
im Koffeeshop machen.

>Ich möchte mit meinem ATMEGA8 bei einem Motor die Dreh-Richtung
>bestimmem können, ich wollte dies mit den Transitoren  BC845C machen.

Wollte. Nimm besser eine fertige H-Brücke ala L6203, siehe [[H-Brücken 
Übersicht]].

>Mit Transistoren kenne ich mich nicht so gut aus !

Sieht man.

>Geht der oben gepostete Schaltplan?

Nein.

von Klaus (Gast)


Lesenswert?

>Geht der oben gepostete Schaltplan?
NEIN!

Ween schon die Emitter mit GND beschalten und den Kollektor als Ausgang.

An der Basis der Transistoren müssen Widerstände angeschlossen sein 
sonst die Transistoren schnell Tod.

von Leonard S. (renixor)


Lesenswert?

Die Anschluss Belegung ist 2 vcc und eine Gnd (GND ist immer 
angeschlossen)

von Leonard S. (renixor)


Lesenswert?

Würden 1k wiederstände Reichen?
sollen nur beides macl 5v dran

von spontan (Gast)


Lesenswert?

Wer hat sich denn diese Schaltung mit den Transistoren ausgedacht?
Ab in den Papierkorb, ob mit oder ohne Basiswiderstände, des wird so 
nix.

von Karl H. (kbuchegg)


Lesenswert?

Leonard S. schrieb:
> Die Anschluss Belegung ist 2 vcc und eine Gnd (GND ist immer
> angeschlossen)

?
Wie meinen?

Der Taster:
wie ist der angeschlossen? Schaltet der nach GND oder nach Vcc?

Die LED:
Ist das eine mit 3 Beinen?


Für die Zukunft: Beschreibe nicht deine Schaltung, sondern mal sie auf. 
Wenn du nichts anderes hast, dann mach auf einem Papier eine schnelle 
Skizze und fotografier sie mit deinem Handy. Aus der Schaltung kann man 
alles Wichtige und Wesentliche entnehmen. Machst du eine 
Prosabeschreibung muss man 3 mal nachfragen, ehe man alle Einzelteile 
beisammen hat und das Programm untersuchen kann, ob das mit der 
Schaltung überhaupt logisch zusammenstimmt.

von Leonard S. (renixor)


Lesenswert?

ok mach ich nächstes mal! der taster
 ist mit gnd verbunden
zu led, ja sie hat 3 beine
Desweiteren MUSS es mein programm sein, da ich wenn ich nur 0b00000110 
ausgebe
die LED orange ist, also beides an.

von Leonard S. (renixor)


Angehängte Dateien:

Lesenswert?

Ich fange nochmal neu an!

Also das obige Schaltbild erklärt dann wie was angeschlossen ist !
Ich möchte das, wenn man S1 drückt die Led zwischen Rot, Grün und aus 
schaltet. Irgend etwas ist bei meinem Programm falsch, da wenn ich nur
1
.include "m8def.inc"
2
    
3
      ldi r16, 0b00000110    ; PORTD PIN1&2 Ausgang
4
      out DDRD, r16
5
      
6
      ldi r16, 0b11111101    ; PORTB PIN1 Eingang
7
      out DDRB, r16
8
9
      ldi r16, 0b00000010    ; PULLUPs für den Eingang
10
      out PORTB, r16
11
12
      ldi r16, 0b00000110
13
      out PORTD, r16
als Programm benutze, gehen Rot und Grün an und man sieht ein orange.

Wo liegt dann der Fehler im angehängtem Code?

Wenn ich noch irgend wo einen Fehler habe, sagt es mir bitte!

Vielen Dank,

Renixor

von Chris (Gast)


Lesenswert?

-5V an GND?

von Leonard S. (renixor)


Lesenswert?

ist doch Richtig ?!?

von Chris (Gast)


Lesenswert?

dein Programm funktioniert doch einwandfrei... lol. Du schaltest Rot und 
Gruen ein... ne Tasterabfrage is da nirgends drin

von Leonard S. (renixor)


Lesenswert?

im angehängetem code ( über dem Schaltplan )
und -5v ist doch falsch sry!

von Chris (Gast)


Lesenswert?


von Leonard S. (renixor)


Lesenswert?

Was soll ich damit?
1. hab ich mir das schon ca. 10 mal durchgelesen
2. hab ich ausversehen das falsche zeichen eingefügt!

von Michael R. (mexman) Benutzerseite


Lesenswert?

1. Brauchen die LED keinen Vorwiderstand?
2. Sehe ich hier immernoch keinen Code, ausser Deinem "Orange"-Code.
3. Habe ich keine Lust irgendwelche Anhaenge mit irgendwelchen komischen 
Programmen zu oeffnen um Deine Projekte anzusehen

Gruss

Michael

von Michael R. (mexman) Benutzerseite


Lesenswert?

Siehe Mail von Chris:
Bisher koennen wir hier nicht sehen WO/WIE Dein uC feststellt, ob der 
Taster gedrueckt ist!

Gruss

Michael

von Leonard S. (renixor)


Lesenswert?

mhh also bei MIR ist über dem Schaltp lan eine Datei Motor_Steuerung und 
nebendran steht "codeansicht" dann sollte man den code sehen

von Leonard S. (renixor)


Lesenswert?

und die Led ist für um die 7v ausgelegt also kein wiederstand

von Leonard S. (renixor)


Lesenswert?

So damit auch jeder meinen Code findet:
1
.include "m8def.inc"
2
      
3
4
      ldi r16, 0b00000110
5
      out DDRD, r16
6
      
7
      ldi r16, 0b11111101
8
      out DDRB, r16
9
10
      ldi r16, 0b00000010
11
      out PORTB, r16
12
13
      ldi r21, 0b00000100
14
      ldi r22, 0b00000010
15
      ldi r23, 0b00000000
16
      ldi r20, 0
17
18
loop:
19
      sbic PINB, 1
20
      rjmp loop
21
            cpi r20, 0
22
      brne loop1
23
          rjmp Status_1
24
25
loop1:
26
        cpi r20, 1
27
      brne loop2
28
      rjmp Status_2
29
30
loop2:
31
        cpi r20, 2
32
      brne loop
33
      rjmp Status_3
34
35
Status_1:
36
      out PORTD, r21
37
      inc r20
38
        rjmp Key_up
39
40
41
Status_2:
42
      out PORTD, r22
43
      inc r20
44
      rjmp Key_up
45
46
47
Status_3:
48
      out PORTD, r23
49
      ldi r20, 0
50
      rjmp Key_up
51
52
53
Key_up:    
54
55
      sbic PIND, 1
56
      rjmp loop
57
      rjmp Key_up

hoffe ihr könnt mir nun helfen :)

von Michael D. (etzen_michi)


Lesenswert?

Nabend.

In deinem letzten Codeschnitpzel
1
.include "m8def.inc"
2
    
3
      ldi r16, 0b00000110    ; PORTD PIN1&2 Ausgang
4
      out DDRD, r16
5
      
6
      ldi r16, 0b11111101    ; PORTB PIN1 Eingang
7
      out DDRB, r16
8
9
      ldi r16, 0b00000010    ; PULLUPs für den Eingang
10
      out PORTB, r16
11
12
      ldi r16, 0b00000110
13
      out PORTD, r16

Hast du PD2:1 jeweils High, was die LED`s so wie du es beschreibst daher 
das sie mir der Anode am µC hängen leuchten lässt.

Mit:
1
.include "m8def.inc"
2
    
3
      ldi r16, 0b00000110    ; PORTD PIN1&2 Ausgang
4
      out DDRD, r16
5
      
6
      ldi r16, 0b11111101    ; PORTB PIN1 Eingang
7
      out DDRB, r16
8
9
      ldi r16, 0b00000010    ; PULLUPs für den Eingang
10
      out PORTB, r16
11
12
      ldi r16, 0b00000000
13
      out PORTD, r16
werden die Ports mit den LED`s auf Masse gezogen, weswegen diese 
nichtmehr an sein werden.

In deinem zweiten Beispiel (letzter Post) fehlt die Zeile:
1
      ldi r16, 0b00000000
2
      out PORTD, r16

Solltest du damit Probleme haben, das deine LED beim betätigen des 
Tasters mehr als 1x wechselt, ist dein Taster nicht ausreichend 
entprellt (Schaut mir recht waage aus die entprellung). Hierzu kannst du 
dir ja mal anschauen "Entprellung per Polling" oder in deinem 
Unterprogramm wo du schaust ob der Taster losgelassen wurde eine 
Warteschleife hinzufügen, welche ein wenig wartet und dann erst schaut 
ob losgelassen wurde. Das gleiche dann nochmal sobald losgelassen wurde, 
damit das nächste Prellen nicht deine LED um einen weiteren Schritt 
weiterschaltet.

von Leonard S. (renixor)


Lesenswert?

ok danke , das problem bei diesem code  war , dass die led geblinkt hat.
mal gucken ob sich da was machen lässt

von Leonard S. (renixor)


Lesenswert?

Ich merke gerade das du da etwas falsch verstanden hast , der code von 
mir den du ganz oben zitiert hast war nur ein beispiel, dass es nicht an 
der Hardware liegt....

Desweiteren ist mein Problem , das er mit meinem vorletztem geposteten 
code einfach direkt, ohne das ich den Taster drücke , rot leuchtet. Das 
verstehe ich nicht!

von Michael D. (etzen_michi)


Lesenswert?

Lade nochmal deinen aktuellen Code hoch (komplett).

Dazu nochmal den Schaltplan und eine genaue Beschreibung des Problems.

Dann brauch ich nicht dauernt hoch und runter scrollen, zudem ist dann 
ein fehlverstehen ausgeschlossen.

von Leonard S. (renixor)


Lesenswert?

Sooo hab gerade einen Fatalen Fehler entdeckt, ich habe zwar die LEDS 
getestet aber nicht den Taster, der war defekt. Schnell ausgetauscht und 
nun ein neues Problem. Das , den code und alles schreibe ich gleich 
nochmal seperat

von Leonard S. (renixor)


Angehängte Dateien:

Lesenswert?

1
.include "m8def.inc"
2
      
3
4
      ldi r16, 0b00000110
5
      out DDRD, r16
6
      
7
      ldi r16, 0b11111101
8
      out DDRB, r16
9
10
      ldi r16, 0b00000010
11
      out PORTB, r16
12
13
      ldi r21, 0b00000100
14
      ldi r22, 0b00000010
15
      ldi r23, 0b00000000
16
      ldi r20, 0
17
18
loop:
19
      sbic PINB, 1
20
      rjmp loop
21
22
23
      cpi r20, 0
24
      brne loop1
25
      rjmp Status_1
26
27
loop1:
28
      cpi r20, 1
29
      brne loop2
30
      rjmp Status_2
31
32
loop2:
33
      cpi r20, 2
34
      brne loop
35
      rjmp Status_3
36
37
Status_1:
38
      out PORTD, r21
39
      ldi r20, 1
40
      rjmp Key_up
41
42
43
Status_2:
44
      out PORTD, r22
45
      ldi r20, 2
46
      rjmp Key_up
47
48
49
Status_3:
50
      out PORTD, r23
51
      ldi r20, 0
52
      rjmp Key_up
53
54
55
Key_up:    
56
57
      sbic PIND, 1
58
      rjmp loop
59
      rjmp Key_up

So das ist der Aktuelle Code ,der auch aufm Mega ist!

Der Schaltplan:
Oben Angehängt!

Das Problem:
Ich stecke das Netzteil ein, LED bleibt dunkel.
Bei Knopfdruck leuchtet die LED ROT, bei nochmaligem drücken passiert 
allerdings nichts mehr!

von Karl H. (kbuchegg)


Lesenswert?

:-)
1
Key_up:    
2
3
      sbic PIND, 1
4
      rjmp loop
5
      rjmp Key_up

ich denke dein Taster hängt am Pin 1 vom PINB (nicht PIND)

von Leonard S. (renixor)


Lesenswert?

OMG Ja -.-
Danke! gegen Wand renn Hab ich einfach übersehen!

von Karl H. (kbuchegg)


Lesenswert?

Vorschlag:

Benutze ein paar .equ
Dann kannst du dir für die Ports ein paar anwendungsspezifische 
Bezeichnungen einführen und dann passiert dir sowas nicht mehr so leicht
1
.include "m8def.inc"
2
      
3
.equ LED_PORT = PORTD
4
.equ LED_DDR  = DDRD
5
6
.equ KEY_PORT = PORTB
7
.equ KEY_PIN  = PINB
8
.equ KEY_DDR  = DDRB
9
10
11
      ldi r16, 0b00000110
12
      out LED_DDR, r16
13
      
14
      ldi r16, 0b11111101
15
      out KEY_DDR, r16
16
17
      ldi r16, 0b00000010
18
      out KEY_PORT, r16
19
20
      ldi r21, 0b00000100
21
      ldi r22, 0b00000010
22
      ldi r23, 0b00000000
23
      ldi r20, 0
24
25
loop:
26
      sbic KEY_PIN, 1
27
      rjmp loop
28
29
30
      cpi r20, 0
31
      brne loop1
32
      rjmp Status_1
33
34
loop1:
35
      cpi r20, 1
36
      brne loop2
37
      rjmp Status_2
38
39
loop2:
40
      cpi r20, 2
41
      brne loop
42
      rjmp Status_3
43
44
Status_1:
45
      out LED_PORT, r21
46
      ldi r20, 1
47
      rjmp Key_up
48
49
50
Status_2:
51
      out LED_PORT, r22
52
      ldi r20, 2
53
      rjmp Key_up
54
55
56
Status_3:
57
      out LED_PORT, r23
58
      ldi r20, 0
59
      rjmp Key_up
60
61
62
Key_up:    
63
64
      sbic KEY_PIN, 1
65
      rjmp loop
66
      rjmp Key_up

Neben der Vermeidung von 'blöden' Fehlern, hat man damit dann auch 
automtisch eine gewisse Dokumentation, welchem Zweck ein PINx oder PORTx 
Zugriff hat.
1
      sbic KEY_PIN, 1
hat nun mal einen größeren dokumentarischen Wert als
1
      sbic PIND, 1

von Leonard S. (renixor)


Lesenswert?

ok ! vielen dank das du dir das alles angeguckt hast, es funktionier 
jetzt!
Mit dem .equ kannte ich noch nicht :)

Nochmals Vielen Dank :

 Renixor

von Karl H. (kbuchegg)


Lesenswert?

Leonard S. schrieb:
> ok ! vielen dank das du dir das alles angeguckt hast, es funktionier
> jetzt!
> Mit dem .equ kannte ich noch nicht :)

Im >>> AVR-Tutorial <<< finden sich viele solcher kleiner Helferchen :-)

(Unter anderem auch ein Kapitel darüber, welche Probleme Taster machen, 
wenn sie mal ein wenig ausgeleiert sind)

von Michael D. (etzen_michi)


Lesenswert?

1
.include "m8def.inc"
2
      
3
4
      ldi r16, 0b00000110
5
      out DDRD, r16      // PinD1:2 für die LED`s als Ausgang
6
      
7
      ldi r16, 0b11111101
8
      out DDRB, r16      // PinB1 für den Taster als Eingang
9
10
      ldi r16, 0b00000010
11
      out PORTB, r16      // PinB1 PullUp aktivieren
12
13
      ldi r16, 0x00
14
      out PORTD, r16      // Um Fehler zu verhindern Pins der LED auf GND schalten
15
16
      ldi r21, 0b00000100    // Zustände der LED's in Register r21 bis r23
17
      ldi r22, 0b00000010
18
      ldi r23, 0b00000000
19
      ldi r20, 0      // r20 als Status der LED`s
20
21
loop:
22
      sbic PINB, 1      // überprüfe ob Taster betätigt
23
      rjmp loop        // wenn nicht, springe wieder nach Loop
24
25
26
      cpi r20, 0      // Überprüfe ob LED Status 0 haben
27
      brne loop1      // Wenn nicht rufe "loop1 auf"
28
      rjmp Status_1      // Wenn ja rufe "Status_1" auf
29
30
loop1:
31
      cpi r20, 1      // Überprüfe ob LED`s Status 1 haben
32
      brne loop2      // Wenn nicht dann rufe "loop2" auf
33
      rjmp Status_2      // Ansonsten wenn LED Status 1 war rufe "Status_2" auf
34
35
loop2:
36
      cpi r20, 2      // Überprüfe ob LED`s Status 2 haben
37
      brne loop        // Wenn nicht gehe zurück in die Schleife "loop"
38
      rjmp Status_3      // Wenn LED`s Status 2 haben rufe "Status_3" auf
39
40
Status_1:
41
      out PORTD, r21      // Gehe PORTD aus das LED`s Status 0 leuchten
42
      ldi r20, 1
43
      rjmp Key_up      // Warte bis Taster losgelassen
44
45
46
Status_2:
47
      out PORTD, r22      // Gehe PORTD aus das LED`s Status 1 leuchten
48
      ldi r20, 2
49
      rjmp Key_up      // Warte bis Taster losgelassen
50
51
52
Status_3:
53
      out PORTD, r23      // Gehe PORTD aus das LED`s Status 2 leuchten
54
      ldi r20, 0
55
      rjmp Key_up      // Warte bis Taster losgelassen
56
57
58
Key_up:    
59
60
      sbic PIND, 1      // Überspringe nächsten Befehl wenn Taster gedrückt
61
      rjmp loop        // Wenn Taster nichtmehr gedrückt springe in Loop
62
      rjmp Key_up      // Wenn Taster weiterhin gedrückt springe ins Programm Key_up

Bei asm kannst du dir fast angewöhnen nahezu jede Zeile zu kommentieren. 
Habe das mal grob gemacht.
Was mir hier auffällt:
Ich sehe ich keine Funktion wo du (Hier LED`s Status) incrementierst, 
sonst solltest du ein fröhliches geblinke erhalten wenn du den Taster 
gedrückt hälst.

von Karl H. (kbuchegg)


Lesenswert?

Michael D. schrieb:

> Bei asm kannst du dir fast angewöhnen nahezu jede Zeile zu kommentieren.
> Habe das mal grob gemacht.

Die meisten deiner Kommentare kannst du in der Pfeife rauchen.
Deine Kommentare erzählen nichts, was nicht auch im Quelltext steht. Im 
besten Fall sind sie also einfach nur (in der jetzigen Form) 
überflüssig. Im schlimmsten Fall sind sie falsch.
Ein Kommentar
1
      brne loop        // Wenn nicht gehe zurück in die Schleife "loop"
ist so sinnlos und überflüssig wie ein Kropf.

Wenn es möglich ist, ist es IMMER besser, den Code selbst so zu pimpen, 
dass man keine Kommentare braucht bzw. nur eingeschränkt braucht.

von chris (Gast)


Lesenswert?

Leonard S. schrieb:
> und die Led ist für um die 7v ausgelegt also kein wiederstand

Oooohhh mein gott... nich schon wieder

von Michael D. (etzen_michi)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die meisten deiner Kommentare kannst du in der Pfeife rauchen.

Ich würde nicht die meisten sagen, aber schon solche wie "Rufe xy auf", 
die wollte ich grade nochmal ändern, da es mir beim dritten 
korrekturlesen aufgefallen war.

Andere werden Teilweise sinnfrei, sobald man mit .equ arbeitet, da dann 
die Register Namen haben.

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.