Страница 11 из 15

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

Добавлено: Чт сен 06, 2012 14:03:20
ВитГо
uwrtey писал(а):сейчас еще попробую один вариант............ :write:
.....
и вот что получилось...
пока пойдет...

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

сейчас подумаю как проще это сделать...

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

Добавлено: Чт сен 06, 2012 14:33:10
uwrtey
ВитГо писал(а):до ppm позже дейдем
:beer: спасибо ВитГо :beer:

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

Добавлено: Чт сен 06, 2012 16:10:12
спящий
Подскажите какого художника у меня на одно нажатие кнопки пуьта происходит 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

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

Добавлено: Чт сен 06, 2012 16:11:26
ВитГо
сообщение для 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
модифицируй процедуру нашего прерывания чтобы оно не портило регистры основной программы

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

Добавлено: Чт сен 06, 2012 16:25:45
ВитГо
спящий писал(а):Подскажите какого художника у меня на одно нажатие кнопки пуьта происходит 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 потом можно будет о чем то думать

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

Добавлено: Чт сен 06, 2012 17:06:32
ВитГо
для спящий

смотрите конфигурацию по 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 - это флаговый регистр, по нему прерывание генериться (если разрешено)...
его биты обычно сбрасывают до того как прерывания разрешают, а не устанавливают...

в общем надеюсь что решил вашу задачку :-)

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

Добавлено: Чт сен 06, 2012 20:40:49
спящий
Непомогло :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

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

Добавлено: Чт сен 06, 2012 21:09:17
ВитГо
а можно сакраментальный вопрос, еще раз: что программа делать то должна ?

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

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

						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 бит ? какой-то формат ?

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

Добавлено: Чт сен 06, 2012 21:49:43
uwrtey
ВитГо писал(а):когда процессор переходит в прерывание мы за редким случаем не знаем какую часть программы мы прервали и что находится в рабочих регистрах, вполне возможно что там важная информация - и мы работая в прерывании ее просто потеряем.
об этом я уже говорил
uwrtey писал(а):Прерывание может произойти в любой момент - когда опрашивается клавиатура или когда происходит проверка нажатой кнопки.
После того, как обработчик прерываний закончит свою работу - то программа вернется в главный цикл и в это время значения некоторых регистров будут заполнены "левыми" данными (с которыми работал обработчик прерываний)
и по этому я решил в прерывании использовать регистр (Temp4) который не используется в основном цикле
Про SREG я уже где то читал http://controllersystems.com/books/prak ... -sreg.html
Наконец, нужно учитывать, что регистр SREG не сохраняется при переходе к обработке прерывания, и если в прерывании встречаются команды, его модифицирующие, то его содержимое может быть испорчено. Поэтому если есть теоретическая возможность того, что прерывание "вклинится" между командой сравнения (или другой, устанавливающей биты SREG) и командой условного перехода, то SREG нужно сохранять и восстанавливать принудительно
ну раз надо - значит надо - сейчас модифицирую код :write:

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

Добавлено: Чт сен 06, 2012 22:16:47
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 КБ) 175 скачиваний
сразу возникает вопрос:
если я я правильно понимаю, то после того как я сохранил в СТЕКе значения регистров, то я могу в самом обработчике прерываний пользоваться этими регистрами - для того что бы не использовать большое количество регистров (их ведь может и не хватить, если код будет производительным)

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

Добавлено: Чт сен 06, 2012 22:44:57
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:               ; включение микроконтроллера
 ;Ну и далее

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

Добавлено: Чт сен 06, 2012 22:59:32
uwrtey
спс

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

Добавлено: Пт сен 07, 2012 00:07:51
спящий
ВитГо моя программа должна работать так: считываем с приемника сохраняем данные в 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) полностьюпакет

в Протеусе вроде как работает,на железе нет(

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

Добавлено: Пт сен 07, 2012 20:55:20
uwrtey
ВитГо, что дальше?

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

Добавлено: Вс сен 09, 2012 18:07:28
uwrtey
попробую залить эту прошивку в мк и проверить....

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

Добавлено: Вс сен 09, 2012 19:54:14
ВитГо
uwrtey писал(а):попробую залить эту прошивку в мк и проверить....
извини, чуток занят пока, постараюсь завтра появиться

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

Добавлено: Вс сен 09, 2012 20:26:19
uwrtey
:beer: жду... :beer:

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

Добавлено: Вс сен 09, 2012 21:54:52
uwrtey
uwrtey писал(а):попробую залить эту прошивку в мк и проверить....
ан нет, не получится прикошачить клавиатуру к моей панельке для прошивания! схема передатчика не поддерживает внутрисхемную прошивку!
вот накидал схему того, что получилось бы - тут все сразу понятно
так что схему передатчика нужно проектировать без разъема для прошивки и прошивать мк в отдельной панельке (или проектировать схему с подключаемым через джамперы разъемом)
//схему исправил//
неправильная.GIF
(54.51 КБ) 411 скачиваний

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

Добавлено: Пн сен 10, 2012 16:47:23
ВитГо
а почему mosi не подключено на схеме ?

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

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

теперь бы придумать как его тебе попроще объяснить :-)

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

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