Forum: Mikrocontroller und Digitale Elektronik PIC18F46K20 Hilfe bei Code- Verständnis


von Hilfesuchend (Gast)


Angehängte Dateien:

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 :)

von Teo D. (teoderix)


Lesenswert?

Hausaufgabe?
Außerdem stehts das doch in den Kommentaren!

von Dirk F (Gast)


Lesenswert?

Steht doch oben !
Port D als Output
Port B als Input

von Hilfesuchend (Gast)


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?

von Teo D. (teoderix)


Lesenswert?

Ich würd mal ins Dabla schauen!
http://ww1.microchip.com/downloads/en/devicedoc/40001303h.pdf

Hilfesuchend schrieb:
> Wie steht das in Verbindung mit einem Pull-Up
> Widerstand?

Spoiler: Der hat welche eingebaut. Wie sonnst könnte man den die 
aktivieren?!

von jemand (Gast)


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.

von Volker S. (vloki)


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;

von Volker S. (vloki)


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)

von HyperMario (Gast)


Lesenswert?

Volker S. schrieb:
> typedef union {

Muss das nicht volatile sein?

von Klaus (Gast)


Lesenswert?

HyperMario schrieb:
> Muss das nicht volatile sein?

Hast sicher einen Fehler in den von Microchip gelieferten Headerfiles 
gefunden.

MfG Klaus

von Volker S. (vloki)


Lesenswert?

HyperMario schrieb:
> Muss das nicht volatile sein?

Ist ja erst mal nur eine Typdefinition im Prozessorheader.
(Wird aber in der nächsten Zeile auch als extern volatile deklariert)
1
...
2
} INTCON2bits_t;
3
extern volatile INTCON2bits_t INTCON2bits __at(0xFF1);

von HyperMario (Gast)


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?

von Volker S. (vloki)


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.

von Dr. Sommer (Gast)


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.

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.