-         

Ergebnis 1 bis 4 von 4

Thema: 8-Bit Timer Frage

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    8-Bit Timer Frage

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi,
    wo das Tutorial versagt muss ich euch mal fragen:
    1 . Fängt der Timer mit
    Code:
    TCCR0 |= (1<<CS00) | (1<<CS02);
    bereits an zu laufen?

    2.
    Zitat aus dem Tutorial:
    Bei jedem Überlauf von 255 auf 0 wird das Timer Overflow Flag TOV0 im Timer Interrupt Flag TIFR-Register getzt und, falls so konfiguriert, ein entsprechender Timer-Overflow-Interrupt ausgelöst und die daran gebundene Interrupt-Routine abgearbeitet.
    Ok, erscheint mir logisch. Aber wie man das macht, dass ein Timer-Overflow-Interrupt ausgelöst und eine Routing abgearbeitet wird steht nicht dabei. Kann mir da jemand helfen?

    3. Der aktuelle Wert steht ja in TCNT0. Aber wie bekomm ich die Zahl damit ich sie z.B. über UART ausgeben kann? Nem 8-Bit Integer zuweisen?

    mfg
    jagdfalke

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    33
    Beiträge
    165

    Re: 8-Bit Timer Frage

    Zitat Zitat von jagdfalke
    Hi,
    wo das Tutorial versagt muss ich euch mal fragen:
    1 . Fängt der Timer mit
    Code:
    TCCR0 |= (1<<CS00) | (1<<CS02);
    bereits an zu laufen?
    nein.
    das richtige Bit in TIMSK muss auch gesetzt werden.
    zusätzlich musst du noch Global Interrupt Enable im Statusregister setzen am besten mit sei();
    mit cli(); werden die Interrupts wieder ausgeschaltet.
    2.
    Ok, erscheint mir logisch. Aber wie man das macht, dass ein Timer-Overflow-Interrupt ausgelöst und eine Routing abgearbeitet wird steht nicht dabei. Kann mir da jemand helfen?
    SIGNAL (SIG_OVERFLOW0)
    {
    /* dein code */
    }
    SIG_OVERFLOW0 mit dem Interrupt ersetzen den du nutzen willst.
    Statt SIGNAL kannst du auch INTERRUPT verwenden. Dann bleiben aber die Interrupts aktiviert während der Interrupt abgearbeitet wird. Kann zu Problemen führen => im Zweifel SIGNAL
    3. Der aktuelle Wert steht ja in TCNT0. Aber wie bekomm ich die Zahl damit ich sie z.B. über UART ausgeben kann? Nem 8-Bit Integer zuweisen?
    foo=TNCT0; sollte tun.

    alles aus dem Gedächtnis, hoffe das stimmt so alles

    HTH

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Achso die ganzen Register mit "0" hinten dran gehoren zusammen, und so unterscheidet signal() dann die Interrupts. aha !
    Ok, danke für deine Antwort.

    mfg
    jagdfalke

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Also ich habe jetzt mal folgendes geschrieben:
    Code:
    #define F_CPU	8000000
    
    #include <avr/delay.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    #include "uart.h"
    
    SIGNAL (SIG_OVERFLOW0)
    {
    	uart_puts("Hallo", 5, 1);
    } 
    
    int main (void) {
    	uart_init(1, 0);
    
    	sei();
    	TCCR0 |= (1<<CS02) | (1<<CS00);
    	TIMSK |= (1<<TOIE0);
    
    	while(1)
    	{
    
    	}
    	return 0;
    }
    Ist doch richtig so oder? Und der für den Timer ist ein 1024er Prescaler "aktiviert".
    Was aber, wenn ich den Interrupt nur alle 10 Sekunden haben will ?? Es gibt ja keinen noch höheren Prescaler.

    mfg
    jagdfalke

Berechtigungen

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