;name:		GEN_V1.1			(FUNKCIÓ GENERÁTOR XR2206)
;date:		2013.04.24
;processor:	ATMEGA328P
;MINDEN FUNKCIÓ INTERRUPTBAN

;csak INT0 élfigyelés váltással
.nolist
;.include "m328pdef.inc"
.include "m168pdef.inc"
.list
;
; ===================================================
;                H a r d w a r e
; ===================================================
;  Processor type: ATmega328P
;              ______________
;             /              |
;   -RESET --|PC6    PC5/ADC5|-- KEY OK
;  SPI_SCK --|PD0    PC4/ADC4|-- KEY UP
;  SPI_SI  --|PD1    PC3/ADC3|-- KEY DOWN
;  INT0    --|PD2    PC2/ADC2|-- MUX_2	(4051 analóg multiplexer)
;  SPI_CS1 --|PD3    PC1/ADC1|-- MUX_1
;  SPI_CS2 --|PD4    PC0/ADC0|-- MUX_0
;      +5V --|VCC   	 AREF|-- +5V
;      GND --|GND     	  GND|-- GND
;    XTAL1 --|PB6        AVCC|-- +5V
;    XTAL2 --|PB7   	  PB5|-- LCD_E
;   FRQ_IN --|PD5   	  PB4|-- LCD_RS
; WAVE_SEL --|PD6     	  PB3|-- LCD_D7
;  SPI_CS3 --|PD7     	  PB2|-- LCD_D6
;   LCD_D4 --|PB0     	  PB1|-- LCD_D5
;            |_______________|
;
; ===================================================


; ===================================================
;               C o n s t a n t s
; ===================================================
.equ clock = 11059200		;Xtal frequency intermal RC 8MHZ
.equ baud=19200				;serial port speed
.equ itfrq=50				;50 Hz timer interrupt (T = 20msec)

.equ eepromstart=0x0000

.equ testport=PORTB
.equ testled=PB5			

.equ triacport=	PORTD
.equ triacfire=	PD6
; ===================================================
;               R e g i s t e r s
; ===================================================
;
.def 	rlgen=		r6		;register low for generic use
.def 	rlgen1=		r7		;register low for generic use
.def	rlgen2=		r8		;register low for generic use

.def 	rgen=		r16		;register for generic use
.def 	rhgen1=		r17		;register for generic use
;							;24:25	reserved 16 bites matekra
							;26:27=x 28:29=Y, 30:31=Z
; ===================================================
;           S R A M   l o c a t i o n s
; ===================================================
;
.DSEG
.ORG Sram_Start					;0100 - 08ff 2048 bytes

msecundum:		.byte 1			;20msec counter
secundum:		.byte 1			;
minute:			.byte 1			;
hour:			.byte 1			;
day:			.byte 1			;


edgecnt:		.byte 1			;edge counter
;===================================================

;----------------------------------------------------
;
.cseg
.org $0000	;RESET
	rjmp start ; Reset vector
.org $0002	;INT0
	rjmp ih_int0
.org $0004	;INT1
.org $0006	;PCINT0
.org $0008	;PCINT1
.org $000a	;PCINT2
.org $000c	;WDT
.org $000e	;TIMER2 COMPA
.org $0010	;TIMER2 COMPB
.org $0012	;TOMER2 OVF	
.org $0014	;TIMER1 CAPT
.org $0016	;TIMER1 COMPA
.org $0018	;TIMER1 COMPB
.org $001a	;TIMER1 OVF
.org $001c	;TIMER0 COMPA
;	rjmp tc0i
.org $001e	;TIMER0 COMPB
.org $0020	;TIMER0 OVF
.org $0022	;SPI STC	
.org $0024	;USART RX
.org $0026	;USART UDRE
.org $0028	;USART TX
.org $002a	;ADC
.org $002c	;EE READY
.org $002e	;ANALOG COMP
.org $0030	;TWI I2C
.org $0032	;SPM READY

.org $0040

;===================================================
;			INTERRUPT KISZOLGÁLÓ RUTINOK
;===================================================

;===================================================
ih_int0:				;rising edge interrupt
	push rgen			;save rgen,SREG
	in rgen,sreg		;
	push rgen			;
	push rhgen1

	lds rgen,edgecnt	
	inc rgen			;edgecnt++
	sts edgecnt,rgen
	
	andi rgen,1			;0. bit érdekes csak
	cpi rgen,1
	brne ih_int0_2		;páros volt, váltás felfutó élre
	rcall int0fe		;páratlan volt váltás lefutó élre
	rjmp ih_int0_1
	;---
ih_int0_2:
	rcall int0re		;váltás felfutó élre
	sbi testport,testled
ih_int0_1:
	lds rgen,edgecnt	;a jó érték újra

	cpi rgen,6
	brlo ih_int0_0		;6 alatti
	clr rgen			;3. nál reset
	sts edgecnt,rgen	;élszámlálót töröljük
	cbi testport,testled
	rjmp ih_int0_e
	;----
ih_int0_0:
	cpi rgen,1			;kell gyújtani? rising edge 
	brne ih_int0_n0 	;nem
	rcall fire			;gyújtás
	rjmp ih_int0_e
	;---
ih_int0_n0:
	cpi rgen,4			;kell gyújtani? falling edge
	brne ih_int0_e		;nem
	rcall fire			;gyújtás

ih_int0_e:
	pop rhgen1
	pop rgen			
	out sreg,rgen	
	pop rgen			;restore SREG,rgen
	reti
;===================================================

int0re:
	ldi rgen,(0<<isc11)|(0<<isc10)|(1<<isc01)|(1<<isc00)	;int0 rising edge 
	sts eicra,rgen
	ret
	;---------
int0fe:
	ldi rgen,(0<<isc11)|(0<<isc10)|(1<<isc01)|(0<<isc00)	;int0 falling edge first
	sts eicra,rgen
	ret
	;---------
fire:
	cbi triacport,triacfire		;gyújtó impulzus adása 

	ldi rhgen1,30

fire_0_0:
	ldi rgen,255
fire_0:
	dec rgen
	brne fire_0	

	dec rhgen1
	brne fire_0_0


	sbi triacport,triacfire
	ret

;===================================================


;===================================================
tc0i:							;timer0 COMPA interrupt handler
	push rgen					;save rgen,SREG
	in rgen,sreg				;
	push rgen					;

	rcall ticlk					;óra léptetése				;change:REG:rgen	SRAM:msecundum,secundum,hour

tc0i_2:
	pop rgen			
	out sreg,rgen	
	pop rgen					;restore SREG,rgen
	reti
;===================================================
;-----------------------------------------------------
ticlk:								;change: REG:rgen	SRAM:msecundum,secundum,minute,hour
	
ticlk_11:	
	lds rgen,msecundum				;hexa óra nem BCD!
	inc rgen			
	sts msecundum,rgen
	cpi rgen,50		;50x20msec = 1sec
	brne ticlk_1		;még nincs 50



	clr rgen
	sts msecundum,rgen	;clear msec		
	lds rgen,secundum
	inc rgen
	cpi rgen,60
	breq ticlk_5
	sts secundum,rgen	;step sec
	rjmp ticlk_1
	;---
ticlk_1:
	ret
	;----
ticlk_5:
	clr rgen
	sts secundum,rgen	;reset sec
	lds rgen,minute
	inc rgen
	cpi rgen,60
	breq ticlk_3
	sts minute,rgen		;step minute
	rjmp ticlk_1
	;---
ticlk_3:
	clr rgen
	sts minute,rgen		;reset minute
	lds rgen,hour
	inc rgen
	cpi rgen,24
	breq ticlk_4
	sts hour,rgen		;step hour
	rjmp ticlk_1
	;---	
ticlk_4:
	clr rgen
	sts hour,rgen		;reset hour
	lds rgen,day
	inc rgen
	cpi rgen,99			;day 0-99
	breq ticlk_6
	sts day,rgen		;step day
	rjmp ticlk_1
	;---
ticlk_6:
	clr rgen
	sts day,rgen		;reset day
	ret
;-----------------------------------------------------


Start:
	; init stack
	ldi rgen,HIGH(RAMEND) 	; init the MSB of the stack pointer
	out SPH,rgen
	ldi rgen,LOW(RAMEND) 	; init the LSB of the stack pointer
	out SPL,rgen
	
	rcall port_init
	rcall initvariables		
	cli
;	rcall timer0_init		
;	rcall timer2_init
;	rcall timer1_init
	
	sei						;enable interrupts
main:
	jmp main
;---------------------------------------------------

initvariables:
	rcall clrclk					;reset clock counter variables
	
	clr rgen					;clear edge counter
	sts edgecnt,rgen
	ret
;-----------

;---------------------------------------------------
clrclk:					;reset clock
	clr rgen
	sts msecundum,rgen
	sts secundum,rgen
	sts minute,rgen
	sts hour,rgen
	sts day,rgen
	ret
;---------------------------------------------------
timer0_init: 							;init timer0 OCR0-ig számol majd megszakítást okoz 
	ldi rgen,0b00000010					;ctc mode ocra
	out tccr0a,rgen
	ldi rgen,0b00000101					;clkio/1024 prescaler
	out tccr0b,rgen
	ldi rgen,low((clock/1024/itfrq)-1)	;low(clock/1024/itfrq-1)
	out ocr0a,rgen						;interrupt esetén nem törlődik!!
	ldi rgen, 0b00000010				;enable OCIE0A interrupt 
	sts timsk0,rgen
	ret
;---------------------------------------------------
timer1_init:							;timer 1 T1 felfutó élére számol tulcsorduláskor megszakítást okoz
	ldi rgen,(0<<com1a1)|(0<<com1a0)|(0<<com1b1)|(0<<com1b0)|(0<<wgm11)|(0<<wgm10)
	sts tccr1a,rgen
	ldi rgen,(0<<icnc1)|(0<<ices1)|(0<<wgm13)|(0<<wgm12)|(1<<cs12)|(1<<cs11)|(1<<cs10)	;external clock on T1 rising edge
	sts tccr1b,rgen
	ldi rgen,(0<<foc1a)|(0<<foc1b)
	sts tccr1c,rgen
	ldi rgen,(0<<icie1)|(0<<ocie1b)|(0<<ocie1a)|(1<<toie1)
	sts timsk1,rgen
	ret
;---------------------------------------------------
timer2_init:
	ldi rgen,(0<<com2a1)|(0<<com2a0)|(0<<com2b1)|(0<<com2b0)|(1<<wgm21)|(0<<wgm20)	;CTC
	sts tccr2a,rgen
	;ldi rgen,(0<<foc2a)|(0<<foc2b)|(0<<wgm22)|(1<<cs22)|(1<<cs21)|(1<<cs20)	;clk/1024, CTC
	ldi rgen,(0<<foc2a)|(0<<foc2b)|(0<<wgm22)|(0<<cs22)|(0<<cs21)|(0<<cs20)	;cs22=cs21=cs20=0 timer stopped
	sts tccr2b,rgen
	ldi rgen,205	;pl 5msec
	sts ocr2a,rgen
	ldi rgen,(0<<ocie2b)|(1<<ocie2a)|(0<<toie2)	;ocie2a interrupt enebled
	sts timsk2,rgen
	ret
;---------------------------------------------------
port_init:				;init ports
	ldi rgen,0xff
	out DDRB,rgen		;PORTB all outputs	
		
	ldi rgen,(0<<PC6)|(0<<PC5)|(0<<PC4)|(0<<PC3)|(1<<PC2)|(1<<PC1)|(1<<PC0)	;PC7 nem létezik
	out DDRC,rgen		;PORTC (1=OUT, 0=IN)  
	ldi rgen,(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3)|(0<<PC2)|(0<<PC1)|(0<<PC0)
	out PORTC,rgen		;0=disable pull-up resistors, 1=ENABLE pull-up
			
	ldi rgen,(1<<PD7)|(1<<PD6)|(0<<PD5)|(1<<PD4)|(0<<PD3)|(0<<PD2)|(1<<PD1)|(1<<PD0)	;PD2=INT0 BEMENET
	out DDRD,rgen		;D port data direction (1=OUT, 0=IN)
	ldi rgen,(0<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD4)|(1<<PD3)|(1<<PD2)|(1<<PD1)|(1<<PD0)				
	out	PORTD,rgen		;kimenetek H szintre
	
	;set int0 and int1 for interrupt
	ldi rgen,(0<<isc11)|(0<<isc10)|(1<<isc01)|(1<<isc00)	;int0 rising edge first
	sts eicra,rgen
	ldi rgen,(0<<int1)|(1<<int0)		;int0 interrupt enabled
	out eimsk,rgen
	ret
;---------------------------------------------------


;=============================================================================================
waitxs:							;x sec wait x az rgen-ben 	
	rcall whatwaitsec			;megadja melyik sec értékre kell várni
waitxs_1:	
	lds rlgen,secundum
	cp rgen,rlgen
	brne waitxs_1
	ret
;----------------------------------------------------------
whatwaitsec:					;rgen-ben magadott secundhoz adja hozza az aktuális secundum értéket
	lds rlgen,secundum			;eredmény az rgen-ben ugyanott
	add rgen,rlgen
	cpi rgen,59					;nagyobb, mint 59?
	brcs whatwaitsec_1			;nem
	subi rgen,59				
whatwaitsec_1:
	ret
;=============================================================================================

.exit





;********************************************
;Wellon VP-290 programmer ATMEGA328P memories
;  eszköz		  tároló
;-----------	-----------
;0000 - 3fff	0000 - 3fff program flash memory
;0000 - 03ff	8000 - 83ff eeprom memory	  
;konfig szó		8400 - 8404
;				8400 0xf8 fuse low byte (clksel0-3,,SUT0,SUT1,CKOUT,CKDIV8)
;				8401 0xff calibration byte
;				8402 0xff fuse hihg byte (bootrst,bootsz0,bootsz1,eesave,,wdton,spien,dwen,rstdisbl)
;				8403 0x3f lock byte (Lock Bit,Boot Lock Bit01,Boot Lock Bit02,Boot Lock Bit11,Boot Lock Bit12)
;				8404 0xff extended fuse byte (BODLEVEL0,BODLEVEL1,BODLEVEL2)
;				8405 0x00 ;end
; ===================================================
; E E P R O M
; ===================================================
; 80000 - 83ff
;.org $8000/2
; ===================================================
.cseg
;
;.db 0xf8,0xff,0xff,0x3f,0xff,0x00	;példa a fuse byte

;
.org $8400/2		;valódi címhez osztani kettővel
;   FUSE LOW BYTE	(internal 8Mhz/8=1MHz)														CALIBRATION BYTE
;	|----------------------------------------------------------------------------------------|  |---------------|
.db	(1<<CKDIV8)|(1<<CKOUT)|(1<<SUT1)|(0<<SUT0)|(0<<CKSEL3)|(1<<CKSEL2)|(1<<CKSEL1)|(1<<CKSEL0), 0x80

;	FUSE HIGH BYTE																					  LOCK BIT BYTE
;   |----------------------------------------------------------------------------------------------|  |-------------------------------------------------------------------------|
.db (1<<RSTDISBL)|(1<<DWEN)|(0<<SPIEN)|(1<<WDTON)|(1<<EESAVE)|(1<<BOOTSZ1)|(1<<BOOTSZ0)|(1<<BOOTRST), (0<<7)|(0<<6)|(1<<BLB12)|(1<<BLB11)|(1<<BLB02)|(1<<BLB01)|(1<<LB2)|(1<<LB1)

;	EXTENDED FUSE BYTE																   ?
;	|-----------------------------------------------------------------------------|  |---|
.db (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<BODLEVEL2)|(1<<BODLEVEL1)|(1<<BODLEVEL0), 0x80


.exit

; End of source code
;
