Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 SREG + I setzen


von Stefan (Gast)


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?

von holger (Gast)


Lesenswert?

>Ich bekomm es leider nicht hin.
>
>SREG |= (1<<I);
>
>Das war leider etwas naiv. Kann mir jemand weiterhelfen bitte?

sei();

von J. T. (chaoskind)


Lesenswert?

Das I-Flag setzt du mit "sei", übrigens werden einige Flags auch 
gesetzt, indem man eine null schreibt... Da muss man immer das 
Datenblatt lesen, aber da du Ausschnitte davon zitiert hast, scheinst du 
das ja fleißig zu nutzen ;-)

von Stefan (Gast)


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

von holger (Gast)


Lesenswert?

>        wenn ich hier eine Variable verändere, dann erfolgt die Änderung

Was soll der Quatsch? Zeig dein Programm so wie es ist.
Prosa kannst du dir an die Wand nageln.

von Stefan (Gast)


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

von holger (Gast)


Lesenswert?

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

Wozu auch. Die Variablen werden nicht mehr verwendet und
vom Compiler wegoptimiert.

Versuch mal:

volatile char leds[7] =  {0b00011111,\

von Stefan (Gast)


Lesenswert?

Ach mist! Den Fehler hatte ich vor kurzen schonmal. Danke dir. 
Funktioniert natürlich.

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.