Hallo
Ich versuche mit dem Attiny25 ein 36Khz Rechteck signal zu erzeugen.
Dazu wollte ich den internen Timer verwenden. Das Signal soll an PB4
(OC1B) ausgegeben werden.
Mein Code sieht bisher so aus:
1
voidinit_timer(void)
2
{
3
TCCR1|=(1<<CS10);
4
GTCCR|=((1<<PWM1B)|(1<<COM1B0));
5
OCR1C=222;
6
OCR1B=111;
7
}
Doch irgendwie läuft das ganze nicht...
Der Attiny läuft mir 8MHz Intern die CLKDIV Fuse ist nicht gesetzt
Ich habe den Wert auf 222 gsetzt, da 8MHz / 222 36Khz ergibt
Ich habe das so verstanden, das der Zähler bis zum Wert von OCR1C zählt.
Somit wäre die Frequenz ja genau 36Khz und der Pin sollte bei 111 also
in der Hälfte getoggelt werden...
Vielleicht sieht jemand den Fehler
Danke schonmal
Claudio Hediger schrieb:> Doch irgendwie läuft das ganze nicht...
Was heißt das konkret?
Kriegst du überhaupt einen Output?
Hat der die falsche Frequenz?
Oder wie, oder was?
Karl heinz Buchegger schrieb:> Was heißt das konkret?>> Kriegst du überhaupt einen Output?> Hat der die falsche Frequenz?>> Oder wie, oder was?
Es kommt überhaupt nichts raus
ich Initialisieren Den Pin zuvor folgendermaßen
Joachim B. schrieb:> Nur zur Sicherheit: das CKDIV8-Fuse berücksichtigt?
Ja ist berücksichtigt
bzw. nicht gesetzt also gelöscht somit 8MHz...
Aber es kommt rein gar nichts am Pin heraus
Claudio Hediger schrieb:> Aber es kommt rein gar nichts am Pin heraus
Wie hast du das festgestellt? hast du ein Scope da/kannst du einen
Screenshot posten?
Und zeig mal den Rest des Programms, da kann ja auch noch ein Wurm drin
sein. Das sollte ja zum Test auf die Konfig und eine while(1)-Schleife
beschränkt sein...
Joachim B. schrieb:> Das hat mir geholfen:> Beitrag "ATTiny45 PWM Counter 1">> GIDF :)>> Gruß
Leider hatte dieser da auch Probleme mit dem PB4 und ist deshalb auf
einen anderen Port Pin umgestiegen.
Von daher nützt es mir nicht viel
Claudio Hediger schrieb:> bzw. nicht gesetzt also gelöscht somit 8MHz..
genau falschrum :)
klar, nicht gesetzt heißt gelöscht, aber damit ist es aktiviert.
Joachim B. schrieb:> klar, nicht gesetzt heißt gelöscht, aber damit ist es aktiviert.
Hmmm
Also wenn ich im AVR Studio das Häkchen bei CLKDIV rein mache und
programmiere, laufen meine Programme 8 mal langsamer als wenn kein
Häkchen drin ist.
Bei diesem Attiny ist es nicht gesetzt.
Hier der gesamte code
1
#include<avr/io.h>
2
#include<util/delay.h>
3
4
voidsetup(void)
5
{
6
DDRB=(1<<DDB4);// Ausgänge konfigurieren
7
DDRB&=~(1<<DDB3);//Taster Eingänge konfigurieren
8
DDRB&=~(1<<DDB2);//Taster Eingänge konfigurieren
9
}
10
11
voidinit_timer(void)
12
{
13
TCCR1|=(1<<CS10);
14
GTCCR|=((1<<PWM1B)|(1<<COM1B0));
15
OCR1C=127;
16
OCR1A=127;
17
OCR1B=127;
18
}
19
20
intmain(void)
21
{
22
setup();
23
init_timer();
24
25
while(1);
26
}
Joachim B. schrieb:> Wie hast du das festgestellt? hast du ein Scope da/kannst du einen> Screenshot posten?
Ja kann ich, siehe Anhang
Der Ausgang ist einfach immer High!
Claudio Hediger schrieb:> Hier der gesamte code
Danke.
Also auf Anhieb fällt mir da nichts auf. Dieselben Bits hätt ich laut
Datenblatt auch gesetzt.
> void init_timer(void)> {> TCCR1 |= (1 << CS10);> GTCCR |= ((1 << PWM1B) | (1 << COM1B0));> OCR1C = 127;> OCR1A = 127;> OCR1B = 127;> }
Dreh da mal ein bischen um.
Getreu dem Motto: Erst die Register setzen, dann erst einschalten
(Aber viel versprech ich mir nicht davon, ich sags lieber gleich)
void init_timer(void)
{
OCR1C = 127;
OCR1A = 64;
OCR1B = 64;
GTCCR = ((1 << PWM1B) | (1 << COM1B0));
TCCR1 = (1 << CS10);
}
Warum eigentlich alle Register auf 127?
Claudio Hediger schrieb:> Also wenn ich im AVR Studio das Häkchen bei CLKDIV rein mache und> programmiere, laufen meine Programme 8 mal langsamer als wenn kein> Häkchen drin ist.
Hihi, AVR Studio interpretiert die Fuses auch wieder invertiert. Damit
versucht es dem Benutzer die Verwirrung zu ersparen. Wenn du das Häkchen
dort setzt LÖSCHT du das Bit (Funktion aktiviert) und umgekehrt.
Ich seh grad, daß mein Datenblatt fehlerhaft ist (03/08). Doof...
Claudio Hediger schrieb:> Der Ausgang ist einfach immer High!
hm, also wenn deine Versorgungsspannung 5V sein sollten, dann ist der
Ausgang garnix :) . Ich seh da 1,6V oder so...
Eigentlich konfiguriert man die Timer auch erstmal fertig, bevor man sie
startet. Du machst das anders. Hast du einen Kondensator am Ausgang, so
daß du die PWM weggefiltert hast?
Karl heinz Buchegger schrieb:> Warum eigentlich alle Register auf 127?
Vielen Dank!!!!!
Das war das problem :)
Im Datenblatt steht, das wenn
OCR1C und OCR1B den selben wert haben, immer ein High ausgegeben wird!!!
Es läuft nun perfekt :)
Vielen Vielen Dank euch allen...
Joachim B. schrieb:> hm, also wenn deine Versorgungsspannung 5V sein sollten, dann ist der> Ausgang garnix :) . Ich seh da 1,6V oder so...
Ja meine Versorgungsspannung ist 5V weshalb da 1.6V drin steht ist mir
auch rätselhaft. Entscheidend sind die V/Div und diese sind 2V bei 2.5
Häusschen ergibt dies genau 5V :)
@Karl Heinz:
daß es jetzt geht ist ja gut, aber hätte es nicht vorher auch gehen
müssen, da waren seine Werte ja auch unterschiedlich (222 und 111)...
oder wo verguck ich mich grad?
Joachim B. schrieb:> daß es jetzt geht ist ja gut, aber hätte es nicht vorher auch gehen> müssen, da waren seine Werte ja auch unterschiedlich (222 und 111)...> oder wo verguck ich mich grad?
Da hast du recht, jedoch hab ich da die Register noch nicht umgestellt
gehabt...
Claudio Hediger schrieb:>> müssen, da waren seine Werte ja auch unterschiedlich (222 und 111)...>> oder wo verguck ich mich grad?>> Da hast du recht, jedoch hab ich da die Register noch nicht umgestellt> gehabt...
Das heißt, die Registerumstellerei war tatsächlich wichtig?
(Sie ist logisch. Aber eigentlich kann man ja auch im Nachhinein das TOP
Register immer noch ändern. Was allerdings passiert, wenn dieses 0
enthält wenn die PWM eingeschaltet wird, das könnte interessant sein)
Karl heinz Buchegger schrieb:> Was allerdings passiert, wenn dieses 0> enthält wenn die PWM eingeschaltet wird, das könnte interessant sein
Soweit ich mich erinner, läuft der Timer dann mit halber
Taktfrequenz/prescaler. Steht auf jeden Fall in den Datenblättern
explizit drin, was dann passiert.
Gruß, Alex