- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Interrupt jede Millisekunde

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355

    Interrupt jede Millisekunde

    Hallo RNler!

    Ich habe vor eine Uhr zu bauen mithilfe meines RN-Control (nur testweise). Der Mega644 läuft mit 16MHz und ich verwende Timer0 im CTC modus mit Prescaler 8. Berechnet habe ich den Wert für das Compare-Register OCR0A folgendermaßen:

    ((16000000 / 8 ) / 1000) - 1 = 199

    Ist da etwas falsch? In der ISR lasse ich nur millisekunden, sekunden, minuten und stunden inkrementieren / zurücksetzen. Trotzdem dauert für den Controller 1 Minute nur ungefähr 6 Sekunden^^. Mein Code sieht so aus:

    Code:
    #define F_CPU 16000000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include "standards.h"
    
    volatile unsigned int milliseconds;
    volatile unsigned int seconds;
    volatile unsigned int minutes;
    volatile unsigned int hours;
    
    char buffer[10];
    
    int main(void)
    {
        
        init_USART();
        senchar('v');
    
        TCCR0A = (1<<WGM01); // CTC Mode of Timer 0
        TCCR0B |= (1<<CS01); // Prescaler 8
        
        // ((16000000 / 8) / 1000) = 200
        OCR0A = 200-1; // to get 200 steps 
        
        TIMSK0 |= (1<<OCIE0A); // Enable compare interrupt
        
        // global interrupt enable
        sei();
        
        DDRC |= 0x01;
        PORTC |= 0x01;
        
        while(1)
        {
            itoa(minutes, buffer, 10);
             sendUSART(buffer);
        }
    }
    
    // The compare match handler is called every time
    // TCNT0 = OCR0A = 200 - 1 (200 steps) which gives us
    // exactly 1ms
    ISR (TIMER0_COMPA_vect){
        
        milliseconds++;
        if(milliseconds == 1000){
            
            seconds++;
            milliseconds = 0;
        
            if(seconds == 60){
                minutes++;
                seconds = 0;
            }
            if(minutes == 60){
                hours++;
                minutes = 0;
            }
            if(hours == 24){
                hours = 0;
            }
        }
    }
    MfG

    Torrentula
    Geändert von Torrentula (20.10.2011 um 17:16 Uhr)
    MfG Torrentula

Ähnliche Themen

  1. ATmega644P Millisekunde genau?
    Von HeyHey im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 18.03.2011, 19:10
  2. Timer/Interrupt Problem. LED soll jede Minute blinken
    Von dg im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 18.05.2007, 20:04
  3. Jede Sekunde ein Timer Interrupt
    Von Johannes G. im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 06.10.2006, 16:52
  4. Gibt es empfängermodule für jede Wellenlänge?
    Von Katja im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 03.06.2006, 22:58

Berechtigungen

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

LiFePO4 Speicher Test