Декодер ШИМ на Atmel AVR
х
0хCB
смысл в том что спад предыдущего канала соответствует фронту следующего (т.к. выходы декодера это выходы дешифратора), в итоге межканальных пауз icp не поймает -> не отловит длительности импульсов в каналах.
а с разделением на четные/нечетные вполне себе почереди срабатывающие icp отследят.
дык icp может работать как по фронту так и по спаду, сиди просто прерывания лови
[Сообщение изменено пользователем 25.04.2011 16:21]
завести через диоды четные каналы на один icp, нечетные на второй. ну и сидим ловим фронты/спады + анализируем состояние линий:
+1. когда много внешних девайсов, а контроллер небольшой.. события через диоды заводил на один пин.. а по прерыванию уже выяснял, чо и где
мне то надо длину импульса, значит ловить еще и спад...
либо ждать.. если время есть. смотря какой длины импульс.
t
timsa™
что-то я перестал вас понимать.
объясните, как вы предлагаете ловить спад:
Фотография из Фотогалереи на E1.ru
х
0хCB
у Вас картинка неверная. Логическая 1 в один момент времени всегда присутсвует только в одном канале, + момент спада в i-м канале = моменту фронта в i+1 канале.
вобщем вот так:
Фотография из Фотогалереи на E1.ru
по прерываниям icp0 и icp1 считваем содержимое регистров захвата (определяем момент спада предыдущего канала/фронта текущего), анализируя состояние линий каналов определяем номер текущего канала.
[Сообщение изменено пользователем 25.04.2011 19:31]
t
timsa™
у Вас картинка неверная
то есть как это неверная?! у меня источник сигнала так работает!
фронт всех каналов совпадает и наступает каждые 20мс как часы.
по длине импульса я сужу о данных в этом канале.
никакого смещения переднего фронта нет.
х
0хCB
никакого смещения переднего фронта нет.
да ну? период всех сигналов 20мс, но по фазе они смещены.
или это уже не ppm
х
0хCB
собсно вот: http://rconline.ru/modules/smartsection/item.php?i...
и картинко оттуда:
http://rconline.ru/uploads/smartsection/images/gl0...
и картинко оттуда:
http://rconline.ru/uploads/smartsection/images/gl0...
t
timsa™
мы ведь сейчас говорим не о радиотракте, где сигналы упакованы в один радиоканал, а о выходе с приемного модуля, где каналы уже разнесены. никакой причины смещать их по фазе там нет.
в любом случае я завтра ткну в приемник двухканальным осциллографом и посмотрю.
p.s. с оптимизацией так и не разобрался. нашел странную ошибку видимости переменных, сделал их глобальными, ошибка пропала, но система как не работала так и не работает.
в режиме отладки на обсчет одного круга требуется 53 такта и измеренная длина импульса составляет от 320 до 640. такая "детализация" меня вполне устроит. но это в отладчике, на железе же опять фигня.
х
0хCB
выходе с приемного модуля, где каналы уже разнесены. никакой причины смещать их по фазе там нет.
дык, а декодер как работает? гляньте схемы - там стоит сдвигающий регистр (или счетчик с дешифратором), он как раз на выходе даст ту картину что я нарисовал.
х
0хCB
гыыыы. пин то icp один, шо на 32 шо на 8-й меге. так шо вместо icp0/1 придется заводить все хозяйство на компаратор AIN0/AIN1 и в обработчике переключать шо ловим фронт/спад
t
timsa™
период всех сигналов 20мс, но по фазе они смещены.
осциллограф сказал также
я для начала попробую переписать код на асме. если не получится или не будет работать, тогда начну рыть в сторону ICP. и если надумаю его использовать, то возьму attiny2313-20pu, а то юзать мегу32 как-то расточительно.
всем спасибо за помощь.
t
timsa™
Переписал я все на ассемблере.
Объем получился где-то на 10-15% больше чем у оптимизированного С. Отладчик проходит абсолютно верно и чисто.
Дискретизации хватает чтобы насчитать порядка 750 шагов за 1,5мс (кстати трассировка сишного варианта давала примерно такую же цифру)
Но... в железе опять не работает :-(
Завтра сделаю JTAG отладчик и буду смотреть что у этой срани в её кремниевых потрохах происходит. Задрала скотина.
Кому интересно - вот код. Увидите ошибку - сразу говорите. Я asm со времен Z80 в руки не брал.
Объем получился где-то на 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хCB
вроде в определении дефолтных значений ошибка будет считать тока первый канал, до 2 и 3 не дойдет.
t
timsa™
вроде в определении дефолтных значений ошибка будет считать тока первый канал, до 2 и 3 не дойдет.
трассировка проходит.
а в чем ошибка?
х
0хCB
пардон, невнимательно глянул, все будет проходить.
тут ошибка может быть в том что длительность цикла while по определению дефолтных значений больше длительности while при штатной работе -> посчитанные дефолтные значения не соответствуют длительностям при штатной работе.
тут ошибка может быть в том что длительность цикла while по определению дефолтных значений больше длительности while при штатной работе -> посчитанные дефолтные значения не соответствуют длительностям при штатной работе.
t
timsa™
тут ошибка может быть в том что длительность цикла while по определению дефолтных значений больше длительности while при штатной работе -> посчитанные дефолтные значения не соответствуют длительностям при штатной работе.
согласен. такое же подозрение есть. проблема в том, что надо или вычисления делать в секундах (что я пока не умею), либо циклы уравнивать (хотя бы нопами) по длине. но т.к. там немного логика отличается то это не совсем просто.
я счас делаю JTAG ICE и смогу с живого железа цифры получать.
p.s. еще думаю про вариант с ICP. хоть он и один, но если в сигналах есть хоть малейший зазор, то можно попробовать заюзать для определения переднего фронта.
х
0хCB
есть хоть малейший зазор
нету, или мега его отловить не может, я уже с этим сталкивался :-)
вычисления делать в секундах
анализируй пины в прерывании от таймера, скажем каждые 100мкс (на выходе будут дилтельности от 8 до 20)
t
timsa™
(на выходе будут дилтельности от 8 до 20)
мало. я сейчас в отладчике получаю ~750
х
0хCB
мало. я сейчас в отладчике получаю ~750
а куда больше? для включения/выключения фар и 8..20 дискретов хватит
если точнее хочешь мерять - надо задействовать переферию контроллера.
Зыните мну, я тут ничо ничитал, тока вот картинке увидал, и фспомнелось мне что фпиках есть прерывание по изменению состояния 4 бит порта ввода, дыть фколхосьте ваши 3 сигнала туда и по прерыванию смотрите тымер. Ещё раз зыните если фсё нефтему.
х
0хCB
в некоторых тинях тож есть, це уже предлагалось посте так в третьем :-)
t
timsa™
в некоторых тинях
в 2313 или меге32 есть?
как это называется?
половину отладчика сделал (USB порт на FT232RL). осталось еще половину - собственно отладчик :-)
х
0хCB
как это называется?
неа, нема.
зато есть в тиньках 8-ми ногих. называется: прерывания по изменению состояния линий PCIE (Pin Change Interrupt Enable).
х
0хCB
если так охота считать все софтварно, то для одинакового счета дефолтных значений и значений в процессе работы завести п/п счета длительностей:
[Сообщение изменено пользователем 29.04.2011 19:11]
[Сообщение изменено пользователем 29.04.2011 19:12]
Исходник:;инициалзация итд итп ... 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]
Авторизуйтесь, чтобы принять участие в дискуссии.