Hallo,
Ik ben al een tijdje aan het zoeken hoe ik verschillende ADC ingangen van de ATMEGA8 kan inlezen. Ik heb al enkele keren het hoofdstuk adc van het pdf file van de atmega 8 gelezen.
1 ingang inlezen is geen probleem. Maar 4 ingangen inlezen lukt mij niet.
Kan iemand mij hierbij helpen?
Ik wil een robotje bouwen dat een zwarte lijn volgt. Dus ik heb 4 sensoren die de zwarte lijn in het oog houden, en dus 4 analoge ingangen.
Ik zou dan graag 4 geheugenplaatsen hebben waar de informatie van de 4 sensoren wordt bewaard en die ik dan kan gebruiken om na berekening de motortjes van de robot aan te sturen.
Kan iemand mij vertellen waar ik een voorbeeld programmaatje kan vinden waar men verschillende adc ingangen inleest?
Of hoe ik dit moet programmeren. Ik gebruik Imagecraft.
Bedankt!
RES
RES
Er zit maar 1 ADC in, maar zit verbonden aan het ADC multiplexer blok. (staat een blokschema in die datasheet)
Via de ADMUX kan je de i/o op de ADC schakelen.
Dan doe je deze volgorde.
1 ADMUX op PC0 zetten, dan de ADC pollen.
2 ADMUX op PC1 zetten, dan weer de ADC pollen.
3 ADMUX op PC2 zetten, dan weer de ADC pollen.
4 ADMUX op PC3 zetten, en nogmaals de ADC pollen.
Nu heb je 4 getallen staan in bijv. 4 verschillende registers, die je kan verwerken.
Je kan ipv de ADC ook de Analog Comparator via dat ADMUX blok gebruiken, op die manier kan je 6 (of 8) verschillende signalen meten of samplen.
Bedankt voor je reactie!
Ik heb hier een programmaatje geschreven, zou dit kunnen kloppen:
# include <iom8v.h>
# include <macros.h>
# define FALSE 0
# define TRUE 1
int currentchannel = 0b01000000;
int geheugeningang0;
int geheugen;
unsigned char newsampleready = FALSE;
DDRB = 0xFF;
PORTB = 0xFF;
DDRC = 0x00;
ADCSR = 0x00;
/* interrupt service routine*/
interrupt [ADC_vect] void ISR_ADC ( void)
{
geheugen = ADC; /* informatie inlezen*/
newsampleready = TRUE;
if ( currentchannel < 3 )
currentchannel++;
else
newsampleready = TRUE;
currentchannel = 0b01000000;
ADMUX = currentchannel;
}
void main ( void )
ADCSR |= (1<<ADS2); */ instelling precaler*/
ADCSR |= (1<<ADFR); */ free running */
ADMUX = currentchannel; */ keuze van ingangskanaal*/
ADCSR |= (1<<ADIE); */ enable adc interrupt*/
ADCSR |= (1<<ADEN); */ enable adc */
_SEI(); */ enable global interrupt*/
ADCSR |= (1<<ADSC); */ start conversie*/
while(1) */ loop */
{
if (newsampleready) */ als newsampleready is gelijk aan TRUE */
{
*/ uitvoeren van berekeningen */
newsampleready = FALSE;
}
}
ik heb het nog niet uitgetest, maar ga dit dadelijk testen.
alvast bedankt!
Is het mogelijk om met AVR studio 4 een adc ingang te simuleren?
Ik heb volgend programmaatje geschreven in Imagecraft.
Het leest 4 ingangen in en zet de waarde in 4 geheugenplaatsen, geheugenadc0, geheugenadc1, geheugenadc1 en geheugenadc3. Het compileerd zonder fouten. Maar hoe kan ik testen ofdat het programmaatje werkt? kan ik dit simuleren in avr studio 4?
Als ik het inlaad in studio 4 en ik doorloop regel per regel, dan zie ik de instellingen in de registers veranderen.
# include <iom8v.h>
# include <macros.h>
# define FALSE 0
# define TRUE 1
int geheugen;
int geheugenadc0;
int geheugenadc1;
int geheugenadc2;
int geheugenadc3;
int newsampleready;
int currentchannel;
// interrupt service routine
void ISR_ADC ( void)
{
geheugen = ADC; // informatie inlezen
newsampleready = TRUE;
if ( currentchannel < 3 )
{
currentchannel++;
}
else
{
newsampleready = TRUE;
currentchannel = 0b01000000;
ADMUX = currentchannel;
}
}
void main ( void )
{
currentchannel = 0b01000000;
newsampleready = FALSE;
DDRB = 0xFF;
PORTB = 0xFF;
DDRC = 0x00;
ADCSR = 0x00;
ADCSR |= (1<<ADPS2); // instelling precaler
ADCSR |= (1<<ADFR); // free running
ADMUX = currentchannel; // keuze van ingangskanaal
ADCSR |= (1<<ADIE); // enable adc interrupt
ADCSR |= (1<<ADEN); // enable adc
_SEI(); // enable global interrupt
ADCSR |= (1<<ADSC); // start conversie
while(1) // loop
{
if (newsampleready) // als newsampleready is gelijk aan TRUE
{
// uitvoeren van berekeningen
if ( currentchannel == 0b01000000 )
{
geheugen = geheugenadc0;
}
if ( currentchannel == 0b01000001 )
{
geheugen = geheugenadc1;
}
if ( currentchannel == 0b01000010 )
{
geheugen == geheugenadc2;
}
if ( currentchannel == 0b01000011 )
{
geheugen == geheugenadc3;
}
newsampleready = FALSE;
}
}
}