Hallo zusammen,
ich versuche mich seit paar Tagen mit ADC Wandler.
Ich schreibe in C und nutze Atmelstudio 6. Zum testen habe ich mir ein kleines Kästchen mit einem ATmega8 und einem 20x4 Display gebastelt.
Vor ein paar Tagen habe ich einen alten analogen Joystick (boeder P-7 Joystick) auf dem Speicher gefunden und wollte diesen nun mit dem Atmega8 über ADC auslesen und vorerst auf dem LCD die Werte anzeigen lassen.
Allerdings musste ich ersteinmal paar Kabel umlöten, da die beiden 50Kohm Potis keine Masse hatten. 2. hab ich noch beide Tasten mit einem Pull-UP Wiederstand versehen.
Joystick ATmega8
X_Achse -- -- -- -- > PC1
Y_Achse -- -- -- -- > PC2
Taste A -- -- -- -- > PD2 (INT0)
Taste B -- -- -- -- > PD3 (INT1)
Tasten abfragen funktioniert super, nur die ADC_werte spinnen irgendiwe rum, wenn ich beide auslesen will. Einzeln auslesen ist ohne Proplem so wie ich das wünsche.
hier mal meine AT8adc.h Datie, denke mal das ich irgendwo einen Fehler habe oder es doch auf diese Weise nicht funktioniert.
Code:
/*
* AT8adc.h
*
* Created: 18.04.2015 17:29:41
* Author: Hendrik
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h> // für dtostrf
// Variablen
unsigned long ADC_result;
double XAchse; // double wegen return "XAchse" ins Hauptprogramm
double YAchse;
volatile int x;
char xstr[4];
char ystr[4];
void initADC (void)
{
// ADC Konfigurieren
ADCSRA |= (1<<ADEN); // ADC-Wandler aktivieren
ADCSRA |= (1<<ADPS1);// Teiler 64 (zw. 50khz und 200khz)
ADCSRA |= (1<<ADPS2);// Teiler 64 (8000000hz / 64 = 125000hz
}
// X-Achse messen am ADC1
double getADC1 (void)
{
ADMUX = 0x01; // ADC1 selekt
ADMUX |= (1<<REFS0); // Referenzspannung = VCC = 5Volt
ADC_result = 0;
//for (unsigned int i=0; i<8; i++)
//{
ADCSRA |= (1<<ADSC); // single conversion
while (ADCSRA & (1<<ADSC)) // warten bis ADC fertig
ADC_result = ADCW;
//ADC_result += ADCW; // adieren der conversion
//}
XAchse = ADC_result;
//XAchse = ADC_result/8; // 8mal messen, addieren und durch 8 teilen für Mittelwert
dtostrf(XAchse, 4, 0, xstr);
lcd_setcursor(5,2);
lcd_string(xstr);
x = XAchse-512; // umwandeln in -512 > 0 < +512
lcd_setcursor(15,2);
dtostrf(x,4,0,xstr);
lcd_string(xstr);
return XAchse;
}
// Y-Achse messen am ADC2
double getADC2 (void)
{
ADMUX = 0x02; // ADC2 selekt
ADMUX |= (1<<REFS0); // Referenzspannung = VCC = 5Volt
ADC_result = 0; // ADC_result zurücksetzen
//for (unsigned int i=0; i<8; i++)
//{
ADCSRA |= (1<<ADSC); // single conversion
while (ADCSRA & (1<<ADSC)) // warten bis ADC fertig
ADC_result = ADCW; // adieren der conversion
//}
YAchse = ADC_result; // 8mal messen, addieren und durch 8 teilen für Mittelwert
dtostrf(YAchse, 4, 0, ystr);
lcd_setcursor(5,3);
lcd_string(ystr);
return YAchse;
}
Im Main Programm frage ich dann wie folgt ab
Code:
while(1)
{
getADC1();
_delay_ms(300);
getADC2();
_delay_ms(300);
}
Die 300 ms hab ich nur rein genommen um zu sehen was das Proplem sein könnte. Lässt sich jetzt schlecht erklären, aber die beiden werte springen wild hin und her und lassen sich nicht zur jeweiligen Achse zuordnen.
Würde mich freuen wenn jemand mir auf die Sprünge helfen könnte und ne Idee hat.
Vielen Dank Hendrik
Lesezeichen