Finwe0815
27.09.2007, 18:18
Hy zusammen,
ich hab nen kleines Problem mit dem PWM Mode meines Atmeg8, und zwar versuche ich durch drücken eines Tasters ne LED heller zu machen, bzw. wenn ein best. Wert errericht ist die LED wieder erlöschen zu lassen. Eigentlich funktioniert auch alles, ausser dass die LED nie wirklich ganz aus ist!? (Bei OCR1A sollte dass doch aber sein, oder?)
Nur warum funktioniert es nicht???
Auch wenn ich direkt OCR1A=0 setze ist die LED auch nicht (ganz) aus, ich schätze das hängt vielleicht mit der Initialisierung zusammen???
Noch was zur Hardware PB1 --> PWM Ausgabe
PB0 --> Taster einlesen
PC0 --> Test LED (bei Tastendruck)
Hier mal der Quellcode:
// Test PWM
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB &= ~( 1 << PB0 ); //set PB0 input
PORTB |= ( 1 << PB0 ); //set PB0 Pull up on
DDRB |= (1 << PB1); //set PB1 output
PORTB |= ( 1 << PB1 ); //set PB1 Pull up on
DDRC |= ( 1 << PC0 ); //set PC0 output
TCCR1A = (1 << WGM11); // mode 14, fast pwm, update at top
TCCR1B = (1 << WGM13) // tov1 flag set on top
| (1 << WGM12) // top = ICR1
| (1 << CS11) // clock select clk/64
| (1 << CS10);
ICR1 = 255;
TCCR1A |= (1 << COM1A1); //don´t invert
OCR1A = 0; //start value
while(1)
{
/*Test automatic inrementation of OCR1A
OCR1A ++;
_delay_ms(10);
if (OCR1A >=255)
{
OCR1A = 0;
}
*/
if (!(PINB & (1 << PB0))) //if PB0 is low then (bec. PB0 --> Pull up)
{
PORTC |= (1 << PC0); //set PC0 high
OCR1A = OCR1A+1; //inc OCR1A
_delay_ms(1000); //delay time for switch
}//if (!(PINB & (1 << PB0)))
else //else
{
PORTC &= ~(1 << PC0); //set PC0 low
}//else if (!(PINB & (1 << PB0)))
if (OCR1A >=10) //if OCR1A is 255 then
{
OCR1A =0; //reset OCR1A
}//if (OCR1A >=255)
}//while(1)
return 0;
}//int main (void)
Noch ne Frage: Kann ich bei dieser Programmierung davon ausgehen, dass die Spannung bei jedem Tastendruck jetzt um (5/255)[V] Schritten erhöht wird?
Vielen Dank im Voraus
Gruß Finwe0815
ich hab nen kleines Problem mit dem PWM Mode meines Atmeg8, und zwar versuche ich durch drücken eines Tasters ne LED heller zu machen, bzw. wenn ein best. Wert errericht ist die LED wieder erlöschen zu lassen. Eigentlich funktioniert auch alles, ausser dass die LED nie wirklich ganz aus ist!? (Bei OCR1A sollte dass doch aber sein, oder?)
Nur warum funktioniert es nicht???
Auch wenn ich direkt OCR1A=0 setze ist die LED auch nicht (ganz) aus, ich schätze das hängt vielleicht mit der Initialisierung zusammen???
Noch was zur Hardware PB1 --> PWM Ausgabe
PB0 --> Taster einlesen
PC0 --> Test LED (bei Tastendruck)
Hier mal der Quellcode:
// Test PWM
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB &= ~( 1 << PB0 ); //set PB0 input
PORTB |= ( 1 << PB0 ); //set PB0 Pull up on
DDRB |= (1 << PB1); //set PB1 output
PORTB |= ( 1 << PB1 ); //set PB1 Pull up on
DDRC |= ( 1 << PC0 ); //set PC0 output
TCCR1A = (1 << WGM11); // mode 14, fast pwm, update at top
TCCR1B = (1 << WGM13) // tov1 flag set on top
| (1 << WGM12) // top = ICR1
| (1 << CS11) // clock select clk/64
| (1 << CS10);
ICR1 = 255;
TCCR1A |= (1 << COM1A1); //don´t invert
OCR1A = 0; //start value
while(1)
{
/*Test automatic inrementation of OCR1A
OCR1A ++;
_delay_ms(10);
if (OCR1A >=255)
{
OCR1A = 0;
}
*/
if (!(PINB & (1 << PB0))) //if PB0 is low then (bec. PB0 --> Pull up)
{
PORTC |= (1 << PC0); //set PC0 high
OCR1A = OCR1A+1; //inc OCR1A
_delay_ms(1000); //delay time for switch
}//if (!(PINB & (1 << PB0)))
else //else
{
PORTC &= ~(1 << PC0); //set PC0 low
}//else if (!(PINB & (1 << PB0)))
if (OCR1A >=10) //if OCR1A is 255 then
{
OCR1A =0; //reset OCR1A
}//if (OCR1A >=255)
}//while(1)
return 0;
}//int main (void)
Noch ne Frage: Kann ich bei dieser Programmierung davon ausgehen, dass die Spannung bei jedem Tastendruck jetzt um (5/255)[V] Schritten erhöht wird?
Vielen Dank im Voraus
Gruß Finwe0815