Hallo zusammen,
ich bin frischer Einsteiger in die µC-Technik und habe folgendes
Problemchen:
Ich möchte mit dem ATtiny2313 eine Hardware-PWM erzeugen bzw. auf einem
Ausgang ausgeben, bin bisher aber erfolglos. Ich habe den Timer zwar zum
laufen gebracht, der Ablauf stimmt auch (OCRnx als TOP, Intterupt flag
bei compare match, etc.), die Interrupt Flags tauchen auch alle auf
(Simulation mit AVR-Studio 4), aber an meinem Ausgang am PORTB tut sich
nix... Das Setzen von prescaler, COMnx, WGM und dergleichen krieg ich ja
alles hin, aber der Ausgang macht keinen Mucks...
Wenn ich das Datenblatt vom ATtiny2313 richtig verstanden habe, müsste
ich eigentlich alles richtig gemacht haben (auch wenn ich stellenweise
den Eindruck habe, dass das Datenblatt manches nicht vollständig
erklärt). Das ganze müsste doch ohne Interrupt handler funktionieren,
oder?
Ich liefere heut abend mal meinen sourcecode, vielleicht weiß jemand nen
typischen Anfänger-Fallstrick?
Grüße
FoxAlpha
Portb setze ich als Ausgang und nulle den erstmal. Dann kommt der
waveform generation mode als fast PWM mit OCR0A als TOP dran (und weil
OCR0A = TOP, ist bei dem WGM OC0A immer gesetzt, OC0B dient als
eigentliches Signal). OCR0x werden mit Zahlenwerten gefüttert, dann der
Prescaler und der "Rest" vom WGM. Die Interrupts hab ich mal
eingeschaltet, weiß der Geier, ob das notwendig ist...
Ziel des ganzen ist die Ansteuerung eines Modellbauservos. Zum
Simulieren steht der Prescaler noch auf 1, später mit prescaler 1024
kommt eine Frequenz von ca. 50Hz raus, an PB4 (OC0B) sollte dann ein
PWM-Signal mit einem 20ms-Takt und rund 1,5ms "Ein"-Zeit rauskommen
(Mittenstellung Servo). Mit dem 16bit Timer wäre das ganze etwas
genauer, aber darauf kommts mir noch nicht an, ich muss erstmal lernen,
mit dem Timer umzugehen.
Wenn jetzt jemandem was auffällt, was ich besser machen kann, kann er
sich gerne dazu äußern.
Grüße
FoxAlpha
(irgendwie hat das mit dem posten das erste mal nicht geklappt, deswegen
nochmal...)
So, hier bin ich nochmal mit code... unschwer zu erkennen, möchte ich
erstmal assemblerprogrammierung lernen/üben.
Portb setze ich als Ausgang und nulle den erstmal. Dann kommt der
waveform generation mode als fast PWM mit OCR0A als TOP dran (und weil
OCR0A = TOP, ist bei dem WGM OC0A immer gesetzt, OC0B dient als
eigentliches Signal). OCR0x werden mit Zahlenwerten gefüttert, dann der
Prescaler und der "Rest" vom WGM. Die Interrupts hab ich mal
eingeschaltet, weiß der Geier, ob das notwendig ist...
Ziel des ganzen ist die Ansteuerung eines Modellbauservos. Zum
Simulieren steht der Prescaler noch auf 1, später mit prescaler 1024
kommt eine Frequenz von ca. 50Hz raus, an PB4 (OC0B) sollte dann ein
PWM-Signal mit einem 20ms-Takt und rund 1,5ms "Ein"-Zeit rauskommen
(Mittenstellung Servo). Mit dem 16bit Timer wäre das ganze etwas
genauer, aber darauf kommts mir noch nicht an, ich muss erstmal lernen,
mit dem Timer umzugehen.
Wenn jetzt jemandem was auffällt, was ich besser machen kann, kann er
sich gerne dazu äußern.
Grüße
FoxAlpha
So, hier bin ich nochmal mit code... unschwer zu erkennen, möchte ich
erstmal assemblerprogrammierung lernen/üben.
Portb setze ich als Ausgang und nulle den erstmal. Dann kommt der
waveform generation mode als fast PWM mit OCR0A als TOP dran (und weil
OCR0A = TOP, ist bei dem WGM OC0A immer gesetzt, OC0B dient als
eigentliches Signal). OCR0x werden mit Zahlenwerten gefüttert, dann der
Prescaler und der "Rest" vom WGM. Die Interrupts hab ich mal
eingeschaltet, weiß der Geier, ob das notwendig ist...
Ziel des ganzen ist die Ansteuerung eines Modellbauservos. Zum
Simulieren steht der Prescaler noch auf 1, später mit prescaler 1024
kommt eine Frequenz von ca. 50Hz raus, an PB4 (OC0B) sollte dann ein
PWM-Signal mit einem 20ms-Takt und rund 1,5ms "Ein"-Zeit rauskommen
(Mittenstellung Servo). Mit dem 16bit Timer wäre das ganze etwas
genauer, aber darauf kommts mir noch nicht an, ich muss erstmal lernen,
mit dem Timer umzugehen.
Wenn jetzt jemandem was auffällt, was ich besser machen kann, kann er
sich gerne dazu äußern.
Grüße
FoxAlpha
Doofe Frage: Hast du schon Hardware oder schaust du im AVRStudio auf die
Bits in PORTB? In PORTB tut sich nämlich nichts, der Pin wird "an PORTB
vorbei" gesetzt bzw. gelöscht.
Siehe auch http://atmel.com/dyn/resources/prod_documents/doc8246.pdf
Bild 11-4.
Zu deiner Frage bezüglich Interrupts: Braucht man nicht. Würde ich auch
dafür nicht aktivieren, ist eine zusätzliche Fehlerquelle - denn ohne
ISR macht der Controller unter Umständen dumme Sachen ;)
In deinem Programm ist das aber egal, denn du setzt das globale IRQ-Flag
nicht.
MfG, Heiko
Guten Morgen allerseits,
die richtige Frage wäre gewesen: "Schaust du auch auf die richtigen
Ports?" Ich habe erst späääät festgestellt, dass OC0B ja in PORTD steckt
und nicht in PortB... /*aua/*
Plötzlich funktioniert alles wie es soll. ;) Sorry für die blöden
Fragen.
Grüße
FoxAlpha