Forum: Mikrocontroller und Digitale Elektronik PIC C18 erkennt keine Variablen


von Andreas R. (blackpuma)


Lesenswert?

Hallo Leute,

ich habe ein Problem im folgenden Code:
1
#include <p18f2410.h>
2
3
#pragma config OSC  = INTIO67  // Interner Oszillator, Port function on RA6 u. RA7
4
#pragma config WDT  = OFF    // Watchdog Timer Off
5
#pragma config PWRT = ON
6
7
#pragma code
8
9
// **************************************************************************************
10
// init: Initialisierung des PIC
11
// **************************************************************************************
12
13
void init(void)
14
{
15
  // USART
16
  BRGH = 1;        // 9600 Baud @ 4 Mhz
17
  SPBRG = 25;
18
  SYNC = 0;
19
20
  SPEN = 1;        // Serielles Port Einschalten
21
  CREN = 1;        // Continious Receive Einschalten
22
23
  TXEN = 1;        // Transmit einschalten
24
25
  TRISB = 0x00; 
26
} //init
27
28
// **************************************************************************************
29
// rs232_send: Sendet ein Zeichen über die Serielle Schnittstelle
30
// **************************************************************************************
31
32
void rs232_send(char x)
33
{
34
  while (!TXIF);      // warten bis Senderegister frei ist
35
  TXREG = x;
36
} //init
37
38
// **************************************************************************************
39
// main: Hauptprogramm
40
// **************************************************************************************
41
42
void main(void)
43
{
44
  init();
45
}

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

1
main.c:33:Error [1105] symbol 'BRGH' has not been defined
2
main.c:33:Error [1101] lvalue required
3
main.c:35:Error [1105] symbol 'SYNC' has not been defined
4
main.c:35:Error [1101] lvalue required
5
main.c:37:Error [1105] symbol 'SPEN' has not been defined
6
main.c:37:Error [1101] lvalue required
7
main.c:38:Error [1105] symbol 'CREN' has not been defined
8
main.c:38:Error [1101] lvalue required
9
main.c:40:Error [1105] symbol 'TXEN' has not been defined
10
main.c:40:Error [1101] lvalue required
11
main.c:51:Error [1105] symbol 'TXIF' has not been defined

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

LG
Andreas

von Adam @. (bookwood77)


Lesenswert?

Hallo,

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

Gruß

Günter

von Andreas R. (blackpuma)


Lesenswert?

ja das wird verwendet. Bei mir halt C:\Programme\Microchip\MCC18\h\....

Woher bekomme ich eines wo die Variablen schon definiert sind?

von holger (Gast)


Lesenswert?

Beim MCC18 macht man das so wenn man einzelne Bits setzt:

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

 TXSTAbits.BRGH=1;

von Der M. (steinadler)


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.

von Andreas R. (blackpuma)


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.

von holger (Gast)


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 ;)

von morph (Gast)


Lesenswert?

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

von Der M. (steinadler)


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)

von Andreas R. (blackpuma)


Lesenswert?

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

a.riegebauer_at_nacs.at

von Der M. (steinadler)


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.

von Andreas R. (blackpuma)


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.
1
#include <p18f2410.h>
2
3
#pragma config OSC  = INTIO67  // Interner Oszillator, Port function on RA6 u. RA7
4
#pragma config WDT  = OFF    // Watchdog Timer Off
5
#pragma config PWRT = ON
6
7
//#pragma code
8
9
// **************************************************************************************
10
// init: Initialisierung des PIC
11
// **************************************************************************************
12
13
void init(void)
14
{
15
  // USART
16
  TXSTAbits.BRGH=1;    // 9600 Baud @ 4 Mhz
17
  SPBRG = 25;
18
  TXSTAbits.SYNC = 0;
19
20
  RCSTAbits.SPEN = 1;        // Serielles Port Einschalten
21
  RCSTAbits.CREN = 1;        // Continious Receive Einschalten
22
23
  TXSTAbits.TXEN = 1;        // Transmit einschalten
24
25
  TRISC = 0b11111111; 
26
} //init
27
28
// **************************************************************************************
29
// rs232_send: Sendet ein Zeichen über die Serielle Schnittstelle
30
// **************************************************************************************
31
32
void rs232_send(char x)
33
{
34
  while (!PIR1bits.TXIF);      // warten bis Senderegister frei ist
35
  TXREG = x;
36
} //init
37
38
// **************************************************************************************
39
// main: Hauptprogramm
40
// **************************************************************************************
41
42
void main(void)
43
{
44
  init();
45
  while(1) {
46
    rs232_send('X');
47
  }
48
}

LG
Andreas

von morph (Gast)


Lesenswert?

geht im c18 einfacher wenn du die mitgelieferten libs verwendest:
1
#include <usart.h>
2
void main(void)
3
{
4
  OpenUSART (USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 129);
5
  while(1)
6
  {
7
          putcUSART('X');
8
  }
9
}

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.