Skocz do zawartości

[C] ADC + SHARP analog


TomZiom

Pomocna odpowiedź

Siema. Prosty program w celu zaprzyjaźnienia się z czujnikiem SHARP analogowym. Program ma za zadanie zaświecić diodą gdy SHARP wykryje coś przed sobą. Easy.

Kod:

main.c

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include "SHARP/sharp.h"


int main()
{
adc_init();
DDRC |= (1<<PC0); //dioda

while(1)
{
	_delay_ms(1000);
	if (pomiar(2) >= 400) //SHARP podpięty do PA2 - ADC2 //400 to wartość odpowiadająca ok 2V na pinie SHARPA
	{
		PORTC ^= (1<<PC0);
	}
}
}

sharp.c

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include "sharp.h"

void adc_init(void)
{
ADMUX |= (1<<REFS0); // voltage reference - AVCC
ADCSRA |= (1<<ADEN); //ADC enable
ADMUX |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //preskaler 128, taktowanie uC 16Mhz
}

uint16_t pomiar (uint8_t kanal)
{
ADMUX |= (ADMUX & 0xF8) | kanal;
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
return ADCW;
}

sharp.h

#ifndef SHARP_H_
#define SHARP_H_


void adc_init(void);

uint16_t pomiar (uint8_t kanal);


#endif /* SHARP_H_ */

Ma ktoś pomysł czemu to nie działa?

[ Dodano: 30-05-2013, 21:59 ]

Okej już zagadka rozwiązana. Zamiast rejetru ADMUX powinien być ADCSRA w funkcji adc_init().

Przy okazji, jaka koncepcja jest najlepsza jeśli chodzi o SHARP w robocie klasy minisumo?

Tak jak powyższy przykłąd pojedynczego pomiaru czy może Free Running Mode z przerwaniem? a Może wew. komparator analogowy?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.