Atmega1284p Timer Counter Problem

OP #4187805
Lesenswert?
• ▲
▼
Hallo zusammen,

ich versuche verzweifelt einen Counter am Atmega1284p einzustellen.
Ich möchte einen Counter einstellen, welcher ca. alle 1us in 
TIMER0_OVF_vect springt und eine Variable "counter" hochzählt. Das 
funktioniert auch soweit. Nun möchte ich im Hauptprogramm eine Abfrage, 
welche den Timer deaktiviert, sobald die Variable "counter" > X ist.

Das Deaktivieren funktioniert aber nicht.
Der Timer bleibt ständig an.

do{
    N++;
} while( counter < T );

Die while Bedingung greift nicht. Es funktioniert aber komischerweise, 
wenn ich in die do Schleife ein _delay_us(100); einbaue.

Ich hoffe mir kann jemand von euch weiterhelfen!

Hier der Code:

#ifndef F_CPU
#define F_CPU 16000000UL                          // Controller CPU 
Frequenz
#endif

#include <avr/io.h>
#include <math.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/interrupt.h>

extern void uart_init(uint32_t UBRR_VAL);                  //UART 
Initialisierung
extern void uart_puts (char *s);                      //UART String 
senden
extern void uart_gets( char* Input );                    //UART String 
empfangen
extern void uart_putc( char c );                      //UART Char senden

unsigned long counter;
unsigned long T;          //Zeitintervall in us
unsigned long N;          //Anzahl der Impulse
char Ergebnis[10] = "";
static int32_t UBRR_VAL;

int main(void){
  UBRR_VAL =25;
  uart_init(UBRR_VAL);

  T = 1000;
  TCCR0B |= (1<<CS01);  //Prescaler 8
  TCNT0 = 254;        //Counter vorladen

  N = 0;
  counter = 0;
  uart_puts("start");
  TIMSK0|=(1<<TOIE0);      //Enable Counter
  sei();            //Enable Interupts


  do{
    N++;                                 //Taktzähler um 1 erhöhen
  } while( counter < T );


  cli();
  TIMSK0|=(0<<TOIE0);      //Disable Counter
  uart_puts("ende");
  counter = 0;  //Counter zurücksetzen

  itoa(N, Ergebnis, 10);
  strcat (Ergebnis, ";");
  uart_puts(Ergebnis);



}

ISR(TIMER0_OVF_vect) {
  counter++;
  TCNT0 = 254;
}
Gast #4187845
Lesenswert?
• ▲
▼
Hi,
Deine counter Variable solltest Su als
volatile uint32_t counter = 0; deklarieren

und schau doch mal, was es heisst, wenn kein Prescaler Bit gesetzt 
ist..;-)

TCR0B = Prescaler; // Timer starten
TCR0B = 0;         // Timmer off
OP #4187848
Lesenswert?
• ▲
▼
BirgerT schrieb:
> Hi,
> Deine counter Variable solltest Su als
> volatile uint32_t counter = 0; deklarieren
>
> und schau doch mal, was es heisst, wenn kein Prescaler Bit gesetzt
> ist..;-)
>
> TCR0B = Prescaler; // Timer starten
> TCR0B = 0;         // Timmer off

Ja das mit dem Timer disable war ein dummer kleiner Fehler.
Das mit dem volatile hab ich absolut noch nicht gewusst.

Vielen Dank!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.