Forum: Mikrocontroller und Digitale Elektronik Simpler Rechteckgenerator mit Atmega8


von Burau (Gast)


Lesenswert?

Hallo,

ich möchte gerne mit einem M8 (oder M88) einen simplen 
Rechteck-Testgenerator bauen.

Er soll nach Auswahl per Knopfdruck wahlweise folgende Frequenzen als 
Rechtecksignal an einem Portpin ausgeben können:

-f/2
-f/4
-f/8
-f/16
-f/32
-f/64

(wobei f = Quarzfrequenz)


Das wären bei Verwendung eines 16-MHz-Quarzes dann:
8MHz, 4MHz, 2MHz, 1MHz, 500KHz, 250KHz


Die f/2 wollte ich wie folgt generieren:

innerhalb einer Endlosschleife immer den entsprechenden Portpin ein und 
wieder ausschalten...

Allerdings weiß ich nicht, ob das wirklich zum gewünschten Ergebnis 
führt, weil die Schleifenabfrage ja wahrscheinlich auch noch Zeit in 
Anspruchnimmt, oder?

(Programiert werden soll das ganze mit dem AVR-Studio in C)

von Jannis C. (kabelwurm)


Lesenswert?

Hallo,
Schau mal ins AVR GGC Tutorial da wird deine Frage beantwortet. 
Stichwort PWM.
Gruß Jannis

von avr (Gast)


Lesenswert?

Das macht alles dein Mega ohne Schleife.

Schau mal im Datenblatt beim Timer (z.B. Timer 2)
nach CTC.

Richtig eingestellt gibt es dann dein Rechteck an OC2.

avr

von BR (Gast)


Lesenswert?

Jannis C. schrieb:
> Hallo,
> Schau mal ins AVR GGC Tutorial da wird deine Frage beantwortet.
> Stichwort PWM.
> Gruß Jannis

Du meinst, ein PWM-Signal mit einem Tastverhältnis von 50% und 
entsprechendem Vorteiler ausgeben?

von Burau (Gast)


Lesenswert?

Danke für die Antworten!

avr schrieb:
> Das macht alles dein Mega ohne Schleife.
>
> Schau mal im Datenblatt beim Timer (z.B. Timer 2)
> nach CTC.
>
> Richtig eingestellt gibt es dann dein Rechteck an OC2.
>
> avr

Ich will es auf jeden Fall so, dass die Quarzfrequenz sauber geteilt 
wird.

Ok, schaue gleich mal ins AVR Tutorial und ins Datenblatt.

von Burau (Gast)


Lesenswert?

Ich hab keine Lust, mir hier den gesamten Tutorial-Code 
reinzuziehen....wär vllt. mal jemand so freundlich, einfach den 
Quelltext zu posten, Fragezeichen??

von Georg aus Wien (Gast)


Lesenswert?

Und warum nimmst du nicht einfach einen simplen, leichterhältlichen 
CMOS-Binärzähler?

von Burau (der echte!) (Gast)


Lesenswert?

Burau schrieb:
> Ich hab keine Lust, mir hier den gesamten Tutorial-Code
> reinzuziehen....wär vllt. mal jemand so freundlich, einfach den
> Quelltext zu posten, Fragezeichen??

Das hat ein Troll geschrieben!

von Burau (der echte!) (Gast)


Lesenswert?

Georg aus Wien schrieb:
> Und warum nimmst du nicht einfach einen simplen, leichterhältlichen
> CMOS-Binärzähler?

Weil ich grade keinen Binärzähler in der Bastelkiste habe, dafür aber 
ein paar M88.

von Mister Perry (Gast)


Lesenswert?

@Burau

Dann kauf dir ein!

von Burau (der echte!) (Gast)


Lesenswert?

avr schrieb:
> Schau mal im Datenblatt beim Timer (z.B. Timer 2)
> nach CTC.

Da findet sich folgende Formel:

fOCnx = fclk_I/O / ( 2 * N *( 1 + OCRnx)

N ist der prescale Faktor (1, 8, 16, 32, 64, ...)


Ist fclk_I/O vom Wert her identisch mit der Oszillatortaktfrequenz? Wenn 
ja, dann würde man mit N = 1 und OCRnx = 0 bis 5 die o.g. Frequenzen 
erzeugen können!?!
Und der Controller könnte in der Zwischenzeit noch was anderes machen, 
wie z.B. Tasten auswerten etc.!?!

von Joe (Gast)


Lesenswert?

Dazu zählt man eine Variable (Byte) einfach hoch und gibt diese dann an 
einem Port aus. Dann stehen alle gewünschten Frequenzen an en Portpins 
zur Verfügung.

Zur Verlangsamung einer fürgt man halt einige Wartezyklen ein.

Das wars.

Joe

von Joe (Gast)


Lesenswert?

Wenn man dann noch vor der Ausgabe ein shift des Bytes einfügt, dann 
erhält man die gewünschten Frequenzen auch an einem Pin.

Joe

von Burau (der echte!) (Gast)


Lesenswert?

Joe schrieb:
> Dann stehen alle gewünschten Frequenzen an en Portpins
> zur Verfügung.

Ich brauche das Signal aber an einer einzigen Leitung mit 
Frequenzänderung per Software!

Die Idee ist aber auf jeden Fall gut!

von Burau (der echte!) (Gast)


Lesenswert?

Joe schrieb:
> Wenn man dann noch vor der Ausgabe ein shift des Bytes einfügt, dann
> erhält man die gewünschten Frequenzen auch an einem Pin.

Da haben sich die Postings überschnitten ;-)

von avr (Gast)


Lesenswert?

Burau (der echte!) schrieb:
> fOCnx = fclk_I/O / ( 2 * N *( 1 + OCRnx)

Die Formel ist korrekt wenn man den PIN OCx als "Toggle"
verwendet daher kommt die 2 ).

Mit OCR = 0 hast du die Maximalfrequenz (N=1) von fclk/2
    OCR = 3                                       fclk/4

Also (da N=1) deinen Teiler-1 in OCR schreiben.

Pin OCx muß als Ausgang gesetzt sein!

Einmal gestartet läuft es, und du kannst im Programm alles
mögliche machen, auch Interrupts.

avr

von spess53 (Gast)


Lesenswert?

Hi

>Wenn man dann noch vor der Ausgabe ein shift des Bytes einfügt, dann
>erhält man die gewünschten Frequenzen auch an einem Pin.

Klar. Bei 16MHz Controllertakt und 8MHz maximaler Ausgabefrequenz.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

Joe schrieb:
> Dazu zählt man eine Variable (Byte) einfach hoch und gibt diese dann an
> einem Port aus. Dann stehen alle gewünschten Frequenzen an en Portpins
> zur Verfügung.
Genau so macht man das nicht. Dafür gibt es die CTC-Funktion des Timers.

mfg.

von avr (Gast)


Lesenswert?

Für MEGA88 (PA)

Signal an PB3/OC2A
1
void t2start(void){
2
3
 DDRB  |= 0x08;      // Pin auf Ausgang
4
5
 OCR2A = 1;      // Wert für teiler 2 
6
7
 TCCR2A = (1<<COM2A0)|(1<<WGM21); // CTC mit toggle
8
 TCCR2B = (1<<CS20);      //start
9
10
}
11
12
void main(void)
13
{
14
unsigned char t;
15
16
t2start();
17
18
// hier steht dein Programm
19
20
// Hab neuen Teiler in Teiler in t
21
22
  OCR2A = t-1;
23
}

von Burau (der echte!) (Gast)


Lesenswert?

avr schrieb:
> Für MEGA88 (PA)

Super, Danke!

Habe grade einen M88 rausgesucht und werde gleich mal das Programm 
zuende schreiben und ausprobieren.

Meine Idee ist, dass man durch Verwendung verschiedener Quarze eine 
ganze Palette an Frequenzen erzeugen kann. Das ist zwar nicht unbedingt 
bequem, zum gelegentlichen Kalibrieren etc. aber ganz praktisch; darüber 
hinaus quarzgenau und low budget
;O)

von avr (Gast)


Lesenswert?

Wenn du damit viele Frequenzen erzeugen willst, der
Teiler muss keine 2-er Potenz sein ;)

Die Variante geht auch mit Timer 1, also 16 Bit (und den Vorteiler
gibt es auch noch).

Für Rechtecksignale mit ein paar kHz ist das auch recht
ordentlich.

Für Abgleichen immer Rückrechnen.

Wunschfrequenz -> Timereinstellung (kein Nachkomma) -> Ist-Frequenz


Besser ist dann DDS (besonderst wenn mal z.B. Sinussignal).

Hier kleine Frequenzen im Prozessor, höhere dann extern.

avr

von Crimy (Gast)


Lesenswert?

jetzt gebt ihr ihm auch noch den ganzen quelltext ihr volldeppen...soll 
er denn gar nich mehr selbstständig denken? man man...

von Peer (Gast)


Lesenswert?

Crimy schrieb:
> jetzt gebt ihr ihm auch noch den ganzen quelltext ihr volldeppen...soll
> er denn gar nich mehr selbstständig denken? man man...


Man muss och jünne künne!

(Kölsche Lebensweisheit)

von 中華人民共和國中 (Gast)


Lesenswert?

Crimy schrieb:
> jetzt gebt ihr ihm auch noch den ganzen quelltext
Vielleicht ist er ja ein Chinese, der alles nur kopiert?

von Burau (der echte!) (Gast)


Lesenswert?

avr schrieb:
> Wenn du damit viele Frequenzen erzeugen willst, der
> Teiler muss keine 2-er Potenz sein ;)
>
> Die Variante geht auch mit Timer 1, also 16 Bit (und den Vorteiler
> gibt es auch noch).

Das hatte ich auch schon überlegt, die Sache wird dann aber schnell 
unübersichtlich, ausserdem geht das bei Frequenzen nahe der 
Quarzoszillatorfrequenz nicht.


avr schrieb:
> Besser ist dann DDS (besonderst wenn mal z.B. Sinussignal).

Für NF-Signale sicher super! Für hohe Frequenzen eher ungeeignet, oder?


avr schrieb:
> Hier kleine Frequenzen im Prozessor, höhere dann extern.

Wie meinst du das, gibt es da spezielle Möglichkeiten?




Crimy schrieb:
> jetzt gebt ihr ihm auch noch den ganzen quelltext ihr volldeppen...soll
> er denn gar nich mehr selbstständig denken? man man...

Oah, das ist doch voll nett von AVR. Habe vor ca. 2 h das erste mal was 
von CTC gehört und mittlerweile ein fast fertiges Programm für das 
Vorhaben im Compiler. Kann das Ding also voraussichtlich gleich morgen 
früh zum Einsatz bringen und habe entgegen meiner ersten Pläne (s.o.) 
ein Programm mit angenehmer Menüführung und muss nicht jedes mal 
reseten, um eine neue Ausgabefrequenz zu wählen!

von Jannis C. (kabelwurm)


Lesenswert?

Hallo,
Dann nutze diese Hilfe sinnvoll und erweitere dass ganze zu einem 
umfangreichem Funktionsgenerator mit Display. Das währe mal ein super 
Projekt auch zum Lernen.
Gruß Jannis

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.