www.mikrocontroller.net

Forum: Compiler & IDEs Timer1 Problem mit ATMEGA1280


Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

versuche seit Stunden Timer1 im Compare-Betrieb laufen zu lassen, sodass 
ein Interrupt alle 1ms ausgelöst wird.
Mein Programm unterbricht beim Initialisieren des Timers schon alles und 
führt nichts weiter aus!
In die Interrupt-Routine zählt ich bis zu einer Sekunde hoch und gebe 
einen STring aus. Das ist später nicht die Aufgabe der Routine, sondern 
gerade nur zum testen.
Quarz: 8000000

Was mache ich falsch?

Mein Code:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>

#include "main.h"

uint8_t mssec = 0;
  
int main (void) 
{
  
  init_uart0( (u16)(XTAL / BAUD0 / 16 - 0.5) );      

  TIMSK1 |= (1<<OCIE1A);
  
  OCR1A = 124;
  TCNT1 = 0;                        
  
  TCCR1A |= (1 << WGM12);
  TCCR1B |= (1<<CS11) | (1<<CS10);
  sei();  
  while(1){}
}


ISR(TIMER1_COMPA_vect)
{
  mssec++;
  if(mssec == 1000)
  {
    mssec = 0;
    uputs0("1 sec vergangen");
  }
}

Vielen Dank für eure Hilfe!

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mein Programm unterbricht beim Initialisieren des Timers schon alles und
> führt nichts weiter aus!

Bug in (Endlosschleife?) oder beim Rücksprung (Stack falsch 
initialisiert? falscher AVR im Projekt eingestellt?) aus der nicht 
gezeigten Funktion init_uart0()?

Hardwareprobleme beim RS232 Transfer AVR <-> PC? Funktioniert UART im 
Hello World Programm?

> ISR(TIMER1_COMPA_vect)
>     uputs0("1 sec vergangen");

Angenommen die Interrupts kommen alle ms. Wie viele Interrupts verlierst 
du durch uputs0() bei Baudrate BAUD0? Funktioniert das Toggeln einer LED 
alle Sekunde in der ISR?

>  TCCR1A |= (1 << WGM12);
>  TCCR1B |= (1<<CS11) | (1<<CS10);

CTC1 Modus OK. Prescaler 64. 8000000/64/(124+1) = 1ms OK.
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die uart Initialisierung funktioniert mit 9600 baud. Ohne die 
Initialisierung des timers läuft das Programm auch durch, wenn ich z.b. 
über die uart einen String ausgeben...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen UART-Code verwendest du?

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Peter danegger. interrupt gesteuert.

Autor: Fabian G. (kjion) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
uint8_t mssec = 0;
...  
if(mssec == 1000)

das kann so nicht funktionieren und dein Compiler sollte dir auch eine 
entsprechende Warnung ausgeben. uint8_t kann maximal bis 255 zählen.

Besser:
ISR(TIMER1_COMPA_vect)
{
  static uint16_t mssec = 0;
  
  mssec++;
  if(mssec == 1000)
  {
    mssec = 0;
    uputs0("1 sec vergangen");
  }
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bene Jan schrieb:
> Von Peter danegger. interrupt gesteuert.

Und du meinst, es wäre dann eine gute Idee, die Funktion uputs0 an einer 
Stelle aufzurufen, wo Interrupts gerade abgeschaltet sind? Wenn der 
Puffer nicht mehr den kompletten String aufnehmen kann, hast du einen 
schönen Dead-Lock.

Autor: Bene Jan (terfagter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.
Es lag an zwei Sachen:
1. habe ich mich im Datenblatt verguckt und WGM12 in TCCR1A benutzt 
anstall in TCCR1B
2. In der Interrupt-Schleife uputs0 verwendet, was bei mir Interrupt 
gesteuert ist. Da gab es dann einen Dead-Lock.
Jetzt funktionierts.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.