Forum: Mikrocontroller und Digitale Elektronik Software PWM Fehler?


von Dirk (Gast)


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

von Dirk (Gast)


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

von Dirk (Gast)


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
}

von Dirk (Gast)


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
}

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.