До исходника добраться трудно.. Устройство определяющее белизну бумаги. Имеется полусферическая поверхность в ней фотодиод и лампа. Чем чернее бумага тем больше света "поглатится", чем белее тем меньше. Нажимаем на кнопку 1. Посходит калибровка. Ставится некая измерительная мера с бумагой на доли секунды зажигается светодиод луч отражается и попадает на фотодиод. На дисплее вылезает Коэффициент диффузного отражения и белизна бумаги. Снимаем меру, кладем лист бумаги. Нажимаем на кнопку 2 -измерение. И на дисплее выводится значение КДО и белизны бумаги. формула расчета W=(R-b)/a где W белизна измеряемая в у.е, R-Коэффициент диффузного отражения в %. b,a некие известные коэффициенты наклона. Примерно как то так.. Насколько сложно написать такую программу самому?
До исходника добраться трудно.. Устройство определяющее белизну бумаги. Имеется полусферическая поверхность в ней фотодиод и лампа. Чем чернее бумага тем больше света "поглатится", чем белее тем меньше. Нажимаем на кнопку 1. Посходит калибровка. Ставится некая измерительная мера с бумагой на доли секунды зажигается светодиод луч отражается и попадает на фотодиод. На дисплее вылезает Коэффициент диффузного отражения и белизна бумаги. Снимаем меру, кладем лист бумаги. Нажимаем на кнопку 2 -измерение. И на дисплее выводится значение КДО и белизны бумаги. формула расчета W=(R-b)/a где W белизна измеряемая в у.е, R-Коэффициент диффузного отражения в %. b,a некие известные коэффициенты наклона. Примерно как то так.. Насколько сложно написать такую программу самому?
Прошу прощения за очередной метровый кусок кода, но ситуация действительно непонятная. Есть мега16, есть кнопочки на ногах А7...4. Разомкнуто- на ноге +5, замкнуто- 0. Приведенный ниже код для обработки кнопок выдрал из какого-то аппноута по авркам, в принципе код рабочий и прямо передо мной валяется макетка с мегой которая радостно и при этом адекватно выполняет функции с префиксом HL_ для работы с 4хразрядным семисегментником при нажатии на соответствующие кнопки. Но увы не могу понять почему оно работает вот, смотрите. кнопочки не нажаты: PINA = 0b1111xxxx; //кстати, как считаются первые 4 бита в таком случае? они же выходы... PINA = 0b1011xxxx; //нажимаем на кнопку А6 А теперь условие из обработчика: "делать, если !(PINA & 0b01000000) правда" 0b1011xxxx & 0b01000000 = 0!!!! т.е. если так то на выходе всегда будет по сути if(!0) что всегда правда. Если так, то мк должен был просто зависнуть на первом же while, ан нет! работает и абсолютно корректно. Мистика.
[cut]
Код:
DDRA = 0b00001111; //первый нибл порта А управляет индикатором, на втором висят кнопочки PORTA = 0b11110000; //второй нибл - hiZ ... while (1){ if(keyA6_flag){ //установлен ли флажок нажатия на кнопочку keyA6_flag = 0; //сбрасываем флажок нажатия HL_RES(HL_ALL); //действие while(!(PINA & 0b01000000)) {} //ждем пока кнопку не отпустят } else{ if(!(PINA & 0b01000000)){ //если кнопка нажата, то delay_ms(10); //ждем немного if(!(PINA & 0b01000000)) keyA6_flag = 1; //если всё еще нажата, устанавливаем флажок нажатия в 1 } //при следующем проходе инфинит лупа пройдём проферку if, выполнится действие, флажок сбросится и.т.д. } if(keyA4_flag){ fract_val ++; HL_IN_NUM(int_val, fract_val, 3); keyA4_flag = 0; while(!(PINA & 0b00010000)) {} } else{ if(!(PINA & 0b00010000)){ delay_ms(10); if(!(PINA & 0b00010000)) keyA4_flag = 1; } } if(keyA5_flag){ int_val ++; HL_IN_NUM(int_val, fract_val, 3); keyA5_flag = 0; while(!(PINA & 0b00100000)) {} } else{ if(!(PINA & 0b00100000)){ delay_ms(10); if(!(PINA & 0b00100000)) keyA5_flag = 1; } } delay_ms(50); }
[/cut]
Кстати, тут есть бб-код для прятания текста под катом? стандартный не сработал, а в списке ббкодов в настройках аналога не нашел...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Например нам нужно мигать светодиодом 1 раз в секунду. Тактовая частота нашего контроллера (частота кварца): 4 МГц. Его период: 1/4000000 = 250 нс. Максимальное значение таймера: 2^16 = 65535 250 нС * 65536 = 16,38 мс (маловато будет) А если делить частоту кварца на 64 то получим 16,38мс*64=1,048с - то что надо.
Итак, выяснилось, что нам подойдет коэффициент деления 64. Ну значит, смотрим, какой код соответствует этому коэффициенту по даташиту (см. таб. 10). Сигналу CK/64 соответствует код 011.
Пишем его в соответствующие биты TCCR1B. А остальные биты этого регистра нам не интересны. Итак: TCCR1B = 0b00000011 (TCCR1B=0x03)
Осталось только рассчитать число, которое мы загрузим в TCNT1H. Оно считается очень просто.
Мы уже знаем, что тактовая частота таймера в 64 раза меньше частоты кварца. Значит ее период - в 64 раза больше: 250 нс * 64 = 16 мкс.
Считаем количество тактовых импульсов, которое пройдет за это время: 1с /16 мкс = 62500 имп.
То есть, задержка в 1с равна 62500 такту. Теперь от 65535 отнимаем 62500 и получаем 3035.
Число 3035 нужно загрузить в регистр TCNT1. Единственное, что надо помнить: этот регистр - составной. То есть, он состоит из двух 8-битных регистров. Поэтому, сначала нужно преобразовать это число в шестнадцатеричную систему и загрузить старшие и младшие разряды в соответствующие регистры: TCNT1H и TCNT1L.
3035(10) = 0BDB(16). Итого имеем:
TCNT1H = 0x0B TCNT1L = 0xDB
Итог: мы загрузили в регистр TCNT1 число 3035, таймер начнет отсчет с этого числа и будет считать до 65535, как только он досчитает до 65535 он переполнится и начнет считать снова с числа 3035 и это время будет равно 1 секунде (или 62500 тактам).
Код:
#include <mega16.h>
interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1H=0x0B; TCNT1L=0xDB; чо нить делаем раз в секунду }
Если к проэкту подключить файл с множеством функций, то компилятор возмёт все или только используемые? Стоит ли удалять ненужные для уменьшения размера прошивки?
Поиск не помог. У меня некоторый затык на первой же странице обучалки http://www.123avr.com/
Код:
Давайте заменим выводимое этими строками слово PWM на слово WOW (типа вау! получилось!) - вот так:
putchar('W'); // вывод в USART символа W putchar('O'); putchar('W');
4. После внесения изменений в исходный текст программы ее нужно cкомпили- ровать. Компилятор должен превратить вашу программу в файл "прошивку" .hex который можно прошить (загрузить) в реальный МК или использовать в симуляторах.
5. Для выполнения компиляции нажмите кнопку "Make the project"
У меня более свежая версия CodeVision AVR, чем у автора. Кнопки с таким названием нет. Есть кнопка с таким точно рисонком и названием "Build All Project files". нажимаю
потом делаю пункт 6. Всё нормально.
Код:
7. Снова компилируем программу кнопкой "Make the project" - теперь получаем сообщение об отсутствии ошибок и о размере программы и о том сколько это %% от максимального размера программы для данного МК.
А вот дальше не происходит, как написано
Код:
Шаг 5. Симуляция после правки
1. Разверните окно симулятора VMLAB - выскочит сообщение о том что файл с текстом симулируемой программы изменен. Мы же его меняли в компиляторе. Закройте его кликнув "ОК".
В VMLAB ничего не выскакивает.
Там же на форуме несколько человек задали подобный вопрос. Ответа нет. Один решил проблему установкой старой версии CodeVision AVR. Но не очень хочется это делать. И часто старые версии программ не работают в Vista x64.
Вопервых начните с этой страницы и продолжайте дальше. И я бы вместо VMLAB использовал бы Proteus (я собственно так и делаю), для меня он понятнее и нагляднее. Это моё личное мнение, мож кому он и ненравится.
кто нибудь объясните мне почему функция sprintf() жрет так много стека?и как это оптимизировать? мне нужно переменную типа float конвертировать в строку с, хотя бы, 4 знаками после запятой. приходит в голову только один способ : объявить переменную integer, умножить float на 10000, присвоить переменной integer полученное после умножения на 10000 значение, далее в цикле последовательно вычитать из integer 10000,1000,100,10, считая при этом кол-во десятков тысяч, тысяч, сотен, десятков в переменной и записывать их в массив. после этого добавить точку в массив в то место где она была и вывести массив на индикатор. но это прокатывает только с неотрицательными числами типа X.YYYYY, т.е. с нулевой степенью. а если число до точки еще содержит знаки, например: XXXX.YYYYY? помогите советом. как Вы выводите float на индикатор?
P.S. тупо взять вместо переменной типа integer переменную типа long (или long long)... прокатит. Последний вопрос в силе: как выводить float на индикатор не загружая стек и более менее быстро?
подскажите как в CodeVision версий до 2,04 для LCD менять местами выводы МК? там можно менять только порт в целом, порядок битов недоступен к редактированию? и уж тем более часть выводов на один порт, а другую часть на другой порт... ведь не всегда есть возможность занять полностью весь порт чисто ЛСД... на нем ведь и нужные для других полезных целей ноги есть
может есть какието либры готовые?
зы: в новом CodeVision 2.05.0 (на оффсайте можно скачать фриверсию с ограничением по объему кода) в меню "конфигуре" закладка "С компилер" есть подзакладка "либ", а в ней "альфанумерикЛСД.." в которой можно менять и биты и порты... но она использует alcd.h и соответствующюю либру, которые не поддерживаются старыми компиляторами
To holland.9 В Codevision, файлы библиотек запрятаны в програме и ничего изменить не выйдет. Сходите по ссилке viewtopic.php?f=20&t=584 где как раз обсуждается подключение дисплев, там явно найдутся исходники библиотек.
_________________ Не умееш - не берись, но не взявшись не научишся.
To holland.9 В Codevision, файлы библиотек запрятаны в програме и ничего изменить не выйдет. Сходите по ссилке viewtopic.php?f=20&t=584 где как раз обсуждается подключение дисплев, там явно найдутся исходники библиотек.
да, спасибо! до этого бегло просматривал, сейчас с стр. 19-20 flex_lcd.c прилепил - работает! разбираюсь дальше!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения