Forum: Compiler & IDEs isr timer 0 ov mit atmel studio 6


von doro (Gast)


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

von Stefan E. (sternst)


Lesenswert?

1
  while(1)
2
    {
3
    return(1);    //Endlosschleife für hauptprogramm
4
    }
???

von Karl H. (kbuchegg)


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

von Peter II (Gast)


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.

von doro (Gast)


Lesenswert?

scheiße es geht
danke für eure schnelle hilfe
lg doro

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.