Forum: Mikrocontroller und Digitale Elektronik PIC Port Pins namen geben und strukturieren


von S. K. (theodrin)


Lesenswert?

Hallo! arbeite mit PIC18F2550

Also Problem. Hab mal Code geschrieben und das so ziemlich auf: Es muss 
nur funktionieren. Mittlerweile schau ich mir den wieder an, will ihn 
wieder verwenden, will was umändern und es fällt mir auf, uff, da muss 
man sich ja erst wieder einlesen.
Also hab ich mir gleich gedacht, ich strukturier die Bezeichnungen 
meiner Portpins neu, mit denen ich arbeite. Problem diesmal ist, dass 
eben an einem Port nicht nur mein LCD (im 4 Bit Mode) hängt, sondern 
auch andere sachen. Und ich damals ziemlich wüst gleich den ganzen Port 
neu gesetzt hab, weil ich eben die anderen 4 Pins nicht gebraucht hab. 
Also muss ich mir das alles anschauen und umbessern. Und dabei dacht ich 
gleich an weitere Verbesserungen.
Also ich schreib mal zusammen was ich so wollte:
1: bessere Bezeichnungen für jeden Pin, wenn ich mal separat nur einen 
Pin -> gut war nicht schwierig
2: neue Strukturen herstellen, damit ich einige Pins zusammenfasse und 
damit auf die zugreifen kann aber nicht andere störe.

Und da hakts jetzt ein bisschen:

ich hab mir die schreiberei aus den anderen Files von Microchip 
rausgesucht und mal gut glück versucht obs geht:

von Microchip
1
extern volatile near unsigned char       LATB;
2
extern volatile near struct {
3
  unsigned LATB0:1;
4
  unsigned LATB1:1;
5
  unsigned LATB2:1;
6
  unsigned LATB3:1;
7
  unsigned LATB4:1;
8
  unsigned LATB5:1;
9
  unsigned LATB6:1;
10
  unsigned LATB7:1;
11
} LATBbits;

Meine Variante im Code:
1
extern volatile near struct {
2
  unsigned LATB0:1;
3
  unsigned LATB1:1;
4
  unsigned LATB2:1;
5
  unsigned LATB3:1;
6
} LCD_DATA;

Wollts dann eben ansprechen mit LCD_DATA = 0x3 oder irgendwas, aber da 
spinnt der Compiler. "Type Mismatch in Assignment" Habs versucht 
künstlich auf 8 bit aufzublasen aber ging auch nicht

von Peter D. (peda)


Lesenswert?

Wenn der PIC Compiler auf dem GCC aufbaut, sollte es genauso gehen, wie 
beim AVR:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip

Ich nehme sehr gerne Bitvariablen, damit wird dann der Code sehr gut 
lesbar.


Peter

von S. K. (theodrin)


Lesenswert?

Ja im Moment mach ichs eh auch mit jeden einzelnen bit, aber das ist 
sehr mühsam wenn du alle bits auf einmal umändern möchtest und ich will 
keine Ports direkt verwenden sondern eben immer nur über meinen Namen 
gehen. Ich will auch keine halben Ports verwenden. Da soll alles einmal 
im .h File drinnen stehen was was ist und ins C-File will ich später 
dann eigentlich vermeiden reinzuschauen.
Und gut ich mach jetzt z.B. so
TRIS_LCD_D0 = 0;  //Für auf Ausgang setzen
TRIS_LCD_D1 = 0;
...
...
und sowas wäre doch wie dafür geschaffen einfach zu sagen:

TRIS_LCD_DATA = 0; //setze alle Datenpins auf Ausgang

und das wollt ich eigentlich mit den structs erreichen.

Und gut ich habs mir jetzt angesehen, das mit dem Code. Und natürlich. 
Ich kann die 4 dinger in eine Funktion hineinpacken und der den Wert 
übergeben, das ist eine Verbesserung, ganz klar.
Aber von der Laufzeit her ist es das selbe, bzw. noch langsamer, als so. 
Weil wenn ich einen Port direkt anspreche ist das ja eine aktion also 
alle pins auf einmal auf einen Wert setzten, oder?
Und so vertu ich immer 4 Sachen wofürs schneller ginge?

von holger (Gast)


Lesenswert?

>Weil wenn ich einen Port direkt anspreche ist das ja eine aktion also
>alle pins auf einmal auf einen Wert setzten, oder?

Bullshit. Du wolltest doch vermeiden die anderen Bits zu ändern.
Mit einem Zugriff geht das schon mal nicht.

a) LATB lesen in tmp
b) Neue Bits in tmp ändern
c) tmp in LATB ausgeben

Wo ist da jetzt der Vorteil?
Bei der Pinbelegung bist du dann auf aufsteigende
Bits angewiesen. Sonst wird das eine elende Schieberei
und Maskiererei.

Bei Peters Lösung kannst du die Pins auf mehrere Ports
verteilen. Reihenfolge egal.

von S. K. (theodrin)


Lesenswert?

Gut ich bin jetzt mit der Lösung es super zufrieden.
Hab mir die Funktionen gemacht und funktioniert.
Und am besten ist dass ich im .h File nur meine Ports ändern muss und es 
klappt weiterhin.
Gut so, danke für die Hilfe.
Wollte das halt zuerst über die Portnamen machen. Also eine neue 
Struktur, wo eben nur die Pins drinnen sind, die ich drinnen haben will. 
Wie er das dann setzt ist mir egal. aber gut so

von Peter D. (peda)


Lesenswert?

Ich sehe keinerlei Nachteile in der völlig wahlfreien Pinzuordnung für 
das LCD.
Man muß ja eh nach jedem Byte 40..50µs warten, da macht das bischen 
Bitgeklimpere kaum was aus.
Außerdem mache ich die LCD-Ausgaben eh noch langsamer, damit sie der 
Benutzer auch ablesen kann. Z.B. nur alle 200ms, das ist ein 
ergonomischer Wert. Die LCD-Ausgaben kosten also unter 1% CPU-Last, da 
muß man nicht knausern.


Will man mehre Bits gruppieren, wirds haarig.
Dann ist die Zuordnung nicht mehr beliebig möglich.
Der Code wird durch das Geschiebe/AND/OR usw. auch nicht wirklich viel 
kleiner.
Außerdem sind dann die Zugriffe nicht mehr atomar, d.h. schreibt ein 
Interrupt auf andere Pins des gleichen Ports, dann krachts.


Peter

von holger (Gast)


Lesenswert?

>Außerdem sind dann die Zugriffe nicht mehr atomar, d.h. schreibt ein
>Interrupt auf andere Pins des gleichen Ports, dann krachts.

Könnte mit deinem Code bei einem ATMega128 auf PORTF auch passieren ;)

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.