Hi zusammen Ums kurz zu machen: Ich bin gerade dran einen Motor anzusteuern mit dem Fast-PWM-Mode (ATTiny4313) vom Timer0. Leider funktioniert nur Ausgang OC0A und OC0B bleibt immer LOW, egal welcher Wert. Als ich dachte, ich hätte einen falschen PIN verwendet, habe ich Datenblatt nochmals geschaut. (Anhang, Datenblatt Seite 2 und 68) Seh ich nicht richtig, oder ist PD5 jeweils einmal mit OC0B und mit OC1B angeschrieben? Dies würde nämlich auch erklären, wieso mein Ausgang PD5 keinen Wank macht. Zur Sicherheit trozdem noch der Code: #include <avr/io.h> #include <util/delay.h> #include <stdint.h> #include <avr/interrupt.h> //define LEER PA0 //define LEER PA1 //define RESET PA2 #define ENABLE_decoder PB0 //Low=enable #define STOP PB1 //High=stop #define MOTOR1 PB2 //define LEER PB3 #define DATA PB4 #define CLK PB5 #define EN1 PB6 //PCINT6 #define EN2 PB7 #define OUT0 PD0 #define OUT1 PD1 #define OUT2 PD2 #define OUT3 PD3 #define OUT4 PD4 #define MOTOR2 PD5 #define DIREC PD6 int main(void) { //Pin Konfiguration DDRA = 0; DDRB |= (1<<EN2) | (1<<MOTOR1); DDRD |= (1<<MOTOR2); //Ausgänge und Pull-pus einstellen PORTB |= (1<<CLK) | (1<<EN1) | (1<<EN2) | (1<<STOP) | (1<<ENABLE_decoder); //Motorsteuerung TCCR0A |= (1<<COM0A1) | (1<<COM0A0) | (1<<COM0B1) | (1<<COM0B0) | (1<<WGM01) | (1<<WGM00); TCCR0B |= (1<<WGM02) | (1<<CS02) | (1<<CS00); //prescaler 1024 OCR0A = 0; OCR0B = 0; //Interrupt Einstellungen PCMSK |= (1<<PCINT6); GIMSK |= (1<<PCIE); TCCR1B |= (1<<CS12) | (1<<WGM12); //prescaler 256 OCR1A = 1000; TIMSK |= (1<<OCIE1A); for(time=0;time<1000000;time++) {} OCR0B = 20; for (time=0;time<500000;time++) {} OCR0B = 0; while(1) {} } Ich bin zurzeit gerade etwas am basteln an diesem Code, aber das ist momentan alles, was man sehen muss (Interrupts sind momentan ausgeschaltet). Ersetze ich jetzt OCR0B durch OCR0A funktioniert PB2 wie er sollte. Wer weiss weiter??? :( lg Sven
> for (time=0;time<500000;time++) {}
wenn time nicht gerade volatile ist, wird dieser code komplett
wegoptimiert.
Warum nicht einfach ein delay verwenden?
Hallo Sven, Das ist falsch: OC0A = PB2 OC0B = PD5 OC1A = PB3 OC1B = PB4 Sind da irgendwo Tomaten versteckt ?
Hallo Peter Ist als volatile programmiert: (_delay frisst mir manchmal etwas viel Speicher -> aus Gewohnheit) volatile unsigned long time = 0; //allgemein zum zählen ..... Aber es ist eben grade komisch, wieso er dies mit OC0A macht. Zudem habe ich das gleiche Programm schnell für einen ATTiny2313 gemacht, und hier wird es nur komischer: Ich steuere OC0A an und es bewegt sich OC0B?!?! langsam bin ich ganz verwirrt -.- (Programm ist für ATTiny2313 umgeschrieben) lg Sven
@Uwe: Also ist die Aussage vom Datenblatt Seite 68 flasch meinst du?
Du hast Fast-PWM mit OCR0A als TOP eingestellt. Natürlich tut sich dann an OC0B nichts, wenn OCR0B größer ist als OCR0A.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.