All pastes #26640 Raw Edit

Someone

public text v1 · immutable
#26640 ·published 2005-10-25 19:58 UTC
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


*/