Перейти к содержанию

Специализированный регистратор


Рекомендуемые сообщения

И вот, свершилось. Наконец, меня напрягли, дав на выходные обдумать, каким же боком подступить к реализации проекта. И ТЗ в общих чертах.

И так, во что же эволюционирует проект счетчика никому не понятного назначения? В некий загадочный специализированный регистратор.

Нужно получить схему и программную часть устройства на микроконтроллере (МК выбрать самому). Дисплей – жк. Теперь на нем должны отображаться не только количество, но и предварительно прошитое в МК наименование считаемого товара. Соответственно, таких товаров должно быть несколько. Для каждого своя ячейка счета количества до 254.

И возможность последовательно проклатцывать все товары, и смотреть, сколько чего насчитано.

Соответственно, возможность счета в плюс и в минус.

Требований, кроме энергопотребления, пока нет. Хотя, препод наивно предполагает, что если работа у меня пойдет легко и приятно, то я успею продумать подключение сего агрегата по COM-порту и накатать на делфе прогу для подключения и сброса насчитанного в комп. Но, для меня такое – это уже область фантастики.

Пока что, мне в голову приходит идея взять алфавитно-цифровой ЖК на основе МК. Программная часть сразу полегчает. В общем, надо разбираться. А опыта то и нет…

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 53
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Если я правильно понял, устройство должно считывать штрих-код и "расшифровывать" его?

Насколько я знаю, подобные устройства - это терминалы мейнфрейма с БД.

Ссылка на комментарий
Поделиться на другие сайты

Нет. Просто две кнопки. На одну жмешь - плюсует +1 в выбраную ячейку, жмешь вторую: -1, соответственно.

Не знаю, кому оно надо. Но, видимо, надо. Ибо, заказ пришел.

Ссылка на комментарий
Поделиться на другие сайты

Howl Dgerone, А вот тут уже все достаточно однозначно. Контроллер ИМХО ATMEGA16 (возможно ATMEGA8, ATMEGA32, в зависимости от требуемого обьема флеш-памяти, они взаимозаменяемы) Ценники у них нынче вполне приемлимые. Для ваших задач там есть все что необходимо, и даже сверх того.

Вы соверешенно правы, в том плане, что стоит выбрать алфавитно-цифровой ЖК, со встроенным контроллером. Ибо при разных наименованиях товара, и большом количестве ячеек счета, одними только 7-сегментными не обойдешся (либо эргономика будет на уровне, приснопамятного АОН-а на Z80 :mrgreen: )

Потому выбираем ЖКД, в соответствии с требуемым интерфейсом (интерфейс, в общих чертах продумать зарание), ну и взять немного "на вырост".

Начиная от простеньких символьных, (что нибудь вроде WH1202 - 2 строки по 12 симаволов 5х8 точек), и заканчивая графическими вроде WG12864 (64х128 точек, одна из наиболее широко распространенных, в наших краях моделей) больше - вам наврядли понадобятся для такой задачи. А вообще их много :

http://www.promelec.ru/catalog_info/57/150/626/668/

http://www.promelec.ru/catalog/409/454/472/2/

Лучше берите именно Winstar, а не аналоги, потому как бывают обломы, с потреблением подсветки (например наш, производства МЭЛТ - такойже как и Winstar, только подсветка жрет раз в 10 больше, около 500ма), и термокомпенсацией напряжения контрастности (хотя последнее для вас может быть и не критичным) .

Порограммируются эти дисплеи достаточно просто, единственная фишка: не пытайтесь понять, как програмировать по даташиту на сам дисплей, а сразу скачивайте даташит на примененную там микросхему контроллера, и разбирайтесь уже по нему.

Кстати, если у вас критично энергопотребление, выбирайте ЖКД, с торцевой (edge) LED подсветкой а не с матричной (array), они требуют гораздо меньше, и не забудьте предусмотреть программно управляемый ключик (полевой транзистор), на отключение подсветки (как им управлять это уже отдельный разговор), и токоограничивающий резистор (в ЖКД, стоят "голые" светодиоды, подключением к источнику напряжения вы их пожжете).

С текстовыми ЖКД, надо обращать внимание, чтобы они были русифицированы (частенько встречаются, без русского знакогенератора), если это надо. С графическими тут проще, хотя придется писать программный знакогенератор (хотя ничего особо сложного тут нету).

Вообще ЖКД, тут будет ценоопределяющим компонентом. Например упомянутый WG12864a, в наших краях стоит около 500р, почему и не стоит особо заморачиваться с выбором самого дешевого контроллера (2 доллара за ATMEGA16, тут уже особой роли не сиграют).

Ну собственно говоря, и все :wink: . Ничего особенного более в этой схеме нету. Не забываем прилепить к контроллеру должное количество кнопочек, если хотим COM-порт, то ADM202, если не хватит внутреннх 512 байт энергонезависимой памяти, для хранения переменных (ваших счетчиков и наименований товара, (если их нельзя жестко прошить в программную память) ), то добавляем внешнюю флеш вида 24C512 или похожую, другого обьема.

В качестве стабилизатра питания, особенно для подсветки, упоминавшаяся в теме про счетчик st1s10 - рулит. Причем имеет смысл, если у вас нет опыта наладки таких вещей, сделать маленькую платочку (субмодуль), с этой микрухой, ее дросселем, и конденсаторами обвязки, с 3 выводами (вход, земля и выход 5в)

Ссылка на комментарий
Поделиться на другие сайты

Нет. Просто две кнопки. На одну жмешь - плюсует +1 в выбраную ячейку, жмешь вторую: -1, соответственно.

Ну еще как минимум 2 кнопки, для выбора ячейки. Вот тут то и начинается самое "интересное": изобретение "дружественного к пользователю интерфейса" :twisted:

Ссылка на комментарий
Поделиться на другие сайты

Давно пора такой теме появиться в нашей лаборатории. ^_^

Порограммируются эти дисплеи достаточно просто, единственная фишка: не пытайтесь понять, как програмировать по даташиту на сам дисплей, а сразу скачивайте даташит на примененную там микросхему контроллера, и разбирайтесь уже по нему.

Не факт. Давно работаю со знакосинтезирующими ЖК, обычно информации в даташите более чем достаточно, более того, там именно выжимка - система команд, процедура инициализации, хотя вполне можно поступить как вы советуете. Но обычно вариантов мало, и подавляющее число экранов создано на основе контроллера HD44780 или совместимого, при этом название даже может быть иным, например, KS006U.

Так что не заморачиваясь, надо брать обычный с HD44780 (если знакосинтезирующий, а не графический – почти наверняка с этим или совместимым контроллером, уточните при необходимости), смотрите в сети готовые коды управления, дабы не изобретать велосипед. Две строчки по 16 позиций вполне достаточно для вашей задачи.

Ссылка на комментарий
Поделиться на другие сайты

Порограммируются эти дисплеи достаточно просто, единственная фишка: не пытайтесь понять, как програмировать по даташиту на сам дисплей, а сразу скачивайте даташит на примененную там микросхему контроллера, и разбирайтесь уже по нему.

Согласен, часто неполностью или неправильно описана, например, последовательность инициализации дисплея... Но с серьезными производителями проблем быть не должно и даташиты у них на уровне.

Ссылка на комментарий
Поделиться на другие сайты

Короче, пусть Howl Dgerone, примет к сведению, что стоит почитать даташит на контроллер, окромя даташита на дисплей, и его следует считать первоисточником, в случае разночтений. Такая формулировка всех устроит ? :mrgreen:

Еще раз обращаю внимание на ST1S10, как альтернативу "кренкам", для минимизации потребления. См мой пост, в теме про счетчик:

viewtopic.php?t=777&p=50581#p50581

Кстати на монтажке, там сверху проматривается, как раз таки ATMEGA16

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Убиццо ведром.

Проблемой стала работа с LCD. Переколбасил несколько эмуляторов. Писать инициализацию на ассемблере - смертоубийство. На С, вроде компилируется в code vision. Сохраняет ASM файл, но AVR Simulator IDE его уже не жует. Выдает ошибку, и слетает.

При чем, ошибка Run-time error '6': Overflow, по моему, не имеет отношения к коду.

Шас печатаю мануал на VMLAB. Может, там че заработает.

Это что касается проблем.

Думал, долго буду мучить работу с EEPROM. Но, код на ассемблер написал довольно быстро, даже с учетом проверки контрольной суммы при первичном включении. Правда, алгоритм корявый. Но, чего уж там. Нам сказали, что на этих работах достаточно собрать три подписи, а защищать не надо будет. Так что, надо побыстрее закончить и готовится к бакалаврату. А остался месяц. А еще и все сдать надо... Ужc. ::shocked

Отвлекся.

Начал работу пока что с ATMEGA 8. Думаю, хватит выше башни. ЖК будет 16х2, чтоб уж с избыткам.

На аппаратную часть наметки есть, вроде. Вроде, просто. Но, наверняка, не без подводных камней.

Ссылка на комментарий
Поделиться на другие сайты

Howl Dgerone,

Сохраняет ASM файл, но AVR Simulator IDE его уже не жует. Выдает ошибку, и слетает.

При чем, ошибка Run-time error '6': Overflow, по моему, не имеет отношения к коду.

Я тут конечно не великий специалист :? , дистанционно так помочь не могу. Во первых: Если вы хотите, чтобы вам кто-то помог советом - напишите поподробнее, что вы делали, и какие программные продукты пользовали (вплоть до версий).

Во всторых: единственное, что мне приходит в голову: будьте поаккуратнее с code vision, сам я с ним не работал (пользовал просто компилятор IAR C++ for AVR, потом прошивал PonyProg), но люди которые пользовались - говорили, что как и всякие "наглядные" поделки "для ленивых" - имеет тенденцию порождать монстроидальные кодовые конструкции, а контроллер - это вам не PC :evil: , там оперативки всего то 512 байтов. Есть подозрение что у вас чего-нибудь, куда-нибудь не поместилось (например стек разросся, выше отведенного места), и словечко "Overflow" - косвенно на это указывает. Возможно, надо просто настроить какие нибудь установки модели памяти (например начало стека подвинуть). А вообще тут нет великого смысла, использовать "визуальные" средства программирования, это не винда однако :wink:

Начал работу пока что с ATMEGA 8. Думаю, хватит выше башни.
Скорее всего. Только прошел слух, что ее вроде как собираются снимать с производства, ввиду одинаковой цены с ATMEGA 16, но они взаимозаменяемы ( с точностью до цоколевки), так что в случае чего - перейдете на другую, без проблемм.

Кстати вы вообщето саму железку собрали ? или пока все только на эмуляторах ?

Ссылка на комментарий
Поделиться на другие сайты

Если б собрал, указал бы , какой там LCD стоит. А так, пока эмулячу. То, если кафедра спонсирует, тогда и макет заделать можно. А то, сейчас с деньгами голяк и улучшений непредвидется. А кушать надо.

Советов с выкладыванием кодов попрошу, если совсем зайду в тупик. А пока еще, живем. Сегодня методу в библиотеке возьму, присмотрел продукцию с дружественной кафедры.

Ссылка на комментарий
Поделиться на другие сайты

Так, продолжаю свой дайр. ::bouncy

Сегодня сидел, тестил разные программы на разных эмуляторах.

Пытался инициализировать LCD на AVR Simulator IDE.

Алгоритмы инициализации, найденые в сети, практически не отличаются.

МК Atmega8

LCD некий виртуальный, коий на эмуляторе не указан. 16 символов 2 строки подключение по 8 бит шине.

Порт D - 8-я шина

Порт С.0 - импульс (Е)

Порт В.0 - RS

Порт В.1- Rw

Частота 4 мгц

Ждем 20 мс (после включения питания, рекомендовано)

11111111 УСТАНОВИЛИ ПОРТ D

000 УСТАНОВИЛИ ПОРТЫ С и В

00110000 УСТАНОВИЛИ ПОРТ D

ИМПУЛЬС E (1 мс)

;

;КОМАНДА УПРАВЛЕНИЯ ВКЛЮЧЕНИЕМ/ВЫКЛЮЧЕНИЕМ ДИСПЛЕЯ

00001100 УСТАНОВИЛИ ПОРТ D

ИМПУЛЬС E (1 мс)

;

;КОМАНДА АВТОИНКРЕМЕНТА

00000110 УСТАНОВИЛИ ПОРТ D

ИМПУЛЬС E (1 мс)

После этого, LCD должен быть гтов к дальнейшей работе.

Реализовал такой алгоритм на ассемблере. Проверил пошагово на светодиодах, сигналы подает правильно. А вот LCD по первому же импульсу выдает ошибку.

Программа простенькая, из разряда быдло-кодинг.

ldi r18,$FF;

out $17,r18; Програмируем порт b на вывод

out $14,r18; Програмируем порт C на вывод

out $11,r18; Програмируем порт D на вывод

ldi r19,$00

out $12,r19; Обнуляем порты d

out $15,r19; Обнуляем порт c

out $18,r19; Обнуляем порт b

ldi r19,$FF;

out $12,r19; ставим 11111111 на d

ldi r19,$00;

out $18,r19; Обнуляем порт b

out $15,r19; и C

ldi r19,$30;

out $12,r19; 00110000 на D

;Импульс

ldi r19,$01;

out $15,r19; устанавливаем 1 на C

nop

nop

nop

nop ; по таймеру эмулятора, проходит чуть больше 1 мс (такую задержку делают в одной из программ по иницаализации на «С»)

ldi r19,$00;

out $15,r19; убираем сигнал.

; в этот момент LCD выдает ошибку. Пробовал несколько команд по шине порта D. По ниспадающему фронтудает ошибку.

Дальше программу приводить не буду. Ибо,там толькоменяются комеанды, а результат тот же. ::hot

Поставил Proteus. Но, там режим реального времени. Фрагменты программ, расчитаных на пошаговость, там не погоняешь. Но, програмка меня обнадежила.

Варианты инициализации, найденые в сети:

На С

http://www.robotsspace.ucoz.ru/publ/9-1-0-15

И на assembler под X51

http://groversuper.ucoz.ru/Stati/LCD/manual1.pdf

Фу. Запарился на сегодня. В переди тяжелая неделя. Пойду отдыхать. ::hot

Ссылка на комментарий
Поделиться на другие сайты

Howl Dgerone,

1) На этом этапе, пора кончать страдать фигней с эмуляторами (кои своих глюков имеют немало) и делать макет !!!

Самое трудное тут будет научится формировать бинарник с СИ-исходника и прошивать контроллер т.е. написать "hello world", что в варианте микроконтроллеров выглядит как "помигать светодиодом" :mrgreen: (вариант: подсветкой ЖК, если нет отдельного светодиода)

:!: аккуратней с fuse-битами задающими режим работы тактового генератора, если программируешь, через SPI, можно ввести контроллер в "мертвое" состояние, что у него встанет тактовый генератор, и перпрошить будет невозможно :!: лечится либо программированием через JTAG, либо подключением того варианта обвязки (вплоть до внешнего генератора), на котором заработает тактирование контроллера, и можно будет прошить.

2) Когда "победите" контроллер - принимайтесь за ЖК. Тут советую не увлекаться скачиванием готовых решений с Сети :evil: , а разобраться как работает ЖК. Поверьте: ничего сложного тут нету, несколько регистров и текстовая "видеопамять". В даташите все описано. Это не столь навороченная вещь, чтобы разбираться с чужим кодом, который очень аппаратно-зависим (больше времени потратите). Последовательно пишете сперва процедуры записи/чтения команды и данных. Потом, через них - внутренних регистров ЖК. Потом, через них - функцию "printf". Потом наслаждаетесь. :mrgreen:

Вот как это выглядело у меня: :roll:

#include

#include

//****************************************************************************

#define CLV_STR_LCD 2

#define CLV_CHR_LCD 20

#define STR_BUF_SZ 50

//****************************************************************************

unsigned int cur_char, cur_str; //текущий символ, текущая строка

unsigned char portvalue9;

unsigned char lcdmode;

//****************************************************************************

unsigned char rd_lcd_dat(void)

{

unsigned char lcd_byte;

portvalue9|=0x60; //RS=1 RD=1

portvalue9&=0x7F; outbyte_cs0(9,portvalue9); //CS=0

outbyte_cs0(9,portvalue9|0x80); //CS=1

lcd_byte=inbyte_cs0(8); //считываем данные

outbyte_cs0(9,portvalue9&0x7F); //CS=0

return(lcd_byte);

}

//****************************************************************************

void wait_lcd(void)

{

unsigned int i;

portvalue9|=0x60; //RD=1

portvalue9&=0x5F; outbyte_cs0(9,portvalue9); //CS=0, RS=0

for(i=0;i<65000u;i++)

{

outbyte_cs0(9,portvalue9|0x80); //CS=1

if((inbyte_cs0(8)&0x80)==0) return; //Нормальное завершение

outbyte_cs0(9,portvalue9&0x7F); //CS=0

}

play(4); return; //завершение с ОШИБКОЙ !!!

}

//****************************************************************************

void wr_lcd_dat(unsigned char byte) //запись байта данных в LCD

{

outbyte_cs0(8,byte); //Выставляем данные

portvalue9|=0x20; //RS=1

portvalue9&=0x3F; outbyte_cs0(9,portvalue9); //RD=0, CS=0

outbyte_cs0(9,portvalue9|0x80); outbyte_cs0(9,portvalue9&0x7F); //CS=0,1,0

}

//****************************************************************************

void wr_lcd_com(unsigned char byte) //запись байта команды в LCD

{

outbyte_cs0(8,byte); //Выставляем данные

portvalue9&=0x1F; outbyte_cs0(9,portvalue9); //RD=0, RS=0, CS=0

outbyte_cs0(9,portvalue9|0x80); outbyte_cs0(9,portvalue9&0x7F); //CS=0,1,0

}

//****************************************************************************

void clear_lcd(void) // Очистка экрана, курсор в 0,0

{cur_char=0; cur_str=0; wait_lcd(); wr_lcd_com(0x01);}

//****************************************************************************

void init_lcd(void)

{

portvalue9=0; outbyte_cs0(9,portvalue9); //все отключено

wait(20);

wr_lcd_com(0x30); wait(10); // / Сброс дисплея

wr_lcd_com(0x30); wait(120); // { Сброс дисплея }

wr_lcd_com(0x30); wait(10); // Сброс дисплея /

wr_lcd_com(0x3C); wait(2); // 2 строки, 8-ми битный обмен, фонт 5х10

wr_lcd_com(0x08); wait(2); // display OFF

clear_lcd(); // Очистка экрана, курсор в 0,0

wait_lcd(); wr_lcd_com(0x06); // приращение адреса при печати

lcdmode=0x0C; // дисплей-ON, курсор-OFF, мерцание -OFF

wait_lcd(); wr_lcd_com(lcdmode);

}

//****************************************************************************

inline void lcd_disp_on(void) //включить дисплей

{lcdmode|=0x4; wait_lcd(); wr_lcd_com(lcdmode);}

inline void lcd_disp_off(void) //выключить дисплей

{lcdmode&=0xb; wait_lcd(); wr_lcd_com(lcdmode);}

inline void lcd_cur_on(void) //включить курсор

{lcdmode|=0x2; wait_lcd(); wr_lcd_com(lcdmode);}

inline void lcd_cur_off(void) //выключить курсор

{lcdmode&=0xd; wait_lcd(); wr_lcd_com(lcdmode);}

inline void lcd_blink_on(void) //включить мерцание курсора

{lcdmode|=0x1; wait_lcd(); wr_lcd_com(lcdmode);}

inline void lcd_blink_off(void) //выключить мерцание курсора

{lcdmode&=0xe; wait_lcd(); wr_lcd_com(lcdmode);}

//****************************************************************************

inline void lcd_set_cur(unsigned int lcd_char=255, unsigned int lcd_str=255) //Установка курсора в текущий символ текущей строки

{

if(lcd_char==255) lcd_char=cur_char;

if(lcd_str ==255) lcd_str =cur_str;

cur_str=lcd_str; cur_char=lcd_char;

wait_lcd(); wr_lcd_com(0x80|(0x40*cur_str+cur_char));

}

//****************************************************************************

void lcd_putch(char ch)

{

if(cur_char>=CLV_CHR_LCD) //автоперевод строки

lcd_set_cur(0,(cur_str+1)%CLV_STR_LCD);

switch(ch)

{

case 'n': cur_str=(cur_str+1)%CLV_STR_LCD; //перевод строки

case 'r': lcd_set_cur(0); break; //возврат каретки

default: wait_lcd(); wr_lcd_dat(ch); cur_char++; break;

}

}

//****************************************************************************

void lcd_puts(char *str)

{int i; for(i=0;str!=0;i++) lcd_putch(str);}

//****************************************************************************

void lcd_printf(char *fstring, ...)

{

char strbuf[sTR_BUF_SZ], addchar; //буфер для текстовых значений переменных, и символ которым дополняем до заданного числа разрядов (' ' или '0')

unsigned int clvdigit, strbuflen;

int i=0, j;

int longflag, uprflag; //флаги

va_list argptr; //Указатель для доступа к списку аргументов

va_start(argptr, fstring); //установка argptr на первый, после фиксированного (fstring), аргумент

for(i=0;fstring!=0;i++)

{

if(fstring=='%')

{

i++; //переводим на следующий после '%'

longflag=0; uprflag=0; addchar=' '; clvdigit=0; //сбрасываем все флаги

strbuf[0]=0; //чтобы в буфере ничего не было

replay:

switch(fstring) //анализируем 1-й символ после '%'

{

case '0': addchar='0'; case '1': case '2': case '3': case '4': case '5':

case '6': case '7': case '8': case '9': //считываем кол-во разрядов

for(;(fstring>='0')&&(fstring<='9')&&(fstring!=0);i++)

clvdigit=clvdigit*10+(fstring-'0');

clvdigit%=STR_BUF_SZ; goto replay;

case 'l': case 'L': longflag=1; i++; goto replay;

case '%': lcd_putch('%'); break;

case 'S': uprflag=1; case 's': //строка

strcpy(strbuf,va_arg(argptr, char*));

break;

case 'C': uprflag=1; case 'c': //символ

strbuf[0]=va_arg(argptr, char); strbuf[1]=0;

break;

case 'D': case 'd': //Знаковое десятичное

if(longflag!=0) ltoa(va_arg(argptr,long),strbuf,10);

else itoa(va_arg(argptr,int),strbuf,10);

break;

case 'U': case 'u': //Беззнаковое десятичное

if(longflag!=0) ultoa(va_arg(argptr, unsigned long),strbuf,10);

else ultoa((unsigned long)(va_arg(argptr, unsigned int)),strbuf,10);

break;

case 'B': case 'b': //Беззнаковое двоичное

if(longflag!=0) ultoa(va_arg(argptr, unsigned long),strbuf,2);

else ultoa((unsigned long)(va_arg(argptr, unsigned int)),strbuf,2);

break;

case 'Q': case 'q': //Беззнаковое четверичное

if(longflag!=0) ultoa(va_arg(argptr, unsigned long),strbuf,4);

else ultoa((unsigned long)(va_arg(argptr, unsigned int)),strbuf,4);

break;

case 'O': case 'o': //Беззнаковое восьмиричное

if(longflag!=0) ultoa(va_arg(argptr, unsigned long),strbuf,8);

else ultoa((unsigned long)(va_arg(argptr, unsigned int)),strbuf,8);

break;

case 'X': uprflag=1; case 'x': //Беззнаковое шестнадцатиричное

if(longflag!=0) ultoa(va_arg(argptr, unsigned long),strbuf,16);

else ultoa((unsigned long)(va_arg(argptr, unsigned int)),strbuf,16);

break;

case 'R': case 'r': //Заполнение до конца строки, символом следующим за %R

if(fstring[i+1]!=0) {addchar=fstring[i+1]; i++;} //не конец fstring

for(;cur_char<(CLV_CHR_LCD-1);) lcd_putch(addchar);

cur_char=0; lcd_putch(addchar); lcd_putch('r');

default: break;

}

if(uprflag!=0) strupr(strbuf); //если надо переводим строку в верхний регистр

strbuflen=strlen(strbuf);

if((clvdigit!=0)&&(clvdigit>strbuflen)) //если надо дополняем строку '0' или ' '

{

for(j=clvdigit;j>=(clvdigit-strbuflen);j--) strbuf[j]=strbuf[j-(clvdigit-strbuflen)]; //Сдвогаем строку на (clvdigit-strbuflen) символов в конец

for(;j>=0;j--) strbuf[j]=addchar; // дополняем начало символами 'addchar'

}

lcd_puts(strbuf); //печатаем строку на LCD

}

else lcd_putch(fstring);

}

va_end(argptr);

return;

}

//****************************************************************************

inline void set_led(unsigned char ledvalue)

{portvalue9=(portvalue9&0xF0)|ledvalue; outbyte_cs0(9, portvalue9);}

//****************************************************************************

Помню, что накорябал, примерно за рабочий день.

исходняк компилировался посредством Borland C++ 3.11, для процессора 80с188XL, ЖК (DM2021... DM2023 , ИС контроллера HD44780 ) был подключен по приведенной во вложении схеме (регистры защелки - это аналог GPIO у современных контроллеров :lol: и номера сигналов 'CS' на схеме соответствуют номерам портов у процедуры "outbyte_cs0", например outbyte_cs0(9, 0xFF); - вывод FFh в RG9 (D6) )

Еще могу посоветовать подключить ЖК, к LPT-порту компутера, и потренироваться таким образом (LPT, в режиме SPP можно использовать просто как 3 программируемых порта, с выведенными наружу битами), только работать надо под WIN98, или под DOS :!: NT-системы не позволяют приложениям напрямую писать в порты, а всякие "открывалки портов" - большой геморой однако.

Вобщем паяльник в руки, и вперед к новым совершениям :mrgreen:

post-362-1296114973,1_thumb.gif

Ссылка на комментарий
Поделиться на другие сайты

Ненене. Это все дорого. Это не для бедного меня.

4ddbb883ffe2aa03dd1db2920f0697d4.jpg

Так. Осталось доработать немного интерфейс, и нормально сделать электрическую принципиальную.

(Это минимум. Дальше, наверно, можно делать тросировку, и хоть вести до полного комплекта КД. Т.о. можно "удивить богов". Но, у меня никогда неполучается. Ибо, всегда, какими бы ударными темпами я к идеалу не стремлюсь, довести нормально до конца не получается. И сдаю я не даделаное (в моем понимании), и не вовремя (в понимании преподов).

А еше я видел работу сокурсника (похожая тема), у которого по микропроцессорам 100 балов, и понял, что меня где-то *****ли. Я точно знаю, что по МК один из худших, а значит, ему просто выпала адская халява прямо из рук самого неприклонного в плане халтур препода. ::confused

За то, радует, чтоя прохавался в языке С. До этого я ничего сложнее заполнения двумерного массива в цикле не писал. А тут такой алгоритм, что и не вычертишь, да еще к аппаратной части. Можно немного погордиться, если нормально все оформлю.

post-609-1296114973,74_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Howl Dgerone,

Ненене. Это все дорого. Это не для бедного меня.

Так изготовление "в железе" чтоли вообще не планируется ? Тогда это все так, баловство...

можно делать тросировку
Еще раз повторяю, "трАссировка", от слова "трасса" а не от слова "трос" :mrgreen: Почемуто дико режет глаз :roll:

По схеме:

1) За начертание - 2 балла. Схема из десятка элементов, а на разглядывание и осмысление у меня ушло минут пять :evil:

2) А за каким лешим ЖКД подключен с 4 битами данных ? чтобы труднее программировать было ? На сколько я помню, там при 4-битной шине, все делается очень, э-э-э, через одно место... :twisted:

Ссылка на комментарий
Поделиться на другие сайты

Howl Dgerone,

Так изготовление "в железе" что ли вообще не планируется ? Тогда это все так, баловство...

Изначально, планировалось. Но, сейчас так все сложилось, что ни времени ни денег. Хотя, что знает.

Подразумевается, что ни пройдет и года, как мы будем развивать эти темы для диплома. И вот тогда, точно(уже железно, честно), понадобиться готовый макет. (если честно, не представляю чего тут еще можно развивать. Разве что, названия ячеек вводить со встроенной клавиатуры. Так я подумывал это и тут сделать простым перебором букв по алфавиту. Надо с преподом посоветоваться, что же эта фиговина должна делать). А то создал невесть что, потом декан с ней будет по аудиториям ходит, студентов в разных группах считать.)

По схеме:

2) А за каким лешим ЖКД подключен с 4 битами данных ? чтобы труднее программировать было ? На сколько я помню, там при 4-битной шине, все делается очень, э-э-э, через одно место...

Я написал за вечер и пол дня еще. Работает. Нормально все. Сперва тоже думал, что на восьмиразрядной проще. Но, на С++ там все готовыми функциями, так что, абсолютно без разницы.

ЗЫ.

Постараюсь писать грамотно не только трассировка.

Ссылка на комментарий
Поделиться на другие сайты

Но, на С++ там все готовыми функциями, так что, абсолютно без разницы.
Оно конечно так, только уж больно долго и противно там все получается (в том плане, что финальный код - весьма неоптимален по быстродействию, да и по размеру - тоже) впрочем, если не гнаться за быстродействием - дело хозяйское.

Кстати реализация 8-битного обмена - в приведенном мной примере, можете сравнить (только имейте в виду, что примерно половину кода там занимает реализация C-подобной функции LCD_printf, это уже более "высокий уровень")

а значит, ему просто выпала адская халява прямо из рук самого неприклонного в плане халтур препода

А если не секрет, что считается "халявным" заданием. Просто интересно :roll:

По поводу кнопочек: У вас сделано весьма "оригинально" :lol: И это может вызвать соотв. замечание препода. Оно конечно работать будет, но обычно так никто не делает, по 2 причинам: хочется использовать 2 контактные нормальноразомкнутые кнопки, и надо программно рассчитывать на неопределенность и "дребезг", в момент пролета контакта. Обычно кнопки подключают просто на "землю", с притяжкой входа через резистор, к питанию. Причем резисторы притяжки, у atmeg-и есть встроенные: чтобы их включить, надо перевести соотв биты в режим входа, и записать в них "1" так, как будто это выход. Если кнопок хочется иметь много,(судя по "размытости" техзадания вам это очень может потребоваться) а ножек у контроллера не хватает - их подключают матрицей N x M штук, задействуя соответственно N+M выводов контроллера, и переодически (обычно по таймерному прерыванию) , производят сканирование. Для чего линии X переводят в режим выходов с "открытым коллектором" (либо подключением последовательных диодов, либо просто переводя все те которые не "0" - в режим входа), а все линии Y - используются как входы, с притяжкой к напряжению питания. Обработчик преывания, считывает состояние с входов Y (и передает дальше процедуре подавления "дребезга") затем приращивает на 1 счетчик развертки, дешифрует его и подключают на сканирование следующий столбец, переводя соотв. линию X, в "0" (все остальные должны быть в высокоомном состоянии (входы), либо в "1" и отсечены диодами). на чем обработчик прерывания завершается. Причем лучше именно в такой последовательности: сперва считать, а потом переключить на следующий, чтобы в течении всей паузы между вызовами - сигналы могли распространяться через матрицу (там иногда для борьбы с помехами еще маленькие кондерчики, на "землю", по линиям считывания ставят). Чтобы не вводить дополнительные задержки. Кстати существуют, (и легко покупаются), готовые клавиатуры: обычно "тлефонные" 3х4 и 4х4 (в первом случае это цифры 0...9, а также "*" и "#", в случае 4х4 к ним добавляется еще столбец, из 4 кнопок ), бывают и других конфигураций, но реже. Внутри уже соединены "матрицей".

Ели кнопок нужно совсем много - можно подключить линии сканирования через микросхему дешифратора (ИД7, ИД3), таким образом "размножив" 3 или 4 выходных линии с контроллера - до 8 и 16 соответственно. Таким образом, можно подключить хоть полноценную PC-шную клавиатуру :D . Иногда бывает желание подключить еще и несколько светодиодов (или даже светодиодных индикаторов), помимо ЖКД, - их подключают тоже матрицей, делая программную динамическую индикацию, причем линии "X" (линии сканирования) - могут быть общими с клавиатурой (правда их возможно придется отбуферизовать чемто мощным, для повышения нагрузочной способности, смотря какие светодиоды). При этом обработчик, помимо считывания очередного слова данных, будет еще и выводить очередное слово из "видеопамяти" на светодиоды (в этом случае использование таймера - практически обязательно, иначе будет "мерцать", из-за неодинаковости временных промежутков).

На данный момент у вас в схеме отсутствуют, (если вздумаете разводить плату - надо бы добавить):

1) разъем программирования.

2) разъем питания, и несколько помехоподавляющих конденсаторов, а возможно и стабилизатор питания.

3) подсветка ЖКД, и если надо (если не планируется держать ее "вечно включенной") - полевик для ее программного включения/выключения.

Опционально (пока не надо, но "апетит приходит во время еды", и в плату рекомендую включить, даже если эти компоненты и не будут запаиваться, ибо препод запросто может "попросить это добавить", это ответ на вопрос "чего тут еще можно развивать"):

4) "пищалка", хотябы для "подзвучки" нажатия клавиш, ибо большинство кнопок без должного "тактильного эффекта" - очень неприятно топтать не ощущая нажатия (по всяким гаджетам - сами должны знать :wink: ) Это просто "пьезик", желательно его "посадить" на выход таймера, чтобы не заниматься программным синтезом частотных сигналов (довольно противно в сложной системе).

5) RS232 для связи с "верхним" компом: это просто "любимая фича", которая рано или поздно требуется всем заказчикам (думаю что препод - не исключение), даже если она и нафиг не нужна - применение ей найдут. :lol: Для этого достаточно добавить всего лишь микросхему ADM202, или аналогичную, и разъем. Полного RS232, обычно не надо, хватает TxD и RxD (кстати, советую эти ноги, кнопками, не занимать, чтобы потом не переделывать). Маленькая хирость: ADM202 - имеет 2 передатчика, второй останется свободным, его хорошо использовать для раскачки "пищалки" до +-10в - будет орать погромче, чем от 5в.

6) Контроллер работает от внутреннего генератора ? Хотябы посадочное место под кварц (и пару кондерчиков к нему) я бы оставил, может "внезапно" потербоваться. Кроме того, если нечаянно "запортите" FUSE-биты, и генератор "заглохнет" (см парой постов ранее), то восстанавливать паяясь к ногам контроллера - очень неудобно (мелкие они), лучше иметь там пару лишних площадок.

Ссылка на комментарий
Поделиться на другие сайты

А если не секрет, что считается "халявным" заданием. Просто интересно :roll:

Считает кол-во студентов, входящих в помещение, и, соответственно, включает кол-во ламп. Суть та же, только считает не нажатия кнопок а реакцию датчиков. Только у него одно число надо считать. И одна надпись выводимая. («Студентов:» - стационарно висит. Он зачем-то взял тоже ЖК такой же, как у меня. Так просто, не обосновано. При чем, хотел по Atmega 128 писать (мы только ее и учили(ну, еще MCS-51)). А потом, ему скинули исподники на Пик. И он с них все и собрал. )

При чем, он делает только программную часть. А саму конструкцию делает другой человек. Типа, двое одно устройство разрабатывают.

По поводу кнопочек: У вас сделано весьма "оригинально" :lol:

Знаю. Я потом поставлю на землю с подтягивающими. В программе, это одна строчка кода. (PS на последней сдаче лаб у меня именно это спрашивали).

А матричная клавиатура – это тема следующей предстоящей сдачи. У меня прога не дописанная валяется. Чего-то не заработала на макете. Надо допинать.

А вообще, много дельных замечаний. (Все ) Спасибо. Будем работать. ::bouncy

Ссылка на комментарий
Поделиться на другие сайты

Считает кол-во студентов, входящих в помещение, и, соответственно, включает кол-во ламп. Суть та же, только считает не нажатия кнопок а реакцию датчиков. Только у него одно число надо считать

Ну, на самом деле, тут не намного проще. Дело все в том, что в микроконтроллерах, самое сложное - это написать классическое "hello world" (научится его компилировать, прожигать, правильно инициализировать контроллер, короче чтобы все заработало), а дальше, имея эту "рыбу", наваять на C можно чего угодно, это очень не намного сложнее, если конечно речь не идет о действительно сложных вещах, вроде 3D-графики, распознавания образов, речи, или портирования DOOM2 на платформу AVR32 (валяется в сети такой "пример") :mrgreen: . Конечно то, что работу разделили на 2 человек - халява. С другой стороны у вас есть шанс овладеть микроконтроллерами "от и до", такие специалисты, в последующем ценятся, и возможно это принесет вам реальный "хлебушек".

Я это на полном серъезе, реальные "умения", они гораздо важнее "корочки" в кармане, (которй например у вашего покорного слуги нету вообще :mrgreen: ) , причем желательно умение именно осуществить весь цикл - получить от заказчика(работодателя) деньги (на комплектацию и сторонние работы) и ТЗ далее "обговорить" это ТЗ (тоже уметь надо, как правило заказчики сами плохо понимают чего они хотят :lol: ), придумать схему, развести, заказать изготовление PCB (знать куда и в каком виде файлы отправить, чтобы вопросов не возникало), закупить комплектацию, собрать опытный образец, запрограммировать и отладить, затем скорректировать разработку (повторить цикл изготовления), и выдать готовый комплект КД, и работающий образец. И не осваивать все это "в первый раз", а именно "уже уметь". Вот такой специалист, без "куска хлеба" не останется никогда, не смотря не на какой кризис :wink:

При чем, хотел по Atmega 128 писать (мы только ее и учили(ну, еще MCS-51)). А потом, ему скинули исподники на Пик. И он с них все и собрал.
Atmega 128 - однозначно "из пушки по воробьям" : "восьмой" или "шестнадцатой" тут более чем достаточно. Программирование - ничем принципиально не отличается "такаяже штука, только без крыльев" © :wink: .

А вот пик - редкостная гадость (один апаратный стек чего стоит), тут возможны 2 варианта: либо ваш сокурсник успешно запустит и сдаст чужую работу, получит "галочку" и нифига не останется в голове (см. выше), либо (если ему придется серьезно модифицировать программу), то он рискует хлебнуть всех "прелестей" PIC-a по полной программе (преобретя при этом массу малополезных знаний, об дураццких особенностях работы PIC-ов). Так что, не завидуйте, в любом случае :wink:

И странно мне, что-же это за "100 баллов по МК", если при этом этот человек пользуется чужой программой в столь элементарной задаче, а при этом "один из худших" нормально делает все сам :mrgreen:

А матричная клавиатура – это тема следующей предстоящей сдачи.
Как у вас все сложно .... :roll:

У меня прога не дописанная валяется. Чего-то не заработала на макете. Надо допинать.
2 варианта: либо придумали чтото слишком "заумное", и сами запутались: я ранее изложил как это делается "по нормальному", ничего сложного там нет, в 3 строчках программы запутаться сложно. Либо, потому как у вас не макет а симулятор, вы забыли гдето притянуть резисторами и устроили ситуацию, когда в какойто момент входы остаются оборванными (как вариант забыли переводить ненужные линии сканирования в высокоомное состояние и устроили конфликт с коротким замыканием входов при нажатии 2 кнопок) В подобных ситуациях, компутерные модели - гораздо хуже макета, ибо ведут себя совершенно непредсказуемым образом, виснут, глючат и т.д.
Ссылка на комментарий
Поделиться на другие сайты

Про матричную клаву. Она как раз делается именно на макете. Там, просто под конец всего нужно нажать на две кнопки, прога должна выйти с цикла, а макет отпраздновать это событие миганием светодиодами с определенной частотой. Вот диоды загораются, но мигать уже не хотят. Хотя, вроде, все там правильно. Я почесал репу, плюнул и ушел обедать... ::blush

PS.

По прошлым замечаниям. Программно я учел такие нюансы, как антидребезг и проверка контрольной суммы при работе с энергонезависимой памятью…

Ссылка на комментарий
Поделиться на другие сайты

Предлогают тут програматор спаять простой и стремный.

07_isp5wire.png

И посложнее - понадежнее...

07_avrprog.png

Спаять, чтоль...

Я так понял, там землю надо еще и GND соединить с землей-корпусом LPT.

Пишут, что работает с пони-про. Но, и CVAvr умеет юзать сие чудо.

Ссылка на комментарий
Поделиться на другие сайты

Предлогают тут програматор спаять простой и стремный.
С таким не работал, но есть серьезные опасения, что на части LPT-портов, особенно ноутбучных, работать не будет.

И посложнее - понадежнее...

Эта схема, у меня разведена в конструктиве переходника DB25-DB9 (раньще на COM-порты такие ставили), и платы изготавливались серийно. Продаются кожуха под 2 разъема DB. Плата вставляется между 2 рядов ног разъема (1.5мм текстолит - как раз плотно входит), и разъемы паяются как планарные компоненты. (см. вложение). Цоколевка выходного разъема (DB9М), подобрана таким образом, чтобы можно было использовать "проколотый" на плоский шлейф DB9F вот такой:

dsbsh005_m.jpg и собрать гибкий кабель DB9F-IDC10F, без пайки (при серийном производстве, кабель убивают достаточно быстро, это - "расходный материал"), кроме того это дает возможность паять кабели с любой цоколевкой, под "чужие" устройства. Да и паять разъемы таким образом - очень неплохо.

Ежели надо - могу дать файлы схемы и платы (в PCAD 4.5, для заказа на производстве, или в PCX/GIF, для "утюгового" изготовления).

Эта схема (именно в данной цоколевке LPT), поддерживается довольно большим количеством софта, помимо PONY, в частности есть "самописная" программа (сначала под DOS, потом была переделана под WIN32, со встроенной имитацией драйвера, для доступа к аппаратным регистрам LPT), которую можно запускать из .BAT-файлов, в "автоматическом" режиме (все передается через командную строку или командные файлы). Тоже имеется, причем с исходниками.

Есть некоторые нюансы:

1) Микросхему буфера, крайне желательно использовать HCT244 или ACT244. Буква "T" обозначает TTL-совместимые входные уровни (0.8/2.4в) что крайне полезно, при работе с некоторыми ноутбуками, производители которых, стали делать LPT с выходами в 3-вольтовой логике (что стандартом LPT, между прочим, не коим образом не предусмотрено :evil: ), и с которыми обычная КМОП логика (1/3VCC 2/3VCC) может не чувствовать "единицы". (кстати в этом случае, если нет "правильной" микросхемы, бывает полезно чуть снизить напряжение питания програматора, включив 2 диода последовательно).

2) на плате устройства, по входу сброса контроллера, поставить конденсатор 1000-2000пф (но не больше !!!) на землю, и резистор 5к1 на питание. Заметно снижается количество глюков.

3) Естественно, все переходники USB-LPT - идут лесом. Ибо весь данный софт, использует LPT - нестандартным образом, что контроллерами USB-LPT, и их драйверами - совершенно не поддерживается.

4) Под NT-based виндами, частенько возникают проблеммы с доступом к апаратному порту. Каждая софтина для прожига, изгаляется по своему, некоторые (в частности упомянутый PonyProg), можно настроить под XP, но иногда требуются пляски с бубном. Моя программа (версия WIN32) вроде нормально работала, но статистики по большому количеству компов - не имею, так что возможны варианты :wink: (DOS-версия под NT, без отдельных средств "открытия портов", работать не будет гарантированно).

Выходов 2: либо исользовать "чистый" DOS (не DOS- сессию !!), или WIN9x/ME. Либо настраивать софт под NT, возможно используя сторонние драйверы, для "открытия" портов. Потому как вторй способ, обычно с первого раза не работает, а вам и так хватит причин, чтобы что-то не получилось :lol:. Начинать рекомендую с первого. :wink:

post-362-1296114974,21_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Было много дел, в том числе по изготовлению некоторых электронных проектов, но темку таки почитывал. Попробую и я добавить несколько замечаний, возможно они тоже будут кому-то полезны.

Во первых, должен сказать, что если время поджимает – писать надо на сях, тем более что сам проект это позволяет без проблем. Конечно, знание ассемблера никто не отменял, но «быстрый старт» иногда полезно делать на высоком уровне.

Во всторых: единственное, что мне приходит в голову: будьте поаккуратнее с code vision, сам я с ним не работал (пользовал просто компилятор IAR C++ for AVR, потом прошивал PonyProg)

dr.Nimnul, который раз удивляюсь схожести нашей инженерной практики. ::smile Сам уже много лет использую IAR for AVR – очень качественный компилятор с многими настройками и компактным выходным кодом. Code Vision не использовал никогда, в отличие от некоторых знакомых, так что лично мне сказать что-то определенное сложно, но практика показывает, что пользуются им немногие, тогда как IAR используется профессионалами для коммерческих разработок, как для AVR так и для ARM, Cortex, MSP430. Есть еще Bascom, Algorithm Builder, Flowcode и другие компиляторы, приближающие программирование микроконтроллеров к визуальному, но никогда не использовал их, можно сказать, с идеологических точек зрения. Для встроенных систем предпочитаю писать код лапками и когда он весь на виду.

Только прошел слух, что ее [ATmega8] вроде как собираются снимать с производства, ввиду одинаковой цены с ATMEGA 16, но они взаимозаменяемы (с точностью до цоколевки), так что в случае чего - перейдете на другую, без проблемм.

Да?! Пруфлинк в студию! Не слышал о таком и близко, хотя все может быть. Впрочем, ATmega8 легко заменяется на более навороченную ATmega88 или ATmega168, при этом они все pin-to-pin compatible как в DIP28, так и в TQFP32. Правда, подороже будут, но и периферия позволяет больше (чего только стоит прерывание по изменению состояния многих пинов). ::bouncy

А за каким лешим ЖКД подключен с 4 битами данных ? чтобы труднее программировать было ? На сколько я помню, там при 4-битной шине, все делается очень, э-э-э, через одно место...

А в чем были трудности? Например, у мя все ЖК подключены по четырехбитной шине, код несложен, просто передаешь нибблами по четыре бита, подключая линии ЖК к старшей тетраде порта (так удобнее всего, но приходилось цеплять и «куда было»), сначала передается старшая тетрада, потом младшая. Естественно, больше тактов на линии Е, но на быстродействие экрана на самом деле почти не влияет (все равно все ограничивается инерционностью кристаллов, которая на порядки выше) – отличная вещь, советую использовать.

1.	Установить значение линии RS 
2. Вывести значение старшей тетрады байта данных на линии шины DB4...DB7
3. Установить линию Е = 1
4. Установить линию Е = 0
5. Вывести значение младшей тетрады байта данных на линии шины DB4...DB7
6. Установить линию Е = 1
7. Установить линию Е = 0
8. Установить линии шины DB4...DB7 = HI[/code]

Если кнопок хочется иметь много,(судя по "размытости" техзадания вам это очень может потребоваться) а ножек у контроллера не хватает - их подключают матрицей N x M штук, задействуя соответственно N+M выводов контроллера, и переодически (обычно по таймерному прерыванию) , производят сканирование.

Делал красивее. Та же матрица, но на диодах Шоттки (чтобы падение было поменьше) делал гальваническое ИЛИ, подавая этот сигнал на аппаратное прерывание, в котором и опрашивал клавиатуру. Лично у мя были баги, схема оказалась критичной к обвязке, но введением микрофарадного керамического конденсатора на ногу прерывания к земле решило все проблемы – работает очень стабильно, таймер не нужен, лишний раз клаву не дергает. Или еще лучше – таки да, подключить PS/2 клаву, тоже придется использовать прерывания, но кнопок зато завались и линий всего две. :)

Контроллер работает от внутреннего генератора ? Хотябы посадочное место под кварц (и пару кондерчиков к нему) я бы оставил, может "внезапно" потербоваться.

Ага, для упомянутого UART. ;) Только кварц надо выбрать правильный, на уартовскую частоту, например, из серии 7.3728МГц, 11.0592МГц, 14.7456МГц или 18.4320МГц чтобы минимизировать ошибку (не использовать же нестандартную скорость передачи). Последний у меня стоит во многих авровских проектах даже если используется та же мега16, у которой по даташиту максимальная тактовая частота 16.0000МГц при питании от 5 вольт. Небольшой оверклок не вредит, все работает очень стабильно. (Впрочем, надежно мегу8, 16, 32, 128 даже с индексом L оверклочил до 20МГц при пятивольтовом питании без ущерба стабильности. Хорошо это или нет – вопрос философский, но многие к ограничению тактовой частоты в даташите относятся слишком уж догматично даже в своих любительских поделках, а когда о серийности приборов речи не идет, можно и пофантазировать :))

Кроме того, если нечаянно "запортите" FUSE-биты, и генератор "заглохнет" (см парой постов ранее), то восстанавливать паяясь к ногам контроллера - очень неудобно (мелкие они), лучше иметь там пару лишних площадок.

Запороть контроллер есть куча способов и комбинаций, было дело, пришлось собрать параллельный высоковольтный программатор. Главное быть поосторожнее с FUSE RSTDISBL или SPEN, а то будет весело когда ISP отрубишь. :) Впрочем PonyProg будто не позволяет сделать такое кощунство (точно не помню, его не юзаю, но другие программаторы позволяют :))

С таким не работал, но есть серьезные опасения, что на части LPT-портов, особенно ноутбучных, работать не будет.

Скорее проблема в том, что этого порта на ноутбуках просто не будет, так что для себя решил к нему не привязываться ни в каких разработках, даже в программаторах. Это касаетсякак микроконтроллеров, так и ПЛИС. А в системах обмена данными с ПК тем более.

желательно умение именно осуществить весь цикл - получить от заказчика(работодателя) деньги (на комплектацию и сторонние работы) и ТЗ далее "обговорить" это ТЗ (тоже уметь надо, как правило заказчики сами плохо понимают чего они хотят ), придумать схему, развести, заказать изготовление PCB (знать куда и в каком виде файлы отправить, чтобы вопросов не возникало), закупить комплектацию, собрать опытный образец, запрограммировать и отладить, затем скорректировать разработку (повторить цикл изготовления), и выдать готовый комплект КД, и работающий образец. И не осваивать все это "в первый раз", а именно "уже уметь". Вот такой специалист, без "куска хлеба" не останется никогда, не смотря не на какой кризис

Не смог пройти мимо, мурк. >’^..^’

fccaced8681a.jpg Вам бы со свободно распространяемого GUI-компиллятора начинать бы, WinAVR называется. Когда-то использовал его, на самом деле очень неплохая вещь, лишь немногим по плотности кода уступает IAR for AVR, к тому же все время совершенствуется и, что для вас немаловажно, в сети куча примеров и исходников, под него заточенных. Уж с ЖК – и подавно множество, просто ищите и используете, на самом деле найти и правильно прикрутить чужой код тоже надо уметь, хотя в учебных целях неплохо бы написать все с нуля. С eeprom, правда, в WinAVR придется самому лапками работать, IAR работу с памятью существенно упрощает.

Для старта советовал бы собрать программатор через СOM (хотя там линии хендшейкинга используются тоже нестандартным образом и мосты USB-COM типа FT232 тоже идут лесом). Хотя самое хорошее решение, которое я всегда рекомендую в таких случаях – это программатор USB-ASP, отлично работающий с дудкой (AVR Dude) или AVR910-совместимый программатор от Protoss работающий с AVR Prog (неприятно только, что AVR Prog поддерживает меньшее количество контроллеров, а программатор инициализируется как COM-порт). Оба типа программаторов в плане железа очень похожи, собираются на макетке за 5 минут и доставляют кучу профита (по скорости с тем же Pony не сравним). Естественно, возникает вопрос как прошить управляющий контроллер, но, думаю, на кафедре вам должны помочь с этим. Готовые прошивки разных версий и схемы доступны в сети.

Еще вот статьи Рюмика о программировании AVR. Если еще не нашли их – советую найти и изучить, отличные примеры старта с WinAVR, в том числе работа с ЖК, все там есть.

Да, и 1812fbb8a166.jpg

Ссылка на комментарий
Поделиться на другие сайты

Делал красивее. Та же матрица, но на диодах Шоттки (чтобы падение было поменьше) делал гальваническое ИЛИ, подавая этот сигнал на аппаратное прерывание, в котором и опрашивал клавиатуру. Лично у мя были баги, схема оказалась критичной к обвязке, но введением микрофарадного керамического конденсатора на ногу прерывания к земле решило все проблемы – работает очень стабильно, таймер не нужен, лишний раз клаву не дергает. Или еще лучше – таки да, подключить PS/2 клаву, тоже придется использовать прерывания, но кнопок зато завались и линий всего две. :)

Еще вариант клавиатуры - резистивный делитель, в одно плечо которого каждой кнопкой коммутируется свой номинал. С помощью АЦП легко определяем нажатую кнопку. Преимущество очевидно - один вывод контроллера, минусы тоже понятны. Схема проверена и используется повсеместно в малогабаритных прибора вроде камкордеров, плееров и т.п.

Только кварц надо выбрать правильный, на уартовскую частоту, например, из серии 7.3728МГц, 11.0592МГц, 14.7456МГц или 18.4320МГц чтобы минимизировать ошибку (не использовать же нестандартную скорость передачи).

Берете кварц какой есть, считаете по формулам из даташита коэффициенты и ошибку. Проблем не возникало практически никогда.

Ссылка на комментарий
Поделиться на другие сайты

Конечно, знание ассемблера никто не отменял, но «быстрый старт» иногда полезно делать на высоком уровне.

Воистину так.

а самом деле найти и правильно прикрутить чужой код тоже надо уметь, хотя в учебных целях неплохо бы написать все с нуля.
Тоже ППКС.

Да?! Пруфлинк в студию!

Да пожалуйста: http://www.atmel-grenoble.com/dyn/products/product_card_v2.asp?part_id=2004

правда заменяют, как выяснилось, на ATmega8A, так что можно не беспокоитя :lol:

Ага, для упомянутого UART.
Ну хотябы. Правда UART, как раз можно заставить работать и от внутреннего генератора. Вообще UART у современных контроллеров, обычно весьма адаптивен, и не так критичен к разбросу частот, как скажем 580ВВ51 (не к ночи будь помянута) . Правда тут все "на пределе", и потребуется шиманский бубен самого большого размера :mrgreen:

Знаю, когда сделали, UART от внутреннего генератора, с динамической коррекцией частоты оного (есть у атмеги такая фича). :roll:

В случае "самоделки", поставить кварц - неизмеримо проще. Кстати с кварца в 16.0, или 18.0 - атмега с компом связывается прекрасно (первое - проверял лично, во втором случае - ошибка еще меньше). Глюки происходят от недостатка ума програмистов, если к-т деления вычисляется, там очень часто ставят просто команду "делить", а надо делать математическое округление (в сторону ближайшего целого, а не "отброс" знаков после запятой)

Кстати именно по причине рассогласования тактовых частот, подавляющее большинство микросхем-переходников USB2COM, крайне коряво работают на 115200 бод (и более), в виду того, что там частота синтезируется с USB-ного кварца в 6мГц или 12мгц, что дает

12/6/16=125 000 б/с или 12/7/16=107 143 б/с. Единственный правильный "переходник", который я знаю (с отдельным кварцем для UART) - MCS7840 (moschip), на 4 порта.

Скорее проблема в том, что этого порта на ноутбуках просто не будет,
Ну это, как раз не проблемма PCMCIA (для ноутов) и PCI(ex) -карточки (для больших компов) - рулят. Чем и пользуюсь. Правда современные PnP- контроллеры, частенько "забывают" прописывать адрес базового порта, в область глобальных переменных BIOS, но это тоже легко лечится (с тем, что этот адрес - за пределами младших 4К - вообще проблемм не возникает, даже у самых древних DOS-утилит). Кстати COM-порты в современных ПК - тоже "не в почете". А проблеммы с доступом к апаратным регистрам 16c550, для " нестандартного использования линий хендшейкинга" - будут все теже самые, что и для LPT. :wink:

По поводу разгона: все очень зависит от напряжения питания, главное, чтобы оно было не меньше, при 4.8в ваши 18мГц - уже будут глючить, а при 5.2в - скорее всего и 20 заработают (возможно не на всех кристаллах, но процент отбраковки - будет невелик). На 5.5в - заработает "с гарантией" (даже по даташиту - можно) . Да, действительно производителем оставлен большой запас, чтобы 16мГц, гарантированно работало и при минимальном напряжении (5в-5%=4.75в), из этого следует что при 5в ровно - можно давать большую частоту (в даташите есть график). Плюс, часть кристаллов - быстрее, чем заявлено, что дает возможность, при незначительной отбраковке, привысить этот график еще процентов на 10. При больших заначениях - отбраковка будет расти.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

×
×
  • Создать...