Hallo Zusammen, frohe Weinacht noch! Zurück am heimischen Basteltisch will der Timer nicht so wie ich. Habe auch lange nichts mehr gemacht und mache das erstemal mit dem ATMega 32U4 Bekanntschaft: Fakten: ATMega 32U4 Takt 8 MHZ 3,3 Volt Ziel: Takt von 0,01 Sekunden Meine Initalisierung: TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);// CTC Mode, OCRA, Prescaler 64 OCR1AH = 0x04;//High Byte für den Compare Match A bei 1249 OCR1AL = 0xE1;//Low Byte für den compare Match A bei 1249 TIMSK1 = (1<<OCIE1A);// Output Compare Match A Intterupt Enable Problem: Timer läuft zu schnell... Rechnung: 8MHz / 64 = 125kHz 1 / 125 kHz = 0,000 008s 0,000 008s * 1250 = 0,01s Daraus würde sich meiner Meinung nach für OCR1Ax 16bit Register ein wert von 1249 ergeben, da ja bei 0 und nicht bei 1 angefangen wird zu zählen im Microkontroller, also minus 1. Kann jemand einen Fehler erkennen, habe ich irgendwo vergesssen ein Bit zu setzen? Vielen Dank und schönen Samstag!
Sebastian Kreuzer schrieb: > Fakten: > ATMega 32U4 > Takt 8 MHZ Quarz extern oder RC intern ? > Problem: > Timer läuft zu schnell... wie viel zu schnell ? Sascha
SMD Quarz mit +/- 20ppm
Wie viel kann ich nicht sagen, aber richtig zu schnell, ich würde mal
schätzen 1/3 bis doppelt so schnell...
Ich habe mich gerade etwas mit den Werten gespielt... Ohne Ergbeniss. Es
scheint irgendwas komplett abzuweichen.
Ich würde fast meinen, der Timer ist an einer flaschen Taktquelle
angeschlossen. Finde aber derartiges nicht im Datenblatt...ist doch
eigentlich ein 0815 ATMega Timer...
Die ISR lautet:
ISR (TIMER1_COMPA_vect){
ms_temp++;
Serial.print (ms_temp);
Serial.print ("\n");
}
Gast
#3940265
Sebastian Kreuzer schrieb: > Wie viel kann ich nicht sagen, aber richtig zu schnell, ich würde mal > schätzen 1/3 bis doppelt so schnell... Wow, Takt von 100Hz, den man nicht mal mehr an einer LED sehen könnte zu schätzen - Respekt. Ich schätze mal Problem an Pin 42 oder Zeile 42.
Gast
#3940276
hi
>TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);// CTC Mode, OCRA, Prescaler 64
WGM12 und WGM11 befinden sich nicht im gleichen Register.
MfG Spess
Gast
#3940289
Hallo Spess, Im Datenblatt S.132 14.10.3 Timer/Counter1 Control Register B – TCCR1B finden wir u.a. Bit4:0 = WGM13 WGM12 CS12 CS11 CS10 Damit ist die Timer1 CTC Konfiguration korrekt.
Gast
#3940302
Sebastian, noch ein Anmerkung das OCR1A Registerpaar zu beschreiben: Ich mache das immer so:
1 | |
2 | |
3 | |
4 | |
@peil Doch geht, Zähler mitlaufen lassen...z.b. ein Byte und schon sieht man schön 2,5 Sekunden und dann kann man schonmal Daumen benützen. Ich hab leider mein Hightech Oszi nicht da, weil Bastelkeller. @spess53 Danke. Ich hab es im Datenblatt nochmal gecheckt... also mein Code ist in diesem Bezug richtig, siehe Auszug im Anhang. für CTC Mode muss nur WGM12 gesetzt werden, welches sich im TCCR1B befindet
Hallo Sebastian, da wie so nicht mehr erkennen können, liegt das Problem vors. im weiteren Programm. Deshalb poste bitte ALLES.
Gerne, ich habe mitlerweile alles auskommentiert. Es funktioniert im Moment trotzdem nicht. Vielleicht ein paar Stunden vergehen lassen und nochmal frisch ans Werk gehen. Ich benütze...Schande über mich die Arduino IDE in Verbindung mit einem Sparkfun ProMicro 3,3V 8 MHz Das Programm befindet sich gerade im Aufbau und ich bin eben gerade dabei erstmal meine Timer usw. zu initaliseiren, also nicht wundern, dass es praktisch keinen code gibt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
Habe gerade Timer0 geteste - der macht seine Arbeit anstandslos.
2 mal CS10 gesetzt? Ist das Absicht?
1 | |
Ja, der Fehler ist mir aufgefallen, habe zwischendurch andere Frequenzen versucht und den Prescaler geändert, ist wieder geänder auf "11" War ein fehler beim Testen, das Problam besteht aber weiterhin.
Da du in der Arduino Umgebung bist: Die Arduino Umgebung benutzt auch einen Timer für sich selbst. Hast du das berücksichtigt? Grundsätzlich ist dein Timer Setup korrekt, wenn ich mir mal die Arduino Umgebung wegdenke und dein Mega auch wirklich mit 8 Mhz läuft.
Gast
#3940414
Ist der Timer1 bei Arduino überhaupt frei verwendbar? Kann man eine Arduino-Software denn mit was anderem als 16MHz betreiben?
Hallo, ich nutze den atMega32u4 auf dieser Hardwarebasis # http://www.ehajo.de/baus%C3%A4tze/bedrahtete-baus%C3%A4tze/atmega32u4-breakout-board.html?search=atmega32u4 Da gibt's keinen Arduino, es war nur der Atmel Bootloader installiert, den ich gegen den Lufa AVR109 ausgetauscht hatte. Die CPU läuft hier mit 16MHz, man lese sich dazu das Datenblatt bzgl. der Nutzung der USB Device durch. Link # http://www.fourwalledcubicle.com/LUFA.php
Hallo Sebastian, um zu wissen, welche Hardware du nutzt, wäre es schön bestätigt zu bekommen, ob so ein Arduino Leonardo nutzt: # http://arduino.cc/en/pmwiki.php?n=Main/arduinoBoardLeonardo Oder ein /Arduino Micro/: # http://arduino.cc/en/pmwiki.php?n=Main/arduinoBoardMicro
Danke für die vielen Antworten. Ich benütze dieses Board: https://www.sparkfun.com/products/12587 Es ist ein weitverbreiteter LEONARDO Nachbau von Sparkfun, ziehmlich groß in US. Haben schöne Breakouts... ...mh Arduino Leo/Micro ... Jetzt bin ich selbst etwas verwirrt - ob es nun ein Micro ist oder Leonardo. Ich denke wichtig ist es, dass ich in der IDE das richtige Board angewählt habe - Check passt ( Sparkfun Micro Pro 3,3 8 MHz ) Und, dass es ein 32U4 ist. Es ist ein wenig rätselhaft, der Timer0 macht sein ding ja wie er soll, schön brav. Ich werde mir die Datenblatt-Passage nochmal ausdrucken. Vll doch etwas überlesen. ?! Also, dass der Arduino Bootloader irgendwelche Hardware nach dem Upload der Software occopiert... wäre mir sehr neu. Hab früher auch "normal" ohne Bootloader gearbeitet. Diese kleinen Dinger sind aber doch äußert praktisch. Ist das erste Mal, dass ich Probleme habe. Habe mir unter anderem auch Arduino ausgesucht, weil man da in C direkt programmieren kann und nicht auf irgendeine Sprache ausweicht die es vll bald nicht mehr gibt. Also wo wäre das zu lesen, das Timer1 belegt ist von Arduino? ?!
Hallo Sebastion, wo man die Frage welcher Timer Aduino nutzt findet ? Nun im großen Netz über eine Suchmachine. Gefunden habe ich: http://arduino-info.wikispaces.com/Timers-Arduino
Gast
#3940513
Sebastian Kreuzer schrieb: > Also wo wäre das zu lesen, das Timer1 belegt ist von Arduino? Die Gretchenfrage ist doch ob du nur den Bootloader der Arduino IDE benutzt oder dein Projekt unter der Arduino IDE compilierst. Im letzteren Fall bekommst du ja den DAU Code untergejubelt der dir eine Loop() Funktion zur Verfügung stellt die (höchstwarscheinlich) über eine ISR und dem dazu notwendigen Timer angesteuert wird.
Gelöst! Es ist wohl wirklich eine Kombination, hier eine !Idee! - kein Wissen: 1) Wird der Timer verwendet - Jein Später nach dem laden des Programm "Sketch" kann der Timer ganz normal verwendet werden! Aber scheinbar stehen die Register nicht mehr im Default-Mode wie im Datenblatt. Deshalb ist es nötig !auch! TCCR1A auf "0" zu setzen, obwohl sich dieses eigentlich in diesem Zustand befinden sollte. 2) Wie gesagt eine Idee die sich auf Arduino und C bezieht. 3 Der Timer funktioniert nun korrect:
1 | |
2 | |
3 | |
4 | |
5 | |
Vielen Dank an Alle nochmal!
Gast
#3940527
Sebastian Kreuzer schrieb: > Später nach dem laden des Programm "Sketch" kann der Timer ganz normal > verwendet werden! Und woher soll dann die Loop() Funktion ihren Aufruf bekommen?
@isidor Schreib mir bitte mal,wo Du das gelesen hast, dass Loop() über den Timer1 ausgelöst wird? Würde das gerne nachlesen...kanns mir gerade nicht Vorstellen. Ich denke Loop() wir über eine ganz normale Schleife aufgerufen. Ich kann nur sagen funtkioniert jetzt alles super. Wenn Loop nicht aufgerufen werden würde, würde mein Test mit dem Timer nicht funktionieren, da ich in der Loop funtkion den Takt zu 100 addiere und dann mir jede Sekunde eine Nachricht senden lasse... Werde das auch später posten -
Gast
#3940539
isidor schrieb: > Und woher soll dann die Loop() Funktion ihren Aufruf bekommen? loop() wird nicht timergesteuert aufgerufen Im Hintergrund dürfte das nicht viel anders aussehen als so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Gast
#3940542
Sebastian Kreuzer schrieb: > Schreib mir bitte mal,wo Du das gelesen hast, dass Loop() über den > Timer1 ausgelöst wird? Hab ich mir nur so vogestellt. Ich meinte es müsste über einen Timer ausgelösst werden (nicht zwingend den Timer1), da ausser einer ISR im Hintergrund für das Arduino-"Betriebssystem" keine Möglichkeit besteht kurzzeitig die Kontrolle zu übernehmen und die Loop() aufzurufen. Sonst hat ja der User die volle Kontrolle mit seinem Programm. Sorry für meine "Schätzung" wenn das zu unbefriedigend ist.
isidor schrieb: > > Hab ich mir nur so vogestellt. Ich meinte es müsste über *einen* > Timer ausgelösst werden (nicht zwingend den Timer1), da ausser > einer ISR im Hintergrund für das Arduino-"Betriebssystem" keine > Möglichkeit besteht kurzzeitig die Kontrolle zu übernehmen und > die Loop() aufzurufen. Sonst hat ja der User die volle Kontrolle > mit seinem Programm. Das Arduino "Betriebssystem" besteht aus nicht viel mehr als einem Systemtakt, der die Uhr fuer zb millis() antreibt. Dafuer allerdings braucht es einen Timer.
Ich will mich jetzt nicht zu sehr aus dem Fenster lehnen aber ich bin auch der Meinung von Chris ( Gast ). Soweit ich das richtig verstehe, gibt es die Arduino IDE die die Hex-Datei über einen eigenen Bootloader, der in einem speziellen bereich des uC hinterlegt ist die HEX-Datei in den vorgesehenen Teil des Speichers für das "Programm" des uC. Auf gar keinen Fall zu vergleichen mit einem Art Betriebssystem, ueber den Bootloader wird der Code bloß weiter gereicht zu dem Ort an den er soll. Danach hat der Bootloader nichts mehr zu melden bzw. occupiert keine Resourcen des uC. Aber gefährliches Halbwissen eventuell, ich lese das nochmal nach - alles lange her seitdem ich mich damit befasst habe. " Hallo Sebastion, wo man die Frage welcher Timer Aduino nutzt findet ? Nun im großen Netz über eine Suchmachine. Gefunden habe ich: http://arduino-info.wikispaces.com/Timers-Arduino " Der angegeben Link beschreibt Timer die benötigt werden um z.B. einen Servo anzusteuern. Aber wenn man diese Funktion, die von der Arduino amgebung bereit gestellt ist nicht aufruft wird der Timer dafür auch nicht benötigt und ist "frei". Lieben Gruß an alle, bin jetzt einfach froh das es funktioniert ;-)
Sebastian Kreuzer schrieb: > Also wo wäre das zu lesen, das Timer1 belegt ist von Arduino? der war frei wer Servo nicht benutzt, habe ich selber rausgefunden weil mein Proggi bei Portierung von AVR Studio 4.18 nach Arduino einfach so funktionierte Sebastian Kreuzer schrieb: > Der angegeben Link beschreibt Timer die benötigt werden um z.B. einen > Servo anzusteuern. der Link war nützlich, nun weiss ich wenigstens warum :-) Timer 0 war für IRMP leider zu kurz Stress hatte ich als ich auf den Arduino Clone mit m1284p umstieg und dort die im Timer1 auch die PWM liegt (mein Wissen um all diese Verknüpfungen sind auch noch begrenzt), aber da der Timer3 beim m1284p frei und auch 16 Bit breit ist, war es ein leichtes den zu nehmen. Sebastian Kreuzer schrieb: > bin jetzt einfach froh das es funktioniert was war es nun genau?
Gast
#3940860
Karl Heinz schrieb: > Das Arduino "Betriebssystem" besteht aus nicht viel mehr als einem > Systemtakt, der die Uhr fuer zb millis() antreibt. Dafuer allerdings > braucht es einen Timer. Aus dem Blink-Minimalbeispiel der Arduino IDE folgerte ich dies. Denn die Loop() Funktion wird im Beispiel (ich habe nachgesehen) nicht durch den User aufgerufen, also muss es "aus dem Hintergrund" passieren. Ich habe in meinem Beitrag schon ganz bewusst "Betriebssystem" und nicht Betriebssystem geschrieben.
Gast
#3940865
chris schrieb: > > Im Hintergrund dürfte das nicht viel anders aussehen als so: Das wäre ja dann der "Vordergrund" ..... chris schrieb: > loop() wird nicht timergesteuert aufgerufen Im Übrigen: sie einige Zeilen weiter oben.
@isidor Also folgern klappt meistens doch nicht... Halte es für nicht richtig, da ich in all der Lektüre darüber nie etwas gelesen hat und es auch nicht logisch wäre ( für mich ). Siehe meinen Post oben. Also bis auf Gegenbeweis...halt ich an meiner These fest ;-) @Joachim: Falsch:
1 | |
2 | |
3 | |
Richtig:
1 | |
2 | |
3 | |
4 | |
Man muss TCCR1A mit 0 beschreiben!
wird der Timer vielleicht im Bootloader genutz? Sascha
Hallo Joachim die Frage ist natürlich warum sollte man das machen?
1 | |
Was steht im Datenblatt dazu ? PS ich weis es..
Gast
#3940987
Uwe S. schrieb: > die Frage ist natürlich warum sollte man das machen? > TCCR1A = 0; > Was steht im Datenblatt dazu ? > PS ich weis es.. Lesen bildet: Sebastian Kreuzer schrieb: > Aber scheinbar stehen die Register nicht mehr im > Default-Mode wie im Datenblatt. > > Deshalb ist es nötig !auch! TCCR1A auf "0" zu setzen, obwohl sich dieses > eigentlich in diesem Zustand befinden sollte.
Ratgeber schrieb: > Lesen bildet: > > Sebastian Kreuzer schrieb: >> Aber scheinbar stehen die Register nicht mehr im >> Default-Mode wie im Datenblatt. >> >> Deshalb ist es nötig !auch! TCCR1A auf "0" zu setzen, obwohl sich dieses >> eigentlich in diesem Zustand befinden sollte. Danke hatte ich nicht gesehen. Die Frage bleibt aber, was (be-)schreibt Timer1 und warum?
Gast
#3941053
Sebastian Kreuzer schrieb: > Ich denke Loop() wir über eine ganz normale Schleife aufgerufen. Leute, ist das wirklich sooo schwierig? Die Anzahl der Dateien des Arduino-IDE ist endlich. Da wird sich doch die richtige Datei finden lassen.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
