Forum: Mikrocontroller und Digitale Elektronik PIC32 TRIS Register setzen


von derneue (Gast)


Lesenswert?

Hallo liebes Forum,

Ich habe eine Frage, da ich mir gerade etwas unsicher geworden bin..
Es geht um einen dsPIC33

Folgendes Szenario:
Ich möchte gerne binär die Pins aus PORT A einstellen ob diese Eingänge 
oder Ausgänge sind.

Was ist wenn es Pins nicht gibt bzw nicht angeschlossen sind? zbsp RA2 
und RA3 ?
Ich kennzeichne mal mit x die Pins die es nicht gibt:
TRISA = 0b11x1101xxxx0xx11

Das kann ich ja so nicht schreiben, bzw das x wird nicht angenommen. 
Dann hab ich gelesen dass standard mässig alle Pins auf Eingang gesetzt 
sind. Also würde das so aussehen:
TRISA = 0b11111011111011

Ist das richtig so ?

Würde mich auf eine Antwort freuen
vielen dank
-derneue

von Toxic (Gast)


Lesenswert?

derneue schrieb:
> TRISA = 0b11111011111011
>
> Ist das richtig so ?

Ganz allgemein:
Schreib die vollen(!) 16bit.In den Positionen fuer nicht(!) 
implementierte Pins,kannst Du reinschreiben was Du willst => "0" oder 
"1"(keine Buchstaben wie "x" - da wuerde sowieso der Compiler 
meckern).Diese Werte werden vom uC ignoriert.

Sind aber alle Pins vorhanden und verwendest nur einige davon nicht,gilt 
auch hier alle 16bits anzugeben UND sinnvollerweise die Pins z.B. als 
Ausgaenge zu konfigurieren.Man kann sie auch als Eingaenge 
verwenden,aber dann musst Du auch dafuer sorgen,das sie mit internen 
oder externen Pull-ups versehen werden.Schwebende Eingaenge mag kein 
uC.....

von derneue (Gast)


Lesenswert?

Oh ja klar, hab da wohl beim abtippen falsch mitgezählt, natürlich 
sollen es 16 bit sein..
Okay Danke, das wollte ich wissen. War mir unklar was reinkommt für 
nicht existierende Pins, warum auch immer das so gemacht wird.

Ne andere Frage: bei mir meckert der Compiler wegen der binären 16 bit 
TRIS zuweisung:
"large integer implicitly truncated to unsigned type"
Mir ist klar dass er meckert weil der Wertebereich überschritten wird, 
aber wo kann ich denn den Typ von TRISA , TRISB etc ändern? Das ist doch 
in der MikroController spezifischen header datei niedergeschrieben. Da 
kann ich doch nicht anfangen rumwurschteln zu gehen, wenn doch der 
richtige Controller ausgewählt ist ?

Vielen dank

von derneue (Gast)


Lesenswert?

OK ist gelöst! Hatte ein bit zu viel drin. Ist wohl zu spät und meine 
Augen werden müde haha
Hätte ja sonst auch kein Sinn ergeben da ich in der entsprechenden 
Header Datei nachgeschaut habe und es ein unsigned int war.

Vielen dank für deine Hilfe, hast mir paar Gedankenanstöße gegeben!

Liebe Grüße,
-derneue

von --- (Gast)


Lesenswert?

Das Datenblatt weiss, wie nicht herausgefuehrte Bits zu setzen sind.

Zu faul da mal nachzusehen?

von derneue (Gast)


Lesenswert?

Zu faul? Man findet halt nicht immer sofort das was man sucht. ALLES 
steht immer irgendwo.. :)

von Klaus (Gast)


Lesenswert?

derneue schrieb:
> TRISA = 0b11111011111011

Ich würd die Bits, immer da wo sie gebraucht werden, einzeln setzen. Das 
macht das ganze besser lesbar.

TRISAbits.TRISA0 = 1;

Da bekommt man auch gleich einen Fehler, wenn bei dem Chip den man 
nutzt, das Bit nicht existiert.

MfG Klaus

von Bummsfallera (Gast)


Lesenswert?

Klaus schrieb:
> derneue schrieb:
>> TRISA = 0b11111011111011
>
> Ich würd die Bits, immer da wo sie gebraucht werden, einzeln setzen. Das
> macht das ganze besser lesbar.
>
> TRISAbits.TRISA0 = 1;
>
> Da bekommt man auch gleich einen Fehler, wenn bei dem Chip den man
> nutzt, das Bit nicht existiert.
>
> MfG Klaus

Genau, das der richtige Weg.

Microchip hat das im Header als Bitfeld aufgelegt. Wenn man wissen will, 
wie es funktioniert, in den Headern ist alles Klartext. Rechtsklick auf 
"TRISBbits" und "jump to definition".

Im Datenblatt das bit suchen ist nicht nötig.

Ich tu das immer so:
1
#define Blinkled_1 LATBbits.LATB1
2
#define tris_Blikled_1  TRISBbits.TRISB1
3
 
4
tris_Blikled_1  = 0;
5
Blinkled_1 = 1;
6
Blinkled_1 = 0;

Das erhöhte die Wiederverendbarkeit des Codes, weil man bei einem 
anderen Board nur ein einzelnes #define anpassen muss, schon läuft das 
mit einem andern PIC oder einem anderen Layout.

von Klaus (Gast)


Lesenswert?

Bummsfallera schrieb:
> Ich tu das immer so:
> #define Blinkled_1 LATBbits.LATB1
> #define tris_Blikled_1  TRISBbits.TRISB1
>
> tris_Blikled_1  = 0;
> Blinkled_1 = 1;
> Blinkled_1 = 0;
>
> Das erhöhte die Wiederverendbarkeit des Codes, weil man bei einem
> anderen Board nur ein einzelnes #define anpassen muss, schon läuft das
> mit einem andern PIC oder einem anderen Layout.

Genau so mach ich das auch

MfG Klaus

von derneue (Gast)


Lesenswert?

Okay vielen dank für die tollen Tipps. Das alles einzeln auszuschreiben 
bringt aber viele Code zeilen auf die Waage.. Komischerweise lese ich in 
den Code beispielen überall nur dass per Hex einfach das ganze Register 
gesetzt wird, ohne jeden Pin einzeln zu setzen.

von derneue (Gast)


Lesenswert?

Habs in der Header Datei nachgeschaut, ist schon praktisch da man wie 
Bummsfallera schon sagte nicht mehr ins Datenblatt schauen muss. Aber 
eigtl müsste der Compiler das doch richtig handhaben wenn per binärer 
Schreibweise ein Bit gesetzt wird obwohl es ein Pin nicht gibt?

von Klaus (Gast)


Lesenswert?

derneue schrieb:
> Habs in der Header Datei nachgeschaut, ist schon praktisch da man wie
> Bummsfallera schon sagte nicht mehr ins Datenblatt schauen muss.

Man muß nicht mal in der Headerdatei nachschauen. Wenn man den Namen des 
Registers weit genug eingetippt hat, schlägt einem die IDE schon mal 
alle vorhandenen Bits oder Bitfelder vor. Man muß dann nur auswählen.

derneue schrieb:
> Das alles einzeln auszuschreiben
> bringt aber viele Code zeilen auf die Waage..

Na und? Ist dein Speicher knapp?

derneue schrieb:
> Komischerweise lese ich in
> den Code beispielen überall nur dass per Hex einfach das ganze Register
> gesetzt wird, ohne jeden Pin einzeln zu setzen.

Damit will der Programmierer nur zeigen, daß er ein ganz harter ist. 
Chuk Norris schreibt seinen Code gleich binär hin.

Und nein, der Compiler weiß nicht, daß es einzelne Bits an einer 
Speicherposition nicht gibt. Er weiß nur, daß für einzelne Bits kein 
besonderer Name definiert ist. Man kann sie daher nicht mit Namen 
ansprechenn.

MfG Klaus

von Bummsfallera (Gast)


Lesenswert?

Klaus schrieb:
> derneue schrieb:
>> Habs in der Header Datei nachgeschaut, ist schon praktisch da man wie
>> Bummsfallera schon sagte nicht mehr ins Datenblatt schauen muss.
>
> Man muß nicht mal in der Headerdatei nachschauen. Wenn man den Namen des
> Registers weit genug eingetippt hat, schlägt einem die IDE schon mal
> alle vorhandenen Bits oder Bitfelder vor. Man muß dann nur auswählen.
>
> derneue schrieb:
>> Das alles einzeln auszuschreiben
>> bringt aber viele Code zeilen auf die Waage..
>
> Na und? Ist dein Speicher knapp?

Es braucht nicht mal mehr Speicher, wenn man nur einen Port setzt - was 
der Normalfall ist. Was die Hexpfriemelei komplett überflüssig macht.

LATB |= 0x0002;
ist genauso viel (oder mehr!) Code wie

LATBbits.LATB2 = 1;

Ich täts halt im Disassembly mal vergleichen, da sieht man es dann 
genau.

Dazu kommt:
Wer einen eigenen Codefundus für PIC32 aufbaut merkt schnell, dass das 
Bitgepfriemel nicht praxistauglich ist.
Benutzt man ein #define für jeden Pin, ist der Code in Sekunden auf ein 
neues Projekt portiert, wohingegen der Bit-Chuck-Norris mit dem Scope 
vor der Platine sitzt und nicht findet, wo das Bit falsch gepfriemelt 
wurde.

Ich weiß das, weil ihc das schon getan habe. Genau Einmal.

Apropos Performance:
Cache ist aktiv und Flash- und SRAM-waitstates sind gesezt? Ich frag 
nur, das ist ein fieser Fallstrick bei PIC32. Das nicht zu tun kostet 
satt Performance.

von derneue (Gast)


Lesenswert?

Ok liebend dank an alle. Habe mir mal Gedanken drüber gemacht, und finde 
es jetzt auch besser alles per define zu setzen. Sieht auch schon viel 
übersichtlicher aus und wird es tatsächlich für ein neues Layout 
einfacher machen.

Ich habe das jetzt so gemacht:
Ich habe eine board.h und eine board.c , wo die ganzen Pins konfiguriert 
werden.(folgendes nur als beispiel)

In der Board.h :
#define TRIS_D1 TRISAbits.TRISA01
#define ANSEL_D1 ANSELAbits.ANSA01
#define D1 PORTAbits.RA01 //zum Abfragen

Und in der Board.c :
TRIS_D1=1;
ANSEL_D1=0;

D1 wird dann irgendwo in der main.c benutzt..

Ehm zur Performance:
Weiß ich noch nicht, hab die config Bits noch nicht eingestellt. Wollte 
dies eventuell über den "Bitkonfigurator" in MPLAP machen, muss mich da 
aber noch einlesen was da genau alles eingestellt werden muss.

LG

von derneue (Gast)


Lesenswert?

es soll natürlich TRISAbits.TRISA1 heißen und nicht 01.

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.