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

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

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

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

uwrtey писал(а):сейчас еще попробую один вариант............ :write:
.....
и вот что получилось...
пока пойдет...

теперь нужно написать процедуру отправки..

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

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

Сообщение uwrtey »

ВитГо писал(а):до ppm позже дейдем
:beer: спасибо ВитГо :beer:
не зная броду не лезь к вольтмоду
Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

Подскажите какого художника у меня на одно нажатие кнопки пуьта происходит 6 прерываний?и всегда разные значения?
И вообще я правильно программу написал(уже пол месяца разбираюсь,даже комп с микриком соединил :cry: )?
Возможно изза частоты,ну если сомпом правильно соединяется значит фьюзы правильно проставил.Внизу фотка на нажатие одной кнопки.


.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list

;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;
.def temp2 =r19;
.def temp1=r20;

.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1


.org 0x000
rjmp init;

.org 0x0001
rjmp preriv; настраиваем прерывание PCINTo



zapoln:
ldi delay,0x05;
ldi delay1,0x01;
loop:
subi delay,1;
sbci delay1,0;
brcc loop;
ret



init:

ldi temp,0b11111111;
out DDRB,temp;
ldi temp,0b11111111;
out DDRc,temp;
ldi temp,0b00110010;
out DDRD,temp;

; начало инициализации USART
; скорость передачи даных 9600бод при частоте кварца 8МГц
ldi r17,low(bauddivider);
ldi temp,high(bauddivider);
sts UBRR0L,r17;
sts UBRR0H,temp;


ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;


;НАСТРОЙКА USRA правильно
;настройка USRA
LDI temp,0;
sts UCSR0A, temp; сбрасываем все флаги
ldi temp,(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UCSZ02)
sts UCSR0B,temp ; разрешение приемо-передачи данных, запрет прерываний
; установка формата кадра: 8 бит данных, 1 стоповых бита
ldi temp,(0<<UMSEL01)|(0<<UMSEL00)|(0<<USBS0)|(1<<ucsz01) | (1<<ucsz00)
sts UCSR0C,temp ; посилка даных длинной 8 бит



;прерывание по INTO
ldi temp,0b00000001 ;устанавливаем контроль
out EIMSK,temp; ; прирывания на PCINT0-7
ldi temp,0b00000000;
sts EICRA,temp;
ldi temp,0b00000001 ;
sts EIfr,temp;

sei;



start:

sei;
nop;
nop;

rjmp start;



preriv:
cli;
clr temp;
clr r19;
clr r20;
pol:
ldi delay,0x70;производим задержку в 1/4 импульса
ldi delay1,0x00;
polovina:
subi delay,1;
sbci delay1,0;
brcc polovina;




;Суть temp считает 14 циклов и записываются в r19 r20
sudi2:


inc temp;
rcall zapoln2;

sbis pind,2;проверяем портB,0 бит
rjmp nol;
sbr r20,1;если 1 то устанавливаем на R18 1
rjmp nol1;
nol:
cbr r20,1;если 1 то устанавливаем на R18 1
nol1:

lsl r20;просто сдвиг
rol r19; вот тут происходит запись в r19 в итоге 5 бит в r20 8 бит.


cpi temp,13;нужны только последние 7 битов
brlo sudi2;





sts UDR0,r19 ;вывод значений в ПК
rcall USART_Transmit;
sts UDR0,r20
rcall USART_Transmit;
clr r22;Это я добавил 0 чтобы отличать команды
sts UDR0,r22
rcall USART_Transmit;




reti


zapoln2:
ldi delay,0xb5;
ldi delay1,0x01;
loop2:
subi delay,1;
sbci delay1,0;
brcc loop2;
ret



USART_Transmit:
lds temp,UCSR0A;
sbrs temp,5 ;ожидание, пока буфер данных не очистится
rjmp USART_Transmit;
ret
Вложения
Безымянный.GIF
(44.02 КБ) 423 скачивания
Последний раз редактировалось спящий Чт сен 06, 2012 16:11:49, всего редактировалось 1 раз.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

сообщение для uwrtey

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

при входе в прерывание мы сохраняем на стек те регистры значение которых измениться в прерывании

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

push R16
push R17

; здесь можем использовать R16  и R17 в своей подпрограмме обработчике прерывания
pop  R17
pop  R16
reti
обращаю внимание на порядок сохранения и восстановления регистров !!!
стек у нас организован как обойма в пистолете - при выполнении первой команды
push R16

на стеке будет
"значение регистра R16" <--- указатель стека

при выполнении второй команды (push R17) данные на стеке будут расположены так
"значение регистра R16"
"значение регистра R17" <--- указатель стека

если сейчас прочитать значение со стека командой pop то прочитано будет не первое записанное "значение регистра R16", а значение "значение регистра R17" на которое указывает указатель стека...

соответственно правильная комбинация сохранения\восстановления группы регистров выглядит так:

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

push R16
push R17
push R18
push R19

pop R19
pop R18
pop R17
pop R16
и например вот так не правильно:

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

push R16
push R17
push R18
push R19

pop R16
pop R17
pop R18
pop R19
далее,
у процессора есть очень важный регистр флагов SREG
его тоже нужно сохранять в прерывании, для этого существует такая конструкция:

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

push  R16  ; сохраним значение регистра R16 на стеке
in R16 , SREG ; прочитаем значение регистра SREG
push R16 ; сохранили значение SREG
восстановление:

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

pop  R16  ; прочитаем значение SREG
out SREG ,  R16 ; запишем значение регистра SREG
pop R16 ; прочитаем значение SREG
модифицируй процедуру нашего прерывания чтобы оно не портило регистры основной программы
Последний раз редактировалось ВитГо Чт сен 06, 2012 16:38:34, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

спящий писал(а):Подскажите какого художника у меня на одно нажатие кнопки пуьта происходит 6 прерываний?и всегда разные значения?
.org 0x000
rjmp init;

.org 0x0001
rjmp preriv; настраиваем прерывание PCINTo
вектор прерывания задан правильно ? укажите лучше константу из файла .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
так не ошибетесь на полкопейки
спящий писал(а):
ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;
код инициализирующий стек обычно выполняют в самом начале.. и поверьте не зря..
по ваему коду это вроде бы не должно влиять на программу, но кто его знает - ведь программа не работает..
спящий писал(а):
;прерывание по INTO
ldi temp,0b00000001 ;устанавливаем контроль
out EIMSK,temp; ; прирывания на PCINT0-7
ldi temp,0b00000000;
sts EICRA,temp;
ldi temp,0b00000001 ;
sts EIfr,temp;
я не телепат :-( не понимаю что записывается в эти регистры ( а как раз они отвечают за прерывание по int 1\int 0
перепишите с использованием констант заголовочного файла как это было сделано вами для настройки USRA
спящий писал(а): start:

sei;
nop;
nop;

rjmp start;
прикольная конструкция, но лучше так написать

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

 sei;

start:
   rjmp start;

спящий писал(а): preriv:
cli;
это лишнее, при входе в прерывание процессор сам запрещает все прерывания
уберите

жду расшифровки вашей настройки прерываний int 0 \ int 1 потом можно будет о чем то думать
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

для спящий

смотрите конфигурацию по EICRA

вам нужно не статичное: низкий уровень для прерывания (значение 0х00)

а что нить вроде
-(1<<ISC00) - любое изменение генерит прерывание (тогда будет 2 раза: при нажатии на кнопку и при отпускании)
-(1<<ISC01) - будет работать на нажатие кнопки
-(1<<ISC01)|(1<<ISC00) - будет работать на отпускание кнопки

думаю так..

ааа, еще по коду нужно бы подтянуть сигнальный int 0 к +5 через внутренний pull-up

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

ldi R16, 0x00000100
out PortD, R16
кнопку соответственно на землю замыкать

и кстати помоему этот код тоже лишний

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

ldi temp,0b00000001 ;
sts EIfr,temp;
EIFR - это флаговый регистр, по нему прерывание генериться (если разрешено)...
его биты обычно сбрасывают до того как прерывания разрешают, а не устанавливают...

в общем надеюсь что решил вашу задачку :-)
Реклама
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

Непомогло :cry: Подправил код для читабельности.Убрал из прерывания передачу,передача занимает много время - видимо изза этогои 6 прерываний) Проблема в том что код кнопки почти для всех одинаков(что для1 ,что для 5 и т.д.)
Время(1\4периода,период) я подгонял в протеусе может быть в этом косяк?
У меня и вертуал терминал,косячные цифры выдавал,а на железе норм.
Скинул полностью проект,посмотрите может неправильно настройки контроллера там поставил?

.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list



;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;


.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1




.org 0x000
rjmp init;

.org 0x0001
rjmp preriv; настраиваем прерывание INTo


ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;



rjmp init;

zapoln:
ldi delay,0x05;
ldi delay1,0x01;
loop:
subi delay,1;
sbci delay1,0;
brcc loop;
ret



init:

ldi temp,0b11111111;
out DDRB,temp;
ldi temp,0b11111111;
out DDRc,temp;
ldi temp,0b00110010;
out DDRD,temp;


; начало инициализации USART
; скорость передачи даных 9600бод при частоте кварца 8МГц
ldi r17,low(bauddivider);
ldi temp,high(bauddivider);
sts UBRR0L,r17;
sts UBRR0H,temp;




;настройка USRA
LDI temp,0;
sts UCSR0A, temp; сбрасываем все флаги
ldi temp,(1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<TXCIE0)|(0<<UCSZ02)
sts UCSR0B,temp ; разрешение приемо-передачи данных, запрет прерываний
; установка формата кадра: 8 бит данных, 1 стоповых бита
ldi temp,(0<<UMSEL01)|(0<<UMSEL00)|(0<<USBS0)|(1<<ucsz01) | (1<<ucsz00)
sts UCSR0C,temp ; посилка даных длинной 8 бит



;прерывание по INTO
ldi temp,(1<<int0) ;int0
out EIMSK,temp; ;
ldi temp,(0<<isc00)|(1<<isc01); по спадающему фронту
sts EICRA,temp;

LDI temp,0b00000100;
out PortD,temp;
sei;



start:


sts UDR0,r19 ; этот код мы будим пересылать в ПК
rcall USART_Transmit;
sts UDR0,r20
rcall USART_Transmit;


rjmp start;



preriv:

clr temp;
clr r19;
clr r20;
pol:
ldi delay,0x70;производим задержку в 1/4 импульса
ldi delay1,0x00;
polovina:
subi delay,1;
sbci delay1,0;
brcc polovina;



sudi2:


inc temp;
rcall zapoln2;

sbis pind,2;проверяем портB,0 бит
rjmp nol;
sbr r20,1;если 1 то устанавливаем на R18 1
rjmp nol1;
nol:
cbr r20,1;если 1 то устанавливаем на R18 1
nol1:

lsl r20;просто сдвиг
rol r19

cpi temp,13;нужны только последние 7 битов
brlo sudi2;




reti


zapoln2:
ldi delay,0xb5;
ldi delay1,0x01;
loop2:
subi delay,1;
sbci delay1,0;
brcc loop2;
ret



USART_Transmit:
lds temp,UCSR0A;
sbrs temp,5 ;ожидание, пока буфер данных не очистится
rjmp USART_Transmit;
ret
Вложения
Новая папка.rar
(21.07 КБ) 173 скачивания
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

а можно сакраментальный вопрос, еще раз: что программа делать то должна ?

я не понимаю что вы передаете в главном цикле

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

						sei

start:

						sts UDR0,r19           ; этот код мы будим пересылать в ПК
						rcall USART_Transmit;

						sts UDR0,r20  
						rcall USART_Transmit;

						rjmp start;
и тем более не понимаю ваших пауз "в 1\4 импульса"... на асме так не пишут

остальной код к сожалению тоже понять не могу.. что в прерывании можно сохранять в R19. R20 если вы только устанавливаете один бит у R20 и двигаете влево ?
вы хотите считать сколько раз нажали кнопку ?
или решили так считать длительность захваченного импульса ?
что первое что второе таким образом не посчитаете... вернее посчитать то можно, но такой геморрой с таким решением, что слов нет...

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

когда это заработает (а в принципе должно заработать), нужно читать про счетчики, про 16ти битные, Т1, у него есть режим захвата..
либо можно сделать примерно как у вас, но длительность импульса определять по счетчику...
в общем это будет наверное даже проще чем то что вы написали.... потому что у вас уже в коде 3 каких то хитрых задержки, которые одновременно с этим не гарантируют правильной работы кода :-(

-закомментировал лишнее в проекте
-отформатировал (кстати, неужели вам нравиться как выглядит ваш код ? в нем итак не просто все построено, так еще и форматирование мозг выносит!)
-вставил инициализацию стека в код инициализации (а то вы поместили ее не понятно куда.. он не выполнился бы никогда)
http://vg.ucoz.ru/temp/pro1.zip

жду ваших комментарий по предполагаемому функционалу кода..

кстати а почему принимаете именно 13 бит ? какой-то формат ?
Последний раз редактировалось ВитГо Чт сен 06, 2012 22:10:28, всего редактировалось 1 раз.
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

ВитГо писал(а):когда процессор переходит в прерывание мы за редким случаем не знаем какую часть программы мы прервали и что находится в рабочих регистрах, вполне возможно что там важная информация - и мы работая в прерывании ее просто потеряем.
об этом я уже говорил
uwrtey писал(а):Прерывание может произойти в любой момент - когда опрашивается клавиатура или когда происходит проверка нажатой кнопки.
После того, как обработчик прерываний закончит свою работу - то программа вернется в главный цикл и в это время значения некоторых регистров будут заполнены "левыми" данными (с которыми работал обработчик прерываний)
и по этому я решил в прерывании использовать регистр (Temp4) который не используется в основном цикле
Про SREG я уже где то читал http://controllersystems.com/books/prak ... -sreg.html
Наконец, нужно учитывать, что регистр SREG не сохраняется при переходе к обработке прерывания, и если в прерывании встречаются команды, его модифицирующие, то его содержимое может быть испорчено. Поэтому если есть теоретическая возможность того, что прерывание "вклинится" между командой сравнения (или другой, устанавливающей биты SREG) и командой условного перехода, то SREG нужно сохранять и восстанавливать принудительно
ну раз надо - значит надо - сейчас модифицирую код :write:
не зная броду не лезь к вольтмоду
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

А вот что у меня получилось
Спойлер

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



 	.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

.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/////////////////////////
rjmp TIM1_COMPA
.org	OVF1addr;	= 0x0005	; Timer/Counter1 Overflow
reti
.org	OVF0addr;	= 0x0006	; Timer/Counter0 Overflow
reti
.org	URXCaddr;	= 0x0007	; USART, Rx Complete
reti
.org	UDREaddr;	= 0x0008	; USART Data Register Empty
reti
.org	UTXCaddr;	= 0x0009	; USART, Tx Complete
reti
.org	ACIaddr;	= 0x000a	; Analog Comparator
reti
.org	PCIBaddr;	= 0x000b	; Pin Change Interrupt Request B
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


;******************************************************************************
;старт
;******************************************************************************

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

cli					; глобальный запрет на прерывания


ldi Temp,low(RamEnd)			; инициализации стека	
out SPL,Temp				;



ldi Temp,0b00001001			;
out DDRB,Temp				; настроили порт "В" (0-ввод, 1-вывод)
					; 0000х000 - "вывод" на передатчик (PB3- 15 ножка)
					; хххх0000 - "ввод" для чтения строк клавиатуры
					; 0000000х - "вывод" для индикации того что была нажата какая то кнлпка  ++++++++++++++++


ldi Temp,0b00001111			;
out DDRD,Temp 				; настраиваем порт "D" (0-ввод, 1-вывод)
					; 0000хххх - на вывод столбцов клавы



ldi Temp,0b00000000			; выключено
out TCCR1A,Temp				;



ldi Temp,0b00000000			;
out TCCR1B,Temp				; установили тактовый сигнал = CK 0  +++++++++++++++++++++++++++++++++++++++
					; таймер выключен!!!


					; инициализация компаратора
ldi Temp,0xFF				; как и просил -побольше ( 0xFFFF )
out OCR1AH,Temp				; 
ldi Temp,0xFF				; 
out OCR1AL,Temp				; 


ldi Temp,(1<<OCIE1A)			; разрешить прерывание компаратора
out TIMSK,Temp


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


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


ldi Temp,0b00001000			; выводим в порт "Б" на "OC1A" импульс 
out PortB,Temp




;*******************************************************************************
; главный цикл
;*******************************************************************************


Main_cicle:



	rcall keyboardread		; вызов подпрограммы чтения клавиатуры

	rcall certain_buttons_keyboard	; вызов подпрограммы проверки нажатия

	
rjmp Main_cicle				; циклимся




;*******************************************************************************
;обработка прерывания
;*******************************************************************************

	push temp2			;сохраняем в стеке рабочую переменную
	push temp1			;сохраняем в стеке рабочую переменную
	push temp			;сохраняем в стеке рабочую переменную

	in temp,SREG
	push temp			;сохраняем в стеке SREG


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

TIM1_COMPA:				; включен режим CTC 
					; обнуление таймера  происходит автоматически
					; "OC1A" меняет свое логическое состояние автоматически




	ldi Temp4,0b00000000		; ВЫВОДИМ "0b00000000" В ПОРТ "Б" (12 ножка) //или выключам светодиод//
	out PortB,Temp3


	
	ldi Temp4,0b00000000		; выключаем таймер
	out TCCR1A,Temp4		;


	ldi Temp4,0b00000000		;
	out TCCR1B,Temp3		; установили тактовый сигнал = CK 0  +++++++++++++++++++++++++++++++++++++++
					; таймер выключен!!!


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

	pop temp
	out SREG,temp			;извлекаем SREG

	pop temp			;извлекаем рабочую переменную 
	pop temp1			;извлекаем рабочую переменную 
	pop temp2			;извлекаем рабочую переменную 



reti





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

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

          
	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		; если не все просканировали, то циклимся

ret




       
;******************************************************************************************
;проверка нажатия клавиатуры
;******************************************************************************************



certain_buttons_keyboard:
		

	ldi temp1,5			; УСТАНОВИМ СЧЕТЧИК столбцов клавы	

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


Certain_button:


	ld Temp,Z+			; загрузим данные в регистр из ОЗУ по адресу из регистровой пары "Z", 
					; и после этого адресс в регистровой паре автоматически увеличится на еденицу


	cpi Temp,0b00000000		; проверяем, нажата ли какая ни будь кнопка?
	brne inform			; если нажата то переходим на метку "inform"


	dec temp1			; уменьшим счетчик
	brne Certain_button		; если не все столбцы, то циклимся

metka:


ret

;***********************************************************************************************
;вывод единицы в порт "Б" 
;***********************************************************************************************

inform:


							; включаем таймер
	ldi Temp,(1<<COM1A0)				; переключать ножку "OC1A" по совпадению (PB3- 15 ножка)
	out TCCR1A,Temp					;*1


	ldi Temp,(1<<wgm12)|(1<<CS12)|(1<<cs10)		; подключили режим "CTC" (вместе с *1) 
	out TCCR1B,Temp					; и установили тактовый сигнал = CK 1024  +++++++++++++++++++++++++++++++++++++++
							; таймер начал считать!!!


	ldi Temp,0b00000001				; ВЫВОДИМ "0b00000001" В ПОРТ "Б" (12 ножка) //или включам светодиод//
	out PortB,Temp

	rjmp metka

;***********************************************************************************************
а вот и проект
urok5mod.rar
(19.08 КБ) 171 скачивание
сразу возникает вопрос:
если я я правильно понимаю, то после того как я сохранил в СТЕКе значения регистров, то я могу в самом обработчике прерываний пользоваться этими регистрами - для того что бы не использовать большое количество регистров (их ведь может и не хватить, если код будет производительным)
не зная броду не лезь к вольтмоду
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Ужмите наконец эту таблицу векторов прерываний.
Вместо:

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

.cseg
.org 0


               ; СТАРТ
rjmp RESET            ; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset

.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/////////////////////////
rjmp TIM1_COMPA
.org   OVF1addr;   = 0x0005   ; Timer/Counter1 Overflow
reti
.org   OVF0addr;   = 0x0006   ; Timer/Counter0 Overflow
reti
.org   URXCaddr;   = 0x0007   ; USART, Rx Complete
reti
.org   UDREaddr;   = 0x0008   ; USART Data Register Empty
reti
.org   UTXCaddr;   = 0x0009   ; USART, Tx Complete
reti
.org   ACIaddr;   = 0x000a   ; Analog Comparator
reti
.org   PCIBaddr;   = 0x000b   ; Pin Change Interrupt Request B
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


;******************************************************************************
;старт
;******************************************************************************

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

проще так:

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

.cseg
.org 0
               ; СТАРТ
rjmp RESET            ; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset

.org   OC1Aaddr;   = 0x0004   ; Timer/Counter1 Compare Match A
rjmp TIM1_COMPA

.org INT_VECTORS_SIZE
;----------------------------------------------------------------------
TIM1_COMPA:
 ;Код обработчика прерывания
reti

;******************************************************************************
;старт
;******************************************************************************

RESET:               ; включение микроконтроллера
 ;Ну и далее
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

спс
не зная броду не лезь к вольтмоду
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

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

Сообщение спящий »

ВитГо моя программа должна работать так: считываем с приемника сохраняем данные в r19 , r20 и отправляем их на комп,для чтения(чтобы прочитать команды)

start:
sts UDR0,r19 ;
rcall USART_Transmit;
sts UDR0,r20 ;
rcall USART_Transmit;
rjmp start;

Чтение из приемника происходит следующим образом:
1)прерывание по INT0
2)Задержка 1/4 сигнала(т.к. у нас импульс сначало 1 потом 0,и мы ставим посередине 0)
3)считываем с помощью SBIS кнопку,и отправляем 0-вой бит в R19(в зависимости от того чего получим 1 или 0)
4)задержка в импульс 1,778 мС.
5)сдвигаем 19,а после того сдвигаем и R20(переполнение R19)
lsl r20;
rol r19
и так 14 циклов,
И в итоге мы получаем в R20 6 кодов,а в R19 8 кодов с приемника
отправляем на комп



1)картинка Задержка 1/4 сигнала
2)+второй импульс
3)и 4) полностьюпакет

в Протеусе вроде как работает,на железе нет(
Вложения
Безымянный3.GIF
(35.24 КБ) 409 скачиваний
Безымянный2.GIF
(34.43 КБ) 235 скачиваний
Безымянный1.GIF
(34.14 КБ) 237 скачиваний
Безымянный.GIF
(33.78 КБ) 406 скачиваний
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

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

Сообщение uwrtey »

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

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

Сообщение uwrtey »

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

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

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

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

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

Сообщение uwrtey »

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

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

Сообщение uwrtey »

uwrtey писал(а):попробую залить эту прошивку в мк и проверить....
ан нет, не получится прикошачить клавиатуру к моей панельке для прошивания! схема передатчика не поддерживает внутрисхемную прошивку!
вот накидал схему того, что получилось бы - тут все сразу понятно
так что схему передатчика нужно проектировать без разъема для прошивки и прошивать мк в отдельной панельке (или проектировать схему с подключаемым через джамперы разъемом)
//схему исправил//
неправильная.GIF
(54.51 КБ) 408 скачиваний
Последний раз редактировалось uwrtey Пн сен 10, 2012 19:44:47, всего редактировалось 1 раз.
не зная броду не лезь к вольтмоду
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

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

а почему mosi не подключено на схеме ?

в принципе можно еще раз подумать как переделать схему :-)
это нормально :-) даже с опытом по 3-4 раза приходиться переделывать, так как не всё очевидно, да и не сразу весь функционал продумаешь..
правда с опытом это все делается конечно на бумаге.. но на железе все равно бывает :-))))

я придумал алгоритм передачи !!

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

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

Сообщение uwrtey »

ВитГо писал(а):а почему mosi не подключено на схеме ?
как это не подключено ??? - mosi подключено, а вот RESET забыл подключитьь... :oops: //исправил //
ВитГо писал(а):в принципе можно еще раз подумать как переделать схему :-)
возможность внутрисхемной прошивки необязательна - у меня панелька как-раз для этих целей служит...
если же внутрисхемное программирование будет обязательным атрибутом схемы - то схемотехнику я начну именно с разъема для подключения программатора...
ВитГо писал(а):я придумал алгоритм передачи !!
ура! :beer:
ВитГо писал(а): теперь бы придумать как его тебе попроще объяснить
:)))
не зная броду не лезь к вольтмоду
Ответить

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