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 :)
Hausaufgabe? Außerdem stehts das doch in den Kommentaren!
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?
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?!
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.
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; |
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)
HyperMario schrieb: > Muss das nicht volatile sein? Hast sicher einen Fehler in den von Microchip gelieferten Headerfiles gefunden. MfG Klaus
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); |
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.