Mh,
ich habe das leider nicht so genau verstanden
z.B. PWM_DDR = 0xFF; was für ein Ausgangpin an D ist das (Ich brauche z.B. PC4)?
Hier mal mein Code wie ich mir das vorstelle. Fehlt aber das mit 50% und 100%:
Code:#define F_CPU 8000000L // Systemtakt in Hz #define F_PWM 100 // PWM-Frequenz in Hz #define PWM_STEPS 256 // PWM-Schritte pro Zyklus(1..256) #define PWM_PORT PORTD // Port für PWM #define PWM_DDR DDRD // Datenrichtungsregister für PWM #define T_PWM (F_CPU/(F_PWM*PWM_STEPS)) // Systemtakte pro PWM-Takt #if (T_PWM<(152+5)) #error T_PWM zu klein, F_CPU muss vergrösst werden oder F_PWM oder PWM_STEPS verkleinert werden #endif #include <stdint.h> #include <string.h> #include <avr/io.h> #include <avr/interrupt.h> // globale Variablen volatile uint8_t pwm_setting[8]; // Timer 1 Output COMPARE A Interrupt ISR(TIMER1_COMPA_vect) { static uint8_t pwm_cnt=0; uint8_t tmp=0, i=0, j=1; OCR1A += (uint16_t)T_PWM; for (; i<8; i++) { if (pwm_setting[i] > pwm_cnt) tmp |= j; j<<=1; } PWM_PORT = tmp; // PWMs aktualisieren if (pwm_cnt==(uint8_t)(PWM_STEPS-1)) pwm_cnt=0; else pwm_cnt++; } int main(void) { // PWM einstellen PWM_DDR = 0xFF; // Port als Ausgang DDRD &= (~ (1<<PD2)|(1<<PD3)); /* Pin D2,D3,als Eingang */ PORTD |= (1<<PD2)|(1<<PD3); /* Pull Up von PIN D2,D3 aktivieren */ // Timer 1 OCRA1, als variablem Timer nutzen TCCR1B = 1; // Timer läuft mit vollem Systemtakt TIMSK |= (1<<OCIE1A); // Interrupt freischalten sei(); // Interrupts gloabl einschalten if (!( PIND & (1<<PIND2))) { /* mache was wenn PinD2 low ist */ // Hier: der Getriebemotor an L293D soll mit 100% laufen } if (!( PIND & (1<<PIND3))) { /* mache was wenn PinD3 low ist */ //Hier: der Getriebemotor an L293D soll mit 50% laufen } return 0; }







Zitieren

Lesezeichen