Attiny45 Timer resetet Hauptprogramm

Gast #2932254
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
Gast #2933718
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
Gast #2937051
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 <.
Gast #2937798
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

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