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

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.