Forum: Compiler & IDEs Analog Digital Tutorial fuzt nich


von Markus N. (roboscan)


Lesenswert?

Hi.
Ich versuche gerade das Beispiel aus dem GCC Tutorial in C zu
programmieren.

Jedoch kriege ich dauernd diese Fehlermeldung :
"6: error: parse error before numeric constant"
Ich habe schon viel ausprobiert nur ich krieg den Fehler einfach nicht
weg.
Ich benütze den ATMega16 dazu.

Noch eine frage, wie kann ich dann (falls es klappen sollte) aus dem 10
bit werd der ja in 2 Bytes verpackt ist, eine ganze zahl also eine
gesamte Variable bilden?

von thkais (Gast)


Lesenswert?

Schau mal, ob Du nicht ein Semikolon irgendwo vergessen hast.
Zur Frage: Mit uint16_t wird eine Variable definiert, die 16 bit (= 2
Byte) groß ist. Man muß dann nicht mehr zwischen Low- und High-Byte
unterscheiden.

von Markus N. (roboscan)


Lesenswert?

Ach ich trottel hab den Code vergessen sorry.
Im Moment lese ich nur die ersten 8bit aus.
Ich muss beim Mega16 die 10Bits aus 2 Registern auslesen.
Wenn ich das beim Auslesen wie im Tutorial abtippe, dann gibt es dort
auch schon einen Fehler deswegen lasse ich im Moment nur 8bit
auslesen.
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
#define mux (1<<MUX2)
5
6
uint16_t rachannel (unsigned byte mux)
7
{
8
9
  uint8_t i;
10
  uint16_t result = 0;
11
12
  ADCSRA = (1<<ADEN) | (1<<ADPS1);    //Frequenzvorteiler
13
  ADMUX = mux;    //Auswahlt des Kanals
14
  ADMUX |= (1<<REFS1) | (1<<REFS0);  // Interne Referenzspannung nutzen
15
16
  //AD Dummy readout
17
  ADCSRA |= (1<<ADSC);
18
  while(!(ADCSRA & (1<<ADIF)));
19
  ADCSRA = (1<<ADIF);
20
21
  //Eigentliche  Messung
22
  for(i=0;i<4;i++)
23
  {
24
    ADCSRA |= (1<<ADSC);  //Eine Wandlung "single conversion"
25
    while(!(ADCSRA & (1<<ADIF)));
26
    //result += ADCW;
27
    result += ADCH;
28
    ADCSRA = (1<<ADIF);
29
  }
30
  ADCSRA &= ~(1<<ADEN);    //AD deaktivieren
31
32
  result /= 4;
33
  
34
  return result;
35
36
}
37
38
39
40
int main(void)
41
{
42
43
  while(1);
44
45
}

von Karl H. (kbuchegg)


Lesenswert?

Da ist tatsaechlich ein Fehler im Tutorial

#define mux (1<<MUX2)

uint16_t rachannel (unsigned byte mux)
{

das kann nicht gut gehen.
#define macht textuelle Ersetzung. dh. aus

uint16_t rachannel (unsigned byte mux)

wird

uint16_t rachannel (unsigned byte 1<<MUX2)

und das ist keine gueltige C Syntax.

2 Moeglichkeiten:
* lass den #define weg. Dann muss beim Aufruf der Funktion
  das Kanal angageben werden.
* definiere die Funktion so
  uint16_t rachannel ()
  dann kannst Du beim Aufruf zwar nicht mehr den Kanal angeben,
  aber das Compiliert zumindest

Und ganz wichtig:
  C lernen !

von mthomas (Gast)


Lesenswert?

Tutorial -hoffentlich- korrigiert.
Wo "byte" definiert wird, sehe ich allerdings im oben gezeigten Code
nicht. Ebenfalls moegliche Fehlerquelle.

Martin Thomas

von Markus N. (roboscan)


Lesenswert?

Jo ich bin ja gerade fleissig dabei mim C lernen.

Also ich habe deinen fehler jetzt korrigiert und der Compiler gibt
keinen Fehler mehr raus.
Nur mein MEGA16 lässt sich nicht mehr beschreiben. Immer wenn ich ihn
z. B. nur "erasen" will krieg ich ne fehlermeldung. Ich habe keine
Ahnung warum. Vorgestern konnte ich ihn noch beschreiben.
Deswegen kann ich es leider nich testen.

Was ist eigentlich der Analog Comparator z.B. im 8151?
Macht der auch so etwas oder was macht der genau?

von Himmstädt (Gast)


Lesenswert?

Guten Tag, eine Frage an Markus, bist Du zufällig Wien? Falls ja, habe
ich Dir im August zwei Pakete gesandt. Ich habe massiven Äger mit der
Post. Wäre nett, wenn Du Dich melden könntest. Danke, Frank

von Markus N. (roboscan)


Lesenswert?

Hallo Frank.
Ne Sorry ich wohne hier in München.

von Himmstädt (Gast)


Lesenswert?

Danke :)

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.