mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18f1330 - Konfiguration


Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Severino R. (severino)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Dida N. (quader)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häng doch mal den gesamten Code als Anhang an.

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

  //Programmabschnitt
  #pragma code

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und wo/wie ist LED definiert?

Autor: tastendrücker (Gast)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Severino R. (severino)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Dida N. (quader)
Datum:

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

Autor: Dida N. (quader)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Dida N. (quader)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

Autor: Achim B. (dabu81)
Datum:

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

Autor: Jörg Oe (joerchi)
Datum:

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

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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