Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 13.05.2017, 20:27   #26
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 725
Вес репутации: 1505/45
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: Одновременная обработка трёх входов 12F629

Цитата:
Сообщение от Greg Посмотреть сообщение
зачем в младших пиках (с одним вектором) куда-то его выносить. в худших традициях пикоманства...
Выносить - затем, чтобы не забирать место на экране, для лучшего внешнего вида кода. Если у меня обработчик на 6 - 8 экранов, то мне его всякий раз прокручивать, когда курсор окажется в начале файла (что бывает, например, при симуляции)? И читаемость кода с таким куском в самом начале - какова? Упаковать обработчик в подпрограмму - ничего крамольного не вижу. Или глубины стека не хватает? В конце такой п/п, разумеется, должно стоять retfie, о чём я, кстати, написал в примере кода. Разумеется, лучше всего было бы сделать так...
Код:
    org    4        
    #include <int_obrab.asm>    ;Обработчик прерываний.
... но я не стал загружать человека, который только учится, ещё и этим (многофайловостью исходного кода).
Что касается приведённого в посте №24 кода. В 1-м фрагменте не видно кода сохранения/восстановления контекста. А без него нельзя, ибо обработчик прерываний изменит аккумулятор, флаги нуля/переноса и т.п. Т.е. работает себе главный цикл программы, тут - бац! - ушли на прерывание, благополучно вернулись... а в аккумяляторе уже другое число, а флажок переноса изменился... И начинаются чудеса расчудесные. Посмотрите даташит, возьмите пример оттуда. Это обязательно!
Ну и во 2-м фрагменте почему-то return на выходе вместе retfie. Последней командой обработчика прерываний должна быть retfie.
Guaho вне форума   Ответить с цитированием
Старый 13.05.2017, 20:36   #27
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Меня можно загружать.
У меня на Delphi под WinAPI по сто килобайт текста написано руками, и почти все переменные умудряюсь запомнить. (=

Но я сам люблю чистенький, оптимизированный код, без тонн goto и меток.
Да и всякие mylib.dpr или .pas подгружать в Uses (=
Чтобы процедуры и функции не набивать в текст каждый раз.

А тут выходит прога на 500 байт в hex, а в машинных кодах - так ещё меньше. Обожаю кодить на низком уровне.

Знал одного чувака, который за неимением компиляторов, писал сразу в машинных. То есть, в hex-редакторе Hiew открывал чистый файл и начинал всякие CD и 90 вставлять..

Попутно насчёт оптимизации.
А можно один обработчик таймера, но обращаться к нему из трёх мест с передачей параметров и получать от него в акумуляторе где-нибудь результат?
Theyler вне форума   Ответить с цитированием
Старый 13.05.2017, 21:02   #28
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Получится ли так?
Например, в Delphi используется понятие потока. Создаётся отдельный поток, который работает "отдельно" от основного цикла программы. И не грузит ресурс.
Потоков может бегать несколько, сами себе там делают чего-то.. например, один - с COM-портом работает, другой - параллельно ходит в Интернет, парсит страничку, третий снимает с устройства захвата изображение с камеры и т.д.

Вот можно использовать три обработчика одного таймера так, чтобы они независимо друг от друга крутились?
Я так понимаю, что три таймера в 629-м нет. А как тогда запускать при появлении сигнала на ногах, если почти одновременно появятся, а по две секунды ещё не отработали?
Theyler вне форума   Ответить с цитированием
Старый 13.05.2017, 22:02   #29
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 725
Вес репутации: 1505/45
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: Одновременная обработка трёх входов 12F629

Ну, теперь яснее ситуация) Новичок оказался бывалым в нашем деле. То-то я смотрю, уж больно грамотно для начинающего ведёт диалог! )))
Кстати, я тоже в маш. кодах проги писал некоторое время для Z80, пока не достал программу-ассемблер. Вручную транслировал, вычислял адреса... Был такой грешок по молодости)
То, что Вы описываете, - конечно возможно. Передавать параметры, если их много, - через регистры общего назначения. Но мне как-то непонятно, зачем это. Мне кажется, Вы немного зациклились на одном подходе, в то время как прямо на поверхности лежит весьма простой метод. И суть его в том, что таймер - один, этого достаточно! - является "источником тактирования" для софтовых счётчиков. Вы, видимо, невнимательно прочитали то, что я написал ранее (пост №18). Отсчёт времени (до 2-х секунд) производится в прерывании, а опрос входов и запуск выходов делается в основном цикле программы (ОЦП). То есть одно другому не мешает. А если нужно принудительно прерывать 2-х-секундную единицу на выходе по пропаданию лог. 1 на входе, то тут также нет ничего замудрого...
Guaho вне форума   Ответить с цитированием
Старый 13.05.2017, 22:31   #30
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Дык, я понял, что таймер бегает сам по себе, а ОЦП - сам по себе.
В ОЦП я отлавливаю нажатую педаль и включаю для каждого входа свою подпрограмму.
например, для GP5 (это канал А), она выглядит так:
Код:
	org	0
	goto	START
	org	4	;interrupt vector location
INTERRUPT
	bcf	INTCON, T0IF
	retfie

START
...
A_
	movlw	.0
	xorwf	Timer_A, w
	bz	No_A	; если таймер по нулям (уже отработал),
	bsf	GPIO, 0
	btfss	INTCON, T0IF
	decfsz	Timer_A, f	
	goto	No_A
	bcf	GPIO, 0
No_A
	return
В переменной Timer_A изначально (каждый раз при входе) лежит "заряженное" значение, которое, умноженное на количество тактов в секунду даст мне мои 2 секунды.
При наличии сигнала на GP5, я каждый раз при появлении прерывания таймера, уменьшаю на единицу. Как там окажется ноль - снимаю сигнал на выходе GP0 и до пропадания сингала на GP5 Timer_A не "заряжаю".
И таких ПП у меня три - A_, B_ и C_

А вот как мне таймер-то связать с тремя входами сразу?
Если одновременно будут, например, два сигнала, то как тики таймера считать? То есть, я не туда decfsz Timer_A вставил?
Где обрабатывать флаг btfss INTCON, T0IF ?
Я чего-то туплю. Голова не варит.

Последний раз редактировалось Theyler; 13.05.2017 в 22:46.
Theyler вне форума   Ответить с цитированием
Старый 14.05.2017, 10:53   #31
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 725
Вес репутации: 1505/45
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: Одновременная обработка трёх входов 12F629

Да всё просто. Флаг INTCON, T0IF просто сбрасываете в теле обработчика прерывания один раз. Хоть в начале, хоть в конце - без разницы; обычно это делают в начале, просто чтоб не забыть. Состояние этого флага вообще нет смысла опрашивать в прерывании, ибо оно детерминировано: = 1, если Вы ещё его не сбросили, и = 0 после сброса. Больше этот флаг в теле прерывания не меняется. Конечно, если время работы обработчика прерывания превысит период обнуления таймера, тогда начнутся "чудеса" (флаг INTCON, T0IF установится), но так не бывает, обычно время отличается на несколько порядков.
Как связать таймер с тремя входами сразу? Точнее, я так понимаю, не с входами, а с каналами? Как говорил дядя Вова из "Кин-дза-дзы", "Да моооожно...". Вы работаете со счётчиками Timer_A, В и С в ОЦП, а надо - в прерывании! Вот тогда всё устаканится:
Код:
org    0
    goto    START
    org    4    ;interrupt vector location

INTERRUPT
    ..... (обязательный код сохранения контекста)
    bcf    INTCON, T0IF; сбросили флаг возникновения прерывания и забыли о нём.

    ;Модификация счётчиков каналов:

;-----------------------------------------------------------------------------------------
int_A:    
    movf    Timer_A,f
    bz    int_B        ;Переход, если счётчик А обнулён...

    decfsz    Timer_A,f    ;... иначе декрементируем его...
    goto    int_B        ;Переход, если после декремента счётчик ещё не обнулился.

    ;Счётчик канала А только что обнулился.
    ;Деактивируем соответствующий выход.
    bcf    GPIO, 0

;А далее следуют точно такие же обработчики для других каналов:

;-----------------------------------------------------------------------------------------
int_B:

;-----------------------------------------------------------------------------------------
int_C:


    ..... (обязательный код восстановления контекста)

    retfie


;-------- ОЦП ---------------------------------------------------------------------------
START:

;Опрашиваем вход А: возникло активирующее событие?
;Если да, инициализируем счётчик Timer_А и включаем выход канала А.

;... То же самое повторяем для каналов В и С.

goto    START
Как видите, код получается предельно простой.
Да, и ещё одно. Я с этим тоже столкнулся при переходе с системы команд Z80 и i286 на PIC. В тех процессорах команды перемещения данных (LD, MOV) не меняли флаги, а здесь - некоторые меняют. Я это говорю к тому, что вместо
Код:
movlw    .0
xorwf    Timer_A, w
правильнее (рациональнее) писать
Код:
movf    Timer_A,w
- эта команда влияет на флаг нуля (равно как и в случае, если вторым операндом будет f, а не w).
Guaho вне форума   Ответить с цитированием
Старый 14.05.2017, 10:58   #32
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,110
Вес репутации: 3977/86
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Одновременная обработка трёх входов 12F629

Флаг INTCON, T0IF просто сбрасываете в теле обработчика прерывания один раз. Хоть в начале, хоть в конце - без разницы; обычно это делают в начале, просто чтоб не забыть. - сбрасывают в начале для того, чтобы если в ходе обработки прерывания будет еще одно переполнение, то выполнить обработчик дважды.
besogon вне форума   Ответить с цитированием
Старый 14.05.2017, 12:00   #33
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Guaho, вот теперь всё стратегически встало для меня на свои места. Вы в два предложения объяснили именно то, что я и хотел понять.
И за мой ляп с xor-ом спасибо. А то я обычно ксорил, как нашёл метод в сети и не задумывался.
А на деле-то это код для сравнения значений, а не для проверки на ноль, которые инструкции изначально для этого - bz (jz) или bnz (jnz).
Мне стыдно.

besogon, и Вам тоже, за нюанс о размещении инструкции сброса флага.

Пойду колдону. Ещё и с временными интервалами и предделителем разобраться нужно, а то что-то там не то выходит. Где-то косяк.

Последний раз редактировалось Theyler; 14.05.2017 в 12:14.
Theyler вне форума   Ответить с цитированием
Старый 14.05.2017, 13:42   #34
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 37
Сообщений: 526
Вес репутации: 183/43
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Цитата:
Сообщение от Theyler Посмотреть сообщение

Пойду колдону. Ещё и с временными интервалами и предделителем разобраться нужно, а то что-то там не то выходит. Где-то косяк.
Колдовать с асемом это конечно круто. Лезу туда из Си если что то непонятное происходит.
Помню в техникуме мы писали прогу для изучения на машинном коде только чтоб понять как работает.Были чемоданчики такие со светодиодиками,понимали что происходит от силы человек 5.(курс радио приборостроение )
CERGEI вне форума   Ответить с цитированием
Старый 14.05.2017, 23:52   #35
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Блин, полдня убил - искал, почему в железе не работает.
После очередного издевательства над кодом, перестали зажигаться диоды, хоть тресни. Весь код наизнанку вывернул - всё, вроде, норм, отладчик показывает хорошие значения.
Полез мерять железо - включенные подтяжки не выдают на порты +
Только на GP3, но там pullup физический - 10кОм.
Оказалось, накрылся Pic. Сволочь.
Так мне и надо: нужно было не увлекаться ISP, или отбрасывать питание.
Ну да фиг с ним. Вставил новый.

В целом, алгоритм работает, как надо. Но какая-то беда с двухсекундной задержкой.
В счётчике - .122 (ставил и .255)
Предделитель - 1:64

Убираю на входе - одновременно гаснет на выходе. Так и должно.
А держу на входе - не гаснет через нужные две секунды.
Где-то косяк с декрементом, или временные интервалы не так указал, или ещё один цикл (в цикле) нужен.

Код:
	list	p=12f629
#include <p12f629.inc>
	__CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON; & _FOSC_HS & _BOREN_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF

	cblock	0x20
	_255
	Counter_A
	Counter_B
	Counter_C
	W_temp
	Status_temp
	endc

	org		0
	goto	START
 ;*****************************************************************************
    org		4
interrupt
	movwf	W_temp			; Копировать W во временный регистр независимо от текущего банка
	swapf	STATUS, w		; Обменять полубайты в регистре STATUS и записать в W
	movwf	Status_temp		; Сохранить STATUS во временном регистре банка 0
	bcf		INTCON, T0IF	; сбросили флаг возникновения прерывания и забыли о нём
Int_A
	movf	Counter_A, f
	bz		Int_B			; Переход, если счётчик А обнулён,
	decfsz	Counter_A, f	; иначе декрементируем его
	goto	Int_B			; Переход, если после декремента счётчик ещё не обнулился.
	bcf		GPIO, 0			;
Int_B
	movf	Counter_B, f
	bz		Int_C
	decfsz	Counter_B, f
	goto	Int_C
	bcf		GPIO, 1
Int_C
	movf	Counter_C, f
	bz		Int_Out
	decfsz	Counter_C, f
	goto	Int_Out
	bcf		GPIO, 2
Int_Out
	swapf	Status_temp, w	; Обменять полубайты оригинального значения STATUS и записать в W (восстановить текущий банк)
	movwf	STATUS			; Восстановить STATUS из регистра W
	swapf	W_temp, f		; Обменять полубайты в регистре W_temp и записать в W_temp
	swapf	W_temp, w		; Обменять полубайты в регистре W_temp и восстановить оригинальное значение W без воздействия на STSATUS
	retfie
;******************************************************************************
START
	banksel	INTCON		;GIE	PEIE	T0IE	INTE	GPIE	T0IF	INTF	GPIF
	movlw	b'00100000'	;разрешение прерываний от таймера,
	movwf	INTCON		;запрет всех остальных и глобальный запрет всех прерываний.
	bsf STATUS, RP0		;BANK1
	call	3FFh
	movwf	OSCCAL
	movlw	b'00111000'
	movwf	TRISIO
	banksel	OPTION_REG
	movlw	b'00000101'	; 7-0{PullUps on} 6-0{} 5-0{} 4-0{} 3{} 210-101{1:64TMR0, 1:32WDT}
	movwf	OPTION_REG	;предделитель подключаем к TMR0 и устанавливаем его коэффициент деления 1:64.
;Таким образом, время одного командного цикла при частоте 4 мГц равно 1 мкс, 
;а с предделителем 1:64 таймер будет наращиваться через каждые 1*64 = 64 мкс, 
;а переполняться - через каждые 64 * 256 = 16384 мкс = 16 мс (округляем для простоты расчётов).
	movlw	b'00111000'		; PullUp GP5 GP4 {GP3 и так внешний}
	movwf	WPU				; on
	banksel	GPIO
	clrf	GPIO			; clear all ports
	movlw	.7
	movwf	CMCON			; Comparator OFF

	bsf		INTCON, GIE		; Разрешить прерывания

Loop
	btfss	GPIO, 5
	call	A_
	btfsc	GPIO, 5
	bcf		GPIO, 0		; OFF

	btfss	GPIO, 4
	call	B_
	btfsc	GPIO, 4
	bcf		GPIO, 1		; OFF

	btfss	GPIO, 3
	call	C_
	btfsc	GPIO, 3
	bcf		GPIO, 2		; OFF
	goto	Loop
A_
	bsf		GPIO, 0		; ON
	movlw	.122
	movwf	Counter_A
	return
B_
	bsf		GPIO, 1		; ON
	movlw	.122
	movwf	Counter_B
	return
C_
	bsf		GPIO, 2		; ON
	movlw	.122
	movwf	Counter_C
	return

	org		2100h
	de		0xD5, 0xD3, 0xC9
	END
И вот, какая беда:
При компиляции ругается предупреждениями:
"Register in operand not in bank 0. Ensure that bank bits are correct."
в строках 54, 56, 59 и 64
В проге всё в этом плане без ошибок, переходим в банк1 (пробовал и макросами, и дефайном), работает нормально.
Объяснения в сети не дают решения, как убрать.
Отчего такие предупреждения и как избавиться, кроме как отключить errorlevel ?
Theyler вне форума   Ответить с цитированием
Старый 15.05.2017, 11:32   #36
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
Thumbs up Re: Одновременная обработка трёх входов 12F629

Всё, сделал. Работает, как надо.
Код:
	list	p=12f629
#include <p12f629.inc>
	__CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON; & _FOSC_HS & _BOREN_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF

	cblock	0x20
	Counter_A
	Counter_B
	Counter_C
	W_temp
	Status_temp
	endc

	org		0
	goto	START
 ;*****************************************************************************
    org		4
interrupt
	movwf	W_temp			; Копировать W во временный регистр независимо от текущего банка
	swapf	STATUS,w		; Обменять полубайты в регистре STATUS и записать в W
	movwf	Status_temp		; Сохранить STATUS во временном регистре банка 0
	bcf		INTCON,T0IF		; сбросили флаг возникновения прерывания и забыли о нём
Int_A
	btfsc	GPIO,5
	goto	A_Off
	movf	Counter_A,f
	bz		Int_B
	bsf		GPIO,0
	decfsz	Counter_A,f
	goto	Int_B
A_Off
	bcf		GPIO,0
	btfsc	GPIO,5
	call	Charge_A

Int_B
	btfsc	GPIO,4
	goto	B_Off
	movf	Counter_B,f
	bz		Int_C
	bsf		GPIO,1
	decfsz	Counter_B,f
	goto	Int_C
B_Off
	bcf		GPIO,1
	btfsc	GPIO,4
	call	Charge_B

Int_C
	btfsc	GPIO,3
	goto	C_Off
	movf	Counter_C,f
	bz		Int_Out
	bsf		GPIO,2
	decfsz	Counter_C,f
	goto	Int_Out
C_Off
	bcf		GPIO,2
	btfsc	GPIO,3
	call	Charge_C

Int_Out
	swapf	Status_temp, w	; Обменять полубайты оригинального значения STATUS и записать в W (восстановить текущий банк)
	movwf	STATUS			; Восстановить STATUS из регистра W
	swapf	W_temp,f		; Обменять полубайты в регистре W_temp и записать в W_temp
	swapf	W_temp,w		; Обменять полубайты в регистре W_temp и восстановить оригинальное значение W без воздействия на STSATUS
	retfie
;******************************************************************************
START
	banksel	INTCON		;GIE	PEIE	T0IE	INTE	GPIE	T0IF	INTF	GPIF
	movlw	b'00100000'	; разрешение прерываний от таймера,
	movwf	INTCON		; запрет всех остальных и глобальный запрет всех прерываний.
	bsf STATUS, RP0		; bank1
	call	3FFh
	movwf	OSCCAL
	movlw	b'00111000'
	movwf	TRISIO
	banksel	OPTION_REG
	movlw	b'00000101'	; 7-0{PullUps on} 6-0{} 5-0{} 4-0{} 3{} 210-101{1:64TMR0, 1:32WDT}
	movwf	OPTION_REG	; коэффициент предделителя 1:64, время одного командного цикла при f=4mHz = 1ms, наращивание таймера каждые 64ms, переполнение каждые 64*256=16384мкс=16ms.
	movlw	b'00111000'	; PullUp GP5 GP4 {GP3 и так внешний}
	movwf	WPU			; on
	banksel	GPIO
	clrf	GPIO		; clear all ports
	movlw	.7
	movwf	CMCON		; Comparator OFF
	bsf		INTCON, GIE	; Разрешить прерывания

	goto	$
Charge_A
	movlw	.122			; 1 сек = .61
	movwf	Counter_A
	return
Charge_B
	movlw	.122
	movwf	Counter_B
	return
Charge_C
	movlw	.122
	movwf	Counter_C
	return
	END
Теперь ругайте.
За всё: за культуру оформления, синтаксис, необходимость использования длинных_мнемоничнных_идентификаторов_номер_один, и, самое главное, - за нерациональность кода, лишние команды и использование call, которое можно было избежать.

А я пока допишу чтение из EEprom временных задержек для каждого канала.

И, да: разумеется, огромное спасибо всем (и особенно Guaho) за нужные мне поджопники. (=
Theyler вне форума   Ответить с цитированием
Старый 15.05.2017, 11:42   #37
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,618
Вес репутации: 2378/81
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Одновременная обработка трёх входов 12F629

Цитата:
Теперь ругайте.
А не проще было написать все это на Си, и не морочить себе голову, а о "банках" - пусть она у компилятора болит
DimaS вне форума   Ответить с цитированием
Старый 15.05.2017, 11:46   #38
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Это ж дело привычки.
А я не наСИльник. Я больше на Паскакале - Delphi, и то, исключительно на WinAPI - люблю компактный и чистый код. Поэтому ассемблер для меня - это хирургический инструмент. Ещё под DOS начинал на нём писать, когда боролись за каждый бит.
Theyler вне форума   Ответить с цитированием
Старый 15.05.2017, 13:24   #39
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,618
Вес репутации: 2378/81
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Одновременная обработка трёх входов 12F629

Я тоже писал много лет для 12/16-х ПИКов на ассемблере, пока нормальный Си-компилятор не появился.
Сейчас, на ассемблере - только под дулом пистолета! Да и то, подумаю..
DimaS вне форума   Ответить с цитированием
Старый 15.05.2017, 13:40   #40
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Согласен. Для работы часто важны сроки и результат. Тут не до изящества. Лишь бы работало. Поэтому накидать на ЯВУ рыбу за пятнадцать минут и не париться - самое то.
А для души и для разминки мозга - asm.

Я шесть лет назад написал под 629-й камень две проги - контроллер ретранслятора (с кодом Морзе и прочими фишками) и считыватель RFID-ключей для своей квартиры (чтобы пользоваться одной меткой, а не носить связку металлических ключей, а также метки RFID и iButton на каждую из дверей, которыми мне приходится пользоваться).

Так вот, через шесть лет с ужасом обнаружил, что я вообще не могу понять, чего я тогда там написал. Хорошо, хоть комментарии оставил.

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

Поэтому, дело это неспешное, зато интересное и увлекательное.
Сроки меня не жмут - я на пенсии (=
Theyler вне форума   Ответить с цитированием
Старый 15.05.2017, 19:49   #41
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 816
Вес репутации: 1418/56
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Одновременная обработка трёх входов 12F629

Код:
START 	banksel	INTCON	; Зачем?	
                movlw	b'00100000' 
                movwf	INTCON

Код:
START
	clrf INTCON
 ; инициализация.....
;......
;.......
        bsf INTCON, T0IE
        bsf INTCON, GIE
DmitrijVDN вне форума   Ответить с цитированием
Старый 15.05.2017, 20:07   #42
Theyler
Member
 
Регистрация: 07.05.2017
Сообщений: 42
Вес репутации: 172/10
Theyler has a spectacular aura aboutTheyler has a spectacular aura about
По умолчанию Re: Одновременная обработка трёх входов 12F629

Супер. Спасибо.
Значительно логичнее и оптимальнее.

А вообще, я даже где-то видел камни в огород Корабельникова, насчёт его рекомендаций использовать именно побитовое описание регистров.
Оно, и правда, в некоторых случаях нагляднее, но не в этом.
Theyler вне форума   Ответить с цитированием
Старый 15.05.2017, 20:51   #43
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 816
Вес репутации: 1418/56
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Одновременная обработка трёх входов 12F629

следующий баг
Код:
    movlw    b'00111000'
    movwf    TRISIO
на момент включения регистр GPIO имеет неопределенное состояние те любое
Код:
        banksel GPIO
        clrf GPIO
        banksel TRISIO
    movlw    b'00111000'
    movwf    TRISIO
        banksel GPIO
        clrf GPIO
следующий баг
Код:
    bcf        GPIO,2
    btfsc    GPIO,3
возьмите за правило не работать в среднем семействе пиков с портами вывода на прямую, то что зачастую работает в симуляторе, работает на столе, как часто бывает не работает в оборудовании... а причиной тому ЧМЗ(чтение-модификация-запись), обычно юзвери не удосуживают себя прочтением даташита и особенностями работы порта
все операции проводить через темповскую переменную
Код:
bcf temp_GPIO,2
movfw temp_GPIO
movwf GPIO
    btfsc    GPIO,3

Последний раз редактировалось DmitrijVDN; 15.05.2017 в 20:57.
DmitrijVDN вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 06:27.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot