mikrocontroller.net

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


Autor: Hilfesuchend (Gast)
Datum:
Angehängte Dateien:

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

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hausaufgabe?
Außerdem stehts das doch in den Kommentaren!

Autor: Dirk F (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht doch oben !
Port D als Output
Port B als Input

Autor: Hilfesuchend (Gast)
Datum:

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

Autor: Teo D. (teoderix)
Datum:

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

Autor: jemand (Gast)
Datum:

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

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht 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!
typedef union {
    struct {
        unsigned                        :7;
        unsigned NOT_RBPU               :1;
    };
    struct {
        unsigned RBIP                   :1;
        unsigned                        :1;
        unsigned TMR0IP                 :1;
        unsigned                        :1;
        unsigned INTEDG2                :1;
        unsigned INTEDG1                :1;
        unsigned INTEDG0                :1;
        unsigned nRBPU                  :1;
    };
    struct {
        unsigned                        :7;
        unsigned RBPU                   :1;
    };
} INTCON2bits_t;

Autor: Volker S. (vloki)
Datum:

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

Autor: HyperMario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker S. schrieb:
> typedef union {

Muss das nicht volatile sein?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HyperMario schrieb:
> Muss das nicht volatile sein?

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

MfG Klaus

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht 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)
...
} INTCON2bits_t;
extern volatile INTCON2bits_t INTCON2bits __at(0xFF1);

Autor: HyperMario (Gast)
Datum:

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

Autor: Volker S. (vloki)
Datum:

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

Autor: Dr. Sommer (Gast)
Datum:

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

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.