roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 18:13

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 03:06 
Не в сети

Зарегистрирован: 08 ноя 2009, 02:58
Сообщения: 4
Откуда: Питер
Имею отладочную плату с Atmega8. Помогите, пожалуйста, сделать что-то, типа, вольтметра до 5 вольт, но чтобы результаты 2х измерений отображались на 4х светодиодах для каждого измерения, т.е. Задействованы 2 порты АЦП C0 C1, четыре светодиода подключаются к порту В(для результатов с С0) и четыре к порту D(для результатов с C1). AREF подключён к 5 вольтам. Пишу в AVR Studio. Пишу программу, аа она, независимо от того, на какой вход подаю сигнал, оба светодиода пашут только на один из входов. в чём ошибка?

Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
ISR(SIG_ADC)
{
unsigned int ADCdata;
unsigned int ADCdata2;
ADCdata = ADCW;
ADCdata2 = ADCW;
//////////////////////////////////////
ADMUX = 0b00000000;
{
if (ADCdata > 215)
PORTD = 0b00001000;
else
PORTD = 0b00010000;
ADCSR = ADCSR | 0x40;
}
////////////////////////////////////
ADMUX = 0b00000001;
{
if (ADCdata > 215)
PORTB = 0b00001000;
else
PORTB = 0b00010000;
ADCSR = ADCSR | 0x40;
}
}
int main (void)
{
DDRD = 0xff ;
DDRB = 0xff ;
ADMUX = 0b00000000;
ADMUX = 0b00000001;
ADCSR = 0b11001110;
sei();
while(1);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 09:21 
Не в сети
Аватара пользователя

Зарегистрирован: 28 дек 2004, 20:33
Сообщения: 10211
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович
а на бейсике написать религия не позволяет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 11:36 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Вообщем, в двух словах, алгоритм такой:
1. Настраиваешь АЦП на первый вход: ADMUX = 0b00000000;
2. Производишь измерение: ADCSRA.6=1;
3. Ждёшь 13 тактов или окончания преобразования: while(ADCSRA.4==0);
4. Сохраняешь результат измерения в двух переменных: data_L = ADCL; data_H = ADCH;
повторяешь пункт 1-4 со вторым входом, сохранив результаты в других переменных,
5. Затем только отображаешь всё это на светодиодах.

З.Ы. Не забудь конечно выбрать источник опорного напряжения в ADMUX и разрешить АЦП в ADCSRA

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 12:18 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Вот урок про вывод на светодиоды - http://avr123.nm.ru/z1.htm
Вот урок про АЦП - http://avr123.nm.ru/z11.htm

Симулировать советую в симуляторе с довольно реальными светодиодами и источниками напряжения - PROTEUS или VMLAB.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 14:39 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2006, 19:56
Сообщения: 4468
Откуда: Украина, г.Одесса
прог. языки: Delphi и С
Смущает меня вот эти строки
Код:
ADCdata = ADCW;
ADCdata2 = ADCW;

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

А по поводу вольтметра посмотри здесь viewtopic.php?f=2&t=6388

Добавлено спустя 1 минуту 48 секунд:
Код:
ADMUX = 0b00000000;
ADMUX = 0b00000001;

И вот здесь тоже фигня написана, строку ADMUX = 0b00000000; можно ваще не писать. Т. к. следующей строкой вы ADMUX присваиваете значение 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 15:40 
Не в сети

Зарегистрирован: 08 ноя 2009, 02:58
Сообщения: 4
Откуда: Питер
Вот с одним АЦП у меня всё получается, а как с 2мя быть, не соображу)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 15:53 
Не в сети
Аватара пользователя

Зарегистрирован: 05 окт 2008, 14:41
Сообщения: 997
Откуда: СПб
прог. языки: C,Python
переключать мультиплексор на следующий канал
через регистр ADMUX


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 15:56 
Не в сети
Аватара пользователя

Зарегистрирован: 21 мар 2009, 20:06
Сообщения: 395
Откуда: Город на Неве
прог. языки: GNU C++ with Qt / C# via .NET
ФИО: Александр
И еще - как-то странно "{}" стоят... А особенно смущает if-else без скобочек и пробелов...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 08 ноя 2009, 16:04 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Цитата:
Вот с одним АЦП у меня всё получается, а как с 2мя быть, не соображу)

Тебе-ж говорят, поочереди :D

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 09 ноя 2009, 10:34 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2006, 19:56
Сообщения: 4468
Откуда: Украина, г.Одесса
прог. языки: Delphi и С
Он наверное не знает как правильно каналы переключать.

Код:
input_index=0;  //0...7 выбираем номер порта АЦП
ADMUX=(0 | (ADC_VREF_TYPE & 0xff) )+input_index;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 10 ноя 2009, 17:01 
Не в сети
Аватара пользователя

Зарегистрирован: 15 янв 2007, 19:23
Сообщения: 1058
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК
Ну тут раз на 4 светодиода выводиться будет, то вполне достаточно точности 8 бит. Так что можно битом ADLAR сделать выравнивание влево и брать результат из ADCH. А там уже смотря как выводить собираетесь.

Добавлено спустя 1 час 34 минуты 45 секунд:
В CodeVision-e можно сделать как-то так:
Код:
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x60
unsigned char data0, data1;
// Прерыванько по завершению АЦП преобразования
interrupt [ADC_INT] void adc_isr(void)
{
if (ADMUX.0==0) {
    data0=ADCH; //Если включен канал 0, читаем в data0
    ADMUX.0=1;  //Включаем канал 1
    }
else {
    data1=ADCH; //Если включен канал 1, читаем в data1
    ADMUX.0=0;  //Включаем канал 0
    }
}
void main(void)
{
//Инициализация портов
PORTB=0x00;
DDRB=0x0F;
PORTD=0x00;
DDRD=0x0F;
//Инициализация АЦП
//По умолчанию - канал 0
//Опорное напряжение с AVCC
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8C;
//Разрешение прерываний глобально
#asm("sei")
while (1) {
   ADCSRA.6=1; //Запускаем преобразование
   while(ADCSRA.4==0); //Ждёмс
  //Вывод результатов 1-го канала
   if (data0>200) {
       PORTB=15;}
   else {
    if (data0>150) {
        PORTB=7;}
    else {
     if (data0>100) {
        PORTB=3;}
     else {
      if (data0>50) {
        PORTB=1;}
      else {
        PORTB=0;
      }
     }
    }
   }
   //Вывод результатов 2-го канала
   if (data1>200) {
       PORTD=15;}
   else {
    if (data1>150) {
        PORTD=7;}
    else {
     if (data1>100) {
        PORTD=3;}
     else {
      if (data1>50) {
        PORTD=1;}
      else {
        PORTD=0;
      }
     }
    }
   };
};
}

_________________
I live My life!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 14 ноя 2009, 18:16 
Не в сети

Зарегистрирован: 08 ноя 2009, 02:58
Сообщения: 4
Откуда: Питер
Вот, сделал вроде как надо, но. работает только один пор ацп С0,который управляет 2мя портами светодиодов D и B. Проверьте, пожалуйста. Уже как только не пробовал, всё-равно не хотят они совместно работать.

Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
ISR(SIG_ADC)
{
if (ADMUX == 0b00000000)
{
ADMUX = 0b00000001;
unsigned int ADCdata;
ADCdata = ADCW;
if (ADCdata > 315)
{
PORTD = 0b00001000;
}
else
{
PORTD = 0b00010000;
}
ADCSR = ADCSR | 0x40;
}
///////////////////////////
if (ADMUX == 0b00000001)
{
ADMUX = 0b00000000;
unsigned int ADCdata2;
ADCdata2 = ADCW;
if (ADCdata2 > 315)
{
PORTB = 0b00001000;
}
else
{
PORTB = 0b00010000;
}
ADCSR = ADCSR | 0x40;
}
}
/////////////////////////////////////////////
void main (void)
{
DDRD = 0xff ;
DDRB = 0xff ;
ADMUX = 0b00000000;
ADCSR = 0b11001111;
sei();
while(1);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 14 ноя 2009, 18:53 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
Твоя ошибка в том, что ты сначала пытаешься отобразить результат, а потом производишь измерение.
Ты же сначала наливаешь стакан, а потом пьёшь. А не наоборот :D

Добавлено спустя 18 минут 53 секунды:
Да! и зачем ты это всё в прерывании делаешь? Есть такая необходимость?

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 14 ноя 2009, 19:15 
Не в сети

Зарегистрирован: 08 ноя 2009, 02:58
Сообщения: 4
Откуда: Питер
извиняюсь за наглость, но не могли бы вы исправить... я пока не увижу как делать, сообразить не смогу как надо :oops:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: результаты 2X АЦП на светодиодах
СообщениеДобавлено: 14 ноя 2009, 19:29 
Не в сети
Аватара пользователя

Зарегистрирован: 23 окт 2007, 22:03
Сообщения: 3037
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец
SSG вполне рабочий код написал двумя сообщениями выше.

Добавлено спустя 4 минуты 35 секунд:
Короче, сначала вот это:
Код:
ADCSRA.6=1; //Запускаем преобразование   
while(ADCSRA.4==0); //Ждёмс

Потом остальное...

_________________
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO