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