Forum: Mikrocontroller und Digitale Elektronik C167


von Eder (Gast)


Lesenswert?

Hallo zusammen,

Ich habe ein (kleines) Problem mit dem einlesen eines Tasterwertes.
Meine Schaltung ist so aufgebaut, dass ich am Pin P3.0 einen Taster
angehängt habe, der beim drücken 200ms auf 0 geht und dann wieder 1
ist. Mit dem nachfolgenden Code frage ich den Wert von P3.0 ab:

                if (eingang1 == 0)
       x = 1;
    else
       x = 0;

                if (x == 1)
             {
                    P2 = 0x00FF;
       }
Meine Frage wäre, wie ich eingang1 deklarieren muss, dass diese
Variable direkt auf den Eingangspin zugreift - mir gehts nur um das
Einlesen des Tastendrucks. Im main- teil habe ich noch die Richtung für
P3 bestimmt: DP3 = 0x0000;
Hier der ganze Code:

#include <reg167.h>

int wert = 63;
int save;
int wert_2;
int wert_1, eingang1;
int i, x;

 void t1_isr (void) interrupt 0x21 {//von 77 bis 0 oktal runterzaehlen


        if (eingang1 == 0)
       x = 1;
    else
       x = 0;

        if (x == 1)
      {
           P2 = 0x00FF;
    }

    wert_1 = wert % 8;


   save = wert / 8;
   wert_2 = save % 8;

   P2 = P2 & 0x0038;     //0000000000111000
   wert_1 = ( wert_1 << 0); //um 0 stellen auf P0-P2 verschieben
   P2 = P2 | wert_1;       //bits auf wert_1 setzen

    P2 = P2 & 0x0007;//drei bits maskieren-> 0000 0000 0000 0111
    wert_2 = (wert_2 << 3);
    P2 = P2 | wert_2;  //bits setzen

    --wert;


     if (wert == -1) //auf oktal 77 zurücksetzen
       wert = 63;
}

void main (void)
{
  DP2 = 0x003F; // unteren 6 bits auf output setzen
   P2 = 0x0000;  //an der ersten stelle anfangen
        T01CON = 0x4400; //Timer 1 auf 210ms
   T1REL= 0x0000;  //reloadwert für den Timer 1, 61A8
        T1IC = 0x0050; //T0IE auf eins und, ILVL auf 4

  DP3 = 0x0000;  //das Portregister 3 auf input setzen, um den
                         Eingangstaster abzufragen, siehe 6-15

    IEN = 1;           //globaler interruptenable -> immer setzen

    while(1){
    }
}

von Axel Barkow (Gast)


Lesenswert?

Hallo,

schreib

eingang1 = P3 & 0x0001;

vor die if-Abfrage im Interrupt. Dann ist eingang1 0x0001, wenn P3.0
high ist, ansonsten 0x0000;

Gruß,

Axel

von Eder (Gast)


Lesenswert?

Hi Alex,
Das hab ich schon gemacht aber es will nicht so recht funktionieren.
Ist es eigendlich so, dass die Pins (Eingänge) auf High sind und man
muss sie runterziehen oder sind sie auf Low?
Und noch eine Frage hätte ich: wenn ich schreibe (wie du oben
geschrieben hast (eingang1 = P3 & 0x0001;) ist das dann der P3.0-
Eingang oder der P3.1- Eingang.
lg und vielen Dank für deine Tipps
Eder

von Axel Barkow (Gast)


Lesenswert?

Hallo,

also das unterste Bit ist schon P3.0, wie solltest du das sonst
ansprechen können? Steht aber auch im Handbuch (Kapitel 7-7).
Die Pins haben aber keinen internen Pullup Widerstand, haben als
Eingänge im unbeschalteten Zustand keinen definierten Pegel. Du
solltest sie also extern entsprechend beschalten.

Gruß,

Axel

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.