PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1 MHz Tackt erzeugen



Mr-400-Volt
10.07.2006, 01:19
Hallo, ich habe eine schaltung mit einem M16 und einem Quart zwischen 10 und 16 mhz entwickelt. Mein Problem ist, das ich einen Takt von 1mhz an Portx.5 erzeugen muß. Wie könnte ich das erledigen ? Währe für jeden Tipp dankbar !!!

Rage_Empire
10.07.2006, 07:20
Nimm doch einen Oszillator (anstatt quarz) und Teiler /16

-tomas-
10.07.2006, 17:14
erzeuge den Takt mit einem 1Mhz-Quarz und einem 74HC00
http://elektronik-kompendium.de/public/riederer/Quarz-oszil.htm

alternativ kannst Du natürlich bei einem 16Mhz Mega16 mit BASCOM/Assembler eine Schleife bauen und bei 16 Mhz die 16 Takte verteilen auf:
loop:
SBI x,5 '2 Takte SET BIT in I/O Register
nop '1 Takt
...
nop '1 Takt
CBI x,5 '2 Takte CLEAR BIT in I/O Register
nop '1 Takt
...
JRMP loop '2 Takte
...leider ist dann der Mega16 voll :-)
also nimm gleich einen 74HC00

Hanni
10.07.2006, 18:57
Man könnte es übrigens auch über eine Art Hardware PWM quasi nebenbei erledigen lassen.

Man muss eigentlich nur den richtigen Timermode nutzen.
Und die entsprechenden Register entsprechend setzen (den Topwert & den Comparewert)

Grüße,
da Hanni.

-tomas-
11.07.2006, 12:56
Für PWM wird die Zeit nicht reichen ... der Ausgangsport muss bei 16Mhz immerhin alle 8 Takte togglen.

Vorschlag: Timer0 -> Clear Timer on Compare Match (CTC) Mode (WGM01:0 = 2)
For generating a waveform output in CTC mode, the OC0 output can be set to toggle its logical level on each compare match by setting the Compare Output mode bits to toggle mode (COM01:0 = 1).
The waveform generated will have a maximum frequency of fOC0 = fclk/2 when OCR0 is set to zero (0x00).
das wären dann 8Mhz an OC0 bei 16Mhz Taktfrequenz...

E-Fan
11.07.2006, 14:20
Was ist daran nun anders als an Hannis Vorschlag? ;)

SprinterSB
11.07.2006, 14:36
Du kannst doch die 1MHz direkt von der Takt-Treiberstufe des AVR abzweigen. Musst nur die Fuses passen einstellen. Falls das ganze abschaltbar sein soll, machst einfach nen Analogschalter oder so dazwischen, der über nen µC-Port an/ausschaltbar ist.

-tomas-
12.07.2006, 08:41
@e-fan
Ich wollte dem Einsteiger etwas konkretere Hinweise gegeben, da er im Bascom-Handbuch unter PWM nicht zu Ziel kommen wird. Leider kennt Bascom den CTC-Modus nicht, deshalb mein Auszug aus dem M16-Manual.

...übrigens unterscheidet das M16-Manual zwischen CTC und PWM ;)

E-Fan
12.07.2006, 20:33
Die Frage war n bissel neckisch gemeint! ;)
CTC ist nur eine Abkürzung eines PWM-Modus (Clear Timer on Compare Match).
Hier wird der Timer bei erreichen des OC-Registerwertes auf 0 zurückgesetzt und der entsprechende OC-Ausgang umgeschaltet (toggle).
Ich denke mal das man Bascom nicht unbedingt alles abverlangen kann zumal man die Register sehr leicht selber einstellen kann in dem man die die Abkürzung des Registers als Byte oder Word behandelt (Beispiel: OCR1B=xyz oder TCCR1A= &B...).
Ich hab am Anfang auch ziemlich derbe gegrübelt zumal ich in Sachen µC und Programmierung in Basic absoluter Autodidakt bin.

-tomas-
13.07.2006, 10:01
Wie ich schon sagte:
Atmel bezeichnet im Manual nur das Signal als PWM, das verschieden lange Pulsbreiten hat (kein CTC), wenn es frei läuft.
Du betrachtest (wie andere auch) z.B. auch den Oscillator des Atmega als eine Sonderform der PWM (gleiche Pulsbreite).

soweit zur Theorie - leider ist der anfragende Mr-400-Volt untergetaucht

Mr-400-Volt
13.07.2006, 11:04
Nee, bin nicht untergetaucht. Habe mal was Angehangen. Würde das so auch laufen ? Oder habe ich an PortC.2 nur die halbe Frequenz ?

Hanni
13.07.2006, 12:15
Hmm, wohl eher nicht ....

1. Wofür der Prescaler ?
2. Wofür der Preload Wert
3. Wofür die Timer ISR

Lies die diewsbezüglich nochmal den Grundgedanken von -Thomas- vom 11.07.2006, 12:56 durch.

Im Klartext: wenn der µC mit 16 MHz rennt musst du alle 8 Takte den Pin togglen um ein 1 MHz Rechteck Signal zu bekommen. bei 12 MHz ist es übrigens alle 6 Takte.

Grüße,
da Hanni.

Mr-400-Volt
13.07.2006, 12:27
Ist das schwierig. Es geht im übrigen um folgendes: Der AVR muss mit einem anderen Prozessor komunizieren, der einen anderen Takt hat. Wenn er einen eigenen Quarz erhällt, kann es zu problemen mit der Syncronisation kommen. Also sollte der Takt vom AVR kommen. Ich muss es also irgendwie schaffen, das ich ein einem Portpin ein 1mhz Takterzeuge, der den Programmablauf nicht groß stören darf.
Da ich noch nicht so viel erfarung mit Bascom hab, bitte ich um eure Hilfe.

Danke !

SprinterSB
13.07.2006, 12:56
Na verwende doch einfach den gleichen Takt für beide...

Das spart Bauteile, der Takt ist synchron, du verschwendest weder Flash noch PWM-Kanäle und musst nicht mit Timern rumfrickeln.

Hanni
13.07.2006, 13:02
Da ich noch nicht so viel erfarung mit Bascom hab, bitte ich um eure Hilfe.


Nuja, das selbst ist eher nicht das Problem.
Meiner Ansicht nach besteht es eher darin, das man in diesem Fall die durchaus bequemen Bascom Pfade verlassen muss. Also weg von dem "Config Timer0" Syntax !!!
Fakt ist, das es in diesem speziellem Fall das einfachste ist die entsprechenden Register des Timers direkt anzusprechen.

Hier mal im Klartext die Bits, die in den entsprechenden Registern gesetzt werden müssen:

TCCR0
- WGM01
- COM00
- CS00

OCR0
- bei 16 MHz: 7
- bei 12 MHz: 5

Damit läuft der Timer auch schon und das alles ohne einen Interupt der in dem Fall der absolute Rechenzeit Killer sein dürfte.
Der Pin der damit das 1 MHz Signal ausgibt ist übrigens: B3

Warum das so ist kann man auch im Datenblatt (http://atmel.com/dyn/resources/prod_documents/doc2466.pdf) nachlesen.

Wie man das allerdings in Bascom in die entsprechenden Register bringt solltest du selbt wissen.

Grüße,
da Hanni.

Lunarman
13.07.2006, 16:10
Okay... wenn der AVR nen Takt von 16 Mhz hat... warum dann nicht einfach nen Timer mit prescaler 16 benutzen und bei jedem mal, wenns voll is, einfach kurz den gewünschten Pin auf 1 schalten?

Hanni
13.07.2006, 16:30
Okay... wenn der AVR nen Takt von 16 Mhz hat... warum dann nicht einfach nen Timer mit prescaler 16 benutzen und bei jedem mal, wenns voll is, einfach kurz den gewünschten Pin auf 1 schalten?

Ist so nicht ganz richtig.

Denn:
voll = 255 (zu rechnen ist mit 256, da 0 - 255 = 256 Zustände sind)
256 * 16 = 4096
16000000 MHz / 4096 = 3906,25 Hz

Lunarman
13.07.2006, 19:15
oh. hmm. Denkfehler gibts immer...

-tomas-
13.07.2006, 21:00
Timer .... benutzen und bei jedem mal, wenns voll is, einfach kurz den gewünschten Pin auf 1 schalten?
ergänzend zu den Ausführungen von Hanni:
Bascom verbraucht allein für Push+Pop der Register in einer ISR über 100 Takte...