Forum: Mikrocontroller und Digitale Elektronik Attiny45 Timer resetet Hauptprogramm


von equi (Gast)


Lesenswert?

Hi Forum,
ich hab ein kleines SoftPWM-Programm geschrieben, welches soweit auch 
funktioniert. Mein Problem liegt bei < und <=. Ich wollt den Code 
bischen kompriemieren und übersichtlicher machen (ursprung in klammer), 
das Problem ist wenn ich es so mache wie es unkommentiert ist startet 
der Mikrocontroller immer neu nach einer gewissen Zeit. Ändere ich 
jedoch < gegen <= dann funktioniert es normal. Hat einer ne Idee woran 
das liegt?
1
// Timer 0 Output
2
ISR(TIMER0_COMPA_vect) {
3
  uint8_t tmp=0;
4
  pwmtime++;
5
  /*
6
  //später für 10Bit uint16_t pgm_read_word(xx);
7
  //gamma_0_8[red]
8
  if(pwmtime<pgm_read_byte(&gamma_0_8[red])) {PORTB |= (1<<PB0);}
9
  else {PORTB &= ~(1<<PB0);};
10
  //gamma_2_2[green]
11
  if(pwmtime<pgm_read_byte(&gamma_2_2[green])) {PORTB |= (1<<PB1);}
12
  else {PORTB &= ~(1<<PB1);};
13
  //gamma_2_2[blue]
14
  if(pwmtime<pgm_read_byte(&gamma_2_2[blue])) {PORTB |= (1<<PB2);}
15
  else {PORTB &= ~(1<<PB2);};
16
  */
17
  //gamma_0_8[red]
18
  if((pwmtime)<(pgm_read_byte(&gamma_0_8[red]))) {tmp |= (1<<PB0);}
19
  //gamma_2_2[green]
20
  if((pwmtime)<(pgm_read_byte(&gamma_2_2[green]))) {tmp |= (1<<PB1);}
21
  //gamma_2_2[blue]
22
  if((pwmtime)<(pgm_read_byte(&gamma_2_2[blue]))) {tmp |= (1<<PB2);}
23
24
  PORTB = tmp;
25
}
26
27
int main(void) {
28
    // PWM Port einstellen
29
    //DDRB = rgbPins;               // Port als Ausgang: 0,1,2 ->r,g,b ->pin 5,6,7
30
  DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2);
31
  PORTB = 0x00;
32
33
    //timer0 für PWM
34
    TCCR0B |= (1<<CS00);               
35
    TIMSK |= ((1<<OCIE0A)|(1<<TOIE0));  // Interrupt freischalten
36
37
    TIFR = (1 << TOV0);
38
    TCNT0=0;
39
    //Starttest
40
    red=255;
41
    green=100;
42
    blue=0;
43
  _delay_ms(200);
44
    sei();                        // Interrupts global einschalten
45
46
  while(1)
47
  {
48
    //do nothing!
49
  }
50
    return 0;
Hab einiges ausprobiert aber irgendwie komm ich nicht drauf worans 
liegt. Hoffe ihr könnt mir helfen.

Gruß equi

von equi (Gast)


Lesenswert?

ich sollte vlt auch noch erwähnen das in der Interrupt-overflow-Teil die 
volatile variablen red, green und blue verändert werden.
1
volatile uint8_t red,green,blue;
2
volatile uint16_t rgbspeed=0;
3
4
ISR(TIM0_OVF_vect) {
5
    if (++rgbspeed>=1000) {
6
      rgbspeed=0;
7
      //rgbstep:
8
      //0: r->g  1: g  2: g->b    3: b  4: b->r    5: r
9
      //umgedreht denken pwm_setting[7]=rot; pwm_setting[6]=grün; pwm_setting[5]=blau;
10
11
      //rot->grün
12
      if (rgbstep==0) {
13
        green++;
14
        if (green==255) {
15
          rgbstep=1;
16
        }
17
      //grün
18
      } else if (rgbstep==2) {
19
        red--;
20
        if (red==0) {
21
          rgbstep=3;
22
        }
23
      //grün->blau
24
      } else if (rgbstep==4) {
25
        blue++;
26
        if (blue==255) {
27
          rgbstep=5;
28
        }
29
      //blau
30
      } else if (rgbstep==6) {
31
        green--;
32
        if (green==0) {
33
          rgbstep=7;
34
        }
35
      //blau->rot
36
      } else if (rgbstep==8) {
37
        red++;
38
        if (red==255) {
39
          rgbstep=9;
40
        }
41
      //rot
42
      } else if (rgbstep==10) {
43
        blue--;
44
        if (blue==0) {
45
          rgbstep=11;
46
        }
47
      //rgb und cmy hold
48
      } else if ((rgbstep==1)||(rgbstep==3)||(rgbstep==5)||(rgbstep==7)||(rgbstep==9)||(rgbstep==11)) {
49
      if (++colorhold>=colorholdtime) {
50
        colorhold=0;
51
        if (rgbstep==11) {rgbstep=0;}
52
        else rgbstep++;
53
      }
54
      }
55
    }
56
}
Ich denke mal das eine Zugriffsverletzung wegen red, green und blue 
hervorgerufen wird, denn wenn ich alles aus dem Overflow rausnehme, dass 
mit red etc zu tun hat funktioniert es mit <. Die Frage ist nur warum es 
mit <= funktioniert?

Gruß equi

von equi (Gast)


Lesenswert?

bitte mal nach gcc verschieben, glaub das hier ein bischen falsch

von equi (Gast)


Lesenswert?

kann es sein, dass < anders interpretiert wird als <= ? hab einige 
Versuche gemacht aber es funktioniert nicht mit <, wenn ich das Ergebnis 
in eine Variable speicher. Setze ich hingegen direkt den Pin macht er es 
mit <.

von equi (Gast)


Lesenswert?

Problem gelöst. In meinen Testaufbau hatte ich kein Abblockkondensator. 
Deswegen ist sobald pb2 hinzugekommen ist oder ich gleichzeitig 3 
Ausgänge geschalten ist, ein reset geschehen. Bei der Variante, wo ich 
ohne Variable gearbeitet habe wurde die Ausgänge immer einzeln 
angesteuert und nicht auf einmal, weswegen dies bis zu einen gewissen 
grad funktioniert hat.Tjo, wenns der Code nicht ist, sollte man einfach 
mal wieder auf den Schaltplan guckn xD
Mir ists gedämmert nachdem ich das gelesen hatte:
Beitrag "Reset-Problem mit AVR Attiny13v, Assembler"

Thread kann geschlossen werden

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.