Forum: Mikrocontroller und Digitale Elektronik Timer-Problem Mega8


von Udo (Gast)


Lesenswert?

Moin,

ich finde den Fehler einfach nicht :-(

Gegeben ist Timer1 eines AVR Mega8, der Rechteckimpulse am Eingang T1 
zählen soll. Alle Variablen sind als volatile deklariert. Software: 
avr-gcc

void timer1_Init(void)
    {
    TCCR1B = 0x00;
    TIMSK |= (1<<TOIE1);
    TCNT1L = 0x00;
    TCNT1H = 0x00;
    TCCR1A = 0x00;
    TCCR1B |= ( (1<<CS12) | (1<<CS11) | (1<<CS10) );
    }
ISR(TIMER1_OVF_vect)
    {
    if (Ueberlauf < 255)
        Ueberlauf ++;
    }

Die Zeitdauer fürs Zählen wird in Timer0 gesteuert; funktioniert 100%ig:

ISR(TIMER0_OVF_vect)
    {
    TCNT0 = TIMER0_WERT;  // Wert für 25ms

    // Zeit zählen
    if (Zeit > 0)
        Zeit --;
    else
        TCCR1B = 0x00; // Timer 1 stoppen
...

Im Hauptprogramm wird ausgewertet und alles wieder auf Start gesetzt:

if (0 == Zeit)
  {
  if (Ueberlauf > 0)
      Wert = 65535;
  else
      Wert = TCNT1;
...
  Wert = 0;
  Ueberlauf = 0;
  Zeit = HG_ZEIT;  //entspricht  1s
  timer1_Init();
...

Das mache ich kontinuierlich im Hauptprogramm und vergleiche Wert mit 
einer Variablen Soll, bei der nach Betätigung einer Taste das Gleiche in 
Grün abläuft. Soll enthält also die Sollfrequenz (in Takten) und Wert 
die Istfrequenz. Der Vergleich
if (Wert <= Soll)
      Status = HG_OK;
  else
      Status = HG_N_OK;

liefert aber als Ergebnis immer, auch bei deutlich höheren Frequenzen 
als in Soll HG_OK. Die Signale liegen natürlich an T1 korrekt an.

Und ich weiss einfach nicht, warum. Hilfe...


Danke, UdoZ

von Magnus Müller (Gast)


Lesenswert?

Poste doch mal das komplette Programm... mir persönlich ist es zu 
mühsam, einzelne Codeschnipsel auszuwerten...

von Johannes M. (johnny-m)


Lesenswert?

>    TCNT1L = 0x00;
>    TCNT1H = 0x00;
Falsche Reihenfolge. Beim Schreibzugriff immer erst das High-Byte und 
dann das Low-Byte. Am besten gleich
1
    TCNT1 = 0;
schreiben.

von Udo (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

die TCNT1-Sache ist geändert. Danke.

Der zusammengefasste Code ist angehängt. Definitiv nicht benötigter Kram 
wurde beseitigt; ca. 6 kB unnötiger Kram hält auch vom Lesen ab ;-)

UdoZ

von Udo (Gast)


Lesenswert?

Moin,

die 2 vermeintlich unterschiedlichen Speicherstellen im EEPROM sind 
identisch.

UdoZ

von Magnus Müller (Gast)


Lesenswert?

> Der zusammengefasste Code ist angehängt. Definitiv nicht benötigter Kram
> wurde beseitigt; ca. 6 kB unnötiger Kram hält auch vom Lesen ab ;-)


Unvollständiger Kram hält auch vom lesen ab ;)

- Da fehlen immer noch Programmteile...
- Variablen werden mit Konstanten gefüttert, deren #define in dem
  geposteten Code nicht zu sehen sind...
- usw... usw...

von Udo Z. (Firma: keine) (udoz)


Lesenswert?

Moin,

Magnus Müller wrote:
>> Der zusammengefasste Code ist angehängt. Definitiv nicht benötigter Kram
>> wurde beseitigt; ca. 6 kB unnötiger Kram hält auch vom Lesen ab ;-)
>
>
> Unvollständiger Kram hält auch vom lesen ab ;)

> - Da fehlen immer noch Programmteile...

Bezüglich des Problems ist der Code komplett. Alle anderen Teile sind 
irrelevant, produzieren keine Stack- oder Timing-/Timerprobleme etc..
Der 'Minimalcode' wurde auch schon mit gleichem, wahrscheinlich banalen 
Fehler bzw. Ergebnis 'live' getestet.


> - Variablen werden mit Konstanten gefüttert, deren #define in dem
>   geposteten Code nicht zu sehen sind...

Die Konstanten stehen in <avr/io.h>, sind im Anhang kommentiert oder in 
dem Fall, in dem nichts kommentiert wurde, selbsterklärend (HG_OK, 
HG_N_OK).
Aber, wenn es hilft:
#define HG_OK     1
#define HG_N_OK   0

;-)


> - usw... usw...

Trotzdem danke für Deine Bemühungen.


UdoZ

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.