Помогите разобраться с портами
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
хочу на МЕГА16, на 4 порта выдать сигналы с двойного слова. т.е. хочу на каждый порт вывести свой байт из 32 битной переменной. немогу найти пример как такое можно сделать в CodeVisual на Си. Устройство - бегущие огни 32 канальные (или битные) естественно со множеством визуальных эфектов. Помогите разобраться как можно записывать и как считывать каждый байт в (из) нужное место(а) в порт (переменную).
- Реклама
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
Можно,как вариант, разложить 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)
К примеру:
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)
- Вложения
-
- run_led_32.rar
- (39.86 КБ) 210 скачиваний
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
спасибо большое Vov123 за выложеный пример, но он почемуто ругается на версию протеуса. я использую 7.4 SP3 и он никак неоткрывает этот пример а загруженая програма в мегу 16 ничего неделаает кроме как потушила LED на PORTA0. может я чегото нетак делаю? помоги разобраться. а в целом идея с масивом мне очень понравилась
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
сори, вроде я на правильном пути. загрузил програму в AVR Studio все работает, ну а пример думаю в поновой созданом проэкте наберу - думаю что все нормально будет. еще раз всем спасибо. хотя если будут еще какието варианты буду рад посмотреть в целях самообучения
- Реклама
Позвольте спросить:Jokasito писал(а):хочу на МЕГА16, на 4 порта выдать сигналы с двойного слова. т.е. хочу на каждый порт вывести свой байт из 32 битной переменной. немогу найти пример как такое можно сделать в CodeVisual на Си. Устройство - бегущие огни 32 канальные (или битные) естественно со множеством визуальных эфектов. Помогите разобраться как можно записывать и как считывать каждый байт в (из) нужное место(а) в порт (переменную).
Камим образом вы собираетесь управлять сим устройсвом?
Или это будет автомат световых эффектов с жесткой программой?
Тогда зачем мега16?
Поставте 4-е ПЗУшки что-нибуть типа 573РФ2 и генератор на КР1006ВИ1 - эффект будет тот же.
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
Ссылка на Proteus 7.5 SP3(документ не мой)
А в проекте только одна mega16.
В любом Проте укажите путь к .cof или .hex файлу.
А в проекте только одна mega16.
В любом Проте укажите путь к .cof или .hex файлу.
- Вложения
-
- proteus123.rar
- (1.94 КБ) 334 скачивания
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
могу ответить: программа будет жесткой, единственное эфекты будут меняться в соответствии с программой. другого решения, думаю здесь за бугром, - помоему дороже выйдет. ну а в целом я изучаю как работать с AVR и на этом примере хочу попробовать свои силы. в дальнейшем есть широко идущие планы как связать виртуальный симатик с AVR, HDD с буком у которого погарел IDE порт ну и т.д.
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
по поводу "Поставте 4-е ПЗУшки что-нибуть типа 573РФ2 и генератор на КР1006ВИ1 - эффект будет тот же." могу сказать так: вопервых нужен програматор для РФ которого у меня нету, а вовторых у мены нету лампы чем можно былобы стереть (у меня их наверное с горсточку найдется) . можно ли както в домашних условиях без спец ламп их стереть? научите, кто в этом разбирается? да и поскольку я такое неделал может примерную схемку накидаете? а то что я на меге16 задумал так для этого просто все можно достать (все компоненты - отсюда и такое решение). да и КР1006ВИ1 незнаю чем из импортного заменить.
Нет. И чтобы запрограммировать, понадобится "высоковольтный" параллельный программатор.Jokasito писал(а):можно ли както в домашних условиях без спец ламп их стереть?
Схемка очень простая, тактовый генератор на чём угодно, затем наверное несколько каскадных счётчиков (например ИЕ5), выходы которых подключены к адресным входам ПЗУ. С выходов данных ПЗУ снимаем непосредственно сигналы на ключи с лампочками. Дешево и сердито, хотя пайки будет больше, чем с мегой.Jokasito писал(а):да и поскольку я такое неделал может примерную схемку накидаете?
Ну вы сказали. Это обычно импортные 555 заменяют на 1006ВИ1, а не наоборотJokasito писал(а):да и КР1006ВИ1 незнаю чем из импортного заменить.
Даже остановленные часы два раза в сутки показывают правильное время.
В домашних условиях стереть РФку можно. Нужна кварцевая лампа. Раньше такие почти в каждой семье на севере были (компенсирует недостаток солнца в полярную ночь). Если есть знакомые/родственники работающие в больнице, можно дать, чтоб подставили окошко под свет лампы. 10-30 минут достаточно. Есть мнение что на солнце денек подержать - сотрет. Но сам не проверял.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
УФ лампы которыми стирают имеют прозрачную колбу у нас они по 30-50 р. за штуку в зависимости от мощности.
Работать только в защитных очках
Работать только в защитных очках
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
привет. скажите пожалуйста почему когда в одну сторону делаю сдвиг то получается бегущий огонь (один огонек перемещается), а когда делаю тоже самое но сдвиг в другую сторону то получается совершенно другой эфект (в моем случае все диоды зажигаются по одному и нетухнут позади). понимаю что знаковый бит косячит. пытаюсь понять как с этим бороться, но неполучается, программа взята от Vov123. подскажите плиз.
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
извините. почемуто обгрызает часть кода поэтому выкладываю часть кода где работает нетак как ожидалось
*(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;
*(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;
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
Спасибо. Уже скачал и буду дальше разбираться
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
привет. подскажите плиз, как можно в CodeVision посмотреть какое число хранится в переменной (при условии что вывести в порт нельзя - все заняты)? я понимаю что можно сделать тригер и отловить по достижении какогото значения - но так долго можно отлавливать. может это можно както по другому посмотреть. проблема в том что счетчик циклов както нетак считает или я нетак условие составил
if (64<=schet<128)
{ while(64<=schet<128)
{.....}
schet=schet+1;}
сюда заходит правильно начиная с 64 , но продолжает заходить и после достижения 128
в чем проблема? подскажите
if (64<=schet<128)
{ while(64<=schet<128)
{.....}
schet=schet+1;}
сюда заходит правильно начиная с 64 , но продолжает заходить и после достижения 128
в чем проблема? подскажите
- Сообщения: 59
- Зарегистрирован: Сб май 16, 2009 04:16:49
сорри, в AVR Studio , ведь тут эмулятор
Это не математика а Си. Условие вида 64<=schet<128 должно выглядеть так:
(128>=64)&&(schet<128).
А твое условие компилятор решит так: если 64<=schet то будет проверяться 1<128, а если 64>schet то будет проверяться 0<128 тоже истина, поэтому условие будет выполняться всегда.
(128>=64)&&(schet<128).
А твое условие компилятор решит так: если 64<=schet то будет проверяться 1<128, а если 64>schet то будет проверяться 0<128 тоже истина, поэтому условие будет выполняться всегда.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης



