ich möchte für eine externe Platine einen 20Mhz Clock an einem digitalen Pin ausgeben.
Ich habe es ganz simpel versucht mit:
int clkPin = 22; // clk connected to digital pin 22
void setup()
{
pinMode(clkPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(clkPin, HIGH); // sets the clkPin on
delay(50); // waits for a 50 ms
digitalWrite(clkPin, LOW); // sets the clkPin off
delay(50); // waits for a 50 ms
}
Leider ist diese Lösung zu langsam und der Pin kommt nicht hinterher.
Habt ihr vielleicht Ideen wie ich dies auch anders realisieren kann?
Dürfte eigentlich ja kein Problem sein!?
Es ist unrealistisch, einen mit 16MHz getakteten Mikrocontroller 20 MHz entlocken zu wollen. Welche Befehle brauchen denn weniger als einen Taktzyklus?
sorry erstmal, dass ich nicht alle Details erwähnthabe. ich benutze einen Arduino Due welcher mit 84 MHz taktet.
Ich hatte einen Denkfehler bei der Berechnung der Ein/Aus-Zeiten. Bei 20 Mhz wäre die Periodendauer 50 ns. Das bedeutet 25 ns an und 25 ns aus. In meinem Code also 0.025 ms anstatt der 50 ms.
Leider hat auch diese Änderung nicht den gewünschten Erfolg gebracht und die Frequenz bleibt bei maximal 119 KHz.
Habt ihr andere Ideen, wie ich solch einen Frequenzgenerator erzeugen kann für das 20 Mhz Rechtecksignal?
Sowas macht man über die Timer. Die können Pins komplett in Hardware toggeln ohne dass irgendetwas in Software geschieht. Man muss nicht mal Interrupts auslösen, die unnötigerweise das Programm unterbrechen nur um I/Os zuschalten. Wie auf dem Due funktionieren weiß ich aber nicht.
Ja das mit dem Quarz habe ich mir auch schon überlegt.
ich möchte aber ungorn noch etwas "aufbauen". Es muss doch eine Möglichkeit geben einen 20 Mhz takt auszugeben.
Das mit den Timern sagt mir leider nichts. Ich bin jedoch auch noch relativ unerfahren mit dem Arduino.
Könntest du das eventuell noch genauer beschreiben?
Wenn man hardwarenah programmiert, ließe sich eventuell ein Pin in 2 Taktzyklen umschalten, man muss aber sowohl von High auf Low als aber auch wieder zurück auf High usw. gehen, dass bedeutet, dass du 4 Takte für einen Durchlauf brauchst, was dann in einer Frequenz von 21 MHz resultiert. Wie genau muss denn dein Frequenzgang eigentlich sein?
Denke auch daran, dass der Mikrocontroller nichts anderes mehr machen kann außer dieser Frequenzerzeugung. Da it ein Due eigentlich viel zu schade dafür. Kannst du mehr über das gesamte Projekt verraten?
Auf dem AVR ja. Da gibt es auch jede Menge Tutorials im Netz. Aber der Due hat einen anderen Prozessor, der intern völlig anders aufgebaut ist. Entsprechend sind die Register anders.
das geht auf dem Due genauso wenig wie sonstwo
Ich könnte dir den Unterschied zwischen float und integer erklären,
aber das hilft dir nicht mit den 20 MHz. Die kannst du vergessen ...
arduino13:
Bei 20 Mhz wäre die Periodendauer 50 ns. Das bedeutet 25 ns an und 25 ns aus. In meinem Code also 0.025 ms anstatt der 50 ms.
Nur der Vollständigkeit halber: 25 ns sind nicht 0,025 ms, sondern 0,025 µs. Sind also nochmal 3 Zehnerpotenzen mehr, vielleicht lag darin die Annahme begründet, dass der Mikrocontroller das schaffen könnte.
Guckst du hier: OSZI 20,000000: Quarzoszillator, 20,00 MHz bei reichelt elektronik
Kostet unter ein Euro, benötigt weniger Platz als eine Briefmarke und du brauchst dir um nichts den Kopf zerbrechen. Die Anschlußbelegung steht auf der Seite. Output Enable gibts keinen. Also nur Spannung anlegen und glücklich sein... 8)
Ohje mit den Potenzen hab ichs heut echt nicht :/...ja ich denke mittlerweile auch dass so ein Quarzoszillator die unkomplizierteste Lösung ist...danke für eure Hilfe!