Forum: Mikrocontroller und Digitale Elektronik Timer Problem


von Jonathan K. (Gast)


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^^

von Mann , oh Mann (Gast)


Lesenswert?

> 1<<1
Was soll das? Warum nicht 0x02?

von Jonathan K. (Gast)


Lesenswert?

Ist ne Angewohnheit von mir, spricht etwa was gegen meine 
Schreibweise..?

..mit meiner Frage hat das übrigens auch nix zu tun ..

von Peter D. (peda)


Lesenswert?

Das Verbinden eines Pins mit dem Timer ist wie ein Umschalter, d.h. das 
Port-Bit ist dann schnurz.

Den Zustand asynchron zu ändern geht dann nur über das FOC1A Bit.

von Rolf M. (rmagnus)


Lesenswert?

Mann , oh Mann schrieb:
>> 1<<1
> Was soll das? Warum nicht 0x02?

Weil Bit 1 auf 1 gesetzt werden soll und das dadurch besser ausgedrückt 
wird als durch 0x02?

von Jonathan K. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> FOC1A Bit

Danke, das hat funktioniert.


Rolf Magnus schrieb:
> Weil Bit 1 auf 1 gesetzt werden soll und das dadurch besser ausgedrückt
> wird als durch 0x02?

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

von Axiom (Gast)


Lesenswert?

Das Lesen der Datenblätter ist auch irgendwie aus der Mode gekommen....

von Thomas E. (thomase)


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.

von Mann , oh Mann (Gast)


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. ;-)

von Gertl (Gast)


Lesenswert?

Mann , oh Mann schrieb:
> Möge jeder für sich selbst entscheiden. ;-)

Finde ich auch und machen deine Beiträge überflüssig.

von Joachim B. (jar)


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.

von Bitflip (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Mann , oh Mann schrieb:
>>> 1<<1
>> Was soll das? Warum nicht 0x02?
>
> Weil Bit 1 auf 1 gesetzt werden soll und das dadurch besser ausgedrückt
> wird als durch 0x02?

Sehe ich genauso! Die Übersichtlichkeit finde ich persönlich besser. Vor 
allem bei z.B. ARM 32-Biter.

Schönes WE

von Mann , oh Mann (Gast)


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.

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.