Forum: Mikrocontroller und Digitale Elektronik Attiny 2313 Einschaltverhalten der Ports


von Lukas S. (lukaslok)


Angehängte Dateien:

Lesenswert?

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?

von Hmmm (Gast)


Lesenswert?

Lukas S. schrieb:
> geht der Port D0 für ca. 500ms auf High

Messung oder Vermutung?

von c-hater (Gast)


Lesenswert?

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...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Lukas S. (lukaslok)


Lesenswert?

Hallo Matthias,

kannst Du mir die Befehle nennen ? Ich weiss nicht wo ich da Anfangen 
soll.

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von kladde (Gast)


Lesenswert?

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?

von Matthias X. (current_user)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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".

von Lukas S. (lukaslok)


Lesenswert?

Weil die LED beim Einschalten für ca. 500 ms hell wird, was sie nicht 
soll !

Beitrag #6242354 wurde von einem Moderator gelöscht.
von c-hater (Gast)


Lesenswert?

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.

von Lukas S. (lukaslok)


Lesenswert?

Ohne den    out  DDRD,temp  geht die LED beim Einschalten nicht an - 
aber nach der Zeitschleife auch nicht.

von Dietrich L. (dietrichl)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Lukas S. (lukaslok)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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?

von S. Landolt (Gast)


Lesenswert?

> Der wird aber durch das Programm zu keiner Zeit aktiviert

c-hater? Was ist dann
sbi PORTD, Bit0
?

von S. Landolt (Gast)


Lesenswert?

> Kannst Du es bei Dir mal nachbauen
Ich habe es nachgebaut.

von S. Landolt (Gast)


Lesenswert?

> Hast du auch die Zeit überprüft?
Die ist natürlich Unsinn, aber hier ja nicht das Thema.

von c-hater (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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?

von Matthias X. (current_user)


Lesenswert?

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.

von Lukas S. (lukaslok)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Lukas S. (lukaslok)


Lesenswert?

Hallo,

ich werde alles nochmal mit etwas Abstand und einem neuen Attiny 2313 
aufbauen. Vielen Dank  für die Hilfe.

von Matthias X. (current_user)


Lesenswert?

Hattest du einen 100nF Kondensator (Keramik oder Folie, aber kein Elko!) 
möglichst nah an VCC?

von Karl B. (gustav)


Lesenswert?

Hi,
wie sehen die Fuses aus?
Wird Programm nach vorgegebener Einschwingzeit des Quarzes gestartet?
BoD Level?

ciao
gustav

von Rainer V. (a_zip)


Lesenswert?

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
Noch kein Account? Hier anmelden.