Forum: Mikrocontroller und Digitale Elektronik Hilfe benötigt mit Timer/Interrupt auf


von svens (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich brauche ein bisschen Hilfe mit Timern. Habe ein kleines Prog in C 
geschrieben, dass eine LED immer nach ca. 1 Sekunde an-/ausschaltet. 
Leider geschieht rein gar nichts (Kompiliert problemlos durch, nur die 
LEDs bleiben im Anfangszustand).

Die LEDs hängen an PortB Pin 4,5,6,7. Sie funktionieren tadellos, wenn 
ich sie direkt ansteuere gehts. Deswegen gehe ich davon aus, dass ich 
beim initialisieren des Timers einen Fehler gemacht habe.
1
  TIMSK = 0b1 ;// _BV( 0 );
2
  TCCR0 = 0b1 ;//_BV( 0 );
3
  sei();

(Die auskommentierten Werte stammen aus nem Tutorial, nach ner Recherche 
im inet, hielt ich aber den Wert 1 in beiden Fällen für sinnvoller. Es 
klappt mit beiden nicht.)

Das ganze kommt dann auf einen ATmega32.

Sieht jemand gerade meinen Fehler? Habe ich was mit der globalen counter 
Variable falsch gemacht?

Danke schon jetzt.

von Marcel (Gast)


Lesenswert?

Hallo

sind die LED's gegen GND oder VCC?

von svens (Gast)


Lesenswert?

Die LEDs hängen zwischen VCC und PB4 bis PB7. Sollte ich anstatt DDRB 
PORTB verwenden?

von Marcel (Gast)


Lesenswert?

In diesem fall stimmt das schon

von Joan P. (joan)


Lesenswert?

svens wrote:
> Ich brauche ein bisschen Hilfe mit Timern.

Ein bisschen?! ;-)

> Habe ein kleines Prog in C
> geschrieben, dass eine LED immer nach ca. 1 Sekunde an-/ausschaltet.
> Leider geschieht rein gar nichts (Kompiliert problemlos durch, nur die
> LEDs bleiben im Anfangszustand).

Mei.. in dem Code ist so einiges im Ar****.. 'Signal' nimmt man zB. 
nicht mehr.. das heißt jetzt ISR.. am besten du guckst mal durch das 
GCC-Tutorial hier auf der Seite links oben..
1
// Testprogramm um LED's an PortB ein- und auszuschalten
2
3
// inlcudes -----------------------------------------------
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
7
// defines ------------------------------------------------
8
#define LED_GROUP (0x78) // Bit 7-4
9
10
// variables ----------------------------------------------
11
uint16_t count_overflow=0;
12
13
// Hauptprogramm ------------------------------------------
14
int main()
15
{  // DataDirectionRegisterB -> Richtung PortPins (1=out, 0=in)
16
  DDRB = (1<<DDB7)|(1<<DDB6)|(1<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(0<<DDB0);
17
  
18
  // Timer0 (8Bit): Normal-Mode(0), TOP = 0xFF, Prescaler 1
19
  TCCR0A = (1<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(0<<WGM01)|(0<<WGM00);
20
  TCCR0B = (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00);
21
  TIMSK0 = (0<<OCIE0B)|(0<<OCIE0A)|(1<<TOIE0); // Overflow ON
22
23
  sei(); // interupts global on
24
25
  while (1) // loop forever
26
  {
27
    
28
  }
29
  return 0;
30
} //------------------------------------- Ende Hauptprog */
31
32
// Timer0 Overflow Interrupt ------------------------------
33
ISR (TIMER0_OVF_vect)
34
{
35
  count_overflow++; 
36
  if (count_overflow >= 40)
37
  {
38
    PORTB = (~PINB & LED_GROUP); // toggle Pins
39
    count_overflow = 0; // reset counter
40
  }
41
} //-------------------------------------- Ende TOV0_INT */

von Joan P. (joan)


Lesenswert?

glatt noch ein 'OR' vergessen.. weiß ja nicht, was an den anderen Pins 
noch so geschieht.. also:
1
PORTB |= (~PINB & LED_GROUP); // toggle Pins

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.