Forum: Mikrocontroller und Digitale Elektronik ATmega 1284P Timer0 Frage


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

nach folgendem Code (M1284P) habe ich erwartet, auf dem Logicanalyzer 
ein Signal von 25 ms zu sehen. Mein Ziel war es eigentlich einen 
Interrupt alle 25 ms zu bekommen, aber der Timer springt nicht in die 
Interrupt-Routine. Beim M16 hat es bei mir immer geklappt, was habe ich 
Übersehen im Datenblatt?
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#include <avr/interrupt.h>
5
6
int main(void)
7
  {
8
  DDRB = 255;
9
  PORTB = 255;
10
11
  TIMSK0 = (1<<OCIE0A);  // Interrupt Timer 0 einschalten Match A
12
  TCCR0A = (1<<WGM01);  // Mode 2 = CTC
13
  TCCR0B = (1<<CS02);  // Prescaler 256, 8Mhz / 256 = 31250
14
  OCR0A = 124;    // 31250 / 125 = 250 
15
  
16
  sei();
17
  
18
  while(1)
19
    {
20
    }
21
22
  }
23
  
24
ISR(TIMER0_COMPA_vect)  // Overflow Interrupt Vector
25
  {
26
  PORTB = PORTB ^ 255;  // Port B toggeln
27
  }
Vielen Dank für einen Tip. Mfg Sven

: Bearbeitet durch User
von Bastler (Gast)


Lesenswert?

Nach Rechnung im Kommentar ergeben sich 250Hz ISR-Rate.
 also 4ms an, 4ms aus.

von Sven (Gast)


Lesenswert?

Ok, stimmt es sind 4 ms. Mein Problem ist das die Interrupt-Routine 
überhaupt nicht angesprungen wird. Mit dem M1284P arbteite ich erst 
einige Tage, mit den ATMega16 / 32 habe ich seit Jahren kein Problem 
damit. Entweder habe ich im Datenblatt etwas überlesen oder machen einen 
Denkfehler.

von spess53 (Gast)


Lesenswert?

Hi

>Entweder habe ich im Datenblatt etwas überlesen oder machen einen
>Denkfehler.

Sicher, das du das richtige File flashst?

MfG Spess

von holger (Gast)


Lesenswert?

>Entweder habe ich im Datenblatt etwas überlesen oder machen einen
>Denkfehler.

Das Programm wurde auch für einen ATMega1284p compiliert?

von Karl H. (kbuchegg)


Lesenswert?

Wenn der Name der ISR korrekt ist, dann sehe ich nichts im Code was so 
gesehen falsch sein könnte. Die diversen Bitflags hab ich mit dem 
Datenblatt kontrolliert. Die sind alle richtig.

Vielleicht im AVR-Studio den falschen µC eingestellt?

: Bearbeitet durch User
von Sven (Gast)


Lesenswert?

Ich arbeite mit WinAvr. Im "Makefile" ist der uC richtig konfiguriert, 
die F_CPU ebenfalls - der Compiler meldet auch keine "Warnings" oder 
"Errors". Im Datenblatt (Seite 61) gibt es auch den "TIMER0_COMPA" 
Vector.

von holger (Gast)


Lesenswert?

>Ich arbeite mit WinAvr. Im "Makefile" ist der uC richtig konfiguriert,
>die F_CPU ebenfalls - der Compiler meldet auch keine "Warnings" oder
>"Errors". Im Datenblatt (Seite 61) gibt es auch den "TIMER0_COMPA"
>Vector.

Alles schön und gut, aber:
Beim flashen hast du auch die richtige HEX Datei ausgewählt?

von Sven (Gast)


Lesenswert?

@ holger: Ich hoffe doch schon, im Makefile steht bei mir wie immer: # 
Output format. (can be srec, ihex, binary) FORMAT = ihex. In einem 
komplexeren Programm benutzte ich beide UART's des ATmegas1284P und das 
läuft alles ohne Probleme. Was mit den Timern leider nicht der Fall ist, 
das bekomme ich auf diesem uC nicht hin.

von c-hater (Gast)


Lesenswert?

Sven schrieb:

> In einem
> komplexeren Programm benutzte ich beide UART's des ATmegas1284P und das
> läuft alles ohne Probleme. Was mit den Timern leider nicht der Fall ist,
> das bekomme ich auf diesem uC nicht hin.

Ich hatte mal ein ähnliches Problem mit dem 1284P @20MHz. Da wollte 
Timer3 um's verrecken nicht laufen, ansonsten schien sich aber alles 
normal zu verhalten. Testweiser Betrieb mit einem 16MHz-Quarz brachte 
auch den Timer3 zum laufen. Damit war klar, daß es irgendwie mit dem 
Takt zusammenhängen mußte.

Nähere Untersuchung zeigte: die Ursache war instabiler Takt (Amplitude 
an XTAL1 lag mit dem 20MHz-Quarz bei nur ca. 1Vpp). Umfusen auf 
"FullSwing"-Oszillator löste das Problem. Die Amplitude lag dann bei 
4Vpp und der Timer3 lief plötzlich auch bei 20MHz wie ein Bienchen.

Eigentliche Ursache waren aber falsch gewählte Bürde-Kapazitäten für den 
Quarz. 12p statt 22p und es funktionierte auch mit dem stromsparenden 
Oszillator, die Amplitude lag dann bei gut 2,5Vpp.

von spess53 (Gast)


Lesenswert?

Hi

>Mein Problem ist das die Interrupt-Routine
>überhaupt nicht angesprungen wird.

Woran erkennst du das?

MfG Spess

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.