isr timer 0 ov mit atmel studio 6

Gast #3253157
Lesenswert?
• ▲
▼
hi ihr lieben,
ich kämpfe gerade mir dem interrupt vom timer 0 er soll als overflow 
laufen und nur diesen zählen (als Timeout zähler). habe das bisher in 
assambler gemacht und wollte nun mal in c probieren mein code sieht wie 
folgt aus:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
// Globale Variablen
5
int GV_NMRA_OV = 0;
6

7
void init_port(void)
8
{
9
  DDRA = 0x80;    // Port A bit7= Ausgang
10
  DDRB = 0xF3;    // Port B bit7-4 + bit 0-1= Ausgang
11
  DDRC = 0xFF;      // Port C Ausgang
12
  DDRD = 0xF3;          // Port D bit7-4 + bit 0-1= Ausgang
13
  PORTA = 0x08;     // Port A, 3Pull up
14
  PORTD = 0x80;     // Port D, 7Pull up
15
}
16

17
void init_jtag(void)
18
{
19
  MCUCR = (1<<JTD);  // Jtag deaktiviren
20
  MCUCR = (1<<JTD);  // deaktivieren wiederholen
21
}
22
 
23
int main(void)
24
{  
25
/*=== Initialisierung============================================*/
26
  cli();              // Interrupt sperren
27
  init_port();            // init Ports
28
  TCCR0B = (1<<CS01),(1<<CS00);  // timer0 register initialisieren
29
  TIMSK0 = (1<<TOIE0);    // interrupt timer 0 freischalten
30
  sei();        // Interrupte freigeben
31
/*=== Hauptprogramm==============================================*/
32
  while(1)
33
    {
34
    return(1);    //Endlosschleife für hauptprogramm
35
    }
36
  return(0);
37
}
38

39
ISR(TIMER0_OVF_vect)
40
{  
41
   uint8_t tmp_sreg;         //  Speicher fuer das Statusregister
42
   tmp_sreg = SREG;         // Statusregister  sichern
43
   PORTC |= (1<<PC7);            // Testpin an ausgeben
44
   GV_NMRA_OV++;           // Erhöhe Zeitwert (Overflow) um 1
45
   SREG = tmp_sreg;        // Status-Register wieder herstellen
46
}
ich arbeite mit dem AT Mega164 und atmel studio 6.1 und einem 16MHz 
Quarz
vielen dank für eure hilfe

doro
#3253165
Lesenswert?
• ▲
▼
1
  while(1)
2
    {
3
    return(1);    //Endlosschleife für hauptprogramm
4
    }

den return entfernst du da gleich mal aus der Schleife.

return bedeutet "die aktuell gerade ausgeführte Funktion verlassen". 
Welches ist denn die aktuell ausgeführte Funktion? Das ist main(). Und 
main() möchtest du ganz sicher nicht verlassen. Denn dann gehts zurück 
zum Runtime System und das friert mehr oder weniger in so einem Fall den 
µC dann ein. Inklusive Deaktivierung aller Interrupts.

>
1
> ISR(TIMER0_OVF_vect)
2
> {  
3
>    uint8_t tmp_sreg;         //  Speicher fuer das Statusregister
4
>    tmp_sreg = SREG;         // Statusregister  sichern
5
>    PORTC |= (1<<PC7);            // Testpin an ausgeben
6
>    GV_NMRA_OV++;           // Erhöhe Zeitwert (Overflow) um 1
7
>    SREG = tmp_sreg;        // Status-Register wieder herstellen
8
> }
9
>

um das SREG brauchst du dich in C nicht kümmern. Das geht dich nichts 
an, bzw. das macht der Compiler korrekt für dich. Ganz im Gegenteil, 
wenn du dich bei solchen Dingen, die unter Oberhoheit des Compilers 
stehen einmischt, dann bringt dir das im günstigsten Fall nichts, im 
schlechtesten Fall allerdings baust du damit schwerwiegende Fehler ein. 
Also: Finger weg - lass dem Compiler was des Compilers ist.
1
ISR(TIMER0_OVF_vect)
2
{  
3
   PORTC |= (1<<PC7);            // Testpin an ausgeben
4
   GV_NMRA_OV++;           // Erhöhe Zeitwert (Overflow) um 1
5
}

Du verwendest GV_NMRA_0V zwar noch nirgendwo, aber in dem Fall wird es 
dann volatile sein müssen
FAQ: Was hat es mit volatile auf sich
Gast #3253166
Lesenswert?
• ▲
▼
> uint8_t tmp_sreg;         //  Speicher fuer das Statusregister
> tmp_sreg = SREG;         // Statusregister  sichern
> PORTC |= (1<<PC7);            // Testpin an ausgeben
> GV_NMRA_OV++;           // Erhöhe Zeitwert (Overflow) um 1
>  SREG = tmp_sreg;

das kannst du dir alles sparen, das macht der compiler für dich.

also einfach:

PORTC |= (1<<PC7);            // Testpin an ausgeben
GV_NMRA_OV++;           // Erhöhe Zeitwert (Overflow) um 1

schreiben.

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.