ATMEGA8 SREG + I setzen

Gast #3264477
Lesenswert?

Guten Abend,

ich versuche verzweifelt an meinen ATMEGA 8 den Timerinterupt zum laufen 
zu bekommen.
Laut Datenblatt muss ich dazu auch im SREG das I-Bit auf 1 setzen.
Ich bekomm es leider nicht hin.
1
SREG |= (1<<I);

Das war leider etwas naiv. Kann mir jemand weiterhelfen bitte?
Gast #3264492
Lesenswert?

Oh ok, dann wird damit das I-Bit gesetzt? Dann hab ich das doch mit 
drin. Aber irgendwas stimmt nicht. Denn das Programm hängt sich 
zwischendurch irgendwie auf.
1
        wenn ich hier eine Variable verändere, dann erfolgt die Änderung
2
  TIMSK |= (1<<TOIE0);  
3
  TCCR0 = (1<<CS01);    
4
  sei();   
5
        wenn ich hier die Variable verändere, dann wird die Änderung nicht übernommen
Gast #3264508
Lesenswert?

1
#define F_CPU 1000000UL
2

3
#include <avr/io.h>   
4
#include <stdlib.h> 
5
#include <stdio.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8

9
#define Port_Zeile    PORTD
10
#define Z1        PD0
11
#define Z2        PD1
12
#define Z3        PD2
13
#define Z4        PD3
14
#define Z5        PD4
15
#define Z6        PD5
16
#define Z7        PD6
17

18
#define Port_Spalt    PORTC
19
#define S1        PC0
20
#define S2        PC1
21
#define S3        PC2
22
#define S4        PC3
23
#define S5        PC4
24

25

26
//globale Variable zur Auwertung bei Interrupts
27
volatile uint8_t isrFlag;
28
//globale Variable für Zeilendurchlauf (veränderbar in der ISR (volatile))
29
volatile uint8_t isrZeile;
30

31

32
//Array für die Matrix
33
char leds[7] =  {0b00011111,\
34
         0b00010101,\
35
         0b00000000,\
36
         0b00000111,\
37
         0b00011000,\
38
         0b00000111,\
39
         0b00000000};
40

41

42
ISR( TIMER0_OVF_vect )       // Overflow Interrupt Vector
43
{
44

45
  //Zeile ausschalten
46
    Port_Zeile |= (1<<isrZeile);
47

48
  //Inkrementieren der Zeilen
49
    isrZeile++;
50

51
  //Nach der 7.Zeile wieder auf 0 zurücksetzen
52
    if (isrZeile > 6)
53
      isrZeile =0;
54

55
  //Spalte festlegen
56
    Port_Spalt = leds[isrZeile];
57

58
  //Zeile einschalten
59
    Port_Zeile &= ~(1<<isrZeile);
60
}
61

62

63

64

65
int main (void) {  
66
  //Datenrichtungen PORTD/PORTC festlegen
67
  DDRD  = 0b01111111;       
68
  DDRC  = 0b00011111;    
69
  
70
    leds[0] =  0b00000001;
71
    leds[1] =  0b00000001;
72
    leds[2] =  0b00000001;
73
    leds[3] =  0b00000001;
74
    leds[4] =  0b00000001;
75
    leds[5] =  0b00000001;
76
    leds[6] =  0b00000001;
77

78
  //Timer konfigurieren
79
  TIMSK |= (1<<TOIE0);  // den Overflow Interrupt des Timers freigeben
80
      leds[0] =  0b00000010;
81
    leds[1] =  0b00000010;
82
    leds[2] =  0b00000010;
83
    leds[3] =  0b00000010;
84
    leds[4] =  0b00000010;
85
    leds[5] =  0b00000010;
86
    leds[6] =  0b00000010;
87

88
  TCCR0 = (1<<CS01);    // Vorteiler 8, jetzt zählt der Timer bereits
89

90
    leds[0] =  0b00000100;
91
    leds[1] =  0b00000100;
92
    leds[2] =  0b00000100;
93
    leds[3] =  0b00000100;
94
    leds[4] =  0b00000100;
95
    leds[5] =  0b00000100;
96
    leds[6] =  0b00000100;
97
  //Interrupts aktivieren
98
  sei();                
99

100
    leds[0] =  0b00001000;
101
    leds[1] =  0b00001000;
102
    leds[2] =  0b00001000;
103
    leds[3] =  0b00001000;
104
    leds[4] =  0b00001000;
105
    leds[5] =  0b00001000;
106
    leds[6] =  0b00001000;
107

108
  while(1){
109

110
  
111
    
112
  }
113
 
114
}

Nach sei(); wird die Änderung nicht übernommen.

ATMEGA8A-PU

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