Information aus Overflow-Routine nutzen ATMEGA16

Gast #2501225
Lesenswert?

Hi,
ich hab mal ne ganz blöde Anfängerfrage. Ich arbeite mit einem ATMEGA16 
und programmiere in C.
Dummerweise ist die Frage so simpel dass ich dazu nirgends hilfe im net 
finde, ich muss irgendwo einen groben Verständissfehler haben.
Ich würde einfach gern bei jedem Overflow eine Variable hochzählen 
lassen und mit dieser dann im main() programm weiter arbeiten. Aber ich 
bekomme diese blöde variable nicht aus der overflow-routine raus.

ich hänge mal mein Programm an. Ich hab es extra so gekürzt dass nur das 
eigentliche Problem klar wird.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
unsigned int overflow;
5
void interrupt (void);
6

7
ISR (TIMER0_OVF_vect)
8
{ 
9
overflow++;
10
PORTD ^= (1<< PD0);
11
}
12

13

14

15
void interrupt (void)
16
{
17
  TIMSK|= (1<< TOIE0);          
18
  sei();  
19
  TCCR0 |=  (1<<CS00) | (1<<CS02); 
20
}
21

22
int main ()
23
{
24
  DDRA = 0xFF;                          
25
  DDRD = 0xFF;
26
  PORTA=overflow;
27
  while(1);
28
  return 0;
29
}


Ich hatte sonst immer die Interrupteinstellung des Timers im main() 
Programm und wollte mal versuche das in extra Funktionen zu packen, 
damit mein main() nicht so groß wird- leider geht auch das nicht.
Wie gesagt, ich hab hier einen groben Verstänishänger irgendwo.

PS an den Ports A und D hängen jeweils LED's um zu zeigen wann ein 
Overflow eintritt und ob die Variable overflow bei jedem inkrementiert 
wird.

Danke schonmal
Gast #2501245
Lesenswert?

Vorsicht: Der µP braucht mehrere Zyklen um ein int zu vernudeln, wenn 
dazwischen ein Interrupt reinfunkt gibt es unter Umständen Datensalat. 
Abhilfe schafft das atomare Lesen der Variable, s. FAQ oder Suche.
Gast #2501264
Lesenswert?

hmm komisch, das mit dem volatile hatte ich eigentlich schonmal 
versucht.
naja^^ ich bedanke mich rechtherzlich. Alle unklarheiten sind vorerst 
beseitigt.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
volatile unsigned int overflow;
5
void interrupt (void);
6

7
ISR (TIMER0_OVF_vect)
8
{ 
9
overflow++;
10
PORTD ^= (1<< PD0);
11
}
12

13

14

15
void interrupt (void)
16
{
17
  TIMSK|= (1<< TOIE0);          
18
  sei();  
19
  TCCR0 |=  (1<<CS00) | (1<<CS02); 
20
}
21
int main ()
22
{
23
  DDRA = 0xFF;                          
24
  DDRD = 0xFF;
25
  while(1)
26
  {
27
  interrupt();
28
  PORTA=overflow;
29
  };
30
  return 0;
31
}
Gast #2501292
Lesenswert?

So sollte es funkt

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned int overflow;
void interrupt (void);

ISR (TIMER0_OVF_vect)
{
overflow++;
PORTA=overflow;
PORTD ^= (1<< PD0);
}



void interrupt (void)
{
  TIMSK|= (1<< TOIE0);
  sei();
  TCCR0 |=  (1<<CS00) | (1<<CS02);
}

int main ()
{
  DDRA = 0xFF;
  DDRD = 0xFF;
  interrupt();
  while(1);
  return 0;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren