Go Down

Topic: Welcher Timer für was? (Read 14702 times) previous topic - next topic

Serenifly

Weil du "PORTH =" machst und damit den ganzen Port überschreibst. Egal was vorher drin stand. Dass eine 0 schieben nichts bringt war vor allem in Zusammenhang mit |= oder gemeint. Das kam wohl nicht so richtig rüber.

Doc_Arduino

Hallo,

wenn das nur im Zusammenhang mit |= gemeint war, dann hatten wir uns falsch verstanden.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Ich hätte es etwas deutlicher ausdrücken können

michael_x

Quote
Code: [Select]
void loop() {
  while(1)  {
    _toggle_T1 =! _toggle_T1;
    PORTB = (_toggle_T1 << 7);   
  }
}
Ob das Unsinn ist oder nicht: in PORTB werden auf jeden Fall immer 7 Bit auf 0 gesetzt und das oberste wechselt zwischen 0 und 1
7 Bits unververändert lassen, geht anders 8)
Ich würde das Ganze auch nach setup packen, damit erst gar keiner auf die Idee kommt, loop() würde hier verwendet ;)

Doc_Arduino

#49
Jul 02, 2015, 03:15 pm Last Edit: Jul 02, 2015, 03:15 pm by Doc_Arduino
Hallo,

vegiß das einfach, in dem einen Fall klappt es, allgemein ist es nur Müll Code. Da habt ihr beide schon recht. Wie gesagt, einfach vergessen. Hier soll es weiterhin um den Timer gehen.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#50
Jul 06, 2015, 01:24 pm Last Edit: Jul 06, 2015, 01:30 pm by Doc_Arduino
Hallo,

so, hab's endlich geschafft, ging aber nur mit fremder Hilfe, bin fremd gegangen bei unseren Kumpel's, sorry  :) , und habe dabei viel gelernt. Zum Bsp. das man einen Interrupt Handler auch schreiben muß wenn man einen Interrupt aktiviert. Ansonsten resetet sich der µC, weil er ins leere springt. Das war die Haupthürde die es zu nehmen galt. Der Rest war Programmierkunst der helfenden Leute.

Das sieht dann zum Bsp. so aus. Mit fest vorgegebenen Compare Match Werten gehts noch etwas schneller, aber damit eben ohne automatische Berechnung, was keinen Sinn macht. Vielleicht gehts doch, wenn man nach der Berechnung der Compare Werte dem Compiler sagen kann das diese ab dem Zeitpunkt konstant sind. :smiley-roll-sweat:   Dazu müßte man wissen wie man aus einer lokalen Variable eine Konstante macht. Mehrfach (um)definieren geht ja nicht.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

Quote
Dazu müßte man wissen wie man aus einer lokalen Variable eine Konstante macht. Mehrfach (um)definieren geht ja nicht
http://en.cppreference.com/w/cpp/language/constexpr
(mein Arduino kann jetzt C++11)
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Serenifly

Zum Bsp. das man einen Interrupt Handler auch schreiben muß wenn man einen Interrupt aktiviert. Ansonsten resetet sich der µC, weil er ins leere springt.
Ja, jetzt wo du das sagst ist das eigentlich selbstverständlich. Gewusst habe ich das schon. Darauf gekommen das dann auch hier anzuwenden bin nicht :)
Das hat sich auch von Version zu Version geändert. Mal hattest du eine ISR definiert. Mal nicht.


Das TIMSK1 |= (1 << OCIE1A); im switch/case kannst du dir übrigens sparen. Da machst du schon einmal außerhalb

Doc_Arduino

#53
Jul 06, 2015, 05:51 pm Last Edit: Jul 06, 2015, 05:54 pm by Doc_Arduino
Hallo,

als ich das mit den Interrupts dann wußte, dachte ich auch im ersten Moment, na Mensch, dass hätte doch mal jemand sagen können. Aber durch das rumprobieren immer mal Interrupts auskommentiert und wieder reingenommen, konnte ein fremder schlecht alles im Überblick behalten. Mach Dir keine Sorgen.  :)

Das mit dem constexpr brauche ich wohl nicht mehr. Aber gut zu wissen das es möglich ist. Danke dafür.
Denn unsere Kumpels haben mir nochwas gezeigt. Man toggelt  das Port Register einfach durch. Damit sind alle bis zum max. möglichen Takt auf die Flanke synchron und man beschäftigt nur einen Interrupt. Außerdem ist man nicht mehr auf die 3 Timer Toggle Pins beschränkt. Man kann irgendein freien Port nehmen und bis zu 8 Pins schalten lassen. Sieht dann am Ende wie ein Binärzähler aus.

Allerdings muß ich Euch nochmal fragen, denn es gibt bei näherer Betrachtung der Takte unschöne Anomalien im Takt. Immer fast genau auf eine ms genau, egal welcher Wert das Compare Match Register bekommen hat. Das Problem besteht nur wenn ich den Code Arduino gerecht schreibe. Schreibe ich das in reinen C gibt es keine erkennbaren Störungen. Nur die loop ist ja leer, wo ich nun dachte das die reinfunkt.

An den includes liegt es nicht, habs pobiert.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Millisekunden Takt? Deaktiviere vielleicht mal Timer0

Doc_Arduino

Hallo,

ich werde das testen, nur schreibe und uploade ich den Code von beiden in der IDE aus. Sollte da nicht Timer 0 immer mitlaufen .... wir werden gleich sehen ...
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

Tatsache, wenn Timer 0 ausgeschalten wird, klappt das. Nun verrate mir mal einer woher weis die IDE ob Timer 0 laufen soll oder nicht. Guckt die nach ob setup und loop vorkommt?


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#57
Jul 06, 2015, 08:03 pm Last Edit: Jul 06, 2015, 10:21 pm by Doc_Arduino
Hallo,

so Leute, hab das jetzt mit der automatischen Berechnung kombiniert. Funktioniert.
Mußte dabei aber leider feststellen, dass mein Logikanalyser auf Kanal 3 und 7 einen Treffer weg hat.
Selbst durch Kabel umstecken zeigen immer diese beiden Müll an. China eben.  :smiley-confuse:
Ansonsten funktioniert der Code. Kann ja mal jemand testen mit Logik-Analyzer.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up