Forum: Mikrocontroller und Digitale Elektronik ACSR - Bit7 setzen


von J.Flender (Gast)


Lesenswert?

Hallo,

Ich habe ein Problem und bin ein wenig am verzweifeln. Es geht 
prinzipiell darum das Bit7 (ACD) des ACSR Registers zu setzen.
Die Bedeutung dieses ist wohl:
1 -> Comperator aus
0 -> Comparator ein

Initialwert des Bits ist 0.
Ich würde nun gern das Bit setzen um den Comperator auszuschalten. 
Jedoch, so simpel das Programm auch ist. Es will nicht funktionieren. 
Gibt es da einen Hintergrund, von dem ich nichts weiß, wieso das nicht 
funktioniert, oder habe ich nur einen dummen strukturellen Fehler. Ich 
dachte, bevor ich gänzlich durchdrehe, darf ich hier mal fragen.
Danke für die Geduld im Voraus!

Hier das Programm:
Ergebnis es leuchtet keine LED an PORTC
1
#include<avr/io.h>
2
#define MEINBIT7 7
3
int main (void) {
4
DDRC=0xff;
5
PORTC=0x00;
6
ACSR |= (1<<MEINBIT7);
7
8
  while(1) {  
9
    if(bit_is_set(ACSR,MEINBIT7) == 1) {
10
    PORTC=0xff;
11
    }
12
    
13
  }
14
}

von Johannes M. (johnny-m)


Lesenswert?

> if(bit_is_set(ACSR,MEINBIT7) == 1)
Schau bitte mal nach, was bit_is_set macht. Und dann lass das "== 1" 
weg.

Außerdem werden LEDs auch gerne schon mal High-Side angeschlossen, so 
dass der betreffende Pin Low-Pegel haben muss, um die LED anzuschalten. 
Da Du nirgends erwähnst, was für eine Hardware und was für einen 
Controller Du verwendest (Ich habe jetzt allein wegen des ACSR und ACD 
und der avr/io.h mal auf AVR getippt), könnte es auch noch sein, dass an 
PORTC noch andere Dinge zu beachten sind, die aber dann nicht alle Pins 
betreffen.

BTW:
Warum benutzt Du eigentlich nicht die Definition für ACD und machst den 
MEINBIT7-Krampf?

von J.Flender (Gast)


Lesenswert?

Oh, tut mir leid. Ich hatte leider vergessen zu erwähnen, was es für ein 
µC ist. (Ist auch mein erster Thread hier).
Es ist ein Atmega8 und die Schaltung besteht im Prinzip nur aus der 
Grundschaltung von 
[[http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment]] und 
ein paar LEDs an PORTC.

Die LEDs habe ich bisher immer direkt an Ground angeschlossen und über 
den AVR auf +5V gezogen.

Was bit_is_set macht, ist mir auch nicht bekannt, jedoch habe ich auch 
andere Funktionen wie
1
PORTC |= (ACD<<PC4)
versucht, welche auch nicht weiterhelfen.

Der Atmega weigert sich halt, das Bit auf 1 zu schalten. Und ich habe 
keine Ahnung wieso...

von Johannes M. (johnny-m)


Lesenswert?

J.Flender wrote:
> Oh, tut mir leid. Ich hatte leider vergessen zu erwähnen, was es für ein
> µC ist. (Ist auch mein erster Thread hier).
Dass man den verwendeten Controller im Betreff angeben soll, steht aber 
in den Forenregeln, deren Gelesen-haben man vor dem Absenden bestätigen 
muss...

> Der Atmega weigert sich halt, das Bit auf 1 zu schalten. Und ich habe
> keine Ahnung wieso...
Wie sieht denn jetzt Deine Überprüfung aus? Ich befürchte, Du hast nicht 
verstanden, dass nicht das Setzen des Bits falsch ist, sondern Deine 
Abfrage, ob es gesetzt ist! Die Bedingung hinter dem if kann so 
nicht wahr werden, weil auf "== 1" abgefragt wird. Der Term vorne kann 
aber nie gleich 1 werden. Du musst an dieser Stelle eine 
Interpretation des Ausdrucks "bit_is_set(ACSR, ACD)" bzw. der besseren 
(weil ohne irgendwelche nicht-Standard-Makros, deren Implementierung man 
erst nachschlagen muss, auskommenden) Alternative "ACSR & (1 << ACD)" 
als Wahrheitswert erzwingen.

Der Ausdruck "ACSR & (1 << ACD)" kann niemals gleich 1 sein, weil er 
nur die beiden Zustände "0" oder "1 << ACD" (was aufgelöst 0x80 oder 
dezimal 128 ist) annehmen kann! Wenn Du das "== 1" einfach weglässt, 
dann wird der restliche Ausdruck automatisch als Wahrheitswert 
interpretiert. Die Anweisung hinter dem if wird dann ausgeführt, wenn 
der Ausdruck in den Klammern () wahr, also von Null verschieden ist...

von J.Flender (Gast)


Lesenswert?

Es funktioniert. Sehr schön.
Ich habe, wie du gesagt hast, einfach die ==1 im if() weggelassen und es 
funktioniert.

Nochmal vielen Dank für deine Bemühungen.
Wünsche noch einen schönen Abend!

von Johannes M. (johnny-m)


Lesenswert?

J.Flender wrote:
> Es funktioniert. Sehr schön.
> Ich habe, wie du gesagt hast, einfach die ==1 im if() weggelassen und es
> funktioniert.
Sag ich ja ;-) Ich hoffe, Du hast das nicht nur treudoof gemacht, 
sondern auch verstanden, warum das so sein muss. Das wird Dir 
nämlich noch des öfteren über den Weg laufen.

> Nochmal vielen Dank für deine Bemühungen.
> Wünsche noch einen schönen Abend!
Gleichfalls.

von Johannes M. (johnny-m)


Lesenswert?

P.S.:
Wie oben schon erwähnt solltest Du Dir am besten gleich die 
Standard-konforme Schreibweise für das Setzen/Löschen von Bits bzw. das 
Auslesen ihres Zustandes angewöhnen. bit_is_set und Konsorten sind 
Makros, die einer bestimmten Bibliothek eines bestimmten Compilers 
entstammen und mit denen niemand, der einen anderen Compiler benutzt, 
etwas anfangen kann. Der Artikel Bitmanipulation auf dieser Seite 
behandelt die Möglichkeiten.

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.