Forum: Mikrocontroller und Digitale Elektronik [C] Definierte Zustände direkt nach dem einschalten - AVR


von Start-Blitz (Gast)


Lesenswert?

Hallo allerseits,

ich habe einen Tiny45 programmiert. Der steuert über PWM eine 
Konstantstromquelle, an der eine 10W LED hängt.
Funktiniert auch super.

Mein Problem ist folgendes:
Wenn ich die Schaltung mit Spannung versorge, so blitzt die LED kurz 
auf. Ich vermute das es daran liegt, dass die Zustände der Pins direkt 
nach dem einschalten undefiniert sind.

Kann man da in der Software irgendwas dagegen tun? Bzw gibt es eine 
Reihenfolge in der initialisiert werden muss, damit dieses Verhalten 
eben nicht auftritt? Oder wäre hier ein Pull-Down sinnvoll?
Die PWM ist nicht invertiert, also 0%DC = LED aus, 100%DC = LED voll an.

Ich programmiere in C und nutze AVR Studio 4.

Vielen Dank für eure Hilfe
Jens

von Ulrich F. (Gast)


Lesenswert?

> Kann man da in der Software irgendwas dagegen tun?
Wenn das stimmt, was du dir da ausgedacht hast: Nein!
Denn, wie soll die Software was tun, bevor sie dran ist?

> Bzw gibt es eine Reihenfolge in der initialisiert
> werden muss
Vielleicht!

> Oder wäre hier ein Pull-Down sinnvoll?
Vielleicht.

von Codix (Gast)


Lesenswert?

Da im Datenblatt folgendes steht:

The Port B pins are tri-stated when a
reset condition becomes active, even if the clock is not running.

Solltest Du einmal Dein Schaltung dahin gehend prüfen, ob sie in diesen 
Zustand der Ports (Z = tri-state) evt. doch schaltet/schalten kann.
Thema Pull-down oder Pull-Up.

Als Tipp zur Initialisierung:

Erst alle Konfigurationen bzgl. Timer/PWM durchführen und danach die
Ports konfigurieren / aktivieren. Zu guter Letzt die Interrupts 
aktivieren.

Auch solltest Du BOD aktivieren, wenn Deine Stromversorgung nur 
"langsam"
startet.

Lies Dir mal das große Datasheet dazu durch. Speziell RESET/BOD/STARTUP 
TIME.

Viel Erfolg!

von Jasch (Gast)


Lesenswert?

Start-Blitz schrieb:
> Hallo allerseits,
>
> ich habe einen Tiny45 programmiert. Der steuert über PWM eine
> Konstantstromquelle, an der eine 10W LED hängt.
> Funktiniert auch super.
>
> Mein Problem ist folgendes:
> Wenn ich die Schaltung mit Spannung versorge, so blitzt die LED kurz
> auf. Ich vermute das es daran liegt, dass die Zustände der Pins direkt
> nach dem einschalten undefiniert sind.

Nein, sind sie nicht. Du musst aber etwas definiertes mit dem Reset-Pin 
tun, und die Initialzustände der Pins im Hardware-Design beachten.

Nähere Informationen hat - wie meistens - die Doku.

von Rolf M. (rmagnus)


Lesenswert?

Jasch schrieb:
>> Mein Problem ist folgendes:
>> Wenn ich die Schaltung mit Spannung versorge, so blitzt die LED kurz
>> auf. Ich vermute das es daran liegt, dass die Zustände der Pins direkt
>> nach dem einschalten undefiniert sind.
>
> Nein, sind sie nicht.

Doch, sind sie.

> Du musst aber etwas definiertes mit dem Reset-Pin tun,

Nur in sehr verschmutzten Umgebungen. Ein Pull-up kann aber nicht 
schaden.

> und die Initialzustände der Pins im Hardware-Design beachten.

Genau das will er ja, und seine Frage war, wie.

Start-Blitz schrieb:
> Kann man da in der Software irgendwas dagegen tun?

Nein, wie soll das gehen?

> Bzw gibt es eine Reihenfolge in der initialisiert werden muss, damit
> dieses Verhalten eben nicht auftritt?

Naja, als allererstes die Pins auf Ausgang stellen, dann haben sie zum 
frühestmöglichen Zeitpunkt einen definierten Pegel. Ob's jetzt 50 µs 
früher oder später zum definierten Pegel kommt, dürfte aber kaum eine 
Rolle spielen. Ich vermute mal nicht, dass dein Programm aktuell ewig 
wartet, bevor es die Pins initialisiert.
Wirklich wegbekommen wirst du es so nicht.

> Oder wäre hier ein Pull-Down sinnvoll?

Der würde eher helfen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf M. schrieb:
>>> dass die Zustände der Pins direkt
>>> nach dem einschalten undefiniert sind.
>> Nein, sind sie nicht.
>
> Doch, sind sie.

Das ist wohl jetzt eine Definitionsfrage …

Für den einen ist Zustand „High-Z“ sehr wohl sauber definiert (denn
es ist nicht zufällig „low“ oder „high“ aktiv getrieben, so wie es
typisch bei RAM-Zellen der Fall ist), für den anderen ist es ein
„undefinierter Zustand“.

Wenn für den TE letzteres der Fall ist, ja, dann wird er einen
Pull-Widerstand in Hardware brauchen.  Für eine LED ist das
allerdings eher ungewöhnlich.  Wenn diese direkt am Portpin hängt,
egal ob nach GND oder Vcc, sollte sie bei High-Z nie leuchten.

von Pandur S. (jetztnicht)


Lesenswert?

Was vielleicht vergessen wurde. Zwischen "Powerup" und "Nach Reset" gibt 
es noch den "Im Reset Zustand". Waehrend dem Reset.Das kann zB im 
Programmiermodus sein, oder waehrend der per RC eingestellten Reset 
Zeitkonstante, ich hab am Reset pin immer 10k+100nF. Das waeren dann 
1ms.

Zum Einen haben gewisse Pins in diesem "Reset" Zustand gewisse 
Funktionalitaeten. zB die SPI & JTAG Programmierschnittstelle. Zum 
Anderen sollte man beachten, dass waehrend diesem Zustand nichts kaputt 
geht.
An diesen Programmier Pins kann man nachher ja etwas Anderes betreiben.

 Die Programmierschnittstelle als SPI kann zB einen dort angehaengten 
DAC beschreiben wenn die Pins grad richtig sind. und machen, dass zB ein 
Motor Rueckwaerts dreht.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jörg W. schrieb:
> Wenn diese direkt am Portpin hängt,
> egal ob nach GND oder Vcc, sollte sie bei High-Z nie leuchten.

Hängt sie aber nicht:

Start-Blitz schrieb:
> Der steuert über PWM eine
> Konstantstromquelle, an der eine 10W LED hängt.

Man sorgt also mit einem Pull für den gewünschten Resetzustand am PWM 
Pin.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Jörg W. schrieb:
>> Wenn diese direkt am Portpin hängt,
>> egal ob nach GND oder Vcc, sollte sie bei High-Z nie leuchten.
>
> Hängt sie aber nicht:

OK, zu flüchtig gelesen.

> Start-Blitz schrieb:
>> Der steuert über PWM eine
>> Konstantstromquelle, an der eine 10W LED hängt.
>
> Man sorgt also mit einem Pull für den gewünschten Resetzustand am PWM
> Pin.

Eigentlich schlechtes Design, nicht failsafe.  Bei einer
Konstantstromquelle sollte es immer möglich sein, sie so zu
gestalten, dass sie ohne jegliches (aktiv getriebenes)
Steuersignal eigensicher ist, die LED also ausgeschaltet.

Vielleicht sollte er sein Problem erstmal analysieren.  Kann gut sein,
dass da auch nur die Initialisierungsreihenfolge der PWM-Erzeugung
falsch herum ist, sodass die PWM für eine kurze Zeit mit 100 %
losfeuert oder der Portpin aktiv mit entsprechendem Pegel getrieben
wird, weil die PWM noch gar nicht angworfen worden ist.

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


Lesenswert?

Start-Blitz schrieb:
> Kann man da in der Software irgendwas dagegen tun? Bzw gibt es eine
> Reihenfolge in der initialisiert werden muss, damit dieses Verhalten
> eben nicht auftritt? Oder wäre hier ein Pull-Down sinnvoll?

Codix schrieb:
> Erst alle Konfigurationen bzgl. Timer/PWM durchführen und danach die
> Ports konfigurieren / aktivieren.

 Umgekehrt.
 Erst alle Ports auf definierten Zustand bringen (LOW in deinem Fall),
 danach Timer und Interrupts.

 Bleibt die Frage, was dein Programm so lange initialisiert, damit du
 uberhaupt irgendwelches Blitzen merken kannst ?

 Abgesehen davon, kann ein Pull-Down naturlich nicht schaden.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Marc V. schrieb:
> Bleibt die Frage, was dein Programm so lange initialisiert, damit du
>  uberhaupt irgendwelches Blitzen merken kannst ?

Son AVR ist durchaus auf 64ms Startverzögerung parametrisierbar.
Wenn die Stromquelle in der Zeit voll losfeuert ist das durchaus zu 
sehen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Martin W. schrieb:
> Wenn die Stromquelle in der Zeit voll losfeuert ist das durchaus zu
> sehen.

Man sieht problemlos 1 ms oder weniger.

von Peter D. (peda)


Lesenswert?

Marc V. schrieb:
> Codix schrieb:
>> Erst alle Konfigurationen bzgl. Timer/PWM durchführen und danach die
>> Ports konfigurieren / aktivieren.
>
>  Umgekehrt.
>  Erst alle Ports auf definierten Zustand bringen (LOW in deinem Fall),
>  danach Timer und Interrupts.

Ne, Codix hat schon recht.
Der PWM-Ausgang richtet sich nicht nach dem Port-Latch. Man muß also 
erst die PWM starten und nachdem der gewünschte Pegel anliegt, den Pin 
auf Ausgang setzen. Im einfachsten Fall wartet man eine PWM-Periode 
lang.

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


Lesenswert?

Peter D. schrieb:
>>  Umgekehrt.
>>  Erst alle Ports auf definierten Zustand bringen (LOW in deinem Fall),
>>  danach Timer und Interrupts.
>
> Ne, Codix hat schon recht.
> Der PWM-Ausgang richtet sich nicht nach dem Port-Latch. Man muß also
> erst die PWM starten und nachdem der gewünschte Pegel anliegt, den Pin
> auf Ausgang setzen. Im einfachsten Fall wartet man eine PWM-Periode
> lang.

 Ne, hat er nicht.
 ATMEL sagt:
1
The general I/O port function is overridden by the Output Compare (OC0x) from the Waveform
2
Generator if either of the COM0x[1:0] bits are set. However, the OC0x pin direction (input or output)
3
is still controlled by the Data Direction Register (DDR) for the port pin. The Data Direction
4
Register bit for the OC0x pin (DDR_OC0x) must be set as output before the OC0x value is visible
5
on the pin.
 Aber das ist mit Sicherheit nicht das Problem.

Jörg W. schrieb:
> Man sieht problemlos 1 ms oder weniger.
 Weiss ich.

Martin W. schrieb:
> Son AVR ist durchaus auf 64ms Startverzögerung parametrisierbar.
> Wenn die Stromquelle in der Zeit voll losfeuert ist das durchaus zu
> sehen.

 Stimme ich zu und da wird wohl sein Problem liegen (ohne Pull-Down).

: Bearbeitet durch User
von Ulrich F. (Gast)


Lesenswert?

Marc V. schrieb:
> und da wird wohl sein Problem liegen (ohne Pull-Down).
Das Datenblatt zu KSQ gibt bestimmt gerne dazu Auskunft.

von Dieter W. (dds5)


Lesenswert?

Marc V. zitierte ATMEL im Beitrag #4426429:
> The Data Direction Register bit for the OC0x pin (DDR_OC0x) must be set
> as output before the OC0x value is visible on the pin.

Ich würde das jetzt nicht als "DDR muss (unbedingt) vor dem Start des 
PWM Moduls gesetzt werden" interpretieren sondern eher als "erst nachdem 
DDR auf Ausgang gesetzt wurde kommt auch das OC0x Signal dort raus".

von Peter D. (peda)


Lesenswert?

Marc V. schrieb:
> The Data Direction
> Register bit for the OC0x pin (DDR_OC0x) must be set as output before
> the OC0x value is visible
> on the pin.

So isses.
Da ich aber nirgends lesen kann, wie der PWM-Zustand nach einem Reset 
ist, muß ich erst abwarten, bis die PWM in einen definierten Zustand 
gegangen ist, ehe ich sie zum Ausgang durchschalte.

von rr (Gast)


Lesenswert?

Ohne Programm und ohne Schaltplän, hab ich sie übersähn?  Würde ich zum 
invertieren tendieren. Aua.

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


Lesenswert?

Dieter W. schrieb:
> Ich würde das jetzt nicht als "DDR muss (unbedingt) vor dem Start des
> PWM Moduls gesetzt werden" interpretieren sondern eher als "erst nachdem
> DDR auf Ausgang gesetzt wurde kommt auch das OC0x Signal dort raus".

 So sehe ich das auch.

Peter D. schrieb:
> So isses.
> Da ich aber nirgends lesen kann, wie der PWM-Zustand nach einem Reset
> ist, muß ich erst abwarten, bis die PWM in einen definierten Zustand
> gegangen ist, ehe ich sie zum Ausgang durchschalte.

 So isses.
 Aber das ist bestimmt nicht das, was seine LED aufblitzen last.

Jörg W. schrieb:
> Eigentlich schlechtes Design, nicht failsafe.  Bei einer
> Konstantstromquelle sollte es immer möglich sein, sie so zu
> gestalten, dass sie ohne jegliches (aktiv getriebenes)
> Steuersignal eigensicher ist, die LED also ausgeschaltet.

 Das ist es.
 Start-Up Time kann bei Tiny45 nicht kleiner als 4ms sein, es sei
 den, RSTDISBL is gesperrt. Da ich annehme, dass das nicht der
 Fall ist, ist blitzen einfach nicht wegzukriegen, wenn die KSQ
 auch ohne Signal (oder mit HiZ) losgeht.

 Oder, wie gesagt, nur mit Pull-Down.

: Bearbeitet durch User
von Jens (Gast)


Lesenswert?

Hallo zusammen,

puhh, dass haut mich jetzt ehrlich gesagt um. So viele Antworten, damit 
habe ich nicht gerechnet. Danke dafür!


Das mit dem Pull-Down habe ich probiert, bringt leider keine Änderung.

Da der Tiny45 nicht unter 4ms starten kann nehme ich diesen unschönen 
Effekt einfach mal als gegeben hin und lebe damit. Ich danke allen für 
ihre Mithilfe, echt grandios.

Viele Grüße
Jens

von S. R. (svenska)


Lesenswert?

Deine LED geht an, wenn der Pin HIGH ist? Dann hilft ein Pull-Down 
(sonst ein Pull-Up), um dem HiZ einen definierten Pegel zu geben. Wenn 
du das getan hast und es nichts bringt, dann war es nicht dieser Fehler.

von M. K. (sylaina)


Lesenswert?

Jens schrieb:
> Das mit dem Pull-Down habe ich probiert, bringt leider keine Änderung.

Wenn deine KSQ ein Highsignal braucht um anzugehen und der PullDown 
nicht hilft hast du einen Fehler im Programm. Das wäre jetzt interessant 
um den Fehler zu finden ;)

von W.A. (Gast)


Lesenswert?

Rolf M. schrieb:
> Jasch schrieb:
>>> Mein Problem ist folgendes:
>>> Wenn ich die Schaltung mit Spannung versorge, so blitzt die LED kurz
>>> auf. Ich vermute das es daran liegt, dass die Zustände der Pins direkt
>>> nach dem einschalten undefiniert sind.
>>
>> Nein, sind sie nicht.
>
> Doch, sind sie.

Was ist an „High-Z“ undefiniert. Das ist doch eine klare Ansage.

Vielleicht wäre es mal an der Zeit, Programm und Schaltplan zu zeigen. 
Sonst rätselt man hier noch bis zum Sommer, woher der Blitz kommt.

von Rolf M. (rmagnus)


Lesenswert?

Jörg W. schrieb:
> Rolf M. schrieb:
>>>> dass die Zustände der Pins direkt
>>>> nach dem einschalten undefiniert sind.
>>> Nein, sind sie nicht.
>>
>> Doch, sind sie.
>
> Das ist wohl jetzt eine Definitionsfrage …
>
> Für den einen ist Zustand „High-Z“ sehr wohl sauber definiert (denn
> es ist nicht zufällig „low“ oder „high“ aktiv getrieben, so wie es
> typisch bei RAM-Zellen der Fall ist), für den anderen ist es ein
> „undefinierter Zustand“.

Aus dem Ursprungsposting geht klar hervor, dass letzeres gemeint ist. Es 
dann für sich persönlich anders zu definieren und dann ohne Begründung 
zu widersprechen ist wenig zielführend.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> Aus dem Ursprungsposting geht klar hervor, dass letzeres gemeint ist.

Es geht mir nicht so klar hervor, wie du das meinst.

Ich denke immer noch, dass es gar nicht die Hardware ist, sondern
dass er die Initialisierung in der Software verhunzt hat.  Da er uns
aber weder Schaltplan noch Firmware zeigen mag, muss er wohl damit
leben.

von Tommi (Gast)


Lesenswert?

Kann das auch ein Problem deiner Konstantstromquelle beim Einschalten 
sein? D.h. dass unabhaengig vom Tiny-Pegel die LED beim Einschalten kurz 
aufblitzt.

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


Lesenswert?

Ich lasse den OC Port immer erstmal auf Eingang stehen, bis Timer und 
PWM fertig initialisiert sind und laufen. Erst dann schalte ich den Port 
auf Ausgang.

von Jens (Gast)


Angehängte Dateien:

Lesenswert?

Michael K. schrieb:
> Wenn deine KSQ ein Highsignal braucht um anzugehen und der PullDown
> nicht hilft hast du einen Fehler im Programm. Das wäre jetzt interessant
> um den Fehler zu finden ;)

Sollt ihr bekommen ;). Ist im Anhang.
Ich programmiere nicht hauptberuflich, also auch hier würde ich mich 
über Anmerkungen freuen.
OCR=255 beduetet LED aus, 0 LED voll ein. Ich hatte es erst nicht 
invertiert, aber so ging die LED nie ganz aus, deswegen ist die PWM 
jetzt invertiert.


Zum Schaltplan:

Es ist ein Tiny45 an PB0 hängt die KSQ, an ADC1 überwacht ein NTC die 
Temperatur und an den restlichen drei Pins hängen drei Schalter.

Bei der KSQ handelt es sich um einen China-Kracher,
ganz ähnlich dieser hier:
http://www.ebay.de/itm/3-Mode-Konstantstromquelle-3000mA-3A-6-18-Volt-Eingangsspannung-NEU-/272088142922?_trksid=p2141725.m3641.l6368

Datenblatt gibts natürlich keins dazu, die Kabel sind auch nicht auf 
Lötpads sondern direkt an Bauteilbeinchen gelötet. Aber bei dem Preis 
erwarte ich auch keine "Mercedes KSQ".

Allerdings habe ich das "PWM Kabel" zwischen Tiny und KSQ mal getrennt. 
Auch ohne den Pull-Down bleibt die KSQ beim anlegen der 
Spannungsversorgung inaktiv, also genau so wie es sein sollte. Es muss 
also während des Start-Up des Tiny zu einem kurzen High-Impuls kommen.

Bleibt also die Frage: Ist es beim Tiny45 möglich, genau das zu 
verhindern oder kann man dagegen nichts machen und die 4ms Start-Up Time 
in der HIGH anliegen sind so hinzunehmen.

Ich danke für die Anteilnahme :)
Viele Grüße
Jens

von Marc E. (mahwe)


Lesenswert?

Zur Sicherheit zwei Pins benutzen einen invertieren und beide mit und 
verknüpfen per Hardware ic.
Dann solte nichts mehr passieren benötigt auch nicht viel Platz.

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.