mikrocontroller.net

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


Autor: S. K. (theodrin)
Datum:

Bewertung
0 lesenswert
nicht 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
extern volatile near unsigned char       LATB;
extern volatile near struct {
  unsigned LATB0:1;
  unsigned LATB1:1;
  unsigned LATB2:1;
  unsigned LATB3:1;
  unsigned LATB4:1;
  unsigned LATB5:1;
  unsigned LATB6:1;
  unsigned LATB7:1;
} LATBbits;

Meine Variante im Code:
extern volatile near struct {
  unsigned LATB0:1;
  unsigned LATB1:1;
  unsigned LATB2:1;
  unsigned LATB3:1;
} 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: S. K. (theodrin)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. K. (theodrin)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

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.