PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC undeclared



Rodney
29.09.2004, 12:44
Hallo Leute,

mein Compiler (AVR-GCC) mendet in ADC einen undeclared indentifer,
ich habe nur <avr/io.h> eingebunden, das muss doch reichen oder?



return ADC;

Kjion
29.09.2004, 18:39
Probiers doch einfach mal mit ADCH und ADCL...

ADC ist nicht als 16-Bit Register definiert ( siehe zum Beispiel die iom16.h ), weil es bei "falscher" Einstellung das auch nicht ist ( ADLAR ist gesetzt ). Von daher ist ist das mit der Fehlermeldung schon richtig ;-)

MfG Kjion

Rodney
29.09.2004, 19:13
danke, aber jetzt kommt folgender Fehler:

c:\programme\winavr\bin\..\lib\gcc-lib\avr\3.3.2\..\..\..\..\avr\lib\avr5\crtm16.o(.i nit9+0x0): undefined reference to `main'

Obwohl ich c kann versteh ich die Meldung nicht wirklich

30.09.2004, 07:02
Man kann auf ADC als 16 Bit Register zugreifen. Dein Fehler wird irgendwo anders liegen. Poste einfach Quellcode und Makefile und dir wird geholfen. Auf raten habe ich keine Lust.

Rodney
30.09.2004, 19:53
main.c :


#define CPU_Frequency 4000000 // 4Mhz-Quarz
#define UART_BAUD_RATE 9600 // 9600 Baud


#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#include <stdlib.h>

#include "funktionen.c"
#include "bitdef.h"
typedef unsigned char BYTE;
typedef unsigned short WORD;

//************************************************** ************************************************** ********************

void warten(int t) //ermöglicht Pausen
{
int h;
for (;t>0;t--)
{
for (h=70;h>0;h--) {}
}
return;
}

void uart_init()
{
outp( (CPU_Frequency / (UART_BAUD_RATE*16L))-1 , UBRRL );
outp( 0, UBRRH );
outp( (1 << URSEL) | (3 << UCSZ0), UCSRC);
outp( (1 << RXCIE) | (1 << TXEN) | (1 << RXEN), UCSRB);

sei();
}


void uart_nachricht(char* senden) {

for (; *senden != '\0'; senden++) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR=*senden;
}
loop_until_bit_is_set(UCSRA, UDRE);
UDR = 13;
}

SIGNAL (SIG_UART_RECV) {
char ch;
ch = inp (UDR); // Datenregister auslesen
/* if (inp (USR) & (1 << OR)) { // OverRun Bit gesetzt ?
// Es ist was verloren gegangen / zu lange aufs Auslesen gewartet...
uart_nachricht("UART: Overrun-Bit gesetzt! Nicht schnell genug ausgelesen!");
}
*/
char buffer[1]; buffer[0] = '\0'; buffer[1] = '\0';
buffer[0] = ch;

uart_nachricht("Daten empfangen! Char: ");
uart_nachricht(buffer);
}




int main()
{
DDRA = B00000111; // PortA Pin 0,1,2 als Ausgang, Rest als Eingang
DDRC = 0xff; // PortC als Ausgang

int x = 0; // ADC-Wert
ADCSRA = _BV(ADEN) | _BV(ADPS2);
//Aktivierung des ADC, festlegen eines Prescalers von 16 --> 4Mhz/32=125kHz
//Starten einer einzelnen Konvertierung
//Start einer Wandlung



uart_init();
uart_nachricht("Initalisierung...");
uart_nachricht("Übertragungsrate: 9600 Baud");


for (;;) { // bei 30 läuft der Motor stabil!
PORTA = B00000001; // Rote-LED an
// motor...
PORTC = B00001010;
warten(3000);
PORTC = B00001001;
warten(3000);
PORTC = B00000101;
warten(3000);
PORTC = B00000110;
warten(3000);
}

}

01.10.2004, 07:09
Wo ist dein makefile und was steht da drin?

PS: outp (...) würde ich nicht mehr verwenden, wird mit der nächsten Version von avr-gcc nicht mehr funktionieren.

muraad
01.10.2004, 12:47
Wenns noch nicht funktioniert probier mal ADCW. ADC in Zeile 55 von iom32.h und ADCW in Zeile 57 scheinen mir die gleichen "Adressen" zu haben.
Gruß Muraad

Rodney
04.10.2004, 16:06
ADC wird nicht gefunden und die anderen Register sind alle 0...

muraad
05.10.2004, 15:50
Was soll das heissen, die Register sind alle 0..?
Gruß Muraad

Rodney
05.10.2004, 17:19
ADC, ADCH, ADCW sind alle 0 wenn ich sie abrufe

muraad
05.10.2004, 18:22
Sorry ist mir garnicht vorher aufgefallen, das du garnicht das Startbit setzt, dadurch ist es klar das in den Registern nur 0 steht. Du muss mit dieser Zeile
ADCSRA|=_BV(ADSC);
eine Konvertierung starten.
Mit dem hier
inline unsigned int getadc(void)
{
while (ADCSRA & _BV(ADSC)) {}
return ADC;
}
schreibst du nach dem Start z.B. x=getadc() und nun steht in x der ADC Wert.
Vielleicht hilf dir auch meine kleine Bibliothek die dur hier bei den Downloads unter Codeschnipsel findest.
Gruß Muraad

Rodney
05.10.2004, 19:24
ich bin auch ziemlich dämlich, dass mir das nicht aufgefallen ist...
Danke jetzt klappt wenigstens die Rückgabe vom AD-Wandler.

Allerdings hab ich jetzt unerwartet ein paar Probs bei der Auswertung:

Ich lese damit meine Batteriespannung aus die über einen Spannungsteiler heruntergesetzt wird.
Diesen habe ich mit 27 und 68 kO Wiederständen besetzt, nun müsste ich bei vRef=5,02 auf einen max Wert von 17,8 Volt kommen.

Allerdings bekomme ich vom Wandler 1009 zurückgeliefert, was nach meiner Rechnung für eine Spannung von 17,5 Volt spricht.
Es liegen aber nur ca 12 Volt an...

muraad
05.10.2004, 21:41
Da kann ich dir leider nicht wirklich helfen, da ich mich eher mit Programmierung auskenne. Praktischen Kontakt mit Elektronik hab ich erst seit 4 Wochen im FOS Praktikum. Meine Idee wäre einfach deine Rechnung vergessen. Dann einfach dir merken das bei 12V 1009 zurückgegeben wird. Dann müssten es bei der hälfte ,also 504, 6V sein usw. Kannst ja auch verschiedene Spannungen testen und dier die Werte aufschreiben und ne Tabelle machen. Ist sicher keine elegante/gute Lösung aber Funktionieren würde es.
Gruß Muraad

Rodney
06.10.2004, 14:24
mhh muss ich wohl erstmal austesten...
Ich hoffe mal nicht das der AD-Wandler oder so kaputt ist.

muraad
06.10.2004, 16:14
Hast du eigentlich einfach den AD Wert umgerechnet auf deine Spannung, oder ne Formel wie z.B. die bei www.mc-project.de unter ADC. Die muss man nur noch nach Vin umstellen.
Gruß Muraad