AtMega8 - Eingang richtig definiert

Gast #1567308
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.
Gast #1567312
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?
Persönliche Seite #1567346
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.
Gast #1567370
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
Gast #1567660
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???
Persönliche Seite #1567899
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren