Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.12.2009, 15:23
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Стыковка подпрограммы измерения и динамической индикации
Есть подпрограмма для измирения переменного напряжения: по прерыванию таймера Т1 каждых 625 мкс запускаеться АЦП,делает замер,и в обработчике АЦП обрабатывает результат (возводить в квадрат результат измирения,сумирует квадраты за 32 выборки,потом усредняет результат и извлекает квадратный корень).
виборки производиться в течении 20мс (периода синусоиды)
Другая подпрограмма - динамическая индикация: у меня есть два варианты реализации на таймере Т0 и в главном цикле программы.
Отдельно подпрограммы работают,вместе нет!
Не могу понять в чем причина!
c индикацией на таймере Протеус на индикаторах показивает всякую чушь,но “бежучая единица” (используються тран.ключи) едет и заметно что идут даные на индикатор. Программа не реагирует на изминения напряжения на входе АЦП.
При индикации в главном цикле - отображаеться “0″ но не идут даные на дисплей и нет “бежучей единицы”
|
|
|
|
06.12.2009, 15:23
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Стиковка подпрограммы измирения и динамической индикации
МК ATmega8
|
|
|
|
06.12.2009, 15:30
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Стиковка подпрограммы измирения и динамической индикации
Телепаты в запое ...
__________________
Осторожно , злой кот
|
|
|
|
06.12.2009, 16:25
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Стиковка подпрограммы измирения и динамической индикации
Сообщение от dosikus
|
Телепаты в запое ...
|
измирение:
.include "m8def.inc"
.def temp=r17
.def al=r0
.def ah=r1
.def ADSL=r2
.def ADST=r3
.def ADSH=r4
.def ACT=r5
.def rzl=r6
.def rzt=r7
.def rzh=r8
.macro outi
ldi r16,@1
out @0,r16
.endmacro
.org 0
rjmp reset
.org OC1Aaddr
rjmp T1_comp
.org ADCCaddr
rjmp Result
reset:
ldi temp,32
mov ACT,temp
outi ddrd,0xff
outi SPH,High(RamEnd)
outi SPL,Low(RamEnd)
outi ADMUX,0b11000000
outi ADCSR,0b10011110
outi TIMSK,0x10; // 0001 0000
outi OCR1AH,High(5000)
outi OCR1AL,Low(5000)
outi TCCR1B,0x9; // 0000 1001
outi TCNT1H,0x0; // 0000 0000
outi TCNT1L,0x0; // 0000 0000
sei
loop:rjmp loop
T1_comp:
sbi ADCSR,ADSC
reti
Result:
in aL,ADCL ;r0
in aH,ADCH ;r1
; відкидання двох молодших біт із 10 розядів (-› 8 резул.)
clc
ror ah
ror al
clc
ror ah
ror al ; результат залишиться в r18 (r19=0)
;математика
;;****(квадрат і сумування квадратів)
mul al,al ; піднесення в квадрат al (r1;r0 рез)
clr temp
smcvd: ;нагромадження суми квадратів за 32 вимірювання
add ADSL,r0 ;дадаваня мол знач квад.(r0)
adc ADST,r1 ;додавання ст знач квад.(r1)
adc ADSH,temp ;додаваня значення нуль (для врах. переносу)
dec ACT
brne exit
movw rzt:rzl,ADST:ADSL
mov rzh,ADSH
clr ADSL
clr ADST
clr ADSH
ldi temp,32
mov ACT,temp
clr temp
div32:
lsr rzH
ror rzT
ror rzL
inc temp
cpi temp,5
brne div32
movw r3:r2,rzT:rzL ;пересилка суми квадратів за
; 32 виборки до r3:r2
;для добування квадратного кореня
;добування квадратн. кореня, результат в r16 (r17=0)
Sqrt16:
ldi R17,0xc0 ; Rotation mask register
ldi R16,0x40 ; Developing sqrt
clc ; Enter loop with C=0
_sq16_1:
brcs _sq16_2 ; C --› Bit is always 1
cp R3,R16 ; Does value fit?
brcs _sq16_3 ; C --› bit is 0
_sq16_2:
sub R3,R16 ; Adjust argument for next bit
or R16,R17 ; Set bit to 1
_sq16_3:
lsr R17 ; Shift right rotation mask
lsl R2
rol R3 ; Shift left argument, C --› Next sub is MUST
eor R16,R17 ; Shift right test bit in developing sqrt
andi R17,0xfe ; Becomes 0 for last bit
brne _sq16_1 ; Develop 7 bits
brcs _sq16_4 ; C--› Last bit always 1
lsl R2 ; Need bit 7 in C for cpc
cpc R16,R3 ; After this C is last bit
_sq16_4:
adc R16,R17 ; Set last bit if C (R17=0)
;результат знаходиться
;mov r16,r2 ;в end_dat (r16)
out PortD,r16
clr r3
clr r2
exit:
out sreg,r9
reti
|
|
|
|
06.12.2009, 16:26
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Стиковка подпрограммы измирения и динамической индикации
Индикация на таймере:
.include "m8def.inc"
.def tmpl=r17
.def tmph=r18
.macro outi
ldi r16,@1
out @0,r16
.endmacro
.org 0
rjmp reset
.org OVF0addr
rjmp T0_OF
_symtab:
;таблица истинности декодера
; hgfedcba hgfedcba
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
reset:
outi ddrb,0xFF; // 1111 1111
outi ddrd,0x7; // 0000 0111
outi TIMSK,1‹‹TOIE0
outi TCNT0,256-62 ;частота індикації 42 Гц
outi TCCR0,0b00000101
sei
loop:
ldi tmpl,Low(145)
ldi tmph,High(145)
rjmp loop
T0_OF:
outi TCNT0,256-62
binBCD3:
clr zh
clr zl ;обнуляем счетчик сотен (потом десятков)
; считаем сотни
_bin100:
subi tmpl,100
sbci tmph,0
brcs _bin100end
inc zl
rjmp _bin100
_bin100end:
_codtosym100:
adiw zl,_symtab*2
lpm r19,z
subi tmpl,-100
clr zl
; считаем десятки
_bin10:
subi tmpl,10
brcs _bin10end
inc zl
rjmp _bin10
_bin10end:
_codtosym10:
adiw zl,_symtab*2
lpm r18,z
subi tmpl,-10
; в остатке - единицы
mov zl,tmpl
adiw zl,_symtab*2
lpm r17,z
sbic portd,0
rjmp d1
sbic portd,1
rjmp d2
sbic portd,2
rjmp d0
d0: ;молодший розряд
cbi portd,2
cbi portd,1
sbi portd,0
out portb,r17
rjmp end
d1:
cbi portd,2
cbi portd,0
sbi portd,1
out portb,r18
rjmp end
d2: ;старший розряд
cbi portd,1
cbi portd,0
sbi portd,2
out portb,r19
end:
reti
|
|
|
|
06.12.2009, 16:27
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Стыковка подпрограммы измерения и динамической индикации
инидикация в главном цикле:
.include "m8def.inc"
.equ p_data=Portb
.equ p_cv=Portd
.def tmpl=r17
.def tmph=r18
.include "macro.inc"
.DSEG
dg0: .byte 1
dg1: .byte 1
dg2: .byte 1
.CSEG
.org 0
rjmp reset
.org 0x13
rjmp _symtab
_symtab:
;таблица истинности декодера
; hgfedcba hgfedcba
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
reset:
outi DDRB,0xFF; // 1111 1111
sbi DDRD,0 ;вкл. потрібн. виводів
sbi DDRD,1 ;керування на вихід
sbi DDRD,2 ; ---/----
loop:
ldi tmpl,low(999)
ldi tmph,high(999)
.include "binBCD.inc"
indic:
seg0
delay
seg1
delay
seg2
delay
rjmp loop
|
|
|
|
06.12.2009, 16:28
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Стыковка подпрограммы измерения и динамической индикации
Макросы:
macro.inc
.macro outi
ldi r16,@1
out @0,r16
.endmacro
.macro seg0
cbi p_cv,2
cbi p_cv,1
sbi p_cv,0
lds r16,dg0
out p_data,r16
.endmacro
.macro seg1
cbi p_cv,0
cbi p_cv,2
sbi p_cv,1
lds r16,dg1
out p_data,r16
.endmacro
.macro seg2
cbi p_cv,0
cbi p_cv,1
sbi p_cv,2
lds r16,dg2
out p_data,r16
.endmacro
.macro delay
; =============================
; delay loop generator
; 64000 cycles:
; -----------------------------
; delaying 63990 cycles:
ldi R17, $5A
WGLOOP0: ldi R18, $EC
WGLOOP1: dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 9 cycles:
ldi R17, $03
WGLOOP2: dec R17
brne WGLOOP2
; -----------------------------
; delaying 1 cycle:
nop
; =============================
.endmacro
binBCD:
binBCD3:
clr zh
clr zl ;обнуляем счетчик сотен (потом десятков)
; считаем сотни
_bin100:
subi tmpl,100
sbci tmph,0
brcs _bin100end
inc zl
rjmp _bin100
_bin100end:
_codtosym100:
adiw zl,_symtab*2
lpm r16,z
sts dg2,r16
subi tmpl,-100
clr zl
; считаем десятки
_bin10:
subi tmpl,10
brcs _bin10end
inc zl
rjmp _bin10
_bin10end:
_codtosym10:
adiw zl,_symtab*2
lpm r16,z
sts dg1,r16
subi tmpl,-10
; в остатке - единицы
mov zl,tmpl
adiw zl,_symtab*2
lpm r16,z
sts dg0,r16
|
|
|
|
06.12.2009, 16:46
|
|
Частый гость
Регистрация: 31.07.2009
Сообщений: 23
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Стыковка подпрограммы измерения и динамической индикации
Сообщение от sad-angel
|
c индикацией на таймере Протеус на индикаторах показивает всякую чушь,но “бежучая единица” (используються тран.ключи) едет и заметно что идут даные на индикатор. Программа не реагирует на изменения напряжения на входе АЦП.
|
Кусок начала подпрограммы индикации на таймере:
Сообщение от sad-angel
|
reset:
outi ddrb,0xFF; // 1111 1111
outi ddrd,0x7; // 0000 0111
|
Конечно будет показывать всякую чушь, т.к. нет инициализации стека, при возникновении прерывания подпрограмма будет уходить в никуда!
И где в этой же программе настройка АЦП?
|
|
|
|
06.12.2009, 16:55
|
|
Частый гость
Регистрация: 31.07.2009
Сообщений: 23
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Стыковка подпрограммы измерения и динамической индикации
Особо коды не смотрел, но на некоторые моменты сразу обратил внимание...
Сообщение от sad-angel
|
loop:
ldi tmpl,low(999)
ldi tmph,high(999)
.include "binBCD.inc"
indic:
seg0
delay
seg1
delay
seg2
delay
rjmp loop
|
В данном случае подсвеченную красным строчку не стоит располагать в основном цикле программы! Все подпрограммы, которые входят файл "binBCD.inc" каждый раз будут выполняться в основном цикле программы, что и вызовет большие глюки! Её следует расположить в самом начале текста после строчки ".include "m8def.inc", и по мере надобности вызывать отдельные подпрограммы, описанные в файле "binBCD.inc"
Последний раз редактировалось Alexey_sevast; 06.12.2009 в 16:58.
|
|
|
|
06.12.2009, 17:40
|
|
Частый гость
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Стыковка подпрограммы измерения и динамической индикации
outi SPH,High(RamEnd)
outi SPL,Low(RamEnd) ; инициализация СТЕКА
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:23.
|
|