mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ACSR - Bit7 setzen


Autor: J.Flender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include<avr/io.h>
#define MEINBIT7 7
int main (void) {
DDRC=0xff;
PORTC=0x00;
ACSR |= (1<<MEINBIT7);

  while(1) {  
    if(bit_is_set(ACSR,MEINBIT7) == 1) {
    PORTC=0xff;
    }
    
  }
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: J.Flender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...]] 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
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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: J.Flender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.