www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC16F877 Eingangsbit abfragen


Autor: Jens S. (hannesk)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutor...
if (PORTB & 0b00000001) // falls Bit 0 in Port B gesetzt ist
{
...
}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens S. (hannesk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.