AVR: 4 Timer im CTC mit Mega162?

Gast #714326
Hallo,

kann man mit den beiden 16-Bit Timern (Timer 1 und 3 beim mega162) 4 
verschiedene CTC realisieren? Ich habe nämlich mal als Testprogramm 
beide Timer auf CTC eingestellt mit verschiedenen Vorteilern, Timer 1 
PRSC=1024 und Timer 3 PRSC=1. Um dann 4 CTC's zu realisieren, können 
beide Kanäle (A und B) jeweils eines Timers mit verschiedenen 
Compare-Match-Werten gealden werden. Somit wären 4 CTC's da, nämlich aus 
Timer:

1A, Vorteiler = 1024, OCR1A = 7199, Interrupt alle 1 Sek.
1B, Vorteiler = 1024, OCR1B = 7, Int. alle 1 ms
3A, Vorteiler = 1, OCR3A = 737, Int. alle 100 µs
3B, Vorteiler = 1, OCR3B = 7680, Int. alle 1,04 ms

Um zu sehen, ob dem wirklich so ist, habe ich in jeder zugehörigen ISR 
einen Port getoggled. Die ISR zum Timer 1A toggled Portpin PA0, Timer 1B 
toggled Portpin PB0, Timer 3A Portpin PC0 und Timer 3B Portpin PD7.

Ergebnis: Port A und B (jewels nur eine LED an PA0 und PB0) machen einen 
Wechselblinker im Sekundentakt, LED an PC0 "blinkt" im 100µs Takt (ok!) 
und die LED an PD7 (PD0 ist serielle Schnitte & belegt) macht garnix.

Der Quarz hat übrigens ein 7,372800 MHz.

Das Proggi dazu, komplett
1
#include <stdio.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
ISR(SIG_OUTPUT_COMPARE1A)
6
{ PORTA = ~PORTA; }
7

8
ISR(SIG_OUTPUT_COMPARE1B)
9
{ PORTB = ~PORTB; }
10

11
ISR(SIG_OUTPUT_COMPARE3A)
12
{ PORTC = ~PORTC; }
13

14
ISR(SIG_OUTPUT_COMPARE3B)
15
{ PORTD = ~PORTD; }
16

17
int main(void)
18
{
19
  OCR1A  = 7190;
20
  OCR1B  = 7;
21
  TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);  // Prescaler = 1024, CTC Modus
22

23
  OCR3A  = 737;  // Compare Match Register Timer 3A, 0,1 ms @7.3728MHz
24
  OCR3B  = 7680; // Compare Match Register Timer 3B, 1,0 ms @7.3728MHz
25
  TCCR3B = (1<<WGM32) | (1<<CS30);  // Prescaler = 1, CTC Modus  
26

27
  TIMSK  = (1<<OCIE1A) | (1<<OCIE1B); // Int. freigeben
28
  ETIMSK = (1<<OCIE3A) | (1<<OCIE3B);
29

30
  DDRA  = 0x0F;  // Portpins auf Ausgang
31
  DDRB  = 0x01;
32
  DDRC  = 0xFF;
33
  DDRD  = 0xF0;
34
  PORTA = 0;
35
  PORTB = 0;
36
  PORTC = 0;
37
  PORTD = 0;
38

39
  sei();
40

41
  while(1)
42
   ;
43
  return 0;
44
}
Warum verhält nur der Portpin PA0 und PC0 richtig? Warum blinkt PB0 mit 
PA0 mit, aber invertiert? Warum mach PD7 nix?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.