Forum: Mikrocontroller und Digitale Elektronik ATTiny2313A/4313 Timer0 Datenblattfehler?


von Sven Puga (Gast)


Angehängte Dateien:

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

von Peter II (Gast)


Lesenswert?

> for (time=0;time<500000;time++) {}
wenn time nicht gerade volatile ist, wird dieser code komplett 
wegoptimiert.

Warum nicht einfach ein delay verwenden?

von Uwe (Gast)


Lesenswert?

Hallo Sven,

Das ist falsch:
OC0A = PB2
OC0B = PD5
OC1A = PB3
OC1B = PB4

Sind da irgendwo Tomaten versteckt ?

von Sven Puga (Gast)


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

von Sven Puga (Gast)


Lesenswert?

@Uwe:
Also ist die Aussage vom Datenblatt Seite 68 flasch meinst du?

von Stefan E. (sternst)


Lesenswert?

Du hast Fast-PWM mit OCR0A als TOP eingestellt. Natürlich tut sich dann 
an OC0B nichts, wenn OCR0B größer ist als OCR0A.

von Sven Puga (Gast)


Lesenswert?

Jap, hat sich erledigt, danke

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
Noch kein Account? Hier anmelden.