AtMega128 Interrupt problem

Gast #876798
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
#876820
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.
Gast #877015
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
#894707
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.

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