Forum: Mikrocontroller und Digitale Elektronik Ausgänge von Timer1 ansteuern mit der Blinkfrequenz von Timer3?


von mazell (Gast)


Lesenswert?

hi,

zur ansteuerung einer RGBLED hab ich für die PWM den Timer 1 genommen,
für die Blinkfrequenz hab ich den Timer 3 genommen der beim 
Vergleichswert von OCR3A toggelt (atmel can 128).

Mein Problem ist jetzt, wie kann ich das codieren das die ausgänge von 
Timer 1 (OC1A, OC1B, OC1C) mit der Frequenz von Timer 3 an und ausgehen.

ich hab das mal mit if else anweisungen versucht zu probieren wenn z.b.
0C3B an ist sollen auch die ausgänge von Timer 1 an sein, aber das funzt 
alles nicht so, muss ich das mit dem interrupt steuern? hab den noch nie 
benutzt.

von Oliver J. (skriptkiddy)


Lesenswert?

mazell schrieb:
> muss ich das mit dem interrupt steuern?
Wahrscheinlich.


> hab den noch nie benutzt.
Na dann schau mal hier:

http://www.atmel.com/dyn/resources/prod_documents/doc7679.pdf

AVR-GCC-Tutorial: Programmieren mit Interrupts

Gruß Skriptkiddy

von mazell (Gast)


Lesenswert?

TCCR3A = (0<<WGM31) | (0<<WGM30) | (1<<COM3B0)  | (0<<COM3B1) |

(1<<COM3C0)  | (0<<COM3C1);

TCCR3B = (1<<CS32) | (0<<CS31) | (1<<CS30) |(0<<WGM33) | (1<<WGM32) ;


TIMSK3 = (1<<OCIE3A) | (0<<ICIE3) ;


hab den TIMSK3 so belegt.

int blinken(float f)
{

OCR3A = (F_CPU /(2  1024  f) ) -1 ;

 }


ISR(TIMER3_COMPA_vect)
{
  Farbe(255,0,0);
}


nur fürs verständnis, wenn der Vergleichswert erreicht wird sollte doch 
das interrupt jetzt starten, und eigentlich müsste er mir die farbe 
(rot) ausspucken!? (macht er nicht ;) )

von Oliver J. (skriptkiddy)


Lesenswert?

Aus diesen unkommentierten Fragmenten wird niemand, ohne Aufwand zu 
betreiben, schlau. Poste bitte mal den ganzen Code (als Anhang).

Gruß Skriptkiddy

von mazell (Gast)


Angehängte Dateien:

Lesenswert?

hab das mal als C datei angehangen

#define ROT  OCR1A
#define GRUEN  OCR1B
#define BLAU  OCR1C

// Funktion zur Einstellung der Farben

int Farbe( int r, int g, int b)
{


  ROT = r;
  GRUEN = g;
  BLAU = b;
}

 //Funktion zur Einstellung der Blinkfrequenz

 int blinken(float f)
{

OCR3A = (F_CPU /(2  1024  f) ) -1 ;

 }


ISR(TIMER3_COMPA_vect)
{

  if (DDB5 == 1 )
  {
    DDRB  |= (0<<DDB5);   //ausgang der roten LED
  }
  else
  {
    DDRB  |= (1<<DDB5);
  }

}

int main(void)
{

  DDRA &= ~(1<<DDA2) | ~(1<<DDA0) | ~(1<<DDA4);
  DDRA |= (1<<DDA6);
  DDRB  |= (1<<DDB7) | (1<<DDB5) | (1<<DDB6) | (1<<DDB4);
  DDRC &= ~(1<<DDC0) | ~(1<<DDC2) | (1<<DDC4) | (1<<DDC6);
  DDRE  = (1<<DDE4) | (1<<DDE5);

  TCCR3A = (0<<WGM31) | (0<<WGM30) | (1<<COM3B0)  | (0<<COM3B1);
  TCCR3B = (1<<CS32) | (0<<CS31) | (1<<CS30) |(0<<WGM33) | (1<<WGM32) ;



TIMSK3 = (1<<OCIE3A) | (0<<ICIE3) ;


TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1) ;
TCCR1B = (1<<CS11) | (1<<CS10) ;


PORTA |= (1<<PA2) | (1<<PA0) | (1<<PA4) ;   // Eingänge/Ausgänge

PORTA &= ~(1<<PA6);


PORTC |= (1<<PC0) | (1<<PC2);  //endlagen
//PORTE &= ~(1<<PE4);         //gelbe LED



 while (1)
{
  Farbe(255,255,255);

  blinken(2);
}


das ist so das wichtige

also der interrupt funktioniert auch, ich würde jetzt einfach "nur" ;) 
wissen wollen wie ich an T1 rangehe sodass der mit der Blinkfrequenz von 
T3 blinkt.

von mazell (Gast)


Lesenswert?

ne der interrupt funzt doch noch nicht, hab das mal mit der led auf dem 
controller ausprobiert

von Oliver J. (skriptkiddy)


Lesenswert?

sei() fehlt.

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.