Forum: Mikrocontroller und Digitale Elektronik PWM Mit Timer1 Attiny25


von C. H. (hedie)


Lesenswert?

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
void init_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

von Joachim B. (jojo84)


Lesenswert?

Das hat mir geholfen:
Beitrag "ATTiny45 PWM Counter 1"

GIDF :)

Gruß

von Karl H. (kbuchegg)


Lesenswert?

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?

von C. H. (hedie)


Lesenswert?

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
1
DDRB = (1 << DDB4);  //Ausgänge konfigurieren

von Chris (Gast)


Lesenswert?

Claudio Hediger schrieb:
> DDRB = (1 << DDB4);  //Ausgänge konfigurieren

Soll wohl DDRB = (1 << PB4);
heißen oder?

von Chris (Gast)


Lesenswert?

Sorry nimm es zurück, habe es verwechselt ist schon spät am Abend :)

von Joachim B. (jojo84)


Lesenswert?

Nur zur Sicherheit: das CKDIV8-Fuse berücksichtigt?

von Claudio Hediger (Gast)


Lesenswert?

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

von Joachim B. (jojo84)


Lesenswert?

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...

von Claudio Hediger (Gast)


Lesenswert?

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

von Joachim B. (jojo84)


Lesenswert?

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.

von Claudio Hediger (Gast)


Angehängte Dateien:

Lesenswert?

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
void setup(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
void init_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
int main(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!

von Karl H. (kbuchegg)


Lesenswert?

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?

von Joachim B. (jojo84)


Lesenswert?

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?

von Claudio Hediger (Gast)


Lesenswert?

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 :)

von Joachim B. (jojo84)


Lesenswert?

@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?

von Claudio Hediger (Gast)


Lesenswert?

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...

von Claudio Hediger (Gast)


Lesenswert?

Weiss vielleicht noch jemand, wie ich den Ausgangspin wieder auf low 
setzen kann? Direkter zugriff mit PORTB geht nicht.

von Claudio Hediger (Gast)


Lesenswert?

Hat sich erledigt, Einfach OCR1B auf 0 setzen :)

von Karl H. (kbuchegg)


Lesenswert?

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)

von Alex v. Grafenstein (Gast)


Lesenswert?

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

von Nn N. (jaytharevo)


Lesenswert?

Hast du es noch ein mal mit den Werten 222 und 111 probiert? Also 
nachdem es schon einmal funktioniert hat.

von spess53 (Gast)


Lesenswert?

Hi

Wie sehen die CKSEL-Fuses aus? Bei CKSEL[3:0]=0011 läuft der ATTiny25 im 
'ATtiny15 Compatibility Mode'. Und da ist einiges anders.

MfG Spess

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.