Страница 1 из 1

Помогите разобраться с портами

Добавлено: Сб май 16, 2009 04:29:06
Jokasito
хочу на МЕГА16, на 4 порта выдать сигналы с двойного слова. т.е. хочу на каждый порт вывести свой байт из 32 битной переменной. немогу найти пример как такое можно сделать в CodeVisual на Си. Устройство - бегущие огни 32 канальные (или битные) естественно со множеством визуальных эфектов. Помогите разобраться как можно записывать и как считывать каждый байт в (из) нужное место(а) в порт (переменную).

Добавлено: Сб май 16, 2009 05:05:54
kalobyte
PORTx = a; запись в порт (вывод на светодиоды)
a = PINx; чтение из порта

для выделения 8 бит из 32х надо сделать сдвиг и привести в кошерный вид при помощи преобразования типов
long int a;
char b = (char)a;

или
long int a = 0x0905;
char b = a&0xFF; b=0x05
если надо левую часть, то b = (a>>8)&0xFF;

Добавлено: Сб май 16, 2009 07:08:11
Vov123
Можно,как вариант, разложить long int на массив char
К примеру:
long int b;
char mass[4];
*(long int*)mass = b;
PORTA=mass[0];
PORTB=mass[1];
PORTC=mass[2];
PORTD=mass[3];

Чтобы не быть голословным прикрепляю проектик CVAVR + Proteus(7.5SP3)

Добавлено: Сб май 16, 2009 12:01:23
Jokasito
спасибо большое Vov123 за выложеный пример, но он почемуто ругается на версию протеуса. я использую 7.4 SP3 и он никак неоткрывает этот пример а загруженая програма в мегу 16 ничего неделаает кроме как потушила LED на PORTA0. может я чегото нетак делаю? помоги разобраться. а в целом идея с масивом мне очень понравилась

Добавлено: Сб май 16, 2009 15:59:48
Jokasito
сори, вроде я на правильном пути. загрузил програму в AVR Studio все работает, ну а пример думаю в поновой созданом проэкте наберу - думаю что все нормально будет. еще раз всем спасибо. хотя если будут еще какието варианты буду рад посмотреть в целях самообучения

Re: Помогите разобраться с портами

Добавлено: Сб май 16, 2009 21:00:46
GP1
Jokasito писал(а):хочу на МЕГА16, на 4 порта выдать сигналы с двойного слова. т.е. хочу на каждый порт вывести свой байт из 32 битной переменной. немогу найти пример как такое можно сделать в CodeVisual на Си. Устройство - бегущие огни 32 канальные (или битные) естественно со множеством визуальных эфектов. Помогите разобраться как можно записывать и как считывать каждый байт в (из) нужное место(а) в порт (переменную).
Позвольте спросить:
Камим образом вы собираетесь управлять сим устройсвом?
Или это будет автомат световых эффектов с жесткой программой?
Тогда зачем мега16?
Поставте 4-е ПЗУшки что-нибуть типа 573РФ2 и генератор на КР1006ВИ1 - эффект будет тот же.

Добавлено: Вс май 17, 2009 00:24:28
Vov123
Ссылка на Proteus 7.5 SP3(документ не мой)
А в проекте только одна mega16.
В любом Проте укажите путь к .cof или .hex файлу.

Добавлено: Вс май 17, 2009 03:12:20
Jokasito
могу ответить: программа будет жесткой, единственное эфекты будут меняться в соответствии с программой. другого решения, думаю здесь за бугром, - помоему дороже выйдет. ну а в целом я изучаю как работать с AVR и на этом примере хочу попробовать свои силы. в дальнейшем есть широко идущие планы как связать виртуальный симатик с AVR, HDD с буком у которого погарел IDE порт ну и т.д.

Добавлено: Вс май 17, 2009 04:03:37
Jokasito
по поводу "Поставте 4-е ПЗУшки что-нибуть типа 573РФ2 и генератор на КР1006ВИ1 - эффект будет тот же." могу сказать так: вопервых нужен програматор для РФ которого у меня нету, а вовторых у мены нету лампы чем можно былобы стереть (у меня их наверное с горсточку найдется) . можно ли както в домашних условиях без спец ламп их стереть? научите, кто в этом разбирается? да и поскольку я такое неделал может примерную схемку накидаете? а то что я на меге16 задумал так для этого просто все можно достать (все компоненты - отсюда и такое решение). да и КР1006ВИ1 незнаю чем из импортного заменить.

Добавлено: Вс май 17, 2009 15:13:27
Секретный кот
Jokasito писал(а):можно ли както в домашних условиях без спец ламп их стереть?
Нет. И чтобы запрограммировать, понадобится "высоковольтный" параллельный программатор.
Jokasito писал(а):да и поскольку я такое неделал может примерную схемку накидаете?
Схемка очень простая, тактовый генератор на чём угодно, затем наверное несколько каскадных счётчиков (например ИЕ5), выходы которых подключены к адресным входам ПЗУ. С выходов данных ПЗУ снимаем непосредственно сигналы на ключи с лампочками. Дешево и сердито, хотя пайки будет больше, чем с мегой.
Jokasito писал(а):да и КР1006ВИ1 незнаю чем из импортного заменить.
Ну вы сказали. Это обычно импортные 555 заменяют на 1006ВИ1, а не наоборот :))

Добавлено: Вс май 17, 2009 19:17:17
DrWatson
В домашних условиях стереть РФку можно. Нужна кварцевая лампа. Раньше такие почти в каждой семье на севере были (компенсирует недостаток солнца в полярную ночь). Если есть знакомые/родственники работающие в больнице, можно дать, чтоб подставили окошко под свет лампы. 10-30 минут достаточно. Есть мнение что на солнце денек подержать - сотрет. Но сам не проверял.

Добавлено: Вс май 17, 2009 19:37:38
GP1
УФ лампы которыми стирают имеют прозрачную колбу у нас они по 30-50 р. за штуку в зависимости от мощности.
Работать только в защитных очках :shock:

Добавлено: Пн май 18, 2009 04:34:46
Jokasito
привет. скажите пожалуйста почему когда в одну сторону делаю сдвиг то получается бегущий огонь (один огонек перемещается), а когда делаю тоже самое но сдвиг в другую сторону то получается совершенно другой эфект (в моем случае все диоды зажигаются по одному и нетухнут позади). понимаю что знаковый бит косячит. пытаюсь понять как с этим бороться, но неполучается, программа взята от Vov123. подскажите плиз.

Добавлено: Пн май 18, 2009 04:53:59
Jokasito
извините. почемуто обгрызает часть кода поэтому выкладываю часть кода где работает нетак как ожидалось
*(long int*)mass = Dword;
PORTA=mass[0];
PORTB=mass[1];
PORTC=mass[2];
PORTD=mass[3];
delay_ms(50);
if(!Dword)Dword=2147483648;//рисунок бегущих битиков
Dword>>=1;
schet=schet+1;

Добавлено: Пн май 18, 2009 12:42:17
Vov123
-----

Добавлено: Пн май 18, 2009 12:53:27
Jokasito
Спасибо. Уже скачал и буду дальше разбираться

Добавлено: Пн май 18, 2009 14:21:29
Jokasito
привет. подскажите плиз, как можно в CodeVision посмотреть какое число хранится в переменной (при условии что вывести в порт нельзя - все заняты)? я понимаю что можно сделать тригер и отловить по достижении какогото значения - но так долго можно отлавливать. может это можно както по другому посмотреть. проблема в том что счетчик циклов както нетак считает или я нетак условие составил

if (64<=schet<128)
{ while(64<=schet<128)
{.....}
schet=schet+1;}

сюда заходит правильно начиная с 64 , но продолжает заходить и после достижения 128
в чем проблема? подскажите

Добавлено: Пн май 18, 2009 14:23:37
Jokasito
сорри, в AVR Studio , ведь тут эмулятор

Добавлено: Пн май 18, 2009 16:06:35
DrWatson
Это не математика а Си. Условие вида 64<=schet<128 должно выглядеть так:
(128>=64)&&(schet<128).
А твое условие компилятор решит так: если 64<=schet то будет проверяться 1<128, а если 64>schet то будет проверяться 0<128 тоже истина, поэтому условие будет выполняться всегда.