AlexFisher писал(а):Но лучше найти исходник.
Или новый написать
AlexFisher писал(а):Но лучше найти исходник.
Apparatchik писал(а):AlexFisher писал(а):Но лучше найти исходник.
Или новый написать. Что за устройство?
Schwarz писал(а):До исходника добраться трудно..
Устройство определяющее белизну бумаги.
Имеется полусферическая поверхность в ней фотодиод и лампа. Чем чернее бумага тем больше света "поглатится", чем белее тем меньше.
Нажимаем на кнопку 1. Посходит калибровка. Ставится некая измерительная мера с бумагой на доли секунды зажигается светодиод луч отражается и попадает на фотодиод. На дисплее вылезает Коэффициент диффузного отражения и белизна бумаги. Снимаем меру, кладем лист бумаги. Нажимаем на кнопку 2 -измерение. И на дисплее выводится значение КДО и белизны бумаги.
формула расчета W=(R-b)/a где W белизна измеряемая в у.е, R-Коэффициент диффузного отражения в %. b,a некие известные коэффициенты наклона.
Примерно как то так..
Насколько сложно написать такую программу самому?
Используется дисплей он же жк индикатор МТ-10Т7-7 http://www.radiokot.ru/lab/controller/12/
Смысл. Сигнал приходит с фотодиода т.е не кое значение R и рассчитывается значение W по формуле W=(R-b)/a и выводится на экран .
Код: Выделить всё
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);
}PINx cчитывает состояние вывода, независимо от назначения разряда порта - вход или выход. Посмотрите схему порта в датшите и все будет понятно.VannO))) писал(а):Но увы не могу понять почему оно работает
PINA = 0b1111xxxx; //кстати, как считаются первые 4 бита в таком случае? они же выходы...
Непонятно, почему это вас смущает. "Правда" - будет до отпускания кнопки, затем сменится на противоположный смысл.0b1011xxxx & 0b01000000 = 0!!!! т. е. если так, то на выходе всегда будет по сути if(!0) что всегда правда.
Например нам нужно мигать светодиодом 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;
чо нить делаем раз в секунду
}
void main(void)
{
PORTB=0x03;
DDRB=0x03;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x0B;
TCNT1L=0xDB;
TIMSK=0x04;
#asm("sei")
while (1)
{};
}Код: Выделить всё
Давайте заменим выводимое этими строками слово PWM
на слово WOW (типа вау! получилось!) - вот так:
putchar('W'); // вывод в USART символа W
putchar('O');
putchar('W');
4. После внесения изменений в исходный текст программы ее нужно cкомпили-
ровать. Компилятор должен превратить вашу программу в файл "прошивку" .hex который можно прошить (загрузить) в реальный МК или использовать в симуляторах.
5. Для выполнения компиляции нажмите кнопку "Make the project" Код: Выделить всё
7. Снова компилируем программу кнопкой "Make the project" - теперь получаем сообщение об отсутствии ошибок и о размере программы и о том сколько это %% от максимального размера программы для данного МК. Код: Выделить всё
Шаг 5. Симуляция после правки
1. Разверните окно симулятора VMLAB - выскочит сообщение о том что файл с текстом симулируемой программы изменен. Мы же его меняли в компиляторе. Закройте его кликнув "ОК".да, спасибо! до этого бегло просматривал, сейчас с стр. 19-20 flex_lcd.c прилепил - работает!Rusja2008 писал(а):To holland.9
В Codevision, файлы библиотек запрятаны в програме и ничего изменить не выйдет.
Сходите по ссилке viewtopic.php?f=20&t=584 где как раз обсуждается подключение дисплев, там явно найдутся исходники библиотек.
разбираюсь дальше!