Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Project Name : Soldering Iron Controller ;
- ; Applications : Soldering, Rework, Etc. ;
- ; Target Handle : HAKKO H-907ESD ;
- ; Programer : Min-ju, Lee ;
- ; web mail : [email protected] ;
- ; web page : www.itstyle.kr ;
- ; s/w ver : v 3.0.1 (2011/11/21) ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Ŕý´ë ÁÖŔÇ! : ÁÖŔÇÇĎÁö ľĘŔ¸¸é MCU¶Ç´Â ł»żÜşÎ ȸ·Î ĽŐ»óŔ§ÇčŔĚ ŔÖŔ˝!! ˝şÇÇÄżżˇ ŔúÁÖĆÄ °ř±ŢµÇ¸é şŇ·®łŻ °ˇ´ÉĽş ŔÖŔ¸´Ď ÁÖŔÇÇĎĽĽżä!!
- ; ĽŇ˝ş ´Ůżî·Îµĺ Ŕü Ç»ÁîşńĆ® ¸ŐŔú ĽĽĆĂÇҰÍ!! -> ł»şÎ 8MHz RC żŔ˝Ç·ąŔĚĹÍ
- ; ŸŔ̸ÓÄ«żîĹÍ, µđ˝şÇĂ·ąŔĚÂĘ ŔÎĹÍ·´Ć® ĽöÁ¤ ±ÝÁö!!
- .include "m8def.inc"
- .macro ldiw
- ldi @0L,low(@1)
- ldi @0H,high(@1)
- .endm
- .macro pusw
- push @0L
- push @0H
- .endm
- .macro popw
- pop @0H
- pop @0L
- .endm
- .macro outi
- ldi tmp,@1
- out @0,tmp
- .endm
- .def digit_1 = r2
- .def digit_2 = r3
- .def digit_3 = r4
- .def zero = r5
- .def setting_temp = r6
- .def key_flag = r7
- .def temp_comp_flag = r8
- .def speaker_freq_div = r9
- .def adc_result_low = r10
- .def adc_result_high = r11
- .def adc_buff_low = r12
- .def adc_buff_high = r13
- .def adc_buff_byte3 = r14
- .def adc_count = r15
- .def tmp = r16
- .def tmp2 = r17
- .def tmp3 = r18
- .def tmp4 = r19
- .def key_count = r23
- ;;;;;;;;;; key port
- .equ key_inc = 0b01100000
- .equ key_dec = 0b10100000
- .equ key_mode = 0b11000000
- .equ key_no = 0b11100000
- .equ key_shop = 0b10110000
- .equ key_star = 0b00000000
- ;;;;;;;;;; fnd pattern
- .equ num_0 = 0b11000000
- .equ num_1 = 0b11111001
- .equ num_2 = 0b10100100
- .equ num_3 = 0b10110000
- .equ num_4 = 0b10011001
- .equ num_5 = 0b10010010
- .equ num_6 = 0b10000010
- .equ num_7 = 0b11011000
- .equ num_8 = 0b10000000
- .equ num_9 = 0b10010000
- .equ num_dot = 0b01111111
- .equ num_minus = 0b10111111
- .equ num_clear = 0b11111111
- .equ alpha_d = 0b10100001
- .equ alpha_l = 0b11000111
- .equ alpha_o = 0b10100011
- .equ alpha_t = 0b10000111
- .equ alpha_f = 0b10001110
- .equ alpha_s = 0b10010010
- .equ alpha_p = 0b10001100
- .equ alpha_e = 0b10000110
- .equ alpha_u = 0b11100011
- .equ alpha_h = 0b10001001
- .equ alpha_i = 0b11111011
- .equ alpha_dual_l = 0b11001001
- .eseg
- using_temp: .byte 1 ; last setting temperature
- sleep_timer: .byte 1 ; sleep mode timer minutes(0 = not use, 1 = 10min, 2 = 20mins)
- preset1_temp: .byte 1 ; preset temp
- preset2_temp: .byte 1
- preset3_temp: .byte 1
- .equ eep_start_addr = using_temp
- .dseg
- set_temp_buffer: .byte 2 ; setting mode use only
- timer_buffer: .byte 1
- timer_count: .byte 4
- request_beep_on: .byte 1
- beep_highfreg_enahle: .byte 1 ; 1 == en, 0== disable
- .cseg
- .org 0x0000
- rjmp reset ; Reset Handler
- reti ; IRQ0 Handler
- reti ; IRQ1 Handler
- reti ; Timer2 Compare Handler
- reti ; Timer2 Overflow Handler
- reti ; Timer1 Capture Handler
- reti ; Timer1 CompareA Handler
- reti ; Timer1 CompareB Handler
- reti ; Timer1 Overflow Handler
- rjmp display ; Timer0 Overflow Handler
- reti ; SPI Transfer Complete Handler
- reti ; USART RX Complete Handler
- reti ; UDR Empty Handler
- reti ; USART TX Complete Handler
- rjmp check_temp ; ADC Conversion Complete Handler
- reti ; EEPROM Ready Handler
- reti ; Analog Comparator Handler
- reti ; Two-wire Serial Interface Handler
- reti ; Store Program Memory Ready Handler
- display:
- push tmp
- in tmp,SREG
- push tmp
- outi PORTD,0xff ; fnd off
- in tmp,PORTC ; select fnd digit
- lsr tmp
- andi tmp,0x38
- brne PC+2
- ldi tmp,0x20
- out PORTC,tmp
- sbic PORTC,5 ; fnd font out
- out PORTD,digit_1
- sbic PORTC,4
- out PORTD,digit_2
- sbic PORTC,3
- out PORTD,digit_3
- lds tmp,beep_highfreg_enahle
- cpi tmp,1
- breq PC+4
- inc speaker_freq_div
- sbrs speaker_freq_div,0
- rjmp PC+8
- sbis DDRB,PB0 ; if DDRB0 == 1, speaker on
- rjmp PC+5 ; else if DDRB0 != 1, speaker off
- sbis PORTB,PB0 ; output toggle(1kHz output)
- rjmp PC+3
- cbi PORTB,PB0
- rjmp PC+2
- sbi PORTB,PB0
- lds tmp,timer_buffer ; sleep timer
- cpi tmp,0
- breq PC+29
- lds tmp,timer_count+0
- subi tmp,1
- sts timer_count+0,tmp
- lds tmp,timer_count+1
- sbci tmp,0
- sts timer_count+1,tmp
- lds tmp,timer_count+2
- sbci tmp,0
- sts timer_count+2,tmp
- lds tmp,timer_count+3
- sbci tmp,0
- sts timer_count+3,tmp
- brne PC+8
- ldiw z,RAMEND
- out SPH,zH
- out SPL,zL
- sei
- rcall beep_long
- rjmp cooling_entry
- pop tmp
- out SREG,tmp
- pop tmp
- reti
- ; ADC interrupt
- .equ offset_value = 269
- .equ center_value = 300+offset_value
- check_temp:
- push tmp
- in tmp,SREG
- push tmp
- push tmp2
- ; push tmp3
- ; push tmp4
- push r0
- push r1
- in tmp,ADCL
- in tmp2,ADCH
- add adc_buff_low,tmp
- adc adc_buff_high,tmp2
- adc adc_buff_byte3,zero
- dec adc_count
- brne PC+15 ; ľĆ·ˇŔÇ ŔĚŔŻ·Î.... ; PC+40 ; skip store result
- ldi tmp,8
- lsr adc_buff_byte3
- ror adc_buff_high
- ror adc_buff_low
- dec tmp
- brne PC-4
- ; movw tmp2:tmp,adc_buff_high:adc_buff_low ; 2011/11/19 µđąŮŔĚ˝ş¸¶Ć®żř°íżëżˇĽ´Â şńĽ±Çü ż¬»ę˝Ä Ŕűżë ľČÇÔ.
- ; cpi tmp2,high(center_value)
- ; breq PC+3
- ; brcs PC+14
- ; rjmp PC+4
- ; cpi tmp,low(center_value)
- ; breq PC+19
- ; brcs PC+10
- ; subi tmp,low(center_value) ; over 300'c
- ; sbci tmp2,high(center_value)
- ; lsr tmp2
- ; ror tmp
- ; lsr tmp2
- ; ror tmp
- ; add adc_buff_low,tmp
- ; adc adc_buff_high,tmp2
- ; rjmp PC+9
- ; ldi tmp,low(center_value) ; under 300'c
- ; ldi tmp2,high(center_value)
- ; sub tmp,adc_buff_low
- ; sbc tmp2,adc_buff_high
- ; lsr tmp2
- ; ror tmp
- ; sub adc_buff_low,tmp
- ; sbc adc_buff_high,tmp2
- movw adc_result_high:adc_result_low,adc_buff_high:adc_buff_low
- ldi tmp,low(offset_value)
- ldi tmp2,high(offset_value)
- sub adc_result_low,tmp
- sbc adc_result_high,tmp2
- clr adc_buff_byte3
- clr adc_buff_high
- clr adc_buff_low
- ldi tmp,10
- mul setting_temp,tmp
- ; ldi tmp,10 ;;;;; allow temp. error range +-
- sub r0,adc_result_low
- sbc r1,adc_result_high
- breq PC+19
- brpl PC+6
- com r0 ; if minus, 2'c complement value
- com r1
- inc r0
- brne PC+2
- inc r1
- tst r1
- brne PC+3
- cp r0,tmp ; out range temp
- brcs PC+4
- clr temp_comp_flag ; real temp display
- inc temp_comp_flag
- ; sts request_beep_on,temp_comp_flag ; spk pff
- rjmp PC+6
- in tmp,sorder_pwm_value
- cpi tmp,200
- brcs PC+3
- outi sorder_pwm_value,20 ; low duty heating
- ldi tmp,10
- mul setting_temp,tmp
- ldi tmp,0x1f
- and tmp,adc_count
- brne PC+25
- in tmp,sorder_pwm_value ; read pwm
- cp adc_result_low,r0 ; 1st compare
- cpc adc_result_high,r1
- breq PC+7
- inc r0
- brne PC+2
- inc r1
- cp adc_result_low,r0 ; 2times comapare ; µđąŮŔĚ˝ş¸¶Ć® żř°íżë ÇĘżäx : ż¬»ę˝Ä ŔűżëÇŇ °ćżě ŔϺΠǥ˝Ă ľČµÇ´Â żÂµµ¶§ą®żˇ ŔĚ°Ô ÇĘżäÇߴµĄ ÇöŔç´Â ÇĘżäx
- cpc adc_result_high,r1
- brne PC+6
- tst temp_comp_flag
- breq PC+3
- sts request_beep_on,zero ; spk req
- clr temp_comp_flag
- brcs PC+5 ;;;;;
- cpi tmp,0
- breq PC+6
- dec tmp
- rjmp PC+4
- cpi tmp,255
- breq PC+2
- inc tmp
- out sorder_pwm_value,tmp ; write pwm
- pop r1
- pop r0
- ; pop tmp4
- ; pop tmp3
- pop tmp2
- pop tmp
- out SREG,tmp
- pop tmp
- reti
- reset:
- ldi tmp,low(RAMEND)
- ldi tmp2,high(RAMEND)
- out SPH,tmp2
- out SPL,tmp
- clr zero ; global zero ram
- clr temp_comp_flag ; temp_comp_flag = 1 is not match temperature
- inc temp_comp_flag
- rcall wait_5ms
- outi DDRB,0x02 ; switch port & piezo input
- outi PORTB,0
- outi DDRC,0x38 ; fnd digit select
- outi PORTC,0x20 ; all drive off
- outi DDRD,0xff ; fnd pattern output
- outi PORTD,alpha_e ; all leds off
- ;;;;; eeprom check
- ldi tmp2,eep_start_addr ; read last set temperature
- mov tmp,tmp2
- rcall eep_read
- cpi tmp,0x32
- brcc eep_init
- inc tmp2
- cpi tmp2,eep_start_addr+5 ; check end address
- brne PC-6
- rjmp eep_pass
- eep_init:
- ldi tmp4,alpha_u ; all leds off
- ldiw z,eep_init_val*2
- ldi tmp2,eep_start_addr
- lpm tmp,z+
- rcall eep_write
- inc tmp2
- cpi tmp2,eep_start_addr+5
- brne PC-4
- rjmp eep_pass
- eep_init_val:
- .db 0x14,0x00,0x14,0x1e,0x28,0
- eep_pass:
- outi TCCR0,0x02 ; prescaler
- outi TIMSK,(1<<TOIE0) ; timer 0 overflow inturrupt enable
- outi TCCR1A,(1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(1<<WGM10)
- outi TCCR1B,(1<<CS12)|(1<<CS11)|(0<<CS10)
- .equ sorder_pwm_value = OCR1AL
- outi sorder_pwm_value,0 ; heater off
- outi ADMUX,(0<<REFS1)|(1<<REFS0) ; ADC0 input, using AREF, ADLAR is 0
- outi ADCSRA,(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADIE)|0x07 ; 128 division factor, Int on, free run, ADC on
- ldi tmp,using_temp ; read last set temperature
- rcall eep_read
- mov setting_temp,tmp
- rcall sleep_timer_load
- clr digit_1 ; led test
- clr digit_2
- clr digit_3
- sei
- rcall wait_1sec
- dec digit_1 ; all off
- dec digit_2
- dec digit_3
- rcall wait_250ms
- rcall beep_short
- main_loop_entry:
- ldi tmp,using_temp ; read last set temperature
- rcall eep_read
- mov setting_temp,tmp
- rcall sleep_timer_load
- main_loop:
- movw tmp2:tmp,adc_result_high:adc_result_low
- ldi tmp3,high(495)
- cpi tmp,low(495)
- cpc tmp2,tmp3
- brcs PC+21
- brmi PC+20
- ldi tmp,1
- sts beep_highfreg_enahle,tmp
- sbi DDRB,PB0
- ldi tmp,alpha_s
- mov digit_1,tmp
- ldi tmp,num_minus
- mov digit_2,tmp
- ldi tmp,alpha_e
- mov digit_3,tmp
- rcall wait_250ms
- rcall clear_all
- cbi DDRB,PB0
- sts beep_highfreg_enahle,zero
- rcall wait_250ms
- outi sorder_pwm_value,0 ; heater off
- rjmp main_loop
- tst adc_result_high
- brpl PC+10
- ldi tmp,num_clear
- mov digit_1,tmp
- ldi tmp,alpha_l
- mov digit_2,tmp
- ldi tmp,alpha_o&~0x80
- mov digit_3,tmp
- outi sorder_pwm_value,255 ; heater full on
- rjmp main_loop
- tst temp_comp_flag
- breq PC+20
- ldi tmp3,low(10)
- ldi tmp4,high(10)
- rcall div16u
- push r20
- rcall div16u
- push r20
- rcall div16u
- mov tmp,r20
- rcall font_load
- mov digit_1,tmp
- pop tmp
- rcall font_load
- mov digit_2,tmp
- pop tmp
- rcall font_load
- sbic PINB,PB1
- andi tmp,~0x80
- mov digit_3,tmp
- rjmp PC+13
- mov tmp,setting_temp
- ldi tmp2,10
- rcall div08u
- rcall font_load
- mov digit_1,tmp
- mov tmp,tmp3
- rcall font_load
- mov digit_2,tmp
- ldi tmp,num_0
- sbic PINB,PB1
- andi tmp,~0x80
- mov digit_3,tmp
- lds tmp,request_beep_on
- tst tmp
- brne PC+2
- rcall beep_short
- ldi tmp,1
- sts request_beep_on,tmp
- rcall key_check
- cpi tmp,key_inc ; preset # 1
- brne PC+3
- ldi tmp2,preset1_temp
- rjmp check_preset
- cpi tmp,key_dec ; preset # 2
- brne PC+3
- ldi tmp2,preset2_temp
- rjmp check_preset
- cpi tmp,key_mode ; preset # 3
- brne PC+3
- ldi tmp2,preset3_temp
- rjmp check_preset
- rjmp main_loop
- check_set_temp:
- ldi tmp,alpha_s
- mov digit_1,tmp
- ldi tmp,alpha_e
- mov digit_2,tmp
- ldi tmp,alpha_t
- mov digit_3,tmp
- rcall beep_short_2times
- ldi tmp3,250 ; press 1sec< to set to sleep timer
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq set_temp_entry ; press short go to set temp
- rcall wait_5ms
- dec tmp3
- brne PC-6
- rjmp check_set_sleep
- set_temp_entry:
- rcall sleep_timer_load
- mov tmp,setting_temp
- ldi tmp2,10
- rcall div08u
- sts set_temp_buffer,tmp ; digit 1
- sts set_temp_buffer+1,tmp3 ; digit 2
- rcall beep_short
- clr xL
- set_temp_loop:
- ldi r24,low(3000)
- ldi r25,high(3000)
- set_temp_loop_count_resume:
- sbiw r25:r24,1
- brne PC+2
- rjmp main_loop_entry
- inc xH ; blink count
- ldiw y,set_temp_buffer
- cpi xL,0
- brne PC+10
- ldd tmp,y+0
- cpi tmp,5
- brne PC+3
- ldi tmp,2
- rjmp PC+4
- cpi tmp,1
- brne PC+2
- ldi tmp,4
- std y+0,tmp
- ldd tmp,y+0
- rcall font_load
- cpi key_count,key_def_value
- brne PC+5
- cpi xL,0
- brne PC+3
- sbrs xH,5 ; blink
- ldi tmp,num_clear ; clear
- mov digit_1,tmp
- ldd tmp,y+1
- rcall font_load
- cpi key_count,key_def_value
- brne PC+5
- cpi xL,1
- brne PC+3
- sbrs xH,5 ; blink
- ldi tmp,num_clear ; clear
- mov digit_2,tmp
- ldi tmp,num_0
- mov digit_3,tmp
- add yL,xL
- adc yH,zero
- rcall key_check
- cpi tmp,key_inc&key_dec
- brne PC+2
- rjmp turbo_mode_entry
- cpi tmp,key_mode ; enter
- brne PC+19; PC+8
- ldi tmp3,250 ; press 1sec< to set to sleep timer ; 2011/11/19 µđąŮŔĚ˝ş¸¶Ć® żř°íżë... ż©±âĽ± ĂëĽŇ¸¦ modeŰ ±ć°Ô ´©¸§ µĘ.
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_mode
- brne PC+7 ; press stop go to next position or sort...
- rcall wait_5ms
- dec tmp3
- brne PC-6
- rcall beep_long
- rcall clear_all
- rjmp main_loop_entry
- cpi xL,1 ; end pos
- brne PC+3
- rcall beep_short_2times
- rjmp set_temp_sort
- inc xL
- rcall beep_short
- rjmp set_temp_loop
- cpi tmp,key_inc
- brne PC+7
- ld tmp,y
- inc tmp
- cpi tmp,10
- brcs PC+2
- clr tmp
- st y,tmp
- cpi tmp,key_dec
- brne PC+7
- ld tmp,y
- dec tmp
- cpi tmp,10
- brcs PC+2
- ldi tmp,9
- st y,tmp
- ; cpi tmp,key_esc ; 2011/11/19 µđąŮŔĚ˝ş¸¶Ć® żř°íżë... ąöư Ľö şŻ°ćŔ¸·Î »čÁ¦.
- ; brne PC+8
- ; cpi xL,0
- ; brne PC+3
- ; rcall beep_long
- ; rjmp main_loop_entry
- ; clr xL
- ; rcall beep_short
- ; rjmp set_temp_loop
- rjmp set_temp_loop_count_resume
- check_preset:
- ; do not use 'tmp2' global register
- ldi tmp3,250 ; press 1sec< to set to preset
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq load_preset
- rcall wait_5ms
- dec tmp3
- brne PC-6
- ; rjmp store_preset
- store_preset:
- push tmp2 ; back up preset number
- subi tmp2,preset1_temp-1
- mov tmp,tmp2
- rcall font_load
- mov digit_2,tmp
- mov tmp2,tmp
- ldi tmp,num_minus
- mov digit_1,tmp
- mov digit_3,digit_1
- rcall beep_short_2times
- ; do not use 'tmp2' global register
- ldi tmp3,250 ; press 1sec< to set temp(by press mode key) or go main loop(else all key)
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq PC+11
- rcall wait_5ms
- dec tmp3
- brne PC-6
- pop tmp ; read dump preset value
- cpi tmp2,num_3 ; press preset -3- ?
- breq PC+4
- rcall clear_all
- rcall beep_long
- rjmp main_loop_entry ; if not, cancel
- rjmp check_set_temp ; if yes, go set temp
- mov tmp,setting_temp
- pop tmp2
- rcall eep_write ; temp info save to preset
- ldi tmp2,10
- rcall div08u
- sts set_temp_buffer,tmp
- sts set_temp_buffer+1,tmp3
- rcall beep_dingdingdong
- rcall wait_1sec
- rjmp set_temp_sort
- load_preset:
- mov tmp,tmp2
- rcall eep_read
- ldi tmp2,10
- rcall div08u
- sts set_temp_buffer,tmp
- sts set_temp_buffer+1,tmp3
- rcall beep_dingdingdong
- ; rjmp set_temp_sort
- set_temp_sort:
- ldi tmp2,2 ; blink to times
- rcall clear_all
- rcall wait_250ms
- lds tmp,set_temp_buffer
- rcall font_load
- mov digit_1,tmp
- lds tmp,set_temp_buffer+1
- rcall font_load
- mov digit_2,tmp
- ldi tmp,num_0
- mov digit_3,tmp
- rcall wait_250ms
- dec tmp2
- brne PC-14
- lds tmp,set_temp_buffer
- ldi tmp2,10
- mul tmp,tmp2
- lds tmp,set_temp_buffer+1
- add tmp,r0
- mov setting_temp,tmp
- ldi tmp2,using_temp ; save last set temperature
- rcall eep_write
- clr temp_comp_flag
- inc temp_comp_flag
- rjmp main_loop_entry
- check_set_sleep:
- rcall beep_short_2times
- ldi tmp3,250 ; total press 2sec< to go sleep
- ldi tmp,alpha_s
- mov digit_1,tmp
- ldi tmp,alpha_l
- mov digit_2,tmp
- ldi tmp,alpha_p
- mov digit_3,tmp
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq set_sleep_entry ; press short to set to sleep timer
- rcall wait_5ms
- dec tmp3
- brne PC-6
- rjmp cooling_entry
- set_sleep_entry:
- rcall beep_short
- set_sleep_loop:
- ldi r24,low(3000)
- ldi r25,high(3000)
- set_sleep_loop_resume:
- sbiw r25:r24,1
- brne PC+2
- rjmp main_loop_entry
- inc xH
- ldiw y,timer_buffer
- cpi key_count,key_def_value
- brne PC+3
- sbrs xH,5 ; blink
- rjmp PC+3
- rcall set_sleep_display
- rjmp PC+5
- clr digit_1
- dec digit_1
- mov digit_2,digit_1
- mov digit_3,digit_2
- rcall key_check
- cpi tmp,key_mode ; enter
- brne PC+14
- ldi tmp3,250 ; press 1sec< to set to sleep timer ; 2011/11/19 µđąŮŔĚ˝ş¸¶Ć® żř°íżë... ż©±âĽ± ĂëĽŇ¸¦ modeŰ ±ć°Ô ´©¸§ µĘ.
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_mode
- brne PC+7 ; press stop go to next position or sort...
- rcall wait_5ms
- dec tmp3
- brne PC-6
- rcall beep_long
- rcall beep_short
- rjmp main_loop_entry
- rcall beep_dingdingdong
- rjmp set_sleep_sort
- cpi tmp,key_inc
- brne PC+8
- ldd tmp,y+0
- inc tmp
- cpi tmp,10
- brcs PC+2
- clr tmp
- std y+0,tmp
- rjmp set_sleep_loop
- cpi tmp,key_dec
- brne PC+8
- ldd tmp,y+0
- dec tmp
- cpi tmp,10
- brcs PC+2
- ldi tmp,9
- std y+0,tmp
- rjmp set_sleep_loop
- ; cpi tmp,key_esc ; 2011/11/19 µđąŮŔĚ˝ş¸¶Ć® żř°íżë... ąöư Ľö şŻ°ćŔ¸·Î »čÁ¦.
- ; brne PC+3
- ; rcall beep_long
- ; rjmp main_loop_entry
- rjmp set_sleep_loop_resume
- set_sleep_sort:
- ldi tmp2,2
- rcall clear_all
- rcall wait_250ms
- rcall set_sleep_display
- rcall wait_250ms
- dec tmp2
- brne PC-5
- ldd tmp,y+0
- ldi tmp2,sleep_timer ; save last set temperature
- rcall eep_write
- rjmp main_loop_entry
- set_sleep_display_eep:
- ldiw y,timer_buffer
- set_sleep_display:
- ldd tmp,y+0
- cpi tmp,0
- brne PC+5
- ldi tmp,alpha_d
- mov digit_1,tmp
- ldi tmp,alpha_s&num_dot
- rjmp PC+4
- rcall font_load
- mov digit_1,tmp
- ldi tmp,num_0&num_dot
- mov digit_2,tmp
- ldi tmp,alpha_t
- mov digit_3,tmp
- ret
- turbo_mode_entry:
- rcall beep_short_2times
- ldi tmp3,250 ; press 1sec< to set to sleep timer
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_inc&key_dec
- breq PC+2
- rjmp set_temp_loop_count_resume ; press short go to set temp continue
- rcall wait_5ms
- dec tmp3
- brne PC-7
- rcall beep_short_2times
- outi sorder_pwm_value,255 ; heater full on
- ldiw x,60000 ; 3minutes limit
- turbo_mode_loop:
- cbi ADCSRA,ADIE
- sbiw x,1
- breq turbo_mode_exit ; if continue 3minutes, go to cooling mode
- sbrs xL,6 ; blink slow
- rjmp PC+8
- ldi tmp,alpha_f
- mov digit_1,tmp
- ldi tmp,alpha_u
- mov digit_2,tmp
- ldi tmp,alpha_dual_l&~0x80
- mov digit_3,tmp
- rjmp PC+6
- ldi tmp,0xff
- mov digit_1,tmp
- mov digit_2,tmp
- ldi tmp,~0x80
- mov digit_3,tmp
- movw y,x
- andi yL,0xff
- brne PC+4
- andi yH,0x03
- brne PC+2
- rcall beep_short
- rcall key_check
- cpi tmp,key_no
- breq turbo_mode_loop
- turbo_mode_exit:
- sbi ADCSRA,ADIE
- ; rjmp cooling_entry
- cooling_entry:
- ldi tmp,alpha_o
- mov digit_1,tmp
- ldi tmp,alpha_f
- mov digit_2,tmp
- mov digit_3,tmp
- rcall beep_short
- ldi tmp3,250 ; press 1sec< to cancle
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq PC+7 ; press short go to cooling mode(sleep)
- rcall wait_5ms
- dec tmp3
- brne PC-6
- rcall clear_all
- rcall beep_long
- rjmp main_loop_entry
- rcall key_check
- cpi key_count,key_def_value
- brne PC-2
- cpi tmp,key_no
- brne PC-4
- out sorder_pwm_value,zero ; heater off
- clr setting_temp
- cooling_loop:
- ldiw z,RAMEND
- out SPH,zH
- out SPL,zL
- movw tmp2:tmp,adc_result_high:adc_result_low
- ldi tmp3,high(545)
- cpi tmp,low(545)
- cpc tmp2,tmp3
- brcc PC+20
- ldi tmp3,low(10)
- ldi tmp4,high(10)
- rcall div16u
- push r20
- rcall div16u
- push r20
- rcall div16u
- mov tmp,r20
- rcall font_load
- mov digit_1,tmp
- pop tmp
- rcall font_load
- mov digit_2,tmp
- pop tmp
- rcall font_load
- sbic PINB,PB1
- andi tmp,~0x80
- mov digit_3,tmp
- rjmp PC+7
- ldi tmp,0xff
- mov digit_1,tmp
- ldi tmp,alpha_h
- mov digit_2,tmp
- ldi tmp,alpha_i
- mov digit_3,tmp
- tst adc_result_high
- brmi sleep_entry
- rcall key_check
- cpi tmp,key_no
- breq PC+2
- rjmp main_loop_entry
- ldiw z,100
- cp adc_result_low,zL
- cpc adc_result_high,zH
- brcc cooling_loop
- sleep_entry:
- ldi tmp,alpha_o ; display 'off'
- mov digit_1,tmp
- ldi tmp,alpha_f
- mov digit_2,tmp
- mov digit_3,tmp
- rcall beep_long
- ; ldiw x,sleep_loop_image*2
- ; out sorder_pwm_value,zero ; heater off
- ; clr setting_temp
- /*
- sleep_loop:
- ldi tmp,high((sleep_loop_image*2)+18)
- cpi xL,low((sleep_loop_image*2)+18)
- cpc xH,tmp
- brcs PC+3
- ldiw x,sleep_loop_image*2
- sbrs tmp4,0
- rjmp PC+3
- adiw y,1
- rjmp PC+2
- sbiw y,1
- brne PC+4
- sbrc tmp4,0
- adiw x,3
- inc tmp4
- movw z,x
- cp yL,yH
- brcs PC+2
- adiw z,3
- lpm digit_1,z+
- lpm digit_2,z+
- lpm digit_3,z+
- ldi tmp,8
- rcall wait_us
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq sleep_loop
- ldi tmp3,250 ; press 1sec< to set to sleep timer
- rcall wait_5ms
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq sleep_loop
- dec tmp3
- brne PC-6
- rjmp reset
- sleep_loop_image:
- .db num_minus,num_minus,num_minus,0xff,num_minus,num_minus,num_minus,0xff,num_minus,num_minus,num_minus,0xff
- .db num_minus,num_minus,num_minus,alpha_o,alpha_f,alpha_f,num_minus,num_minus,num_minus,0
- */
- sleep_loop:
- ; ldiw x,750
- sleep_loop_key:
- out sorder_pwm_value,zero ; heater off
- sts timer_buffer,zero
- clr setting_temp
- sbrs tmp4,0
- rjmp PC+3
- adiw y,1
- rjmp PC+2
- sbiw y,1
- brne PC+2
- inc tmp4
- in tmp,PINB
- com tmp
- bst tmp,PB1
- cp yL,yH
- brcs PC+3
- ldi tmp,num_minus
- rjmp PC+2
- ldi tmp,0xff
- mov digit_1,tmp
- mov digit_2,tmp
- mov digit_3,tmp
- bld digit_3,7
- ldi tmp,8
- ; sts timer_count+3,tmp ; no means number...
- rcall wait_us
- ; 2011/10/09 - Heating protect
- movw tmp2:tmp,adc_result_high:adc_result_low
- tst adc_result_high
- brmi PC+6
- ldi tmp3,high(102)
- cpi tmp,low(102)
- cpc tmp2,tmp3
- brcs PC+2
- rjmp cooling_entry
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq sleep_loop
- rcall beep_short
- ldi tmp3,250 ; press 1sec< to set to sleep timer
- rcall wait_5ms
- in tmp,PINB
- andi tmp,key_no
- cpi tmp,key_no
- breq sleep_loop
- dec tmp3
- brne PC-6
- rjmp reset
- sleep_timer_load:
- in tmp,SREG
- push tmp
- cli
- ldi tmp,sleep_timer ; read last set temperature
- rcall eep_read
- sts timer_buffer,tmp
- cpi tmp,0
- breq PC+25
- push r23
- mov r23,tmp
- clr tmp
- clr tmp2
- clr tmp3
- clr tmp4
- ldi r20,byte1(2343750)
- ldi r21,byte2(2343750)
- ldi r22,byte3(2343750)
- add tmp,r20
- adc tmp2,r21
- adc tmp3,r22
- adc tmp4,zero
- dec r23
- brne PC-5
- sts timer_count+0,tmp
- sts timer_count+1,tmp2
- sts timer_count+2,tmp3
- sts timer_count+3,tmp4
- pop r23
- pop tmp
- out SREG,tmp
- ret
- font_load:
- ldiw z,font_db*2
- add zL,tmp
- adc zH,zero
- lpm tmp,z
- ret
- font_db:
- .db num_0,num_1,num_2,num_3,num_4,num_5,num_6,num_7,num_8,num_9
- beep_dingdingdong:
- rcall beep_short_2times
- rjmp PC+2
- beep_dingdong:
- rcall beep_short
- ldi tmp,1
- sts beep_highfreg_enahle,tmp
- rcall beep_short
- sts beep_highfreg_enahle,zero
- ret
- beep_short_2times:
- rcall beep_short
- rcall wait_5ms
- rcall wait_5ms
- rcall wait_5ms
- rcall wait_5ms
- beep_short:
- sbi DDRB,PB0
- ldi tmp4,10
- rjmp PC+3
- beep_long:
- sbi DDRB,PB0
- ldi tmp4,100
- rcall wait_5ms
- dec tmp4
- brne PC-2
- cbi DDRB,PB0
- ret
- ; key check
- ; key data output = tmp
- .equ key_def_value = 10
- key_check:
- rcall wait_5ms
- ldi tmp,key_no
- and key_flag,tmp
- mov tmp,key_flag
- cpi tmp,key_no
- breq PC+12
- in tmp,PINB
- andi tmp,key_no
- cp key_flag,tmp
- brne PC+8
- dec key_count
- breq PC+4
- cpi key_count,160
- brne PC+5
- ldi key_count,190
- mov tmp,key_flag
- rjmp PC+3
- ldi key_count,key_def_value
- ldi tmp,key_no
- in key_flag,PINB
- ret
- clear_all:
- clr digit_1
- dec digit_1
- mov digit_2,digit_1
- mov digit_3,digit_2
- ret
- ;-----------------------------------------------------------------------------:
- ; 16bit/16bit Unsigned Division
- ;
- ; Register Variables
- ; Call: tmp2:tmp = dividend (0x0000..0xffff)
- ; tmp4:tmp3 = divisor (0x0001..0x7fff)
- ; r21:r20 = <don't care>
- ; r22 = <don't care> (high register must be allocated)
- ;
- ; Result:tmp2:tmp = tmp2:tmp / tmp4:tmp3
- ; tmp4:tmp3 = <not changed>
- ; r21:r20 = tmp2:tmp % tmp4:tmp3
- ; r22 = 0
- ;
- ; Size = 16 words
- ; Clock = 179..211 cycles (+ret)
- ; Stack = 0 byte
- div16u: clr r20 ;initialize variables
- clr r21 ; mod = 0;
- ldi r22,16 ; r22 = 16;
- ;---- car22urating loop
- lsl tmp ;var1 = var1 << 1;
- rol tmp2 ;/
- rol r20 ;mod = mod << 1 + carry;
- rol r21 ;/
- cp r20,tmp3 ;if (mod => var2) {
- cpc r21,tmp4 ; mod -= var2; var1++;
- brcs PC+4 ; }
- inc tmp ;
- sub r20,tmp3 ;
- sbc r21,tmp4 ;/
- dec r22 ;if (--r22 > 0)
- brne PC-11 ; continue loop;
- ret
- ; Register Variables
- ; Call: tmp = dividend (0x00..0xff)
- ; tmp2 = divisor (0x01..0x7f)
- ; tmp3 = <don't care>
- ; tmp4 = <don't care> (high register must be allocated)
- ;
- ; Result:tmp = tmp / tmp2
- ; tmp2 = <not changed>
- ; tmp3 = tmp % tmp2
- ; tmp4 = 0
- ;
- ; Size = 11 words
- ; Clock = 66..74 cycles (+ret)
- ; Stack = 0 byte
- div08u: clr tmp3 ;initialize variables
- ldi tmp4,8 ; tmp3 = 0; tmp4 = 8;
- ;---- catmp4urating loop
- lsl tmp ;tmp = tmp << 1;
- rol tmp3 ;tmp3 = tmp3 << 1 + carry;
- cp tmp3,tmp2 ;if (tmp3 => tmp2) {
- brcs PC+3 ; tmp3 -= tmp2; tmp++;
- inc tmp ; }
- sub tmp3,tmp2 ;/
- dec tmp4 ;if (--tmp4 > 0)
- brne PC-7 ; continue loop;
- ret
- eep_write:
- sbic EECR,EEWE
- rjmp PC-1
- out EEARH,zero
- out EEARL,tmp2
- out EEDR,tmp
- sbi EECR,EEMWE
- sbi EECR,EEWE
- ret
- eep_read:
- sbic EECR,EEWE
- rjmp PC-1
- out EEARH,zero
- out EEARL,tmp
- sbi EECR,EERE
- in tmp,EEDR
- ret
- wait_3sec:
- rcall wait_1sec
- rcall wait_1sec
- wait_1sec:
- rcall wait_250ms
- rcall wait_250ms
- rcall wait_250ms
- wait_250ms:
- ldi tmp,250
- rjmp wait_ms
- wait_5ms:
- ldi tmp,5
- wait_ms:
- push tmp
- ldi tmp,250
- rcall wait_us
- ldi tmp,250
- rcall wait_us
- ldi tmp,250
- rcall wait_us
- ldi tmp,250
- rcall wait_us
- pop tmp
- dec tmp
- brne wait_ms
- ret
- wait_us:
- nop
- nop
- nop
- nop
- nop
- dec tmp
- brne wait_us
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement