Source Code für ADC bei Atmega328(Sparkfun ADXL345) für Gyrosensor

Gast #1854809
Lesenswert?

hi,
ich habe das Sparkfun ADXL345 Eval 
Board(http://www.sparkfun.com/commerce/product_info.php?products_id=9814) 
und wollte es mit einem 2-Achs 
Gyrosensor(http://www.sparkfun.com/commerce/product_info.php?products_id=9094) 
bestücken.

Leider krieg ich das Ding nicht zum laufen, weil ich jetzt nicht weiß 
was für register ich genau beschreiben muss um den ADC zu aktivieren. 
Die Register im ADXL345 Manual überschneiden sich mit dem des Atmega 
328. Habe große Sorge dass wenn ich diese falsch beschreibe ich das 
Board nicht mehr zum laufen bekomme.

Hat irgend jemand vielleicht Erfahrungen damit gemacht oder schon einen 
ferigen Source Code?

Vielen Dank!
Persönliche Seite #1854846
Lesenswert?

Achso, jetzt verstheh ich die Frage erst...
Es soll ja der IDG500 zusätzlich zum ADXL345 ausgelesen werden.
Für den ADXL345 gibt es ja auf der verlinkten Seite schon einen 
Beispielcode, ich nehme an, dass dieser funktioniert.

Der IGD500 hat natürlich einen Analogausgang und muss an den ADC vom 
ATmega angeschlossen werden.

Der Beispielcode sollte spätestens nach kleinen Anpassungen auf dem 328 
laufen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Nutzung_des_ADC

Grüße,

Peter
Gast #1858602
Lesenswert?

hallo,
also ich hab jetzt diese dateien auf das board geloaded.
über tera term werden jetzt zwar alle 5 kanäle (3x beschleunigungssensor 
und 2x gyrosensor)angezeigt, jedoch bleiben die gyro-werte immer 
konstant bei x:0197 und y:01d2.
ist meine main datei fehlerhaft oder kann das board keine 2 sensoren 
gleichzeitig auslesen?

merci
Angehängte Dateien:
#1858626
Lesenswert?

michi schrieb:

> und 2x gyrosensor)angezeigt, jedoch bleiben die gyro-werte immer
> konstant bei x:0197 und y:01d2.

Und, was sagt dein Voltmeter?
Ändert sich die Spannung überhaupt am Eingang?


Ach nö ...
1
uint16_t x_gyro(void)              //wird in x_gyro() ausgegeben!! muss ich dann zur visualisierung öffnen!
2
{
3
  uint16_t  xl;// xlow register
4
  uint16_t  xh;// xhigh register
5
  
6
  // x-axis
7
  
8
  //ADMUX = (1 << REFS0);        // Referenzspannung
9
    ADMUX = 0b11000110;
10
  //ADMUX |= ((1 << MUX1)|(1 << MUX2)); // 0110 =ADC6 -> MUX0=0; MUX1=1; MUX2=1; MUX3=0;
11
   
12
  ADCSRA = ((1<<ADPS1)|(1<<ADPS0));     // ADPS2 und ADPS1 sind die Prescaler mit division factor 64
13
  ADCSRA |= (1 << ADEN); //ADEN schaltet ADC ein; ADSC =startet conversion; ADPS2 und ADPS1 sind die Prescaler mit division factor 64
14
  ADCSRA |= (1 << ADSC); //ADSC =startet conversion
15
  
16
  while(ADCSRA & (1 << ADSC)){};
17
  xl = ADCL;
18
  xh = ADCH & 0x03;
19
  xh = xh << 8;
20
  xh = xh + xl;
21

22
  //ADMUX &= 0xF0;
23
    
24
  return xh;  
25
}

... schon wieder das Rumgefrickel auf Bitebene.
Warum hast du denn nicht fürs erste die Tutorialroutinen so übernommen, 
wie sie im Tutorial sind? Eventuell noch die Referenzspannung anpassne, 
mehr aber auch nicht.
Gast #1858765
Lesenswert?

ich hab die main datei doch nach dem tutorial gemacht.
admux usw. auf interne und die mux pc6 und pc7 zugewiesen.
hab leider keine ahnung wie du das gemeint hast, da man doch sämtliche 
einstellungen nur über die bit verschiebung ändern kann, oder?
#1858768
Lesenswert?

michi schrieb:
> ich hab die main datei doch nach dem tutorial gemacht.

Im Tutorial gibt es eine wunderbare ADC_Read Funktion.
Der übergibt man die Kanalnummer und sie liest den Wert aus.

Eine noch bessere Steilvorlage kann es wohl kaum geben.

Es ist nicht verboten, die Routinen ADC_Init und ADC_Read aus dem 
Tutorial einfach 1:1 zu übernehmen und die Einstellung der 
Referenzspannung anzupassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren