mikrocontroller.net

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


Autor: Daniel Nierhoff (danieln)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include "lcd_routines.h"

void main(void)
{
  init();
  
  uint16_t adcval;
  adcval = ReadChannel(0);

    while(1) {
      //adc_2_lcd(adc_value);
  }
}


int init(void)
{
    lcd_init();
// irgendwelche Ausgaben auf LCD
    return 0;
}


uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                        // Kanal waehlen
  //ADMUX |= (1<<REFS1) | (1<<REFS0);  // (nur bei mega8) interne Referenzspannung nutzen
 
  ADCSR = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // (bei mega8: ADCSRA) Frequenzvorteiler 
                          // setzen auf 8 (1) und ADC aktivieren (1)
 
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSR |= (1<<ADSC);        // eine ADC-Wandlung 
  while (ADCSR & (1<<ADSC)) {
    ;                // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;            // ADCW muss einmal gelesen werden,
                    // sonst wird Ergebnis der nächsten Wandlung
                    // nicht übernommen.
 
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  result = 0; 
  for(i=0; i<4; i++)
  {
    ADCSR |= (1<<ADSC);      // eine Wandlung "single conversion"
    while (ADCSR & (1<<ADSC)) {
      ;              // auf Abschluss der Konvertierung warten
    }
  result += ADCW;            // Wandlungsergebnisse aufaddieren
  }
  ADCSR &= ~(1<<ADEN);        // ADC deaktivieren

  result /= 4;            // Summe durch vier teilen = arithm. Mittelwert
  return result;
}


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

Daniel

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Daniel Nierhoff (danieln)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.