Timer Problem

Gast #4051462
Lesenswert?

Hallo,

der OC1A-Pin (PB1) des Mega8 soll durch den Timer1 nach der eingestellen 
Zeit deaktiviert werden. Dazu setze ich PORTB1 zuerst auf high und setze 
in TCCR1A COM1A1 und stelle TCCR1B ein. Jetzt sollte nach der 
eingestellen Zeit PB1 wieder deaktiviert werden, dieser wird aber schon 
direkt beim Starten des Timer deaktiviert. Warum? Wenn ich das ganze 
Spiel umdrehe und PB1 durch den Timer aktivieren lasse funktioniert es 
wunderbar ..

Hier mein Test-Code:
1
...
2

3
int main (void) {
4
    DDRB |= (1<<1);
5

6
    PORTB |= (1<<1);    
7

8
    OCR1A = 15625-1;
9
    TCCR1A = (1<<COM1A1);    // PB1 bei Compare Match deaktivieren
10
                             // und genau hier wird PB1 deaktiviert,
11
                             // aber warum schon hier und nicht erst,
12
                             // wenn TCNT1 == OCR1A ?
13
    TCCR1B = (1<<CS12) | (1<<CS10);
14

15
    for(;;);
16
    return 0;
17
}

Danke schon mal^^
#4051726
Lesenswert?

Jonathan K. schrieb:
> Denk ich mir auch, ist mehr Geschmackssache wie man es lieber schreibt.
> Der Compiler macht ja schließlich das Gleiche draus.

Ertens musst du dich nicht vor einem Mann-Oh-Mann-Gast rechtfertigen, 
zweitens bleibt die Schreibweise vor allem bei mehreren Bits 
übersichtlich und weniger fehleranfällig.

Axiom schrieb:
> Das Lesen der Datenblätter ist auch irgendwie aus der Mode gekommen....

Dumme Kommentare offenbar nicht.

mfg.
Gast #4051988
Lesenswert?

Thomas Eckmann schrieb:
> Ertens muss

man wissen, dass der Eckenman sich hier immer wieder als klugsch... 
Proll zeigt.

Thomas Eckmann schrieb:
> bleibt die Schreibweise vor allem bei mehreren Bits
> übersichtlich

was ein Beispiel zeigt,
komische Art
1
#define P7     7
2
#define P6     6
3
...
4
#define P1     1
5
#define P0     0
6

7
...
8

9
if ( (PINC & ((1<<P1) | (1<<P2) | (1<<P5) | (1<<P7))) || (PINB & ((1<<P0) | (1<<P2) | (1<<P6))) )
10
...

oder besser lesbar
1
#define BIT0   0x01
2
#define BIT1   0x02
3
...
4
#define BIT6   0x40
5
#define BIT7   0x80
6

7
...
8

9
if ( (PINC & (BIT1 | BIT2 | BIT5 | BIT7)) || (PINB & (BIT0 | BIT2 | BIT6)) )
10
...

Möge jeder für sich selbst entscheiden. ;-)
#4052019
Lesenswert?

Mann , oh Mann schrieb:
> was ein Beispiel zeigt,
> komische Art#define P7     7
> #define P6     6
> ...
> #define P1     1
> #define P0     0
>
> ...
>
> if ( (PINC & ((1<<P1) | (1<<P2) | (1<<P5) | (1<<P7))) || (PINB &
> ((1<<P0) | (1<<P2) | (1<<P6))) )
> ...

wer komische Beispiele kreiert muss nicht unbedingt Recht haben.

Es interessiert mich doch nicht bei welchem Bit im Atmel WGM01 oder 
WGM00 sitzt, will ich die setzen ist mir mit (1<<WGM00) bestens gedient.
Gast #4052049
Lesenswert?

Joachim B. schrieb:
> Es interessiert mich doch nicht bei welchem Bit im Atmel WGM01 oder
> WGM00 sitzt, will ich die setzen ist mir mit (1<<WGM00) bestens gedient.

Jetzt sei kein Holkopf:
Für WGM00 brauchst du ein #define. Und anstatt da 1, 2, ... oder so zu 
schreiben, nimmt man halt die echte Wertigkeit 0x01, 0x02, usw.

In deinem Programm interessiert dich dann die Bitstelle auch nicht mehr. 
Du schreibst es nur kürzer ohne den Kram (1 << WGM00) direkt WGM00.

Nur weil Atmel seine Header so krum aufgebaut hat, muss man das nicht 
leben. Andere machen es zum Glück besser.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren