Пропорциональное управление на МК (Знание=Сила)

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

аа, ну да, согласен, умножение и деление ведь выполняются слева на право :-)

скобки нужны конечно...
Реклама
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

:)

на 15 ноге висит клавиатура у меня - нужно переделать схему подключения!
за одно обрати внимание, что у меня при нажатии генерится "1"
Ты говорил что должен генерится "0" может это тоже стоит переделать ???
не зная броду не лезь к вольтмоду
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

uwrtey писал(а):
Что у тебя на ней висит?
http://radiokot.ru/forum/download/file.php?id=90498
- клавиатура :oops: (надо переделать...)
перекинь с Pb0..Pb3 на Pb4..Pb7...

ну и ждем'c исправленный код чтения клавиатуры... :-)
(заодно посмотрим как ты усвоил прежний урок)

по поводу 0 или 1 - это пофигу..

для твоего решения даже наверное 1 лучше :-)

вообще я не люблю матричные клавиатуры - не получается на них нормально несколько нажатых кнопок отрабатывать :-(

кстати по выходным линиям я бы вместо резюков на 100 ом поставил диоды !! так как в матричной клаве могут быть неприятные сюрпризы при нажатии нескольких кнопок одновременно

а вот если одиночные кнопки (1 кнопка на 1 пин порта) то лучше включать внутренний подтягивающий резистор и все ! никаких внешних больше не нужно, кнопка (ну или выключатель) одной ногой на порт, другой на землю..
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

а вот если одиночные кнопки (1 кнопка на 1 пин порта) то лучше включать внутренний подтягивающий резистор и все ! никаких внешних больше не нужно, кнопка (ну или выключатель) одной ногой на порт, другой на землю..
у меня ног не хватит ! :) (надо атмегу 64 тогда юзать)
не зная броду не лезь к вольтмоду
Реклама
Эиком - электронные компоненты и радиодетали
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

может быть тогда сделать выходным Port D ?

там то все линии свободны !
а входным сделать PORT B

причем PB3 оставить для генерации
PB0 - сделать выходным для передатчика
а PB4..PB7 - это входные линии клавиатуры
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

uwrtey писал(а): у меня ног не хватит ! :) (надо атмегу 64 тогда юзать)
нее, просто нужно делать интеллектуальный пульт управления.. с дисплеем и навигацией по меню :-)))
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

кстати, резет у тебя на схеме к земле через резюк 100 ом прижат !!
так точно работать тинька небудет !!

нужно килоом 10 резюк, и к плюсу питания !!!!
исправь обязательно !
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

ок, правлю.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

ок, я спать.. а то у нас уже час ночи... :-)

с тебя
1. новая схема (исправить порты, вместо резюков у выходного порта клавы диоды, и по резет подтяжку на питание через резюк в 10 ком)

2. новый код чтения клавиатуры

3. почитай про таймер T1, регистры TCCR1A и TCCR1B. накидай пока свою конфигурацию, а я завтра утром прокоментирую - и поправлю до верной...

кстати про таймеры неплохо DI HALT писал на easyelectronics.ru (в учебном курсе AVR)

и помоему на microcontroller.ru я видел чтото вроде переведенного даташита по таймерам - тоже хороший справочник.

и вот еще http://eugenemcu.ru/publ/5-1-0-49

в общем ссылок много, задай в яндексе или гугле и вперед !!

еще раз повторю нам нужен режим CTC, top=OCR1A
Последний раз редактировалось ВитГо Ср авг 22, 2012 22:09:52, всего редактировалось 2 раза.
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

У нас тоже час :) Спокойной Ночи, спасибо, ВитГо.
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

вот схему накидал
1.jpg
(159.54 КБ) 597 скачиваний
СпойлерИзображение
Правила читаем?
ploop
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

настройка портов естественно изменилась...

Код: Выделить всё


.DSEG
key_buffer:	.byte 5			; зарезервируем 5 байт в ОЗУ


;************************************************************************


keyboardread:            
	ldi temp,5		                 	; количество столбцов клавы = пять
         
	ldi R17,0b00000001	           	; первый столбец

          				             ; загружаем адрес метки (key_buffer) находящейся в ОЗУ в регистровую пару X
	ldi XL,low (key_buffer)		; младший байт адреса
	ldi XH,high(key_buffer)		; старший байт адреса

keyboardread_loop:			; цикл опроса

	out PortD,R17			; выводим в порт "Д" значение "R17" для выбора столбца клавиатуры
	in R18,PinB			; прочитали состояние столбца
         
	st X+,R18			; сохраним в ОЗУ состояние столбца клавы, 
 					; адрес в регстровой паре "X" автоматом увеличится на 1

	lsl R17				; сдвинули единичку выбора столбца клавиатуры на 1
 					; позицию влево

	dec temp			; уменьшим счетчик
	brne keyboardread_loop		; если не все просканировали, то циклимся
       
	ret				; возврат из подпрограммы 
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

с таймерами и прерываниями вроде все понятно - код будет следующим вечером
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

хорошо.
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

:write: пишу ))), Усердно....
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

что то не получается написать цикл обработки прерывания....
вот наработки
Спойлер

Код: Выделить всё

/*
 * _147.asm
 *
 *  Created: 24.08.2012 00:12:55
 *   Author: UWRTEY
 */ 

 ;.include "d:\avr\avrasm\appnotes\attyny2313def.inc"


	.def	Temp=R16
	.def	Temp1=R17
	.def	Temp2=R18
	.def	Temp3=R19
	.def	Temp4=R20
	.def	Temp5=R21
	.def	Temp6=R22
	.def	Temp7=R23
	.def	Temp8=R24
	.def	Temp9=R25


.dseg		;оперативка

key_buff: .byte 5	; зарезервируем 5 байт в ОЗУ


;******************************************************************************
;******************************************************************************

.cseg
.org 0



rjmp RESET	; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
rjmp INT0	; External Interrupt Request 0
rjmp INT1	; External Interrupt Request 1
rjmp TIMER1	; CAPT Timer/Counter1 Capture Event
rjmp TIMER1	; COMPA Timer/Counter1 Compare Match A
rjmp TIMER1	; OVF Timer/Counter1 Overflow
rjmp TIMER0	; OVF Timer/Counter0 Overflow
rjmp USART0	; RX USART0, Rx Complete
rjmp USART0	; UDRE USART0 Data Register Empty
rjmp USART0	; TX USART0, Tx Complete
rjmp ANALOG	; COMP Analog Comparator
rjmp PCINT	; Pin Change Interrupt
rjmp TIMER1	; COMPB Timer/Counter1 Compare Match B
rjmp TIMER0	; COMPA Timer/Counter0 Compare Match A
rjmp TIMER0	; COMPB Timer/Counter0 Compare Match B
rjmp USI	; START USI Start Condition
rjmp USI	; OVERFLOW USI Overflow
rjmp EE		; READY EEPROM Ready
rjmp WDT	; OVERFLOW Watchdog Timer Overflow




;RESET:		; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset//// 
INT0:		; External Interrupt Request 0
INT1:		; External Interrupt Request 1
TIMER1:		; CAPT Timer/Counter1 Capture Event
;TIMER1:	; COMPA Timer/Counter1 Compare Match A/////////////////////////////////
TIMER1:		; OVF Timer/Counter1 Overflow
TIMER0:		; OVF Timer/Counter0 Overflow
USART0:		; RX USART0, Rx Complete
USART0:		; UDRE USART0 Data Register Empty
USART0:		; TX USART0, Tx Complete
ANALOG:		; COMP Analog Comparator
PCINT:		; Pin Change Interrupt
TIMER1:		; COMPB Timer/Counter1 Compare Match B
TIMER0:		; COMPA Timer/Counter0 Compare Match A
TIMER0:		; COMPB Timer/Counter0 Compare Match B
USI:		; START USI Start Condition
USI:		; OVERFLOW USI Overflow
EE:		; READY EEPROM Ready
WDT:		; OVERFLOW Watchdog Timer Overflow

reti		; выход из обраьотчика прерываний

;******************************************************************************





;******************************************************************************
;инициализация стека
;******************************************************************************

reset:			;включение микроконтроллера


ldi Temp,0b01000000	;разрешить прерывание компаратора
out TIMSK,Temp


ldi Temp,0b00000001	;тактовый сигнал = CK (1:1)
out TCCR1B,Temp

			; инициализация компаратора
ldi Temp,0xC		; 3кГц,  1/3000=0,00033сек=330мкс,   330/2=165мкс длительность импульса или паузы
out OCR1AH,Temp		; 0,05мкс*65535=3276,75    3276,75>165 --- по этому не будем делить тактовую частоту (СК)
ldi Temp,0xE4		; 165мкс/0,05мкс=3300 тиков таймера  3300=CE4(hex)   
out OCR1AL,Temp		;


ldi Temp,0		;обнуление таймера при включении
out TCNT1H,Temp
out TCNT1L,Temp



ldi Temp,RamEnd		;еще один вариант записи	ldi temp, low(Ramend)
out SPL,Temp		;инициализации стека		out SPL, temp


cei			;глобальное разрешение прерываний
        
;******************************************************************************





;*******************************************************************************
;настройка портов
;*******************************************************************************

ldi Temp,0b11110000
out DDRB,Temp           ;настроили порт "В" 
			;х0000000 - вывод на передатчик
			;00Х00000 - ДЛЯ ГЕНЕРАЦИИ (НЕ ЗНАЮ ЧТО ДЕЛАТЬ - ВЫХОД ИЛИ ВХОД)
			;0000хххх - для чтения клавиатуры



ldi Temp,0b01111111
out DDRD,Temp 		;настраиваем порт "D" на вывод(запись)(0-ввод, 1-вывод)
			;но не весь, а только шесть млажших бит (PD0-PD5)
			;к которым прицеплены четыре столбца клавиатуры
			;и остальные настроил на вывод, для того что бы 
			;при их чтении получит не чёрте-че, а четкий ноль
			;*только самый старши бит настроен на ВВОД (потому что в порте "D" отсутсвует эта нога)



;*******************************************************************************
; Чтение клавы и запись данных в ОЗУ
;*******************************************************************************

keyboardreed:				;метка - опрос клавиатуры

          
	ldi Temp,5			; количество столбцов клавы = пять
         
	ldi Temp1,0b00000001		; первый столбец

          				; загружаем адрес метки (key_buff) находящейся в ОЗУ в регистровую пару X
	ldi XL,low(key_buff)		; младший байт адреса
	ldi XH,high(key_buff)		; старший байт адреса

keyboardread_loop:			; цикл опроса

	out PortD,Temp1			; выводим в порт "Д" значение "Temp1" для выбора столбца клавиатуры
	in Temp2,PinB			; прочитали состояние столбца
         
	st X+,Temp2			; сохраним в ОЗУ состояние столбца клавы, 
 					; адрес в регстровой паре "X" автоматом увеличится на 1

	lsl Temp1			; сдвинули единичку выбора столбца клавиатуры на 1
 					; позицию влево

	dec temp			; уменьшим счетчик
	brne keyboardread_loop		; если не все просканировали, то циклимся

       


	rjamp keyboardreed		; зациклились бесконечно опрашивать клаву и перезаписывать данные




;*********************************************************************************
;ОБРАБОТКА ПРЕРЫВАНИЯ////////
;*********************************************************************************

TIMER1:

	ldi Temp,0			;обнуление таймера
	out TCNT1H,Temp
	out TCNT1L,Temp


	.......

reti


не могу.asm
(5.59 КБ) 289 скачиваний
я конечно же попробую довести его до ума......
Последний раз редактировалось uwrtey Пт авг 24, 2012 05:12:31, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение uwrtey »

получается что то вроде

Код: Выделить всё


TIMER1:

	ldi Temp,0			;обнуление таймера
	out TCNT1H,Temp
	out TCNT1L,Temp


out_dat:

	Ldi ZL,Low(key_buff)		; загрузили в регистровую пару "Z" адресс метки "key_buff" (массива из ОЗУ)
	Ldi ZH,High(key_buff)


	Ld Temp1,Z+			; загрузили в регистр "Temp1" данные из ОЗУ, по адресу из регистровой пары "Z" 
					; адресс автоматически увеличился на еденицу
а дальше...... :dont_know:
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

не спеши!

для начала нужно проинитить счетчик!

оо, кстати по написанию кода:
на всех форумах программистов что я видел не приветствуется код вида

Код: Выделить всё

ldi Temp,0b01000000   ;разрешить прерывание компаратора
out TIMSK,Temp
потому что без даташита нифига не понятно что за бит ты установил в TIMSK
и могут даже не помочь (потому как лазать по даташиту с нуля как то геморойно)

нужно: посмотреть в даташите как называется пин разрешения прерывания (в нашем случае это OCIE1A), в .inc файле что ты вначале инклудишь он будет описан как:
.equ OCIE1A = 6 ; Timer/Counter1 Output CompareA Match Interrupt Enable
то есть константе OCIE1A ему уже присвоен номер бита который нужно установить в порту

чтобы получить "1" в нужном разряде применяется левый сдвиг выполняемый компилятором

1 (единица =0b00000001) << (сдвинуть влево) OCIE1A (6 раз)
то есть (1<<OCIE1A)

написать нужно вот так :

Код: Выделить всё

ldi Temp, (1<<OCIE1A)  ;разрешить прерывание компаратора
out TIMSK,Temp
если нужно несколько бит установить то применяется "|" то есть так: (1<<OCIE1A)|(1<<OCIE1B)

естественно это касается только установки в "1", в "0" ничего не устанавливаем

зачем это нужно ?

причину 1 я уже указал: банально код лучше читается - сразу понятно какое прерывание разрешили (без залезания в даташит)

причина 2 в меге32 например бит OCIE1A = 4 :-) следовательно захотим мы перенести наш код на другой контроллер - работы будет в разы меньше (фактически в
даташите мы только проверим чтобы бит OCIE1A был в том же регистре TIMSK, а все остальное будет компилироваться правильно)

подпричина 2 причины 2: у меня есть отладочная плата (pinboard) и я на меге16 чаще всего пишу код, и потом изменив только определение контроллера компилирую рабочий протестированный на меге16 код в туже тиньку2313 или мегу 8 (была у меня парочка маленьких проектов)


по тому что ты ночью написал:
я просил проинициализировать таймер Т1
это регистры TCCR1A TCCR1B TCNT1 OCR1A TIMSK
их все нужно инитить!

еще одно замечание:
сначала мы инитим все регистры, а потом разрешаем прерывания

и вопрос: после какого действия инициализации счетчик Т1 начинает считать?

p.s. прерывание писать еще рано :-)
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

по таблице прерываний:

как то у тебя длинно, и сложно она написана

проще будет так
Спойлер

Код: Выделить всё

 ;.include "d:\avr\avrasm\appnotes\attyny2313def.inc"

   .def   Temp=R16
   .def   Temp1=R17
   .def   Temp2=R18
   .def   Temp3=R19
   .def   Temp4=R20
   .def   Temp5=R21
   .def   Temp6=R22
   .def   Temp7=R23
   .def   Temp8=R24
   .def   Temp9=R25


.dseg      ;оперативка

key_buff: .byte 5   ; зарезервируем 5 байт в ОЗУ


;******************************************************************************
;******************************************************************************

.cseg
.org 0
rjmp RESET ; ну или START - как тебе приятнее :-)

.org	INT0addr	; 0x0001	; External Interrupt Request 0
reti
.org	INT1addr	; 0x0002	; External Interrupt Request 1
reti
.org	ICP1addr	; 0x0003	; Timer/Counter1 Capture Event
reti
.org	OC1Aaddr	; 0x0004	; Timer/Counter1 Compare Match A
reti
.org	OC1addr	; 0x0004	; For compatibility
reti
.org	OVF1addr	; 0x0005	; Timer/Counter1 Overflow
reti
.org	OVF0addr	; 0x0006	; Timer/Counter0 Overflow
reti
.org	URXCaddr	; 0x0007	; USART, Rx Complete
reti
.org	URXC0addr ; 0x0007	; For compatibility
reti
.org	UDREaddr	; 0x0008	; USART Data Register Empty
reti
.org	UDRE0addr	; 0x0008	; For compatibility
reti
.org	UTXCaddr ; 0x0009	; USART, Tx Complete
reti
.org	UTXC0addr	; 0x0009	; For compatibility
reti
.org	ACIaddr	; 0x000a	; Analog Comparator
reti
.org	PCIBaddr	;  0x000b	; Pin Change Interrupt Request B
reti
.org	PCIaddr	; 0x000b	; For compatibility
reti
.org	OC1Baddr	;  0x000c	; 
reti
.org	OC0Aaddr	;  0x000d	; 
reti
.org	OC0Baddr	;  0x000e	; 
reti
.org	USI_STARTaddr	; 0x000f	; USI Start Condition
reti
.org	USI_OVFaddr	; 0x0010	; USI Overflow
reti
.org	ERDYaddr	; 0x0011	; 
reti
.org	WDTaddr	; 0x0012	; Watchdog Timer Overflow
reti
.org	PCIAaddr	; 0x0013	; Pin Change Interrupt Request A
reti
.org	PCIDaddr	; 0x0014	; Pin Change Interrupt Request D
reti

команда компилятора .org помещает следующий за ней код по адресу
метки адресов (типа PCIDaddr, OC1Aaddr ну в общем всех) указаны в inс файле
по адресу если прерывание не используется сразу ставим RETI (возврат из прерывания)
если прерывание используется то ставим RJMP и нужную нам метку процедуры обработчика прерываний

далее,
задавать все регистры как temp1, temp2, temp3... тоже смысла не имеет, тогда уж оставь R16 R17 R18 .. - меньше кнопочек на клавиатуре нажимать придется :-)
если же хочешь сделать читабельно и красиво то называть нужно по функциям каждый регистр:

Код: Выделить всё

   .def   Temp=R16    ; это временный регистр для операций
   .def   loopCount=R17   ; счетчик циклов
   .def   bitPointer=R18      ; битовый указатель
опять таки кнопочек на клавиатуре придется нажимать много.. с другой стороны код более понятен будет...

кстати в какой программе собираешься писать ?
inc файла attiny2313.inc например в avr studio нет, есть tn2313Adef.inc
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Re: Пропорциональное управление на МК (Знание=Сила)

Сообщение ВитГо »

по инициализации:

давай так:

первым делом после сброса мы запрещаем прерывания контроллера, почему то в примерах по avr так не пишут, хотя в давние времена когда правили бал i8080 и z80 программа всегда начиналась с запрещения прерываний (ну причина конечно есть, сейчас после сброса в avr сбрасываются все включенные прерывания, но вот на случай если выполнен не аппаратный сброс а переход на адрес 0 - прерывания лучше все таки выключить вручную)

Код: Выделить всё

RESET:
                     cli    ; запретили прерывания
далее, мы инитим стек !! не стоит это откладывать на долго, потому как до инициализации стека ты не можешь использовать RCALL и прерывания

Код: Выделить всё

             LDI temp, low(ramend)
             out spl, temp
причем помним что SP обычно двубайтовый регистр, и только в контроллерах с памятью 256 или меньше байт однобайтовый ! (это если вдруг захочешь перейти на что нить типа мег - у них памяти от 512 байт, следовательно нужно будет инитить и SPL и SPH)

потом инитим ВСЕ линии портов

Код: Выделить всё

ldi Temp,0b10000000
out DDRB,Temp           ;настроили порт "В"
         ;х0000000 - выход  на передатчик
         ;0000хххх - вход    чтения клавиатуры



ldi Temp,0b00011111
out DDRD,Temp       ;настраиваем порт "D" на вывод(запись)(0-ввод, 1-вывод), 5 младших линий на выход (линии клавиатуры)

и только потом настраиваем встроенные устройства контроллера: счетчики, компараторы, АЦП и так далее
Ответить

Вернуться в «Периферия»