Forum: Mikrocontroller und Digitale Elektronik Timer0 Lampe blinken


von Jan M. (pietus3)


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

: Bearbeitet durch User
von Bitflüsterer (Gast)


Lesenswert?

Ich hoffe Du hälst mich nicht für aufdringlich, aber willst Du uns das 
Problem nennen, oder dürfen wir uns ein beliebiges aussuchen?

von ich (Gast)


Lesenswert?

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

von ich (Gast)


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.

von Jan M. (pietus3)


Lesenswert?

Die main-Funktion ist Loop und Setup unter der Arduino-IDE main.

Warum wird TimerCount != 100000?

: Bearbeitet durch User
von ich (Gast)


Lesenswert?

Jan Meyer schrieb:
> Die main-Funktion ist Loop und Setup unter der Arduino-IDE main.
>

Okay, mit Arduino kenne ich mich nicht aus, also halte ich da die Klappe 
:-)

> Warum wird TimerCount != 100000?

Schau dir mal den Variablen-Typ von TimerCount an.

von Jan M. (pietus3)


Lesenswert?

Oh das ist bitter.

von Bitflüsterer (Gast)


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.

von Bitflüsterer (Gast)


Lesenswert?

Ups. Das int ist mir durchgeschlüpft.

von ich (Gast)


Lesenswert?

Jan Meyer schrieb:
> Oh das ist bitter.

Gehts denn jetzt?

von Jan M. (pietus3)


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

von ich (Gast)


Lesenswert?

Bitte :-)

von LostInMusic (Gast)


Lesenswert?

1
        if (LampeAN){
2
          LampeAN = false;    
3
          }
4
        else{
5
          LampeAN= true;
6
        }

Wieso nicht einfach

    LampeAN = !LampeAN

?

von EGS_TI (Gast)


Lesenswert?

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.

von EGS_TI (Gast)


Lesenswert?

LostInMusic schrieb:
> Wieso nicht einfach
>
>     LampeAN = !LampeAN
>
> ?

Wieso fragst du noch? Den Rest von ihm musst du doch auch schon gelesen 
haben.

von ich (Gast)


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.

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.