nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 11:47



Reply to topic  [ 5 posts ] 
PIC16C7x 
Author Message
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Обвалилось мне кучка халявных 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
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Не хотел создавать новую тему, поэтому, думаю, здесь большим оффтопом не будет...

А калбасит и плющит меня довольно долго вопрос вот какой.
В привычных системах команд мы имеем:

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
Profile
Retired
User avatar

Joined: 25 Jul 2011 00:14
Posts: 1331
Location: WWW
Reply with quote
Post 
Quote:
Но не это главное. Когда я изучал датащит на PIC16C7x я нашел, что у PIC16C74 есть т.н. PSP - Parallel Slave Port. Он и есть то, что было у контроллера клавы - одна ячейка памяти на шине i8080/Z80. У него даже прерывание есть. Но нету адресов, т.е. их надо защелкивать сразу. Если он успеет на чтении, при прерывании обработать адреса (дополнительные 2 линии на портах) и выдать нужный байт на свой PSP, то на нем можно будет замутить ответную часть для эмулятора клавиатуры с ВВ55м чипом. Например, обработка PS2 и собственно эмуляция ВВ55 можно задать на какой-нить проц поумнее, например AVR или MCS51, который по быстрому аурту будет гадить в пик а тот уже работать с шиной. Хотя, я даже не знаю, может и сам пик справится? Они такие примитивные, блин, даже после MCS48 и 6502...

зачем так сложно? скорости может не хватить. давай попробуем, как я раньше предлагал - оставить ВВ55 и прицепиться снаружи. там скорости поменьше ибо задержки на антидребезг


03 Jun 2012 01:39
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Post 
Lavr wrote:
Не хотел создавать новую тему, поэтому, думаю, здесь большим оффтопом не будет...

А калбасит и плющит меня довольно долго вопрос вот какой.
В привычных системах команд мы имеем:

ADD R - сложить аккумулятор и содержимое регистра R;
SUB R - вычесть из аккумулятора содержимое регистра R.

А у PIC-ов:
ADDWF f, d - сложить аккумулятор и содержимое файла f,
НО!!!
SUBWF f, d - вычесть из файла f содержимое аккумулятора!

Чисто из схемотехнических соображений подозреваю вот что:
вычесть из аккумулятора содержимое регистра R - надо
инвертировать R и СarryIN=1.
А если вычесть из файла f содержимое аккумулятора, то
f инвертировать не надо...

Банально сэкономили в схемотехнике АЛУ? Кто знает точно?


Вроде так удобнее программировать, нет?...

_________________
:dj: https://mastodon.social/@Shaos


03 Jun 2012 09:20
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Вроде так удобнее программировать, нет?...

Трудно сказать... со временем привык. Но сразу после 8080 это здорово сбивало с толку,
хотя на это и обращают внимание все справочники...

Мне всё же кажется, что не удобство программиста здесь не главное.
А собака зарыта в удобстве разработчика, упрощающем АЛУ...

Я честно прогуглил этот вопрос на 2-х языках, но ответа так и не нашел, почему это так.

Так что исхожу из аналогии: в MCS-48 операцию вычитания и вовсе убрали - как раз для
упрощения АЛУ. Но об этом и сказано всегда прямо.

_________________
iLavr


03 Jun 2012 10:28
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 5 posts ] 

Who is online

Users browsing this forum: No registered users and 5 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.