;****************************************Datenlogger**********************************************
;60 analoge Messwerte
über PB3 einlesen und im EEPROM speichern, seriell mit Terminal / PC
auslesen.
; ATTiny13 auf 1,2
MHz Prozessortakt geschalten.
.include "C:\Dokumente und
Einstellungen\Reglermax\Eigene Dateien\tiny13\tn13def.inc"
.def
A =
r16 ;Register Definition
.def Delay = r17
.def Count = r18
.def EEadr =
r19
.def
B =
r20
.def sicher = r22
.def timer
= r23
.def teile
= r24
.def EEmode = r25
.equ TXD =
1
;Port B
.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
;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 , Messerfisch 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 ;Datenempfang seriell
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
Rolf Grauer, 22.12.2014