Продолжаю мучить 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: может прокатит, а может и нет...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Заголовок сообщения: 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 я формировал таймером в режиме ШИМ, сразу и импульс на выводе есть. Перед синхроимпульсом процессор надо укладывать спать, что бы не было дрожания изображения.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения