Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

 
Опции темы
Непрочитано 31.03.2006, 16:07  
серега
Гость
 
Сообщений: n/a
По умолчанию пргроамма

переделайте ктонить пожалуйста в .hex
программу частота 4 мгц кварца. заранее спасибо



;*********************************
; 7 Segment LED Display millivoltmeter
;*********************************

.include "2313def.inc"


;***** 16 bit binary-to-packed-BDC Subroutine Register Variables

.equ AtBCD0 =13 ;address of tBCD0
.equ AtBCD2 =15 ;address of tBCD1

.def tBCD0 =r13 ;BCD value digits 1 and 0
.def tBCD1 =r14 ;BCD value digits 3 and 2
.def tBCD2 =r15 ;BCD value digit 4

.def fbinL =r16 ;binary value Low byte
.def fbinH =r17 ;binary value High byte
.def cnt16a =r18 ;loop counter
.def tmp16a =r19 ;temporary value

;*****other register assignments************

.def segmentvalue = r0
.equ digit1 = $01 ;store of first digit's binary value
.def digit1val = r1 ;storage of first digit's 7 segment image
.equ digit2 = $02 ;storage of second digit's binary value
.def digit2val = r2 ;storage of second digit's 7 segment image
.equ digit3 =$03 ;storage of third ditit's binary value
.def digit3val = r3 ;storage of thrid digit's 7 segment image
.def offsetl = r4 ;offsete to zero reading, low byte
.def offseth =r5 ;offset to zero reading, high byte
.def flagreg = r6 ;bit 0 true enables measurement during interrupt
.def intcountl = r7 ;24 bit timer for power management
.def intcountm =r8 ;count low, middle, and high bytes
.def intcounth = r9
.def dimflag = r10 ;if not zero, then dim the display
.def rezeroedflag = r11 ;nonzero if rezero has occured
.def temp = r20 ;general purpose variabl
.def digitvalue = r21 ;value of current digit
.def digitpointer = r22 ;pointer to digit to be written
.def interruptcount = r23 ;keeps track of which task to execute next
.def slowdownmeasurements =r24 ;counter to cause less frequent measurements
;when I set this up at +5V and when operating from a 3V battery
.equ dimtime = $708 ;dim time 30 mintues
.equ sleeptime =$E10 ;shut down time at 60 minutes

.ORG $0000
rjmp start
.ORG $0006
rjmp timerservice




start:
ldi temp,RAMEND ;Init Stack Pointer
out SPL,temp

ldi temp,$00 ;clear measurement during interrupt enable flag
mov flagreg,temp

ldi temp,$FF ;segment drivers
out DDRD,temp

ldi temp,$FC ;digit drivers and power to the external circuit
out DDRB,temp

ldi temp,$3C ;digit drivers and power to the external circuit
out PORTB,temp

ldi temp, $00 ;set up comparitor
out ACSR, temp

ldi temp,$FF
mov dimflag,temp

;set interrupt counter to zero
clr intcountl
clr intcountm
clr intcounth

clr rezeroedflag

ldi temp, $03 ; use temp to initaize prescaler 03
out TCCR0, temp
ldi temp,$00 ; use temp to initialize counter
out TCNT0,temp
ldi temp, $02 ; use temp to initialize TIMSK
out TIMSK,temp

ldi temp,$FF ;clear measurement during interrupt enable flag
mov flagreg,temp

sei ;ENABLE THE TIMER INTERRUPTS


loop:
;check to see if its time to dim the display

ldi temp,dimtime ;skip dimming if intcountm is ›‹ dimtime
eor temp,intcountm
brne dontdim
clr dimflag ;make register $FF if its time.
com dimflag

dontdim:


;check if its past time to sleep the machine

ldi temp,sleeptime ;skip sleeping if intcountm is ›‹ sleep
eor temp,intcountm
brne dontsleep

;routine to sleep the machine

cli ;disble all interrupts

clr temp
out TCCR1b,temp ;stop timer 1
out TCCR0,temp ;stop timer 0

ldi temp,$18 ;make sure watch dog timer is disabled
out wdtcr,temp
ldi temp,$10
out wdtcr,temp

cbi ACSR,$07 ;turn off comparitor
;
clr temp ;make I/O pins inputs
out DDRB,temp
out DDRD,temp

ldi temp, $30
out MCUCR,temp ; set MCUCR bit 4 to set power down mode for sleep and
; set MCUCR bit 5 to enable sleep
sleep ; enter sleep. Reset to wake up.

dontsleep:

;Set up rezeroing of A-to-D after running some short time.
;rezeroiong only happens once and is done in the A-to-D routine inside
;the T0 interrupt.
tst rezeroedflag
brne dontrezero
ldi temp,$02
eor temp,intcountm
brne dontrezero
ldi temp,$5A
mov rezeroedflag,temp ;$5A is the secret word to cause rezeroing

dontrezero:



rjmp loop


;**** A P P L I C A T I O N N O T E A V R 2 0 4 ************************
;* Title: BCD Arithmetics
;* Version: 1.1
;* Last updated: 97.07.04
;* Target: AT90Sxxxx (All AVR Devices)
;*
;* Support E-mail: avr@atmel.com
;*

;* DESCRIPTION
;* This Application Note lists subroutines for the following Binary Coded
;* Decimal arithmetic applications:
;*
;* Binary 16 to BCD Conversion (special considerations for AT90Sxx0x)



;***** Code

bin2BCD16:
ldi cnt16a,16 ;Init loop counter
clr tBCD2 ;clear result (3 bytes)
clr tBCD1
clr tBCD0
clr ZH ;clear ZH (not needed for AT90Sxx0x)
bBCDx_1:lsl fbinL ;shift input value
rol fbinH ;through all bytes
rol tBCD0 ;
rol tBCD1
rol tBCD2
dec cnt16a ;decrement loop counter
brne bBCDx_2 ;if counter not zero
ret ; return

bBCDx_2:ldi r30,AtBCD2+1 ;Z points to result MSB + 1
bBCDx_3:
ld tmp16a,-Z ;get (Z) with pre-decrement
;----------------------------------------------------------------
;For AT90Sxx0x, substitute the above line with:
;
; dec ZL
; ld tmp16a,Z
;
;----------------------------------------------------------------
subi tmp16a,-$03 ;add 0x03
sbrc tmp16a,3 ;if bit 3 not clear
st Z,tmp16a ; store back
ld tmp16a,Z ;get (Z)
subi tmp16a,-$30 ;add 0x30
sbrc tmp16a,7 ;if bit 7 not clear
st Z,tmp16a ; store back
cpi ZL,AtBCD0 ;done all three?
brne bBCDx_3 ;loop again if not
rjmp bBCDx_1










putsegments: ; Enter with value (0..9) in digitvalue,
; and destingation digit in digitpointer
ldi ZH,high(2*ledlut) ; Load high part of byte address into ZH
ldi ZL,low(2*ledlut) ; Load low part of byte address into ZL
add ZL,digitvalue ; Add index (which is digitvalue) to LUT address
ldi temp,$00
adc ZH,temp
lpm ; Load byte from program memory into r0
mov ZL,digitpointer ;Point Z register to the desination memroy location
ldi ZH,$00
st Z,r0 ;move contets of r0 to location pointed to by digitpointer
ret



dimifnecessary:
;check if its past time to start dimming

tst dimflag
breq donedim
dimit: ;routine to dim the display

dimmingtime: ;leave the chars on some some
ldi fbinL,$00
ldi fbinH,$03
dimmingtimeloop:
dec fbinL
cpi fbinL,$00
brne dimmingtimeloop
dec fbinH
cpi fbinH,$00
brne dimmingtimeloop
;now that thime's up, blank display to dim.

cbi PORTB,2 ;blank all digits
cbi PORTB,3
cbi PORTB,4



donedim:
ret

;************************



timerservice: ;service timer interrupt

;round-robin multitasking, different task on each interrupt
;Display digit1
;display digit2
;display digit3
;acquire new ADC value and put in digit registers
push temp
push xl
push xh
lds temp,$5F ;push status register onto stack
push temp
push fbinL
push fbinH


ldi temp,$01 ;keep timer for dimming and shut down
add intcountl,temp
clr temp
adc intcountm,temp
adc intcounth,temp

inc interruptcount ;point to the next task
andi interruptcount,$03 ;only four tasks allowed

cbi PORTB,2 ;blank all digits
cbi PORTB,3 ;by making all cathode drivers inputs
cbi PORTB,4

;round-robin starts here
cpi interruptcount,$00
breq showdigit1
cpi interruptcount,$01
breq showdigit2
cpi interruptcount,$02
breq showdigit3
cpi interruptcount,$03
breq AtoDConversion
rjmp endoftimerservice ;go back and wait for another interrupt

showdigit1:
out PORTD,digit1val ;copy digit value to output port
sbi PORTB,4 ;enable this digit
rcall dimifnecessary
rjmp endoftimerservice


showdigit2:
out PORTD,digit2val ;copy digit value to output port
sbi PORTB,3 ;enable this digit
rcall dimifnecessary
rjmp endoftimerservice



showdigit3:
out PORTD,digit3val ;copy digit value to output port
sbi PORTB,2 ;enable this digit
rcall dimifnecessary
rjmp endoftimerservice



AtoDConversion:
;convert input voltage to a value, set flag for foreground routine to convert to BCD and store in digit memories
sbrs flagreg,$01 ;if flag not set, don't do conversions
jrelay: rjmp finishedconverison

inc slowdownmeasurements
cpi slowdownmeasurements,$08
brne jrelay ;don't do it, didn't wait long enough
clr slowdownmeasurements ;set counter to zero for next time


;set PORTB bit 0 to 0 to assure no current out of pins
cbi PORTB,0


;set DDRB, bit 0 an output. This discharges the capacitor on the I/O pin.
sbi DDRB,0

ldi fbinL,$00
ldi fbinH,$08

turnondelay:
dec fbinL
cpi fbinL,$00
brne turnondelay

;set DDRB bit 0 to input
cbi DDRB,$00


ldi xh,$00
ldi xl,$00

waitforramp:
sbiw xhl,1
in temp,acsr
sbis acsr,aco ;branch back to waiting if comparitor not tripped
rjmp waitforramp

;Zero ADC by measuring offset. Only happens once.
; after running about a
ldi temp,$5A
eor temp,rezeroedflag
brne dontrezeroagain
mov offsetl,xl
mov offseth,xh
ldi temp,$FF
mov rezeroedflag,temp
clr dimflag

dontrezeroagain:

sub xl,offsetl ;subtract offset to zero reference reading
sbc xh,offseth
brpl positivenumber
ldi xh,0 ;if we'r here, its negative, so set to zero;
ldi xl,0 ;negative field strength doesn't make any sense in the real world
positivenumber: ;now we have the number, we just need to convert it.



; Check for overflow
mov temp,xh
andi temp,$0F
subi temp,$03
brpl overflow
brne defintelynotoverflow

mov temp,xl
subi temp,$E7
brpl overflow

defintelynotoverflow:

mov fbinL,xl ;move counter contents to input for number conversion
mov fbinH,xh
rcall bin2BCD16 ;Convert to 2.5-byte packed BCD format
;result: tBCD2:tBCD1:tBCD0 = $054321

mov digitvalue,tBCD0 ; now send it to the LED display
andi digitvalue,$0F
ldi digitpointer,$01
rcall putsegments

mov digitvalue,tBCD0
lsr digitvalue
lsr digitvalue
lsr digitvalue
lsr digitvalue
ldi digitpointer,$02
rcall putsegments

mov digitvalue,tBCD1
andi digitvalue,$0F
ldi digitpointer,$03
rcall putsegments
rjmp finishedconverison

overflow:


;set display for overflow indication
ldi digitvalue,$0A
ldi digitpointer,$01
rcall putsegments

ldi digitvalue,$0A
ldi digitpointer,$02
rcall putsegments

ldi digitvalue,$0A
ldi digitpointer,$03
rcall putsegments



finishedconverison:

endoftimerservice:
pop fbinH
pop fbinL
pop temp
sts $5F,temp ;restore status register
pop xh
pop xl
pop temp

reti



ledlut: ;LED Look-Up Table, Segent codes for 0..9 on 7 segment display
.db $3F,$06,$5B,$4F,$66,$6D,$7d,$07,$7F,$6F,$09,$08
Реклама:
 
Непрочитано 31.03.2006, 21:47  
leonshat
Частый гость
 
Регистрация: 19.02.2006
Сообщений: 12
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
leonshat на пути к лучшему
По умолчанию

При ассемблировании в AVR Studio (v.11) выдано сообщение:
Building project...
AVRASM: AVR macro assembler 2.0.31 (build 58 Apr 21 2005 14:17:40)
Copyright (C) 1995-2005 ATMEL Corporation
C:\Temp\x.asm(5): Including file 'C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\2313def.inc'
C:\Temp\x.asm(101): error: Operand(s) out of range in 'ldi r20,0x708'
C:\Temp\x.asm(112): error: Operand(s) out of range in 'ldi r20,0xe10'
Assembly failed, 2 errors, 0 warnings
--------------------------
Ошибки указывают на строки с командами:
;check to see if its time to dim the display
ldi temp,dimtime ;skip dimming if intcountm is ›‹ dimtime
;check if its past time to sleep the machine
ldi temp,sleeptime ;skip sleeping if intcountm is ›‹ sleep
Для преобразования нужен ассемблер. Из устаревших могу предложить AVR Studio v.3.20 (размер 5 Мбайт).
leonshat вне форума  
 

Закладки
Опции темы

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

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

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


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


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