Hallo, für meine Audioendstufe brauche ich eine Einschaltverzögerung. Ich war der Meinung das es mit einem Attiny 2313 kein Problem sein sollte. Nach dem Einschalten bekommt der Attiny 2313 seine 5 Volt , die Zeitschleife wird durchlaufen, der Port D0 geht auf High und der Transistor schaltet durch - die LED - später ein Relais- brennt - so solltet es sein. Aber ich vermute beim Festlegen der Portrichtung Eingänge oder Ausgänge ldi temp,0xff out DDRD,temp ; Port D geht der Port D0 für ca. 500ms auf High - danach geht Port D0 nach Ablauf der Zeitschleife auf High - so wie es soll. Ich verwende Windows Xp SP3 Avr Studio 4.19 ein STK500 und einen Attiny 2313. Ich finde keine Lösung, das beim Einschalten nicht Port D0 für 500ms auf High geht. Ich habe den Attiny 2313 auch mit einem Galep 3 programmiert - keine Änderung. Hat jemand eine Idee?
Lukas S. schrieb: > Aber ich vermute beim Festlegen der Portrichtung Eingänge oder Ausgänge > ldi temp,0xff > out DDRD,temp ; Port D > > geht der Port D0 für ca. 500ms auf High Nein, warum sollte er das tun? Und: Warum vermutest du, dass er das tut? Ich würde mal darauf tippen, dass du garnicht das in den Controller flashst, was du programmiert hast, denn das sieht eigentlich ziemlich richtig aus, wenn auch grottig zu lesen durch den vielen auskommentierten Code... Sprich: Bedienfehler der IDE...
Alle AVR setzen bei Hardware Reset ihre Ports auf Input ohne Pullup. Es kann also sinnvoll sein, durch externe Pullups oder -downs den Ruhezustand so zu wählen, das erstmal nichts passiert. Wird der Port dann auf Output programmiert, kann man einen Zyklus später den gewünschten Zustand in den Pin schreiben. Der Zyklus ist dabei typisch 1/Taktfrequenz lang - bei 1Mhz Takt also 1 µs.
Hallo Matthias, kannst Du mir die Befehle nennen ? Ich weiss nicht wo ich da Anfangen soll.
Matthias S. schrieb: > Wird der Port > dann auf Output programmiert, kann man einen Zyklus später den > gewünschten Zustand in den Pin schreiben. Der Zyklus ist dabei typisch > 1/Taktfrequenz lang - bei 1Mhz Takt also 1 µs. Warum sollte man das so herum machen? Man kann doch auch erst den gewünschten Zustand ins PORT Register schreiben und danach erst die Pintreiber durch des Schreiben nach DDR anschalten. Zumindest wenn man Ruhezustand = L haben will, funktioniert das 1A. Wenn man sauber von Tristate auf H kommen will, hat man ein Problem, weil man den Pullup nicht separat schalten kann, sondern ihn beim Schreiben auf das PORT Register anschaltet. Man macht also zwangsweise eine Sequenz Tristate -> schwaches H (Pullup) -> H durch.
Axel S. schrieb: > ... Wenn > man sauber von Tristate auf H kommen will, hat man ein Problem, weil man > den Pullup nicht separat schalten kann, sondern ihn beim Schreiben auf > das PORT Register anschaltet. Man macht also zwangsweise eine Sequenz > Tristate -> schwaches H (Pullup) -> H durch. Auch wenn man PUD im MCUCR Register nutzt?
Idee 1: Gibt es irgendeinen Bootloader auf dem Attiny? Idee 2: Zeigt die Bootloader Fuse eventuell an einen anderen Startpunkt. (falls es eine gibt) Idee 3: Was machst du nach dem setzen des DDR? Wenn er danach nichts mehr machen soll, dann muss eine Endlosschleife hin (while (1); ). Sonst arbeitet er die nop ab bis er am Ende des Speichers angekommen ist und fängt anschließend wieder von vorne an.
kladde schrieb: > Axel S. schrieb: >> ... Wenn >> man sauber von Tristate auf H kommen will, hat man ein Problem, weil man >> den Pullup nicht separat schalten kann, sondern ihn beim Schreiben auf >> das PORT Register anschaltet. Man macht also zwangsweise eine Sequenz >> Tristate -> schwaches H (Pullup) -> H durch. > > Auch wenn man PUD im MCUCR Register nutzt? Stimmt. Hatte ich gar nicht auf dem Radar. Allerdings wirkt das auf die Pullups an allen Pins. Hat also u.U. unerwünschte Nebenwirkungen.
Lukas S. schrieb: > kannst Du mir die Befehle nennen ? Ich weiss nicht wo ich da Anfangen > soll. Nirgendwo. Das Programm ist vollkommen korrekt, mal abgesehen davon, dass die Delay-Zeit nicht so ganz stimmt. Für die angegebenen 4MHz Systemtakt ergibt sich für den gezeigten Code eine Zeit von ca. 300ms. Der Rest, also die Ansteuerung der Pins, passt aber 100%. Und tut, was er soll. Deswegen nochmal die Frage: > Warum vermutest du, dass er das tut? Das sind eigentlich zwei Fragen, einmal Betonung auf "warum" und einmal Betonung auf "vermutest".
Beitrag #6242354 wurde von einem Moderator gelöscht.
Lukas S. schrieb: > Weil die LED beim Einschalten für ca. 500 ms hell wird, was sie nicht > soll ! Wenn das so ist, dann läuft auf dem µC nicht das Programm, dessen Code du gezeigt hast. Und die wahrscheinlichste Ursache dafür ist halt ein Bedienfehler der IDE.
Ohne den out DDRD,temp geht die LED beim Einschalten nicht an - aber nach der Zeitschleife auch nicht.
Lukas S. schrieb: > Ohne den out DDRD,temp geht die LED beim Einschalten nicht an - > aber nach der Zeitschleife auch nicht. Natürlich nicht, denn der Pin wird ja auch nicht auf "Ausgang" geschaltet. Es bleibt meiner Meinung nach nur noch eine Möglichkeit: du hast einen Fehler in der Schaltung. Vorschlag: mess mal mit einem Multimeter die Spannung am Pin ohne Last (Basiswiderstand zum Transistor entfernen).
Lukas S. schrieb: > Ohne den out DDRD,temp geht die LED beim Einschalten nicht an - > aber nach der Zeitschleife auch nicht. Wenn diese Änderung im Programm diese sichtbare Auswirkung hatte, dann war meine erste Vermutung bezüglich der Ursache wohl falsch. Bleibt: 1) Handelt es sich tatsächlich um einen Tiny2313? 2) Hardwareschaltung korrekt? Sprich: zeig' ein (besser zwei) Fotos deines Aufbaus. Die Ursache deines Problems kann nur in der Hardware liegen. Ähem, nicht ganz. Screenshot des STK500-Dialogs zum Thema Fuses wäre auch sinnvoll.
Lukas S. schrieb: > Ohne den out DDRD,temp geht die LED beim Einschalten nicht an - > aber nach der Zeitschleife auch nicht. Tatsächlich? Also bei mir reicht der interne Pull-up-Widerstand, um den BD139 durchzusteuern. Und ja, bei mir geht die LED erst nach der Zeitschleife an.
Ich habe schon einige Versuche ohne Erfolg durchgeführt - auch wenn ich ncht alle hier aufgeführt habe. Kannst Du es bei Dir mal nachbauen - die 5 Bauteile sollten doch nicht das Problem sein. Ich brauche schon eine konkrete Hilfestellung.
S. Landolt schrieb: > Tatsächlich? Also bei mir reicht der interne Pull-up-Widerstand, um den > BD139 durchzusteuern. Der wird aber durch das Programm zu keiner Zeit aktiviert, im Gegenteil: der default, also alle Pullups von PortD aus, wird (unnötigerweise) nochmal explizit vom Programm hergestellt. Das kann's also nicht sein. > Und ja, bei mir geht die LED erst nach der > Zeitschleife an. Bei mir auch. Damit haben wir also schon zwei, die die Korrektheit des Programms soweit bestätigen können. Hast du auch die Zeit überprüft?
> Der wird aber durch das Programm zu keiner Zeit aktiviert
c-hater? Was ist dann
sbi PORTD, Bit0
?
> Kannst Du es bei Dir mal nachbauen
Ich habe es nachgebaut.
> Hast du auch die Zeit überprüft?
Die ist natürlich Unsinn, aber hier ja nicht das Thema.
S. Landolt schrieb: > c-hater? Was ist dann > sbi PORTD, Bit0 PORTD0 wird auf High geschaltet, da DDRD0 zu diesem Zeitpunkt 1 ist. Aber OK, du hast Recht, im Kontext des des Versuchs ohne die Zeile mit dem setzen des DDR-Registers wird hier tatsächlich nur der Pullup aktiviert. Und auch dann sollte wirklich schon mehr als genug Strom fließen, um die LED leuchten zu lassen. Sprich: Fehler im Hardwareaufbau des TO ist jetzt bereits doppelt bewiesen. Einmal dadurch, dass das Programm offensichtlich funktioniert, andererseits dadurch, dass das geänderte Programm ebenfalls funktionieren müsste, es aber ebenfalls nicht tut, aber trotzdem abweichend reagiert.
Okay, also nochmal ganz deutlich für Lukas S.: Ob mit oder ohne
1 | out DDRD,temp |
die LED geht an, und zwar erst nach der Zeitschleife. Originalprogramm, in der gezeigten Schaltung, bei mir mit 4 MHz-Quarz. Die Zeiten stimmen nicht, okay - 'brne' benötigt 2 Takte, ist das bekannt?
Bring mal einen 100nF Kondensator zwischen VCC und GND. Ohne können komische Dinge passieren. Du verwendest den internen Takt? Der ist so ungenau da kann ich mir schon vorstellen dass deine delay Funktion ungenau wird.
Also, ich verwende den internen 4 Mhz Takt. Der ist für den Empfang von RC5 Signalen und für das Senden von anderen IR-Codes vollkommen ausreichend. Ob die Zeitschleife hier 3 Sekunden oder 5 Sekunden braucht ist für diese Anwendung egal. Die 500 ms haben mit der Zeitschleife nichts zu tun. Ich habe die Schaltung ohne STK500 auf einer Platine ohne Erfolg aufgebaut. Eine Messung am unbeschalteten Ports mit dem Scope ergeben nach dem einschalten High für ca. 500 ms.
Lukas S. schrieb: > Eine Messung am unbeschalteten Ports mit dem Scope ergeben nach dem > einschalten High für ca. 500 ms. Meine Glaskugel sagt, Du benutzt keinen ISP sondern einen Bootloader. Und dieser lauscht vermutlich 500ms an RXD.
Peter D. schrieb: > Meine Glaskugel sagt, Du benutzt keinen ISP sondern einen Bootloader. Paßt nicht so ganz zu den Aussagen des TO, er schreibt ja, dass er mit einem STK500 programmiert. Und da es ein Tiny ist, kommt auch ein versehentlich vergessener Bootloader kaum in Frage. Damit der erhalten bliebe, müßte man den Chip-Erase beim Programmieren absichtlich deaktivieren. Dann würde allerdings der Bootloader zu Bitmüll zermangelt und beliebiger Scheiss könnte entstehen. Aber klar: Irgendwas Wesentliches verschweigt der TO ganz offensichtlich. Auffällig auch: Er liefert auch auf konkrete Anfragen keinerlei nützliche Informationen. Ich tippe auf Traffic-Troll.
Hallo, ich werde alles nochmal mit etwas Abstand und einem neuen Attiny 2313 aufbauen. Vielen Dank für die Hilfe.
Hattest du einen 100nF Kondensator (Keramik oder Folie, aber kein Elko!) möglichst nah an VCC?
Hi, wie sehen die Fuses aus? Wird Programm nach vorgegebener Einschwingzeit des Quarzes gestartet? BoD Level? ciao gustav
c-hater schrieb: > Aber klar: Irgendwas Wesentliches verschweigt der TO ganz > offensichtlich. ...oder er kapierts einfach nicht...scheint mir fast wahrscheinlicher :-) Gruß Rainer
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.