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.
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
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
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.
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.
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.
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.
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
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?
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.
> 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".
> 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.
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.
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.
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
> 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!
Pastebin ist nicht omniös, gerne bekommst du auch das Programm als Download.
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.
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.