Forum: Mikrocontroller und Digitale Elektronik PIC18f1330 - Konfiguration


von Jörg O. (joerchi)


Lesenswert?

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

von Severino R. (severino)


Lesenswert?

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.

von Jörg O. (joerchi)


Lesenswert?

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)
   {
   ..

von Dida N. (quader)


Lesenswert?

Häng doch mal den gesamten Code als Anhang an.

Diese Compileroption habe ich noch nie gebraucht, vielleicht liegts 
daran?

  //Programmabschnitt
  #pragma code

von tastendrücker (Gast)


Lesenswert?

...und wo/wie ist LED definiert?

von tastendrücker (Gast)


Lesenswert?

>  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...

von Jörg O. (joerchi)


Lesenswert?

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.

von Severino R. (severino)


Lesenswert?

PORTAbits spricht die Input-Ports an.
Du musst LATAbits verwenden, das spricht die Output-LATches an.

von Jörg O. (joerchi)


Lesenswert?

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.

von Dida N. (quader)


Lesenswert?

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!

von Dida N. (quader)


Lesenswert?

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!

von tastendrücker (Gast)


Lesenswert?

RA0 als Digital I/O konfiguriert? (->Register ADCON1).
PORTA ist nach Power-On auf Analog Eingang gestellt (glaube ich).

von Jörg O. (joerchi)


Lesenswert?

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?

von Jörg O. (joerchi)


Lesenswert?

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.

von tastendrücker (Gast)


Lesenswert?

> 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.

von Jörg O. (joerchi)


Lesenswert?

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.

von Dida N. (quader)


Lesenswert?

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...

von Jörg O. (joerchi)


Lesenswert?

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.

von tastendrücker (Gast)


Lesenswert?

>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.

von Jörg O. (joerchi)


Lesenswert?

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

von Achim B. (dabu81)


Lesenswert?

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!

von Jörg O. (joerchi)


Lesenswert?

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
Noch kein Account? Hier anmelden.