Hallo Jungs, ich habe momentan mit einem kleinen Problem zu kämpfen. Auf einem kleinen aktuellen Platinchen habe ich einen PIC18F1330 verbaut, jedoch tut er irgendwie nicht so, wie ich es mir vorstelle. Programmiert wird er in C über den C18-Compiler von Microchip. Vielleicht mache ich ja schon etwas in der Konfiguration falsch. Hier mal mein Code (in Fragmenten): .. //Includes #include <p18f1330.h> #include <delays.h> //PIC-Konfiguration #pragma config OSC = INTIO2 //Interne Taktquelle #pragma config PWRT = ON //Power up Timer an #pragma config BOR = OFF //Brown-out Detection aus #pragma config WDT = OFF //WatchdogTimer aus #pragma config CPD = OFF //Code-Protection aus . . //Programmabschnitt #pragma code . . void initPIC(void) { OSCCON = 0b01001100; // Takt von 1 MHz, primary Oscillator TRISA = 0x08; // RA3 als Eingang, Rest von PORTA als Ausgang TRISB = 0x0F; // RB0..RB3 als Eingang } . . //Hauptprogramm void main(void) { initPIC(); .. Ich bin kein besonders großartiger Programmierer, aber für kleinere Anwendungen reicht es aus. Wenn jemand was seltsames oder falsches entdeckt, kann er es mich ja bitte wissen lassen. Vielen Dank schonmal, Viele Grüße Jörg
Jörg Oe wrote:
> verbaut, jedoch tut er irgendwie nicht so, wie ich es mir vorstelle.
Sagst Du uns eventuell noch, was er Deiner Vorstellung nach tun sollte,
und was er statt dessen tut? So brauchen wir die Kristallkugel nicht
auszupacken.
Ok, das hatte ich ganz vergessen, Sorry. Habe mir einem simplen Beispiel angefangen, um die Grundlegende Funktion der Platine zu testen. Wollte nach dem Initilisierungteils eine LED kurz angehen lassen und danach sollte sie wieder aus gehen. Nur das Problem ist, sie bleibt an, und geht nicht wieder aus. Wenn es an solch einfachen Sachen scheitert, brauche ich gar nicht weiter machen. Edit: realisiert habe ich das folgendermaßen: //Hauptprogramm void main(void) { initPIC(); LED = 1; Delay1KTCYx(50); LED = 0; while(1) { ..
Häng doch mal den gesamten Code als Anhang an. Diese Compileroption habe ich noch nie gebraucht, vielleicht liegts daran? //Programmabschnitt #pragma code
> LED = 1; > Delay1KTCYx(50); > LED = 0; Und wie lange dauert 'Delay1KTCYx(50)'? Und wie sieht die Schaltung aus? Wenn Delay1KTCYx(50) nur 50ms wartet, und die LED mit LED=1 AUS und mit LED=0 wieder EINgeschaltet wird, wäre klar, warum es so aussieht, als ob sie nur angehen würde...
So, hier mal der Code: //Includes #include <p18f1330.h> #include <delays.h> //PIC-Konfiguration #pragma config OSC = INTIO2 //Interne Taktquelle #pragma config WDT = OFF //WatchdogTimer aus #pragma config PWRT = ON //Power up Timer an #pragma config BOR = OFF //Brown-out Detection aus #pragma config CPD = OFF //Code-Protection aus // Defines /* Portkonfiguration: PORT A: RA0 ... LED_STAT RA1 ... Spiegeloutput RA3 ... Spiegelinput PORT B: RB0 ... Bit0 Zeiteingang RB1 ... Bit1 Zeiteingang RB2 ... Bit2 Zeiteingang RB3 ... Bit3 Zeiteingang */ #define LED PORTAbits.RA0 //Status LED #define OUTPUT PORTAbits.RA1 //Ausgang #define INPUT PORTAbits.RA3 //Eingang #define TIME_IN PORTB //Zeiteingang //Prototypen void initPIC(void); //globale Variablen unsigned char wait = 0; unsigned char input_state = 0; // 0 = Spiegel OFF; 1 = Spiegel ON unsigned char output_state = 0; unsigned char time = 0; //Programmabschnitt #pragma code void initPIC(void) { OSCCON = 0b01001100; // Takt von 1 MHz, stabiler Takt, primary Oscillator TRISA = 0x08; // RA3 als Eingang, Rest von PORTA als Ausgang TRISB = 0x0F; // RB0..RB3 als Eingang LED = 0; // Vorbelegung der beiden..... OUTPUT = 0; // .... Ausgänge output_state = 0; input_state = 0; } //Hauptprogramm void main(void) { initPIC(); LED = 1; Delay1KTCYx(50); LED = 0; while(1) { } } Zur Frage mit der Delay. Die Pause dauert genau 200ms. Habe es aber auch mit Werten für 0,5 und 1 Sekunde probiert.
PORTAbits spricht die Input-Ports an. Du musst LATAbits verwenden, das spricht die Output-LATches an.
Das mag der Compiler aber gar nicht, dann bringt er folgende Meldung: "Error [1205] unknown member 'RA0' in '__tag_19'" Mir ist eben noch etwas aufgefallen. Habe mit dem Debugger (MPLAB-SIM) ein bissl rumgespielt. Habe mir dann mal das OSCCON-Register angeschaut. Wenn ich in PIC-Init() das OSCCON Register beschreiben will, wird nur der High-Teil geschrieben. Das Low-Byte bleibt immer bei 4. Das ist bestimmt auch nicht korrekt. Das sollte dann nach meinem Code schon eine 6 stehen.
Severino R. wrote: > PORTAbits spricht die Input-Ports an. > Du musst LATAbits verwenden, das spricht die Output-LATches an. Du kannst das ganze auch mit PORTAbits ansprechen. Ging bei mir immer ohne Probleme... Und ich weise nochmals darauf hin, '#pragma code' ist nicht notwendig!
Jörg Oe wrote: > Das mag der Compiler aber gar nicht, dann bringt er folgende Meldung: > > "Error [1205] unknown member 'RA0' in '__tag_19'" > > > Mir ist eben noch etwas aufgefallen. > Habe mit dem Debugger (MPLAB-SIM) ein bissl rumgespielt. Habe mir dann > mal das OSCCON-Register angeschaut. > > Wenn ich in PIC-Init() das OSCCON Register beschreiben will, wird nur > der High-Teil geschrieben. Das Low-Byte bleibt immer bei 4. Das ist > bestimmt auch nicht korrekt. Das sollte dann nach meinem Code schon eine > 6 stehen. Kann überhaupt jedes Bit dieses Registers beschrieben werden? Hab mal in einem Datenblatt (eines anderen PICs!) nachgeschaut und dort konnte man im OSCCON-Register die Bits 2 und 3 nicht beschreiben sondern nur lesen. NACHTRAG: In den pragma-Anweisungen hast du gesagt, du willst den internen OSC benutzen. Bei der Beschreibung von OSCCON, jedoch den externen (Bit <0:1>). Wenn du wirklich nur den internen benutzen wolltest, solltest du das Bit SCS1 (<1>) setzen!
RA0 als Digital I/O konfiguriert? (->Register ADCON1). PORTA ist nach Power-On auf Analog Eingang gestellt (glaube ich).
Ja, das Stimmt. Hier mal eine kleine Verdeutlichung: Register OSCCON: bit 7-4: sind beschreibbar (Das geht auch in meinem Falle) bit 3-2: nur lesbar (die mir angezeigte 4 bedeutet, dass das bit IOFS=1 ist, heißt der Takt läuft stabil) bit 1-0: sind beschreibbar (aber ich kann da nichts hineinschreiben, seidenn ich machen einen großen Fehler, den ich noch nicht kenne) Würde gern das bit 1 (SCS1) auf 1 setzen, kann es aber nicht verändern. Hast du eine Idee, woran das liegt?
tastendrücker wrote: > RA0 als Digital I/O konfiguriert? (->Register ADCON1). > PORTA ist nach Power-On auf Analog Eingang gestellt (glaube ich). Ne, da habe ich schon nachgeschaut. Das ADCON1-Register sieht nach einem Reset bzw. nach Power-On so aus: ---01111 und bei bit 3-0 steht die '1' für: Port is configured as RAx Passt also soweit.
> Ne, da habe ich schon nachgeschaut. > Das ADCON1-Register sieht nach einem Reset bzw. nach Power-On so aus: > ---01111 > und bei bit 3-0 steht die '1' für: Port is configured as RAx > Passt also soweit. Aus dem Datasheet: DS39758C-page 81 Note: On a Power-on Reset, RA0, RA1, RA4 and RA5 are configured as analog inputs and read as ‘0’. RA2 and RA3 are configured as digital inputs.
tastendrücker wrote: > Aus dem Datasheet: DS39758C-page 81 > > Note: On a Power-on Reset, RA0, RA1, RA4 > and RA5 are configured as analog inputs > and read as ‘0’. RA2 and RA3 are > configured as digital inputs. Mh, sehr seltsam. In dem gleichen Datasheet ist in der Tabelle aus Seite 42 aber was ganz anderes geschrieben. Was soll ich jetzt glauben.
Wie sieht die Beschreibung von OSCCON denn im Moment aus? Ich nehme an, du hast es schon auf den korrigierten Wert verbessert? OSCCON = 0x42; // 0b0100xx1x, Takt von 1 MHz, Internal Oscillator Wenn das nicht geht probier mal bitweise zu beschreiben OSCCONbits.IRCF2 = 1; OSCCONbits.SCS1 = 1; Leider habe ich den internen Oszillator noch nicht gebraucht. Wenn das alles nichts hilft, kämpfst du dich am besten mal durch die entsprechenden Kapitel des Datenblattes...
Leider kann ich an dem Low-Teil des OSCCON nichts verändern. Selbst der Vorschlag die Werte bitweise zu ändern hat nichts geholfen. Grml..... Dann muss ich nochmal in das Datenblatt schauen.
>Mh, sehr seltsam. In dem gleichen Datasheet ist in der Tabelle aus Seite >42 aber was ganz anderes geschrieben. >Was soll ich jetzt glauben. Scheint wohl ein Fehler im Datenblatt zu sein. Aber nach meiner Erfahrung sind Analog/Digital Ports nach Power-On bei den PICs immer auf Analog-Eingang geschaltet.
So, im Datenblatt konnte ich nichts besonderes dazu finden. Jedoch bin ich jetzt fertig mit dem Code und habe ihn mal direkt auf der Platine probiert. Also der PIC läuft, genau wie ich es wollte. Demnach wird das Bit dann im PIC korrekt gesetzt, sonst würde ja nichts funktionieren. Es wird dann wohl ein Bug in MPLAB sein, vermute ich zumindest. Wenn ich irgendwann mal einen ICD2 besitze, kann ich mir das nochmal genauer anschauen. Bis dahin, Viele Grüße
Hallo Jörg, Ich habe gerade ein ganz ähnliches Problem. Mein PIC 18F1320 will einfach nicht laufen. Bei einfachster Konfiguration. Kannst du mir bitte dein Programm zur Verfügung stellen, welches funktioniert hat. Danke!
Hallo, hier ist mein Programmkopf. Der Rest ist ja eher unwichtig für dich. Damit lief er dann zum schluss: //Includes #include <p18f1330.h> #include <delays.h> //PIC-Konfiguration #pragma config OSC = INTIO1 //Interne Taktquelle #pragma config WDT = OFF //WatchdogTimer aus #pragma config PWRT = ON //Power up Timer an #pragma config BOR = OFF //Brown-out Detection aus #pragma config CPD = OFF //Code-Protection aus //#pragma config DEBUG = ON //In-Circuit-Debugging ist aktiviert // Defines /* Portkonfiguration: PORT A: RA0 ... LED_STAT RA1 ... Spiegeloutput RA3 ... Spiegelinput PORT B: RB0 ... Bit0 Zeiteingang RB1 ... Bit1 Zeiteingang RB2 ... Bit2 Zeiteingang RB3 ... Bit3 Zeiteingang */ #define LED PORTAbits.RA0 //Status LED #define OUTPUT PORTAbits.RA1 //Ausgang #define INPUT PORTAbits.RA3 //Eingang #define TIME_IN PORTB //Zeiteingang //Prototypen void initPIC(void); void state(unsigned char, unsigned char); void ckecktime(void); void pause(void); void fladek(void); void setLED(unsigned char); Ich hoffe, dir hilft es weiter. Viele Grüße Jörg
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.