|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
|
Page 1 of 1
|
[ 5 posts ] |
|
Author |
Message |
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
Обвалилось мне кучка халявных PIC16C73. Машинки тупые, но достаточно быстрые. Я замутил на одном из них генератор кадровой развертки для новой схемы спеца_МХ, что я давал в соответствующем топике. Развертка переделана под SVGA, вот исходник:
| | | | Code: ; PIC16C73 LineL equ 0x20 ; Младший байт выходов (младшие 8 бит счетчика) LineH equ 0x21 ; Старший байт выходов (старший бит счетчика + VBlank+VSync) Mode equ 0x22 ; Режим Temp equ 0x23 ; Времянка ; #include p16c73.inc ; Выбор чипа org 0x000 ; Начало кода goto Start ; Переход на начало org 0x004 ; Вектор прерывания ; Прерывание bcf INTCON,INTF ; Подтвердим прерывание ; Первым делом выведем то, что есть (минимальные потери на реакцию) movf LineL,0 ; Младшую часть в W movwf PORTC ; Младшую часть на порт С movf LineH,0 ; Старшую часть в W movwf PORTA ; А старшую - на порт А ; Теперь смотрим режим movf Mode,0 ; Считаем Режим в W movwf Temp ; Сохраним значение счетчика incf Temp,1 ; Temp +1 decfsz Temp,1 ; Temp -1 goto Check0 ; Не 0 - пропускаем goto LowLoop ; У нас LowLoop Check0 decfsz Temp,1 ; Temp -1 goto Check1 ; Не 0 - пропускаем goto HighLoop ; У нас HighLoop Check1 decfsz Temp,1 ; Temp -1 goto Check2 ; Не 0 - пропускаем goto ExtraLoop ; У нас ExtraLoop Check2 movlw 0x0C ; Начальное состояние movwf LineH ; Выставим clrf LineL ; clrf Mode ; Режим =0 retfie ; Возврат из прерывания ; Выполняется первый круг (первые 256 строк растра) LowLoop incfsz LineL,1 ; Считаем до переполнения retfie ; Возврат из прерывания incf LineH,1 ; Следующий адрес incf Mode,1 ; Следующий режим retfie ; Возврат из прерывания ; Выполняется второй круг (вторые 256 строк растра) HighLoop incfsz LineL,1 ; Считаем до переполнения retfie ; Возврат из прерывания incf Mode,1 ; Следующий режим movlw 0x06 ; Активен VBlank movwf LineH ; Выставим retfie ; Возврат из прерывания ; Расширенные круг ExtraLoop incf LineL,1 ; Считаем дальше movf LineL,0 ; Считаем LineL в W movwf Temp ; Сохраним значение счетчика movlw 0x2B ; W=0x2D subwf Temp,1 ; Вычтем константу синхроимпульса decfsz Temp,1 ; Уже синхроимпульс? goto ExtraCont ; Нет - идем дальше movlw 0x12 ; Выставим синхроимпульс movwf LineH ; Выставим retfie ; Возврат из прерывания ExtraCont movf LineL,0 ; Считаем LineL в W movwf Temp ; Сохраним значение счетчика movlw 0x2F ; W=0x30 subwf Temp,1 ; Вычтем константу синхроимпульса decfsz Temp,1 ; Уже кончился синхроимпульс? goto ExtraExit ; Нет - идем дальше movlw 0x06 ; Выставим синхроимпульс movwf LineH ; Выставим retfie ; Возврат из прерывания ExtraExit movf LineL,0 ; Считаем LineL в W movwf Temp ; Сохраним значение счетчика movlw 0x73 ; W=0x73 subwf Temp,1 ; Вычтем константу выхода decfsz Temp,1 ; Уже выход? retfie ; Возврат из прерывания movlw 0x0C ; Вернем все на место movwf LineH ; Выставим clrf LineL ; Очистим счетчик clrf Mode ; Обнуляем режим retfie ; Возврат из прерывания ; Главный старт Start bcf STATUS,IRP ; Выберем банк 0 bcf STATUS,RP1 ; Выберем банк 0 bsf STATUS,RP0 ; Выберем банк 1 clrf TRISA ; Порт А на вывод clrf TRISC ; Порт С на вывод movlw 0xFF ; Значение 0xFF в W movwf TRISB ; Порт В на ввод movlw 0x80 ; Значение 0x80 в W movwf OPTION_REG ; Выставим опции bcf STATUS,RP0 ; Выберем банк 0 clrf PORTA ; Очистим порт А clrf PORTC ; Очистим порт С clrf W ; Очистим W movwf T1CON ; Отключим TIMER1 movlw 0x0C ; Начальное состояние movwf LineH ; Выставим clrf LineL ; clrf Mode ; Режим =0 bsf INTCON,INTE ; Установим прерывание bsf INTCON,GIE ; Включим их Loop sleep ; Спим goto Loop ; Крутим END ; Канец! ; | | | | |
Схема подключения такова: RC0-RC7 - это Y0-Y7, RA0-RA1 - это Y8-Y9, Y9 является позитивным импульсом гашения (развертка SVGA, 600 строк, поэтому Y0 не используется и строки двоятся), RA2 - это отрицательный VSync, RA3 - отрицательный VBlank, прямая инверсия Y9, а RA4 - инверсия RA2, т.е. положительный VSync. В качестве входа на RB0 подается HSync. Полный набор необходимых сигналов на одном чипе, кварц - 20МГц, можно тупо запитать от одного из поделенных сигналов линейки строчной развертки или к пиксельклоку привязать (для 800х600 он как раз выбран 20МГц, удвоение точек по горизонтали).
Но не это главное. Когда я изучал датащит на PIC16C7x я нашел, что у PIC16C74 есть т.н. PSP - Parallel Slave Port. Он и есть то, что было у контроллера клавы - одна ячейка памяти на шине i8080/Z80. У него даже прерывание есть. Но нету адресов, т.е. их надо защелкивать сразу. Если он успеет на чтении, при прерывании обработать адреса (дополнительные 2 линии на портах) и выдать нужный байт на свой PSP, то на нем можно будет замутить ответную часть для эмулятора клавиатуры с ВВ55м чипом. Например, обработка PS2 и собственно эмуляция ВВ55 можно задать на какой-нить проц поумнее, например AVR или MCS51, который по быстрому аурту будет гадить в пик а тот уже работать с шиной. Хотя, я даже не знаю, может и сам пик справится? Они такие примитивные, блин, даже после MCS48 и 6502...
|
12 Nov 2009 04:06 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Не хотел создавать новую тему, поэтому, думаю, здесь большим оффтопом не будет...
А калбасит и плющит меня довольно долго вопрос вот какой.
В привычных системах команд мы имеем:
ADD R - сложить аккумулятор и содержимое регистра R;
SUB R - вычесть из аккумулятора содержимое регистра R.
А у PIC-ов:
ADDWF f, d - сложить аккумулятор и содержимое файла f,
НО!!!
SUBWF f, d - вычесть из файла f содержимое аккумулятора!
Чисто из схемотехнических соображений подозреваю вот что:
вычесть из аккумулятора содержимое регистра R - надо
инвертировать R и СarryIN=1.
А если вычесть из файла f содержимое аккумулятора, то
f инвертировать не надо...
Банально сэкономили в схемотехнике АЛУ? Кто знает точно?
_________________ iLavr
|
30 May 2012 12:10 |
|
|
MC68k
Retired
Joined: 25 Jul 2011 00:14 Posts: 1331 Location: WWW
|
| | | | Quote: Но не это главное. Когда я изучал датащит на PIC16C7x я нашел, что у PIC16C74 есть т.н. PSP - Parallel Slave Port. Он и есть то, что было у контроллера клавы - одна ячейка памяти на шине i8080/Z80. У него даже прерывание есть. Но нету адресов, т.е. их надо защелкивать сразу. Если он успеет на чтении, при прерывании обработать адреса (дополнительные 2 линии на портах) и выдать нужный байт на свой PSP, то на нем можно будет замутить ответную часть для эмулятора клавиатуры с ВВ55м чипом. Например, обработка PS2 и собственно эмуляция ВВ55 можно задать на какой-нить проц поумнее, например AVR или MCS51, который по быстрому аурту будет гадить в пик а тот уже работать с шиной. Хотя, я даже не знаю, может и сам пик справится? Они такие примитивные, блин, даже после MCS48 и 6502... | | | | |
зачем так сложно? скорости может не хватить. давай попробуем, как я раньше предлагал - оставить ВВ55 и прицепиться снаружи. там скорости поменьше ибо задержки на антидребезг
|
03 Jun 2012 01:39 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
|
Вроде так удобнее программировать, нет?...
|
03 Jun 2012 09:20 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Трудно сказать... со временем привык. Но сразу после 8080 это здорово сбивало с толку,
хотя на это и обращают внимание все справочники...
Мне всё же кажется, что не удобство программиста здесь не главное.
А собака зарыта в удобстве разработчика, упрощающем АЛУ...
Я честно прогуглил этот вопрос на 2-х языках, но ответа так и не нашел, почему это так.
Так что исхожу из аналогии: в MCS-48 операцию вычитания и вовсе убрали - как раз для
упрощения АЛУ. Но об этом и сказано всегда прямо.
_________________ iLavr
|
03 Jun 2012 10:28 |
|
|
|
Page 1 of 1
|
[ 5 posts ] |
|
Who is online |
Users browsing this forum: No registered users and 4 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|