Forum: Mikrocontroller und Digitale Elektronik Unerklärliche Fehlermeldung in einem Arduino-Programm


von Myster L. (myster_l)


Lesenswert?

Hallo Leute,
Ich habe mich jetzt durch X Forumsbeiträge gelesen und bin dabei leider 
noch auf keine Lösung gekommen, daher hoffe ich, dass ihr mir hier 
weiterhelfen könnt.
Es geht um folgendes:
Ich hab ein Arduinoprogramm geschrieben, über das im Endeffekt 128LED´s 
über 8 Portexpander angesteuert werden. Zur ansteuerung dient ein 
Befehlsstring der so aussieht:
s_LED1_LED2_LED3_...LED10
Es werden immer nur LED´s gesetzt, nicht rückgesetzt. Dieser teil 
funktioniert auch einwandfrei, das Problem liebt bei dem anderen Befehl. 
Dieser dient zum auslesen. hingeschickt wird nur ein "?" der Controller 
Fragt dann bei den Portexpandern nach, wo LED´s gesetzt sind und schickt 
diese Information dann wieder zum Nutzer zurück.
Das Problem ist, dass der Compiler mit jetzt Fehlermeldungen ausgiebt, 
die ich mir beim besten willen nicht erklären kann. Ich hab auch schon 
den restlichen Code durchsucht, aber auch sonst keinen Fehler gefunden, 
wahrswcheinlich bin ich einfach nur durch meine Unerfahrenheit etwas zu 
blind, ich hoffe, dass ihr mir weiterhelfen könnt.
Hier der Code:
1
#include <Wire.h>                                               //Einbinden der I2C Library
2
3
/*
4
 * Portexpander: PF575 / PCF8575 (Beide Bezeichnungen sind 1 und das selbe Bauteil!)
5
 * 
6
 *Notiz: 
7
 *http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga6a441da9211eb85881d99c60b1003552 
8
 *
9
 *Portexpanderaddressen (1.Array) müssen als Hex (0x..) gespeichert sein,
10
 *damit die Portexpander richtig angesprochen werden
11
 *  
12
 *Led´s sind LOW-aktiv! ( 0=an )
13
 */
14
char Portexpander [9] = {0x27, 0x23, 0x24, 0x20, 0x25, 0x21, 0x26, 0x22, '\0'}; //Adressen der 8 Portexpander im Uhrzeigersinn.
15
/*~~~Die Arrays dienen dazu die Informationen für alle 10 Led´s zu halten und dabei möglichst wenig Vatiablennamen zu haben.~~~*/
16
/*~~~(dabei ist die erste Stelle immer frei, sodass die Stellen 1-10 genutzt werden)~~~*/
17
char ExpanderNr [12];         //Zu welchem portexpander gehört die LED?
18
char ledzahl [12];            //Welche LED soll am entsprechenden Expander angesteuert werden?
19
char highbyte [9];            //Übertragung an die Portexpander Byte1
20
char lowbyte  [9];            //Übertragung an die Portexpander Byte2
21
char bufer [45];              //Buffer
22
String DataIN, Befehl;        //Datenstrings anlegen
23
uint8_t i, x=0, a, anzahl;       //Variablen anlegen
24
uint16_t daten;
25
26
27
28
void setup()
29
{
30
  Wire.begin();               //Initialisieren der Bibliothek
31
  Serial.begin(9600) ;        //festlegen der Baud-Rate
32
  for ( i=0 ; i<8 ; i++)
33
  {      
34
    Wire.beginTransmission(Portexpander[i]);    //Bereitet die Datenübertragung an den Portexpander vor
35
    Wire.write(0xFF);                           //Alle LED´s AUS
36
    Wire.write(0xFF);                           //Alle LED´s AUS
37
    Wire.endTransmission();                     //Senden der Daten
38
  }
39
}
40
41
42
43
//---------------------------------//
44
//~~~~~~~~~~Hauptprogramm~~~~~~~~~~\\
45
//---------------------------------//
46
47
void loop()
48
{
49
  /*~~~~~Neuen String einlesen~~~~~*/
50
  if ( Serial.available() )                       //Wenn sich Daten im Eingangspuffer befinden
51
  {                                               //
52
    anzahl = Serial.readBytesUntil('#',bufer,42); //Wie viele Daten befinden sich im Eingangspuffer? Und diese in bufer schreiben
53
    anzahl = anzahl/4;                            //das a_ vorne spielt keine rolle, da a_ nur 2/4/0,5 und keine Kommazahlen und kein Rest mitgeschrieben wird
54
    DataIN = bufer;                               //Eingehende Daten in DataIN als String übertragen
55
    Befehl = DataIN.substring(0,1);               //1.Zeichen auslesen
56
    Serial.println(DataIN);
57
    
58
59
60
/*-------------------------------------------------------------------------
61
 * Informations Befehl
62
*/-------------------------------------------------------------------------   
63
    if ( Befehl == "?" )        //<<---------Fehlermeldung Zeile63
64
    {
65
      Serial.println("?-Befehl");
66
      /*~~Einlesen der Informationen~~*/
67
      a = 0;
68
      for ( i=0 ; i<8 ; i++ )                   //Für alle 8 Portexpander
69
      {
70
        Wire.requestFrom(Portexpander[i] , 2);  //Informationen vom Portexpander anfordern
71
        while (Wire.available() > 0)            //Wenn Informationen vorliegen(vom Expander gesendet wurden)
72
        {
73
          lowbyte [i] = 255 - Wire.read();      //255-, da so alle Bits des Byts invertiert werden, weil
74
          highbyte[i] = 255 - Wire.read();      //0 ja LED=AN bedeutet, und wir so für LED=AN=1 haben, auf das wir abfragen können
75
        }  
76
        
77
        /*~~Abfrage auf leuchtende LED´s~~*/        
78
        for ( x=0 ; x<8 ; x++ )               //Für alle 8Bit eines Byte
79
        {                                     
80
          if (bitRead(lowbyte [i] , x) == 1)  //Für das 1.eingegangene Byte
81
          {                                   //Wenn eine 1 vorliegt (also LED=AN)
82
            ledzahl[a] = (i * 16) + x;        //Wert der LED = 16LED´s pro Portexpander (i) + stelle am Expander (x)
83
            a++;                              //Auf den Array-Platz der nächsten LED weiterzählen
84
          }
85
          if (bitRead(highbyte[i] , x) == 1)  //Für das 2.eingegangene Byte
86
          {                                   //Wenn eine 1 vorliegt (also LED=AN)
87
            ledzahl[a] = (i * 16) + x +8;     //Wert der LED = 16LED´s pro Portexpander (i) + stelle am Expander (x)+8 für 2.Byte
88
            a++;                              //Auf den Array-Platz der nächsten LED weiterzählen
89
          }
90
        } //Ende Abfrage auf leuchtende LED´s
91
      } //Ende Einlesen der Informationen
92
      /*~~Ausgebe der Informationen~~*/ //(Welche LED´s Leuchten)
93
      Serial.print(a),Serial.println(" LED`s an");      
94
      for ( i=0 ; i<a ; i++)
95
      {
96
      Serial.print("LED"),Serial.print(i+1), Serial.print(" "),Serial.println(ledzahl[i],DEC);
97
      }  
98
    }// Ende ?-Befehl
99
100
/*------------------------------------------------------------------------------
101
 * Setz Befehl
102
 */-----------------------------------------------------------------------------  
103
    else if ( Befehl == "s")    //Zustandsänderung von Led´s
104
    {
105
      Serial.print(anzahl, DEC) , Serial.println(" LEDs anzusprechen"); 
106
      /*~~~~~Werte vorsetzen~~~~~*/
107
      for( i=0 ; i<8 ; i++)
108
      {
109
        lowbyte [i] = 0xFF;
110
        highbyte[i] = 0xFF;
111
      }
112
      /*~~~~~Auslesen der Informationen~~~~~*/ //Auslesen und auswerten der informationen 
113
      for( i=0 ; i<anzahl ; i++)               //aus dem Datenstring
114
      {   
115
        //String --> DEZ-Zahl                  //ASCII 0-9 = 0x30 - 0x39 --> ASCII - 0x30 = dezZahl     
116
        x =      100 * (DataIN[i*4+2]   - 0x30);   //100er Stelle 
117
        x = x + ( 10 * (DataIN[i*4+3] - 0x30));  // 10er Stelle
118
        x = x +        (DataIN[i*4+4] - 0x30);   //  1er Stelle              
119
        if ( x > 127 ) { x = x-128;}           //Beschränkung auf 127
120
        Serial.print("x ") , Serial.println(x);
121
        Serial.println();
122
        ledzahl[i] = x;                        //Information in Array speichern (x= Welche LED von Allen 128 wird angesprochen?)
123
        ExpanderNr[i] = ledzahl[i] / 16;       //Welcher Portexpander muss angesprochen werden? //Expander 0-7
124
        ledzahl[i] = ledzahl[i] % 16;          //Welche Led dieses Expanders //0-15 also 16LEDs pro Expander        
125
      }
126
  
127
      /*~~~~~Bitmanipulation~~~~~*/
128
      for( i=0 ; i<anzahl ; i++) 
129
      {
130
        //Aufteilen in High & Low Byte 
131
        if ( ledzahl[i] > 7 )
132
        {
133
          ledzahl[i] = ledzahl[i] - 8;
134
          highbyte[ ExpanderNr[i] ] &=~  ( 1 << ledzahl[i] );              
135
        } 
136
        else { lowbyte[ ExpanderNr[i] ] &=~  ( 1 << ledzahl[i] );  }          
137
        /*hier wir das Bit in den entsprechenden Byts der EXPANDER gesetzt (auf 0). 
138
        * Die Information, welche LED angesteuert werden soll wird hier also in die Bytes reingeschrieben, welche
139
        * nacher an die Portexpander übertragen werden.*/
140
      }
141
  
142
      /*~~~~~Ausgabe~~~~~*/ //Ausgabe der fertigen Daten-Bytes auf die Portexpander
143
      for( i=0 ; i<8 ; i++)
144
      {
145
        if (( lowbyte[i] != 0xFF ) || ( highbyte[i] != 0xFF )) 
146
        {
147
          Wire.beginTransmission( Portexpander[i] ); //Bereitet die Datenübertragung an den Portexpander vor
148
          Wire.write( lowbyte[i]  );                 //Schreibt den Inhalt für das 1.Byte in den Sendepuffer
149
          Wire.write( highbyte[i] );                 //Schreibt den Inhalt für das 1.Byte in den Sendepuffer
150
          Wire.endTransmission();                    //Überträgt die gepufferten Daten
151
        }
152
      }
153
      
154
    }//Ende s-Befehl
155
  } //Ende Serial.availabile
156
} //Ende Void Loop          //<<---------Fehlermeldung Zeile156

Ich hab beide Zeilen der Fehlermeldungen hier mit einem Kommentar 
versehen, sodass ihr es leichter findet. 
//<<---------Fehlermeldung ZeileXX

Und hier die Fehlermeldungen:
1
Arduino: 1.6.5 (Windows 8.1), Platine: "Arduino Nano, ATmega328"
2
3
Test.ino: In function 'void loop()':
4
Test:63: error: expected primary-expression before 'if'
5
Test:63: error: expected ';' before 'if'
6
Test:156: error: expected '}' at end of input
7
Test:156: error: expected '}' at end of input
8
expected primary-expression before 'if'

Schon mal im Vorraus vielen Dank für eure Hilfe

PS
Ich hab mir die Formatierungshilfe ect. angeschaut, aber krieg den Code 
nicht so hin, dass er scrollbar ist, sodass er Platz spaart. Wenn mir 
das wer erklären könnte, sodass ich es nachbessern kann, wäre ich auch 
dafür dankbar.

: Gesperrt durch Moderator
von Oliver S. (oliverso)


Lesenswert?

Lt. Fehlermeldungen fehlt da irgendwo vor Zeile 63 ein Semikolon. Wo 
Zeile 63 ist, musst du selber rausfinden.

Oliver

: Bearbeitet durch User
von Raumschiffsteuerung kommt zu früh (Gast)


Lesenswert?

Myster L. schrieb:
> /*---------------------------------------------------------------------- ---
>  * Informations Befehl
> */---------------------------------------------------------------------- ---
>     if ( Befehl == "?" )

Wer kommentiert denn so?
1
// entweder so
2
/*
3
oder so
4
*/

von Myster L. (myster_l)


Lesenswert?

Jap, ich bin ein Depp, die Vormatierung des Kommentars wars. Ich war so 
auf den Code fokussiert, das ich das gar nicht beachtet hab. Typischer 
Fall von Tunnelblick.
Sollte eigentlich /* ...*/ so eine Werden, aber das */ am Anfang der 
Zeile kann natürlich nicht stimmen, sorry euch damit belangt zu haben 
und vielen Danke an Raumschiffsteuerung(Gast)
Und Oliver S. ..... da fehlte überhaupt nichts, der Code war 
einwandfrei, ich musste nur den kommentar gescheit machen...

von Hendrik L. (hlipka)


Lesenswert?

Einfach mal oben den Code anschauen - das automatische 
Syntax-Highlighting zeigt den Fehler schon (Hint: Kommentare sind grau, 
Nicht-Kommentare nicht).

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

das sieht mies aus

*/---------------------------------------------------------------------- 
---

Myster L. schrieb:
> /*---------------------------------------------------------------------- ---
>  * Informations Befehl
> */---------------------------------------------------------------------- ---

wie soll er denn das
------------------------------------------------------------------------ 
-

nach

*/

verarbeiten?

und da in Zeile 63 kommt auch der Fehler

: Bearbeitet durch User
von Myster L. (myster_l)


Lesenswert?

Ja wie gesagt, zu sehr auf den code fokusiert gesesen, ich hab noch nie 
fehler mit Kommentaren vorher gemacht, deshalb hab ich da gear nicht 
drauf geachtet.
Ich finde aber, dass der unterschied zwischen diesem Grau und dem 
Schwarz relativ gering ist. (Ich arbeite nicht grade in ner 
flutlichtanlage ;) )

von Joachim B. (jar)


Lesenswert?

Myster L. schrieb:
> Ja wie gesagt, zu sehr auf den code fokusiert gesesen, ich hab noch nie
> fehler mit Kommentaren vorher gemacht, deshalb hab ich da gear nicht
> drauf geachtet.

egal Fehler gefunden und wieder -1 kassiert, also invertiert ein Lob! 
(oder Fleißbienchen)

: Bearbeitet durch User
von Werner P. (werner4096)


Lesenswert?

Joachim B. schrieb:
> egal Fehler gefunden und wieder -1 kassiert, also invertiert ein Lob!
> (oder Fleißbienchen)

ne. die -1 hast wahrscheinlich gekriegt weil im Text irgendwo Arduino 
vorkam ;-)

Beitrag #6403595 wurde von einem Moderator gelöscht.
Beitrag #6403604 wurde von einem Moderator gelöscht.
Beitrag #6403609 wurde von einem Moderator gelöscht.
Beitrag #6403612 wurde vom Autor gelöscht.
Beitrag #6403687 wurde von einem Moderator gelöscht.
Beitrag #6403771 wurde von einem Moderator gelöscht.
Beitrag #6403831 wurde von einem Moderator gelöscht.
Beitrag #6403834 wurde von einem Moderator gelöscht.
Beitrag #6403902 wurde von einem Moderator gelöscht.
Beitrag #6403913 wurde von einem Moderator gelöscht.
Beitrag #6403927 wurde von einem Moderator gelöscht.
Beitrag #6404005 wurde von einem Moderator gelöscht.
Beitrag #6404021 wurde von einem Moderator gelöscht.
Beitrag #6404044 wurde von einem Moderator gelöscht.
Beitrag #6404210 wurde von einem Moderator gelöscht.
Beitrag #6404223 wurde von einem Moderator gelöscht.
Beitrag #6404231 wurde von einem Moderator gelöscht.
Beitrag #6404271 wurde von einem Moderator gelöscht.
Beitrag #6404277 wurde von einem Moderator gelöscht.
Beitrag #6404285 wurde von einem Moderator gelöscht.
Beitrag #6404289 wurde von einem Moderator gelöscht.
Beitrag #6404292 wurde von einem Moderator gelöscht.
Beitrag #6404301 wurde von einem Moderator gelöscht.
Beitrag #6404304 wurde von einem Moderator gelöscht.
Beitrag #6404305 wurde von einem Moderator gelöscht.
Beitrag #6404317 wurde von einem Moderator gelöscht.
Beitrag #6404324 wurde von einem Moderator gelöscht.
Beitrag #6404328 wurde von einem Moderator gelöscht.
Beitrag #6404332 wurde von einem Moderator gelöscht.
Beitrag #6404353 wurde von einem Moderator gelöscht.
Beitrag #6404354 wurde von einem Moderator gelöscht.
Beitrag #6404366 wurde von einem Moderator gelöscht.
Beitrag #6404367 wurde von einem Moderator gelöscht.
Beitrag #6404374 wurde von einem Moderator gelöscht.
Beitrag #6404466 wurde von einem Moderator gelöscht.
Beitrag #6404512 wurde von einem Moderator gelöscht.
von Myster L. (myster_l)


Lesenswert?

Ach ja und wenn ich kurz vom Thema ablenken dürfte:
Weiß Jemand was genau XTAL beschreibt?
Ich hab jede Menge sachen, wo der Begriff vor kommt, aber weiß nicht 
genau, was es meint :/

von Rainer S. (enevile) Benutzerseite


Lesenswert?

Myster L. schrieb:
> Ach ja und wenn ich kurz vom Thema ablenken dürfte:

Du bringst den Thread wieder zum Thema ;) die anderen unterhalten sich 
auf Ihre Art.

Myster L. schrieb:
> Weiß Jemand was genau XTAL beschreibt?

Zitat von Wiki(Quarzoszillator):
>Das „X“ steht jeweils für Xtal, die Kurzform von Crystal.
Schwingquarz
https://de.wikipedia.org/wiki/Quarzoszillator

µController brauchen eine Frequenz die im Datenblatt angegeben ist.

: Bearbeitet durch User
von Myster L. (myster_l)


Lesenswert?

Ach, endlich mal wieder etwas Fachmännisches, danke Rainer.
Danke auf jeden Fall schon mal für die Antwort.
Ich sollte dir villeicht etwas mehr Infos geben:
Programmiersprache: BASCOM
Grobe Funktion des Programms:
- Toggelt in ner Timer-ISR nen Port für nen angeschlossenen 
Schrittmotor.
- Max beschleunigung: 30Hz/sec
- Max Geschw. 4000Umdrehungen/min
- sowohl Geschwindigkeit, als auch Beschleunigung sind einstellbar
- Es wird nur Timer1 (16Bit) genutzt

Also folgendes:
Das Programm an sich steht schon, alles schon fertig und getestet nur 
war die Idee, die anzahl der Interrupts zu halbieren, indem man den 
Puleout Befehl von Bascom nutzt. Jetzt steht da auch wieder dieses XTAL 
drin.
Ist das dann ein externer, oder der interner Quarz?

Beitrag #6404619 wurde von einem Moderator gelöscht.
von Rainer S. (enevile) Benutzerseite


Lesenswert?

Myster L. schrieb:
> Puleout Befehl von Bascom

Meinst wahrscheinlich Pulseout. Soweit ich es verstehe generiert es 
Pulse.

Myster L. schrieb:
> Ist das dann ein externer, oder der interner Quarz?

Gute Frage. Würde sagen, dass es der externe ist, weil das Programm 
davon abhängig ist wie schnell er ist.

Beitrag #6404733 wurde von einem Moderator gelöscht.
Beitrag #6404778 wurde von einem Moderator gelöscht.
Beitrag #6404815 wurde von einem Moderator gelöscht.
Beitrag #6404817 wurde von einem Moderator gelöscht.
Beitrag #6404824 wurde von einem Moderator gelöscht.
Beitrag #6404825 wurde von einem Moderator gelöscht.
Beitrag #6404839 wurde von einem Moderator gelöscht.
Beitrag #6404842 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.