PIC18F46K20 Hilfe bei Code- Verständnis

Gast #5642386
Lesenswert?

Hallo Leute!

Ich bin ziemlich unerfahren mit dem Thema Mikrocontroller und suche 
Hilfe beim Verständnis dieses Codes (in C-Programmierung). Hier sollten 
mit Hilfe von Schaltern eine LED nach der Anderen zum Leuchten gebracht 
werden. Wie sind in diesem Abschnitt die Ports konfiguriert?

Vielen Dank für Antworten :)
Angehängte Dateien:
Gast #5642405
Lesenswert?

Danke, das mit der Port Konfiguration ist noch ersichtlich aber ich 
verstehe die anderen Zeilen drum herum nicht. Was genau wird durch die 
Zeilen ausgedrückt? Wie steht das in Verbindung mit einem Pull-Up 
Widerstand?
Gast #5643064
Lesenswert?

Für Anfänger kann das schon schwierig sein, und für erfahrenere 
Programmierer ist das alles so superselbstverständlich. Daher die 
Antworten. Kann ich schon verstehen.
Aber so einfach sind die Datenblätter nun mal nicht zu lesen.

Lies das Kapitel 10 im Datenblatt. Noch einfacher: Kuck dir das Bild 
Figure 10-1 an, das ist eine Art "Schaltplan", das beschreibt, was so 
ein IO-Port eigentlich ist. Leider ist es also nicht ganz so einfach, 
den einzuschalten.

Du musst:
- Den IO-Port als digitalen Port deklarieren (ANSEL...)
- Den IO-Port als Ausgang deklarieren (TRIS...)
- Den Pull-Up ausschalten / einschalten (WPUB...)
Erst dann kannst du ihn mit "LATB...) verwenden.

Diese Schreibweise "WPUBbits.WPUB0" ist einfach nur ein Zugriff auf die 
einzelnen bits          ^^^^
Microchip hat in einem Header Bitfelder deklariert, um das zu 
vereinfachen.

WPUBbits.WPUB0 schaltet das Bit WPUB0 im Register WPUB aus.
#5643675
Lesenswert?

jemand schrieb:
> WPUBbits.WPUB0 schaltet das Bit WPUB0 im Register WPUB aus.

Deshalb sollte man wohl besser WPUBbits.nWPUB0 oder WPUBbits.NOT_WPUB0 
benutzen!
1
typedef union {
2
    struct {
3
        unsigned                        :7;
4
        unsigned NOT_RBPU               :1;
5
    };
6
    struct {
7
        unsigned RBIP                   :1;
8
        unsigned                        :1;
9
        unsigned TMR0IP                 :1;
10
        unsigned                        :1;
11
        unsigned INTEDG2                :1;
12
        unsigned INTEDG1                :1;
13
        unsigned INTEDG0                :1;
14
        unsigned nRBPU                  :1;
15
    };
16
    struct {
17
        unsigned                        :7;
18
        unsigned RBPU                   :1;
19
    };
20
} INTCON2bits_t;
#5644350
Lesenswert?

Sorry, da haben wir wohl etwas durcheinander gebracht ;-)

Die WPUB Bits schalten die Pull-Ups natürlich "ein" (high-activ),
nur das globale RBPU Bit ist low-activ.

Die INTCON2bits_t Union im vorhergehenden Post passt natürlich.
Das, was drüber steht ist Unsinn. (es gibt keine nWPUBx)
Gast #5645258
Lesenswert?

Klaus schrieb:
> Hast sicher einen Fehler in den von Microchip gelieferten Headerfiles
> gefunden.

Eher nicht sattelfester C-Progger

Volker S. schrieb:
> Ist ja erst mal nur eine Typdefinition im Prozessorheader.
> (Wird aber in der nächsten Zeile auch als extern volatile deklariert)

Danke und gleich noch ne Frage:

C hat ja das register keyword. Das ist doch alles in einem Register. 
Wieso
hat Microchip das weggelassen?
#5645580
Lesenswert?

HyperMario schrieb:
> C hat ja das register keyword. Das ist doch alles in einem Register.
> Wieso hat Microchip das weggelassen?

Bei den 8-Bit PICs gibt es nur "Register". Auch die RAM Bereiche für die 
Programm-variablen verhalten sich wie Register.
Es ist so nicht nötig, eine Variable in ein spezielles "Register" zu 
laden um damit arbeiten zu können.
Somit ist es auch nicht nötig, den Compiler anzuweisen, dass eine 
Variable in einem Register gehalten werden soll, oder dass es sich wie 
z.B. bei den I/O Adressen Register handelt.

Das Keyword Register macht einfach gar keinen Sinn mehr, wenn der 
gesamte Speicherbereich diese Eigenschaft aufweist.
Gast #5645589
Lesenswert?

HyperMario schrieb:
> C hat ja das register keyword. Das ist doch alles in einem Register.
> Wieso

Das war sowieso nicht für Peripherie-Register gedacht, sondern als 
Hinweis an den Compiler, dass eine bestimmte Variable oft benutzt wird 
und daher in einem Prozessor-Kern-Register gehalten werden soll, anstatt 
sie auf den Stack zu laden. Heutige Compiler sind aber schlau genug um 
das von selbst zu merken, weshalb dieses Keyword praktisch überflüssig 
ist. Manche Compiler benutzen das noch für Erweiterungen, z.B. um das 
ABI für Syscalls zu definieren. In "normalem" Code braucht man das aber 
nicht mehr, und bei der ursprünglichen Nutzungsart wird es vom Compiler 
meist einfach ignoriert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren