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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.