Software PWM Fehler?

Gast #405845
Lesenswert?
• ▲
▼
Hallo,

ich hab einen alten Quellcode von mir ausgegraben für ein 8 Kanal
Software PWM. Ich wollte den Code auf ein FPGA / CPLD portieren. Bei
der Simulation ist mir ein vermeidlicher Fehler aufgefallen.

Falls der Zaehler für den Kanal == PWM_Reg. ist, dann wird der Port
eingeschaltet , somit ist der Verbraucher auch kurz eingeschaltet,
obwohl PWM_Reg = 0 ist.


1
// Code reduziert auf 2 Kanäle)
2
// ISR Int @39µs (256*39µs = 9,98ms = 100Hz PWM Freq.)
3
ISR(TIME0_OVF)
4
{
5
 if (pwm_help[0] == 0){ PORTx = (1<<0);}
6
 if (pwm_help[1] == 0){ PORTx = (1<<1);}
7

8
 if (pwm_help[0] == [pwm_reg[0]){ PORTx = (1<<0); } 
9
 if (pwm_help[1] == [pwm_reg[1]){ PORTx = (1<<1); }
10
}

Muesste normal nicht die Anweisungen so aussehen?

ISR(TIME0_OVF)
{
 if (pwm_help[0] == 0){ PORTx = (1<<0);}
 if (pwm_help[1] == 0){ PORTx = (1<<1);}

 if (pwm_help[0] == [pwm_reg[0]) & ([pwm_reg[0] > 0)
 { PORTx = (1<<0); }
 if (pwm_help[1] == [pwm_reg[1]) & ([pwm_reg[1] > 0)
 { PORTx = (1<<1); }


}
[/c]

Ich hoffe mir kann jemand kurz auf die Sprünge helfen.

Danke und Gruß,
Dirk
Gast #405846
Lesenswert?
• ▲
▼
Hallo,

ich hab einen alten Quellcode von mir ausgegraben für ein 8 Kanal
Software PWM. Ich wollte den Code auf ein FPGA / CPLD portieren. Bei
der Simulation ist mir ein vermeidlicher Fehler aufgefallen.

Falls der Zaehler für den Kanal == PWM_Reg. ist, dann wird der Port
eingeschaltet , somit ist der Verbraucher auch kurz eingeschaltet,
obwohl PWM_Reg = 0 ist.
1
// Code reduziert auf 2 Kanäle)
2
// ISR Int @39µs (256*39µs = 9,98ms = 100Hz 
3
ISR(TIME0_OVF){ 
4
if (pwm_help[0] == 0){ PORTx &= ~(1<<0);} 
5
if (pwm_help[1] == 0){ PORTx &= ~(1<<1);}  
6

7
if (pwm_help[0] == [pwm_reg[0]){ PORTx |= (1<<0); }  
8
if (pwm_help[1] == [pwm_reg[1]){ PORTx |= (1<<1); }
9
}

Muesste normal nicht die Anweisungen so aussehen?
1
ISR(TIME0_OVF)
2
{
3
 if (pwm_help[0] == 0){ PORTx &= ~(1<<0);}
4
 if (pwm_help[1] == 0){ PORTx &= ~(1<<1);}
5

6
 if (pwm_help[0] == [pwm_reg[0]) & ([pwm_reg[0] > 0) 
7
 { PORTx |= (1<<0); } 
8
 if (pwm_help[1] == [pwm_reg[1]) & ([pwm_reg[1] > 0) 
9
 { PORTx |= (1<<1); } 
10
}

Ich hoffe mir kann jemand kurz auf die Sprünge helfen.

Danke und Gruß,
Dirk
Gast #405847
Lesenswert?
• ▲
▼
Oder die ISR muesste ein bischen umgestellt werden?
1
ISR(TIME0_OVF)
2
{
3

4
 if (pwm_help[0] == [pwm_reg[0]) { PORTx |= (1<<0); } 
5
 if (pwm_help[1] == [pwm_reg[1]) { PORTx |= (1<<1); } 
6

7
 if (pwm_help[0] == 0){ PORTx &= ~(1<<0);}
8
 if (pwm_help[1] == 0){ PORTx &= ~(1<<1);}
9

10

11
}
Gast #405848
Lesenswert?
• ▲
▼
Hm, entschuldigung es fehlt im Code das inkrementieren der zaehler
1
ISR(TIME0_OVF){
2
 if (pwm_help[0]++ == 0){ PORTx &= ~(1<<0);} 
3
 if (pwm_help[1]++ == 0){ PORTx &= ~(1<<1);}
4

5
 if (pwm_help[0] == [pwm_reg[0]){ PORTx |= (1<<0); }
6
 if (pwm_help[1] == [pwm_reg[1]){ PORTx |= (1<<1); }
7
}

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