CTC-Modus, Frage zum GCC-Tutorial

Gast #2900189
Lesenswert?
• ▲
▼
Im GCC-Tutorial für AVR´s steht bei "Die Timer und Zähler" beim 
CTC-Modus:

"... und einer der OCnx-Pins so gesetzt werden, dass er bei Auftreten 
des Compare Match getoggelt wird (über die COM-Bits). ... "

Ich verstehe leider grad nicht, was damit gemeint ist bwz. was ich 
setzen soll/muss?

Atmega88 und 16-Bit-Timer möchte ich verwenden.

Falls mir da jemand helfen kann, würd ich mich drüber freuen.
Gast #2900218
Lesenswert?
• ▲
▼
ok, danke fr die Antwort. Ich bin mir nicht so sicher gewesen. Ich 
dachte erst, mit "toggeln" (umschalten) ist gemeint, dass ich vielleicht 
draußen zwischen zwei Pins eine Kontaktbrücke herstellen muss.
Gast #2900226
Lesenswert?
• ▲
▼
Anfänger schrieb:
> Ich verstehe leider grad nicht, was damit gemeint ist bwz. was ich
> setzen soll/muss?

Die OC-Register sind im Prinzip Weckzeiten: Wenn der Timer den gleichen 
Wert hat, wie das OC-Register, dann gibt es einen "Alarm" in Form 
gesetzter Flags. Unter Umständen wird dann auch eine ISR aufgerufen.

Togglen bedeutet, dass ein Ausgang umgeschaltet wird.
Jedes Mal, wenn ein Ereignis eintritt, wird der Ausgangszustand geändert 
(Da binär, immer nur zwischen "an" und "aus").

Wenn also ein OC-Ereignis eintritt, wird der Ausgang in den anderen 
Zustand geschaltet - jedes Mal.
Gast #2900317
Lesenswert?
• ▲
▼
In C gibt es im Gegensatz zu Assembler manchmal:

OCR1A

und

OCR1AH
OCR1AL

Meine Frage - OCR1A(L/H) brauch ich doch nur dierekt in Assembler, da 
ich dort immer nur in 8bit-Schritten mit Registern zuweisen kann?

In C kann ich dann einfach mit ORC1A einen 16bit-Wert zuweisen? ORC1A 
gibt es dann auch nur unter C, oder?
Gast #2900520
Lesenswert?
• ▲
▼
Hab noch ne Frage:

Datenblatt Atmega88:
0x00B rjmp TIM1_COMPA ; Timer1 Compare A Handler
0x00C rjmp TIM1_COMPB ; Timer1 Compare B Handler

bedeutet dass, dass ich beim Atmega88 im Timer1 das, wie es im 
GCC-Tutorial beschrieben ist - mit zwei Compare-Interrupts machen, 
einen, der dann zb alle 100ms auslöst und der andere dann alle 10ms, je 
nach eingestelltem OCR1(A/B)-Wert?
Gast #2900563
Lesenswert?
• ▲
▼
Dass ist mal mein Programmierversuch, meint ihr, dass ist so ok?

Irgendwas soll einmal jede Minute gemacht werden. Dies steht dann in der 
IF-Abfrage in der Dauerschleife in der main-Funktion.
1
#ifndef F_CPU
2
#define F_CPU 1000000UL    // Prozessorgeschwindigkeit
3
#endif
4

5
// Prescaler (bei 16MHz F_CPU und 100Hz F_OC) = 256 (dann runder Wert!!!)
6
// Prescaler (bei  1Mhz F_CPU und 100Hz F-OC) =   8 (dann runder Wert!!!)
7
#define PRESCALER 8UL
8
#define F_OC 100UL // 100Hz (alle 10ms)
9
#define OCR1A_berechnet (F_CPU/(PRESCALER*F_OC))-1;
10

11
#include <avr/io.h>
12
#include <avr/interrupt.h>
13
#include <util/atomic.h>
14

15
volatile uint8_t zaehler = 0;
16

17
// eígenes Flag
18
volatile uint8_t eigen_flag = 0x00;
19
#define ZAEHLERFLAG 1
20
#define ZAEHLERFLAG_BIT (1<<ZAEHLERFLAG)
21

22
ISR (TIMER1_COMPA_vect)
23
{
24
  zaehler++;
25
  
26
  if (zaehler == 100) {
27
    eigen_flag |= ZAEHLERFLAG_BIT;
28
    zaehler = 0;
29
  }  
30
  
31
} // Ende ISR (TIMER1_COMPA_vect)
32

33
int main(void)
34
{
35
  // Timer1 konfigurieren
36
  TCCR1B |= (1<<CS11) | (1<<CS10);  //Prescaler 8: CS12=0 CS11=1 CS10=1   Prescaler 256: CS12=1 CS11=0 CS10=0
37
  TCCR1B &= ~(1<<CS12);
38
  OCR1A = OCR1A_berechnet;
39
  TIMSK1 = (1<<OCIE1A);  // Compare-Interrupt zulassen 
40
  
41
  // Interrupts einschalten
42
  sei ();
43
  
44
  while(1) {
45
    if (eigen_flag & ZAEHLERFLAG_BIT) {
46
      ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
47
        eigen_flag &= ~ZAEHLERFLAG_BIT;
48
        }
49
      
50
      // Tu was jede Minute        
51
    }        
52
   
53
    }
54
} // Ende main()

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 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.