Forum: Mikrocontroller und Digitale Elektronik CTC Modus kleines Beispiel


von CTC (Gast)


Lesenswert?

Hallo

hat zufällig jemand ein kleines Beispiel für den CTC Modus um einfach 
Impulse
zu erzeugen?
bin gerade bei diesem Thema und versuch emich einzuarbeiten, aber ohne 
konkrete beispiele ( C-Code) fällt es mir schwer zu verstehen.

Gruss
C.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Der CTC-Modus hat ja erst einmal nicht viel mit der Impulsgenerierung
zu tun.  CTC bedeutet nur, dass man den Timer per Hardware beim
Erreichen eines bestimmten Zählerstandes zurück setzt und damit die
Zählweite verkürzt.

Den Begriff CTC kenne ich nur vom AVR (in dieser Bedeutung -- beim Z80
war es der "counter timer circuit"), insofern solltest du wohl mal
genauer sagen, welchen AVR du benutzen willst und was für eine
Impulsfolge du haben möchtest.

Ob du das in C oder Assembler programmieren willst, ist dabei praktisch
wurscht: die Programmierung beschränkt sich im Wesentlich auf das
Setzen diverser IO-Register.

von Stefan N. (nollsen)


Lesenswert?

hi,

ich glaube es ist nicht möglich hier ein beispiel zu zeigen das genau 
das zeigt was du möchtest.

wenn du einen timer konfigurieren möchtest, dann geh in das datenblatt 
undschau die entsprechenden Register an. dann gehe alle register durch, 
und schau bei jedem bit die beschreibung an und überlege ob du das 
brauchst.

dass du trotzdem ein beispiel hast,
dies ist ein ctc timer der mit einem extra quarz 256 interrupts die 
sekunde auslöst:
  ASSR |= _BV(AS2);
  TCNT2 = 0; loop_until_bit_is_clear(ASSR, TCN2UB);
  OCR2A = TIMER_DIVIDER;   loop_until_bit_is_clear(ASSR, OCR2AUB);
  TCCR2A  = _BV(WGM21);   loop_until_bit_is_clear(ASSR, TCR2AUB);
  // prescaler /8
  TCCR2B  = _BV(CS21); loop_until_bit_is_clear(ASSR, TCR2BUB);
  TIMSK2 |= _BV(OCIE2A)  ;


ISR(TIMER2_COMPA_vect)
{
}

von ctc (Gast)


Lesenswert?

Hallo

ich verwende einen Atmega8L und möchte Impulse in der Grössenordnung 5 
ms erzeugen.

habe versucht das datenblatt zu verstehen aber, das wird man wohl erst 
verstehen, wenn man es fertig hat ;) zumindest ist es bei mir so....erst 
im nachhinein macht es oft Klick.

Wie würdet ihr s machen wenn ihr 5ms (also 2,5 ms High Potential und 2,5 
ms Low Poetential) erzeugen wolttet  mt de ctc modus?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Frage ist unvollständig solange du nicht die Taktrate nennst.

von spess53 (Gast)


Lesenswert?

Hi

>Wie würdet ihr s machen wenn ihr 5ms (also 2,5 ms High Potential und 2,5
>ms Low Poetential) erzeugen wolttet  mt de ctc modus?

Wie wäre es mit mit ein paar Angaben: Controller,Timer,Taktfrequenz...

MfG Spess

von ctc (Gast)


Lesenswert?

ohh sorry :P

Atmega8L
Interner RC: 1000.000 Hz
Timer2 (oder Timer0)

Hoffe das reicht.

Grüsse aus NRW

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

2,5 ms lassen sich nicht exakt mit einem 8-bit-Timer bei 1 MHz
erzeugen, zumindest nicht auf einfache Weise.
1
#include <avr/io.h>
2
3
#define F_CPU 1000000ul
4
5
static void
6
timerinit(void)
7
{
8
  OCR2 = (F_CPU / 32 / 400) - 1;
9
  TCCR2 = _BV(WGM21) /* CTC */ |
10
    _BV(COM20) /* toggle OC2 on compare match */ |
11
    _BV(CS21) | _BV(CS20) /* f_cpu / 32 */;
12
  DDRB = _BV(PB3); /* OC2 as output */
13
}

von Johannes M. (johnny-m)


Lesenswert?

ctc wrote:
> Timer2 (oder Timer0)
Timer 0 kann beim ATMega8 kein CTC. Ansonsten solltest Du Dir im 
AVR-GCC-Tutorial das Kapitel Timer mal ansehen. Da steht, wie's 
geht.

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.