Forum: Mikrocontroller und Digitale Elektronik AtMega128 Interrupt problem


von netwalker (Gast)


Lesenswert?

Ja.. Hallo zusammen!
Eigentlich bin ich nicht neu in der uC-Programmierung, hab allerdings 
schon laenger nichts mehr gemacht.. jetzt habe ich hier nen STK500 mit 
STK501 expansion und nem ATMega128 (interner osc auf 8MHZ+64ms) drauf.. 
die LEDs sind an Port B (funktionieren auch mit meinen anderen 
Programmen.), allerdings scheint der interrupt nicht auszuloesen.. ich 
habe hier jetzt ein 1:1 kopiertes Programm welches bei mir nicht 
laeuft.. Bin ich einfach zu daemlich den Fehler zu sehen? Eventuell kann 
mir ja einer von euch auf die Spruenge helfen!

Der Controller scheint sich die ganze zeit nur zu resetten: (durch 
trial&error 'debug' meldungen rausgefunden)
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
volatile unsigned int Counter;
6
7
ISR( TIMER0_OVF_vect )       // alle 0.000128 Sekunden / 8 Mhz
8
{  
9
Counter++;
10
if(Counter==10) {
11
     PORTB = 0x0F; //andere haelfte der LEDs leuchten lassen
12
  }
13
}
14
15
int main()
16
{
17
  Counter = 0;
18
19
  DDRB = 0xFF;
20
21
  TIMSK = ( 1 << TOIE0 );         // Overflow Interrupt einschalten
22
  TCCR0 = ( 1 << CS00 ) | ( 1 << CS02 ); // Teiler: 1024
23
  sei();                       // Interrupt generell zulassen
24
25
PORTB   = 0xF0; //Eine haelfte der LEDs leuchten lassen
26
  while( 1 ) {
27
      
28
    }
29
}

gibts evtl ein Fuse-bit das ich uebersehen haben koennte oder so?

Gruesse,

netw@lker

von Stefan E. (sternst)


Lesenswert?

> Der Controller scheint sich die ganze zeit nur zu resetten: (durch
> trial&error 'debug' meldungen rausgefunden)

Da solltest du mal genauer ausführen, wie du es rausgefunden hast (am 
besten incl. Code). Ich bin da nämlich skeptisch. Dass du rein optisch 
an den LEDs nicht viel siehst, liegt daran, dass der Code die eine 
Hälfte der LEDs nur kurz aufleuchten lässt, und danach nur noch die 
andere Hälfte.
Ändere den Code in der ISR mal in Folgendes:
1
Counter++;
2
if (Counter >= 30) {
3
    Counter = 0;
4
    PORTB ^= 0xFF;
5
}

So solltest du etwas mehr sehen.

PS: Da du Counter nur in der ISR verwendest, ist das volatile 
überflüssig.

von netwalker (Gast)


Lesenswert?

Nun, das mit dem resetten habe ich herausgefunden indem ich vor
1
PORTB   = 0xF0; //Eine haelfte der LEDs leuchten lassen
2
  while( 1 ) {

etwas wie
1
PORTB = 0xF0;
2
PORTB   = 0xFF; //Eine haelfte der LEDs leuchten lassen
3
  while( 1 ) {
gesetzt habe.. interessanter weise wurde "PORTB = 0xF0;" immer wieder 
ausgefuehrt (und nein, es steht nicht in der ISR).

Und ich verstehe nicht: Eigentlich sollte mein zuerst geposteter Code 
die LEDs doch einfach nur einschalten, ausgeschaltet werden sie ja 
nirgendwo anders... ergo sollten sie nachdem ersten Interrupt die ganze 
Zeit leuchten, oder?

Gruss und danke

von holger (Gast)


Lesenswert?

>gibts evtl ein Fuse-bit das ich uebersehen haben koennte oder so?

Den Watchdog abgeschaltet ?

von netwalker (Gast)


Lesenswert?

Okay, fehler ist gefunden! M103C... der kompatibilitaetsmodus war das 
Problem... Danke nochmal fuer eure hilfe!

von Lena (Gast)


Lesenswert?

Habe gerade das selbe problem, jedes mal wenn ich mit sei() die 
interrupts enable, resetet mir der atmega.

netwalker, wie meinst ist der kompatibilitätsmodus???? begreif das 
nicht...

von Johannes M. (johnny-m)


Lesenswert?

Lena wrote:
> netwalker, wie meinst ist der kompatibilitätsmodus???? begreif das
> nicht...
Was genau begreifst Du nicht? Was es mit dem Kompatibilitätsmodus auf 
sich hat?

Der Mega128 und seine direkten Verwandten haben ein Fusebit, das im 
Auslieferungszustand gesetzt ist und das dafür sorgt, dass der 
betreffende AVR sich so verhält wie sein Vorgänger Mega103. Das führt 
dazu, dass ein ganzer Haufen Funktionen, die der Mega128 normalerweise 
hat, nicht zur Verfügung stehen. Dieses Fusebit muss man erst 
"entprogrammieren", bevor man alle Funktionen des Mega128 nutzen kann.

von Lena (Gast)


Lesenswert?

muss ich diese auch im simulater setzen? finde nix...

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.