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 !!!
Druckbare Version
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 !!!
Nimm doch einen Oszillator (anstatt quarz) und Teiler /16
erzeuge den Takt mit einem 1Mhz-Quarz und einem 74HC00
http://elektronik-kompendium.de/publ...uarz-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:...leider ist dann der Mega16 voll :-)Zitat:
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
also nimm gleich einen 74HC00
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.
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)das wären dann 8Mhz an OC0 bei 16Mhz Taktfrequenz...Zitat:
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).
Was ist daran nun anders als an Hannis Vorschlag? ;)
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.
@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 ;)
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.
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
Nee, bin nicht untergetaucht. Habe mal was Angehangen. Würde das so auch laufen ? Oder habe ich an PortC.2 nur die halbe Frequenz ?
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.
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 !
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.
Nuja, das selbst ist eher nicht das Problem.Zitat:
Zitat von Mr-400-Volt
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 nachlesen.
Wie man das allerdings in Bascom in die entsprechenden Register bringt solltest du selbt wissen.
Grüße,
da Hanni.
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.Zitat:
Zitat von Lunarman
Denn:
voll = 255 (zu rechnen ist mit 256, da 0 - 255 = 256 Zustände sind)
256 * 16 = 4096
16000000 MHz / 4096 = 3906,25 Hz
oh. hmm. Denkfehler gibts immer...
ergänzend zu den Ausführungen von Hanni:Zitat:
Zitat von Lunarman
Bascom verbraucht allein für Push+Pop der Register in einer ISR über 100 Takte...