ATmega8: проблема с АЦП и организацией передачи данных

Обсуждаем контроллеры компании Atmel.
Snake93
Родился
Сообщения: 13
Зарегистрирован: Вт ноя 06, 2012 00:18:35

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Snake93 »

Что-то ерунда какая-то.

Программа первого МК
Спойлер#define F_CPU 8000000UL
#include <mega8.h>
#include <delay.h>

void main(unsigned int u)
{
PORTB = 0xff;
DDRB = 0xff;


ADMUX = 0b00100000;
ADCSRA = 0b10001111;



// USART initialization
// Communication Parameters: 8 Data, No Parity, 1 Stop 8N1
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;

// USART Baud rate: 115200 для кварца 11,059 МГц
UBRRH=0x00;
UBRRL=0x05;
while(1)
{
ADCSRA |= (1 << ADSC);
while((ADCSRA&(1 << ADIF))== 0);
u=(ADCL|ADCH << 8);

delay_ms(5);
while(1)
{

UDR=ADCH;
delay_ms(5);
}
}
}
Отправляю 8 старших битов, так как USART не может передать все 10.

Но на приёмном МК получается сплошной бред.


Как я понял передавать нужно char символ.
Получается как-то перевести в чар , передать, а затем снова в двоичный код ???
Реклама
Snake93
Родился
Сообщения: 13
Зарегистрирован: Вт ноя 06, 2012 00:18:35

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Snake93 »

Всё исправил) Теперь осталось накидать схемку, спаять на макетке и дальше подгонять и отлаживать)
Реклама
Аватара пользователя
Санек86
Грызет канифоль
Сообщения: 258
Зарегистрирован: Ср сен 19, 2012 18:21:57

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Санек86 »

Snake93 писал(а): Отправляю 8 старших битов, так как USART не может передать все 10.
может тогда передать 2 раза по 5 бит? Или передавать 9 бит?..
Snake93
Родился
Сообщения: 13
Зарегистрирован: Вт ноя 06, 2012 00:18:35

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Snake93 »

Санек86 писал(а):
Snake93 писал(а): Отправляю 8 старших битов, так как USART не может передать все 10.
может тогда передать 2 раза по 5 бит? Или передавать 9 бит?..
Поскольку АЦП записывается в 8битный регистр ADCW=ADCL+ADCH
я записал 8 старших битов в ADCH , а два младших бита в ADCL
Передаю только ADCH . Точность высокая не нужна) Достаточно хорошо всё работает.

В данный момент всё работает без прерываний и последовательно.

Но возникла проблема вывода на индикаторы.
я с помощью цикла while(1) пытался осуществить динамическую индикацию, но кончается тем что МК начинает выдавать ошибки.
При увеличении задержки между переключением индикатором, показывает последовательно, но , всё же не динамическая)

Изображение

Вот и код:
Спойлер#define F_CPU 8000000UL
#include <mega8.h>
#include <delay.h>

unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};


void main(void)
{
PORTB = 0xff;
DDRB = 0xff;
PORTC=0xff;
DDRC=0xff;

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;

// USART Baud rate: 115200 для кварца 11,059 МГц
UBRRH=0x00;
UBRRL=0x05;
while(1)
{
int y,x,r,t,i,u;
int q,z;

q=UDR;
z=q*1.960784;




y=z/100;
x=(y%10);
y-=x;

r=z/10;
t=(r%10);
r-=t;

i=z;
u=(i%10);
i-=u;

{
PORTC.0 = 1;
PORTB = number[x];
delay_ms(50);
PORTC.0 = 0;
delay_ms(50);

PORTC.1 = 1;
PORTB = number[t];
delay_ms(50);
PORTC.1 = 0;
delay_ms(50);

PORTC.2 = 1;
PORTB = number;
delay_ms(50);
PORTC.2 = 0;
delay_ms(50);
}

}
}



Да, всё достаточно просто и нелепо. Но для начала нормально)

Конечно можно использовать семисегментные индикаторы с 5 входами (4 декодер на сегменты и 1 общий катод) , тогда можно просто задействовать 12 ножек ))) и всё будет одновременно.

Хм, может так и попробую
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
mark13121971
Открыл глаза
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение mark13121971 »

Тут весь вопрос синхронизации двух МК. Сначала надо определиться с протоколом передачи массива данных. Есть два варианта:
Передавать просто числа. Тогда нужно передачу жестко привязать к кол-ву передаваемых байт. Как только приемник принимает первый байт, запускается программный счетчик и начинается прием последующих байт с заранее определенным количеством. Как только счетчик дошел до значения макс. кол-ва байт он сбрасывается и отсчет начинается сначала. Но в этом варианте возможны и даже очень вероятны сбои и это очевидно.
Второй вариант - передавать по USART не просто числа, а ASCII коды, т.е. символы. Тогда можно задать стартовую последовательность пакета данных, например, символ S (т.е. передавать его ASCII код). И тогда приемник, встретив такой код в пакете данных поймет, что начинается передача пакета, начинает интерпретировать все следующие символы, как ASCII коды соответствующих чисел и принимает ровно столько байт сколько нужно (опять же необходим программный счетчик). Тогда все синхронизация сводится к передаче условия старт. Таким макаром (передачей ASCII кодов) можно организовать сложный протокол, как душе угодно, вариантов куча, вплоть до ответа приемника передатчику, типа ПРИНЯЛ, НЕ ПРИНЯЛ, с повторной передачей пакета, если не принял (здесь необходимо будет передавать контрольную сумму для всего пакет, как понятно). Это повысит надежность канала связи, что для медицинского прибора является определяющим фактором. Для преобразования числа в ASCII код можно использовать функцию itoa. Допустим ты прочитал из датчика число 32767 (максимальное положит. число для itoa). Тогда нужно заранее определить массив на 6 цифр, который будет передаваться через функцию itoa (шестой элемент массива отводится под символ /0 - конец строки, который itoa сама добавит в этот массив), а если предполагаютя и отрицательный числа, то создать массив на 7 элементов, первым символом пойдет знак "-"). Функция itoa заполнит твой массив ASCII кодами и поставит в конце /0 (т.е. массив будет выглядеть вот так: 83, 82, 87, 86, 87, 0 - итого шесть элементов,). Вот и передвай этот массив по USART. Тогда у тебя появится еще один элемент синхронизации - пустой символ /0 (код 0). Можно приемным МК еще и к нему привязаться. Понимаешь? Вообщем я же говорю здесь вариантов куча.
Реклама
Snake93
Родился
Сообщения: 13
Зарегистрирован: Вт ноя 06, 2012 00:18:35

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Snake93 »

В целом понятно) Но на данном этапе для меня это сложно осуществить.
Пока всё будет примитивно, просто и реально. Передача идёт по USART-у. И сигнал, поступая на приём МК2 сразу же выводит подсчитанное число на индикаторы.
Реклама
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение VanyaSV »

Индюкацию ты делаешь НЕПРАВИЛЬНО! У тебя много времени уходит на неё. Да и в целом, мне кажется программа структурирована неправильно. Ну, что называется каждый др*чит, как он хочит :)) . Мой тебе совет: Организуй прерывание с частотой этак 250 Гц чтобы марцание динамической индикации не было заметно и в прерывании каждый раз гаси предыдущий сегмент и зажигай последующий) В этом случае тебе и библиотека задержек не потребуется и программка по сути дела должна весить меньше)
Вот пример)
Вложения
Ind_Count.txt
(496 байт) 218 скачиваний
Последний раз редактировалось VanyaSV Ср дек 12, 2012 13:13:26, всего редактировалось 1 раз.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение ibiza11 »

неправильный пример. в примере переменная n будет скакать от значения 0 к значению 1 и обратно. подумайте почему, VanyaSV.
И эту кучу условий я бы сменил на конструкцию switch - case.
Ставим плюсы: )
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение VanyaSV »

ibiza11 писал(а):неправильный пример. в примере переменная n будет скакать от значения 0 к значению 1 и обратно. подумайте почему, VanyaSV.
я не прав в том, что объявляю переменную в обработке прерываний. Её надо сделать глобальной. Но скакать в пределах от 0 к 1 она не будет, т.к. она к нулю не преравнивается
ibiza11 писал(а):И эту кучу условий я бы сменил на конструкцию switch - case.
это не принципиально
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение ibiza11 »

VanyaSV писал(а):Её надо сделать глобальной.
опять неверно. зачем остальной программе эта переменная? :facepalm: в таких случаях ее объявляют статической.
VanyaSV писал(а):Но скакать в пределах от 0 к 1 она не будет, т.к. она к нулю не преравнивается
Контекст сбрасывается при каждом выходе из функции, если он не объявлен статическим. Можете проверить, если не верите.
Ставим плюсы: )
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение VanyaSV »

Верю. Но даже если она является глобальной - всё и так хорошо работать будет)
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение ibiza11 »

для каждой подпрограммы будете счетчики делать глобальными переменными - букв не хватит для названий. Да и читаемость кода ухудшается.
Это то же самое, что бездумно ставить volatile перед каждой переменной.
Ставим плюсы: )
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение VanyaSV »

Согласен) Но структура программы индикации именно такой должна быть
Snake93
Родился
Сообщения: 13
Зарегистрирован: Вт ноя 06, 2012 00:18:35

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Snake93 »

SIGNAL(SIG_OVERFLOW1) // К примеру использовать таймер-счётчик1
ох знал бы я как прерываниями и счётчиками пользоваться))) было бы всё проще.

на данный момент необходимо за 7 дней всё сделать.
Так что, завтра продолжу изготовление макетной платы.
А вечером или в понедельник планирую заняться кодом.
Пока главное напряжение , которое идёт на АЦП, оцифровать, передать и вывести на индикаторы. Что в принципе и получается, правда плохо работает индикация.
Ещё надо продумать реализацию термометра на терморезисторе, чтобы как раз-таки изменения напряжения снималось тем самым АЦП :)
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение elf »

Добрый вечер Котам!
Нужна помощь!!!! нужно сделать усреднение данных АЦП ,никак не могу справиться с задачей.

union adcu
{
unsigned char byte[2];
unsigned int word;
};
unsigned int adcMCP1(void)
{ int c=0; //переменная для усреднения результата
union adcu adc_data;

for(c=0;c<10;c++) ??????????????????????

PORTB.4=0; // выбираем ацп
while (PINB.6==0); //ждем окончания преобразования
{adc_data.byte[1]=spi(0); //читаем старший байт
adc_data.byte[0]=spi(0); //читаем младший байт
PORTB.4=1; //отключаем ацп
return (adc_data.word>>3)&0xFFF; }

}
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение VanyaSV »

Это сумашедший бред! Куча синтаксических ошибок. Там, где скобки нужны - их нет, а там, где они не нужны - они есть
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение elf »

VanyaSV писал(а):Это сумашедший бред! Куча синтаксических ошибок. Там, где скобки нужны - их нет, а там, где они не нужны - они есть
например Там, где скобки нужны - их нет, а там, где они не нужны - они есть, как-же тогда оно все работает?
Аватара пользователя
VanyaSV
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение VanyaSV »

elf писал(а):как-же тогда оно все работает?
Через жопу :))
Snake93
Родился
Сообщения: 13
Зарегистрирован: Вт ноя 06, 2012 00:18:35

Re: ATmega8: проблема с АЦП и организацией передачи данных

Сообщение Snake93 »

Всех с наступающим!

Всем огромное спасибо за важные советы)

Курсовая работа сдана на отлично, схема спаяна. На данном этапе всё)
После праздников - доработка и доведение до ума.
Но это в Новом, 2013 году :)
Всем счастья и радости!
Ответить

Вернуться в «AVR»