Timer0 Lampe blinken

OP #3576589
Lesenswert?

Hallo,

Ich habe das Programm schon für den 16 Bit-Timer geschrieben und befinde 
mich wieder einmal in einer Sackgasse.

Nun möchte ich den Timer 0 benutzen. Ich hab mir gedacht ich müsste nur 
die Register ändern und das wäre es. Aber irgendwo hab ich einen 
Denkfehler anscheinend gemacht. Ich programmier unter der Arduino IDE 
und mein µC hat einen atMega 328.
1
#define F_CPU 16000000UL
2
 
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6

7
volatile boolean LampeAN;
8
volatile int TimerCount;
9

10
ISR( TIMER0_COMPA_vect)                // Interruptbehandlungsroutine
11
{
12
  TimerCount++;
13
  if(TimerCount == 100000)
14
  {
15
     if (LampeAN){
16
        LampeAN = false;    
17
        }
18
    else{
19
        LampeAN= true;
20
        }
21
    TimerCount = 0;
22
  }     
23
}
24

25
void setup() {
26
  DDRB = 0b11111111;
27
  PORTB |= (1<<PORTB1);           // Pullup für PB0 und PB1
28
 
29
  TCCR0A = (1<<WGM01);      // CTC-Mode;
30
  TCCR0B = (1<<CS00);      // Prescaler 1
31
  TIMSK0  = (1<<OCIE0A);                 // Timer-Compare Interrupt an
32
  LampeAN = true;
33
 
34
  OCR0A = 160;                         // Neutralposition ((2500-2312)*0.008ms)=1,5ms)
35
  sei();                                // Interrupts global an
36

37
}
38

39
void loop() {
40
  if (LampeAN) {       // Impuls-Zeit verlängern
41
      PORTB |= (1<<PORTB0); 
42
    } 
43
    else{       // Impuls-Zeit verkürzen
44
      PORTB &= ~(1<<PORTB0); 
45
    } 
46
}

Problem: Kein blinken bei 1 sec.

Vielen Dank für eure Bemühungen

Jan Peter Meyer
Gast #3576604
Lesenswert?

ich schrieb:
> Beim ersten groben Überfliegen würde ich schon mal diese Zeile
>> if(TimerCount == 100000)
> als Problem sehen. Der Vergleich wird niemals WAHR.

Da sehe ich ja noch viel mehr.
- Kein main()
- setup() wird niemals aufgerufen
- loop() wird niemals aufgerufen

Kurz gesagt, das ist kein vollständiges C-Programm.
Gast #3576622
Lesenswert?

>Warum wird TimerCount != 100000?

Das geschieht an mehreren Stellen.

1. Bei der Definition der globalen Variablen wird mit 0 initialisiert.
2. Bei dem increment werden sich 99999 mal Werte ungleich 100000 
ergeben.
3. Nach dem Rücksetzen auf 0 ist die Variable notwendigerweise ungleich 
100000.
OP #3576637
Lesenswert?

1
ISR( TIMER0_COMPA_vect)                // Interruptbehandlungsroutine
2
{
3
  TimerCount++;
4
  if(TimerCount == 10000)
5
  {
6
    TimerCount2++;
7
     if(TimerCount2 == 10){ 
8
        if (LampeAN){
9
          LampeAN = false;    
10
          }
11
        else{
12
          LampeAN= true;
13
        }
14
      TimerCount2 = 0;
15
     }
16
     TimerCount = 0;
17
    
18
  }     
19
}

Hab das jetzt so abgeändert und nun läuft es.

Danke
Gast #3576674
Lesenswert?

EGS_TI schrieb:
> Jan Meyer schrieb:
>> Ich hab mir gedacht ich müsste nur
>> die Register ändern und das wäre es.
>
> Soso, gedacht....
> Hier liegt vermutlich der Fehler. Wenn deine Annahme also nicht simmt,
> solltest du deine Vermutungen anhand des Datenblatts überprüfen.

Du hast vermutlich die Posts überhaupt nicht gelesen, oder?
Was hat ein ungeeigneter Variablentyp mit dem Lesen eines Datenblattes 
zu tun?

Der Programmierstil ist wieder eine ganz andere Sache, daß man 
einfachere Lösungen findet usw. Aber nicht jeder ist als Meister vom 
Himmel gefallen.

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