Forum: Mikrocontroller und Digitale Elektronik LEDs blinken nicht wie gewünscht.


von Blinker (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend Comunity,

ich stehe seit einer Woche vor dem Problem, dass meine LEDs, bzw 4 LED 
Streifen nicht nach dem Rhythmus blinken, den ich mir wünsche.

Zum Vorhaben:
Ich möchte, dass 4 LED Streifen mit 12V Betrieben Nach einem 
programmierbarem Schema blinken, dabei soll die Art des Blinkens mit 
einem Taster verändert werden.
Der Taster muss auf Softwareseite entprellt werden ich erledige das, bei 
jedem Interrupt.

Zum Problem:
Im Moment funktioniert die Schaltung aber es ist meiner Meinung nach 
Murcks.
Wenn ich die LEDs mit dem Kommando "out PORTD, [LEDs]" ausgebe, erfindet 
das Programm während einer Scene z.B. eine 3. Action so gibt es eine 
Scene bei der jeweils 2 LED paare abwechselnd blinken, eine aktion die 
aus 2 Schritten besteht jedoch erfindet das Programm einen 3. Schritt 
der alle LEDs z.B. für einen Interrupt ausschalten, auch werden wahllos 
LEDs eingeschaltet es macht grad was es will.
Das Problem habe ich gelöst indem ich die LEDs nicht mit "PORTD" ausgebe 
sondern indem ich das gesamte DDRD veränder Quasi "out DDRD, [LEDs]". 
Auch im Programm markiert.

Das Programm welches zwar funktioniert in meinen Augen aber Murcks ist:
http://pastebin.com/UJT2SNa1


Der Schaltplan im Anhang das umrandete sind jeweils die LED Streifen.
Auch habe ich versucht, diese über einen N-Kanal Kleinsignal MOSFET zu 
steuern, erfolglos. Auch mit NPN und PNP Transistoren kein erfolg, 
selber Fehler.

von spess53 (Gast)


Lesenswert?

Hi

>Versuch mal ein kürzeres Kabel zu verwenden. Da kann es Interferenzen
>geben(Beim AVR Dragon sind auch 15 cm problematisch).

Sehr gut ggeignet um den AVR zu grillen. Schon mal nach der zulässigen 
Spannung am Portpin im Datenblatt nachgeschlagen?

MfG Spess

von Stefan F. (Gast)


Lesenswert?

Du willst doch nicht im Ernst 150mA aus einem I/O Port holen?

von spess53 (Gast)


Lesenswert?

Hi

Mist. Die Antwort gehört zu diesem

>Ich möchte, dass 4 LED Streifen mit 12V Betrieben Nach einem
>programmierbarem Schema blinken, dabei soll die Art des Blinkens mit
>einem Taster verändert werden.

Zitat.

MfG Spess

von Blinker (Gast)


Lesenswert?

Stefanus ich will es nicht nur, es funktioniert auch, die LEDs leuchten 
ja, ob ich den Chip auf dauer gille ist erstmal ausenvor. Da ich den 
Widerstand der LEDs nicht weis habe ich den Strom gemessen zudem war 
ursprünglich ein Kleinsignal MOSFET in der Schaltung geplant und 
eingebaut gerade aus diesem Grund. Nur weder mit N-Kanal MOSFET noch mit 
NPN oder PNP Transistor bekam ich das ergebnis der richtigen 
Reihenfolge.

von Udo (Gast)


Lesenswert?

Troll

von Blinker (Gast)


Lesenswert?

Udo warum mache ich mir eigentlich die mühe, zeichne einen Schaltplan, 
kommentier das Programm und schreibe einen Ausführlichen Beitrag zu 
meinem Problem in diesem Forum um hinterher als Troll bezeichnet zu 
werden.
Es ist nicht meine Absicht den Chip zu grillen diverse Maßnahmen wurden 
unternommen ich habe sogar überlegt galvanisch zu trennen wobei das zu 
Viel des guten wäre jedoch würde das das eigentliche Problem nicht 
lösen.
Und zu deiner Person, man spührt, wie die Kompetenz aus dir heraus 
sprudelt.

von Udo (Gast)


Lesenswert?

Keine Ahnung von µC und wahrscheinlich keine
Ahnung von Mosfets. Lerne zuerst einmal wie man
was beschaltet und mach einen richtigen
Schaltplan. Und nicht so einen Schwachsinn.

von OldMan (Gast)


Lesenswert?

Dein Programm hat massig Fehler:
Nur zwei Beispiele:

1.
          sbic PINB, 0
          ldi reset, 0x00 // Wurde der Taster losgelassen dann reset auf 
0

sbic = Skip Bit Is Clear!
D.h., wenn PB0 an Port B 0 ist, dann wird die nachfolgende Anweisung
übersprungen.

Glaube nicht, das Du das so willst.

2.
          action0:  // Dauer leuchten 1 Schritt

                  ldi temp, 0x00
                  sub temp, counter // Welche LEDs gehen als nächstes an
              breq action00

                  action00:
                  ldi leds, 0xFF
                  out DDRD, leds // !
                  ldi counter, 0x00
                  reti

action00 wird immer ausgeführt, auch wenn das Ergebnis von sub nicht 
wahr ist.

Vorschlag:

Überdenke Dein Programm noch einmal und schreib es neu.
Und verwende ULNs für die Ansteuerung Deiner LEDs.

von spess53 (Gast)


Lesenswert?

Hi

>... kommentier das Programm und ...

Das aktuelle Programm kannst du hier als Anhang anfügen.

>... um hinterher als Troll bezeichnet zu werden.

Wer die maximum Ratings eines AVRs grob missachtet und das auch noch 
verteidigt läuft stark Gefahr als solcher angesehen zu werden.

MfG Spess

von Blinker (Gast)


Lesenswert?

Danke OldMan, das ist zumindest eine Antwort mit der ich weiter nach dem 
Fehler suchen kann.

spess53 das Thema war ja nicht der Überstrom, wodurch trotzdem die 
Schaltung funktionierte und das stundenlang ich will es auch nicht 
verteidigen und ich habe die LEDs erst direkt angeklemmt, nachdem ich in 
einem Tutorial zur Signalverstärkung las, dass es erlaubt ist 12V zu 
schalten sofern die Spannung vor dem Chip abfällt.
Zudem ist es ja nicht so, das ich vorher 3 mal versuchte, mit dem Chip 
nur Signale und keine Last zu schalten.

OldMan, es ist doch in dieser Szenen unmöglich, das das Ergebnis von Sub 
falsch ist, da der counter niemals die 0 überschreiten wird.
Auch bei weiteren Szenen wird der Counter nach dem letzten Schritt 
wieder auf 0 gesetzt wodurch ein überschreiten ausgeschlossen ist. Sehe 
ich das falsch?

von Stefan F. (Gast)


Lesenswert?

Blinker, du verwirrst mich durch Widersprüchliche Aussagen:

> ich stehe ... vor dem Problem, dass ... nicht nach dem Rhythmus
> blinken, den ich mir wünsche.

Oder kurz gesagt: Es funktioniert nicht.

> Im Moment funktioniert die Schaltung

Kann nicht sein, sie funktioniert ja nicht richtig.

> aber es ist meiner Meinung nach Murcks.

Also ist sie doch mangelhaft?

Dann kam der Hinweis, dass sowohl 12V als auch 150mA den Mikrocontroller 
zerstören. Daraufhin Deine Antwort:

> ich will es nicht nur, es funktioniert auch

Ja was denn nun? Funktioniert die Schaltung, oder funktioniert sich 
nicht? Wenn die LED's nicht so leuchten oder blinken, wie sie sollen, 
dannn funktioniert sie offensichtlich nicht!

> weder mit N-Kanal MOSFET noch mit NPN oder PNP Transistor bekam
> ich das ergebnis der richtigen Reihenfolge.

Also können wir uns darauf einigen, dass die Schaltung nicht 
funktioniert?

Tausche deine 12V LED ketten erstmal durch einfache LED's mit 330 Ohm 
Vorwiderstand aus. Und nimm einen neuen Mikrocontroller, der alte könnte 
defekt sein. Erst danach macht es Sinn, am Programm zu arbeiten.

von Stefan F. (Gast)


Lesenswert?

> Zudem ist es ja nicht so, das ich vorher 3 mal
> versuchte, mit dem Chip
> nur Signale und keine Last zu schalten.

Tja, das hättest Du besser mal gemacht!

Übrigens fehlt im Schaltplan der Abblock-Kondensator. Fehlt der etwa 
auch in der Schaltung? Wenn ja, bringe auch das zuerst in Ordnung.

Oder lies mal ein Buch zu dem Thema. Stichwort "Einstieg in die 
Elektronik mit Mikrocontrollern".

von Axel G. (axelg) Benutzerseite


Lesenswert?

> spess53 das Thema war ja nicht der Überstrom, wodurch trotzdem die
> Schaltung funktionierte und das stundenlang ich will es auch nicht
> verteidigen und ich habe die LEDs erst direkt angeklemmt, nachdem ich in
> einem Tutorial zur Signalverstärkung las, dass es erlaubt ist 12V zu
> schalten sofern die Spannung vor dem Chip abfällt.
> Zudem ist es ja nicht so, das ich vorher 3 mal versuchte, mit dem Chip
> nur Signale und keine Last zu schalten.

Tu verteidigst es schon wieder :)

Fühle dich nicht angegriffen, wenn du auf von dir gemachte grobe Fehler 
hingewiesen wirst. Und 150 mA sind wirklich grob...

Du brauchst auf jeden Fall einen Treiber, ob MOSFET oder bipolar ist 
erstmal wurst.

von OldMan (Gast)


Lesenswert?

Blinker schrieb:
> Sehe
> ich das falsch?

Du hast meine Anmerkungen zu den Codeschnippseln aus Deinem Programm 
nicht
verstanden.
Folge meinem Vorschlag den ich in dem vorangegangen Post gemacht habe 
und
schreibe das Programm komplett neu.
Du solltest Dir auch das Dokument von Atmel (asm_instructionset) genau
anschauen und auch die SBIS/SBIC Befehle richtig verstehen lernen!
Als Tipp:
Register kann man auch mit CLR löschen/nullen.

Werde Dir mit Sicherheit nicht das Programm schreiben.

von Blinker (Gast)


Lesenswert?

Mikrocontroller habe ich genug kann ich verschiedene ausprobieren.

Die Schaltung wie die JETZT ist sowie das Programm so wie ihr es JETZT 
seht FUNKTIONIERT.

Was mich am jetzigen Programm allerdings stört ist folgendes:
1
action10:
2
ldi leds, 0xFF
3
out DDRD, leds // !

Es funktioniert NUR weil ich statt der Anweisung PORTD, die Anweisung 
DDRD verwende, wenn ich überall wo im Programm ein " ! " steht das DDRD 
durch PORTD austausche, so funktioniert die Schaltung NICHT und der Chip 
"Denkt" sich in Szenen einen 3. Schritt dazu der z.B. alle LEDs 
ausschaltet bzw nach belieben einschaltet.

Jedoch finde ich es nicht richtig, die Ports mit der Anweisung DDRD zum 
schalten zu bringen.

Old Man wenn der Taster gedrückt wird, so ist der Pin doch 0.
Demnach ist das Verhalten richtig:
sbic PINB, 0 // Ist der Taster nicht gedrückt? (PB0 ist 1)
ldi reset, 0x00 // Dann ist reset 0 und der Taster kann wieder gedrückt 
werden.

Ist der Taster gedrückt so verweilt reset auf 1 bis das Gegenteil 
festgestellt wird.

von spess53 (Gast)


Lesenswert?

Hi

>Jedoch finde ich es nicht richtig, die Ports mit der Anweisung DDRD zum
>schalten zu bringen.

Ist auch Unsinn. Aber ich habe keine Lust mir das auf irgendwelchen 
ominösen Seiten anzusehen.

MfG Spess

von Stefan F. (Gast)


Lesenswert?

> Die Schaltung wie die JETZT ist sowie das Programm
> so wie ihr es JETZT seht FUNKTIONIERT.

Warum hast Du dann vorher um Hilfe gebeten da die Schaltung nicht wie 
gewünscht Funktioniert. Hast du vorher gelogen oder jetzt?

> Jedoch finde ich es nicht richtig, die Ports mit der
> Anweisung DDRD zum schalten zu bringen.

Das kann durchaus Sinnvoll sein, nämlich wenn sich die Ausgänge wie 
Open-Collector verhalten sollen.

Sag mal, hast Du das Programm etwa kopiert?
Schreib' doch dein eigenes Programm, das verstehst du dann auch 
leichter!

von Blinker (Gast)


Angehängte Dateien:

Lesenswert?

Pastebin ist nicht omniös, gerne bekommst du auch das Programm als 
Download.

von Blinker (Gast)


Lesenswert?

Stefan us das Programm ist nirgendwo Kopiert, habe ich selbst zusammen 
geschrieben, es mag im oberen Bereich teilweise gleich sein mit dem 
Timer Tutorial die Anweisungen sind halt immer die selben jedoch ist das 
Programm zu 100% von mir geschrieben.
Zudem ist es als hilfesuchender nicht meine Absucht zu lügen im 
Abschnitt
"Zu meinem Problem" im 1. Beitrag liest du, dass die Funktion gegeben 
ist, wenn der Port mit DDRD angesprochen wird, da ich allerdings 
festgelegte Ausgänge habe, finde ich Persönlich das nicht richtig bzw 
ist es erstrecht nicht richtig, sobald das Programm spinnt, wenn ich den 
Port mit der anweisung PORTD ausgeben möchte.

von spess53 (Gast)


Lesenswert?

Hi

>"Zu meinem Problem" im 1. Beitrag liest du, dass die Funktion gegeben
>ist, wenn der Port mit DDRD angesprochen wird, da ich allerdings
>festgelegte Ausgänge habe, finde ich Persönlich das nicht richtig bzw
>ist es erstrecht nicht richtig, sobald das Programm spinnt, wenn ich den
>Port mit der anweisung PORTD ausgeben möchte.

Könnte es sein, das du bei der Ausgabe über PortD nicht beachtest, das 
die LED bei L leuchtet und bei H aus ist?

MfG Spess

von Blinker (Gast)


Lesenswert?

Das habe ich beachtet auch bei den Tests mit den Transistoren ist es mal 
der Fall gewesen, dass die LEDs invertiert waren, das löste ich indem 
ich ein "~" vor die Zahl setzte.

von spess53 (Gast)


Lesenswert?

Hi

>Das habe ich beachtet auch bei den Tests mit den Transistoren ist es mal
>der Fall gewesen, dass die LEDs invertiert waren, das löste ich indem
>ich ein "~" vor die Zahl setzte.

Da du PORTD nicht anfasst ist es nach RESET gleich 0x00. Beim Setzen von 
DDRD.n auf 0 machst du nichts anderes als wenn du bei DDR.n=1 PORT auf.n 
auf 0 setzt. Wenn allerdings ein Transistor dazwischen hängt leuchtet 
die LED bei PORT.n = 1.

MfG Spess

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Blinker schrieb:
> Die Schaltung wie die JETZT ist sowie das Programm so wie ihr es JETZT
> seht FUNKTIONIERT.
 Ja, aber nicht so, wie es sein soll.

 Erstens
 Taster prellen. Wird aber bei dir nicht berücksichtigt.
 Soll heissen, bei dir werden mehrere Szenen ubersprungen.

 Zweitens
Blinker schrieb:
> Stefan us das Programm ist nirgendwo Kopiert, habe ich selbst zusammen
> geschrieben, es mag im oberen Bereich teilweise gleich sein mit dem
 Komisch, manche Compiler rücken branch Befehle genau auf die selbe Art
 wie du.

 Drittens
 (Meine Formatierung und meine Kommentare zu deinen Fehlern)
1
action0:
2
  ldi  temp, 0x00      ;* Völlig unnötig, temp ist 0 beim Eintritt
3
  sub  temp, counter
4
  breq  action00        ;* Und wohin springt dein Programm wenn counter > 0 ?
5
6
;*** RICHTIG ! - Auch wieder hier...
7
action00:
8
  ldi  leds, 0xFF

 Normalerweise macht man so etwas nicht mit sub, sondern macht eine Art
 State-machine, etwa so:
1
  cpi  scene, 0x01
2
  breq  Szene_1
3
  ...
4
  ...
5
  cpi  scene, 0x0n
6
  breq  Szene_n
7
  clr  Szene
8
  rjmp  Szene_0
9
;* Wenn du mit Szene_x fertig bist, scene increment und ret

 Viertens
 Du sagst, dass
         out PortD, leds
 nicht funktioniert, aber
         out DDRD, leds // !
 funktioniert.
 Du machst da wahrscheinlich genau das Gegenteil von dem, was du
 eigentlich tun wolltest.
 Und wenn du ein bisschen genauer hinschaust, wirst du wahrscheinlich
 bemerken, dass die LEDs, die eigentlich aus sein sollten, ein bisschen
 schwacher leuchten.
 Warum ?
 Weil du LEDs, die mit Anode an 12V hängen, mit 4,5V an Kathode
 nicht auschalten kannst.
 Also werden LEDs die an Portpins mit Log.1 hängen, schwächer leuchten
 aber mit Sicherheit nicht ausgehen.
 Portpins, die als Eingang geschaltet sind, können ganz einfach nicht
 die benötigten Ströme sinken, weil die hochohmig sind, LEDs an diesen
 pins bleiben dunkel, LEDs an Portpins welche als Ausgang geschaltet
 sind und Log.0 haben, gehen voll an, LEDs an Portpins welche als
 Ausgang geschaltet sind und Log.1 haben, gehen etwas schwächer an.
 Und nur deswegen funktioniert es mit DDRD und nicht mit PORTD.

 Und deswegen soll man bei so etwas Transistor oder ULN2803 nehmen.

 Und deswegen ist deine Schaltung Murks, welche ganz zufällig (falsch)
 funktioniert.


 Etwas davon verstanden ?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Aber es funktioniert doch!

(War ironisch gemeint)

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.