Forum: Compiler & IDEs Syntaxfehler bei Bitoperationen


von Sebastian (Gast)


Lesenswert?

Hallo Leute,

bin neu hier und werde in Zukunft regelmäßig lesen und auch beitragen.

Habe grad ein Problem. Nutze AVR Studio 4.12 und Gcc 1.004
bei folgendem Code kommt Sytax error von token "=" in der Zeile mit 
PORTB &= ....
Weiß nicht weiter! Hat jemand nen Tip?
1
int main(void)
2
{
3
  //Port D initialisieren
4
  DDRD=0b01001111;  //Pins 4-7 sind Ausgänge für LCD
5
            //PINS 2-3 sind Taster mit INT0, INT1
6
            //Pins 0-1 sind UART RX und TX
7
  //PORT B initialisieren
8
  DDRB=0b00000111;  //Pins 0-2 sind Ausgäne LED , LCD_EN, LCD_RS
9
10
  //Status LED on
11
    PORTB &= ~(1<<LED);
12
13
    
14
15
  while (1)      //never stop doing this
16
    {
17
    }
18
  return 1;
19
}

Danke

von kosmonaut_pirx (Gast)


Lesenswert?

hallo,
der syntax-error besteht vermutlich darin, dass der scanner/der 
gcc/niemand_ausser_dir weiß, was 'LED' bedeutet. die syntax ist sonst in 
ordnung. voraussetzen tue ich noch, dass du avr/io.h includieren tust.
bye kosmo

von Oliver (Gast)


Lesenswert?

Wenn das das vollständige Programm ist, fehlen da ein paar wichtige 
includes, und LED kennt er auch nicht.
Daher, besser vollständige Programme posten oder anhängen. Ausserdem, 
gcc 1.004 muß schon verdammt alt sein :-)
Oliver

von Sebastian (Gast)


Lesenswert?

1
#define __AVR_ATmega8__
2
#ifndef F_CPU //wenn nicht schon definiert im AVR Studio
3
  #define F_CPU 16000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
4
#endif
5
//Libraries
6
#include <avr\io.h> //Ports und Register
7
#include <stdint.h> //Data Types Standart Integer  
8
/*  
9
* int8_t   - 8-Bit Integer mit einem Wertebereich -127 bis 128.
10
* uint8_t  - 8-Bit Integer ohne Vorzeichen (unsigned int) mit einem Wertebereich von 0 bis 255 
11
* int16_t  - 16-Bit Integer mit einem Wertebereich -32767 bis 32768.
12
* uint16_t - 16-Bit Integer ohne Vorzeichen (unsigned int) mit einem Wertebereich von 0 bis 65536. 
13
*/
14
#include <avr/interrupt.h>  //Interupts
15
#include <util/delay.h>    //Delay Routines
16
17
18
//Definitionen
19
20
//Makros und Gedankenstützen
21
22
//Bit Toggeln PORTB ^= (1<<PB0);    /* Ex-OR */
23
//PORTA |= (1 << MEINBIT);    /* setzt Bit 2 an PortA auf 1 */
24
//PORTA &= ~(1 << MEINBIT);   /* loescht Bit 2 an PortA */
25
//PORTB |= ((1 << MEINBIT0) | (1 << MEINBIT2)); // setzt Bit 0 und 2 in PORTB auf "1" 
26
//PORTB &= ~((1 << MEINBIT0) | (1 << MEINBIT2)); // löscht Bit 0 und 2 in PORTB 
27
28
29
//USART Baudrate 
30
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
31
 
32
// Berechnungen
33
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
34
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
35
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille 
36
 
37
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
38
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
39
#endif
40
41
//LCD
42
#define LCD_DATA_PORT = PORTD       //LCD Data Pins are PORTD 4-7 in 4 bite mode
43
#define LCD_CONTROL_PORT= PORTB      // Controlled by RS-PB2 und EN-PB1
44
#define LCD_RS=PINB2
45
#define LCD_EN=PINB1
46
//Status and Test LED
47
#define LED=PINB0
48
49
50
51
//Variablen
52
53
//Funtionsprototypen
54
//void LCD__init(void);
55
56
//Main Programm
57
int main(void)
58
{
59
  //Port D initialisieren
60
  DDRD=0b01001111;  //Pins 4-7 sind Ausgänge für LCD
61
            //PINS 2-3 sind Taster mit INT0, INT1
62
            //Pins 0-1 sind UART RX und TX
63
  //PORT B initialisieren
64
  DDRB=0b00000111;  //Pins 0-2 sind Ausgäne LED , LCD_EN, LCD_RS
65
66
  //Status LED on
67
    PORTB &= ~(1<<LED);
68
69
    
70
71
  while (1)      //never stop doing this
72
    {
73
    }
74
  return 1;
75
}

Die defines sind nicht schuld daran. Weiß echt nicht mehr weiter. 
Irgendwie kennt der das &= ~(1<<BIT) nicht?!?

von Magnus Müller (Gast)


Lesenswert?

1
//LCD
2
#define LCD_DATA_PORT = PORTD       //LCD Data Pins are PORTD 4-7 in 4 bite mode
3
#define LCD_CONTROL_PORT= PORTB      // Controlled by RS-PB2 und EN-PB1
4
#define LCD_RS=PINB2
5
#define LCD_EN=PINB1
6
//Status and Test LED
7
#define LED=PINB0

Lass das "=" weg !!!

Es muss eher so aussehen:
1
//LCD
2
#define LCD_DATA_PORT     PORTD      //LCD Data Pins are PORTD 4-7 in 4 bite mode
3
#define LCD_CONTROL_PORT  PORTB      // Controlled by RS-PB2 und EN-PB1
4
#define LCD_RS            PINB2
5
#define LCD_EN            PINB1
6
//Status and Test LED
7
#define LED               PINB0

Gruß,
Magnetus

von kosmonaut_pirx (Gast)


Lesenswert?

hallo,
du hast da anscheinend vor lauter verzweiflung alles zusammengehauen, 
was so geht.
1
#define __AVR_ATmega8__

niemals. das legt der compiler fest.
abgesehen von einer ausnahme, brauchst du die sämtliche andere includes 
zunächst nicht. also warum zusätzliche fehlerquellen einbauen?

dein programm in kurzform:
1
#include <avr/io.h> //Ports und Register
2
3
//Status and Test LED
4
#define LED PINB0
5
6
//Main Programm
7
int main(void)
8
{
9
  //Port D initialisieren
10
  DDRD=0x4F;
11
  //PORT B initialisieren
12
  DDRB=0x07;
13
14
  //Status LED on
15
  PORTB &= ~(1<<LED);
16
17
    
18
19
  while (1){
20
    //never stop doing this
21
  }
22
  return 1;
23
}
hab mich über die slahses/backslashes gewundert. wenn überhaupt, dann 
sicherlich einheitlich. da ich kein windows verwende, kann ich dir aber 
nicht sagen, welches von beiden nun richtig ist. aber mit backslash habe 
ich zumindest noch nicht gesehen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Sebastian wrote:
> Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!

Wieso nicht UL?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> hab mich über die slahses/backslashes gewundert.

Alle unterstützten Betriebssysteme können Vorwärtsstriche benutzen,
damit ist man also portabel.

> Ausserdem,
> gcc 1.004 muß schon verdammt alt sein :-)

Stimmt, die älteste Versionsnummer, an die ich mich erinnern kann, war
die 1.37.  Das war ca. 1992.  Da gab's noch keine AVRs. ;-)

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.