www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer0 in ATtiny13a


Autor: dasrotemopped (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_T...

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

Gruß,

dasrotemopped

Autor: Jurij H. (kebabfreund)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: dasrotemopped (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark Leyer (m2k10) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jurij H. (kebabfreund)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>


int main(void)
{

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

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

  OCR0A = 20;      //Tastverhätniss
  while(1)
  {
    _delay_ms(20);
    OCR0A++;
  };

  return 0;
}


Autor: dasrotemopped (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.