Forum: Mikrocontroller und Digitale Elektronik PIC C-Syntax: Einzelnen I/O Pin toggeln


von Alex (Gast)


Lesenswert?

Hallo community,
entschuldigung vorab für die recht triviale frage, ich habe sie trotzdem 
noch nicht über google klären können:

Ich habe von einem Freund (ist im Urlaub) ein PIC Projekt bekommen, für 
das ich ein paar Funktionen schreibe. Nun habe ich allerdings auf dem 
Evalboard eine LED hinzugefügt und möchte nun wissen, wie ich den 
einzelnen Pin (PB13) auf OUT stelle, damit ich die LED aktivieren kann.

Ich bin in der PIC programmierung noch nicht sehr bewandert, habe bisher 
nur AVRs gemacht. Ich weiß, dass man mit
1
LATBbits.LATB0 = 1;    //einen Ausgang setzt
2
 
3
TRISB = 0x80;          // I/O Pins definiert

Mein Problem ist: Die I/O definition der Pins abgesehen von meinem Pin13 
ist mir nicht bekannt, ich möchte sie aber auch nicht ändern - nur Pin13 
von I auf O schalten. Im Code von meinem Freund ist die TRISB def so 
nicht eindeutig für mich (findet also nicht so statt, wie oben im 
Beispiel angegeben).

Wie kann ich das lösen?

von K. D. (deka)


Lesenswert?

So schwer ist das nicht.

Alles das gleiche:

TRISB = 0x80;                // hexadezimal
TRISB = 0b10000000;          // binär
TRISB = 128;                 // dezimal

0x80 = 0b10000000 = 128

Am besten sieht mans bei der binären Darstellung 0b10000000
1 = Eingang (I)
0 = Ausgang (O)

Welcher Pin das genau ist kann ich dir nicht sagen, ich kenne den 
genauen PIC nicht. Sieht aber nach einem 16 bit PIC aus. Dann heißt es 
bei dir:
TRISB = 0b0000000010000000;

Jetzt musst du eben noch die 1 für PB13 setzen:
TRISB = 0b0010000010000000;



Alternativ:

Alex schrieb:
> LATBbits.LATB0 = 1;    //einen Ausgang setzt

Sowas hängt vom Compiler ab. Da gibt es keinen festen Synatx. Wenn das 
Syntax für deinen C Compiler ist dann:

TRISBbits.TRISB13 = 1;   // RB13 ist Ausgang

von Alex (Gast)


Lesenswert?

Hallo! Herzlichen Dank für die Hilfe schonmal!
Das Problem ist, dass das TRISB = 0x80 ein Beispiel ist und ich eine 
Portdefinition wie diese nicht im Code finden kann.
Ich hab also die bisherige I/O Def der anderen pins nicht, sonst könnte 
ichs mir ja binär zusammenreimen. Die Frage ist: Kann ich auch einen 
einzelnen Pin setzten wenn die anderen unbekannt sind? Ich will die ja 
nicht einfach zu 0 oder 1 setzen.

von Klaus (Gast)


Lesenswert?

Für jeden PIC gibts einen Headerfile, da steht alles drin. Und wenn du 
mit MPLABX arbeitest, einfach z.B. auf das LATBbits.LATB0 klicken und 
dann "Goto Declaration" aufrufen (ist glaub ich Ctrl-B). Dann wird der 
richtige File geladen.

MfG Klaus

von Edson (Gast)


Lesenswert?

K. D. schrieb:
> TRISBbits.TRISB13 = 1;   // RB13 ist Ausgang

Nein, so wird RB13 ein Eingang. Die Direction-Bits sind bei Microchip 1 
= In, 0 = Out

> Die Frage ist: Kann ich auch einen einzelnen Pin setzten wenn die anderen
> unbekannt sind? Ich will die ja nicht einfach zu 0 oder 1 setzen.

Beispiel:
1
   LATB |= (1<<RB13);    // setzt den Ausgang RB13 auf 1
2
   LATB &= ~(1<<RB13);   // setzt den Ausgang RB13 auf 0

oder eben über die vordefinierten Strukturen (z.B. LATBbits)

von Frank K. (fchk)


Lesenswert?

K. D. schrieb:

> TRISBbits.TRISB13 = 1;   // RB13 ist Ausgang

MEEP! FEHLER!

Die Bitdefinition für I/O ist bei den PICs genau andersherum. Wenn ein 
Bit im TRIS Register (=DDR bei AVR) auf 1 ist, dann liest Du I für 
Input. Wenn das Bit auf 0 (Null) steht, liest Du O (oh) für Output. Das 
ist die Eselsbrücke und damit genau umgekehrt wie beim AVR, wo 0 für 
Input und 1 für Output ist. Nach einem Reset stehen alle Bits im TRIS 
Register auf 1.

AVR PIN ist PIC PORT -> zB PORTBbits.RB3
AVR PORT ist PIC LAT (Latch) -> zB LATBbits.LATB3
AVR DDR ist PIC TRIS (TriState) -> zB TRISBbits.TRISB3

Das ist bei allen PICs so, egal ob 8, 16 oder 32 Bit. Nur einige ganz 
kleine oder ganz alte PICs haben kein LAT-Register, hier musst Du ins 
PORT-Register schreiben (mit den bekannten Nebenwirkungen beim Lesen, 
aber das weißt Du da vom AVR)

Integrierte Pullups haben nicht alle PICs - die die es haben, haben 
dafür extra Register.

Mache PICs (insbesondere die 16 und 32 Bitter) können die IO-Pins auf 
Open Collector bzw Open Drain schalten. Dafür gibts die ODC-Register.

Das erstmal so als Einführung.

fchk

von Alex (Gast)


Lesenswert?

Vielen Dank euch!

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.