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

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

Добавлено: Вс сен 02, 2012 14:00:15
uwrtey
все систему запустил, на борту имеется понипрог, протеус и авр студио 5
что делать теперь?

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

Добавлено: Вс сен 02, 2012 17:02:57
uwrtey
есть у меня вот такая панелька для программирования
панелька.gif
(77.09 КБ) 352 скачивания

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

Добавлено: Вс сен 02, 2012 17:09:30
ВитГо
тинька через программатор видится ?

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

Добавлено: Вс сен 02, 2012 17:24:31
uwrtey
ну раньше видилась и да же прошивалась... :)
сейчас подключу - вспомню, как это делается...

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

Добавлено: Вс сен 02, 2012 18:43:57
uwrtey
проверил, все работает - прочитал фьюзы и данные.
Что теперь ?

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

Добавлено: Вс сен 02, 2012 18:54:19
ВитГо
Давай в проект инициализацию портов ввода вывода
пин порта на передатчик в "1" и на него повесь светик или так проверь что там логическая единица появилась

p.s. чтобы проверить что мега от внутреннего генератора работает (или ты уже внешний генератор фюзами включил ?)

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

Добавлено: Вс сен 02, 2012 19:33:42
uwrtey
ВитГо писал(а):p.s. чтобы проверить что мега от внутреннего генератора работает (или ты уже внешний генератор фюзами включил ?)
это я делать не умею пока

вот код Ты имел ввиду ?
Спойлер

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

/*
 * Proba2.asm
 *
 *  Created: 28.08.2012 12:11:36
 *   Author: 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,0b00000100			;
out DDRB,Temp				; настроили порт "В" (0-ввод, 1-вывод)
					; 00000х00 - "вывод" на передатчик (PB3- 15 ножка)
					; хххх0000 - "ввод" для чтения строк клавиатуры


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



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



ldi Temp,(1<<wgm12)|(1<<cs10)		;подключили режим "CTC" (вместе с *1) и установили тактовый сигнал = 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				; если 6600=19C8(hex)


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


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


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


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




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


main cycle:

	rjmp main cycle

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

TIM1_COMPA:

	reti			; ( выход )ни чего обрабатывать не нужно
				; включен режим CTC 
				; обнуление таймера  происходит автоматически
				; "OC1A" меняет свое логическое состояние автоматически

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

если я правильно понял, то на выходе OC1A мы получим прямоугольные импульсы с частотой F
где F зависит от выставленных фьюзов или же от внутреннего генератора

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

Добавлено: Вс сен 02, 2012 19:43:36
ВитГо
Ну это ты далеко зашагал...

1. нужно сделать .include файла определений контроллера ! мы это уже обсуждали где то выше

2. В программе сделай только настройку портов ввода вывода, таймер настраивать не нужно, стек тоже можешь не настраивать. только настройки DDRx !

3. после настройки портов выведи в пин порта передатчика "1" (зажги светодиод)

4. в конце программы поставь loop: rjmp loop (чтобы зациклиться на месте)

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

Добавлено: Вс сен 02, 2012 19:49:25
uwrtey
это очень просто...

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

Добавлено: Вс сен 02, 2012 19:55:52
ВитГо
делай !

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

Добавлено: Вс сен 02, 2012 20:05:49
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/////////////////////////
reti
.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,0b00001000			; (вот тут косяк был)
out DDRB,Temp				; настроили порт "В" (0-ввод, 1-вывод)
					; 0000х000 - "вывод" на передатчик (PB3- 15 ножка)
					; хххх0000 - "ввод" для чтения строк клавиатуры


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




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




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

main cycle:

	rjmp main cycle


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

Добавлено: Вс сен 02, 2012 20:14:26
ВитГо
светодиод зажегся ? (уровень лог "1" появился?)

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

Добавлено: Вс сен 02, 2012 20:20:59
uwrtey
косяки конечно были! исправил. (код выше тоже поправил)
Залил - на 15 ноге лог_1

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

Добавлено: Вс сен 02, 2012 21:24:54
ВитГо
теперь давай код инициализации таймера добавь,
в OCR1A запиши значение побольше 0чFFFF

и проверь импульсы на OC1A

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

Добавлено: Вс сен 02, 2012 21:38:06
uwrtey
:sleep: завтра займусь - сейчас пошел спать...

вот пока только код накалякал
Спойлер

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



 	.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,0b00001000			;
out DDRB,Temp				; настроили порт "В" (0-ввод, 1-вывод)
					; 0000х000 - "вывод" на передатчик (PB3- 15 ножка)
					; хххх0000 - "ввод" для чтения строк клавиатуры


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



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



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

					; инициализация компаратора
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_cycle:

	rjmp main_cycle

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

TIM1_COMPA:

	reti			; ( выход )ни чего обрабатывать не нужно
				; включен режим CTC 
				; обнуление таймера  происходит автоматически
				; "OC1A" меняет свое логическое состояние автоматически

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

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

Добавлено: Пн сен 03, 2012 21:08:35
uwrtey
прошил, все работает (на выходе OC1A прямоугольные импульсы) :))
захотел измерить частоту и подключил осциллограф - но так и не смог увидеть четкую картинку (видимо частота маловата)
(еще и не умею толком пользоваться осциллографом) :(
вдобавок глянул на картинку "осциллографом из звуковой карточки" :)

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

Добавлено: Пн сен 03, 2012 21:59:18
uwrtey
Чаво дальше? :)

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

Добавлено: Вт сен 04, 2012 05:38:49
ВитГо
задай пред-делитель для таймера побольше (1024 там есть)

напиши ПОДПРОГРАММУ сканирования клавиатуры в буфер озу
должна быть именно подпрограмма, то есть вызываться по rcall и возвращаться по ret

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

Добавлено: Вт сен 04, 2012 06:17:34
uwrtey
ок, вечером попробую :)

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

Добавлено: Вт сен 04, 2012 07:38:14
ВитГо
Нужно будет сделать подпрограмму сканирования клавиатуры
и подпрограмму проверки нажатой кнопки (любой)

по идее подпрограмма проверки кнопок просто должна сравнивать 5 байт считанных линий клавиатуры с 0x00
если значение не равно 0х00 - значит какая то кнопка была нажата и нужно начать передачу

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