Hallo, ich bin ein absoluter Neuling auf dem Gebiet der PIC-Programmierung. Mit C habe ich schon kleine Erfahrungen. Ich möchte einen PIC 18F2550 mit C programmieren und habe mir einen kleine Testplatine aufgebaut. Ich habe es geschafft mit MPLAB einen C-Code zu schrieben, der Ausgänge gezielt ansteuert (8 Dioden an Port B) An RA0 ist soll ein Eingang definiert werden. Was nicht funktioniert ist die Deklarierung der Eingänge. Kann mir da jemand helfen? Habe gefühlt schon das halbe Internet gelesen. Ich hänge mal mein kleines Testprogramm hier an. Vielen Dank für eure Hilfe. //Includes #include <p18f2550.h> #include "delays.h" //Config #pragma config PLLDIV = 5 // (20 MHz input) #pragma config PWRT = ON #pragma config BOR = OFF #pragma config WDT = OFF #pragma config LVP = OFF //defines #define LED1 LATBbits.LATB0 #define LED2 LATBbits.LATB1 #define LED3 LATBbits.LATB2 #define LED4 LATBbits.LATB3 #define LED5 LATBbits.LATB4 #define LED6 LATBbits.LATB5 #define LED7 LATBbits.LATB6 #define LED8 LATBbits.LATB7 #define EIN LATAbits.LATA0 //Declaration #pragma code void main (void) { int i=100; int j=0; TRISA=1; //PORTA - Eingang??? TRISB=0; //PORTB - Ausgang PORTB=0; //Ausgänge ausschalten // zur orientierung, ob sich das Programm geändert hat und ob überhaupt etwas läuft LED1=0; LED2=0; LED3=0; LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; while(1) { LED1 = 1; LED2 = 0; Delay10KTCYx(i); //warten LED1 = 0; LED2 = 1; Delay10KTCYx(i); //warten if (EIN == 1) // schnelle Blinken wenn Schalter betätigt { LED3=1; i=100; LED4=0; } else { i=1000; LED4=1; LED3=0; } if (EIN == 0) // LED5 ist aus, wenn Schalter gedrückt { LED5=1; LED6=0; } else { LED6=1; LED5=0; } } LED7=1; }
pic-projekte.de Da auf Wiki, und dann auf PIC C Tutorial. Sorry gibt keinen Direktlink. Noch zu deinem Problem, das mit LATA = 1; stimmt schon soweit. Wie ist deine Hardwarebeschaltung für den Eingang auf deinem Board ? Und ich würde wenn es mit Eingängen noch garnicht geht, ein etwas einfacheres Programm stricken, um das mit den Eingängen zu testen. z.B: Lg Tim while(1) { if(EIN==1) { LED1=1; } else { LED1=0; } }
Die Schaltung ist folgende - 5V über Taster auf RA0 - 10kOhm zwischen RA0 und 0V
Auf pic-projekte.de ist die Rede von "TRISB = 0x80; //So stellt man I und O ein" Wie ist das mit der Hexadezimalzahl zu interpretieren?
Hey, also die Hexzahl stellt follgendes dar: 0x80 = 0b10000000 Das bedeutet, das nur auf Port B das Bit 0 ein Eingang ist, und alles andere ein Ausgang. Bei dir ist alles auf Port A ein Eingang, und alles auf Port B ein Ausgang. LG Tim
Ah. Ok. Danke. Trotzdem funktioniert es nicht. Viele Grüße, Sebastian
Es muss #define EIN PORTAbits.RA0 statt #define EIN LATAbits.LATA0 heißen
Ich glaube, da fehlt noch etwas in dieser Art:
1 | adcon1 = 0b00001111; |
Insbesondere Port A hat einige Bits, die per Default Spezialfunktionen haben, wenn man die nicht abschaltet. Der Wert 0b1111 passt für den 18f2580; du müsstest noch nachschauen, was der 2550 hier braucht. Vielleicht 0b111. -- Ulrich
>0x80 = 0b10000000 >Das bedeutet, das nur auf Port B das Bit 0 ein Eingang ist, und alles >andere ein Ausgang. Leider Falsch. Nicht Bit0 sondern Bit7. Bei PIC uCs haben Analog funktionen priorität. d.h. mann muss alle Analog Peripherie erstmal deaktivieren (ADC, Komparatoren, usw...). Ansonsten wie schon gesagt. Und LATx benutzt mann für Ausgänge, PORTx für Eingänge. z.B. : #define LED1 LATBbits.LATB0 #define EIN PORTAbits.PORTA0 Wenn alles richtig eingestellt ist sollte es dann klappen. Viel glück.
Ah, LOL, schon wider so ein doofer Fehler ;) Wie oft, immer vertausche ich es ;) Danke dir dür den Hinweis ! LG Tim
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.