Timer0 in ATtiny13a

Gast #1989250
Lesenswert?

Hallo zusammen,

erst mal frohes Fest allen hier im Forum.
Nun zu meinem Problem mit dem Timer0 im ATtiny13a.
Ich habe alle möglichen Einstellungen der Kontrollregister
durchprobiert und bekommen den Ausgang OC0A am uC nicht dazu,
ein unsymetrisches Puls/Pausenverhältnis auszugeben.
Die Ausgabefrequenz ändern ist kein Problem, auch die dynamische
Änderung der Frequenz über neue Werte im OCR0A Register ist
kein Problem. Ebenso an OC0B parallel ein verschobenes Signal auszugeben 
geht, aber immer nur in der selben Frequenz wie OC0A.
Den Quellcode in C vom AVR Studio habe ich hier mal bereitgestellt:
http://home.arcor.de/markus.horbach/dateien/Tiny_Timer_20101224.zip

Ich hoffe, ihr habt nen heissen Tip für mich.

Gruß,

dasrotemopped
Gast #1989264
Lesenswert?

Hi Jurij,

das Verhältnis Puls zu Pause ist immer 50:50, das will ich ändern 
können. Dabei soll der Timer die Steuerung vom Ausgang übernehmen. In 
Software ohne Timer wäre kein Problem, aber das würde den uC mehr 
beschäftigen.

Für OC0A und OC0B mit verschiedenen Frequenzen bräuchte ich einen uC mit 
2 Timern, die der ATtiny13a nicht hat, richtig ?

Gruß,

dasrotemopped.
(Firma: TH Köln) Persönliche Seite #1989283
Lesenswert?

dasrotemopped schrieb:
> Ich habe alle möglichen Einstellungen der Kontrollregister
> durchprobiert

Das glaube ich aber nicht ganz, ohne reservierte bits sind das schon 
4096 Möglichkeiten.

dasrotemopped schrieb:
> Ich hoffe, ihr habt nen heissen Tip für mich.

Datenblatt lesen ;-)

In deinem Code stellst du einen WG-Modus ein, der als 'reserved' 
deklariert ist und beschreibst bits, die nur zum lesen sind. Hab das 
selbst noch nicht ausprobiert, aber mit komischen Effekten sollte man da 
wohl rechnen. Versuch mal TCCR0A=0b10100011 und TCCR0B=0b00000001 das 
sollte gehen. Ist übrigens keine Frage der Höflich- sondern der 
Lesbarkeit, dass man Einstellbits mit ihrem Namen ansprechen sollte 
statt anonym als 0bxyz.
#1989292
Lesenswert?

Na ja, die timern 0.c find ich unnötig.

Dein fehler ist dass du die ausgänge OC0A und OC0B nur kippen tuest beim 
überlauf des Zählers.

Hier ein Beispiel code wie gehen sollte
musst dann noch den Prescaler anpassen
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <util/delay.h>
4

5

6
int main(void)
7
{
8

9
  DDRB |= 0x01;  //Pin PB1 als Ausgang
10
  PORTB |= 0x1B;  //Pergel High  bzw Pullups aktivieren
11
  
12
  //    OC0A auf 1, wenn überlauf von TCNT0
13
  TCCR0A |= (1 << COM0A1);
14
  //    Fast PWM, OC0A auf 0, wenn TCNT == OCR0A
15
  TCCR01 |= (1 << WGM01) | (1 << WGM00);
16

17
  TCCR0B |= (1 << CS00);  // ~4kHz @ 9.4 MHz (kein Prescaler)
18

19
  OCR0A = 20;      //Tastverhätniss
20
  while(1)
21
  {
22
    _delay_ms(20);
23
    OCR0A++;
24
  };
25

26
  return 0;
27
}
Gast #1989386
Lesenswert?

Es funktioniert ! Das ist ja wie Weihnachten !!
Vielen Dank für die Hilfe.

Habe mal den Code nach euren Angaben überprüft.
http://home.arcor.de/markus.horbach/c++.html

Der Code von Jurij war mir der Fingerzeig, das meine durchprobierten 
Einstellungen doch nicht völlig falsch waren, da sein Programm bei mir ( 
bis auf den kleinen Vertipper TCCR01 ) sofort das gewünschte Ergebnis 
brachte.

Der hauptsächliche Fehler war wohl in der Art der Beschreibung der Bits 
in den Registern. Da hatte Mark recht, das kann fiese Probleme machen 
wenn man reservierte Flags beschreibt. Werde in Zukunft immer die 
Zuweisung über
Register |=  (1 << Flag) oder
Register &=~ (1 << Flag) machen.
Hätte mir viel Zeit gespart.

Gruß,

dasrotemopped.

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