www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C167


Autor: Eder (Gast)
Datum:

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

Autor: Axel Barkow (Gast)
Datum:

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

Autor: Eder (Gast)
Datum:

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

Autor: Axel Barkow (Gast)
Datum:

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

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.