Forum: Mikrocontroller und Digitale Elektronik Timer0 in ATtiny13a


von dasrotemopped (Gast)


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

von Jurij H. (kebabfreund)


Lesenswert?

Hallo,

hab ich das Problem richtig verstanden:

Du kannst den OC0A per PWM nur auf 50% fahren?
Und du willst zB. 20% haben?

Oder gehts drum, OC0A  und OC0B mit verschiedenen Frequenzen zu 
Betreiben?
(Was nicht geht)

von dasrotemopped (Gast)


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.

von Mark L. (m2k10) Benutzerseite


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.

von Jurij H. (kebabfreund)


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
}

von dasrotemopped (Gast)


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.

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.