результаты 2X АЦП на светодиодах

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

результаты 2X АЦП на светодиодах

Сообщение freeze » 08 ноя 2009, 03:06

Имею отладочную плату с 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);
}
freeze
 
Сообщения: 4
Зарегистрирован: 08 ноя 2009, 02:58
Откуда: Питер

Re: результаты 2X АЦП на светодиодах

Сообщение EdGull » 08 ноя 2009, 09:21

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

Re: результаты 2X АЦП на светодиодах

Сообщение yak-40 » 08 ноя 2009, 11:36

Вообщем, в двух словах, алгоритм такой:
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
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: результаты 2X АЦП на светодиодах

Сообщение avr123.nm.ru » 08 ноя 2009, 12:18

Вот урок про вывод на светодиоды - http://avr123.nm.ru/z1.htm
Вот урок про АЦП - http://avr123.nm.ru/z11.htm

Симулировать советую в симуляторе с довольно реальными светодиодами и источниками напряжения - PROTEUS или VMLAB.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: результаты 2X АЦП на светодиодах

Сообщение Master » 08 ноя 2009, 14:39

Смущает меня вот эти строки
Код: Выделить всё
ADCdata = ADCW;
ADCdata2 = ADCW;

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

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

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

И вот здесь тоже фигня написана, строку ADMUX = 0b00000000; можно ваще не писать. Т. к. следующей строкой вы ADMUX присваиваете значение 1.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: результаты 2X АЦП на светодиодах

Сообщение freeze » 08 ноя 2009, 15:40

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

Re: результаты 2X АЦП на светодиодах

Сообщение ALHIMIK » 08 ноя 2009, 15:53

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

Re: результаты 2X АЦП на светодиодах

Сообщение Snable » 08 ноя 2009, 15:56

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

Re: результаты 2X АЦП на светодиодах

Сообщение yak-40 » 08 ноя 2009, 16:04

Вот с одним АЦП у меня всё получается, а как с 2мя быть, не соображу)

Тебе-ж говорят, поочереди :D
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: результаты 2X АЦП на светодиодах

Сообщение Master » 09 ноя 2009, 10:34

Он наверное не знает как правильно каналы переключать.

Код: Выделить всё
input_index=0;  //0...7 выбираем номер порта АЦП
ADMUX=(0 | (ADC_VREF_TYPE & 0xff) )+input_index;
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: результаты 2X АЦП на светодиодах

Сообщение SSG » 10 ноя 2009, 17:01

Ну тут раз на 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!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: результаты 2X АЦП на светодиодах

Сообщение freeze » 14 ноя 2009, 18:16

Вот, сделал вроде как надо, но. работает только один пор ацп С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);
}
freeze
 
Сообщения: 4
Зарегистрирован: 08 ноя 2009, 02:58
Откуда: Питер

Re: результаты 2X АЦП на светодиодах

Сообщение yak-40 » 14 ноя 2009, 18:53

Твоя ошибка в том, что ты сначала пытаешься отобразить результат, а потом производишь измерение.
Ты же сначала наливаешь стакан, а потом пьёшь. А не наоборот :D

Добавлено спустя 18 минут 53 секунды:
Да! и зачем ты это всё в прерывании делаешь? Есть такая необходимость?
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец

Re: результаты 2X АЦП на светодиодах

Сообщение freeze » 14 ноя 2009, 19:15

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

Re: результаты 2X АЦП на светодиодах

Сообщение yak-40 » 14 ноя 2009, 19:29

SSG вполне рабочий код написал двумя сообщениями выше.

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

Потом остальное...
- Этот человек - не человек! это робот!
- Как? уже делают?!
- Делают!!!
Аватара пользователя
yak-40
 
Сообщения: 3037
Зарегистрирован: 23 окт 2007, 22:03
Откуда: Москва
прог. языки: С
ФИО: Евгений Яковец


Вернуться в Микроконтроллеры

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

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