Forum: Mikrocontroller und Digitale Elektronik PIC16F877 Eingangsbit abfragen


von Jens S. (hannesk)


Lesenswert?

Guten Abend,
bin neu hier und habe auch noch keine Erfahrungen mit Microkontrollern.

Habe am Port B Ein LCD und zwei Taster angeschlossen, die Taster an RB0 
und RB1. Ich möchte den Taster an RB1 benutzen.
Ich weiß nun aber nicht wie ich das einzelne Bit abfragen kann, einen 
ganzen Port ist kein Problem.
Möchte mit den Taster eine "else if-Abfrage" realisieren. Konkret soll 
mit dem taster von Celsius in Fahrenheit umgeschaltet werden (Mit einem 
KTY nehme ich eine Spannung über den ADW auf, rechne die Spannung in 
einem Widerstandswert um, daraus resultiert dann die Temperatur, die ich 
auf einem LCD ausgebe) Die Temperatur wird in Celsius angezeigt, möchte 
aber mit einem drücken des Tasters auf Fahrenheit umschalten. Wie kann 
ich das am besten realisieren?
Hier mal bis jetzt erarbeiteter Quelltext:

//Temperaturmessung mit einem KTY81-210
//Jede Sekunde eine Messung, 100 Messungen gesamt
//Rote LED soll bei jeder Messung aufleuchten

void main ()
{
unsigned int uiUT;    //Variable für Analogeingang
char cT[7];           //Variable für die Ausgabe des Displays [7] 6 
Zeichen und 1bit fürs Ende
float fT;             //Variable für die Temperatur in Celsius
//float fF;             //Variable für die Temperatur in Fahrenheit
float fUT;            //Variable für die Berechnung UT
float fRT;            //Variable für die Berechnung RT
short sSchleife;      //Variable für die Schleife

LCD_Init(&PORTB);     //LCD initialisieren
TRISB = 0b00000011;   // Port deklarieren Port B = LCD und Taster 
0=Ausgang 1=Eingang
PORTD = 0;
TRISD = 0b11111100;   // 6 Eingänge 2 Ausgänge für KTY

// AD-Wandler Konfiguration
ADCON1 = 0*80;        //0B1000 0000 <--AN7, Uref = Ub

// Schleifenfunktion für die 100 Messungen
for (sSchleife=0,sSchleife;sSchleife<=99; sSchleife++)
 {
uiUT = Adc_Read(7);   //Auslesen des Analogeingangs

fUT = uiUT * 5;       //Formel: UT=UTdig*5V(Ub)/1024
fUT = fUT / 1024;     //      "          "

fRT = 5 - fUT;        //Formel: RT=2,2k*UT/5V-UT
fRT = fUT / fRT;      //      "          "
fRT = fRT * 2.2;      //      "          "

fT = 64.1 * fRT;      //Formel: T=m*RT+b m=64,1C/kOhm b=-103,21
fT = fT + (-103.21);  //      "          "

//Celsius in Fahrenheit
//fF = fT * 9;
//fF = fF / 5;
//fF = fF * 32;

FloatToStr(fT, cT);   // Umwandlung Float zu Char fürs Display

Lcd_Out(1, 1, cT);
Lcd_Out(2, 1, "Grad Celsius");

// blinken der LED
if (PORTD == 0b00000001)
{
PORTD = 0b00000000;
}
else
{
 PORTD = 0b00000001;
}

delay_ms (1000);
 }
}

Benutze den mikroC compiler

Hoffe Ihr könnt und wollt mir helfen =)

von Severino R. (severino)


Lesenswert?

Jens S. wrote:

> Habe am Port B Ein LCD und zwei Taster angeschlossen, die Taster an RB0
> und RB1. Ich möchte den Taster an RB1 benutzen.
Hast Du an Pull-Up Widerstände gedacht?

> Ich weiß nun aber nicht wie ich das einzelne Bit abfragen kann, einen
> ganzen Port ist kein Problem.
Du musst mit einer Bit-Operation das gewünschte Bit herausfiltern 
(genau: maskieren) und dann prüfen
http://www.roboternetz.de/wissen/index.php/C-Tutorial#Bit-Operatoren
1
if (PORTB & 0b00000001) // falls Bit 0 in Port B gesetzt ist
2
{
3
...
4
}

von Gast (Gast)


Lesenswert?

Sind die Taster aktiv low (was sinnvoll wäre wegen der Pull-Ups) oder 
aktiv high?

Ich würde es mit

BTFSS PortB,0
GOTO  ZurnächstenAbfrage
...
Tastenaktionsroutine
...

versuchen. Das ist allerdings Assembler. In C sollte es aber ähnliche 
Befehle geben.

von Jens S. (hannesk)


Lesenswert?

Danke erstmal für die Antworten!
Ich habe es wie Severino R. es beschrieben hat gelöst, klappt auch 
wunderbar!

OPTION_REG &=0b01111111; So gebe ich ja die Pullups frei.

Naja, is ja eigentlich auch nicht so schwer. Hätte einfach mal in der 
Hilfe nach "button" suchen müßen, aber man lernt nie aus =)

Nochmal kurz eine andere frage, ich habe in meinem Code ja eine 
For-Schleife. Die hat absolut nicht funktioniert, also er hat nie die 
Variable sSchleife hochgezählt. Hab nach ein paar Stunden dann durch nen 
dummen Zufall rausgefunden das es daran lag, dass ich die Variable zwar 
global aber als letzte Variable deklariert habe (siehe Quelltext). Wenn 
ich die Variable als erstes deklariere funktioniert das Programm 
einwandfrei. Woran liegt das?

MfG Jens

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.