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
@ 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.
>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.
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.
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.
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
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
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.
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!
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.
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
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!
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
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)
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.
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.
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.