rendered paste body;*******************************************************************************
; Title: Dimmer for ARNE-network
; Author: Anders Runeson, arune@users.sf.net
; Version: 1.0.0
; Date: 2003-02-16
;
; Target: AT90Sxxxx (All AVR Devices)
;
; DESCRIPTION
;
; The timing is adapted for 4 MHz crystal
;
; Usage:
;
;
;*******************************************************************************
;macbeth test-data:
;<arnepacket bytes="2" destnode="RoofDimmer">
;<byte id="1" value="128"/>
;<byte id="2" value="50"/>
;</arnepacket>
;Senaste ändringar:
;Att göra:
;kunna hämta highlimit-lowlimit från extern nod
;Möjliga fel:
;Fixade fel?
.include "2313def.inc"
;***** Pin definitions
;.equ ARNEline =PD2 ;ARNE bus is on PD2, (defined in inc file)
;input
.equ ZeroCross =PD3
;output
.equ TriacOutp =PB3
;***** Global register variables
;**Regs 0 to 15 cannot handle SBCI, SUBI, CPI, ANDI, ORI, LDI, SER, SBR, CBR
.def eepromRxTx =R7
.def gotovalue =R8
;**
.def temp =R17 ;Arne need a temp reg
.def parsertemp =R22
.def DimStrength =R23
.def statusreg =R24
.def temp2 =R25
;.def eepromadress =R23
;.def bitcnt =R24
;arne_dedi_nr_of_bytes is DEDICATED R2, this reg contains the number of bytes recieved
;ARNE STATUS REG IS DEDICATED, R16
;arne_dedi_cnt is DEDICATED, R18
;See ARNEroutines.asm for more registers (these are probably put on stack when using bus => no worries using them)
;***** Other
.equ xtal =4000000
.equ bus_freq =80000
.equ this_node_adress =0x75 ;Reserved adress (maybe) 0x00 and 0xFF?
;.equ this_node_type =25 ;En lista över typer av noder?
;define where arne_data is stored in sram (moved elsewhere is untested)
.equ Start_of_Data_To_Send =0x60
.equ Start_of_Recieved_Data =0x71
.equ LOWLIMITDIM =0
.equ HIGHLIMITDIM =133 ;79
;den får inte vara nära 255
.equ ABSADDVALUE =1
.equ ABSADDVALUE_FAST =4
;dessa hör till statusreg
.equ BITPOS =0 ; bitpos är för öka ljusstyrkan
.equ BITNEG =1 ; bitneg minska
.equ BITFAST =2
.MACRO mac_arne_send_todo
.ENDMACRO
.MACRO mac_arne_recieve_todo
.ENDMACRO
.include "..\AssemblerSource\ARNEroutines.asm"
;#############################################################
;# RESET #
;#############################################################
;interrupt vectors
.ORG 0x00
rjmp RESET ;Reset Handler
.ORG INT0addr
rjmp arne_EXT_INT0 ;IRQ0 Handler, Om det händer något på ben 6 (PD2)
.ORG INT1addr
rjmp EXT_INT1 ;IRQ1 Handler
.ORG OVF1addr
rjmp OVFL_TIM1 ;Timer1 Overflow handler
.ORG OVF0addr
rjmp arne_TIM_OVF0 ;Timer0 Overflow 8 bit
RESET:
cli
;#############################################################
;# INIT #
;#############################################################
;INIT STACKPOINTER
ldi temp,low(RAMEND)
out SPL,temp
;INIT PORT D
;arne line
cbi DDRD,ZeroCross ;ZeroCross-mod is input
sbi PORTD,ZeroCross ;use pullup
;INIT PORT B
sbi DDRB,TriacOutp ;output
cbi PORTB,TriacOutp
;INIT INTERRUPT
ldi temp,0b00001100 ;Setup Interrupt Sense Control for trigging on rising edge
out MCUCR,temp
ldi temp,(1<<INT1) ;Enable "External Interrupt1 Request"
out GIMSK,temp
;INIT TIMER1 - 16bit
sbr temp,1<<TOIE1
out TIMSK,temp
;start timer
ldi temp,0b00000001
out TCCR1B,temp
ldi DimStrength,30
clr gotovalue
dec gotovalue
;INIT ARNE
macro_ARNE_INIT
sei ;Enable interrupts
;cbi PORTB,PB3
;#############################################################
;# MAIN #
;#############################################################
;***** Program Execution Starts Here **************************************
Start:
sbrc ARNE_status_reg,ARNE_data_waiting_read
rcall DataParser
rjmp Start
;****** Timer 1 Overflow Routine *****************************************
OVFL_TIM1:
;if output is set then clear it and wait for 10ms, this is the exact time when
;the next pulse is supose to happen
;if output is cleared then set it and wait for 100us, this is the pulselength
;skulle kanske buggen möjligtvis vara här? får man ett riktigt värde när man avläser PORTB?
;värt att testa iaf
sbic PORTB,TriacOutp
rjmp notSetOutp
;ladda timer med 100uS (för puls)
;65536-400, 400/4000000=100us
ldi temp,HIGH(65536-300) ;254
out TCNT1h,temp
ldi temp,LOW(65536-300) ;112
out TCNT1l,temp
sbi PORTB,TriacOutp
rjmp out_OVFL_TIM1
notSetOutp:
;ladda timer med 10ms-100uS (för nästa puls, i neg halvperiod)
;65536-40000+400, (40000-400)/4000000=100us
ldi temp,HIGH(65536-40000+300) ;101
out TCNT1h,temp
ldi temp,LOW(65536-40000+300) ;80
out TCNT1l,temp
cbi PORTB,TriacOutp
out_OVFL_TIM1:
rcall arne_synk
reti
;****** External Interrupt Routine 1 *****************************************
EXT_INT1:
;zero-cross detected (50 Hz)
rcall delay
sbis PIND,ZeroCross
rjmp outEXT_INT1
sbrc statusreg,BITPOS ;om ljusare
rjmp turnpos
sbrc statusreg,BITNEG ;om mörkare
rjmp turnneg
rjmp no_change_of_val
turnpos: ;om ljusare
subi DimStrength,-ABSADDVALUE ;addera ABSADDVALUE
sbrc statusreg,BITFAST
subi DimStrength,-ABSADDVALUE_FAST ;addera ABSADDVALUE_FAST
cpi DimStrength,HIGHLIMITDIM+1 ;kolla gräns
brlo lim_ok
ldi DimStrength,HIGHLIMITDIM ;inte större än max
clr statusreg ;stäng av statusbiten(/arna)
rjmp lim_ok
turnneg: ;om mörkare
subi DimStrength,ABSADDVALUE ;subtrahera ABSADDVALUE
sbrc statusreg,BITFAST
subi DimStrength,ABSADDVALUE_FAST ;subtrahera ABSADDVALUE_FAST
cpi DimStrength,HIGHLIMITDIM+1
brsh limneg_reached
cpi DimStrength,LOWLIMITDIM
brlo limneg_reached
rjmp lim_ok
limneg_reached:
ldi DimStrength,LOWLIMITDIM ;inte mindre än min
clr statusreg ;stäng av statusbiten(/arna)
rjmp lim_ok
lim_ok:
no_change_of_val:
cpi DimStrength,LOWLIMITDIM
brne timer_on
ldi temp,0b00000000
out TCCR1B,temp
rjmp outEXT_INT1
timer_on:
ldi temp,0b00000001 ;slå på timer
out TCCR1B,temp
mov parsertemp,DimStrength
subi parsertemp,-121
out TCNT1h,parsertemp
ldi temp,100 ;255
out TCNT1l,temp
outEXT_INT1:
rcall arne_synk
reti
delay:
ldi temp2,100
delay1:
dec temp2
brne delay1
ret
;parse the data recieved on arne
DataParser:
cbr ARNE_status_reg,1<<ARNE_data_waiting_read
mov parsertemp,arne_dedi_nr_of_bytes
cpi parsertemp,2
brne out_dataparser ;if not 2 bytes recieved then exit
lds parsertemp,Start_of_Recieved_Data
cpi parsertemp,0x00
breq BtnReleased ;if first byte is 00 then BtnReleased
cpi parsertemp,0xF0
breq BtnPressed ;if first byte is F0 then BtnPressed
cpi parsertemp,0x80
breq NodSentValue ;if first byte is 80 then NodSentValue
;här: lägg in funktion som skickar övre gräns till den som bad om det (inkludera det i paketet!)
;gränsen ska vara (highlimit-lowlimit) för att den noden inte ska känna till inre gränserna utan bara 0 till gräns...
rjmp out_dataparser
BtnPressed:
lds parsertemp,Start_of_Recieved_Data+1 ;get button
cpi parsertemp,0x00 ;knapp ljusare intryckt
brne next_comp
ldi statusreg,(1<<BITPOS)
rjmp out_dataparser
next_comp:
cpi parsertemp,0x01 ;knapp mörkare intryckt
brne next_comp2
ldi statusreg,(1<<BITNEG)
rjmp out_dataparser
next_comp2:
cpi parsertemp,0x02 ;knapp toggla mörkt/ljust intryckt
brne out_dataparser
cpi DimStrength,LOWLIMITDIM
brne next_limit
;ldi DimStrength,HIGHLIMITDIM ;för att skippa dimmning
ldi statusreg,(1<<BITPOS|1<<BITFAST) ;flytta kommentering från ovan
rjmp out_dataparser
next_limit:
cpi DimStrength,HIGHLIMITDIM
brne next_limit2
;ldi DimStrength,LOWLIMITDIM
ldi statusreg,(1<<BITNEG|1<<BITFAST)
rjmp out_dataparser
next_limit2:
cpi DimStrength,(HIGHLIMITDIM+LOWLIMITDIM)/2
brsh next_limit3
;ldi DimStrength,LOWLIMITDIM
ldi statusreg,(1<<BITPOS|1<<BITFAST)
rjmp out_dataparser
next_limit3:
;ldi DimStrength,HIGHLIMITDIM
ldi statusreg,(1<<BITNEG|1<<BITFAST)
rjmp out_dataparser
BtnReleased:
lds parsertemp,Start_of_Recieved_Data+1 ;get button
cpi parsertemp,0x00 ;knapp ljusare släppt
brne next_rel_comp
clr statusreg
rjmp out_dataparser
next_rel_comp:
cpi parsertemp,0x01 ;knapp mörkare släppt
brne next_rel_comp2
clr statusreg
rjmp out_dataparser
next_rel_comp2:
cpi parsertemp,0x02 ;knapp toggle släppt
brne out_dataparser
;här ska nog inget hända
rjmp out_dataparser
NodSentValue:
;här styrs så att andra noder kan skicka ett värde till denna noden, mellan 0 till gräns
;där gräns = (highlimit-lowlimit)
lds parsertemp,Start_of_Recieved_Data+1 ;get value
cpi parsertemp,HIGHLIMITDIM-LOWLIMITDIM+1
brsh out_dataparser
subi parsertemp,-LOWLIMITDIM
;cp parsertemp,DimStrength ;om den redan är där (nytt värde är samma)
;breq out_dataparser
;brlo newvaluelower
;ldi statusreg,(1<<BITPOS|1<<BITFAST) ;om nytt värde är större
;mov gotovalue,parsertemp
;rjmp out_dataparser
;newvaluelower:
;ldi statusreg,(1<<BITNEG|1<<BITFAST) ;om nytt värde är mindre
;mov gotovalue,parsertemp
;rjmp out_dataparser
mov DimStrength,parsertemp
out_dataparser:
cbr ARNE_status_reg,1<<ARNE_processing_data
ret
/*
;***** Write EEPROM ******************************************************
;eepromadress should contain adress, eepromTx should contain byte to save
;used regs: eepromadress(increase), eepromRxTx(unchanged)
WriteEE:
sbic EECR,1 ;check if clear to write
rjmp WriteEE ;else loop
out EEAR,eepromadress ;address eeprom
out EEDR,eepromRxTx ;data to be stored
sbi EECR,EEMWE ;set master write enable
sbi EECR,EEWE ;write
inc eepromadress ;increase address
ret
;***** Read EEPROM *****************************************************************
;eepromadress should contain adress, eepromRx will return byte
;used regs: eepromadress(unchanged), eepromRxTx
ReadEE:
sbic EECR,1 ;check if clear to read
rjmp ReadEE ;else loop
out EEAR,eepromadress ;address eeprom
sbi EECR,0 ;request data
in eepromRxTx,EEDR ;get data from eeprom
ret
*/