- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 26

Thema: Timer 2

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Anzeige

    Powerstation Test
    Bei der Verwendung der US-Einheit wird ja folgende Version verwendet:
    Code:
    ISR(TIMER2_COMP_vect)
    {
       //TCNT2 += 0x25;
       count36kHz++;
       if(!count36kHz) timebase++;
    }
    
    /**
     * initialises the Ultrasonic module
     * this function is automaticly called by Chirp
     */
    void InitUltrasonics(void)
    {
       // Change Oscillator-frequency of Timer 2
       // to 40kHz, no toggling of IO-pin:
       TCCR2  = (1 << WGM21) | (1 << CS20);
       OCR2   = 100;              // 40kHz @8MHz crystal
       TIMSK |= (1 << OCIE2);     // OCIE2:  Timer/Counter2 Output Compare Match Interrupt Enable
    
       ADCSRA = (0 << ADEN);      // deactivate ADC
       ACSR  |= (1 << ACIS1);     // Comparator Interrupt on Falling Output Edge
    
       ADMUX  = 0x03;             // connect ADC3-input with comparator
       SFIOR |= (1 << ACME);      // connect ADC multiplexer to comparator
       DDRD  &= ~(1 << 6);        // use Port D Pin 6 as input (AIN0)
    }
    Hierbei ergibt sich:
    4000 kHz / 100 (OCR2) = 40 kHz (Warum 4 MHz anstelle 8 MHz? Wo spielt der Faktor 2 hinein?)

    Das mit den Timern wird nirgends sauber erklärt. Robin Gruber verweist auch nur auf das Datenblatt. Auch im wiki-Artikel Timer gibt es keine klare Erklärung. Teilweise sind sogar Fehler enthalten.

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Vielleicht erhellt das angehängte PrograMM ja das Verständniss.
    Mit einem Osca kann man am Oscilator-Pin sehen was beim drücken der Tasten dann rauskommt.
    Die Tasten ändern folgendes:
    Taste 1: Increment OCR2-Wert um 1
    Taste 2: Decrement OCR2-Wert um 1
    Taste 3: Increment TCNT2-Offset um 1
    Taste 4: Decrement TCNT2-Offset um 1

    Taste 6: Eingestellte Werte seriel senden.

    Ausserdem ist für Leute-Ohne-Osca eine Excel-Datei dabei, in der man die beiden Werte OCR2 und TCNT2 mal eingeben kann und man dann ein 'Bildchen' zum Taktverlauf bekommt.


    P.S.: Ich glaube, dass in allen euren Berechnungen nicht berücksichtigt wurde, dass eine kleine Addition auch Zeit frisst.
    Im Exel-Blatt wird das in G2 un G3 berücksichtigt.
    Angehängte Dateien Angehängte Dateien
    Lieber Asuro programieren als arbeiten gehen.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Also:

    8000 kHz / (256-37+3) = 36,036 kHz

    Der Timer zählt also von 37 bis 256, dann benötigt er 3 Rechentakte für +=.

    ... und Symmetrie:

    145-37+3 = 111
    256-145 = 111

    Endlich Klarheit!

    Tausend Dank an Sternthaler!

  4. #14
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Klasse. Ich gebe 10 von 10 Punkten für diesen Thread. Grosses Lob für die Hartnäckigkeit @ ehenkes

    btw: ich dachte, die avrs machen alles in einem takt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    @radbruch
    Schau mal zum Spaß in's ATmega8.pdf (auf der Asuro-CD)
    Im Kapitel 'Instruction Set Summary' ab Seite 284 sind auch Befehle mit 4 Takten zu finden. (Schlimm sind die mit Takteanzahlen von 1 bis 3, je nach frag mich nicht.)
    Und wie man ja in diesem Thread sieht, kommt es da manchmal auf die Spalte 'CLOCKS' an. Zum Glück nur extrem selten zu lesen Hauptsächlich bei Interruptdingen wie hier ja nun mal.

    Die Zeile mit dem += wird im Assembler so aufgelößt:
    in r24, 0x24 ; 36
    lds r25, 0x0061
    add r24, r25
    out 0x24, r24 ; 36
    Warum ich im Excel-Blatt aber nur 3 Takte 'dazumogel' kann ich nicht mehr sagen.
    @radbruch
    Hier haben wir also doch nur Befehle, die nur einen Takt benötigen.


    In version.c der Lib noch zu finden wer da das helle Köpfchen war:
    Code:
    /****************************************************************************
    *
    * File Name:   asuro.c
    * Project  :   asuro library modified for IR collision detector
    *
    * Description: modifications made in following functions:
    *
    * SIGNAL (SIG_OUTPUT_COMPARE2)	->	SIGNAL (SIG_OVERFLOW2)
    * Gettime()				counts now 36kHz
    * Init()				timer2 modified for adjustable duty cycle
    * Batterie()				bug fixed
    * Sleep()				counts now 36kHz
    * Msleep()				counts now 36kHz
    *
    * Ver.     Date         Author           Comments
    * -------  ----------   --------------   ------------------------------
    * beta2	   11.06.2005   Waste   	 asuro library
    * -------  ----------   --------------   ------------------------------
    *****************************************************************************/
    (Ich sehe gerade in meiner Version V01, dass ich am 19.06.2005 (ältestes Dateidatum) angefangen hatte über diese Änderung zu grübeln. Wann ich selber drauf gekommen bin, steht da natürlich nicht.)
    Lieber Asuro programieren als arbeiten gehen.

  6. #16
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Schau mal zum Spaß in's ATmega8.pdf
    Tja, muss ich wohl. Aus "Bequemlichkeit" habe ich mich bisher davor gedrückt. Aber ohne diese Kenntnisse würde ich wohl auf Dauer von euren LIBs abhängig sein.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Zu dem Thema Takt (clock cycle) liest man im Datenblatt des ATmega8(L):

    The interrupt execution response for all the enabled AVR interrupts is four clock cycles minimum. After four clock cycles, the Program Vector address for the actual interrupt handling routine is executed. During this 4-clock cycle period, the Program Counter is pushed onto the Stack. The Vector is normally a jump to the interrupt routine, and this jump takes three clock cycles. If an interrupt occurs during execution of a multi-cycle instruction, this instruction is completed before the interrupt is served. If an interrupt occurs when the MCU is in sleep mode, the interrupt execution response time is increased by four clock cycles. This increase comes in addition to the start-up time from the selected sleep mode. A return from an interrupt handling routine takes four clock cycles. During these four clock cycles, the Program Counter (2 bytes) is popped back from the Stack, the Stack Pointer is incremented by 2, and the I-bit in SREG is set.
    Das sollte keine Verzögerung einbauen, aber sicher bin ich mir nicht völlig.

    The counting direction is always up (incrementing), and no counter clear is performed. The counter simply overruns when it passes its maximum 8-bit value (MAX = 0xFF) and then restarts from the bottom (0x00). In normal operation the Timer/Counter Overflow Flag (TOV0) will be set in the same timer clock cycle as the TCNT0 becomes zero. The TOV0 Flag in this case behaves like a ninth bit, except that it is only set, not cleared. However, combined with the timer overflow interrupt that automatically clears the TOV0 Flag, the timer resolution can be increased by software. A new counter value can be written anytime.
    Hier ist alles klar. Ich grüble, ob nicht exakt bei 0 die 37 addiert wird, sondern erst einige Takte später, da der Prozessor nach dem Overflow in der Routine noch mit einigem anderen beschäftigt ist, siehe:
    Code:
    SIGNAL (SIG_OVERFLOW2)
    {
      a0:	1f 92       	push	r1
      a2:	0f 92       	push	r0
      a4:	0f b6       	in	r0, 0x3f	; 63
      a6:	0f 92       	push	r0
      a8:	11 24       	eor	r1, r1
      aa:	8f 93       	push	r24
      ac:	9f 93       	push	r25
      ae:	af 93       	push	r26
      b0:	bf 93       	push	r27
      TCNT2 += 0x25;
      b2:	84 b5       	in	r24, 0x24	; 36
      b4:	8b 5d       	subi	r24, 0xDB	; 219
      b6:	84 bd       	out	0x24, r24	; 36
      count36kHz ++;
      b8:	80 91 71 00 	lds	r24, 0x0071
      bc:	8f 5f       	subi	r24, 0xFF	; 255
      be:	80 93 71 00 	sts	0x0071, r24
      if (!count36kHz)
      c2:	80 91 71 00 	lds	r24, 0x0071
      c6:	88 23       	and	r24, r24
      c8:	99 f4       	brne	.+38     	; 0xf0 <__vector_4+0x50>
    Die Zeile mit dem += wird im Assembler so aufgelößt:
    in r24, 0x24 ; 36
    lds r25, 0x0061
    add r24, r25
    out 0x24, r24 ; 36
    Warum ich im Excel-Blatt aber nur 3 Takte 'dazumogel' kann ich nicht mehr sagen.
    Zur Anweisung +=

    In der temporären Datei xxx.lss findet sich bei mir:

    TCNT2 += 0x25;
    b2: 84 b5 in r24, 0x24 ; 36
    b4: 8b 5d subi r24, 0xDB ; 219
    b6: 84 bd out 0x24, r24 ; 36

    in (In Port) 1 clock
    subi (Subtract Constant from Register) 1 clock
    out (Out Port) 1 clock

    ... macht genau 3 Takte. Perfekt!

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Die gleiche tiefgehende Analyse bitte für die erweiterte Ultraschall-Funktion mit 40 kHz:
    Code:
       // Change Oscillator-frequency of Timer 2
       // to 40kHz, no toggling of IO-pin:
       TCCR2  = (1 << WGM21) | (1 << CS20);
       OCR2   = 100;              // 40kHz @8MHz crystal
       TIMSK |= (1 << OCIE2);     // OCIE2:  Timer/Counter2 Output Compare Match Interrupt Enable
    Hierbei wird ja die Zeile mit dem Addieren von 0x25 gestrichen. Nun verstehe ich endlich warum.

    Code:
    ISR(TIMER2_COMP_vect)
    {
       //TCNT2 += 0x25; //gestrichen!!!
       count36kHz++;
       if(!count36kHz) timebase++;
    }
    Das mit dem count36kHz++ erscheint mir inzwischen völlig unlogisch. Gehört das hier nicht auch weg??? Diese Funktion wird doch alle 100 Takte aufgerufen, also ist count36kHz während der Ultraschallphase ein 80 kHz-Counter. Sehe ich das richtig?

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    697
    Ich versuche es zunächst selbst. Bitte korrigieren, falls falsch:

    40 kHz:
    Im Register TCCR2 werden die Bits WGM21 und CS20 auf 1 gesetzt.
    Das Register OCR2 wird auf dezimal 100 gesetzt.
    Im Register TIMSK wird das Bit OCIE2 auf 1 gesetzt.

    WGM21 bedeutet Modus "Clear Timer on Compare Match (CTC)". Top ist dabei OCR2.

    CS20 bedeutet "No Prescaling".

    OCR2 = dec100 wird ständig mit TCNT2 verglichen.

    40 kHz ergeben sich durch:

    8000000 / 2 * 100 = 40000 (100 Takte Lo-Signal und 100 Takte Hi-Signal, immer abwechselnd, so ist es im Datenblatt auf S. 89 zu bewundern)

    OCIE2 in TIMSK gesetzt bedeutet "Timer/Counter2 Output Compare Match Interrupt Enable"


    Anmerkung:
    https://www.roboternetz.de/wissen/in..._Match_mode.29
    sollte m.E. überarbeitet werden. Die Erklärungen dort bringen zu wenig Klarheit.

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.12.2006
    Ort
    Eberbach
    Beiträge
    199
    Hi,
    Zitat Zitat von ehenkes
    Zu dem Thema Takt (clock cycle) liest man im Datenblatt des ATmega8(L):
    ...
    Das sollte keine Verzögerung einbauen, aber sicher bin ich mir nicht völlig.

    ...
    Hier ist alles klar. Ich grüble, ob nicht exakt bei 0 die 37 addiert wird, sondern ...
    hat jemand Zugriff auf ein Oszilloskop und kann mal nachmessen, ob es wirklich gemau 36000Hz sind, oder ein bißchen mehr, oder ein bißchen weniger?
    Kenntnis der realen Frequenz erleichtert sicherlich das Finden der richtigen Erklärung ...

    [Beim PiccoZ sind es 37.31kHz, nicht gerade eine runde Zahl, und als Receiver ist glaube ich ein 38kHz-Chip drin ...
    http://hunz.geekheim.de/?p=49
    und in der 5. Antwort dort findet man einen Link, wie jemand mit 'nem Scope den X-Twin RC plane transmitter code geknackt hat (mein Sohn hat sich letzte Woche auch so einen Flieger zugelegt ...)]
    Gruß, Hermann.
    myIrAsuro.Bild hier  

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad