Forum: Mikrocontroller und Digitale Elektronik AVR: 4 Timer im CTC mit Mega162?


von Hegy (Gast)


Lesenswert?

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?

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.