ККЭП - Сайт студентов | ФОРУМ ПОИСК | РЕГИСТРАЦИЯ | ВХОД | ?
Модератор форума: Олег

Автор:
Тема: Вычислительная техника
DOC. 0
19.05.2008-06:02
Мля, кому -нить Ксенофондова практическую "Умный дом" задавала?
Zedd 1
19.05.2008-16:28
Да, тебе )
uos 2
19.05.2008-19:38
DOC.
мои соболезнования... :)
если будут конкретные вопросы про программирование - вопрошайте
кстати - не так страшен черт как его малюют
нам в Таганроге задали электронную таблицу сделать - курсовик... все вешались
в итоге оказалось что они хотели 4 на 4 и чтоб только сложение и вычитание...
некоторые сделали безразмерную + немного :) функций всяких - Гармаш обалдел :)
DOC. 3
20.05.2008-00:42
у мну такая дрянь: самы смак, который я не всекаю совсем, это мой, так скать, климат контроль. суть:(точность не важна, всё берётся условно)
стоит аналоговый термодатчик(последовательно соединённые терморезистор и постоянный) короче в зависимости от напряжения выхода датчика, у меня должна изменяться в соответствующую сторону скважность ШИМ сигнала( что бы регулировать мощность предполагаемого отопителя). + надож ещё ацп-шку настроить, и ввод с клавы+ дисплей на 2 разряда, и вводимая температура от 16 до 32 градусов. Надо задать соответствие уровня напряжения температуре.

Эта ф-ция самая непонятная, и обидно, что сам её придумал:(:(:( - сам ся в гроб загнал.


вот что-что, всё отлично, но 4 по Ксенофондовой может мне попортить всё. А програмирование в меня ну просто не вдолбить. Что угодно но не его. Вообще, ещё со школы. когда на бейске писали.

uos - невдупляю я, в чём и заключается проблема. Лучшеб я ей програматор спаял, это на раз два, а прогу писать - лучше повесится. а 5-то как-то надо получить:(
AngeL 4
20.05.2008-11:09
2, все как в жизни, ТЗ надо согласовывать )))
desh 5
20.05.2008-14:03
3. Я бы сделал так примерно так: Я пишу на С. Насколько я знаю процы у вас мега16. Я работаю с кварцем на частоту 11,059МГц и значения многих констант типа __SHIM_MAX__ заточены под эту частоту, так что тебе придется считать самому.

1. ШИМ инициализация

OCR0 = __SHIM_MAX__; // TMR0 ШИМ

// Прескаллер 8
TCCR0 |= ((1<<CS01) | (1<<WGM01) | (1<<WGM00) | (1<<COM01));
DDRB |= (1<<PB3); //порт ШИМ на выход!!!
TIMSK |= (1 << TOIE0); // разрешить прерывание от таймера 0

2. Шим прерывание

//------------------------------------------------------------------------------
// Прерывание от шима
//------------------------------------------------------------------------------
#pragma vector = TIMER0_OVF_vect
__interrupt void tmr0ovf (void)
{
if(bp_param.shim > __SHIM_MAX__){
bp_param.shim = __SHIM_MAX__;
}

if(bp_param.shim < __SHIM_MIN__){
bp_param.shim = __SHIM_MIN__;
}

OCR0 = bp_param.shim;
}
//------------------------------------------------------------------------------

Прерывание возникает по переполнению таймера. В нем происходит проверка на крайние значения и запись нового значения для ШИМ. В прерывании это сделано что бы небыло сильного дребезга.
desh 6
20.05.2008-14:11
3 Инициализация АЦП

// АЦП
ACSR |= (1 << ACD); // выкл. компаратора
ADMUX = 0x00; // внешняя опора
// ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS1) | (1<<ADPS0)); // Прескаллер на 8
ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1)); // Прескаллер на 64

4. Прерывание от АЦП

//------------------------------------------------------------------------------
// Обработка прерывания АЦП
// На измерение 32 разрядного буффера и при прескаллере 8
// требуется 1,4 мс
//------------------------------------------------------------------------------
#pragma vector = ADC_vect
__interrupt void ad_conv( void )
{
static unsigned int buff_uakb[_MAX_STACK_], buff_upit[_MAX_STACK_], buff_iakb[_MAX_STACK_];
static bool f_null; // переменная пустого измерени
static unsigned char chanel_adc, index_adc;
unsigned char index;
unsigned long uakb = 0, upit = 0, iakb = 0;

if (f_null){
f_null = false;
switch (chanel_adc){
case _Upit_:
buff_upit[index_adc] = ADC;
chanel_adc = _Uakb_ ;
break;
case _Uakb_ :
buff_uakb[index_adc] = ADC;
chanel_adc = _Iakb_;
break;
case _Iakb_:
buff_iakb[index_adc++] = ADC;
chanel_adc = _Upit_;
if (index_adc >= _MAX_STACK_){
index_adc=0;
for (index = 0; index < _MAX_STACK_; index++){
upit += buff_upit[index];
uakb += buff_uakb[index];
iakb += buff_iakb[index];
}
bp_param.u_pit = upit / _MAX_STACK_;
bp_param.u_akb = uakb / _MAX_STACK_;
bp_param.i_akb = iakb / _MAX_STACK_;
}
break;
default:
chanel_adc = 0;
index_adc = 0;
f_null = false;
}
ADMUX = chanel_adc;
}else{
f_null = true;
}
}
//------------------------------------------------------------------------------

В прерывании происходит последовательное измерение 3 каналов АЦП, после переключения канала происходит пустое измерение (так требует документация). Каждый канал имеет массив значений из допустим 32 ячеек (на 32 процу делить быстрее ) последовательно в массивы заносятся значения по каждому каналу и как только все массивы заполнены считается среднее значение.
DOC. 7
20.05.2008-14:34
desh, дружище, цены тебе нет!!!

тока я С не режу, асм хоть как-то можно помозговать, а вот С - это джихад. Она нам запретила на С писать, говорит только асемблер.

desh 8
20.05.2008-14:37
А соответствие уровня напряжения температуре делается тоже просто. Если исходить из того что шкала температуры линейная, а напряжение соответствующее температуре может быть не линейным(и будит если у тебя 2 резитора включены последовательно, хотя зачем, несовсем понятно), то тебе придется для каждого значения температуры хранить значение АЦП соответствующее этой температуре. Допустим у тебя минимальная 16 градусов а максимальная 32 и ты хочешь знать температуру с точностью 0,1 градус. тогда тебе надо хранить в памяти массив из 160 слов (320 байт, а у тебя на меге аж целый килобайт). Потом когда тебе надо узнать температуру в градусах (например раз в 100мс) ты в цикле сравниваешь значение АЦП с каждым из значений в массиве. Как только значение в массиве стало больеше останавливаешься и считаешь температуру

unsigned char i;

for(i = 0; Uadc > Umassiv[i]; i++);

Tgrad = 16 + i / 10;

Еще не забудь добавить проверку на краиние значения а то вдруг у тебя будит реальная температура больше 32. По остальным вопросам аська в профиле.
desh 9
20.05.2008-15:26
Эти исходники легко ложаться на асм. так как ядро АВР само по себе заточено под С, и я писал стараясь учитывать его архитектуру. другой момент что сложный кусок на Си всегда можно перегнать в АСМ с помощью компилятора, а потом в ручную с оптимезировать (тока как говорят гуру - жизнь слишком коротка что бы писать на асме)
DOC. 10
21.05.2008-17:04
если скомпилировать выше написанное, это скок получиться на асме?
desh 11
21.05.2008-19:33
не намного больше чем на чистом Асме(писал одну штуку на С++. откомпилировал в 1.5 кб, а мне надо было в 1.0 впихнуть. неделю оптимизировал вручную - выжал всего 200 байт. дальше просто терпения не хватило). и то за счет того что компилятор сам вставляет код инициализации стека, регистров, сам сохраняяет все перменные и регистры при входе и выходе из функций. Только надо компилятор "правильный" выбрать. Для АВР это IAR. Формирует самый компактный и соответственно быстрый код. Есть несколько уровней опримизации.
Советую почитать эту статью. И не просто почитать, а начать пользоваться
http://www.caxapa.ru/lib/CwithoutC.html
Мне сильно помогла когда я переходил с микроконтроллеров и Си на промышленные контроллеры и язык STL (очень похож на асм, но заточен под определенные задачи).
desh 12
21.05.2008-20:40
Тоже позновательная статья
DOC. 13
21.05.2008-22:50
как обрабатывается клава(если помните по методе Дуброва)?

там что, постоянный опрос состояния идёт? а потом? Прерывание? как это организуется
desh 14
21.05.2008-23:37
клаву можно организовать двумя способами которые я знаю.
1. которому учат
в основном цикле каждый раз проверяют кнопку на нажатое состояние. если она нажата тогда идет задержка на время подавления дребезга, потом повторная проверка и если кнопка все таки нажата тогда выполняется функция, или поднимается флаг в какой либо переменной, который обрабатывается позже. основное достоинство это простора. недостатки это непредсказуемое время реакции и пропуск коротких нажатий (если проц кроме клавы еще и обрабатывает какую то другую задачу), останока всех задач на время задержки (что самое плохое для встраиваемых систем)

метод 2. который применяют на практике.
В большинстве систем есть периодическое прерывание от таймера. например с периодом 1мс. Для каждой кнопки есть переменная размером в байт для счетчика и есть переменная которая хранит состояние кнопки - нажато или отпущено. эта переменная глобальная и доступна в основном цикле. каждую милимекунду в прерывании происходит опрос состояния кнопки. если кнопка нажата, по счетчик увеличиватся на еденицу, если отпущена - уменьшается. как только счетчик достигает ну например 20 (среднее вренмя на подавление дребезга) считаем что кнопка нажата. как только переменная достигает нуля - считаем что отпущена. в краиних состояниях меняем значение переменной (или флагов) на соответсвующие. в основном цикле просто проверяем значение переменной и если это еденица - выполняем нужное действие в основном цикле (не в прерывании). в общем у этого метода у меня есть несколько разных реализаций. для матричной клавы, и для применеия с операционками реального времени. простор для творчества большой.

пока писал вспонил третий. но это самый калечный из всех. на внешнее прерывание вешается кнопка. как только срабатывает прерывание - выполняется первый алгоритм. дополнительные недостатки - это то что тяжело организовать матричную клаву из за ограниченного числа внешних прерываний. а еще то что на время задержки кроме того что не обрабатывается основной цикл, так еще и запрещены остальные прерывания(затертые байты в UART, пропущенные переполнения таймеров. Сбои таймеров и шим, остановка динамической индикации и тд...)
DOC. 15
22.05.2008-07:35
на клаву с увязанным на неё дисплеем у меня прога есть.

Смотри, у меня однозначно введённое значение температуры будет двузначным, по нажатию одной кнопки в основном цикле записывается один разряд в память, потом ожидается второй, тоже записывается, а по нажатию кнопки ввод основной цикл продолжается? т.е. на момент ввода, или точнее пока я не нажму ввод, цикл останавливается на ожидание?
desh 16
22.05.2008-10:17
Надо смотреть как у тебя реализовано все остальное. да и вообще идея с остановкой плохая. если у тебя регулировка ШИМ от температуры будит в основном цикле, она остановится пока ты будишь вводить данные, но шим будит пахать с заданным значением, а если кто то случайно нажмет 1 кнопарь и удет когда шим на максимуме. Можно сделать след образом. В осовно цикле вызывать функцию в которой проверятоь состояние кнопок (а лутше просто флагов что бы дребезг был отсеян по методу 2 из поста 14). Проверил кнопку - нажата - записал в ПРОЕЖУТУЧНУЮ переменную первый разряд - продолжил цикл. Проверил кнопку - нажата - записал в ПРОЕЖУТУЧНУЮ переменную второй разряд - продолжил цикл, потом ждешь (не ждешь в теле функции а проверяешь состояние если не нажата вышел из функции)нажатия кнопки ввод. По вводу копируешь значение из промежуточной переменной в основную.
DOC. 17
22.05.2008-17:23
Эльбрусовна сказала что на клаву с диспеем у меня прога один в один с методы, там чуток подкорректировать и всё.

теперь на до на асме разобраться с регулировкой температыры ШИМ сигналом.

как я понимаю в цикле будет постоянное сравнение входящих (условных) данных и заведомо занесёнными 16-ю (от 16 до 32) значениями, и когда идентичность напряжений будет абсолютная, т.е. z=1, шим сигнал перестаёт изменяться. только вот как вшить изменение ШИМа?
desh 18
22.05.2008-18:17
1. Ты из значения АЦП вычисляешь абсолютную температуру табличным методом. Ты ее используешь для вывода на дисплей как текущую и для вычисления значения ШИМ

2. У тебя есть необходимая тебе температура которую надо получить и поддерживать

3. Чем меньше разница между абсолютной и установленной температуруй тем меньше скважность шим сигнала. При равных температурах на выходе шим сигнала нет (для простоты картины допустим что тепло не уходит).

Для того что бы получить значение ШИМ можно заиметь еще 1 таблицу где значение разницы необходимой температуры и абсолютной температуры это индекс а значение это значение ШИМ.

unsigned char shim[17]; // 17 значений если верхняя граница температуры тоже включена
unsigned char Tgrad; //абсолютной температуры
unsigned char Tust; //необходимое значение температуры, еще называют уставкой

signed char Tdelta; //Разница Может быть как + так и - на нам нужен только +, а - приравняем к 0;

Tdelta = Tust - Tgrad;

if(Tdelta < 0) Tdelta = 0;

OCR0 = shim[Tdelta];

Но мне эта идея не нравится. во первых если допустить что ты с выхода ШИМ напрямую (через ключ) будишь управлять нагревателем постоянного тока, то мощность на нагревателе будит пропорциональна скважности. во вторых таблицы, если ты захочешь их менять в ходе работы, надо хранить в ЕЕПРОМе(Хотя вот эту таблицу можно можно опрделить как константы), и загружать при старте в RAM.

Проще значение шим вычисляь по формуле на лету, так как зависимость пропорциональная.
DOC. 19
22.05.2008-23:39
Так ясное дело что скважность это основной принцип регулировки мощьности. Вообще сама идея собрать "умный дом" на контроллере это тупость. Во-первых дороже обойдётся чем на операционниках, во-вторых проще собрать на дискретных с операми в основе, в-третьих прибор в целом становится менее ремонтопригоден, в-четвёртых будет надёжнее на дискрете с операми. Всё что у меня должно быть зашито в контроллер, мы собирали ещё в 6 классе. как щас помню на СА3-ем операционнике. Так что это мозго%%%%%%во.

и как это у тебя в третьем пункте при равенстве значений шим сигнала нет. он всегда будет
desh 20
23.05.2008-14:12
19 он всегда будет - ты прочитай внимательно оговорку что написано в скобках. еще раз повторю что это написано для простоты картины. Если заморочися серьезней то у тебя в задаче пропроциональный пегулятор. Так называемый П-регулятор. Самый простой из всех. Для того что бы войти в равонвесие с окружающей средой используют более сложные регулияторы типа ПИ (пропорциональный интегральный) и ПИД (пропорциональный интегральный дифференциальный) регуляторы. А на счет тупости использования контроллеров - то это просто бред из за того что ты не видешь полной картины. Тока не надо ПОЖАЛУЙСТА криков по этому поводу. ОК :)
desh 21
23.05.2008-14:30
И еще сейчас выскаются программируемые АНАЛОГОВЫЕ микросхемы. Подумай об этом :)
DOC. 22
23.05.2008-15:09
не, ты непонял, я именно об этом задании. контроллер это чёткая веСЧ. я про умный дом. разве на аналоге не проще это всё выглядит и мои перечисленные пункты не верны? ну да ладно, не в этом дело.

Да щас много полезного выпускается, поэтому думаю если брать глобально то нельзя сказать что лучше а что хуже. есть рациональность использования в том или ином устройтве, это другое дело
desh 23
23.05.2008-18:57
Умный дом это такая штука о которой все говорят, но никто незнает как павильно его делать.В том числе и ты видешь задачу только со стороны регулировки температуры. Да конкретную задачу может и проще решить на аналоге. Тебе. Но если добавить регулировку температуры с клавы. Как ты сделаешь это на аналоге за 30 рублей? Мега 16 стоит 30 рублей .
DOC. 24
23.05.2008-23:18
30 + программатор+ знание языка+ навык програмирования+ обвязка. это нельзя упускать из виду.

закроем тему. тут спорить до потери сознания можно, один фиг ток никому ни чего не должен:)

будем думать как прогу писать
DOC. 25
11.06.2008-23:30
bla, всё пропало!!!! всё пропало!!!! што делать, что делать!!!!!!!!!!!!


ксенофондова сказала что я не прав со своей практической, что не так всё!!!! ААААААА!!!

Поможите кто-нить ацп-шку настроить на асме, или в алгоритме хотябы!!! у мну 4 датчика аналоговых, с РА0 по РА3. на первых 3-х надо просто, ждать так скать или 1 или 0, и всё, а вот 4-ый надо сравнить с ранее введёнными границами температур(хотя я говорил что зимой и летом границы будут от 16 до 32, она не верит), потом с введённым значением, но фишка что введённое значение с клавы надо как-то записать в один регистр, что бы было десятичное двухзначное значение, и отсюда отталкиваться. Хоть алгоритм кто-нить может подсказать, а то я чёт не вдупляю, практику по прогр.МП сдал на неделю раньше, а с практ. не могу разобраться
DOC. 26
12.06.2008-22:13
Вы смерти моей хотите, да?!!!!!!!!!!!! всё. почти умер.
Tolian91 27
14.06.2008-14:17
Всё на сессии или на каникулах или в отпуске
Tolian91 28
14.06.2008-14:18
Ты ЭВТ?
DOC. 29
14.06.2008-17:03
РАС
Tolian91 30
15.06.2008-16:31
Блин, ну не знаю, сорри
DOC. 31
15.06.2008-20:23
ну всё, кажись накрылся мой "отличный" семместр
DOC. 32
18.06.2008-17:14
ОКАК! истина в беде позналась! не захотел никто помочь! значит смерти моей хотите! Фихвам! сдал! 5!
AngeL 33
18.06.2008-21:26
молоцом!
Tolian91 34
19.06.2008-08:37
Неожиданно... Красавчик!!!
MegaDeath 35
25.10.2009-23:38
Может кто нить помочь с паскалем?
Хельг 36
26.10.2009-11:32
begin
printf("Hello World.");
end
uos 37
31.10.2009-03:20
Хельг... жесть!
это последняя степень заражения С++ :))))
Хельг 38
31.10.2009-07:35
а, шо, в паскале нет принтЭфа?
AquariuS 39
31.10.2009-11:32
если мне склероз не изменяет, там writeln
uos 40
31.10.2009-16:17
нууу такие же инфицированные :) сделали внешнюю библиотеку с любимыми функциями от билла гейтса :) и его любимого сишника,
а так вообще то не було :)
Хельг 41
1.11.2009-14:09
А при чем тут Билли?
uos 42
2.11.2009-17:42
ну я не фанат с++ - могу чтото путать...
Пользователь: Имя:

Пароль:
Забыли пароль?
Сообщение:
Вставить рисунок с внешнего сайта Вставить ссылку Прикрепить файл           Коды других смайликов
 

Страница создана за: 0,04 сек.