Продолжаю мучить http://www.vga-avr.narod.ru/main_rus.html В проекте есть прерывание, в котором выполняется горизонтальная и вертикальная синхронизации, а также настройки указателей отрисовки. Прерывание это нормировано по тактам, даже в ветвлениях if-ов нопами выровнено время выполнения. Я не знаю зачем автор так сделал, но если добавить хоть 1 nop в любое место, то вся синхронизация падает. Проблема в том, что автор использует для выдачи сигналов синхронизации команды PORTD = 4; и PORTD = 0; Что, естественно, приводит к невозможности использовать порт D для чего бы то ни было ещё. Вторая проблема - PORTD = 4 на самом деле означает не только установку третьего бита, но и сброс второго. Третий бит это вертикальная синхронизация, второй - горизонтальная. И происходить эта операция должна одновременно.
Я пробовал менять на PORTD |= (1<<3); PORTD &= ~(1<<2); Но всё тут же падает и из-за не одновременности вывода сигналов, и из-за возросшего времени выполнения. Не помогает также и замена на ассемблерные cbi/sbi.
Но даже char temp; temp = PORTD; Уже приводит к искажению картинки из-за увеличившегося времени выполнения прерывания.
В общем, с этим надо что-то делать
Вот текст прерывания:
Код:
//Global definitions for VGA render #define vga_field_line_count 525 //standart VGA quantity lines #define vga_symbols_per_row 20 //symbols quantity per horizontal #define vga_row_count 20 //symbols quantity per vertical #define vga_symbol_height 24 //rendered symbol height #define TIMER_LIMIT 0xC3 //set count, One VGA line 31.77us
//All VGA sincronize made here.. SIGNAL(SIG_OVERFLOW0) {
TCNT0 = TIMER_LIMIT; //reload counter value 0xC3 //set count, One VGA line 31.77us //******Syncronization Handler********
//Count number of lines if (++linecount == vga_field_line_count) { linecount = 0; //clear pointers for render display buffer raw_render = 0; y_line_render = 0; }
// Вертикальный и горизонтальный синхроимпульсы должны быть одновременно, поэтому дёргать битами порта раздельно по cbi/sbi не получится. // кроме того, тело прерывания крайне чувствительно ко времени исполнения, и добавление любой команды сбивает синхронизацию.
} eb2: 9f 91 pop r25 eb4: 8f 91 pop r24 eb6: 2f 91 pop r18 eb8: 0f 90 pop r0 eba: 0f be out 0x3f, r0 ; 63 ebc: 0f 90 pop r0 ebe: 1f 90 pop r1 ec0: 18 95 reti
00000ec2 <display_Mega>:
Последний раз редактировалось Dikoy Ср апр 04, 2018 13:03:27, всего редактировалось 1 раз.
попробуй буфер - заполняешь его раньше (возможно много раньше, даже может в прошлой итерации прерывания, после всех кодов) а здесь только пуляй его в порт
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Так было бы место где заполнять... Я уже думал, что if (linecount < 45) с его нопами можно использовать для if ((linecount == 10 )||(linecount == 11 )) { //Make here vertical syncronization & HSYNC syncro level on PORTD = 0; //vsync_on } else { //.. & HSYNC syncro level on PORTD = 4;// vsync_off
Добавлено after 31 minute 24 seconds: может прокатит, а может и нет...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Заголовок сообщения: Re: Выкроить 4 такта в коде прерывания надо
Добавлено: Ср апр 04, 2018 14:42:19
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
И происходить эта операция должна одновременно.
Про "одновременно" можно подробнее ? А если бит, который нужно сбросить "одновременно" с установкой другого, уже до этого момента сброшен ? Это уже считается неодновременность ? И уже, априори, будет какой-то там глюк (не вникал в подробности) ? Или как ?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
я так понял - в середине экрана стрка кончается - приходит импульс строчной синхронизации, а кадровой как небыло, так и нет, а когда меняется кадр приходят обе, но одна из них инверсная, поэтому вариант с и/или не прокатит как и побитовые операции. как вариант - либо внешняя обвязка либо внутренняя подстановочная маска, к стати - это мысль! вместо 4 или 0 вписывать туда темп,или даже темп4 и темп0 нужные для синхронизации биты которых не трогать в основной программе, а остальные - в любом месте (не в прерывании) менять на своё усмотрение, правда с портом они будут синхронизироваться вместе с развёрткой, но, на них можно возложить задачу, позволяющую такое обращение.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Можно попробовать таблично под ассемблером отработать - тот алгоритм, что я для программной ШИМ-манипуляции под WS2812 сделал. С использованием команд косвенных переходов/вызовов подпрограмм (ICALL/IJMP) сразу по входу в прерывание. А у каждой комбинации "база + смещение", находящейся в Z на момент прихода вызова прерывания указан адрес соответствующего фрагмента к исполнению. У Си еще собственно загрузка/сброс стека, которую компилятор добавит (согласно своего разумения) - это может быть и весьма большой кусманчик кода (PUSH/POP)...
Заголовок сообщения: Re: Выкроить 4 такта в коде прерывания надо
Добавлено: Ср апр 04, 2018 18:17:59
Первый раз сказал Мяу!
Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Пт мар 07, 2014 18:37:20 Сообщений: 38 Откуда: Пермь
Рейтинг сообщения:0
Hsync я формировал таймером в режиме ШИМ, сразу и импульс на выводе есть. Перед синхроимпульсом процессор надо укладывать спать, что бы не было дрожания изображения.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения