Tachosignal am Diagnosestekcer, Hysterese beachten ein ein Attiny12 und ein IRF510 getrieben von einem BC557.
Passendes Progrämmchen machen und flashen und schon hat man eine schöne Automatik :
;*************************************************************************
;Title: automatischer Compoundschalter mit 2 Schaltgeschwindigkeiten und 2 Hysteresen
;Author: Dominic Thomé
;File: $Id: autoCompound.asm
;Hardware: ATtiny12
;**************************************************************************
; Klemmenplan
;1 +12V
;2 +48V
;3 Signalausgang (48V)
;4 Tachsignaleingang (12V)
;5 Masse
; Anschlüsse an Tiny12
;PB3 SW 1 - Eingang
;PB4 SW 2 - Eingang
;PB1 Signaleingang INT0
;PB2 Signalausgang
.include "tn12def.inc"
.def temp = r16
.def counter = r17
.def speedsignal = r18
.equ sampletime = 3
.equ kmh45 = 30*sampletime
.equ kmh40 = 27*sampletime
.equ kmh35 = 23*sampletime
.equ second = 18 ; Ticks/second
.org 0x0000
rjmp main ; reset handler
.org INT0addr
rjmp int0_signal;
.org OVF0addr
rjmp timer0_overflow ; Timer overflow handler
main:
; Load DDRB that PB2 is output
; PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
; 0 0 0 0 0 1 0 0
ldi temp, 0b100
out DDRB, temp
; Inputs to Pullup active and Outputs to high
ldi temp, 0b11111111 ; 0b11111100 in r16 laden
out PORTB, temp ; r16 ins IO-Register PORTB ausgeben
ldi counter, 0x00 ; Counter to 0
; CS00 setzen: Divider 256 = 18,31 /s @ 1,2MHz
ldi temp, 0b100
out TCCR0, temp
; Enable Timer
ldi temp, 0b00000001
out TIMSK, temp
; external int, raising edge
; MCUCR
ldi temp,0b000000010 ; int on falling edge
out MCUCR,temp
; enable external interrupt
ldi temp, 0b01000000
out GIMSK, temp
sei ; enable interrupts
loop:
rjmp loop ; "loop" -> forever
switcher:
ldi counter,0 ; counter back to 0
cpi speedsignal, kmh40;
brpl compoundoff
cpi speedsignal, kmh35;
brmi compoundon
compoundoff:
sbi PORTB, PB2
ret
compoundon:
cbi PORTB, PB2
ret
timer0_overflow:
inc counter
; after second ticks*sampletime we take a look to
; Wir sammeln 2 Sekunden lang die Messwerte
cpi counter, second*sampletime
breq switcher
reti
int0_signal:
inc speedsignal
reti
; 10km/h = 2,77~ /s /1,655m * 4Imp = 6,7 Impulse
; => 6,7Impulse/10km/h
Alles klar
?