Forum: Mikrocontroller und Digitale Elektronik ATmega32 Timer2 Frequenz anpassen


von Peter (Gast)


Lesenswert?

Hallo Leute,
habe ein Problem. Ich versuche ein Rechtecksignal am OC2 zu erzeugen. 
Die Frequenz will ich verändern können von 1 bis 100 Hz. Muss alles 
nicht so besonders genau sein! Problem ich weiß nicht wie man den MAX 
value verstellt. Beim Timer 1 mit OC1A und OC1B kein Problem. Aber wie 
mache ich es beim Timer2?
Das habe ich:
.
.
.
void init(void)
{
  TCCR2 =  (1<<WGM20) | (1<<COM21) | (1<<CS22) | (1<<CS21);
}
.
.
.
OCR2=variable;


die Variable kann ich ohne Problem verändern um einen beliebigen 
Tastgrad einzustellen. Ich habe mit dem TCNT2 Register herumprobiert. 
Komme aber auch nicht darauf für was dieses Register ist.
Hoffe mir kann jemand helfen.

von Hannes L. (hannes)


Lesenswert?

Peter schrieb:
> Hoffe mir kann jemand helfen.

Ja, das Datenblatt. Da sind alle Register und deren Bits genauestens 
erklärt.

...

von Peter (Gast)


Lesenswert?

Im Datenblatt habe ich natürlich nachgeschaut! Ich kann aber nichts über 
den Max value finden. Beim Timer1 habe ich das über OCR1A und B gelöst. 
Welche alternative gibt es beim Timer2?

von Karl M. (Gast)


Lesenswert?

Peter schrieb:
> Im Datenblatt habe ich natürlich nachgeschaut! Ich kann aber
> nichts über
> den Max value finden. Beim Timer1 habe ich das über OCR1A und B gelöst.
> Welche alternative gibt es beim Timer2?

hängt vom verwenden Timer Modus ab, dafür steht im DB eine Formel und 
diese kann man einfach umstellen.

Werde also bitte etwas genauer.

von Karl M. (Gast)


Lesenswert?

Und die Anforderung ist PWM Tastgrad und Frequenz ?

von Peter (Gast)


Lesenswert?

Ja genau Tastgrad und Frequenz.
Befinde mich im Mode 1:  PWM, Phase Correct
Bei Timer 1 funktioniert das so. Bei Timer 2 weiß ich es nicht. Über den 
CTC Mode könnte es eventuell gehen jedoch bekomme ich den nicht zum 
laufen.

von Tau Ceti Mu (Gast)


Lesenswert?

Peter schrieb:
> Ja genau Tastgrad und Frequenz.

Öh ... Aha.

> [...]
> Über den
> CTC Mode könnte es eventuell gehen jedoch bekomme ich den nicht zum
> laufen.


Ach soooo. Ja, das ist doch kein Wunder. Wir haben Halbmond, Mensch.

Genaue Datenblattlektüre, Problemanalyse, etcpp. helfen erst wieder bei 
Vollmond. Aber Vorsicht: Immer ein Blättchen Waldmeister dabei haben. 
Sonst gibts Schorf.

von Tau Ceti Mu (Gast)


Lesenswert?

OK. Da habe ich mir mit viel Mühe und Selbstverleugnung dieses 
intellektuelle Gelaber abgequetscht.

Meine wahre Ansicht: Ääääätsch!

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Peter schrieb:
> Bei Timer 2 weiß ich es nicht. Über den
> CTC Mode könnte es eventuell gehen

Was ist an dieser Tabelle nicht zu verstehen?

Mode 2, CTC, Zählumfang (Periode, Kehrwert der Frequenz) in OCR2. 
Tastgrad gibt es nicht, da Timer2 nur ein OCR-Register hat. Pech gehabt, 
falscher Controller. Du kannst nur das benutzen, was Du auch gekauft 
hast. Mit dem Nachfolger ATmega324 sollte das gehen, der hat zwei 
Compare-Einheiten an Timer2.

...

von Peter (Gast)


Lesenswert?

Dann will ich wenigstens die veränderbare Frequenz im CTC hinbekommen.

Wenn ich im CTC Mode die compare interrupt Einheit zulassen will also:
TIMSK |= (1<<OCIE2);
Stürtzt immer genau an dem Punkt mein LCD ab. Woran kann das liegen?

von Bastian W. (jackfrost)


Lesenswert?

Meinst du nicht das es sehr schwer ist dir zu helfen wenn du deine Code 
hier nicht postest ?

Die Kristallkugel ist leider derzeit defekt.

Und ohne den Code ist immer Zeile 42 schuld, ist halt so.


Gruß JackFrost

von Hannes L. (hannes)


Lesenswert?

Bastian W. schrieb:
> ist immer Zeile 42 schuld,

???

Auch bei einem 20-Zeiler?
1
;Datumsdifferenz
2
If OpenWindow(0, 0, 0, 430, 255, "Datumsdifferenz...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
3
  CalendarGadget(1,10,30,200,180)  
4
  CalendarGadget(2,220,30,200,180)  
5
  TextGadget(3,10,220,410,25,"",#PB_Text_Border|#PB_Text_Center)
6
  TextGadget(4,10,5,200,25,"Von",#PB_Text_Center)
7
  TextGadget(5,210,5,200,25,"Bis",#PB_Text_Center)
8
  Repeat                            ;Hauptschleife
9
    Event = WaitWindowEvent(20)     ;Ereignis (Benutzerhandlung) sichern
10
    evnu=EventGadget()              ;Nummer des bedienten Schaltelements sichern
11
    If Event =#PB_Event_Gadget      ;wurde eine Schaltfläche betätigt?
12
      Select evnu                   ;ja, welche Schaltfläche wurde betätigt?
13
        Case 1,2
14
          diff=(GetGadgetState(2)/86400)-(GetGadgetState(1)/86400)
15
          SetGadgetText(3,"Differenz = "+Str(diff)+" Tage...")
16
      EndSelect
17
    EndIf
18
  Until Event = #PB_Event_CloseWindow       ;Ende Hauptschleife
19
EndIf                                       ;Programm-Fenster wurde geschlossen
20
End                                         ;Programmende
;-)

...

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Hast Reecht! Hier der Code. Habe alles relevante drinne denk ich. Wollte 
nicht alles reinmachen der ist lang...
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/io.h>
#include "lcd-routines.h"
#include <stdint.h>
#include <stdio.h>
#include <avr/interrupt.h>
.
.   // Prototypen Unterprogramme
.
int main(void)
{
.   // Unterprogramme zum initialisieren von ports lcd usw.
.
.
sei();
while(1)
  {
.
.     // Hauptprogramm
.
}}
void init_timer2(void)
{
  TCCR2 = (1<<WGM21) | (1<<COM21) | (1<<CS22) | (1<<CS21) | (1<<CS20);
  TIMSK |= (1<<OCIE2);
}
void paket(...)
{
OCR2=variable;    // variable wird aus adc0 und anderen faktoren 
berechnet und liegt zwischen 0 und 255.
}

ISR (TIMER2_COMP_vect)
{
  PORTD ^= (1<<PD7);
}

von Tau Ceti Mu (Gast)


Lesenswert?

Seufz. Na gut. Hier ist jede Ironie fehl am Platze. DU DEPP!

von Hannes L. (hannes)


Lesenswert?

Peter schrieb:
> Die Frequenz will ich verändern können von 1 bis 100 Hz.

Das sollte man eigentlich ganz gut in Software hinbekommen. Also 
(zeitmäßig gesehen) kleinstes gemeinsames Vielfaches mit Timer erzeugen 
und Periodendauer und Tastgrad daraus abzählen.

Tau Ceti Mu schrieb:
> DU DEPP!

Sowas sagt man nicht, da muss jeder Betroffene selbst drauf kommen...
;-)

...

von Tau Ceti Mu (Gast)


Lesenswert?

Hannes L. schrieb:
[...]
> Tau Ceti Mu schrieb:
>> DU DEPP!
>
> Sowas sagt man nicht, da muss jeder Betroffene selbst drauf kommen...
> ;-)

Bin ich doch! Darauf gekommen, meine ich.

von Hannes L. (hannes)


Lesenswert?

Tau Ceti Mu schrieb:
> Bin ich doch! Darauf gekommen, meine ich.

Achso, aber woher sollte ich wissen, dass Du das "DU" in der ersten 
Person gemeint hast... ;-)

...

von Tau Ceti Mu (Gast)


Lesenswert?

Hannes L. schrieb:
> Tau Ceti Mu schrieb:
>> Bin ich doch! Darauf gekommen, meine ich.
>
> Achso, aber woher sollte ich wissen, dass Du das "DU" in der ersten
> Person gemeint hast... ;-)

Nun, das konntest Du so verstehen und doch konnte und kann Dir, von 
jedem Verständigen, alle nötige und tunliche Sorgfalt beim lesen und 
erfassen des Geschriebenen nachgesagt und bescheinigt werden.

Die Sprache jedoch, ist ein trügerisches Ding, die das, was uns klar 
scheint, verbergen und was uns verborgen scheint, klar erscheinen lassen 
kann.

Ein wenig zusätzliche Beleuchtung schien mir angebracht.

von Hannes L. (hannes)


Lesenswert?

Tau Ceti Mu schrieb:
> Die Sprache jedoch, ist ein trügerisches Ding,

Das ist wohl wahr!

Schönen ersten April noch und schönes Wochenende...

...

von Tau Ceti Mu (Gast)


Lesenswert?

Mist. Keiner will mit mir spielen.

von Tau Ceti Mu (Gast)


Lesenswert?

Spiel ich halt mit mir selbst. Wohlgemerkt, "mit mir", ihr kleinen 
Dreckfinken.

von Bastian W. (jackfrost)


Lesenswert?

Peter schrieb:
> Hast Reecht! Hier der Code. Habe alles relevante drinne denk ich. Wollte
> nicht alles reinmachen der ist lang...



Wenn der Code recht lang ist dann häng einfach die C/CPP Datei + Header 
an den post dran. Leider ist der Fehler oft in dem Teil der nicht 
gepostet ist.

Gruß JackFrost

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.