Forum: Mikrocontroller und Digitale Elektronik Atmel AVR Frequenzgenerator


von estama (Gast)


Lesenswert?

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ß

von stefanus (Gast)


Lesenswert?

> Ich hab mal nen Lochraster Entwurf gemacht für den LM2576.

Ja

von stefanus (Gast)


Lesenswert?

Sorry, copy/past Fehler in Kombination mit zu flinken Fingern. Ich wolle 
schreiben:

> Gibt es da bessere Möglichkeiten sowas zu realisieren?
Ja

von wendelsberg (Gast)


Lesenswert?

estama schrieb:
> Gibt es da bessere Möglichkeiten sowas zu realisieren?

Ja, fuer solche Sachen gibt es eingebaute Timer.

wendelsberg

von John Wayne sein Schwiegervater (Gast)


Angehängte Dateien:

Lesenswert?

>> Gibt es da bessere Möglichkeiten sowas zu realisieren?
stefanus schrieb:

> Ja

Echt?

von Loocee L. (loocee)


Lesenswert?

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

von estama (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Danke für die Hilfe!

Anbei mein Code, wie gesagt, per simplem delay.

Gruß

von estama (Gast)


Lesenswert?

Nachtrag: Im Startpost erwähnte ich 5ms, da war das delay auch noch auf 
5ms gesetzt, ich habe die letzte "Testversion" hochgeladen, sorry.

von spess53 (Gast)


Lesenswert?

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

von estama (Gast)


Lesenswert?

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ß

von spess53 (Gast)


Lesenswert?

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

von stefanus (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Loocee L. (loocee)


Lesenswert?

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.

von estama (Gast)


Lesenswert?

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ß

von estama (Gast)


Angehängte Dateien:

Lesenswert?

Nachtrag: Das Setzen von F_CPU hat keine Änderung gebracht. Anbei die 
Makefile die ich nutze (kopiert aus dem Wiki hier)

Gruß

von Karl H. (kbuchegg)


Lesenswert?

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.

von estama (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

estama schrieb:

> die 500ms delay beim startup, an der Zeitverteilung danach verändert
> sich aber nichts.


OK. War nur so eine Idee.

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


Lesenswert?

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
von estama (Gast)


Lesenswert?

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ß

von estama (Gast)


Lesenswert?

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ß

von Loocee L. (loocee)


Lesenswert?

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.

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


Lesenswert?

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
von estama (Gast)


Lesenswert?

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ß

von wendelsberg (Gast)


Lesenswert?

estama schrieb:
> Laut Datenblatt sollte der standardtakt 1MHz sein. Nehme ich 8mhz, so
> dauern alle perideon 8ms, somit 8x zu viel

Fuse DIV8.

wendelsberg

von Paul B. (paul_baumann)


Lesenswert?

Hast Du das Fuse-Bit zur Taktteilung /8 eventuell noch gesetzt?

MfG Paul

von estama (Gast)


Lesenswert?

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