roboforum.ru

Технический форум по робототехнике.

помогите с ацп

помогите с ацп

sema-lap » 27 июл 2011, 20:10

создал робота для езды по линии всё получилось, кроме одного не могу одновременно считывать показания с обоих датчиков(в начале программы могу изменить , а в ходе не получается) смотрел даташит.
пишу на AVR Studio Atmega 32
вот код:
Код: Выделить всёРазвернуть
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

#define BACKWARD   ((0 << PC0)|(1 << PC1)|(1 << PC2)|(0 << PC3))      
#define FORWARD      ((1 << PC0)|(0 << PC1)|(0 << PC2)|(1 << PC3))

#define STOP      ((1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3))
#define MOTOR_PORT   PORTC

unsigned char u;
ISR(ADC_vect)
{
      if (ADCH == 0)
      {
         MOTOR_PORT = STOP;
         DDRB = 1 << PB0;
         PORTB = 1 << PB0;
      }
      else
      {
              DDRB = 0 << PB0;
         MOTOR_PORT = FORWARD;

              ADMUX  |= (0 << MUX0);//объявляем порт считывания adc0
         ADCSRA |= (1 << ADSC);//запускаем пробразование
         
            while(ADIF == 0);//ждём пока завершится преобразование
           
            OCR1A = ADCH;//считываем старшие биты и подаём мощность на моторы пропорциональна напр на ацп 
           
         
         ADMUX  |= (1 << MUX0);//меняем порт на adc1
         ADCSRA |= (1 << ADSC);
                                            
          while(ADIF == 0);
         
           OCR1B = ADCH;
         
      }
}

void init()
{

//////////PortC Initialization////////////////////////
   DDRC  = (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
   PORTC = (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
//-----------------------------------------------------
//////////PortD Initialization/////////////////////////
   DDRD  = (1 << PD4)|(1 << PD5);
   PORTD = 0;
//-----------------------------------------------------

//////////Timer 1 Initialization//////////////////////
   TCCR1A = (1 << COM1A1)|(1 << COM1B1)|(1 << WGM10);
   TCCR1B = (1 << WGM12)|(1 << CS10);
   TCNT1  = 0;
   OCR1A  = 0;
   OCR1B  = 0;
//-----------------------------------------------------

//////////ADC Intitialization////////////////////////
   ADMUX  = (1 << ADLAR)|(1<<MUX0);
   ADCSRA = (1 << ADEN)|(0 << ADATE)|(1 << ADSC)|(1 << ADIE)|(3 << ADPS0);
//----------------------------------------------------
   MOTOR_PORT = STOP;
   




};



int main(void)
{   
   init();
   sei();
   while(1)
   {
        
   };

}


вроде всё должно работать, но на практике порты не меняются

Re: помогите с ацп

sema-lap » 01 авг 2011, 20:21

ну пожалуйста помогите мне, я чувствую что там осталось доделать пару строчек.

Re: помогите с ацп

Michael_K » 01 авг 2011, 20:43

МК выполняет именно то, что вы написали.
Что вы ХОТЕЛИ написать, но почему-то не написали
- неизвестно ни нам, ни процессору. Какой же помощи вы от нас ждете?

ADMUX |= (0 << MUX0);//объявляем порт считывания adc0
Эта строчка ничего не делает.
ADMUX |= (1 << MUX0);//меняем порт на adc1
Эта строчка что-то делает, но вряд ли то, что написано в комментарии.

Re: помогите с ацп

Korbofos » 02 авг 2011, 13:28

Вы походу не выбрали источник опорного напряжения...
ADMUX=(1<<REFS0)|(1<ADLAR)|adc_chanel; может как-то так...
Биты REFS1 REFS0
Хотя могу ошибаться....


cron
Rambler\'s Top100 Mail.ru counter