Forum: Mikrocontroller und Digitale Elektronik Einzelne Bit's abfragen mit C


von Elolehrling (Gast)


Lesenswert?

Guten Morgen

Ich mache meine berufsausbildung zum Elektroniker in der Schweiz. In 
meiner Region ist es üblich, dass man in den ersten zwei Jahren nur 
Assembler Programmiert, was ich mittlerweile auch fast im Schlaf 
beherrsche.

Eigentlich fangen wir mit C erst in ein paar Monaten an, aber mich reizt 
es schon jetzt ein bisschen damit anzufangen. Nun, gestern habe ich mir 
mal ein Buch geholt und gemerkt, dass es doch irgendwo eine Gewisse 
ähnlichkeit hat.

Ich besitze ein Board mit einem PIC16F887, zum Programmieren verwende 
ich den MikroC PRO for PIC. Auf dem Board sind 8 Schalter (PORTA) und 8 
LED's (PORTD) angeschlossen.

Da ich mich mit einer if-Anweisung beschäftigt habe, hatte ich folgende 
Idee:
Sobald ein Schalter von PORTA (egal welcher) gedrückt ist, leuchten die 
ersten 4 LED's. Ist kein Schalter gedrückt, leuchten die anderen 4.
Komischerweise reagiert mein Programm aber nur auf den Schalter der an 
PORTA 5 angeschlossen ist, der ganze rest ist ihm egal. (Das Board 
funktioniert zu 100 %!)

Ich vermute also, in meinem Code ist irgendwo ein Fehler. Wie gesagt, 
ich habe mich bisher evtl. knapp 2 Stunden mit C beschäftigt, also ist 
der Code bestimmt nicht gerade das Gelbe vom Ei, darum gehts mir 
allerdings nicht. Ich möchte lediglich wissen, ob einer von euch weiss 
wieso der nur auf Schalter 5 reagiert. Hier mein Code:
1
void main()
2
 {
3
  TRISA = 0xFF;        // set direction to be Input
4
  TRISB = 0;           // set direction to be output
5
  TRISC = 0;           // set direction to be output
6
  TRISD = 0;           // set direction to be output
7
  TRISE = 0;           // set direction to be output
8
  
9
  
10
  while(1)                    // Endlosschleife
11
  {
12
  
13
  if (PORTA != 0) {           // Wenn PORTA nicht = 0
14
  PORTD = 0b00001111;         // Schalte LED 0 - 4 an
15
  }
16
  else
17
  {
18
      PORTD = 0b11110000;     // Sonst Schalte LED 5 - 8 an
19
  }
20
   }
21
}

Zweite Frage:

Wie ihr hier gemerkt hat, frage ich einfach ab, ob PORTA nicht = 0 
ist... zumindest denke ich, dass ich das mit dem Code tu...

Gibt es einen eleganteren Weg, jetzt z.B. gezielt nur Bit 6 von PORTA 
abzufragen... bei Assembler könnte man ja einfach:
1
btfsc      PORTA,6
schreiben. Gibt es bei C einen ähnlichen Befehl?

Ich danke für alle Antworten und aufklärungen!

Gruss

von (Ein) (Gast)


Lesenswert?

if( PORTA & (1<<x) )
{
   tue_etwas_weil_bit_x_in_PORTA_gesetzt();
}

Hier ist 0 <= x <= 7

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Elolehrling schrieb:
> Gibt es bei C einen ähnlichen Befehl?
if (PortA&0b0100000) {
   -- PortA.6 ist gesetzt
}

Ausführlich siehe Bitmanipulation
Abschnitt 6.2

> if( PORTA & (1<<x) )
Da sind (für Anfänger verwirrend) zwei Operationen zusammengefasst:
1. eine Schiebeoperation:
   schiebe den Wert 0b00000001 um x Stellen nach links
   das gibt mit x=6 dann 0b01000000
und
2. der eigentliche Bit-Vergleich, bei dem ein spezielles Verhalten
   der if-Abfrage in C verwendet wird:
   wenn der Abfrageterm ungleich 0 ist, dann ist die Abfrage wahr

von spontan (Gast)


Lesenswert?

Dein Problem, warum nur auf Schalter A.5 reagiert wird, das seh ich grad 
nicht.

Aber ist Dir klar, das dies nicht so ganz korrekt ist:

>Schalte LED 0 - 4 an
>Sonst Schalte LED 5 - 8 an

Vielleicht ist Deine Zähleweise nicht so ganz ok.

von Elolehrling (Gast)


Lesenswert?

*LED 0 - 3 & LED 4 - 7

Sorry, habe in der Eile noch schnell ein paar Kommentare eingefügt damit 
das bisschen übersichtlicher wird und ihr meine Gedanken seht, da ging 
für einen kurzen Augenblick mal meine Fähigkeit zu zählen verloren.

Danke schonmal für die vielen Antworten, ich werde mich gleich mal dran 
machen und es aufs neue testen!

von ich (Gast)


Lesenswert?

Ich kenne den PIC nicht, aber bei einem AVR müsste man

if (PINA != 0)

statt

if (PORTA != 0)

schreiben

von Karl H. (kbuchegg)


Lesenswert?

Hast du bedacht, dass du den PORTA mittels ADCON von Analogeingang auf 
Digitaleingang umstellen musst/kannst?

An und für sich sollte der µC bei

   if( PORTA != 0 )

auf jeden Eingangspin reagieren, egal welchen.

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.