mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Mit Timer1 Attiny25


Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht 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:
void init_timer(void)
{
  TCCR1 |= (1 << CS10);
  GTCCR |= ((1 << PWM1B) | (1 << COM1B0));
  OCR1C = 222;
  OCR1B = 111;
}

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

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat mir geholfen:
Beitrag "ATTiny45 PWM Counter 1"

GIDF :)

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Claudio H. (hedie)
Datum:

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

Autor: Chris (Gast)
Datum:

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

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

Autor: Chris (Gast)
Datum:

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

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur zur Sicherheit: das CKDIV8-Fuse berücksichtigt?

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Claudio Hediger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <util/delay.h>

void setup(void)
{
  DDRB = (1 << DDB4);  // Ausgänge konfigurieren
  DDRB &= ~( 1 << DDB3 );  //Taster Eingänge konfigurieren
  DDRB &= ~( 1 << DDB2 );  //Taster Eingänge konfigurieren
}

void init_timer(void)
{
  TCCR1 |= (1 << CS10);
  GTCCR |= ((1 << PWM1B) | (1 << COM1B0));
  OCR1C = 127;
  OCR1A = 127;
  OCR1B = 127;
}

int main(void)
{
  setup();
  init_timer();

  while(1);
}


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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Claudio Hediger (Gast)
Datum:

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

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt, Einfach OCR1B auf 0 setzen :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Alex v. Grafenstein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nn Nn (jaytharevo)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.