So ... Langsam blick ichs nimmer ... Welches ist denn nun die richtige Art ein Bit eines Ports zu setzen (am Beispiel eines atmega8). Sagen wir ich will an PORT D, das 0te Bit auf 1 setzen .. Wie mache ich das .. cbi und sbi ist ja veraltet (lt. Doku), und loop_until_bit_is_set ist glaub ich nicht das was ich suche, oder ?
PORTD |= _BV(0); //kannst statt 0 auch PD0 schreiben Wenn du es löschen willst: PORTD &= ~_BV(0); Im Wiki müsste sich sowas auch finden lassen oder vielleicht auch hier: http://mc-project.de/Pages/AVR/avrgcc/programmierung.html
ahhhhhhh... das geht also auch bei Ports so einfach ... irgendwie ja logisch .. ich schreib ja auch nur was in ein Register wie beim TIMSK oder TCCRx Dank dir vielmals ...
Hi, ich bevorzuge diese schreibweise: DDRC |=(1<<DDRC0) DDRC &= ~(1<DDRC0) man sieht gleich welches BIT im Register gesetzt oder geloescht ist z.B. : ADCSRA |= (1<<ADEN) | (1<<ADPS2); hier sieht man es eindeutig das nur ADEN und ADPS2 im Register ADCSRA gesetzt werden. man kann ich sich auch kleine makros machen, aber die C Schreibweise kann jeder lesen. Mfg Dirk
Naja, und der kleine Makro, der in der avr-libc eben mitgeliefert wird, heißt _BV(). Er macht exakt das, also _BV(0) löst auf nach (1 << 0).
Schon, nur ich find's auch Praktischer, wenn man die "K&R"-Version benutzt :) Das versteht wirklich jeder C-Programmierer. Und wenn man mal Hilfe braucht, bei dem es nicht um Hardwarespezifische Sachen geht, dann muss der Helfende sich entweder auch bereits mit der AVR-Toolchain befassen, oder der Hilfesuchende muss es ihm erklären. Ich habe eine Zeitlang auch _BV verwendet, aber es nachher doch wieder ersetzt... Allerdings: jedem Pott seinen Deckel, soll heissen: jeder so, wie er es mag!
Ich blicks auch nicht, kann mir jemand erklären was der Unterschied ist: 1. TIMSK = _BV(TOIE0); //ich dachte ich setze das bit (=1)? 2. TIMSK |= _BV(TICIE1); //bit löschen (=0) ? 3. TIMSK &= _BV(TICIE1); //was passiert jetzt? 4. TIMSK = _BV(TOIE0); ist das gleiche wie TIMSK = (1<<TOIE0); ???
1.) nur das Bit TOIE0 wird gesetzt -- alle anderen werden gelöscht (effektiv ein OUT, sofern die Parameter das zulassen und Optimierung aktiv ist) 2.) das Bit TICIE1 wird gesetzt, alle anderen bleiben unverändert (effektiv ein SBI, sofern ... wie oben) 3.) eine wenig sinnvolle Operation; in TIMSK werden alle Bits gelöscht außer TICIE1, das bleibt erhalten Sinnvoller wäre: TIMSK &= ~_BV(TICIE1); Das TICIE1-Bit in TIMSK wird gelöscht (effektiv ein CBI, sofern...) 4.) Ja.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.