AVR-Zählervariable wird zurückgesetzt

Gast #4262004
Lesenswert?
• ▲
▼
Hey Leute...

Ich bin dabei ein kleines Programm zu schreiben und folgendes Problem 
liegt vor:

Ich habe einen Timer für allgemeine Zählfunktionen eingerichtet.
Leider musste ich feststellen, dass das abfragen des Wertes nicht 
funktioniert.
Nach einigen hin und her fand ich heraus, dass die Variable "zaehler" 
wie von selbst auf 0 gesetzt wird, sobald der wert > 7 ist.
Das selbe passiert auch wenn ich den wert auf 50 setze und hochzählen 
lasse, dann zählt er bis 60 danach kommt die 0.

Der Code ist mittlerweile soweit reduziert, dass der Timer0 die Variable 
"zaehler" hochzählt und das ganze weiter unten nur mal abgefragt wird. 
Trotzdem das selbe Problem...

Kann mir jemand verraten worin der Fehler liegt?

Hier mein Code:
1
/*
2
 * LED_Badezimmer.cpp
3
 *
4
 * Created: 05.09.2015 15:49:07
5
 *  Author: Alex
6
 */ 
7

8
/*
9
  PD2 = Taster Interrupt0
10
  PB0 = Relais
11
  PB1 = Transistor PWM Timer/Counter
12
  1sek. Timer/Counter autom. abschaltung nach 2std ->120min ->7200sek.
13
*/
14

15

16
#include <avr/io.h>
17
#include <avr/interrupt.h>
18

19
void entprellung (void);
20
 
21
bool interrupt;
22
bool Taster_use;
23

24
volatile uint8_t zaehler;
25

26

27

28
 
29
 ISR (INT0_vect)
30
 {
31
  interrupt = 1;
32

33
 }
34
 
35
 
36

37

38

39
 void write16bitregister (uint16_t m_OCR1) //OCR1A max. 10bit ->1023!
40
 {
41
 
42
   unsigned char sreg;
43
   
44
   sreg = SREG;
45
   
46
   cli();
47
   
48
   OCR1AH = (m_OCR1>>8);
49
 
50
   OCR1AL = (m_OCR1 & 0x0FF);
51
   
52
   
53
   SREG = sreg;
54
  sei();
55
 
56
 }
57

58

59

60
ISR(TIMER0_OVF_vect)
61
{
62
  zaehler++;
63

64
}
65

66

67
int main(void)
68
{
69

70
  MCUCR |= (1<<ISC01)|(1<<ISC00);
71
  GICR |= (1<<INT0);
72
  GIFR |= (1<<INTF0);
73
  
74
  TCCR1A |= (1<<COM1A1)|(1<<WGM12)|(1<<WGM11)|(1<<WGM10);
75
  TCCR1B |= (1<<CS10);
76
  TIMSK |= (1<<OCIE1A)|(1<<TOIE1);
77
   
78
   DDRB |= (1<<PB0)|(1<<PB1);
79
   
80
   
81

82
   
83
  TCCR0 |= (1<<CS00);
84
  TIMSK |= (1<<TOIE0);
85

86
   
87
   
88
   
89
  uint16_t soll;
90
  uint16_t ist;
91
   
92
   
93
   sei();
94
    while(1)
95
    {
96

97
    entprellung();
98
    if (Taster_use == 1)
99
    {
100
/*      write16bitregister(20);*/
101
      soll = 1023;
102
      PORTB |= (1<<PB0);
103
    }
104
    else
105
    {
106
/*      write16bitregister(0);*/
107
      soll = 0;
108
      PORTB &= ~(1<<PB0);
109
    }
110
        
111
    if(zaehler == 100)
112
    {
113
      ist++;
114
      write16bitregister(20);  
115
      zaehler = 0;
116
    }
117
    }
118
}
119

120

121
void entprellung (void)
122
{
123
  
124
  bool entprell;
125
  uint16_t time1;
126
  
127
  
128
  if (interrupt == 1 && entprell == 0)
129
  {
130
    Taster_use ^= 1;
131
    entprell = 1;
132
     interrupt = 0;
133
   }
134
  if(interrupt == 1 && entprell == 1)
135
  {
136
    interrupt = 0;
137
  }
138
  if (entprell == 1)
139
  {
140
    time1++;
141
  } 
142
  if(time1 > 20000)
143
  {
144
    entprell = 0;
145
    time1 = 0;
146
  }
147
}

Programmieren tue ich einen ATmega8 mit AVR Studio 6.2.9200.0 - Service 
Pack 2.

Vielen Dank für eure Mühe!

MfG Alex
Gast #4262063
Lesenswert?
• ▲
▼
Tom schrieb:
> https://www.mikrocontroller.net/articles/AVR-GCC-T...

Danke für den Link, ich werde es mir nochmal genau durchlesen.

Tom schrieb:
> Und soll
>   bool entprell;
> vielleicht static sein? So wie jetzt macht das gar keinen Sinn.

ja stimmt, mein Fehler!



Habe ebend mal die ganzen Einstellungen für Timer1 also TCCR1A, TCCR1B 
und TIMSK auskommentiert, daraufhin hat Timer0 wie gewollt hochgezählt.

Sind die Timer in mancher Hinsicht nicht unabhängig?
Im Datasheet steht, dass die beiden sich den selben Prescaler teilen.
Andererseits steht dort aber auch, das dort trotzdem unterschiedliche 
Werte verwendet werden können.
Gast #4262146
Lesenswert?
• ▲
▼
Tom schrieb:
> Und soll  bool entprell;  vielleicht static sein?

Und sollte man nicht Variablen initialisieren bevor man sie benutzt?
(gilt für mehrere Variablen  hier)

... und könnte man sich vielleicht ein paar Leerzeilen sparen
um mehr Code auf dem Bildschirm auf einmal zu sehen?
Gast #4262486
Lesenswert?
• ▲
▼
Peter D. schrieb:
> Alex schrieb:
> Sind die Timer in mancher Hinsicht nicht unabhängig?
>
> Aber nicht, wenn Du für den anderen Timer Interrupts ohne Handler
> freigibst.

Hatte es gestern noch schnell im Simulator getestet, scheint zu 
funktionieren!

N. G. schrieb:
> interrupt sollte volatile sein, sonst wird der Vergleich mit ihm
> wegoptimiert.

Mitlesa schrieb:
> Tom schrieb:
> Und soll  bool entprell;  vielleicht static sein?
>
> Und sollte man nicht Variablen initialisieren bevor man sie benutzt?
> (gilt für mehrere Variablen  hier)
>
> ... und könnte man sich vielleicht ein paar Leerzeilen sparen
> um mehr Code auf dem Bildschirm auf einmal zu sehen?

Danke, ich bin noch sehr unerfahren und werde versuchen das genannte 
einzuhalten!

Vielen Dank für eure Hilfe!
MfG Alex

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.