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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.