Mega32 Problem mit IRQ

Gast #2376480
Lesenswert?

Hi,

ich bin solangsam etwas ratlos. Im Forum, Google und das Datasheet haben 
mir irgendwie nicht mehr weitergeholfen .... who wanna be my glory 
rescuer?


Also:  Ort des Geschehens:  Mega32 @ 8 MHZ (intern osc)

Ich habe 3 PWM-Kanäle (OC2,OC1A,OC1B).
Ich habe 1 Interrupt auf Timer0 (1/100s) bei 8MHz

Problem:

Ohne den Timer0 -> geht das PWM
Mit dem Timer0 -> nix PWM, dafür geht Timer0

================================
== Hier der Code für den PWM: ==
================================

    TCCR1B |= (1<<CS12); //Prescaler 256
    TCCR2  |= (1<<CS22) | (1<<CS21) | (0<<CS20); //Prescaler 256


  // 2. Den Timer in den Fast PWM Mode, 8 Bit schalten
  TCCR1A |= (1<<WGM10);
  TCCR1B |= (1<<WGM12);
  TCCR2  |= (1<<WGM21) | (1<<WGM20);


// 3. Compare Output mode einstellen: Pin geht auf high bei Compare 
match, auf low bei Überlauf.  Ergibt nichtinvertierte PWM.
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ;
TCCR2  |= (1<<COM21) | (1<<COM20) ;

// PWM-Werte  (testweise)
OCR1A =  127;
OCR1B = 127;
OCR2  = 127;

// Die Pins als Ausgänge konfigurieren.
DDRD |= (1<<PD4) | (1<< PD5) | (1<< PD7);


===================================
== Hier der Code für den Timer0: ==
===================================



TCCR0 = ( 1<<CS02 ) | ( 0<<CS02 ) | ( 1<<CS00 );
TCNT0  = 65535 - ( ( 8000000 / 1024 ) / 100) ;// Vorladen
TIMSK |= (1<<TOIE0); // Interrupts aktivieren und damit Timer starten
sei();




ISR( TIMER0_OVF_vect )
{
    cli();
                TCNT2 = 65535 - ( ( 8000000 / 1024 ) / 100) ;

                // ...... hier kommt was ....

                sei();
}




Wo liegt denn mein Denkfehler? Ich kann doch Timer0 unabhängig von Timer 
1&Timer2 verwenden.... warum beeinflussen die sich denn?

Heul....
Gast #2376544
Lesenswert?

Hmmm..

jetzt habe ich:

TCCR0= (0<WGM01) | (0<<WGM00) |  ( 0<<CS02 ) | ( 1<<CS02 ) | ( 1<<CS00 
);
TCNT0 = 244;
TIMSK |= (1<<TOIE0);
sei();

sowie:


ISR( TIMER0_OVF_vect )
{
  TCNT0 = 244;
  .... irgendwas kurzes tun ...
}


.... funktioniert für timer0, aber das PWM ist wieder kaputt :(

P.s. Die freq. ist jetzt höher f. timer0, aber egal...
Gast #2376568
Lesenswert?

Oliver J. schrieb:
> Zeig bitte den ganzen code.

Hui.... das wird schwierig..... Das ganze ist ein RGB LED Stripes 
Controller, der 3 RGB Farben ansteuert und via Ethernet per WEB-Server 
erreichbar ist.

Das alles funktionert ganz gut, d.h. ich kann die LEDS korrekt 
ansteuern, der WEB-Server tut und antwortet artig, ich kann die Werte 
für die 3 Kanäle richtig einstellen - nur werden diese eben nicht mehr 
richtig ausgegeben.

arrrrrrrrggggggggggssssssss.............

ICH BIN SOOOOOO EIN IDIOT ....... GRRRRRR...... es tut jetzt....

Grund:

Die werte von dem HTTP-Request (Wertebereich 0..1000) rechnete ich 
runter mit:

    OCR1A =  ((float)wert_r / 3,93);
  OCR1B = ((float)wert_g / 3,93);
        OCR2  = ((float)wert_b / 3,93);

nun mit

   OCR1A =  wert_r;
  OCR1B = wert_g;
        OCR2  = wert_b;

tut das ganze .... sofern ich die werte nicht >255 sezte...
Gast #2376577
Lesenswert?

Interessant... mit

    OCR1A =  ((float)wert_r / 3.93);
  OCR1B = ((float)wert_g / 3.93);
    OCR2  = ((float)wert_b / 3.93);

(man beachte den "." anstelle "," geht es nun ....

wo ist denn hier der unterschied ?
Gast #2376608
Lesenswert?

:)

ich habe nur schon lange kein C mehr gemacht bzw. einfach zuviel java 
....

P.s. Den "Komma-Operator" war mir neu... aber hätte da der
Compiler nicht einen Fehler melden müssen ... die "93" ist da doch 
völlig unsinnig .... obwohl ... vielleicht hat er aus

OCR1A =  ((float)wert_r / 3,93);

dann der compiler:


OCR1A =  ((float)wert_r / 3);
OCR1A =   (93);

gemacht...

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