AVR Zugriff auf ADC

R

R.Freitag

Guest
Ich suche C-Code für den Zugriff auf die onchip-ADCs des AVR. Ich hätte
erwartet, solchen in der avr-libcc zu finden-- weit gefehlt!!

Aber wo sonst?


Gruss

Robert

--
'Vom Standpunkt eines Beamtenrechtlers aus betrachtet ist der Tod die
schärfstwirkenste aller bekannten, langfristig wirkenden Formen der
vollständigen Dienstunfähigkeit.'
aus: Kommentar zum Beamtenrecht.
 
R.Freitag <rfr-mailbox@gmx.de> wrote:

Aber wo sonst?
In deinen grauen Zellen? Die 2-3 Zeilen wirst du doch wohl selber
hinbekommen.

Olaf
 
"R.Freitag" <rfr-mailbox@gmx.de> wrote:

Hi!

Ich suche C-Code für den Zugriff auf die onchip-ADCs des AVR.
Was in die einzelnen Register kommt, musst Du schon selbst verstanden
haben. Ansonsten, inclusive sleep-while-conversion:


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


void AD_Init(void)
{
MCUCR = ...;
ADCSRA = ...;
}


unsigned int AD_Get(unsigned char channel)
{
ADMUX = channel | ...;
sei();
sbi(ADCSRA, ADSC); // start conversion
asm volatile("sleep\n\t"::);
return(ADC);
}


SIGNAL (SIG_ADC)
{
}


Der ADC schickt die CPU während der Wandlung in den Schlaf und weckt
sie danach wieder auf. Der "leere" Interrupt ist dazu da, daß die CPU
nach dem "wach auf, der ADC ist fertig"-Interrupt nicht in die Pampa
springt.

Gruß,
Michael.
 
Michael Eggert <m.eggert.nul@web.de> schrieb:

sbi(ADCSRA, ADSC); // start conversion
sbi is nich mehr. Standard-C: ADCSRA |= _BV(ADSC).

asm volatile("sleep\n\t"::);
#include <avr/sleep.h>

set_sleep_mode(SLEEP_MODE_ADC);
...
sleep_mode();

SIGNAL (SIG_ADC)
{
}
#include <avr/interrupt.h>

EMPTY_INTERRUPT(ADC_vect);

--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
 
j@uriah.heep.sax.de (Joerg Wunsch) wrote:

Hi!

sbi is nich mehr. Standard-C: ADCSRA |= _BV(ADSC).
Hab ich beim copy&paste übersehen, war ein altes Projekt.

asm volatile("sleep\n\t"::);

#include <avr/sleep.h

set_sleep_mode(SLEEP_MODE_ADC);
...
sleep_mode();
Aahja.

SIGNAL (SIG_ADC)
{
}

#include <avr/interrupt.h

EMPTY_INTERRUPT(ADC_vect);
Den kannte ich noch nicht, danke!

Gruß,
Michael.
 
Michael Eggert <m.eggert.nul@web.de> schrieb:

EMPTY_INTERRUPT(ADC_vect);

Den kannte ich noch nicht, danke!
Ich merke gerade, dass ich den zu voreilig aus der aktuellen (to
become avr-libc 1.4.0) Doku cut&pasted habe. Für avr-libc 1.2.6
heißt das natürlich

EMPTY_INTERRUPT(SIG_ADC);

--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
 
j@uriah.heep.sax.de (Joerg Wunsch) wrote:

Hi!

Da fällt mir ein, hast Du eine Idee, wann das neue WinAVR-Paket
rauskommt?

Gruß,
Michael.
 
Steffen Koepf <Taxman-usenet@opaya.de> wrote:

Hi!

Und was ist, wenn waehrend des Sleeps irgendwas anderes den AVR
aufweckt? Dann faehrt er nach dem sleep fort, liest die ADC
Register aus die noch keinen gueltigen Inhalt enthalten und liefert
irgendeinen Mist zurueck...
Stümmpt, kam in meiner Anwendung nur nicht vor.
Also noch das AD Interrupt Flag Bit abfragen...

Gruß,
Michael.
 
R.Freitag wrote:

Ich suche C-Code für den Zugriff auf die onchip-ADCs des AVR. Ich hätte
erwartet, solchen in der avr-libcc zu finden-- weit gefehlt!!

Aber wo sonst?
Ich mach mal die Ingrid...:-(

ich habe beim Posten dieser msg eigentlich als Antwort eine Lib haben
wollen, in der sowas drinsteht, natürlich kann ich mir das alles selbst
programmieren, aber das kann ich bei Stzrings usw. ja auch. Mittlerweile
bin ich fündig geworden,
http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.html
enthält weitere Infos.

Grüsse

Robert

--
'Vom Standpunkt eines Beamtenrechtlers aus betrachtet ist der Tod die
schärfstwirkenste aller bekannten, langfristig wirkenden Formen der
vollständigen Dienstunfähigkeit.'
aus: Kommentar zum Beamtenrecht.
 
Michael Eggert <m.eggert.nul@web.de> wrote:

unsigned int AD_Get(unsigned char channel)
{
ADMUX = channel | ...;
sei();
sbi(ADCSRA, ADSC); // start conversion
asm volatile("sleep\n\t"::);
return(ADC);
}
Und was ist, wenn waehrend des Sleeps irgendwas anderes den AVR
aufweckt? Dann faehrt er nach dem sleep fort, liest die ADC
Register aus die noch keinen gueltigen Inhalt enthalten und liefert
irgendeinen Mist zurueck...


cu,

Steffen
 
Michael Eggert <m.eggert.nul@web.de> wrote:
Stümmpt, kam in meiner Anwendung nur nicht vor.
Also noch das AD Interrupt Flag Bit abfragen...
Oder in der Interrupt-Routine ein Flag setzen und dieses Abfragen:

while(c_adc_complete == 0) {
asm volatile ("sleep");
}


SIGNAL (SIG_ADC)
{
c_adc_complete = 1; /* Set ready flag */

}


cu,

Steffen
 
R.Freitag schrieb:
R.Freitag wrote:


Ich suche C-Code für den Zugriff auf die onchip-ADCs des AVR. Ich hätte
erwartet, solchen in der avr-libcc zu finden-- weit gefehlt!!

Aber wo sonst?


Ich mach mal die Ingrid...:-(

ich habe beim Posten dieser msg eigentlich als Antwort eine Lib haben
wollen, in der sowas drinsteht, natürlich kann ich mir das alles selbst
programmieren, aber das kann ich bei Stzrings usw. ja auch. Mittlerweile
bin ich fündig geworden,
http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.html
enthält weitere Infos.

Grüsse

Robert
Hast du mal da nachgelesen:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe

Da steht doch (fast) alles an Grundlagen drin, mit Codebeispielen

MfG Daniel
 
Michael Eggert <m.eggert.nul@web.de> schrieb:

Da fällt mir ein, hast Du eine Idee, wann das neue WinAVR-Paket
rauskommt?
Musst du Eric Weddington fragen... Er hat kürzlich den Job
gewechselt und ist darauf hin umgezogen, das hat natürlich
gut Zeit geschluckt.
--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
 
"R.Freitag" <rfr-mailbox@gmx.de> schrieb:

ich habe beim Posten dieser msg eigentlich als Antwort eine Lib
haben wollen, in der sowas drinsteht, ...
Da hier von 3 Zeilen Code bis zum komplett interruptgesteuerten
System, das nach jeder Messung den Kanal umschaltet und neu misst
alles denkbar ist, ist die customization wohl das größte Problem.
Genau darin unterscheidet sich eben die Aufgabe drastisch von einer
einfachen String-Verarbeitung.

http://ccrma.stanford.edu/courses/250a/docs/avrlib/main.html
avrlib, ja, die ist bekannt. Wenn die Lizenz für deinen Einsatzzweck
OK ist und die restlichen Randbedingungen auch, warum nicht? Die hat
einen ganz guten Ruf und auch noch andere nützliche Dinge.

Aber wie geschrieben, im einfachsten Falls sind es 3 Zeilen Code, da
braucht man keine Bibliothek dafür (einschalten, warten, auslesen).

--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
 

Welcome to EDABoard.com

Sponsor

Back
Top