mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AtMega8 - Eingang richtig definiert


Autor: Gast1286 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gerade ein kleines Programm für Atmega8 in C fertig und bin nun am 
testen.
Leider ist gleich ein Problem aufgetretten.

Habe einen PIN als Eingang definiert. PIN B0 low=>springe in den if 
Abschnit des Programms, PIN B0 high=>springe in den else ABschnit. so 
hab ich mir das gedacht.
Jedoch springt das Programm immer nur in den if-Teil, egal was am 
Eingang anliegt..


Folgender Code:

void main (void)
{

DDRB &=~(1<<DDB0);


while(1)                    //Endlosschleife für Ausgabe der ADC-Werte
  {
  if(~(PINB & (1<<PINB0)) )
  {
    lcd_clear();
    set_cursor(x,y);
    lcd_string("Port-off");
    _delay_ms(1500);
    if(x<=10)
    x+=2;
    else
    x=1-y;
    if(y==1)
    y++;
    else
    y--;

  }
  else
  {...}
}

Wahrscheinlich ist nur eine kleinigkeit falsch aber ich komm gerade 
nciht drauf was das Problem ist.

Autor: Grrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einrücken, Posten mit [c] tags, vollständigen, compilierbaren Code 
posten, der das Verhalten zeigt, beschreiben, wie Du das inkriminierte 
Verhalten feststellst (Messmittel ?).

Kleiner Tip vorab: Entprellung?

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast1286 schrieb:
> ~(PINB & (1<<PINB0)

PINB  ist ein Byte, welches die 8 Portsignale repräsentieren, OK

PINB0 ist einfach nur ein Makro, was durch "0" (ohne Anführungszeiche) 
ersetzt wird.

"1<<PINB0" bedeutet "1<<0", und das bedeutet "1".

Also "PINB & 1".

"~" invertiert immer ein ganzes Byte.

Ist PINB0 LOW, so steht da in Binärschreibweise 0b11111111.
Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt.

Ist PINB0 HIGH, so steht da in Binärschreibweise 0x11111110.
Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt.

Noch ein Tip "not" wird als "!" geschrieben.
Oder man prüft direkt auf einen Wert.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Noch ein Tip "not" wird als "!" geschrieben.
>Oder man prüft direkt auf einen Wert.

!  Logical Not
~  Bitwise Not

also ist '~' richtig.

MfG Spess

Autor: Christian Erker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In diesem Fall nicht ;)

Du prüfst ob der Eingang 1 ist (BITWEISES UND) und willst etwas tun wenn 
er es nicht ist (LOGISCHES NICHT).

Gruß,
Christian

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Du prüfst ob der Eingang 1 ist (BITWEISES UND) und willst etwas tun wenn
>er es nicht ist (LOGISCHES NICHT).

'~' wird in dem Programmausschnitt zwei mal benutzt. Für die 
if-Anweisung hast du natürlich recht.

MfG Spess

Autor: Gast1286 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"1<<PINB0" bedeutet "1<<0", und das bedeutet "1".

>Also "PINB & 1".

>"~" invertiert immer ein ganzes Byte.

>Ist PINB0 LOW, so steht da in Binärschreibweise 0b11111111.
>Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt.

>Ist PINB0 HIGH, so steht da in Binärschreibweise 0x11111110.
>Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt.

OK, das leuchtet mir ein. aber wie kann ich dann auf ein einzelnes Bit 
prüfen. oder den Stand eines einzelnen Bits in eine Variable kopieren???

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, wie Du es schon gemacht hast, nur nicht mit "~", sonder mit "!".

Also
if (!(PINB & (1<<PINB0)) 
  {
   ...
  }
else
  {
   ...
  }

Denn:

(1<<PINB0)   bedeutet 0b00000001

Ist PINB0 LOW, so ergibt

(PINB & (1<<PINB0))  den Wert 0b00000000 = 0

Ist PINB0 HIGH, so ergibt

(PINB & (1<<PINB0))  den Wert 0b00000001 = 1


Da du den IF-Block bei PINB0 LOW ausführen willst und ein IF ausgeführt 
wird, wenn die Bedingung zutrifft (also ungleich 0 ist), musst Du die 
Sache umkehren, also ein logisches NOT (das bedeutet "!") davor.

Autor: nicht_eingeloggt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder so
if( (~PINB & (1<<PINB0)) )
;-)

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.