Forum: Mikrocontroller und Digitale Elektronik Fehler "conflicting types" bei Programm aus ADC Tutorial


von Daniel N. (danieln)


Lesenswert?

Hallo zusammen,

ich programmiere seit mehreren Jahren meine AVRs nur in Assembler, 
möchte aber langsam mal etwas aus der Steinzeit in das goldene 
"C-Zeitalter". Mit anderen Worten, ich bin ziemlicher Neuling und habe 
ausser einem Semester C-Programmierung im Studium noch nie viel mit C zu 
tun gehabt - speziell nicht in Verbindung mit Mikrocontrollern.

Nachdem ich schon nach etwa 10 Minuten mit Hilfe des Tutorials einen 
Text auf einem LCD ausgeben konnte, hat mich der Übermut gepackt. Ich 
habe mich an den im AT90S4433 eingebauten ADC gewagt und auch da den 
Code aus dem Tutorial weitestgehend übernommen. Nur die notwendigen 
Änderungen für den "alten" AT90S4433 habe ich vorgenommen. Mein Plan war 
es eine analoge Spannung als Spannungs-Wert auf dem Display auszugeben.

Leider bekomme ich beim kompilieren immer folgenden Fehler:
../main.c:42: error: conflicting types for 'ReadChannel'
../main.c:11: error: previous implicit declaration of 'ReadChannel' was 
here

Hier der Code:
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <util/delay.h>
4
#include "lcd_routines.h"
5
6
void main(void)
7
{
8
  init();
9
  
10
  uint16_t adcval;
11
  adcval = ReadChannel(0);
12
13
    while(1) {
14
      //adc_2_lcd(adc_value);
15
  }
16
}
17
18
19
int init(void)
20
{
21
    lcd_init();
22
// irgendwelche Ausgaben auf LCD
23
    return 0;
24
}
25
26
27
uint16_t ReadChannel(uint8_t mux)
28
{
29
  uint8_t i;
30
  uint16_t result;
31
 
32
  ADMUX = mux;                        // Kanal waehlen
33
  //ADMUX |= (1<<REFS1) | (1<<REFS0);  // (nur bei mega8) interne Referenzspannung nutzen
34
 
35
  ADCSR = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // (bei mega8: ADCSRA) Frequenzvorteiler 
36
                          // setzen auf 8 (1) und ADC aktivieren (1)
37
 
38
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
39
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
40
  ADCSR |= (1<<ADSC);        // eine ADC-Wandlung 
41
  while (ADCSR & (1<<ADSC)) {
42
    ;                // auf Abschluss der Konvertierung warten 
43
  }
44
  result = ADCW;            // ADCW muss einmal gelesen werden,
45
                    // sonst wird Ergebnis der nächsten Wandlung
46
                    // nicht übernommen.
47
 
48
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
49
  result = 0; 
50
  for(i=0; i<4; i++)
51
  {
52
    ADCSR |= (1<<ADSC);      // eine Wandlung "single conversion"
53
    while (ADCSR & (1<<ADSC)) {
54
      ;              // auf Abschluss der Konvertierung warten
55
    }
56
  result += ADCW;            // Wandlungsergebnisse aufaddieren
57
  }
58
  ADCSR &= ~(1<<ADEN);        // ADC deaktivieren
59
60
  result /= 4;            // Summe durch vier teilen = arithm. Mittelwert
61
  return result;
62
}

Welchen - ich nehme mal an grundlegenden - Fehler mache ich hier? Vielen 
Dank für eure Hilfe,

Daniel

von Benjamin S. (recycler)


Lesenswert?

Du machst keinen Fehler, nur der Compiler arbeitet von oben nach unten. 
Und wenn er zur Zeile 11 kommt (adcval = ReadChannel(0);), dann kennt er 
die Funktion noch nicht. Wenn dann mach vor der main folgende Zeile 
rein, dann gehts. Damit deklarierst du die Funktion und er weiß wie er 
sie aufrufen muss.


uint16_t ReadChannel(uint8_t mux);

von Daniel N. (danieln)


Lesenswert?

Tatsache! Das war ja einfach! Wie gesagt, ich bin Assembler gewohnt, da 
ist es ja völlig egal, was wo in welcher Reihenfolge steht (wenn man mal 
von der maximalen Sprungweite einiger Verzweigungen absieht). Ich denke, 
jetzt wird mir auch klar, wofür diese Header-Dateien sind... Danke!!

Grüße,
Daniel

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.