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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

хочу на МЕГА16, на 4 порта выдать сигналы с двойного слова. т.е. хочу на каждый порт вывести свой байт из 32 битной переменной. немогу найти пример как такое можно сделать в CodeVisual на Си. Устройство - бегущие огни 32 канальные (или битные) естественно со множеством визуальных эфектов. Помогите разобраться как можно записывать и как считывать каждый байт в (из) нужное место(а) в порт (переменную).
Контактная информация:
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение 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;
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение 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)
Вложения
run_led_32.rar
(39.86 КБ) 210 скачиваний
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

спасибо большое Vov123 за выложеный пример, но он почемуто ругается на версию протеуса. я использую 7.4 SP3 и он никак неоткрывает этот пример а загруженая програма в мегу 16 ничего неделаает кроме как потушила LED на PORTA0. может я чегото нетак делаю? помоги разобраться. а в целом идея с масивом мне очень понравилась
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

сори, вроде я на правильном пути. загрузил програму в AVR Studio все работает, ну а пример думаю в поновой созданом проэкте наберу - думаю что все нормально будет. еще раз всем спасибо. хотя если будут еще какието варианты буду рад посмотреть в целях самообучения
Контактная информация:
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

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

Сообщение Vov123 »

Ссылка на Proteus 7.5 SP3(документ не мой)
А в проекте только одна mega16.
В любом Проте укажите путь к .cof или .hex файлу.
Вложения
proteus123.rar
(1.94 КБ) 334 скачивания
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

могу ответить: программа будет жесткой, единственное эфекты будут меняться в соответствии с программой. другого решения, думаю здесь за бугром, - помоему дороже выйдет. ну а в целом я изучаю как работать с AVR и на этом примере хочу попробовать свои силы. в дальнейшем есть широко идущие планы как связать виртуальный симатик с AVR, HDD с буком у которого погарел IDE порт ну и т.д.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

по поводу "Поставте 4-е ПЗУшки что-нибуть типа 573РФ2 и генератор на КР1006ВИ1 - эффект будет тот же." могу сказать так: вопервых нужен програматор для РФ которого у меня нету, а вовторых у мены нету лампы чем можно былобы стереть (у меня их наверное с горсточку найдется) . можно ли както в домашних условиях без спец ламп их стереть? научите, кто в этом разбирается? да и поскольку я такое неделал может примерную схемку накидаете? а то что я на меге16 задумал так для этого просто все можно достать (все компоненты - отсюда и такое решение). да и КР1006ВИ1 незнаю чем из импортного заменить.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

Jokasito писал(а):можно ли както в домашних условиях без спец ламп их стереть?
Нет. И чтобы запрограммировать, понадобится "высоковольтный" параллельный программатор.
Jokasito писал(а):да и поскольку я такое неделал может примерную схемку накидаете?
Схемка очень простая, тактовый генератор на чём угодно, затем наверное несколько каскадных счётчиков (например ИЕ5), выходы которых подключены к адресным входам ПЗУ. С выходов данных ПЗУ снимаем непосредственно сигналы на ключи с лампочками. Дешево и сердито, хотя пайки будет больше, чем с мегой.
Jokasito писал(а):да и КР1006ВИ1 незнаю чем из импортного заменить.
Ну вы сказали. Это обычно импортные 555 заменяют на 1006ВИ1, а не наоборот :))
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

В домашних условиях стереть РФку можно. Нужна кварцевая лампа. Раньше такие почти в каждой семье на севере были (компенсирует недостаток солнца в полярную ночь). Если есть знакомые/родственники работающие в больнице, можно дать, чтоб подставили окошко под свет лампы. 10-30 минут достаточно. Есть мнение что на солнце денек подержать - сотрет. Но сам не проверял.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

УФ лампы которыми стирают имеют прозрачную колбу у нас они по 30-50 р. за штуку в зависимости от мощности.
Работать только в защитных очках :shock:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

привет. скажите пожалуйста почему когда в одну сторону делаю сдвиг то получается бегущий огонь (один огонек перемещается), а когда делаю тоже самое но сдвиг в другую сторону то получается совершенно другой эфект (в моем случае все диоды зажигаются по одному и нетухнут позади). понимаю что знаковый бит косячит. пытаюсь понять как с этим бороться, но неполучается, программа взята от Vov123. подскажите плиз.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение 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;
Контактная информация:
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

-----
Вложения
run_led_32_2.rar
(40.3 КБ) 188 скачиваний
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

Спасибо. Уже скачал и буду дальше разбираться
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

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

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

сюда заходит правильно начиная с 64 , но продолжает заходить и после достижения 128
в чем проблема? подскажите
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49

Сообщение Jokasito »

сорри, в AVR Studio , ведь тут эмулятор
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Это не математика а Си. Условие вида 64<=schet<128 должно выглядеть так:
(128>=64)&&(schet<128).
А твое условие компилятор решит так: если 64<=schet то будет проверяться 1<128, а если 64>schet то будет проверяться 0<128 тоже истина, поэтому условие будет выполняться всегда.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»