Forum: Mikrocontroller und Digitale Elektronik AtMega8 - Eingang richtig definiert


von Gast1286 (Gast)


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.

von Grrr (Gast)


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?

von Christian H. (netzwanze) Benutzerseite


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.

von spess53 (Gast)


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

von Christian Erker (Gast)


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

von spess53 (Gast)


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

von Gast1286 (Gast)


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???

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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

Also
1
if (!(PINB & (1<<PINB0)) 
2
  {
3
   ...
4
  }
5
else
6
  {
7
   ...
8
  }

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.

von nicht_eingeloggt (Gast)


Lesenswert?

oder so
1
if( (~PINB & (1<<PINB0)) )
;-)

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.