____
-|
|- VCC (3Volt)
-|
|-
-|
|- ___
GND -|__|---|<|--|_R_|--- VCC
.device ATtiny13A ;Fuse
6AFF
.equ LED = 0 ;Pinbelegung
.org 0x0000
rjmp init
.org WDTaddr
rjmp watchdog ;Händler für den Messzyklus
init: sbi DDRB, LED ;LED als
Output
main:
rcall get_temperature ;Messwert
r23
cpi r23,
0x28
brlo led_on
cpi r23,
0x30
brsh led_on
sbi PORTB,
LED
rjmp main
led_on: cbi PORTB, LED
rjmp main
get_temperature:
ldi r26,
0x00 ;16 bit für Taktzähler
r26+r27
ldi r27,
0x00
ldi r30,
0x00 ;Indikator Watchdog
cli ;WatchdogTimer
Initialisierung
wdr
ldi r16, (1<<WDCE) |
(1<<WDE)
out WDTCR, r16
ldi r16, 0x03; parameter 03
ori r16, (0<<WDCE) |
(0<<WDE) | (1<<WDTIE)
out WDTCR, r16
sei
measure:
adiw r26, 0x01 ;Zähler ++
cpi r30,
0xFF ;ist Watchdog
abgelaufen?
breq normalize ;wenn ja dann normalisiere
rjmp measure ;sonst weiterzählen
normalize: ;Normierung
ldi r16, 0x00 ;Dummy
für Carrybit
lsl r26
rol r27
adc r26,
r16 ;16-Bit Rotation
ldi r16,
0x00 ;Dummy für Carrybit
lsl r26
rol r27
adc r26,
r16 ;16-Bit Rotation
andi r27, 0x3F ;Wertebeschränkung
mov r23,
r27 ;Messwert in r23
bereitstellen
ret
watchdog: ;Watchdoghändler
ldi r30,
0xFF ;Indikator
cli ;Watchdog
deaktivieren
wdr
in r16,
MCUSR
andi r16, (0xFF - (1<<WDRF))
out MCUSR,
r16
in r16,
WDTCR
ori r16,
(1<<WDCE) | (1<<WDE)
out WDTCR,
r16
ldi r16,
(0<<WDE)
out WDTCR,
r16
sei
reti