mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik µC Pin Abfrage


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void main(void) 
{ 
  int Taste1;
  
  LATB = 0;      // Auf den Port B werden Nullen geschrieben
    TRISB = 0;     // PortB wird als Ausgang deklariert
    LATA = 0;  
  
  if(TRISA)
    {
  LATB = 0b0111;    // PortB Pin4=0,Pin3-0=1, 
    }
}

Wie sage ich dem Junge er soll bitte dann erst die LED einschalten wenn 
ich auf den Taster gedrückt habe der sich auf RA4 befindet?

Danke

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Prozessor?

MFG
Falk

Autor: Franz-Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt nach PIC oder?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pic ja. Lese grad die p18f452.h Datei durch werde aber nicht Schlau 
daraus.
C18 Compiler

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja?

Autor: Franz-Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kenn mich mit PIC's nicht so aus.
Aber es müsste ein Befehl geben in der Art PINx.
variable = PINx

Autor: Franz-Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Die Tris-Registers sind die Tristate-Register. Diese legen fest ob der 
Pin als Eingang oder als Ausgang konfiguriert ist.

Die LAT-Register sind die Latch-Regsiter der Ports. Wenn du auf den Port 
hinausschreiben willst, dann solltest du in die LAT-Register schreiben 
und nicht in die PORT-Registern. Dadurch umgehst du die 
read-modify-write-Problematik.

Die Port-Register geben den aktuellen zustand der Pins wieder. Also beim 
Lesen, diese Register verwenden.

Hier mal ein Link zu einer sehr brauchbaren Wiki:
http://www.fernando-heitor.de/component/option,com...

Und hier gleich die Infos zu den IO-Ports:
http://www.fernando-heitor.de/component/option,com...

Ansonst gibts auch noch www.sprut.de .

mfg Schoasch

Autor: FArs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin am gleichen Problem. Kann jemand mal ein Stück code schreiben wie 
man einen Port ganz gezielt ansteuern kann.

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liest sich, als ob da ein massives Dezifit (absichtlich falsch 
geschrieben im Sinne von 1/10 Fitness ;-)) an Verständnis für die 
Wirkungsweise von I/O Ports vorhanden ist.

Die Erklärung und die links von Schoasch lassen doch nichts zu wünschen 
übrig.
Ohne etwas Eigeninitiative ist da wenig zu machen.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal so:
void main(void) 
{ 
  int Taste1;
  
  LATB = 0;      // Auf den Port B werden Nullen geschrieben
  TRISB = 0;     // PortB wird als Ausgang deklariert
  LATA = 0;      // <- überflüssig
  
 
  while(1)       // loop forever
  {
    if(PORTA & 0x10)
    {
      LATB = 0b0111;    // PortB Pin4=0,Pin3-0=1, 
    }
  }
}

Du weisst aber, dass bei Loslassen des Tasters die Ausgänge nicht 0 
werden?

Severino

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Das TRISA register hast du vergessen zu setzten. :-)
void main(void) 
{ 
  int Taste1;
  
  LATB = 0;          // Auf den Port B werden Nullen geschrieben
  TRISB = 0;         // PortB wird als Ausgang deklariert
  TRISA = 0x10;      // RA4 wird als Eingang definiert
  
 
  while(1)       // loop forever
  {
    if(PORTA & 0x10)
    {
      LATB = 7;    // PortB Pin4=0,Pin3-0=1, 
    }
    else
    {
      LATB = 0;
    }
  }
}

mfg Schoasch

PS.: Beachte beim Brennen die Fuses, ansonst wird dir der PIC nicht 
anlaufen.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das TRISA register hast du vergessen zu setzten. :-)

An dem lag's wohl nicht, da die TRIS-Register beim Power-On ohnehin auf 
1, also Eingang gesetzt sind.

Ich habe verstanden, dass der PIC die Ausgänge auf 1 setzt, aber sofort 
und nicht erst auf Tastendruck.
Folglich wird der Prozessor wohl laufen.

Wie ist der Tastereingang beschaltet?

Severino

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Taster sind auf Masse

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier selbes Problem bei mir. Wie greif ich auf RA4 zu ohne 0bxxx oder 
0xxx
extern volatile near unsigned char       PORTA;
extern volatile near union {
  struct {
    unsigned RA0:1;
    unsigned RA1:1;
    unsigned RA2:1;
    unsigned RA3:1;
    unsigned RA4:1;
    unsigned RA5:1;
    unsigned RA6:1;
    unsigned RA7:1;

Ist aus der picxxxx.h

Ziel soll es sein direkt den Name zuverwenden, dass ich sagen kann

if(PORTA & RA4)

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
> hier selbes Problem bei mir. Wie greif ich auf RA4 zu ohne 0bxxx oder
> 0xxx
>
>
extern volatile near unsigned char       PORTA;
> extern volatile near union {
>   struct {
>     unsigned RA0:1;
>     unsigned RA1:1;
>     unsigned RA2:1;
>     unsigned RA3:1;
>     unsigned RA4:1;
>     unsigned RA5:1;
>     unsigned RA6:1;
>     unsigned RA7:1;
>
> Ist aus der picxxxx.h
>
> Ziel soll es sein direkt den Name zuverwenden, dass ich sagen kann
>
> if(PORTA & RA4)

Was meinst Du mit (PORTA & RA4)?

Wie spricht man in C die Elemente eines structs an?

Structname.Elementname

Also:

if (PORTAbits.RA4)

Siehe auch besagte picxxxx.h-Datei.

Wenn's noch kürzer gehen soll, musst Du sowas machen:

#define MyRA4 PORTAbits.RA4

Bringt aber nicht wirklich viel, da Du dann u.U. auch LATAbits.RA4 und 
TRISAbits.RA4 definieren müsstest.

Severino

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thx

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heisst bei dem PortB sind die Pullups schon eingeschalten und ich 
muss das nicht mehr machen!
extern volatile near unsigned char       INTCON2;
extern volatile near union {
  struct {
    unsigned RBIP:1;
    unsigned :1;
    unsigned TMR0IP:1;
    unsigned :1;
    unsigned INTEDG2:1;
    unsigned INTEDG1:1;
    unsigned INTEDG0:1;
    unsigned RBPU:1;
  };
  struct {
    unsigned :7;
    unsigned NOT_RBPU:1;
  };
} INTCON2bits;

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
> Das heisst bei dem PortB sind die Pullups schon eingeschalten und ich
> muss das nicht mehr machen!
>
>
extern volatile near unsigned char       INTCON2;
> extern volatile near union {
>   struct {
>     unsigned RBIP:1;
>     unsigned :1;
>     unsigned TMR0IP:1;
>     unsigned :1;
>     unsigned INTEDG2:1;
>     unsigned INTEDG1:1;
>     unsigned INTEDG0:1;
>     unsigned RBPU:1;
>   };
>   struct {
>     unsigned :7;
>     unsigned NOT_RBPU:1;
>   };
> } INTCON2bits;

Warum sollten die eingeschaltet sein?
Warum willst Du die überhaupt einschalten?
Du konfigurierst das Port ja als Output!

Severino

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht mir darum ein Taster hängt am Port RB0 und dann auf Masse. Mit 
diesem Taster möchte ich eine LED einschalte. Jetzt habe ich das so 
verstanden das ich erst die Pull ups einschalten muss das ich mir ein 
High signal machen kann bei Tastendruck.

Taster auf RB0 LED an  RD7
void main(void)   
{    
  LATB   = 0;                      // Auf den Port D LED werden Nullen geschrieben
    TRISB   = 0;                     // PortB LED wird als Ausgang deklariert
    LATB   = 0;                      // Auf PortA werden Nullen geschrieben  
    INTCON2bits.RBPU=1;              // Pull Ups vom Port B eingeschalten
      if(PORTAbits.RA4)              // Wenn am PortB und Eingang RB4 dann
        {
          LATD = 0b10000000;              // PortD RD0 ein
        }  
      else
      {
      LATD = 0b00000000;            // PortD RD0 aus
      }
}

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit
   TRISB   = 0;
schaltest Du das ganze Port B auf Ausgang. Da wirst Du keinen Taster 
einlesen können.

Stattdessen musst Du PortD (mindestens RD7) auf Ausgang schalten.

Du schreibst, der Taster hängt an RB0, im Programm liest Du aber RA4!!!

Wenn Du Pull-Ups einschaltest, bekommst Du ein High-Signal wenn der 
Taster NICHT gedrückt ist, und wenn er gedrückt ist, ein Low-Signal, 
da der Taster ja nach Masse schliesst.

Willst Du nicht mal mit einer Tasse Kaffe oder Tee das Ganze überdenken 
und den Programmcode bereinigen...?

Severino

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hast du schon mal Spruts seite überflogen? Welche erfahrungen und 
Kenntnisse hast du in Sachen Elektronik?

Lies dir mal ein paar Grundlagen durch:
http://www.sprut.de/electronic/pic/grund/ioports.htm#rx

Hier wirst du auch gleich mal lesen, dass du zb ´darauf achten musst, ob 
der Pin nicht auch noch andere funktionen hat und diese vl auch 
Standardmässig eingeschalten sind.
Hinweis: Wenn ein AD-Wandler mit dabei ist, sind diese Pins meisst als 
Analoge eingänge konfiguriert. Das heisst du musst sie als Digitale IOs 
konfigurieren, bevor du sie nutzen kannst. Da ist es jetzt aber egal ob 
du hinaus schreiben willst, oder vom Port einlesen willst.. es ist immer 
die AD-Wandler Konfiguration dominierend.

mfg schoasch

PS.: Den rat von Severino solltest du auch beherzigen.... trink eine 
Tasse und denk dir dabei alles durch :D

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.