Forum: Mikrocontroller und Digitale Elektronik ATmega Flags checken


von Jannik (user_name123)


Lesenswert?

Hallo,

ich würde gerne wissen wie ich in C prüfe ob ein Flag Bit gesetzt ist. 
Genau geht es um das OCF0A: Timer/Counter 0 Output Compare A Match Flag.

BG

von Cyblord -. (cyblord)


Lesenswert?

So wie du jedes andere Bit in jedem anderen Register auch prüfst?

von Falk B. (falk)


Lesenswert?

Jannik schrieb:
> ich würde gerne wissen wie ich in C prüfe ob ein Flag Bit gesetzt ist.
> Genau geht es um das OCF0A: Timer/Counter 0 Output Compare A Match Flag.

Siehe Bitmanipulation.

von Jannik (user_name123)


Lesenswert?

Also so?
1
if (TIFR0 & OCF0A) {
2
       // hier die Anweisungen, wenn das Bit gesetzt ist
3
    }

von S. L. (sldt)


Lesenswert?

> Also so?
Nein.
  OCF0A ist schlicht 1, folglich würde auf TOV0 abgefragt (wieder Ihren 
ATmega328P vorausgesetzt). Also so: '(TIFR0 & (1<<OCF0A))'.

von Falk B. (falk)


Lesenswert?

Jannik schrieb:
> Also so?
> if (TIFR0 & OCF0A) {
>        // hier die Anweisungen, wenn das Bit gesetzt ist
>     }

Nein, denn bei den gängigen Compilern enthalten die #defines der Bits 
die Bitnummer, nicht das Bitmuster.

https://www.mikrocontroller.net/articles/Bitmanipulation#Bitmanipulation_beim_MSP430

von Nicht Joachim B. (roehrmond)


Lesenswert?

> Also so?: if (TIFR0 & OCF0A)

Nur so nebenbei bemerkt, bei ARM Controllern wäre das der richtige 
Ansatz.

von Cyblord -. (cyblord)


Lesenswert?

Steve van de Grens schrieb:
>> Also so?: if (TIFR0 & OCF0A)
>
> Nur so nebenbei bemerkt, bei ARM Controllern wäre das der richtige
> Ansatz.

So Pauschal natürlich Unsinn. Es kommt darauf an ob die Symbole in der 
verwendeten Headerdatei Bitmasken oder Bitnummern sind. Das hat mit der 
Architektur gar nichts zu tun.

von Nicht Joachim B. (roehrmond)


Lesenswert?

Cyblord -. schrieb:
> So Pauschal natürlich Unsinn. Es kommt darauf an ob die Symbole in der
> verwendeten Headerdatei Bitmasken oder Bitnummern sind. Das hat mit der
> Architektur gar nichts zu tun.

Die Struktur der Header Dateien (CMSIS Core) ist von ARM vorgegeben.

von Cyblord -. (cyblord)


Lesenswert?

Steve van de Grens schrieb:
> Cyblord -. schrieb:
>> So Pauschal natürlich Unsinn. Es kommt darauf an ob die Symbole in der
>> verwendeten Headerdatei Bitmasken oder Bitnummern sind. Das hat mit der
>> Architektur gar nichts zu tun.
>
> Die Struktur der Header Dateien (CMSIS Core) ist von ARM vorgegeben.

Nein es werden die CMSIS Header von ARM bereitgestellt. Was niemand dazu 
verpflichtet diese zu benutzen und keine Anderen.
Also wäre deine Aussage korrekt wenn du schreiben würdest dass dies bei 
CMSIS Nutzung die korrekte Vorgehensweise wäre.
Abgesehen davon sind die Peripherieregister gar nicht Teil der CMSIS 
sondern Herstellerabhängig. Und z.B. STM kann hier bei StdPeriphLib oder 
HAL machen was sie wollen.
Teilweise werden Masken und Nummern parallel angeboten.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Jannik schrieb:
> Also so?
>
>
1
if (TIFR0 & OCF0A) {
2
>        // hier die Anweisungen, wenn das Bit gesetzt ist
3
>     }

Nein. Und das haben die anderen ja schon zur Genüge geschrieben.

Das Traurige dabei ist, dass es überhaupt möglich ist, so einen Mist 
erfolgreich zu compilieren: TIFR0 ist von DT volatile uint8_t und OCF0A 
ist schlicht ein int-Literal. Dabei ist prinzipiell einfach das zu 
verhindern!

von Falk B. (falk)


Lesenswert?

Wilhelm M. schrieb:
> Nein. Und das haben die anderen ja schon zur Genüge geschrieben.
>
> Das Traurige dabei ist, dass es überhaupt möglich ist, so einen Mist
> erfolgreich zu compilieren: TIFR0 ist von DT volatile uint8_t und OCF0A
> ist schlicht ein int-Literal. Dabei ist prinzipiell einfach das zu
> verhindern!

Na dann mal los, schreib komplett neue Header und die ganze Definitionen 
für die IO-Register.

von Wilhelm M. (wimalopaan)


Lesenswert?

Falk B. schrieb:
> Wilhelm M. schrieb:
>> Nein. Und das haben die anderen ja schon zur Genüge geschrieben.
>>
>> Das Traurige dabei ist, dass es überhaupt möglich ist, so einen Mist
>> erfolgreich zu compilieren: TIFR0 ist von DT volatile uint8_t und OCF0A
>> ist schlicht ein int-Literal. Dabei ist prinzipiell einfach das zu
>> verhindern!
>
> Na dann mal los, schreib komplett neue Header und die ganze Definitionen
> für die IO-Register.

Das kann man aus den XML-Files der Hersteller generieren.

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.