Hallo, ich will mir einen Schaltregler bauen welcher per Atmel AVR gesteuert wird. Ich habe heute dann mal begonnen zum Test meinen ATMega32 mit meinen spärlichen C++ Kenntnisen zu beschreiben. Der Versuch war, einfach mal in einer while schleife, die Ports auf und ab zu drehen, in einem 5ms takt. Laut oszi habe ich auch genau 5ms on Zeit, die off Zeit des ports beträgt aber gut 7,5ms. Gibt es da bessere Möglichkeiten sowas zu realisieren? Gruß
Sorry, copy/past Fehler in Kombination mit zu flinken Fingern. Ich wolle
schreiben:
> Gibt es da bessere Möglichkeiten sowas zu realisieren?
Ja
estama schrieb: > Gibt es da bessere Möglichkeiten sowas zu realisieren? Ja, fuer solche Sachen gibt es eingebaute Timer. wendelsberg
estama schrieb: > Laut oszi habe ich auch genau 5ms on Zeit, die off Zeit des ports > beträgt aber gut 7,5ms. Vielleicht musst du doch mal deine Code "offenlegen"?
Hallo, Danke für die Hilfe! Anbei mein Code, wie gesagt, per simplem delay. Gruß
Nachtrag: Im Startpost erwähnte ich 5ms, da war das delay auch noch auf 5ms gesetzt, ich habe die letzte "Testversion" hochgeladen, sorry.
Hi >Laut oszi habe ich auch genau 5ms on Zeit, die off Zeit des ports >beträgt aber gut 7,5ms. Das passt aber nicht zu _delay_ms(1); MfG Spess
Hallo, spess53 schrieb: > Das passt aber nicht zu Siehe den Nachtrag. Zum Zeitpunkt des Tests war das delay auf 5, ich hab das noch für nen weiteren Test angepasst, und nun unabsichtlich die Version mit "1" hochgeladen, sorry. Danke! Gruß
HI
>Siehe den Nachtrag.
OK da hat sichetwas überschnitten. Allerdings passen die 7ms Off-Zeit
auch nicht zu einem _delay_ms(5);
Dir wird es aber trotzdem nicht erspart bleiben dich in die Problematik
Timer (CTC/PWM) einzuarbeiten.
MfG Spess
nach dem zweiten Delay wird die Schleife wiederholt. Dieser Rücksprung braucht auch etwas Zeit. Zwar nicht soviel, wie Du gemessen hast, aber durchaus messbar. Für genaue Timings nutze Assembler oder Timer.
Hi >nach dem zweiten Delay wird die Schleife wiederholt. Dieser Rücksprung >braucht auch etwas Zeit. Ja, aber selbst bei 1MHz Takt nur ein paar µs. Keine Relation zu den 2ms. MfG Spess
estama schrieb: > und nun unabsichtlich die > Version mit "1" hochgeladen, sorry. Dann fangen wir doch noch mal von vorne an. Messe mit der 1ms Verion nochmal die High- und Low-Zeiten. Und berichte mit welcher Optimierungs-Option du compiliert hast. Die Delay-Funktionalität arbeitet nur korrekt wenn die Optimierung auf -Os eingestellt ist. Abgesehen von der While Schleife (braucht wenige usec, wenn nicht weniger) sollten da schon 2 mal 1 msec herauskommen.
Eberhard F. schrieb: > estama schrieb: >> und nun unabsichtlich die >> Version mit "1" hochgeladen, sorry. > > Dann fangen wir doch noch mal von vorne an. > > Messe mit der 1ms Verion nochmal die High- und Low-Zeiten. > Und berichte mit welcher Optimierungs-Option du compiliert hast. > > Die Delay-Funktionalität arbeitet nur korrekt wenn die Optimierung > auf -Os eingestellt ist. > > Abgesehen von der While Schleife (braucht wenige usec, wenn > nicht weniger) sollten da schon 2 mal 1 msec herauskommen. Hallo! Mit der 1MS Variante habe ich 1,08ms high und 4,76ms low. -Os ist gesetzt, ich compile per avr-gcc Bei genauerem betrachten ist mir jedoch aufgefallen, dass der Compiler über ein fehlendes F_CPU jammert. Wundert mich aber, dass dann nur die low Phase eine falsche Zeit hat, die high Phase aber stimmt. Ich werde nun mal den Takt definieren und dann nochmal berichten, danke! Gruß
Nachtrag: Das Setzen von F_CPU hat keine Änderung gebracht. Anbei die Makefile die ich nutze (kopiert aus dem Wiki hier) Gruß
Mach da
1 | int main() |
2 | {
|
3 | DDRA = 0b11111111; |
4 | while(1) { |
mal ein Delay rein
1 | int main() |
2 | {
|
3 | DDRA = 0b11111111; |
4 | _delay_ms( 500 ); |
5 | |
6 | while(1) { |
7 | ...
|
ändert sich was an deiner Zeitverteilung? Wenn ja, dann hast du ungewollte Resets.
Karl Heinz schrieb: > ändert sich was an deiner Zeitverteilung? > Wenn ja, dann hast du ungewollte Resets. Hallo, nein, da ändert sich leider nichts an der Zeitverteilung. Ich habe zwar die 500ms delay beim startup, an der Zeitverteilung danach verändert sich aber nichts. Danke! Gruß
estama schrieb: > die 500ms delay beim startup, an der Zeitverteilung danach verändert > sich aber nichts. OK. War nur so eine Idee.
estama schrieb: > Nachtrag: Das Setzen von F_CPU hat keine Änderung gebracht. Anbei die > Makefile die ich nutze (kopiert aus dem Wiki hier) Da stimmt was nicht. Das Makefile setzt ein 'F_OSC', das soll aber 'F_CPU' heissen, sprich, im Aufruf des Kompilers sollte dann '-DF_CPU 3684000' vorkommen. Schreib einfach mal in den Quellcode vor das #include util/delay.h ein
1 | #define F_CPU 3684000UL
|
:
Bearbeitet durch User
Matthias Sch. schrieb: > Schreib einfach mal in den Quellcode vor das #include util/delay.h ein >
1 | > #define F_CPU 3684000UL |
2 | >
|
Hallo, Danke, du hattest recht, das funktioniert. Warum war vorher dann die ON Phase richtig, und nur die OFF falsch? Und wie kommst du auf 3,684MHz? Danke! Gruß
Hallo, Nachtrag: Die Lösung stimmt leider nicht ganz. Ich habe nun zwar gleich lange ON und OFF Perioden, beide sind nun aber 3,xx ms lang, und nicht eine. Danke! Gruß
estama schrieb: > Nachtrag: Die Lösung stimmt leider nicht ganz. Ich habe nun zwar gleich > lange ON und OFF Perioden, beide sind nun aber 3,xx ms lang, und nicht > eine. Ja du wirst es sicher noch schaffen das define F_CPU so richtigzustellen dass es den wahren Gegebenheiten deiner Schaltung entspricht.
estama schrieb: > Und wie kommst du auf 3,684MHz? Die standen so in deinem Makefile, vermutlich ist das Zielsystem im Wiki also ein STK500.
:
Bearbeitet durch User
Hallo! Laut Datenblatt sollte der standardtakt 1MHz sein. Nehme ich 8mhz, so dauern alle perideon 8ms, somit 8x zu viel. Nehme ich 1MHz habe ich wieder das seltsame verhalten mit den zu langen OFF Phasen. Irgendeine Idee? Danke! Gruß
estama schrieb: > Laut Datenblatt sollte der standardtakt 1MHz sein. Nehme ich 8mhz, so > dauern alle perideon 8ms, somit 8x zu viel Fuse DIV8. wendelsberg
Hast Du das Fuse-Bit zur Taktteilung /8 eventuell noch gesetzt? MfG Paul
Hallo, Danke! Ich habe zwar das Fusebit für /8 nicht gefunden, aber mit einem Fusebit generator den Takt auf 8Mhz angehoben, nun passt die Zeit auch. Danke! :) Gruß
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.