roboforum.ru

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

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 07 апр 2008, 14:20

Если порядок чтения результата АЦП и записи в таймер не нарушен то наверняка корректна.

Re: МикроКонтроллеры начинающим - общие вопросы

Master » 07 апр 2008, 16:21

Код: Выделить всёРазвернуть
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x06;
// Place your code here
ADCSRA.6 = 1; //Включаем ADC
}

#define ADC_VREF_TYPE 0x00

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
//Выводим на ЛСД величину шим
ftoa((ADCW*100/1024), decimals, strADC);     
lcd_clear();
lcd_puts(strADC);
lcd_putsf(" ob/min");       

OCR1BH=ADCH;
OCR1BL=ADCL;
}

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 07 апр 2008, 16:54

прерывание ИМХО раздутое у тебяю И зачем ты читаешь опять из ADCW если результат у тебя уже в adc_data ???

Может вот так написать

Код: Выделить всёРазвернуть
interrupt [ADC_INT] void adc_isr(void) {

       unsigned int adc_data;

adc_data = ADCW ;   // Read the AD conversion result

OCR1B = adc_data ;  // set new PWM

   //Выводим на ЛСД величину шим
   ftoa(( adc_data * 100/1024), decimals, strADC);
     
lcd_clear();
lcd_puts(strADC);
lcd_putsf(" ob/min");       
                                        }

Re: МикроКонтроллеры начинающим - общие вопросы

Master » 07 апр 2008, 17:04

Спасибо теперь работает, нужно было написать вот так, в противном случае нифига не работает. Т.е. нельзя два раза вызывать ADCW, ADCH и ADCL, нужно работать с adc_data.
Вот исправленный код, не правильное закоментил ниже правильная строка
Код: Выделить всёРазвернуть
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x06;
// Place your code here
ADCSRA.6 = 1; //Включаем ADC
}

#define ADC_VREF_TYPE 0x00

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
//Выводим на ЛСД величину шим

//ftoa((ADCW*100/1024), decimals, strADC);      это не правильно
  ftoa((adc_data*100/1024), decimals, strADC);     
lcd_clear();
lcd_puts(strADC);
lcd_putsf(" ob/min");       

//OCR1BH=ADCH;  это не правильно
//OCR1BL=ADCL;  и это тоже
OCR1B = adc_data;
}


avr123.nm.ru :friends:

Re: МикроКонтроллеры начинающим - общие вопросы

ZarK117 » 08 апр 2008, 21:54

На одном из предприятий, где мы проходили практику, на столе у глав. инж. была табличка: необычный вопрос - 0 р., простой вопрос - 100 р., глупый вопрос - 150 р., умный вопрос - 200 р.... так вот вопрос, глупый или какой, решайте сами.... Я не врубаюсь, какую величину забивает АЦП в ADCW. В одной из книг написано: ADC = V(на пине)*1024/V(опорное). Как именн связанно ADCW с ADCH:ADCL, какое значение выводиться в ADCW, если на входе будет 1В, 1.5В и т.п.????

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 08 апр 2008, 22:10

ZarK117 писал(а):какую величину забивает АЦП в ADCW. В одной из книг написано: ADC = V(на пине)*1024/V(опорное). Как именн связанно ADCW с ADCH:ADCL, какое значение выводиться в ADCW, если на входе будет 1В, 1.5В и т.п.????


Можно у меня почитать - http://avr123.nm.ru/z11.htm - о преобразовании.
Но ИМХО очевидно что Vref это число 1023 , а 0 вольт это число 0. Однако нужно учесть ошибки АЦП.

ADCH это старший байт ADCW
ADCL это младший байт ADCW

Re: МикроКонтроллеры начинающим - общие вопросы

space » 13 апр 2008, 22:15

Помогите разобраться. Вообщем в коде ниже мне нужно изменить 0x40 и 0xbf для PD7.
У себя в книшках вроде всё нашёл как и что переводить. Проверьте пожалуйста правильно ли. 2 код/ Только не нашёл как исправить это 0xbf
1
Код: Выделить всёРазвернуть
DDRD  = 0x40;  // назначаем все линии порта D на вход, кроме PD6
PORTD = 0xbf;  // подключаем внутренние нагрузочные резисторы, кроме PD6

2
Код: Выделить всёРазвернуть
DDRD  = 0x4A;  // назначаем все линии порта D на вход, кроме PD7
PORTD = ?;  // подключаем внутренние нагрузочные резисторы, кроме PD6

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 13 апр 2008, 22:39

Возможно так:

Код: Выделить всёРазвернуть
 DDRD = (1<<7);  // назначаем все линии порта D на вход, кроме PD7
PORTD = ~(1<<6); // подключаем внутренние нагрузочные резисторы, кроме PD6


Или так:

Код: Выделить всёРазвернуть
 DDRD = (1<<PD7);  // назначаем все линии порта D на вход, кроме PD7
PORTD = ~(1<<PD6); // подключаем внутренние нагрузочные резисторы, кроме PD6


в CVAVR для последнего варианта нужно скачать мой заголовок m8_128.h

Re: МикроКонтроллеры начинающим - общие вопросы

space » 13 апр 2008, 23:18

Спасибо. Ща буду пробовать.
Только так. Мне надо и то и то:
Код: Выделить всёРазвернуть
 DDRD = (1<<PD7);  // назначаем все линии порта D на вход, кроме PD7
PORTD = ~(1<<PD7); // подключаем внутренние нагрузочные резисторы, кроме PD7


Добавлено спустя 5 минут 22 секунды:
Спасибо ещё раз :beer: . Всё работает :Yahoo!:

Добавлено спустя 28 минут 21 секунду:
Ещё тут такой вопрос. А как составляют таблицу вероятностей? Может кто-нибудь рассказать?
Код: Выделить всёРазвернуть
// таблица вероятностей для выбора направления движения, исходя
// из текущего направления движения.
unsigned char p[9][9] = {
{10,20,30,40,50,60,70,80,90},
{5,15,25,35,45,55,65,75,95},
{1,2,3,4,5,6,77,88,99},
{1,2,3,4,5,6,66,77,99},
{20,60,20,20,50,70,100,100,100},
{35,31,32,33,74,93,96,99,99},
{36,31,32,68,77,70,44,6,17},
{17,48,59,59,59,59,59,95,100},
{10,40,55,65,56,77,17,49,100},
};

Re: МикроКонтроллеры начинающим - общие вопросы

space » 14 апр 2008, 21:48

Ну не ужели никто не знает? :(

Re: МикроКонтроллеры начинающим - общие вопросы

Vooon » 14 апр 2008, 21:59

ну а сходить в гости к Железному Феликсу?
посмотреть в педивики википедии?

Re: МикроКонтроллеры начинающим - общие вопросы

space » 14 апр 2008, 22:22

Спасибо. Просто раньше не видел там такого. Видимо плохо искал :oops:

Re: МикроКонтроллеры начинающим - общие вопросы

Master » 16 апр 2008, 09:26

Короче есть у меня программатор AVR910 сам сделал по схеме протоса, он работает. Дальше по шлейфу, я сделал маленькую платку на которой прошиваю Мегу16, т.е. я там прошиваю МК, а потом выкавыриваю его и сую в свои девайсы. Так вот, фузы я зашил на 16МГц, но при прошивке для тактирования использую не внешний кварц, а сигнал Clock который выдает, программатор, но я его по ошибке подключил на прошиваемом МК не к XTAL1, а к XTAL2 и пользовался так уже почти полгода и все нормально шилось и нормально работало, а вот вчера заметил что не туда подключили сигнал такта. Вот теперь у меня вопрос, нужно ведь правильно подключить к XTAL1, просто щас делаю такую же платку чтобы можно было прошивать Мегу8?

Re: МикроКонтроллеры начинающим - общие вопросы

avr123.nm.ru » 16 апр 2008, 10:38

Master писал(а): у меня вопрос, нужно ведь правильно подключить к XTAL1


АГА ... :cry:

Re: МикроКонтроллеры начинающим - общие вопросы

Master » 18 апр 2008, 07:57

Перепаял, на XTAL1 - тоже работает. Чудеса.


Rambler\'s Top100 Mail.ru counter