Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Стыковка подпрограммы измерения и динамической индикации

Непрочитано 06.12.2009, 15:23  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию Стыковка подпрограммы измерения и динамической индикации

Есть подпрограмма для измирения переменного напряжения: по прерыванию таймера Т1 каждых 625 мкс запускаеться АЦП,делает замер,и в обработчике АЦП обрабатывает результат (возводить в квадрат результат измирения,сумирует квадраты за 32 выборки,потом усредняет результат и извлекает квадратный корень).
виборки производиться в течении 20мс (периода синусоиды)

Другая подпрограмма - динамическая индикация: у меня есть два варианты реализации на таймере Т0 и в главном цикле программы.

Отдельно подпрограммы работают,вместе нет!
Не могу понять в чем причина!

c индикацией на таймере Протеус на индикаторах показивает всякую чушь,но “бежучая единица” (используються тран.ключи) едет и заметно что идут даные на индикатор. Программа не реагирует на изминения напряжения на входе АЦП.

При индикации в главном цикле - отображаеться “0″ но не идут даные на дисплей и нет “бежучей единицы”
Реклама:
sad-angel вне форума  
Непрочитано 06.12.2009, 15:23  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию Re: Стиковка подпрограммы измирения и динамической индикации

МК ATmega8
sad-angel вне форума  
Непрочитано 06.12.2009, 15:30  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Стиковка подпрограммы измирения и динамической индикации

Телепаты в запое ...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 06.12.2009, 16:25  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию 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
sad-angel вне форума  
Непрочитано 06.12.2009, 16:26  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию 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
sad-angel вне форума  
Непрочитано 06.12.2009, 16:27  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию 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
sad-angel вне форума  
Непрочитано 06.12.2009, 16:28  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию 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
sad-angel вне форума  
Непрочитано 06.12.2009, 16:46  
Alexey_sevast
Частый гость
 
Регистрация: 31.07.2009
Сообщений: 23
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Alexey_sevast на пути к лучшему
По умолчанию Re: Стыковка подпрограммы измерения и динамической индикации

Сообщение от sad-angel Посмотреть сообщение
c индикацией на таймере Протеус на индикаторах показивает всякую чушь,но “бежучая единица” (используються тран.ключи) едет и заметно что идут даные на индикатор. Программа не реагирует на изменения напряжения на входе АЦП.
Кусок начала подпрограммы индикации на таймере:
Сообщение от sad-angel Посмотреть сообщение
reset:
outi ddrb,0xFF; // 1111 1111
outi ddrd,0x7; // 0000 0111
Конечно будет показывать всякую чушь, т.к. нет инициализации стека, при возникновении прерывания подпрограмма будет уходить в никуда!
И где в этой же программе настройка АЦП?
Alexey_sevast вне форума  
Непрочитано 06.12.2009, 16:55  
Alexey_sevast
Частый гость
 
Регистрация: 31.07.2009
Сообщений: 23
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Alexey_sevast на пути к лучшему
По умолчанию 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.
Alexey_sevast вне форума  
Непрочитано 06.12.2009, 17:40  
sad-angel
Частый гость
 
Регистрация: 08.02.2009
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sad-angel на пути к лучшему
По умолчанию Re: Стыковка подпрограммы измерения и динамической индикации

outi SPH,High(RamEnd)
outi SPL,Low(RamEnd) ; инициализация СТЕКА
sad-angel вне форума  
 
Опции темы

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

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

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


Часовой пояс GMT +4, время: 19:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.