Die Konfiguration der Portpins ist leider nicht allgemeingültig für alle PICs, da ist das Datenblatt dein A&O für I/O
Der PIC16F877A z.B. hat keine Pullups am PortD. Also müssen Pullups extern angeschlossen oder auf dem Entwicklungsboard gejumpert werden. Auch hat der 877 keine LAT Register, man gibt also direkt auf PORT aus.
Die Pullups der Ports, die welche haben werden über Flags in den SFR (special function register) aktiviert. Z.B. um die Pullups am PortB des PIC16F877A zu aktivieren wird das Flag nRBPU im Register OPTION_REG gelöscht. Der XC8 bringt für alle Register Definitionen und Strukturen mit Bitfeldern mit und so gibt es diverse Möglichkeiten auf die Register und auf die Flags zuzugreifen. Um das nRBPU Flas im OPTION _REG zu löschen fallen mir drei gleichwertige ein:
Auch beim Zugriff auf die I/O Pins gibt es diverse Möglichkeiten. Ich definiere mir meistens Labels für die Hardwarezuordnung und nutze die von XC8 fürs PORTD definierte Struktur PORTDbits mit Bitfeldern. Für die meisten Register definiert XC8 solche Strukturen mit ABCbits im Namen. Um nah an deinem Beispiel zu bleiben würde ich die Pins für Taster und LED mit Labeln benennen und so sähe das bei mir vielleicht ausCode:OPTION_REG &= ~(1 << _OPTION_REG_nRBPU_POSN); OPTION_REG &= ~_OPTION_REG_nRBPU_MASK; OPTION_REGbits.nRBPU = 0; nRBPU = 0;Hier noch ein paar deutschsprachige Tutorials, die das Thema Benutzung der I/O Pins in C beleuchten:Code:#include <xc.h> #define TasterLEDan PORTDbits.RD0 #define TasterLEDaus PORTDbits.RD1 #define LED4 PORTDbits.RD4 void main(void) { TRISD = 0b00001111; // D0..D3 INPUT D4..D7 OUTPUT while(1){ if(TasterLEDan == 0){ LED4 = 1; } if(TasterLEDaus == 0){ LED4 = 0; } } }
https://pic-projekte.de/blog/pic-c-t...ziell-fur-pic/
http://www.hs-ulm.de/users/vschilli/.../uCquick-X.pdf -> s. Kapitel 3
http://www.sprut.de/electronic/pic/c...isches.html#io
*******
Noch ein Nachtrag. Um nachzusehen, welche Definitionen für ein bestimmtes Register im XC8 vorliegen, schaue ich im entspr. Header nach. Dafür reicht ein STRG+Klick auf den Registernamen. Gebe z.B. im Quelltext PORTD ein, mach ein STRG+Klick drauf und schwups bist du z.B. im pic16f877a.h an der Stelle der für PORTD relevanten Definitionen. Nur die Bitdefinitionen wie RD0 und RD4 findet man an etwas anderer Stelle in der Headerdatei. Ob man in C PORTDbits.RD4 = 0 hinschreibt oder RD4 = 0 ist letztendlich Geschmacksache. Aus beidem wird im Assembler das gleiche BCF PORTD, 0x4
Gruß
witkatz
Lesezeichen