mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC C18 erkennt keine Variablen


Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein Problem im folgenden Code:
#include <p18f2410.h>

#pragma config OSC  = INTIO67  // Interner Oszillator, Port function on RA6 u. RA7
#pragma config WDT  = OFF    // Watchdog Timer Off
#pragma config PWRT = ON

#pragma code

// **************************************************************************************
// init: Initialisierung des PIC
// **************************************************************************************

void init(void)
{
  // USART
  BRGH = 1;        // 9600 Baud @ 4 Mhz
  SPBRG = 25;
  SYNC = 0;

  SPEN = 1;        // Serielles Port Einschalten
  CREN = 1;        // Continious Receive Einschalten

  TXEN = 1;        // Transmit einschalten

  TRISB = 0x00; 
} //init

// **************************************************************************************
// rs232_send: Sendet ein Zeichen über die Serielle Schnittstelle
// **************************************************************************************

void rs232_send(char x)
{
  while (!TXIF);      // warten bis Senderegister frei ist
  TXREG = x;
} //init

// **************************************************************************************
// main: Hauptprogramm
// **************************************************************************************

void main(void)
{
  init();
}

Das Problem ist jetzt das die ganzen Variablen nicht erkannt werden.

main.c:33:Error [1105] symbol 'BRGH' has not been defined
main.c:33:Error [1101] lvalue required
main.c:35:Error [1105] symbol 'SYNC' has not been defined
main.c:35:Error [1101] lvalue required
main.c:37:Error [1105] symbol 'SPEN' has not been defined
main.c:37:Error [1101] lvalue required
main.c:38:Error [1105] symbol 'CREN' has not been defined
main.c:38:Error [1101] lvalue required
main.c:40:Error [1105] symbol 'TXEN' has not been defined
main.c:40:Error [1101] lvalue required
main.c:51:Error [1105] symbol 'TXIF' has not been defined

In dem Headerfile stehen keine Definitionen. Aber woher bekomme ich die?

LG
Andreas

Autor: Adam @Home (bookwood77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ohne entsprechenden Definitionen im Headerfile geht nichts.. Verwendest 
du das original Microchip Headerfile (C:\MCC18\h\...)?

Gruß

Günter

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das wird verwendet. Bei mir halt C:\Programme\Microchip\MCC18\h\....

Woher bekomme ich eines wo die Variablen schon definiert sind?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim MCC18 macht man das so wenn man einzelne Bits setzt:

statt  BRGH = 1;        // 9600 Baud @ 4 Mhz

 TXSTAbits.BRGH=1;

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du sicher, dass der Pfad zu der Datei stimmt? Schau mal im MPLAB 
nach.
Ansonsten gib mal deine Adresse, dann kann ich dirs schicken.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Micha R.
Ja der Pfad stimmt. Wenn ich die Datei umbenenne in dem Verzeichnis 
meldet er einen Fehler das die Datei nicht gefunden werden kann.

a.riegebauer_at_nacs.at


@holger
Mit TXSTAbits.BRGH = 1; funktioniert es. Ist aber nicht annehmbar finde 
ich weil ich ja nicht weiß in welchem Register die Bits liegen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mit TXSTAbits.BRGH = 1; funktioniert es. Ist aber nicht annehmbar finde
>ich weil ich ja nicht weiß in welchem Register die Bits liegen.

Dann bleibt dir wohl nichts anderes über als ins
Datenblatt zu sehen ;)

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ists, dafür belohnt dich der C18 mit komplexeren statements als es 
der cc5x kann ;)

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist die Datei denn wirklich leer?

Oder steht nur nicht das drin, was du willst?

(Gib deine Mail-Adresse, und ich schick dir die Datei)

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Datei ist schon was drinnen aber nicht sowas das die "kurzen 
Variablen" funktionieren.

a.riegebauer_at_nacs.at

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Riegebauer wrote:
> In der Datei ist schon was drinnen aber nicht sowas das die "kurzen
> Variablen" funktionieren.

Sowas gibts auch nicht.
Entweder du schreibst die union davor, oder aber du definierst dir das 
was du willst selber.
Eine einfache Suche nach dem gewünschten Bit-Name in der Header-Datei 
bringt dich zu dem Register in dem es steht.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So jetzt hab ich mich mal damit abgefunden das die Sachen unter C18 ganz 
anders ist als bei cc5x.

Jetzt frage ich gleich ob das so funktionieren kann. Ich möchte nur mal 
ein Zeichen an den PC Senden und das in einer Schleife. Hab auch schon 
bei Google gesucht aber ich finde kein brauchbares Beispiel für UART für 
C18.
#include <p18f2410.h>

#pragma config OSC  = INTIO67  // Interner Oszillator, Port function on RA6 u. RA7
#pragma config WDT  = OFF    // Watchdog Timer Off
#pragma config PWRT = ON

//#pragma code

// **************************************************************************************
// init: Initialisierung des PIC
// **************************************************************************************

void init(void)
{
  // USART
  TXSTAbits.BRGH=1;    // 9600 Baud @ 4 Mhz
  SPBRG = 25;
  TXSTAbits.SYNC = 0;

  RCSTAbits.SPEN = 1;        // Serielles Port Einschalten
  RCSTAbits.CREN = 1;        // Continious Receive Einschalten

  TXSTAbits.TXEN = 1;        // Transmit einschalten

  TRISC = 0b11111111; 
} //init

// **************************************************************************************
// rs232_send: Sendet ein Zeichen über die Serielle Schnittstelle
// **************************************************************************************

void rs232_send(char x)
{
  while (!PIR1bits.TXIF);      // warten bis Senderegister frei ist
  TXREG = x;
} //init

// **************************************************************************************
// main: Hauptprogramm
// **************************************************************************************

void main(void)
{
  init();
  while(1) {
    rs232_send('X');
  }
}

LG
Andreas

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht im c18 einfacher wenn du die mitgelieferten libs verwendest:
#include <usart.h>
void main(void)
{
  OpenUSART (USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 129);
  while(1)
  {
          putcUSART('X');
  }
}

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.