www.mikrocontroller.net

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


Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(SIG_OUTPUT_COMPARE1A)
{ PORTA = ~PORTA; }

ISR(SIG_OUTPUT_COMPARE1B)
{ PORTB = ~PORTB; }

ISR(SIG_OUTPUT_COMPARE3A)
{ PORTC = ~PORTC; }

ISR(SIG_OUTPUT_COMPARE3B)
{ PORTD = ~PORTD; }

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

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

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

  DDRA  = 0x0F;  // Portpins auf Ausgang
  DDRB  = 0x01;
  DDRC  = 0xFF;
  DDRD  = 0xF0;
  PORTA = 0;
  PORTB = 0;
  PORTC = 0;
  PORTD = 0;

  sei();

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.