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;
}
Lesezeichen