ATMEGA8 SREG + I setzen

Gast #3264477
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?
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 ;-)
Gast
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
>        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.
Gast
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
Gast
>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,\

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.