Декодер ШИМ на Atmel AVR

0хCB
От пользователя timsa™
а смысл?

смысл в том что спад предыдущего канала соответствует фронту следующего (т.к. выходы декодера это выходы дешифратора), в итоге межканальных пауз icp не поймает -> не отловит длительности импульсов в каналах.
а с разделением на четные/нечетные вполне себе почереди срабатывающие icp отследят.

От пользователя timsa™
мне то надо длину импульса, значит ловить еще и спад...

дык icp может работать как по фронту так и по спаду, сиди просто прерывания лови

[Сообщение изменено пользователем 25.04.2011 16:21]
0
От пользователя FGV
завести через диоды четные каналы на один icp, нечетные на второй. ну и сидим ловим фронты/спады + анализируем состояние линий:

+1. когда много внешних девайсов, а контроллер небольшой.. события через диоды заводил на один пин.. а по прерыванию уже выяснял, чо и где
От пользователя timsa™
мне то надо длину импульса, значит ловить еще и спад...

либо ждать.. если время есть. смотря какой длины импульс.
0
timsa™
От пользователя FGV


От пользователя mainroot


что-то я перестал вас понимать.
объясните, как вы предлагаете ловить спад:


Фотография из Фотогалереи на E1.ru
0
0хCB
От пользователя timsa™

у Вас картинка неверная. Логическая 1 в один момент времени всегда присутсвует только в одном канале, + момент спада в i-м канале = моменту фронта в i+1 канале.
вобщем вот так:

Фотография из Фотогалереи на E1.ru

по прерываниям icp0 и icp1 считваем содержимое регистров захвата (определяем момент спада предыдущего канала/фронта текущего), анализируя состояние линий каналов определяем номер текущего канала.

[Сообщение изменено пользователем 25.04.2011 19:31]
0
timsa™
От пользователя FGV
у Вас картинка неверная


то есть как это неверная?! у меня источник сигнала так работает!
фронт всех каналов совпадает и наступает каждые 20мс как часы.
по длине импульса я сужу о данных в этом канале.
никакого смещения переднего фронта нет.
0
0хCB
От пользователя timsa™
никакого смещения переднего фронта нет.

да ну? период всех сигналов 20мс, но по фазе они смещены.
или это уже не ppm ;-)
0
0хCB
0
timsa™
От пользователя FGV


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

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

p.s. с оптимизацией так и не разобрался. нашел странную ошибку видимости переменных, сделал их глобальными, ошибка пропала, но система как не работала так и не работает.
в режиме отладки на обсчет одного круга требуется 53 такта и измеренная длина импульса составляет от 320 до 640. такая "детализация" меня вполне устроит. но это в отладчике, на железе же опять фигня.
0
0хCB
От пользователя timsa™
где сигналы упакованы в один радиоканал, а о
выходе с приемного модуля, где каналы уже разнесены. никакой причины смещать их по фазе там нет.

дык, а декодер как работает? гляньте схемы - там стоит сдвигающий регистр (или счетчик с дешифратором), он как раз на выходе даст ту картину что я нарисовал.
0
йа умыл руке
0
0хCB
гыыыы. пин то icp один, шо на 32 шо на 8-й меге. так шо вместо icp0/1 придется заводить все хозяйство на компаратор AIN0/AIN1 и в обработчике переключать шо ловим фронт/спад
0
timsa™
От пользователя FGV
период всех сигналов 20мс, но по фазе они смещены.

осциллограф сказал также ;-)

я для начала попробую переписать код на асме. если не получится или не будет работать, тогда начну рыть в сторону ICP. и если надумаю его использовать, то возьму attiny2313-20pu, а то юзать мегу32 как-то расточительно.

всем спасибо за помощь.
1 / 0
timsa™
Переписал я все на ассемблере.
Объем получился где-то на 10-15% больше чем у оптимизированного С. Отладчик проходит абсолютно верно и чисто.
Дискретизации хватает чтобы насчитать порядка 750 шагов за 1,5мс (кстати трассировка сишного варианта давала примерно такую же цифру)
Но... в железе опять не работает :-(

Завтра сделаю JTAG отладчик и буду смотреть что у этой срани в её кремниевых потрохах происходит. Задрала скотина.

Кому интересно - вот код. Увидите ошибку - сразу говорите. Я asm со времен Z80 в руки не брал.

Исходник:
		.include "m32def.inc"	; Используем ATMega32
		.include "macro.inc"	; Макросы

; RAM =====================================================
		.DSEG				; Сегмент ОЗУ
CCNT:
		.byte	4

debuglight:
		.byte	1

throttle_counter:
		.byte	1
throttle_timer:
		.byte	2
throttle_prev:
		.byte	1
throttle_default:
		.byte	3

steer_counter:
		.byte	1
steer_timer:
		.byte	2
steer_prev:
		.byte	1
steer_default:
		.byte	3

gear_counter:
		.byte	1
gear_timer:
		.byte	2
gear_prev:
		.byte	1
gear_default:
		.byte	3

; FLASH ===================================================
		.CSEG				; Кодовый сегмент
		.ORG $000
		RJMP	Reset		; Инициализация всего и вся
; Таблица прерываний
		.ORG $002
		RETI				; (INT0) External Interrupt Request 0
		.ORG $004
		RETI				; (INT1) External Interrupt Request 1
		.ORG $006
		RETI				; (INT2) External Interrupt Request 2
		.ORG $008
		RETI				; (TIMER2 COMP) Timer/Counter2 Compare Match
		.ORG $00a
		RETI				; (TIMER2 OVF) Timer/Counter2 Overflow
		.ORG $00c
		RETI				; (TIMER1 CAPT) Timer/Counter1 Capture Event
		.ORG $00e
		RETI				; (TIMER1 COMPA) Timer/Counter1 Compare Match A
		.ORG $010
		RETI				; (TIMER1 COMPB) Timer/Counter1 Compare Match B
		.ORG $012
		RETI				; (TIMER1 OVF) Timer/Counter1 Overflow
		.ORG $014
		RJMP	Timer0_COMP	; (TIMER0 COMP) Timer/Counter0 Compare Match
		.ORG $016
		RETI				; (TIMER0 OVF) Timer/Counter0 Overflow
		.ORG $018
		RETI				; (SPI,STC) Serial Transfer Complete
		.ORG $01a
		RETI				; (USART,RXC) USART, Rx Complete
		.ORG $01c
		RETI				; (USART,UDRE) USART Data Register Empty
		.ORG $01e
		RETI				; (USART,TXC) USART, Tx Complete
		.ORG $020
		RETI				; (ADC) ADC Conversion Complete
		.ORG $022
		RETI				; (EE_RDY) EEPROM Ready
		.ORG $024
		RETI				; (ANA_COMP) Analog Comparator
		.ORG $026
		RETI				; (TWI) 2-wire Serial Interface
		.ORG $028
		RETI				; (SPM_RDY) Store Program Memory Ready
		.ORG	INT_VECTORS_SIZE      	; Конец таблицы прерываний

; Обработчики прерывания
Timer0_COMP:
		SEI
		PUSHF
		PUSH	R17
		PUSH	R18
		PUSH	R19
		INCM	CCNT
		POP		R19
		POP		R18
		POP		R17
		POPF
		RETI

; Объявим переменные

; Чистим оперативку
Reset:
		LDI		ZL,Low(SRAM_START)	; Адрес начала ОЗУ в индекс
		LDI		ZH,High(SRAM_START)
		CLR		R16					; Очищаем R16
Flush:
		ST		Z+, R16				; Сохраняем 0 в ячейку памяти
		CPI		ZH,High(RAMEND+1)	; Достигли конца оперативки?
		BRNE	Flush				; Нет? Крутимся дальше!
 		CPI		ZL,Low(RAMEND+1)	; А младший байт достиг конца?
		BRNE	Flush
 		CLR		ZL					; Очищаем индекс
		CLR		ZH
; Инициализация стека
		LDI		R16,Low(RAMEND)
		OUT		SPL,R16
 		LDI		R16,High(RAMEND)
		OUT		SPH,R16
; Чистим регистры
		LDI		ZL, 30				; Адрес самого старшего регистра	
		CLR		ZH					; А тут у нас будет ноль
		DEC		ZL					; Уменьшая адрес
		ST		Z, ZH				; Записываем в регистр 0
		BRNE	PC-2				; Пока не перебрали все не успокоились

; Инициализация железа
		; дебаг лампочка
		SETB	DDRB,0,R16		; DDRB.0 = 1 (ножка работает на выход)
		; входы шим
		CLRB	DDRB,1,R16		; DDRB.1 = 0 (ножка работает на вход)
		CLRB	DDRB,2,R16		; DDRB.2 = 0 (ножка работает на вход)
		CLRB	DDRB,3,R16		; DDRB.3 = 0 (ножка работает на вход)
		; выходы на лампочки
		SETB	DDRA,0,R16		; DDRA.0 = 1 (ножка работает на выход)
		SETB	DDRA,1,R16		; DDRA.1 = 1 (ножка работает на выход)
		SETB	DDRA,2,R16		; DDRA.2 = 1 (ножка работает на выход)
		SETB	DDRA,3,R16		; DDRA.3 = 1 (ножка работает на выход)
		SETB	DDRA,4,R16		; DDRA.4 = 1 (ножка работает на выход)
		SETB	DDRA,5,R16		; DDRA.5 = 1 (ножка работает на выход)
		; таймер с частотой 10кГц
		OUTI 	TCCR0,1<<CS01|1<<WGM01
		SETB	TIMSK,OCIE0,R16
		OUTI 	OCR0,149

; Включаем прерывания
		SEI

; Программа
Main:
		; два раза мигнем аварийкой
		CALL	LeftLightOn
		CALL	RightLightOn
		LDI		R16,0x20
		LDI		R17,0xA1
		LDI		R18,0x07
		CALL 	Delay			; тупим 500'000 циклов
		CALL	LeftLightOff
		CALL	RightLightOff
		LDI		R16,0x00
		LDI		R17,0x35
		LDI		R18,0x0C
		CALL 	Delay			; тупим 800'000 циклов
		CALL	LeftLightOn
		CALL	RightLightOn
		LDI		R16,0x20
		LDI		R17,0xA1
		LDI		R18,0x07
		CALL 	Delay			; тупим 500'000 циклов
		CALL	LeftLightOff
		CALL	RightLightOff
		LDI		R16,0x00
		LDI		R17,0x35
		LDI		R18,0x0C
		CALL 	Delay			; тупим 800'000 циклов

		; проверим все фары
		CALL	FwdLightOn
		LDI		R16,0x20
		LDI		R17,0xA1
		LDI		R18,0x07
		CALL 	Delay			; тупим 500'000 циклов
		CALL	RearLightOn
		LDI		R16,0x20
		LDI		R17,0xA1
		LDI		R18,0x07
		CALL 	Delay			; тупим 500'000 циклов
		CALL	DayLightOn
		LDI		R16,0x20
		LDI		R17,0xA1
		LDI		R18,0x07
		CALL 	Delay			; тупим 500'000 циклов
		CALL	StopLightOn
		LDI		R16,0x00
		LDI		R17,0x35
		LDI		R18,0x0C
		CALL 	Delay			; тупим 800'000 циклов
		CALL	FwdLightOff
		CALL	RearLightOff
		CALL	DayLightOff
		CALL	StopLightOff
		LDI		R16,0x00
		LDI		R17,0x35
		LDI		R18,0x0C
		CALL 	Delay			; тупим 800'000 циклов
		CALL	DayLightOn

		; определяем дефолтные задержки в ШИМ сигналах
		; руль
SteeringDef:
		; проверяем пин
		SBIC	PINB,2			; если 1 то
		RJMP	hilvlstr		; пойдем на высокий уровень
lowlvlstr:						; иначе низкий
		
		LDS		R16,steer_prev	; это задний фронт?
		CPI		R16,1
		BREQ	down			; если да то считаем
		RJMP	endwhile		; иначе в конец цикла
down:
		LDS		R16, steer_default
		LDS		R17, steer_default+1
		LDS		R18, steer_default+2
		LDS		R19, steer_timer
		LDS		R20, steer_timer+1
		LDI		R21, 0
		ADD		R16, R19
		ADC		R17, R20
		ADC		R18, R21
		STS		steer_default, R16
		STS		steer_default+1, R17
		STS		steer_default+2, R18	;	steer_default += steer_timer

		LDS		R16,steer_counter
		LDS		R17,steer_counter+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		steer_counter,R16
		STS		steer_counter+1,R17	; steering_counter++

		CLR		R16
		STS		steer_prev,R16	; steer_prev=0
		STS		steer_timer,R16	; steer_timer=0
		STS		steer_timer+1,R16	; steer_timer+1=0

		RJMP	endwhile

hilvlstr:						; высокий уровень
		LDI		R16,1
		STS		steer_prev,R16	; steer_prev=1

		LDS		R16,steer_timer
		LDS		R17,steer_timer+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		steer_timer,R16
		STS		steer_timer+1,R17	; steering_timer++

endwhile:
		LDS		R16,steer_counter	; сколько циклов обсчитали
		LDI		R17,32				; если <32
		CP		R16,R17
		BRCS	SteeringDef			; тогда считаем еще

		; газ
ThrottleDef:
		; проверяем пин
		SBIC	PINB,1			; если 1 то
		RJMP	hilvlthr		; пойдем на высокий уровень
lowlvlthr:						; иначе низкий
		
		LDS		R16,throttle_prev	; это задний фронт?
		CPI		R16,1
		BREQ	downthr			; если да то считаем
		RJMP	endwhilethr		; иначе в конец цикла
downthr:
		LDS		R16, throttle_default
		LDS		R17, throttle_default+1
		LDS		R18, throttle_default+2
		LDS		R19, throttle_timer
		LDS		R20, throttle_timer+1
		LDI		R21, 0
		ADD		R16, R19
		ADC		R17, R20
		ADC		R18, R21
		STS		throttle_default, R16
		STS		throttle_default+1, R17
		STS		throttle_default+2, R18	;	throttle_default += throttle_timer

		LDS		R16,throttle_counter
		LDS		R17,throttle_counter+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		throttle_counter,R16
		STS		throttle_counter+1,R17	; throttle_counter++

		CLR		R16
		STS		throttle_prev,R16		; throttle_prev=0
		STS		throttle_timer,R16		; throttle_timer=0
		STS		throttle_timer+1,R16	; throttle_timer+1=0

		RJMP	endwhilethr

hilvlthr:						; высокий уровень
		LDI		R16,1
		STS		throttle_prev,R16	; throttle_prev=1

		LDS		R16,throttle_timer
		LDS		R17,throttle_timer+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		throttle_timer,R16
		STS		throttle_timer+1,R17	; throttle_timer++

endwhilethr:
		LDS		R16,throttle_counter	; сколько циклов обсчитали
		LDI		R17,32				; если <32
		CP		R16,R17
		BRCS	ThrottleDef			; тогда считаем еще

		; передача
GearDef:
		; проверяем пин
		SBIC	PINB,3			; если 1 то
		RJMP	hilvlgear		; пойдем на высокий уровень
lowlvlgear:						; иначе низкий
		
		LDS		R16,gear_prev	; это задний фронт?
		CPI		R16,1
		BREQ	downgear			; если да то считаем
		RJMP	endwhilegear		; иначе в конец цикла
downgear:
		LDS		R16, gear_default
		LDS		R17, gear_default+1
		LDS		R18, gear_default+2
		LDS		R19, gear_timer
		LDS		R20, gear_timer+1
		LDI		R21, 0
		ADD		R16, R19
		ADC		R17, R20
		ADC		R18, R21
		STS		gear_default, R16
		STS		gear_default+1, R17
		STS		gear_default+2, R18	;	gear_default += gear_timer

		LDS		R16,gear_counter
		LDS		R17,gear_counter+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		gear_counter,R16
		STS		gear_counter+1,R17	; gear_counter++

		CLR		R16
		STS		gear_prev,R16		; gear_prev=0
		STS		gear_timer,R16		; gear_timer=0
		STS		gear_timer+1,R16	; gear_timer+1=0

		RJMP	endwhilegear

hilvlgear:						; высокий уровень
		LDI		R16,1
		STS		gear_prev,R16	; gear_prev=1

		LDS		R16,gear_timer
		LDS		R17,gear_timer+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		gear_timer,R16
		STS		gear_timer+1,R17	; gear_timer++

endwhilegear:
		LDS		R16,gear_counter	; сколько циклов обсчитали
		LDI		R17,32				; если <32
		CP		R16,R17
		BRCS	GearDef			; тогда считаем еще


		; делим руль на 32
		LDS		R16, steer_default
		LDS		R17, steer_default+1
		LDS		R18, steer_default+2
		LSR		R18	; разделили на 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		STS		steer_default, R16
		STS		steer_default+1, R17
		STS		steer_default+2, R18

		; делим газ на 32
		LDS		R16, throttle_default
		LDS		R17, throttle_default+1
		LDS		R18, throttle_default+2
		LSR		R18	; разделили на 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		STS		throttle_default, R16
		STS		throttle_default+1, R17
		STS		throttle_default+2, R18

		; делим передачу на 32
		LDS		R16, gear_default
		LDS		R17, gear_default+1
		LDS		R18, gear_default+2
		LSR		R18	; разделили на 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		LSR		R18	; разделили еще 2
		ROR		R17
		ROR		R16
		STS		gear_default, R16
		STS		gear_default+1, R17
		STS		gear_default+2, R18


		; обнуляем количество циклов и времени
		CLR		R16
		STS		steer_counter, R16
		STS		steer_timer, R16
		STS		steer_timer+1,R16
		STS		throttle_counter, R16
		STS		throttle_timer, R16
		STS		throttle_timer+1,R16
		STS		gear_counter, R16
		STS		gear_timer, R16
		STS		gear_timer+1,R16

AllChecks:

		; проверяем руль
CheckSteer:
		SBIC	PINB,2		; если 1 то
		RJMP	histeer		; пойдем на высокий уровень
		
		LDS		R16,steer_prev	; это задний фронт?
		CPI		R16,1
		BREQ	down2			; если да то считаем длину
		RJMP	endsteer		; иначе в конец проверки
down2:
		LDS		R16, steer_default
		LDS		R17, steer_default+1
		LDS		R18, steer_timer
		LDS		R19, steer_timer+1
		CP		R17,R19
		BRCS	left
		CP		R16,R18
		BRCS	left
		RJMP	right
rststeer:
		CLR		R16
		STS		steer_prev,R16	; steer_prev=0
		STS		steer_timer,R16	; steer_timer=0
		STS		steer_timer+1,R16	; steer_timer+1=0
		RJMP	endsteer
left:
		CALL	LeftLightOn
		CALL	RightLightOff
		RJMP	rststeer
right:
		CALL	LeftLightOff
		CALL	RightLightOn
		RJMP	rststeer
histeer:						; высокий уровень
		LDI		R16,1
		STS		steer_prev,R16	; steer_prev=1

		LDS		R16,steer_timer
		LDS		R17,steer_timer+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		steer_timer,R16
		STS		steer_timer+1,R17	; steering_timer++
endsteer:

		; проверяем газ
CheckThrottle:
		SBIC	PINB,1		; если 1 то
		RJMP	hithrottle		; пойдем на высокий уровень
		
		LDS		R16,throttle_prev	; это задний фронт?
		CPI		R16,1
		BREQ	down3			; если да то считаем длину
		RJMP	endthrottle		; иначе в конец проверки
down3:
		LDS		R16, throttle_default
		LDS		R17, throttle_default+1
		LDS		R18, throttle_timer
		LDS		R19, throttle_timer+1
		CP		R17,R19
		BRCS	forward
		CP		R16,R18
		BRCS	forward
		RJMP	backward
rstthrottle:
		CLR		R16
		STS		throttle_prev,R16	; throttle_prev=0
		STS		throttle_timer,R16		; throttle_timer=0
		STS		throttle_timer+1,R16	; throttle_timer+1=0
		RJMP	endthrottle
forward:
		CALL	FwdLightOn
		CALL	StopLightOff
		RJMP	rstthrottle
backward:
		CALL	FwdLightOff
		CALL	StopLightOn
		RJMP	rstthrottle
hithrottle:						; высокий уровень
		LDI		R16,1
		STS		throttle_prev,R16	; throttle_prev=1

		LDS		R16,throttle_timer
		LDS		R17,throttle_timer+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		throttle_timer,R16
		STS		throttle_timer+1,R17	; throttle_timer++
endthrottle:

		; проверяем коробку
CheckGear:
		SBIC	PINB,3		; если 1 то
		RJMP	higear		; пойдем на высокий уровень
		
		LDS		R16,gear_prev	; это задний фронт?
		CPI		R16,1
		BREQ	down4			; если да то считаем длину
		RJMP	endgear		; иначе в конец проверки
down4:
		LDS		R16, gear_default
		LDS		R17, gear_default+1
		LDS		R18, gear_timer
		LDS		R19, gear_timer+1
		CP		R17,R19
		BRCS	fwd
		CP		R16,R18
		BRCS	fwd
		RJMP	rear
rstgear:
		CLR		R16
		STS		gear_prev,R16	; throttle_prev=0
		STS		gear_timer,R16		; throttle_timer=0
		STS		gear_timer+1,R16	; throttle_timer+1=0
		RJMP	endgear
fwd:
		NOP
		CALL	RearLightOff
		RJMP	rstgear
rear:
		NOP
		CALL	RearLightOn
		RJMP	rstgear
higear:						; высокий уровень
		LDI		R16,1
		STS		gear_prev,R16	; gear_prev=1

		LDS		R16,gear_timer
		LDS		R17,gear_timer+1
		SUBI	R16,(-1)
		SBCI	R17,(-1)
		STS		gear_timer,R16
		STS		gear_timer+1,R17	; gear_timer++
endgear:


		; debug
		LDS		R16,debuglight
		CPI		R16,1
		BREQ	debugoff
		CALL	DebugLightOn
		LDI		R16,1
		STS		debuglight,R16
		RJMP	AllChecks
debugoff:
		CALL	DebugLightOff
		CLR		R16
		STS		debuglight,R16
		; eof debug

		RJMP	AllChecks			; Суперцикл

; Тупилка
Delay:
_loop1:	SUBI	R16,1
		SBCI	R17,0
		SBCI	R18,0
		BRCC	_loop1
		RET

; Включаем лампочки
DebugLightOn:
		SETB	PORTB,0,R16
		RET
DebugLightOff:
		CLRB	PORTB,0,R16
		RET
LeftLightOn:
		SETB	PORTA,0,R16
		RET
LeftLightOff:
		CLRB	PORTA,0,R16
		RET
RightLightOn:
		SETB	PORTA,1,R16
		RET
RightLightOff:
		CLRB	PORTA,1,R16
		RET
FwdLightOn:
		SETB	PORTA,2,R16
		RET
FwdLightOff:
		CLRB	PORTA,2,R16
		RET
RearLightOn:
		SETB	PORTA,3,R16
		RET
RearLightOff:
		CLRB	PORTA,3,R16
		RET
DayLightOn:
		SETB	PORTA,4,R16
		RET
DayLightOff:
		CLRB	PORTA,4,R16
		RET
StopLightOn:
		SETB	PORTA,5,R16
		RET
StopLightOff:
		CLRB	PORTA,5,R16
		RET

; EEPROM ==================================================
		.ESEG				; Сегмент EEPROM
0
0хCB
вроде в определении дефолтных значений ошибка будет считать тока первый канал, до 2 и 3 не дойдет.
0
timsa™
От пользователя FGV
вроде в определении дефолтных значений ошибка будет считать тока первый канал, до 2 и 3 не дойдет.


трассировка проходит.
а в чем ошибка?
0
0хCB
пардон, невнимательно глянул, все будет проходить.
тут ошибка может быть в том что длительность цикла while по определению дефолтных значений больше длительности while при штатной работе -> посчитанные дефолтные значения не соответствуют длительностям при штатной работе.
0
timsa™
От пользователя FGV
тут ошибка может быть в том что длительность цикла while по определению дефолтных значений больше длительности while при штатной работе -> посчитанные дефолтные значения не соответствуют длительностям при штатной работе.


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

я счас делаю JTAG ICE и смогу с живого железа цифры получать.

p.s. еще думаю про вариант с ICP. хоть он и один, но если в сигналах есть хоть малейший зазор, то можно попробовать заюзать для определения переднего фронта.
0
0хCB
От пользователя timsa™
есть хоть малейший зазор

нету, или мега его отловить не может, я уже с этим сталкивался :-)

От пользователя timsa™
вычисления делать в секундах

анализируй пины в прерывании от таймера, скажем каждые 100мкс (на выходе будут дилтельности от 8 до 20)
0
timsa™
От пользователя FGV
(на выходе будут дилтельности от 8 до 20)

мало. я сейчас в отладчике получаю ~750
0
0хCB
От пользователя timsa™
мало. я сейчас в отладчике получаю ~750

а куда больше? для включения/выключения фар и 8..20 дискретов хватит ;-)
если точнее хочешь мерять - надо задействовать переферию контроллера.
0
Зыните мну, я тут ничо ничитал, тока вот картинке увидал, и фспомнелось мне что фпиках есть прерывание по изменению состояния 4 бит порта ввода, дыть фколхосьте ваши 3 сигнала туда и по прерыванию смотрите тымер. Ещё раз зыните если фсё нефтему.
0
0хCB
От пользователя ddd[гость]
фпиках есть прерывание по изменению состояния 4 бит порта ввода, дыть фколхосьте ваши 3 сигнала туда и по прерыванию смотрите тымер

в некоторых тинях тож есть, це уже предлагалось посте так в третьем :-)
0
timsa™
От пользователя FGV
в некоторых тинях

в 2313 или меге32 есть?
как это называется?

половину отладчика сделал (USB порт на FT232RL). осталось еще половину - собственно отладчик :-)
0
0хCB
От пользователя timsa™
в 2313 или меге32 есть?
как это называется?

неа, нема.
зато есть в тиньках 8-ми ногих. называется: прерывания по изменению состояния линий PCIE (Pin Change Interrupt Enable).
0
0хCB
если так охота считать все софтварно, то для одинакового счета дефолтных значений и значений в процессе работы завести п/п счета длительностей:

Исходник:
;инициалзация итд итп
...
	CALL	ClearCH
	clr	r18
while_default:
	CALL	Ch0
	CALL	Ch1
	CALL	Ch2
	inc	r18
	cpi	r18,32
	brne	while_default
...
;расчет дефолтных значений - деление на 32 итд итп
main_while:
	CALL	ClearCH
	CALL	Ch0
	CALL	Ch1
	CALL	Ch2
	...делаем че надо с принятой инфой
	rjmp	main_while

;п/п сброса измеряных значений каналов
ClearCH:
	clr	r16
	sts`	CH0H,r16
	sts`	CH0L,r16
	...
	ret

;п/п измерения длительности 0-го канала, аналогичные для 1 и 2 каналов
Ch0:
	lds	r16,CH0L	;загружаем значения
	lds	r17,CH0H	;
Ch0_wait:
	sbrs	PINB,NumPinCh0	;
	rjmp	Ch0_wait	;ждем прихода 1
;1 пришла, считаем ее длительность:
Ch0_Math:
	subi	r16,-1	;
	sbci	r17,-1	;+1
	sbrc	PINB,NumPinCh0	;
	rjmp	Ch0_Math	;ждем прихода 0
;0 пришол, записываем выходные значения
	sts	CH0L,r16
	sts	CH0H,r17
	ret	;выходим


[Сообщение изменено пользователем 29.04.2011 19:11]

[Сообщение изменено пользователем 29.04.2011 19:12]
0
Авторизуйтесь, чтобы принять участие в дискуссии.