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
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)
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.
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.
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.