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

Pavel_Isto

Members
  • Постов

    4
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Ростов-на-Дону

Электроника

  • Стаж в электронике
    Менее года

Достижения Pavel_Isto

Новичок

Новичок (1/14)

  • Неделя на форуме

Последние значки

0

Репутация

  1. Большое спасибо за пример и за то что делитесь опытом. Я сейчас как раз в самом начале пути работы с микроконтроллерами.
  2. Большое спасибо за ссылку. Я посмотрел там целый мини курс по Proteus получается, я даже его захотел пройти, но обнаружил, что в схеме применяются элементы, которые я еще не изучил, поэтому вернусь к этому чуть позже. По поводу моей проблемы, немного поэкспериментировав я понял, что дело не в том, что порты разные, дело в количестве команд. Просто когда разряды подключены к одному порту, они гасятся всего одной командой, например: PORTC &= ~((1<<3)|(1<<2)|(1<<1)|(1<<0)); и Протеус, в данном случае выполняет гашение всех разрядов одновременно. Но, если написать вот так, то разряды (визуально) начинают отключаться по-очереди PORTC &= ~(1<<3); PORTC &= ~(1<<3); PORTC &= ~(1<<1); PORTC &= ~(1<<0); Хотя, как мне кажется, в реальности при частоте 1MHz, время выполнения (грубо говоря) одного такта (PORTC &= ~((1<<3)|(1<<2)|(1<<1)|(1<<0)) и четырёх PORTC &= ~(1<<3); PORTC &= ~(1<<3); PORTC &= ~(1<<1); PORTC &= ~(1<<0); столь не значительно, что сигнал на пинах должен появляться мгновенно и одновременно. Но Протеус думает иначе... Кстати, на ответ "Ну и записывай всё одной командой", сразу скажу, что разумеется для одного порта так и делаю, но вот если сегменты будут на разных портах, например так: PORTC &= ~((1<<3)|(1<<2)); PORTD &= ~((1<<1)|(1<<0)); то как записать это одной командой мне неизвестно и кажется что вообще вряд ли возможно, хотя может кто-то подскажет... Речь по настройки самого индикатора?
  3. Добрый день! Если кто-то сталкивался с таким эффектом (проблемой) очень прошу помочь. Проблема становится явной при подключении четырёх разрядного семисегментного индикатора к разным портам. Пример: В данном случае два разряда 1 и 2 подключены к порту С, а разряды 3 и 4 подключены к порту D Теперь, допустим я просто хочу помигать всеми разрядами, т.е. все индикаторы должны загореться, а затем (через секунду) полностью потухнуть и т.д. Для этого я набросал простенькую программу: #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRC |= (1<<0)|(1<<1)|(1<<2)|(1<<3); PORTC |= (1<<0)|(1<<1)|(1<<2)|(1<<3); DDRD |= (1<<0)|(1<<1)|(1<<2); PORTD |= (1<<0)|(1<<1)|(1<<2); DDRC |= (1<<4)|(1<<5); PORTC |= (1<<4)|(1<<5); DDRD |= (1<<4)|(1<<5); PORTD |= (1<<4)|(1<<5); while(1) { PORTC ^= (1<<4); PORTC ^= (1<<5); PORTD ^= (1<<4); PORTD ^= (1<<5); _delay_ms(1000); } } Так вот, проблема в том что сегменты 1 и 2 отключаются НЕ одновременно с сегментами 3 и 4, происходит небольшая задержка и это визуально заметно. По идее вот эта команда PORTC ^= (1<<4); PORTC ^= (1<<5); PORTD ^= (1<<4); PORTD ^= (1<<5); должна выполняться с такой скоростью, что её не способен заметить человеческий глаз. Самое интересное то, что если при точно таком же подходе перевесить эти сегменты на один порт, то они тухнут одновременно. Разумеется для данной задачи это не критично (я привел эту задачу лишь как иллюстрацию), но вот когда при таком подключении я хочу сделать например динамическую смену цифр, то получаю артефакты, от того что сегменты не моментально переключаются. Суть проблемы можно свести к следующему, сигнал поданный одновременно на разные порты считывается протеусом с задержкой между. В чем может проблема?
×
×
  • Создать...