Forum: Mikrocontroller und Digitale Elektronik ATTiny85 inkrementiert Variable nach Neustart nicht mehr


von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

Hallo,

hängt das Resetsignal in der Luft? Laut Schaltplan ja.

von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

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

von Hermann Kokoschka (Gast)


Lesenswert?

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!

von Veit D. (devil-elec)


Lesenswert?

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.

von Felix N. (felix_n888)


Lesenswert?

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

von Andreas B. (bitverdreher)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

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

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Andreas B. (bitverdreher)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> Also, insofern passt das schon.
Tja, völlig falsch gesehen - mein Wochenende fängt ja gut an.

von Stefan F. (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

Wie bist du eigentlich zu der Aussage aus dem Titel gekommen " 
inkrementiert Variable nicht mehr"?

von Felix N. (felix_n888)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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

von neuer PIC Freund (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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

von Felix N. (felix_n888)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

Felix N. schrieb:
> Kannst du mir auch verraten warum?

Um die Probleme zu vermeiden, um die gerade diskutiert wird.

von Stefan F. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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

von Andreas B. (bitverdreher)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Felix N. (felix_n888)


Lesenswert?

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 Schaltregler

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

von Stefan F. (Gast)


Lesenswert?

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.

von Felix N. (felix_n888)


Lesenswert?

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

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Andreas B. (bitverdreher)


Lesenswert?

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.

: Bearbeitet durch User
von Andreas B. (bitverdreher)


Lesenswert?

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.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

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

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

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.

von Herr W. Hausmann (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

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.