PWM Mit Timer1 Attiny25

OP #1975672
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
Gast #1975760
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!
Angehängte Dateien:
#1975769
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?
#1975777
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?
Gast #1975782
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 :)
#1975924
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren