ATTiny2313A/4313 Timer0 Datenblattfehler?

Gast #3777168
Lesenswert?

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
Angehängte Dateien:
Gast #3777196
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren