Guten Abend,
Ich habe ein Problem mit meinem ATTiny85, dieser arbeitet als Boost
Converter bzw. soll er das.
Wenn man den Chip programmiert funktioniert alles wie vorgesehen. Mit
dem Poti kann ich die Ausgangsspannung einstellen und wenn der Ausgang
belastet wird ändert sich der Dutycycle abhängig von der Last. Alles
super.
Das Problem kommt sobald man die Platine stromlos macht und wieder mit
Stromversorgt. Dann ist im ersten Moment die Feedback Spannung vom
Schaltregler noch 0V und das Poti hat weiterhin seine festeingestellte
Spannung. Normalerweise sollte der Controller jetzt den Dutycycle
anheben bis sich Feedback Spannung und Poti Spannung angleichen und
oszillieren.
Nur tut aus irgend ein Grund der Mikrocontroller nach einem Neustart
dieses nicht sondern erhöht lediglich die Variable "pwmVal" von 0 auf 1
und bleibt dann bei 1 hängen. Aber der entsprechende Codeteil wird jedes
mal wieder neu aufgerufen.
Habe um das zu testen den USI als UART Konfiguriert und mir die pwmVal
Variable ans Terminal gesendet. Nach dem Programmieren beginnt der
Controller damit die Variable pwmVal zu erhöhen bis Poti und Feedback
Spannung gleich ist. Nachdem die Platine stromlosgemacht wurde und
wieder saft draufgeben wird bleibt er immer bei 1 hängen.
Hat jemand ne Ahnung woran das liegen kann?
Programmiert habe ich den Chip mittels eines Usbasp.
Habe mal die Programmdatei angehängt und falls es relevant sein sollte
auch mal den Schaltplan davon sowie wie es auf dem PCB ist.
Mfg
Veit D. schrieb:> Hallo,>> hängt das Resetsignal in der Luft? Laut Schaltplan ja.
Moin,
Ja nach außen hin hängt er in der Luft. Laut Datenblatt ist der Reset
Pin intern über ein Pull-Up Widerstand nach Vcc gezogen. Daher habe ich
mir den externen Widerstand gespart. Rrst soll zwischen 30 und 60 kOhm
liegen.
Mfg
if (potiInput > feedbackInput) {trallala}
else if (potiInput < feedbackInput) {trallala}
Was ist mit der DRITTEN Möglichkeit:
potiInput GLEICH feedbackInput ?
Nebenbei:
Deine Quelltext-Formatierung kommt einer völligen Katastrophe gleich,
das ist unglaublich ärgerlich!
Hallo,
resete ihn mal kurz nach Spannung anlegen. Das wäre der Effekt wie nach
flashen nur eben ohne flashen. Ansonsten teste durchaus einmal 10k am
Resetpin.
Hermann Kokoschka schrieb:> Was ist mit der DRITTEN Möglichkeit:> potiInput GLEICH feedbackInput ?
Was sollte ich in diesem Fall den machen? Habe den Fall nicht behandelt
weil es eigentlich nichts gibt was dann gemacht werden muss wenn die
beiden wirklich gleich sind kann ich ja weder den PWM Wert erhöhen noch
verkleinern. Daher messe ich nur die beiden Spannungen wieder. Für
diesen Fall wäre dann der Tastgrad ja fix und sobald sich die Last ja
gleich verändert trifft ja wieder einer der beiden Fällen ein. Weil die
Feedback Spannung steigt oder sinkt.
Hermann Kokoschka schrieb:> Nebenbei:> Deine Quelltext-Formatierung kommt einer völligen Katastrophe gleich,
Habs gerade auch gesehen. Ist die Originale C Datei aus meiner
Projektmappe. In Atmel Studio 7 sieht es ganz normal aus.
Hermann Kokoschka schrieb:> das ist unglaublich ärgerlich!
Tut mir leid. Wenn du mir sagt was ich ändern muss damit es passt kann
ich den Source Code wohl nochmal uploaden.
Veit D. schrieb:> resete ihn mal kurz nach Spannung anlegen. Das wäre der Effekt wie nach> flashen nur eben ohne flashen.
Bin mir nicht ganz sicher ob es nur am Resetpin liegt. Diese Platine die
jetzt habe ist Revision 2.0. Auf der 1.0 ist die fast gleiche Schaltung
drauf bzw. um den Mikrocontroller rum ist es die gleiche nur ist bei Rev
1.0 ein PDIP Chip verbaut. Aufgrund des Platzmangels musste ich bei Rev
2.0 ein SMD Chip einsetzten.
Veit D. schrieb:>Ansonsten teste durchaus einmal 10k am> Resetpin.
Also im Moment läuft er wieder ohne Problem an, hab's erst mit 10k
ausprobiert danach noch ein paar mal ein und ausgeschaltet ohne
Widerstand. Software habe ich nicht geändert. Muss morgen nochmal
schauen. Wie es dann aussieht.
Mfg
Hermann Kokoschka schrieb:> Nebenbei:> Deine Quelltext-Formatierung kommt einer völligen Katastrophe gleich,> das ist unglaublich ärgerlich!
Das macht übrigens die Forensoftware. Wenn man es runterlädt sieht es in
einem Editor, abgesehen von der Kommentarspalte, ordentlich aus.
Ich habe auch keinen Fehler entdecken können. Abgesehen vom Warten auf
den ADC beim read. Das hätte ich in einem IRQ abgefragt. Aber das hat
mehr mit dem Zeitverhalten als der Nichtfunktion zu tun.
Evtl. steigt die Betriebsspannung zu langsam an, so daß er nicht
ordentlich resettet.
Das Neubrennen erzeugt im Prinzip einen Reset. Gleiches erreicht man
übrigens auch mit den Aufruf von avrdude ohne schreiben.
Felix N. schrieb:> Hat jemand ne Ahnung woran das liegen kann?
Das nicht direkt, aber was mir aufgefallen ist:
Du berücksichtigst in keinster Weise, was das DB an Verfahrensweisen für
die Initialisierung des Timer1 mit PLL-Takt empfiehlt. Ob das mit dem
beobachteten Fehlverhalten zu tun hat? Keine Ahnung. Ich mache es
nämlich immer so, wie es das DB empfiehlt und meine Schaltregler
funktionieren dann. Immer und nicht nur direkt nach dem Programmieren...
Felix N. schrieb:> Nur tut aus irgend ein Grund der Mikrocontroller nach einem Neustart> dieses nicht
(...)
> Hat jemand ne Ahnung woran das liegen kann?
Warum deaktivierst Du den Brownout-Detektor, wenn Du Probleme mit dem
Power-Up hast?
> B.O.D: Disabled
Grüßle
Volker
Andreas B. schrieb:>> Deine Quelltext-Formatierung kommt einer völligen Katastrophe gleich,>> das ist unglaublich ärgerlich!> Das macht übrigens die Forensoftware. Wenn man es runterlädt sieht es in> einem Editor, abgesehen von der Kommentarspalte, ordentlich aus.
Vermutlich ist in deinem Editor die Tab-Weite auf 4 gestellt, während
die Forensoftware eine Tab-Weite von 8 hat. Wenn du den Editor mal auf 8
stellst, sieht es genauso ausgefranst aus. Das ist einer der
Hauptgründe, weshalb man Tabs meiner Meinung nach nie zur
Quellcodeformatierung nutzen sollte.
Bezüglich des Fehlverhaltens kann ich leider nichts beitragen, aber zwei
Anmerkungen:
'OCR1C = 212; //Set PWM Frequency to 150KHz' ohne dass CTC1 gesetzt ist?
'TIMSK |= (1<<OCF0A);' funktioniert nur dank der Weitsicht (Faulheit?)
der Atmel-Entwickler.
Rolf M. schrieb:> Das ist einer der> Hauptgründe, weshalb man Tabs meiner Meinung nach nie zur> Quellcodeformatierung nutzen sollte.
Alle Programmierer, die ich kenne sind sich da einig. Umso erstaunlicher
finde ich, dass beinahe jede IDE dennoch Tabs zum Einrücken vorgibt.
Ich würde auch dringend empfehlen, den Reset Pin zu beschalten. Der
interne Pull-Up hat ungefähr 40kΩ. Die Leitung zum ISP Stecker stellt
damit eine wunderbare Antenne für Radiowellen dar. Und davon hast du in
der Umgebung reichlich.
Dazu kommt, dass dieser Pin schon bei viel weniger Spannung (unterhalb
von VCC) auslöst, als ein normaler Logik-Pin.
S. Landolt schrieb:> Bezüglich des Fehlverhaltens kann ich leider nichts beitragen, aber zwei> Anmerkungen:>> 'OCR1C = 212; //Set PWM Frequency to 150KHz' ohne dass CTC1 gesetzt ist?
Im PWM-Modus würde er tatsächlich 300kHz erzeugen, wäre da nicht auch
noch die Wahl des Prescalers:
> TCCR1 |= (1<<CS11); //Prescaler PCK/2
Also, insofern passt das schon.
Rolf M. schrieb:> Vermutlich ist in deinem Editor die Tab-Weite auf 4 gestellt,
Gerade mal geschaut: Stimmt, das ist bei mir die Voreinstellung und es
sind Tabs im Code.
Ich verwende zwar auch keine Tabs, aber das:
Hermann Kokoschka schrieb:> Deine Quelltext-Formatierung kommt einer völligen Katastrophe gleich,> das ist unglaublich ärgerlich!
Ist dann doch etwas übertrieben. ;-)
Zumal eine Tabweite von 8 in einer Editoransicht doch etwas ungewöhnlich
ist.
Ansonsten: Zum Reset ist schon alles gesagt.
Andreas B. schrieb:> Zumal eine Tabweite von 8 in einer Editoransicht doch etwas ungewöhnlich> ist.
Heute ja, früher war das Standard. Es gab sogar Editoren, die bei einem
Tab nicht an die nächster 8er Position sprangen, sondern es wie 8
Leerzeichen darstellten.
Also 2 Leerzeichen + Tab ging zur Position 10 (nicht 8 wie es sein
sollte).
c-hater schrieb:> Du berücksichtigst in keinster Weise, was das DB an Verfahrensweisen für> die Initialisierung des Timer1 mit PLL-Takt empfiehlt
Moin,
Doch hatte ich mal, aber damit hatte es nicht funktioniert.
Wahrscheinlich habe ich es aber falsch gemacht. Im Datenblatt steht bei
mir unter 12.2.1 "Timer/Counter1 Initialization for Asynchronous Mode"
1
To set Timer/Counter1 in asynchronous mode first enable PLL and then wait 100 μs for PLL to stabilize. Next, poll
2
the PLOCK bit until it is set and then set the PCKE bit.
Darunter verstehe ich PLL Bit in PLLCSR setzten. _delay_us(100) um 100uS
zuwarten dann PLOCK setzten und warten das PLOCK gesetzt ist und dann
PCKE Bit setzten. Umgesetzt habe ich das so.
1
PLLCSR = (1<<PLLE);
2
_delay_us(100);
3
PLLCSR |= (1<<PLOCK);
4
while(PLLCSR & (1<<PLOCK));
5
PLLCSR |= (1<<PCKE);
Bleibt aber in der while Schleife hängen. Im Register PLLCSR für Bit 0
(PLOCK) steht dran noch drin das man das PLOCK Bit prüfen soll bevor man
PCK für Timer/Counter1 aktiviert. Aber scheint ja nicht gesetzt zu sein
sonst würde er ja nicht in der while Schleife hängen bleiben. Oder?
Rolf M. schrieb:> Das ist einer der> Hauptgründe, weshalb man Tabs meiner Meinung nach nie zur> Quellcodeformatierung nutzen sollte.Stefan ⛄ F. schrieb:> dass beinahe jede IDE dennoch Tabs zum Einrücken vorgibt.
Ähmm, was soll man dann nehmen? Leerzeichen?
Volker B. schrieb:> Warum deaktivierst Du den Brownout-Detektor, wenn Du Probleme mit dem> Power-Up hast?
Ist der Brownout-Detektor nicht dafür nur zuständig das der uC sich
resetet wenn die Betriebsspannung unter ein gewisses level sinkt also
zb. 4,3 V wenn gesetzt. Kann ich gerne aktivieren muss nur den
Bootloader dann neubrennen. Die Betriebsspannung sollte keine Probleme
machen die liegt bei 5,02V. Zumal es da immer noch ein komisches
Verhalten vom Usbasp(vermutlich) gibt (siehe weiter unten).
S. Landolt schrieb:> 'OCR1C = 212; //Set PWM Frequency to 150KHz' ohne dass CTC1 gesetzt ist?
Ich bin mir nicht sicher ob ich das aktivieren darf ja es gibt das 7 Bit
in TCCR1 (CTC1) aber das Datenblatt schreibt zu Bit 6 (PWM1A - Pulse
Width Modulator A Enable)
1
When set (one) this bit enables PWM mode based on comparator OCR1A in Timer/Counter1 and the counter
2
value is reset to $00 in the CPU clock cycle after a compare match with OCR1C register value.
Das der PWM Mode aktiviert wird mit OCR1A und zurückgesetzt wird wenn
der Wert von OCR1C gesetzt ist.
S. Landolt schrieb:> 'TIMSK |= (1<<OCF0A);' funktioniert nur dank der Weitsicht (Faulheit?)> der Atmel-Entwickler.
Upps ist das TIFR Register nicht TIMSK, habs geändert. Hatte ich aber
auch nicht selbst geschrieben, war eine mehr oder weniger fertige Lib
von Github.
Stefan ⛄ F. schrieb:> Ich würde auch dringend empfehlen, den Reset Pin zu beschalten. Der> interne Pull-Up hat ungefähr 40kΩ
Ja mache ich glaubig besser. Hatte mir nur dabei nix gedacht weil der
hat denn eingebaut hat und ich schon ein paar ATTiny85 eingesetzt habe
wenn man nicht so viele I/O-Pins braucht und den Externen Reset nie
beschaltet habe und es ehrlich gesagt auch noch nie Probleme damit
gegeben hat. Aber ich werde ein SMD oder THT 10K Widerstand schon
irgendwie daran bekommen.
Stefan ⛄ F. schrieb:> Die Leitung zum ISP Stecker stellt> damit eine wunderbare Antenne für Radiowellen dar.
Oh ja mir fällt ja gerade noch was andere ein vllt. hat ja jemand ne
Ahnung warum das so sein könnte. Ich programmiere den Chip mittels eines
USbasp. Manchmal bzw. ehr schon häufig habe ich das Problem wenn die
Schaltung läuft und die Hauptversorgungsspannung eingeschaltet ist also
die Platine mit +5V und +12V versorgt wird(Auf der Platine sitzt noch
ein ATMega2560 Prozessor für andere Dinge) kann ich den Chip nicht
programmieren dann kommt immer nur:
1
avrdude.exe: auto set sck period (because given equals null)
2
avrdude.exe: error: program enable: target doesn't answer. 1
3
avrdude.exe: initialization failed, rc=-1
4
Double check connections and try again, or use -F to override
5
this check.
Ich muss dann die gesamte Platine stromlos machen, den USbasp
anschließen er stellt ja sein eigenes Vcc bereit liegt aber nur bei
4,56V da die restliche Platine sich ja auch an dem Vcc bedient. Und dann
kann ich ihn programmieren. Bzw. nachdem der Usbasp eingesteckt wurde
kann ich die externen +5V auch wieder einschalten. Falls dazu jemand was
weiß.
Stefan ⛄ F. schrieb:> Wie bist du eigentlich zu der Aussage aus dem Titel gekommen "> inkrementiert Variable nicht mehr"?
Weil ich mir den pwmVal Variable mittels des Software UART ausgegeben
habe und nach der Programmierung schießt er von 0 auf etwa 38 hoch um
+20V am Ausgang zuhalten wenn +12V anliegen bzw. 0 auf 195 wenn keine
+12V anliegen. Wenn man ihn dann aber neustartet dann zählte er im
ersten Durchlauf von 0 auf 1 hoch, also pwmVal, dann wurde die erste if
Schleife immer wieder aufgerufen da Feedback 0V ist und Poti bei etwa
3,2V aber der pwmVal bleibt nur bei 1 er wird nicht weiter erhöht
deswegen. Wenn man aber das Poti verstellt ändert sich auch der
entsprechende ADC Wert. Aber im Moment tut er wieder wie er soll obwohl
ich nix verändert habe gestern Nacht um 2 Uhr sah das noch anderes aus.
Mfg
Felix N. schrieb:>> dass beinahe jede IDE dennoch Tabs zum Einrücken vorgibt.> Ähmm, was soll man dann nehmen? Leerzeichen?
Ja bitte. Das ist das Erste, was ich bei jedem Texteditor und jeder IDE
gleich nach der Installation umstelle. Und ich rate auch jedem Kollegen,
es zu tun. In der Firma haben wir für diverse IDEs entsprechende
Konfigurations-Sätze vorbereitet, die man nur laden muss.
Felix N. schrieb:> Aber ich werde ein SMD oder THT 10K Widerstand schon> irgendwie daran bekommen.
Nimm ruhig noch einen 100nF Kondensator dazu viel weniger Ohm (z.B.
1kΩ). Sicher ist sicher.
Zwischen Pin 5 und 6 vom ISP Stecker wäre Platz.
Da deine Platine eine eigene Stromversorgung hat, sollst du vom USBASP
den Stromversorgung-Jumper abziehen. Für diene Konstellation ist das
Ding aber eh suboptimal. Weniger problematisch wäre ein
Programmieradapter mit Treiberbaustein, dem es egal ist welche der
beiden Seiten zuerst mit Spannung versorgt wird und wie hoch diese ist.
> Wenn man ihn dann aber neustartet dann zählte er im> ersten Durchlauf von 0 auf 1 hoch, also pwmVal, dann> wurde die erste if Schleife immer wieder aufgerufen da> Feedback 0V ist und Poti bei etwa 3,2V aber der pwmVal> bleibt nur bei 1 er wird nicht weiter erhöht deswegen.
Ich kann dir da nicht ganz Folgen. Ich habe aber das Gefühl, dass deine
Schlussfolgerung eventuell falsch ist. Hast du erwägt, dass der µC
eventuell gar nicht richtig läuft und z.B. immer wieder einen Reset
macht?
Um so etwas zu prüfen, lasse ich immer eine LED regelmäßig blinken (in
der Hauptschleife, nicht per Interrupt).
>dann wurde die erste if Schleife immer wieder aufgerufen
Hartes Brot. ;-)
Ein Boost-Converter transportiert Energiehäppchen vom Eingang zum
Ausgang. Die ADC des AVR sind eher gemächlich, zudem senken die
delay_ms(1) die Zykluszeit weiterhin. Nimm lieber einen Timer und sample
äquidistant. Blockierst du zu lange, geht bei fehlender Last der Ausgang
durch.
Mit einer Zenerdiode und NPN parallel zu R16 kannst du für diesen
Ausnahmezustand dem MOSFET die Ansteuerung stilllegen.
Felix N. schrieb:> Doch hatte ich mal, aber damit hatte es nicht funktioniert.> Wahrscheinlich habe ich es aber falsch gemacht.
Hast du.
Im Datenblatt steht bei
> mir unter 12.2.1 "Timer/Counter1 Initialization for Asynchronous Mode">>
1
> To set Timer/Counter1 in asynchronous mode first enable PLL and then
2
> wait 100 μs for PLL to stabilize. Next, poll
3
> the PLOCK bit until it is set and then set the PCKE bit.
4
>
Hier steht doch sehr deutlich, wie es richtig geht. Also deinen Code mal
etwas umgepfriemelt:
1
PLLCSR = (1<<PLLE);
2
delay_us(100);
3
while(!(PLLCSR & (1<<PLOCK)));
4
PLLCSR |= (1<<PCKE);
Es sei aber angemerkt, dass diese Sache nicht das einzige ist, was zu
berücksichtigen ist. Also schön weiter lesen im DB, da kommt noch
mehr...
Rolf M. schrieb:> Wenn du den Editor mal auf 8> stellst, sieht es genauso ausgefranst aus.
Ja tut es. In Atmel Studio steht Tab Size auf 4 und Indent size auch auf
4 mit Keep tabs
Stefan ⛄ F. schrieb:> Ja bitte. Das ist das Erste, was ich bei jedem Texteditor und jeder IDE> gleich nach der Installation umstelle. Und ich rate auch jedem Kollegen,> es zu tun. In der Firma haben wir für diverse IDEs entsprechende> Konfigurations-Sätze vorbereitet, die man nur laden muss.
OK. Kannst du mir auch verraten warum? Seitdem ich mit Java 2013
angefangen habe nutze ich eigentlich nur Tabs für die Formatierung.
Stefan ⛄ F. schrieb:> Nimm ruhig noch einen 100nF Kondensator dazu viel weniger Ohm (z.B.> 1kΩ). Sicher ist sicher.
Sonst habe ich immer 10k von EXT RST nach Vcc genommen. Und der 100nF
Kondensator nach Masse um zu puffern?
Stefan ⛄ F. schrieb:> sollst du vom USBASP> den Stromversorgung-Jumper abziehen.
Werde ich mal testen.
Stefan ⛄ F. schrieb:> Für diene Konstellation ist das> Ding aber eh suboptimal.
Wie meinst du das?
Stefan ⛄ F. schrieb:> Ich kann dir da nicht ganz Folgen. Ich habe aber das Gefühl, dass deine> Schlussfolgerung eventuell falsch ist. Hast du erwägt, dass der µC> eventuell gar nicht richtig läuft und z.B. immer wieder einen Reset> macht?
Ich bin mir nicht ganz genau sicher ob er sich immer wieder selbst
resettet wo ich den Code mit der Ausgabe zum Terminal hatte kam er in
die erste if Schleife weil die Feedback Spannung 0V war ist auch richtig
da ich die +12V nicht angeschlossen hatte die Potentiometer Spannung lag
aber um 3,2 V (Einstellung für +20V Ausgangsspannung) und pwmVal wird
mit 0 initialisiert.
Die erste Ausgabe war daher 0 -> 1. Danach 1 -> 2 usw. Er zählt dann bis
190 hoch, 190 ist das max von OCR1A da sonst das PWM Signal zu weit
runter ging vom Pegel her und das es dann für den MOSFET nicht mehr
genug ist zum Durchsteuern. Wenn man dann +12v angeschlossen hat wurde
durch die zweite if Schleife der PWM Wert wieder runterregelt so das
sich eine Ausgangspannung von 20V einstellt.
Wenn man dann den Controller "neu gestartet" hat also Platine
spannungslos und wieder Spannung drauf kam nur noch 0 -> 1 dann kam der
nächste Durchlauf von der if Schleife und da hatte pwmVal ein Wert vor
der inkrementierung von 1 und nach der inkrementierung immer noch von 1.
Hatte die Variable pwmVal auch mal static gemacht damit sie ein festen
Speicherplatz im RAM bekommt hat aber nix geändert.
Ob es jetzt wirklich am Reset liegt weiß ich nicht, weil normalerweiße
müsste die erste Ausgabe immer dann 0 -> 1 sein und nicht mit 1 -> 1
beginnen da mit 0 initialisiert wird vor der while(true) Schleife.
So sah der Code zum Terminal aus:
1
if(potiInput > feedbackInput) {
2
if(pwmVal != 180) {
3
sprintf(buffer, "PWMVal before Inc: %d -> ", pwmVal);
4
UART_tx_str(buffer);
5
pwmVal = pwmVal + 1;
6
sprintf(buffer, "%d after increase\r\n", pwmVal);
7
UART_tx_str(buffer);
8
OCR1A = pwmVal;
9
}
10
}else if(potiInput < feedbackInput) {
11
...
12
}
Verstehst du was ich meine?
c-hater schrieb:> Hier steht doch sehr deutlich, wie es richtig geht. Also deinen Code mal> etwas umgepfriemelt:
Wird das PLOCK Bit von selbst gesetzt, sobald sich die PLL eingeschwingt
hat?
c-hater schrieb:> Es sei aber angemerkt, dass diese Sache nicht das einzige ist, was zu> berücksichtigen ist. Also schön weiter lesen im DB, da kommt noch> mehr...
Und was? Danach ist der Timer1 initialisiert und mit OCR1C ist die PWM
Frequenz eingestellt. Was soll denn da noch eingestellt werden damit er
"richtig" arbeitet?
Mfg
Felix N. schrieb:> Sonst habe ich immer 10k von EXT RST nach Vcc genommen. Und der 100nF> Kondensator nach Masse um zu puffern?
Der Kondensator schließt HF Anteile (Radiowellen) kurz. Ohne Kondensator
sind weniger Ohm angeraten.
>> Für deine Konstellation ist das Ding aber eh suboptimal.> Wie meinst du das?
Du hast das Problem selbst beschrieben. Die Baugruppen blockieren sich
gegenseitig, je nach dem welche zuerst mit Strom versorgt wird. Das ist
auch ganz leicht zu erklären:
Jeder I/O Pin darf nur Spannungen zwischen GND und VCC bekommen. Ohne
Versorgungspannung ist das der Bereich zwischen 0V und 0V. Wenn nun eine
Baugruppe die schon Versorgt wird ein Signal an eine andere Baugruppe
sendet, die nicht versorgt wird, dann brichst du diese Regel und dann
blockiert manchmal was. Manchmal geht dabei auch etwas kaputt.
Die besseren Programmieradapter haben wie gesagt Treiberbausteine, die
vom Target versorgt werden und denen ist es egal, welche Seite zuerst
versorgt wird.
Felix N. schrieb:> Wenn man dann den Controller "neu gestartet" hat also Platine> spannungslos und wieder Spannung drauf kam nur noch 0 -> 1 dann kam der> nächste Durchlauf von der if Schleife und da hatte pwmVal ein Wert vor> der inkrementierung von 1 und nach der inkrementierung immer noch von 1.
Das kann nicht sein.
Wenn du eine Variable inkrementierst dann wird sie inkrementiert. Ich
halte es für völlig unmöglich, dass ein Befehl nicht das tut, was er tun
soll.
Es sei denn, du hast eine instabile Stromversorgung. Diese kann sogar zu
Veränderungen des Programms im Flash Speicher führen. Das kannst du mit
dem Programmieradapter überprüfen (read/verify).
Felix N. schrieb:> Ähmm, was soll man dann nehmen? Leerzeichen?
Ja
Felix N. schrieb:> Die Betriebsspannung sollte keine Probleme> machen die liegt bei 5,02V.
Es geht nicht um die Betriebsspannung an sich. Wenn die zu langsam beim
Einschalten ansteigt, bekommst Du keinen richtigen Reset. Dann wird ein
extra Resetbaustein benötigt.
Felix N. schrieb:> Wird das PLOCK Bit von selbst gesetzt, sobald sich die PLL eingeschwingt> hat?
"eingeschwungen hat"...
Ja, genau so ist es. Das Problem ist nur: es wird auch vorher schon (zu
Beginn des Lock-Prozesses) gelegentlich zufällig gesetzt. Deswegen die
Wartezeit vor Beginn des Polling. Das Hauptproblem deines Codes war aber
natürlich, dass du auf den falschen Bitstatus gewartet hast, nicht auf
high, sondern auf low...
Man sollte seine selbstgewählte Programmiersprache schon einigermaßen
beherrschen, das ist i.A. sehr hilfreich...
> Und was? Danach ist der Timer1 initialisiert und mit OCR1C ist die PWM> Frequenz eingestellt.
Das ja, weil du die Initialisierung vor die Aktivierung des PLL-Taktes
gelegt hast. Dagegen ist nix einzuwenden, mache ich natürlich i.d.R.
genau so, weil es viel einfacher ist.
Aaaber: ich benutze später dann den Kern der Sache (also das
OCR-Register) praktisch immer synchron zum Timer. Du tust das in deiner
(dummen) Haupschleife in main() nicht. Deswegen schlägt bei dir an
dieser Stelle voll alles an Synchronisierungs-Problemen zu, was das DB
im Rahmen der Initialisierung beschreibt. Merke: asynchrone Baugruppen
haben praktisch immer fiese Fallen...
Auch deswegen (aber nicht nur deswegen) müsste man das ganze Konzept
deines Regler als deutlich suboptimal einstufen. Ein guter Schaltregler
synchronisiert natürlich auch die Messung der IST-Größe mit den
Aktivitäten des Timers (die AVR8-Hardware stellt deswegen die
Unterstützung dafür natürlich auch bereit). Und auch der Regler selber
läuft sinnvollerweise mit dem Timer synchronisiert und nicht in main()
mit kaum vorhersehbarer Aufrufrate.
Außerdem gibt es natürlich Regler mit deutlich besseren
Regel-Eigenschaften als der von dir gewählte Algorithmus. Der ist nur
für Regelungen mit nahezu konstanter Last einigermaßen brauchbar.
Stromregelung für ein LCD-Backlight wäre z.B. OK. Ansonsten aber dürfte
er für die meisten Anwendungen wenig brauchbar bis vollkommen
unbrauchbar sein.
Stefan ⛄ F. schrieb:> Der Kondensator schließt HF Anteile (Radiowellen) kurz. Ohne Kondensator> sind weniger Ohm angeraten.
Hallo,
So ich habe jetzt auf der Rückseite des PCB am ICSP Anschluss ein 100nF
0805 X7R SMD Kerko zwischen Reset und Masse angelötet sowie ein 1k Ohm
Widerstand zwischen +5V und Reset. Gewinnt garantiert kein
Schönheitspreis funktioniert aber.
Stefan ⛄ F. schrieb:> Die besseren Programmieradapter haben wie gesagt Treiberbausteine, die> vom Target versorgt werden und denen ist es egal, welche Seite zuerst> versorgt wird.
Also ich habe das mit dem Entfernten Jumper ausprobiert hat kein
Unterschied gemacht. Kann das Ding nur Programmieren wenn der USbasp das
Teil alleine versorgt. Was wäre denn deiner Meinung nach ein guter ICSP
Programmieradapter? Dieser Atmel STK500?
Stefan ⛄ F. schrieb:> Es sei denn, du hast eine instabile Stromversorgung. Diese kann sogar zu> Veränderungen des Programms im Flash Speicher führen. Das kannst du mit> dem Programmieradapter überprüfen (read/verify)
Also Spannungsversorgung kann ich ausschließen. Alle IC's haben 100nF
Abblockkondensatoren. Und die +5V Rail selbst ist durch ein 2200uF
Kondensator noch gepuffert. In der Tat ist manchmal das Verifizieren des
Flash fehlgeschlagen, dann habe ich einfach das Programm nochmal
hochgeladen.
Andreas B. schrieb:> Es geht nicht um die Betriebsspannung an sich. Wenn die zu langsam beim> Einschalten ansteigt, bekommst Du keinen richtigen Reset. Dann wird ein> extra Resetbaustein benötigt.
Ja gut aber sollte das wirklich der Fall sein dann müsste die andere CPU
die auf der Platine verbaut ist ja ähnliche Probleme herbei führen. Und
die läuft wie sie soll.
c-hater schrieb:> Man sollte seine selbstgewählte Programmiersprache schon einigermaßen> beherrschen, das ist i.A. sehr hilfreich...
Gut bin kein Informatiker, habs mir selbst beigebracht. Hatte das im
Datenblatt so verstanden das ich das PLOCK Bit setzten muss und das es
dann endgültig im Register gesetzt wird vom Prozessor wenn die PLL
Stabil ist. Daher die Abfrage nach HIGH.
c-hater schrieb:> ich benutze später dann den Kern der Sache (also das> OCR-Register) praktisch immer synchron zum Timer.
Ja gut das ist ja klar der Timer1 läuft ja jetzt viel schneller als die
eigentlich CPU hier 16 MHz. Bei 64 MHz PLL Takt und einem Prescaler von
2 läuft der Timer1 ja auf 32 MHz also doppelt so schnell wie die
eigentliche CPU.
Jetzt mache ich ja nur PWM mit dem Timer. Wenn ich doch in meiner main
Schleife jetzt den PWM Wert ändere wird doch eh auf den nächsten
Durchlauf vom Timer gewartet damit sich der PWM-Wert ändert oder nicht?
Der Timer zählt doch von 0 bis OCR1C. Wie soll man denn dann mit dem CPU
Takt synchronisieren über Interrupts? Es gibt ja das "Timer/Counter1
Compare Match B" Interrupt.
Wollte beim ADC auch noch den ADC Interrupt aktivieren wenn der ADC
fertig ist das ich dann in der ISR die Messwerte auslese kann ich mir zu
mindestens das _delay_ms(1); in der readADC Funktion sparen.
c-hater schrieb:> Ein guter Schaltreglerc-hater schrieb:> Außerdem gibt es natürlich Regler mit deutlich besseren> Regel-Eigenschaften als der von dir gewählte Algorithmus
Ich hätte ja auch (am liebsten) ein fertigen Schaltregler genommen wie
zB. ein LM2576 gut der LM2576 ist jetzt ein Step Down Wandler aber ein
passenden Aufwärtswandler der etwa 30-35 Watt Leistung zur Verfügung
stellt habe ich nicht gefunden daher habe ich mich für die "diskrete"
Aufbau weiße entschieden.
c-hater schrieb:> Ansonsten aber dürfte> er für die meisten Anwendungen wenig brauchbar bis vollkommen> unbrauchbar sein.
Betrieben werden damit zwei LED Röhren für mein Aquarium beide haben
16,2 Watt Leistungsaufnahme und erzeugen 1850 Lumen. Macht also 32,2
Watt(3700lm). Falls jemand sich für die Daten interessiert wie mein
Boost Converter so performt:
Input:
U: 12V
I: 2,94 A
P: 35,3 Watt
Output:
U: 19,85 V (eingestellt auf 20V)
I: 1,59 A
P: 31,5 Watt
n =~ 89,2 %.
Hätte selbst gedacht das der Converter schlechter abschneidet aber mit
den 89 % bin ich mehr als zufrieden.
Mfg
Felix N. schrieb:> Dieser Atmel STK500?
Nein, das Atmel STK500 ist ein teures altes Experimentierbrett.
Ich bin mit meinem "Atmel ISP mkII" sehr zufrieden, den kann man aber
auch nur gebraucht oder nachgebaut kaufen. Wobei ich nicht weiß wie gut
die Nachbauten sind.
Ich empfehle gerne den grünen "Diamex USB ISP Stick". Bisher hat sich
bei mir und hier im Forum noch keiner beklagt, dass er damit unzufrieden
sei.
Zu den aktuellen Produkten von Microchip kann ich mich nicht äußern. Da
fragst du am besten mal die Community in einem eigenen Thread.
Überlege dir mal, ob ein richtige Hardware Debugger für dich interessant
wäre. Dann wäre ein "Atmel ICE" zu empfehlen.
Stefan ⛄ F. schrieb:> Nein, das Atmel STK500 ist ein teures altes Experimentierbrett.
Ah alles klar.
Stefan ⛄ F. schrieb:> Ich bin mit meinem "Atmel ISP mkII" sehr zufrieden, den kann man aber> auch nur gebraucht oder nachgebaut kaufen.
Also nachgebaut kann man die zwischen 15,99 und 35,99 Euro auf Amazon
kaufen. Muss ich mir mal überlegen
Stefan ⛄ F. schrieb:> Ich empfehle gerne den grünen "Diamex USB ISP Stick"
Schaue ich mir mal an. Danke.
Stefan ⛄ F. schrieb:> Überlege dir mal, ob ein richtige Hardware Debugger für dich interessant> wäre. Dann wäre ein "Atmel ICE" zu empfehlen.
Hardware Debugger das heißt das man im Programm auch Breakpoint setzten
kann um das Programm anzuhalten und zu analysieren? Also so wie ein
Debugger bei einem normalen Programm auf dem Computer? Hat natürlich ein
stolzen Preis mit 150 Euro.
Nochmal zum Problem.
Ich habe jetzt im Programm eine Schleife eingeführt die nach dem
Programmstart ca. 1,5 Sekunden wartet und erst dann mit der eigentlichen
Reglung anfängt. Ist zwar Holzhammer Methode hoch 10. Aber bis jetzt
klappt das eigentlich ganz gut der Converter schaltet sich halt
verzögert ein.
1
while(startUpWait < 1500) {
2
OCR1A = 0;
3
pwmVal = 0;
4
feedbackInput = readADC(3) / 4;
5
startUpWait++;
6
}
Es handelt sich ja hier um meine Platine in der Rev 2.0. Der Boost
Converter war ja auch schon auf Rev 1.0 vorhanden nur war dort der
ATTiny85 in einem IC-Sockel gesockelt drin. Der einzige Unterschied ist
das halt auf der neuen Platine der ICSP Stiftleiste mit drauf ist da der
uC halt als SMD ausgeführt ist.
Wenn ich mich recht erinnere nutze der andere IC damals ein Takt von 8
MHz(intern) und den Timer1 im Synchron Modus. PWM Frequenz lag glaubig
bei 62,5KHz oder 32 KHz. Konnte aber mit 150KHz eine deutlich besseren
Wirkungsgrad erzielen.
Könnte das evtl. auch was mit den 16MHz Takt (PLL) zutun haben dem der
Prozessor jetzt läuft?
Mfg
Wie kommt man eigentlich auf die Idee, einen MC als Converter-IC zu
benutzen? Ja, es geht, und als Abfallprodukt nebenbei kann man das auch
machen wenn der MC eh da ist (ich habs noch nie gemacht).
Passende ICs gibts in Massen, und die können alles besser.
Das einzige, was ich gelten lassen würde: "ich will was lernen". Als
tatsächliche Anwendung ziemlich sinnlos.
Stefan ⛄ F. schrieb:> Felix N. schrieb:>>> dass beinahe jede IDE dennoch Tabs zum Einrücken vorgibt.>> Ähmm, was soll man dann nehmen? Leerzeichen?>> Ja bitte. Das ist das Erste, was ich bei jedem Texteditor und jeder IDE> gleich nach der Installation umstelle. Und ich rate auch jedem Kollegen,> es zu tun. In der Firma haben wir für diverse IDEs entsprechende> Konfigurations-Sätze vorbereitet, die man nur laden muss.
Man kann sich auch für sein Versionierungstool einen pre-commit hook
schreiben, der vor dem Commit alle Tabs durch Leerzeichen ersetzt. Man
muss nur daran denken, die Makefiles - sofern vorhanden - davon
auszunehmen.
Felix N. schrieb:> Stefan ⛄ F. schrieb:>> Ja bitte. Das ist das Erste, was ich bei jedem Texteditor und jeder IDE>> gleich nach der Installation umstelle. Und ich rate auch jedem Kollegen,>> es zu tun. In der Firma haben wir für diverse IDEs entsprechende>> Konfigurations-Sätze vorbereitet, die man nur laden muss.>> OK. Kannst du mir auch verraten warum? Seitdem ich mit Java 2013> angefangen habe nutze ich eigentlich nur Tabs für die Formatierung.
Die Diskussion Tabs vs. Spaces ist schon recht alt und bereits oft genug
geführt worden.
Felix N. schrieb:> Und die +5V Rail selbst ist durch ein 2200uF> Kondensator noch gepuffert.
Sicher daß Dein Spannungsregler das schafft? Wozu soll das gut sein? Das
verschlechtert i.A. die Regeleigenschaften des Spannungsreglers.
Das deutet im übrigen schon darauf hin, daß die Spannung beim
Einschalten zu langsam ansteigt. QED!
Dazu DB Table 21.5 Characteristics of Standard Power-On Reset:
Power-on slope rate max 4.5V/ms
Das schafft Du mit Deinem 2200uF Elko vermutlich nicht.
> Ja gut aber sollte das wirklich der Fall sein dann müsste die andere CPU> die auf der Platine verbaut ist ja ähnliche Probleme herbei führen.
Nö, es gibt Bauteiletoleranzen. So etwas mißt man im Zweifelsfall nach
und verläßt sich nicht auf die Glaskugel.
H.Joachim S. schrieb:> Als> tatsächliche Anwendung ziemlich sinnlos.
Sehe ich übrigens genauso. Die Regeleigenschaften lassen sehr zu
wünschen übrig. Vor allem wenn man das so simpel macht wie der TO.
Aber zum lernen ist es ok, stimmt.
Andreas B. schrieb:> Power-on slope rate max 4.5V/ms> Das schafft Du mit Deinem 2200uF Elko vermutlich nicht.
Sorry, hier gilt min. slope rate 0.01 V/ms. Könnte also noch mit diesem
C passen, sollte man aber trotzdem prüfen.
Andreas B. schrieb:> Andreas B. schrieb:>> Power-on slope rate max 4.5V/ms>> Das schafft Du mit Deinem 2200uF Elko vermutlich nicht.>> Sorry, hier gilt min. slope rate 0.01 V/ms. Könnte also noch mit diesem> C passen, sollte man aber trotzdem prüfen.
...deshalb wundere ich mich ja schon die ganze Zeit, warum der TO die
Brownout-Detection deaktiviert. Diese würde als Nebeneffekt auch einen
sauberen Reset beim Einschalten der Versorgungsspannung liefern und
verursacht keinen zusätzlichen Aufwand...
Grüßle
Volker
H.Joachim S. schrieb:> Wie kommt man eigentlich auf die Idee, einen MC als Converter-IC zu> benutzen? Ja, es geht, und als Abfallprodukt nebenbei kann man das auch> machen wenn der MC eh da ist (ich habs noch nie gemacht).
Das ist eine sehr sinnvolle Anmerkung. Die Umsetzung mittels µC ergibt
i.d.R. nur dann einen Sinn, wenn es quasi "nebenbei" noch mit abfällt,
weil genug Pins und ein geeigneter Timer "über" sind. Ansonsten nimmt
man natürlich besser einen spezialisierten IC.
Einen Extra-TinyX5 nur damit zu beschäftigen funktioniert zwar, ist aber
viel komplizierter als nötig. Und sehr wahrscheinlich auch suboptimal im
Vergleich zum Einsatz eines spezialisierten Wandler-IC.
> H.Joachim S. schrieb:> Wie kommt man eigentlich auf die Idee, einen MC als Converter-IC zu> benutzen? Ja, es geht, und als Abfallprodukt nebenbei kann man das auch> machen wenn der MC eh da ist (ich habs noch nie gemacht).
Noch nie? Aber hier das große Wort führen.
> Das ist eine sehr sinnvolle Anmerkung. Die Umsetzung mittels µC ergibt ...
Von Ihnen ist auch nicht anderes zu erwarten.
Fazit: Zwei die nichts können, aber andere belehren wollen. Jämmerlich.
P. S. Baue selbst regelmäßig Step-Up & Step-Down Converter mit µCs.
Natürlich ohne Probleme.
Herr W. Hausmann schrieb:> Fazit: Zwei die nichts können, aber andere belehren wollen. Jämmerlich.
Du musst es ja wissen...
> P. S. Baue selbst regelmäßig Step-Up & Step-Down Converter mit µCs.> Natürlich ohne Probleme.
Ich auch, so what?
Der Einwurf von H.Joachim S. drehte sich ja auch nicht darum, ob es
prinzipiell geht (es geht natürlich), es drehte sich vielmehr darum, ob
es tatsächlich wirklich sinnvoll ist.
Und die Antwort darauf ist eben: ja, es ist sinnvoll, wenn man's im
"Hauptcontroller" mit unterbringen kann, und es ist nicht sinnvoll, wenn
man einen zusätzlichen µC dafür einsetzen muss. Dann ist ein
spezialisierter Schaltwandler-IC praktisch immer die bessere Lösung.
Herr W. Hausmann schrieb:> P. S. Baue selbst regelmäßig Step-Up & Step-Down Converter mit µCs.> Natürlich ohne Probleme.
Respekt :-)
Jetzt fehlt noch die Aufzählung der Vorteile gegenüber einem Spezial-IC.
Naja - was heisst Vorteile? Einer genügt mir auch.
Nachteile hätte ich einige.