Forum: Mikrocontroller und Digitale Elektronik µC Pin Abfrage


von gast (Gast)


Lesenswert?

1
void main(void) 
2
{ 
3
  int Taste1;
4
  
5
  LATB = 0;      // Auf den Port B werden Nullen geschrieben
6
    TRISB = 0;     // PortB wird als Ausgang deklariert
7
    LATA = 0;  
8
  
9
  if(TRISA)
10
    {
11
  LATB = 0b0111;    // PortB Pin4=0,Pin3-0=1, 
12
    }
13
}

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

von Falk B. (falk)


Lesenswert?

Welcher Prozessor?

MFG
Falk

von Franz-Rainer (Gast)


Lesenswert?

Klingt nach PIC oder?

von gast (Gast)


Lesenswert?

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

von gast (Gast)


Lesenswert?

ja?

von Franz-Rainer (Gast)


Lesenswert?

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

von Franz-Rainer (Gast)


Lesenswert?


von Schoasch (Gast)


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_openwiki/Itemid,123/

Und hier gleich die Infos zu den IO-Ports:
http://www.fernando-heitor.de/component/option,com_openwiki/Itemid,123/id,mikrocontroller:einfuehrung/#io_ports

Ansonst gibts auch noch www.sprut.de .

mfg Schoasch

von FArs (Gast)


Lesenswert?

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

von Dieter Werner (Gast)


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.

von Severino R. (severino)


Lesenswert?

Versuchs mal so:
1
void main(void) 
2
{ 
3
  int Taste1;
4
  
5
  LATB = 0;      // Auf den Port B werden Nullen geschrieben
6
  TRISB = 0;     // PortB wird als Ausgang deklariert
7
  LATA = 0;      // <- überflüssig
8
  
9
 
10
  while(1)       // loop forever
11
  {
12
    if(PORTA & 0x10)
13
    {
14
      LATB = 0b0111;    // PortB Pin4=0,Pin3-0=1, 
15
    }
16
  }
17
}

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

Severino

von Schoasch (Gast)


Lesenswert?

Hi

Das TRISA register hast du vergessen zu setzten. :-)
1
void main(void) 
2
{ 
3
  int Taste1;
4
  
5
  LATB = 0;          // Auf den Port B werden Nullen geschrieben
6
  TRISB = 0;         // PortB wird als Ausgang deklariert
7
  TRISA = 0x10;      // RA4 wird als Eingang definiert
8
  
9
 
10
  while(1)       // loop forever
11
  {
12
    if(PORTA & 0x10)
13
    {
14
      LATB = 7;    // PortB Pin4=0,Pin3-0=1, 
15
    }
16
    else
17
    {
18
      LATB = 0;
19
    }
20
  }
21
}

mfg Schoasch

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

von Severino R. (severino)


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

von gast (Gast)


Lesenswert?

Taster sind auf Masse

von gast (Gast)


Lesenswert?

hier selbes Problem bei mir. Wie greif ich auf RA4 zu ohne 0bxxx oder 
0xxx
1
extern volatile near unsigned char       PORTA;
2
extern volatile near union {
3
  struct {
4
    unsigned RA0:1;
5
    unsigned RA1:1;
6
    unsigned RA2:1;
7
    unsigned RA3:1;
8
    unsigned RA4:1;
9
    unsigned RA5:1;
10
    unsigned RA6:1;
11
    unsigned RA7:1;

Ist aus der picxxxx.h

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

if(PORTA & RA4)

von Severino R. (severino)


Lesenswert?

gast wrote:
> hier selbes Problem bei mir. Wie greif ich auf RA4 zu ohne 0bxxx oder
> 0xxx
>
>
1
extern volatile near unsigned char       PORTA;
2
> extern volatile near union {
3
>   struct {
4
>     unsigned RA0:1;
5
>     unsigned RA1:1;
6
>     unsigned RA2:1;
7
>     unsigned RA3:1;
8
>     unsigned RA4:1;
9
>     unsigned RA5:1;
10
>     unsigned RA6:1;
11
>     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

von gast (Gast)


Lesenswert?

thx

von gast (Gast)


Lesenswert?

Das heisst bei dem PortB sind die Pullups schon eingeschalten und ich 
muss das nicht mehr machen!
1
extern volatile near unsigned char       INTCON2;
2
extern volatile near union {
3
  struct {
4
    unsigned RBIP:1;
5
    unsigned :1;
6
    unsigned TMR0IP:1;
7
    unsigned :1;
8
    unsigned INTEDG2:1;
9
    unsigned INTEDG1:1;
10
    unsigned INTEDG0:1;
11
    unsigned RBPU:1;
12
  };
13
  struct {
14
    unsigned :7;
15
    unsigned NOT_RBPU:1;
16
  };
17
} INTCON2bits;

von Severino R. (severino)


Lesenswert?

gast wrote:
> Das heisst bei dem PortB sind die Pullups schon eingeschalten und ich
> muss das nicht mehr machen!
>
>
1
extern volatile near unsigned char       INTCON2;
2
> extern volatile near union {
3
>   struct {
4
>     unsigned RBIP:1;
5
>     unsigned :1;
6
>     unsigned TMR0IP:1;
7
>     unsigned :1;
8
>     unsigned INTEDG2:1;
9
>     unsigned INTEDG1:1;
10
>     unsigned INTEDG0:1;
11
>     unsigned RBPU:1;
12
>   };
13
>   struct {
14
>     unsigned :7;
15
>     unsigned NOT_RBPU:1;
16
>   };
17
> } INTCON2bits;

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

Severino

von gast (Gast)


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
1
void main(void)   
2
{    
3
  LATB   = 0;                      // Auf den Port D LED werden Nullen geschrieben
4
    TRISB   = 0;                     // PortB LED wird als Ausgang deklariert
5
    LATB   = 0;                      // Auf PortA werden Nullen geschrieben  
6
    INTCON2bits.RBPU=1;              // Pull Ups vom Port B eingeschalten
7
      if(PORTAbits.RA4)              // Wenn am PortB und Eingang RB4 dann
8
        {
9
          LATD = 0b10000000;              // PortD RD0 ein
10
        }  
11
      else
12
      {
13
      LATD = 0b00000000;            // PortD RD0 aus
14
      }
15
}

von Severino R. (severino)


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

von Schoasch (Gast)


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

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.