;***************Datenlogger**********************************************************************************************

;60 analoge Meßwerte über PB3 einlesen und im EEPROM speichern

	.include "C:\Dokumente und Einstellungen\Reglermax\Eigene Dateien\tiny13\tn13def.inc"

    	.def   A            = r16
    	.def   Delay     = r17
    	.def   Count     = r18
	.def   EEadr     = r19							
    	.def   B            = r20	
	.def   sicher     = r22
	.def   timer      = r23
	.def   teile       = r24
	.def   EEmode = r25
     			;Port B
    	.equ   TXD    = 1
    	.equ   RXD    = 2
    	.equ   LED    = 4

		rjmp	Anfang 
		.org	0x0003		;Interruptvektor für Timer
		rjmp	TIM0_OVF    	;Timer 0 Overflow

Anfang:
		ldi 	A,5
		out	TCCR0B,A	;Timer Vorteiler/1024
		ldi	A,2
		out	TIMSK0,A		;Timer Interrupt freigeben
		sei					
		sbi    	ddrb,TXD		;Datenrichtung TXD
		sbi	ddrb,LED
				
     		rcall   AdcInit

Schleife:
		rcall  	RdCOM		;Starten neuer Meßreihe	
		cpi	A,108		;nur Lesen wenn "l" eingegeben wird!
		breq	Lesen		
        		ldi    	EEadr,0			
		
Schreiben:
		sei
		ldi 	teile,5		;5er Teiler für Takt von 1Sek!
Teiler:
	        	sbis   	portb,0		;Auslösung durch Timerinterrupt
		rjmp   	Teiler
		cbi	portb,0
		cbi	portb,LED		
		dec 	teile
		brne	Teiler
		sbi	portb,LED
		rcall  	RdADC
		mov    	B,A		;sichere Ergebnis in B, weil WrCom A überschreibt!
		rcall  	WrCom		;schreibe Messwert am Terminal 
        		rcall   	WrEE		;speichere Meßwert in EEPROM
        		inc    	EEadr
		cpi	EEadr,60		;nutzbarer EEPROM
 		brne   	Schreiben 	;60 mal
		ldi	A,13
		rcall	WrCOM		;1 Zeilenvorschub
        		cli			;Timer Interrupt sperren!					
		
 Lesen:       
 		ldi    EEadr,0
 Lesen1:
        		rcall  RdEE		;lese EEPROM in A
        		rcall  WrCOM
        		inc    EEadr
        		cpi    EEadr,60
        		brlo   Lesen1     		;60 mal
        		rjmp  Schleife 
TIM0_OVF:
		in	sicher,SREG	;Statusregister sichern	
		ldi	timer,24
		out	TCNT0,timer	; 256 - 24 = 234 bis Overflow, für 1Sek-Takt
		sbi 	portb,0
		out	SREG,sicher	;Statusregister rückladen
	  	reti
AdcInit:
      		ldi   A,3         	
      		out  ADCSRA,A		;Clock / 8 
      		sbi   ADCSRA,ADEN 		;AD einschalten 
      		ret
RdADC:
	  	ldi    A,3			;Eingang ADC an PB3
      		out   ADMUX,A	   
      		sbi   ADMUX,ADLAR   	;Left adjust
	  	sbi	ADMUX,REFS0	;interne Ref 1,1V , Meßbereich 0 bis 1,1V
      		sbi   ADCSRA,ADSC   	;Wandlung starten
ADrdy:
      		sbic  ADCSRA,ADSC   
      		rjmp  ADrdy
      		sbi   ADCSRA,ADSC
ADrdyb:
      		sbic  ADCSRA,ADSC   
      		rjmp  ADrdyb
      		in    A,ADCH
      		ret
RdEE:	
		sbic  	  EECR,EEWE
		rjmp  	  RdEE
		out	  EEAR,EEadr
		sbi	  EECR,EERE
		in	  A,EEDR
		ret
WrEE:	
		sbic  	  EECR,EEWE
		rjmp  	  WrEE
		ldi	  EEmode,0
		out	  EECR,EEmode
		out	  EEARL,EEadr
		out	  EEDR,B	;Ergebnis in B, weil WrCom A überschreibt!	;
		sbi	  EECR,EEMPE
		sbi	  EECR,EEPE
		ret

RdCOM:  		sbis  pinb,RXD  		;Empfangen
        		rjmp  RdCOM
        		ldi   Delay,58  
D1:     		dec   Delay
        		brne  D1
        		ldi   A,0
        		ldi   Count,8
L1:     		lsr   A
        		sbic  pinb,RXD
        		ori   A,128
        		ldi   Delay, 38  
D2:     		dec   Delay
        		brne  D2
        		dec   Count
        		brne  L1
        		ldi   Delay, 38
D3:     		dec   Delay
        		brne  D3
        		com   A			;invertieren weil Ausgabe ohne Inverter
       		 ret

WrCOM:  		sbi   portb,TXD  		;Senden
        		ldi   Delay,38 
D4:     		dec   Delay
        		brne  D4
        		ldi   Count,8
L2:     		sbrc  A,0
       		rjmp  OFF
        		rjmp  ON
ON:     		sbi   portb,TXD
        		rjmp  BitD
OFF:    		cbi   portb,TXD
        		rjmp  BitD
BitD:  		ldi   Delay,38  
D5:     		dec   Delay
        		brne  D5
       		lsr   A
        		dec   Count
        		brne  L2
        		cbi   PORTB,TXD
        		ldi   Delay,38   
D6:     		dec   Delay
        		brne  D6
        		ret



