LED steuer Problem

OP #2694375
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
Angehängte Dateien:
#2694388
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.
Gast #2694390
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.
#2694447
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.
OP #2694629
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
Angehängte Dateien:
OP #2694750
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 :)
#2694813
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.
OP #2694855
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!
OP #2694909
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!
Angehängte Dateien:
#2694932
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
#2694947
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.
#2694952
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren