PIC16C7x

8-битные микроконтроллеры PICmicro (ПИКи) от Microchip и совместимые, а также 16-битные PIC24 и 32-битные PIC32

Moderator: Shaos

User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

PIC16C7x

Post by HardWareMan »

Обвалилось мне кучка халявных PIC16C73. Машинки тупые, но достаточно быстрые. Я замутил на одном из них генератор кадровой развертки для новой схемы спеца_МХ, что я давал в соответствующем топике. Развертка переделана под SVGA, вот исходник:

Code: Select all

; 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...
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Не хотел создавать новую тему, поэтому, думаю, здесь большим оффтопом не будет...

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

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

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

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

Банально сэкономили в схемотехнике АЛУ? Кто знает точно?
iLavr
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

Но не это главное. Когда я изучал датащит на PIC16C7x я нашел, что у PIC16C74 есть т.н. PSP - Parallel Slave Port. Он и есть то, что было у контроллера клавы - одна ячейка памяти на шине i8080/Z80. У него даже прерывание есть. Но нету адресов, т.е. их надо защелкивать сразу. Если он успеет на чтении, при прерывании обработать адреса (дополнительные 2 линии на портах) и выдать нужный байт на свой PSP, то на нем можно будет замутить ответную часть для эмулятора клавиатуры с ВВ55м чипом. Например, обработка PS2 и собственно эмуляция ВВ55 можно задать на какой-нить проц поумнее, например AVR или MCS51, который по быстрому аурту будет гадить в пик а тот уже работать с шиной. Хотя, я даже не знаю, может и сам пик справится? Они такие примитивные, блин, даже после MCS48 и 6502...
зачем так сложно? скорости может не хватить. давай попробуем, как я раньше предлагал - оставить ВВ55 и прицепиться снаружи. там скорости поменьше ибо задержки на антидребезг
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:Не хотел создавать новую тему, поэтому, думаю, здесь большим оффтопом не будет...

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

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

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

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

Банально сэкономили в схемотехнике АЛУ? Кто знает точно?
Вроде так удобнее программировать, нет?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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

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

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

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