ATmega32 Timer2 Frequenz anpassen

Gast #4528729
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.
Gast #4528806
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.
Gast #4528830
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.
Gast #4528840
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.
#4528897
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.

...
Angehängte Dateien:
Gast #4528919
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?
#4528944
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
;-)

...
Gast #4528947
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);
}
Gast #4529027
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.

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