Forum: Mikrocontroller und Digitale Elektronik Information aus Overflow-Routine nutzen ATMEGA16


von Matti (Gast)


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
von ge-nka (Gast)


Lesenswert?

int main ()
{
 DDRA = 0xFF ;
DDRD = 0xFF ;

while(1){
PORTA=overflow;
} ;

return 0 ;
}
von Matti (Gast)


Lesenswert?

ahh^^
verdammt
Dankesehr.--> das probier ich gleichmal

Gruß Matti
von Gemüsebeet (Gast)


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.
von Peter D. (peda)


Lesenswert?

Der AVR-GCC ist stur.
Alle Variablen, die ein Interrupt ändern kann, müssen im Main volatile 
zugegriffen werden.
Und alle Variablen >8Bit müssen atomar zugegriffen werden.


Peter
von spess53 (Gast)


Lesenswert?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Matti schrieb:

> void interrupt (void)

Und wo wird diese Funktion aufgerufen? Momentan wird die deklariert und 
implementiert, aber durch Magie wie bei main oder einer ISR wird 
interrupt nicht aufgreufen.
von Matti (Gast)


Lesenswert?

hmm,
ne hat sich nix geändert
:(
von Matti (Gast)


Lesenswert?

ah- danke schonmal für den einen tipp, naklar hab ich völlig vergessen 
interrupt() aufzurufen.
danke
von spess53 (Gast)


Lesenswert?

Hi

Als notorischer Assemblerprogrammierer würde ich sagen:

volatile unsigned int overflow;

MfG Spess
von Matti (Gast)


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
}
von H. P. Bolliger (Gast)


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;
}
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.