- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Timer1, Interrupt wird nur einmal ausgeführt

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2019
    Beiträge
    14

    Timer1, Interrupt wird nur einmal ausgeführt

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo liebe Gemeinde,

    ich habe nur ein bescheidene Frage.
    Bei meinem Assembler Programm (auf dem RN-Control) sollen alle LEDs an PORTC im sekunden Takt blinken.
    Dies habe ich mit dem Timer1 (16-Bit) umgesetzt. Mein Problem ist nur, dass der Interrupt nur einmal ausgeführt wird. Die LEDs leuchten für eine Sekunde und gehen dann aus.
    Meine Vermutung ist, dass das Zählregister nicht zurückgesetzt wird, aber das ist nur eine Vermutung.

    Hat vielleicht jemand einen Hinweis was ich vergessen haben könnte oder vielleicht falsch gemacht habe?

    Viele Grüße
    Helmut

    Code:
    ##########
    #PROGRAMM#
    ##########
    
    
    ; definitions
    .def	temp = R16
    .def	temp_1	= R17
    
    ; interrupt vectors
    .org	0x000	; reset handler
    	rjmp main
    
    .org	0x00E	; Timer1 CompareA Handler
    	rjmp interrupt_compare_A
    
    .org	0x010	; Timer1 CompareB Handler
    	rjmp interrupt_compare_B
    
    
    main:	; main programm
    
    ;;; Timer Counter
    ;; Control Register A 
    LDI				temp,	0x00	; normal & Clear Timer on Compare Match (CTC) Mode -> own overflow value
    OUT				TCCR1A,	temp	; Control Register A
    ;; Control Register B
    LDI				temp,	0b00011101	; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow value
    OUT				TCCR1B,	temp		; Control Register B
    ;; Output Compare Register 1 A for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI				temp,	0b00001001
    OUT				OCR1AL,	temp
    LDI				temp,	0b00111101
    OUT				OCR1AH,	temp
    ;; Output Compare Register 1 B for CTC
    ; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
    LDI				temp,	0b00010010
    OUT				OCR1BL,	temp
    LDI				temp,	0b01111010
    OUT				OCR1BH,	temp
    
    
    ;;; PORTC set as output
    LDI			temp,	0xFF	; Register komplett auf 1 setzen / LDI geht nur von R16 bis R31
    OUT			DDRC,	temp	; durch DDRC wird festgelegt ob die Pins von PORTC als Ausg. (1) oder Eing. (0) definiert werden
    							; DDRC wird nun mit den Werten aus R16 befüllt
    
    ;;; Interrupt handling
    ;; for timer 1
    LDI				temp,	0x08	; Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
    OUT				TIMSK,	temp	; Timer/Counter Interrupt Mask Register
    ;; global
    sei								; set global interruptenable
    
    
    loop:
    	rjmp loop	; endless loop
    
    
    
    ;-------------------------------------------------------------------------------------------
    ; interrupts
    
    interrupt_compare_A:	; interrupt routine for compare register 1 B
    	IN			temp_1,	SREG	; save status register
    	LDI			temp,	0x00	
    	OUT			PORTC,	temp	; LEDs on
    	OUT			SREG,	temp_1	; restore status register
    	reti
    
    interrupt_compare_B:	; interrupt routine for compare register 1 A
    	IN			temp_1,	SREG	; save status register
    	LDI			temp,	0xFF
    	OUT			PORTC,	temp	; LEDs off
    	OUT			SREG,	temp_1	; restore status register
    	reti
    
    ;-------------------------------------------------------------------------------------------
    Geändert von Helmut1234 (21.03.2019 um 15:37 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo Helmut1234,
    es gibt eine Menge Macken in Deinem Code. Zunächst solltest Du ihn in die CODE Tags einschließen. Dann bleibt die Formatierung erhalten und ist viel besser lesbar.. Code Tags erreichbar in der "Erweitert" bzw "Vorschau" Ansicht mit dem # Zeichen oder [ CODE] ...prg... [ /CODE] ohne die Leerzeichen in den Klammern schreiben.

    Zum Programm selbst:
    Zum Nachschlagen im Datenblatt gehe ich mal von einem ATmega32 als µC auf dem RN-Control aus.


    main: ; main programm

    ;;; Timer Counter
    ;; Control Register A
    LDI temp, 0x00 ; normal & Clear Timer on Compare Match (CTC) Mode -> own overflow value
    OUT TCCR1A, temp ; Control Register A
    ;; Control Register B
    LDI temp, 0b00011101 ; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow

    value
    OUT TCCR1B, temp ; Control Register B

    Mit dem Bitmuster 0b00011101 wird zwar CTC aber mit ICR1 als TOP Wert eingestellt.
    Das 16Bit Register ICR1 hat einen Initialwert von 0 und Du schreibst keinen anderen Wert hinein
    Der Timer wird also nach Setzen des Prescalers los laufen und immer wegen ICR1=0 den TCNT1 gleich wieder rücksetzen.
    Warum ein Interrupt einmal ausgeführt wird möchte ich ertsmal nicht versuchen zu erklären, da Du auch die 16Bit Register in der falschen Reihenfolge beschreibst.


    ;; Output Compare Register 1 A for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI temp, 0b00001001
    OUT OCR1AL, temp
    LDI temp, 0b00111101
    OUT OCR1AH, temp
    ;; Output Compare Register 1 B for CTC
    ; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
    LDI temp, 0b00010010
    OUT OCR1BL, temp
    LDI temp, 0b01111010
    OUT OCR1BH, temp

    Werte nicht nachgerechnet aber beide Register werden in der falschen Reihenfolge beschrieben. Auszug aus dem Datenblatt, Abschnitt "Accessing 16-bit Registers":
    To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low
    byte must be read before the high byte



    ;;; PORTC set as output
    LDI temp, 0xFF ; Register komplett auf 1 setzen / LDI geht nur von R16 bis R31
    OUT DDRC, temp ; durch DDRC wird festgelegt ob die Pins von PORTC als Ausg. (1) oder Eing. (0) definiert werden
    ; DDRC wird nun mit den Werten aus R16 befüllt

    ;;; Interrupt handling
    ;; for timer 1
    LDI temp, 0x08 ; Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
    OUT TIMSK, temp ; Timer/Counter Interrupt Mask Register
    ;; global

    Anders als im Kommentar ist der Wert 0x8 das Bit 3 und setzt das OCIE1B Bit - deshalb geht die LED auch aus.
    Compare A Interrupt wird nie enabled.


    sei ; set global interruptenable


    loop:
    rjmp loop ; endless loop



    ;-------------------------------------------------------------------------------------------
    ; interrupts

    interrupt_compare_A: ; interrupt routine for compare register 1 B
    IN temp_1, SREG ; save status register

    Kommentar irreführend.
    Kein Fehler aber Sichern des SREG und Wiederherstellen ist nicht notwendig, da die nachfolgenden Kommandos bis reti das Statusregister nicht ändern.

    LDI temp, 0x00
    OUT PORTC, temp ; LEDs on
    OUT SREG, temp_1 ; restore status register
    reti

    interrupt_compare_B: ; interrupt routine for compare register 1 A
    IN temp_1, SREG ; save status register

    Kommentar irreführend.
    Kein Fehler aber Sichern des SREG und Wiederherstellen ist nicht notwendig, da die nachfolgenden Kommandos bis reti das Statusregister nicht ändern.

    LDI temp, 0xFF
    OUT PORTC, temp ; LEDs off
    OUT SREG, temp_1 ; restore status register
    reti

    ;--------------------------------------------------------------------------
    Geändert von Searcher (21.03.2019 um 08:09 Uhr) Grund: Erläuterungen etwas ergänzt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2019
    Beiträge
    14
    Hallo Searcher,

    vielen Dank für deine schnelle Antwort und für den Hinweis mit dem [ CODE]. Das hatte ich gesucht nur leider nicht gefunden, sorry.
    Deine Hinweise habe ich wie folgt umgesetzt, nur leider ist es das gleiche Verhalten wie zuvor.

    Zitat Zitat von Searcher Beitrag anzeigen
    Mit dem Bitmuster 0b00011101 wird zwar CTC aber mit ICR1 als TOP Wert eingestellt.
    Das Bitmuster habe ich jetzt auf 0b00001101 geändert.
    Code:
    ;; Control Register B
    LDI				temp,	0b00001101	; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow value
    OUT				TCCR1B,	temp		; Control Register B


    Zitat Zitat von Searcher Beitrag anzeigen
    Werte nicht nachgerechnet aber beide Register werden in der falschen Reihenfolge beschrieben. Auszug aus dem Datenblatt, Abschnitt "Accessing 16-bit Registers":
    To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low
    byte must be read before the high byte
    Die Reihenfolge habe ich nun geändert.
    Code:
    ;; Output Compare Register 1 A for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI				temp,	0b00111101
    OUT				OCR1AH,	temp
    LDI				temp,	0b00001001
    OUT				OCR1AL,	temp
    ;; Output Compare Register 1 B for CTC
    ; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
    LDI				temp,	0b01111010
    OUT				OCR1BH,	temp
    LDI				temp,	0b00010010
    OUT				OCR1BL,	temp

    Zitat Zitat von Searcher Beitrag anzeigen
    Kommentar irreführend.
    Kein Fehler aber Sichern des SREG und Wiederherstellen ist nicht notwendig, da die nachfolgenden Kommandos bis reti das Statusregister nicht ändern.
    Das Sichern des SREG habe ich eingefügt, weil ich es machen wollte. Also als Übung und Vorsatz damit ich mir das angewöhne.


    Beste Grüße
    Helmut

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Helmut1234 Beitrag anzeigen
    ..., nur leider ist es das gleiche Verhalten wie zuvor.
    Hallo Helmut,

    auch im TIMSK mit Wert 0x18 (dez 24 bzw 0b000011000 bzw OCIE1A und OCIE1B) Bit 3 und 4 beide Compareinterrupts frei gegeben?

    Und dann bitte nochmal das ganze Programm einstellen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2019
    Beiträge
    14
    Zitat Zitat von Searcher Beitrag anzeigen
    Hallo Helmut,

    auch im TIMSK mit Wert 0x18 (dez 24 bzw 0b000011000 bzw OCIE1A und OCIE1B) Bit 3 und 4 beide Compareinterrupts frei gegeben?

    Und dann bitte nochmal das ganze Programm einstellen.

    Gruß
    Searcher

    Das ist nun auch eingefplegt, aber leider auch kein Erfolg. Jetzt blinkt gar nichts mehr, jetzt leuchten die LEDs nur noch.

    Code:
    ; definitions
    .def	temp = R16
    .def	temp_1	= R17
    
    ; interrupt vectors
    .org	0x000	; reset handler
    	rjmp main
    
    .org	0x00E	; Timer1 CompareA Handler
    	rjmp interrupt_compare_A
    
    .org	0x010	; Timer1 CompareB Handler
    	rjmp interrupt_compare_B
    
    
    
    
    
    ;Mnemonic	target,	source
    
    
    
    main:	; main programm
    
    
    ;;; Timer Counter
    ;; Control Register A 
    LDI				temp,	0x00	; normal & Clear Timer on Compare Match (CTC) Mode -> own overflow value
    OUT				TCCR1A,	temp	; Control Register A
    ;; Control Register B
    LDI				temp,	0b00001101	; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow value
    OUT				TCCR1B,	temp		; Control Register B
    
    ;; Output Compare Register 1 A for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI				temp,	0b00111101
    OUT				OCR1AH,	temp
    LDI				temp,	0b00001001
    OUT				OCR1AL,	temp
    ;; Output Compare Register 1 B for CTC
    ; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
    LDI				temp,	0b01111010
    OUT				OCR1BH,	temp
    LDI				temp,	0b00010010
    OUT				OCR1BL,	temp
    
    
    ;;; PORTC set as output
    LDI			temp,	0xFF	; Register komplett auf 1 setzen / LDI geht nur von R16 bis R31
    OUT			DDRC,	temp	; durch DDRC wird festgelegt ob die Pins von PORTC als Ausg. (1) oder Eing. (0) definiert werden
    							; DDRC wird nun mit den Werten aus R16 befüllt
    
    ;;; Interrupt handling
    ;; for timer 1 Interrupt Mask Register
    LDI				temp,	0b00001100	; Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
    OUT				TIMSK,	temp		
    ;; global
    sei									; set global interruptenable
    
    
    loop:
    	rjmp loop	; endless loop
    
    
    
    ;-------------------------------------------------------------------------------------------
    ; interrupts
    
    interrupt_compare_A:	; interrupt routine for compare register 1 B
    	IN			temp_1,	SREG	; save status register
    	LDI			temp,	0x00	
    	OUT			PORTC,	temp	; LEDs on
    	OUT			SREG,	temp_1	; restore status register
    	reti
    
    interrupt_compare_B:	; interrupt routine for compare register 1 A
    	IN			temp_1,	SREG	; save status register
    	LDI			temp,	0xFF
    	OUT			PORTC,	temp	; LEDs off
    	OUT			SREG,	temp_1	; restore status register
    	reti
    
    ;-------------------------------------------------------------------------------------------
    Geändert von Helmut1234 (21.03.2019 um 17:01 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Also , jetzt gaaanz in Ruhe und langsam. TIMSK nochmal überprüfen! - mit Datenblatt und meinen post in der Hand Muß gleich weg also restliches Programm überprüfen braucht noch was.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2019
    Beiträge
    14
    Da hast du Recht. Ich mache das nachher ganz in Ruhe und gehe die ganzen Flags noch mal durch.

    Grüße
    Helmut

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo Helmut,
    ich glaub viel fehlt nicht mehr wenn das TIMSK richtig gesetzt ist. Was passiert im Mode 4, also CTC mit OCR1A als TOP?:

    Code:
    ;; Output Compare Register 1 A for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI                temp,    0b00111101  
    OUT                OCR1AH,    temp
    LDI                temp,    0b00001001
    OUT                OCR1AL,    temp
    ;; Output Compare Register 1 B for CTC
    ; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
    LDI                temp,    0b01111010 
    OUT                OCR1BH,    temp
    LDI                temp,    0b00010010
    OUT                OCR1BL,    temp
    .
    .
    . 
    .
    .
    ;-------------------------------------------------------------------------------------------
    ; interrupts
    
    interrupt_compare_A:    ; interrupt routine for compare register 1 B
        IN            temp_1,    SREG    ; save status register
        LDI            temp,    0x00    
        OUT            PORTC,    temp    ; LEDs on
        OUT            SREG,    temp_1    ; restore status register
        reti
    
    interrupt_compare_B:    ; interrupt routine for compare register 1 A
        IN            temp_1,    SREG    ; save status register
        LDI            temp,    0xFF
        OUT            PORTC,    temp    ; LEDs off
        OUT            SREG,    temp_1    ; restore status register
        reti
    
    ;-----------------------------------------------------------------------------------
    Der Timer läuft nur bis 15625 da OCR1A mit 15625 gesetzt ist. Interrupt Flag wird gesetzt wg. Compare1a Interrupt. Interrupt Compare1A wird ausgeführt und LEDs werden in der ISR eingeschaltet. Der Timer läuft nicht weiter hoch sondern setzt sich auf 0 (Null) wegen CTC. Er erreicht also die 31250 für Compare1B Match gar nicht da TCNT1 vorher zurück gesetzt wird. Compare1B Interrupt kann also nicht eintreten und die LED nie ausgeschaltet werden.

    Also einfach die 15625 ins OCR1B schreiben und die 31250 in OCR1A. Damit läuft der Timer zwei Sekunden hoch. "Oben" schaltet er über den Compare1A Interrupt die LEDs ein und auf dem Weg nach oben über den Compare1B Interrupt die LEDs aus.

    Übrigens um genau zwei Sekunden zu erreichen sollte der Wert 31249 statt 31250, da der Timer noch einen Timertick braucht um auf Null zu kommen. Spiegelt sich auch im Datenblatt in der Formel zur Frequenzberechnung mit der -1 wieder. Eventuell auch die 15625 um eins vermindern?

    So bin gespannt was sich tut.

    Gruß
    Searcher
    Geändert von Searcher (21.03.2019 um 19:30 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2019
    Beiträge
    14
    Vielen Dank Search, es bliiiiinkt!
    Ohne dich hätte ich das glaube ich nicht hinbekommen. Ich hoffe ich brauche das dann auch in meinen Projekten.

    Zum einen lag es an den TIMSK Flags, die waren um eine Bitstelle verschoben.
    Zum anderen an der zuvor von dir erwähnten Reihenfolge der Faktoren, spricht den Werten in den Vergleichsregistern (OCR1A und OCR1B).

    Also einfach die 15625 ins OCR1B schreiben und die 31250 in OCR1A. Damit läuft der Timer zwei Sekunden hoch. "Oben" schaltet er über den Compare1A Interrupt die LEDs ein und auf dem Weg nach oben über den Compare1B Interrupt die LEDs aus.


    Übrigens um genau zwei Sekunden zu erreichen sollte der Wert 31249 statt 31250, da der Timer noch einen Timertick braucht um auf Null zu kommen. Spiegelt sich auch im Datenblatt in der Formel zur Frequenzberechnung mit der -1 wieder. Eventuell auch die 15625 um eins vermindern?
    Die ausgerechnete Zeit muss nicht ganz genau sein. Ich wollte einfach nur im ca. 1 Sekundentakt blinkende LEDs haben.


    Falls also jemand mal einen funktionierenden Code braucht mit blinkenden LEDs (ca. 1s), hier ist er.

    Code:
    ; Programm :	This programm is written and tested on an Atmega32. It causes the LEDs on PORTC to blink on a frequency of 1 second. 
    ;			To do so it uses the timer 1 (16-Bit) on CTC mode with a prescaler of 1024. To reach the frequency of 1 second 
    ;			the compare register B has the value 15625 and register A the value 31250. The demension of these values result in
    ;			the system clock of 16MHz. 
    ;			1024 * 15625 = 16000000
    ;			1024 * 31250 = 32000000
    
    
    
    ; definitions
    .def	temp = R16
    .def	temp_1	= R17
    
    ; interrupt vectors
    .org	0x000	; reset handler
    	rjmp main
    
    .org	0x00E	; Timer1 CompareA Handler
    	rjmp interrupt_compare_A
    
    .org	0x010	; Timer1 CompareB Handler
    	rjmp interrupt_compare_B
    
    
    ;Mnemonic	target,	source
    
    
    main:	; main programm
    
    ;;; PORTC set as output
    LDI			temp,	0xFF	
    OUT			DDRC,	temp	; DDRC defines if PORTC is an output (1) or input (0)
    
    
    ;;; Timer Counter in CTC Mode -> self defined value; if timer reaches value, interrupt accours   
    ;; Control Register A 
    LDI				temp,	0x00	; normal & Clear Timer on Compare Match (CTC) Mode
    OUT				TCCR1A,	temp	; Control Register A
    ;; Control Register B
    LDI				temp,	0b00001101	; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow value
    OUT				TCCR1B,	temp		; Control Register B
    
    
    ;; Output Compare Register 1 A for CTC
    ; write value 31250 -> 31250 * 1024 = 32MHz -> 2 seconds count
    LDI				temp,	0b01111010
    OUT				OCR1AH,	temp		; first write high register then low
    LDI				temp,	0b00010010
    OUT				OCR1AL,	temp
    ;; Output Compare Register 1 B for CTC
    ; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
    LDI				temp,	0b00111101
    OUT				OCR1BH,	temp		; first write high register then low
    LDI				temp,	0b00001001
    OUT				OCR1BL,	temp
    
    
    ;;; Interrupt handling
    ;; for timer 1 Interrupt Mask Register
    LDI				temp,	0b000011000	; OCIE1A and OCIE1B -> Output Compare A and B Match Interrupt Enable
    OUT				TIMSK,	temp		
    ;; global interrupt enable
    sei	
    
    
    loop:
    	rjmp loop	; endless loop
    
    
    
    ;-------------------------------------------------------------------------------------------
    ; interrupts
    ;-------------------------------------------------------------------------------------------
    
    interrupt_compare_A:	; interrupt routine for compare register 1 B
    	IN			temp_1,	SREG	; save status register
    	LDI			temp,	0x00	
    	OUT			PORTC,	temp	; LEDs on
    	OUT			SREG,	temp_1	; restore status register
    	reti						; finishes interrupt and enables global interrupt
    
    interrupt_compare_B:	; interrupt routine for compare register 1 A
    	IN			temp_1,	SREG	; save status register
    	LDI			temp,	0xFF
    	OUT			PORTC,	temp	; LEDs off
    	OUT			SREG,	temp_1	; restore status register
    	reti						; finishes interrupt and enables global interrupt
    
    ;-------------------------------------------------------------------------------------------
    ;-------------------------------------------------------------------------------------------

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Übrigens um genau zwei Sekunden zu erreichen sollte der Wert 31249 statt 31250, da der Timer noch einen Timertick braucht um auf Null zu kommen. Spiegelt sich auch im Datenblatt in der Formel zur Frequenzberechnung mit der -1 wieder. Eventuell auch die 15625 um eins vermindern?
    Das ist nicht ganz richtig, ich habe beim Support nachgewühlt, weil wir einen Glitch hatten und das Ergebnis war dass der Timer nicht einen "Timertick" sondern einen "Clocktick" braucht, also nur einen Prozessortakt, hat man also einen großen ClockDivider, wirkt sich der extra takt kaum aus, aber je kleiner der Divider desto stärker der Einfluss des zusätzlichen Takt

    Timer/Counter1 is reset to $00 in the CPU clock cycle after a compare
    match with OCR1A register
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Warten auf Tastendruck -> Interrupt wird nicht mehr ausgeführt
    Von Amri im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 04.12.2012, 14:10
  2. If-Schleife wird nicht ausgeführt
    Von Knipser-14 im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 08.10.2010, 13:26
  3. Antworten: 1
    Letzter Beitrag: 03.08.2010, 19:37
  4. Programm wird bei geänderter Frequenz nicht mehr ausgeführt
    Von cesupa im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 19.08.2007, 01:50
  5. Anweisung wird nicht richtig ausgeführt
    Von Foooob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 20.02.2006, 19:11

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests