;Fahrtregler (korrekt: "Steller") für Modellbau-Funkfernsteuerung ;zur Ansteuerung einer H-Brücke mit positiven Impulsen. ;Die Impulsbreite des Empfangsdecoders sollte 1,0ms...1,5ms...2,0ms betragen. ;Tiny15 Version 1... ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!Achtung!!! - Veränderte Anschlussbelegung gegenüber älteren Versionen!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;Anschlussbelegung: ;PB0 (Pin 5): (ISP-MOSI) Transistor für Bremslicht (bzw. Programmier-LED) gegen Masse ;PB1 (Pin 6): (ISP-MISO) Transistor für Rückfahrlicht (bzw Test-LED) gegen Masse ; und Programmiertaste gegen +5V ;PB2 (Pin 7); (ISP-SCK) Eingang Kanalimpuls ;PB3 (Pin 2); PWM-Ausgang Vorwärts ;PB4 (Pin 3); PWM-Ausgang Rückwärts ;Diese Einstellungen dürfen vom Benutzer verändert werden: .equ errors=20 ;Anzahl erlaubter Impulsfehler und erforderlicher Neutralstellungen .equ bremszeit=250 ;Startwert Bremszeit (Differenz zu 256) in 20ms-Schritten (Kanalimpulse) .equ neutral=150 ;Vorgabe für Steuerknüppelmitte (1,5ms) .equ sprz=5 ;Mittenspreizung .equ kalad=1022 ;Adresse, wo der Brenner das Kalibrationsbyte hin schreibt... ;Die folgenden Einstellungen dürfen nicht ohne zwingenden Grund verändert werden... .equ timstart=214 ;Startwert Timer0 (Differenz bis 256...) .equ taste=1 ;Bit Programmiertaste und Rückfahrlicht in PortB .equ rfs=1 ;Bit Rückfahrscheinwerfer (gleich Programmiertaste) in PortB .equ led=0 ;Bit Programmier-LED bzw. Bremslicht in PortB .equ brems=0 ;Bit Bremslicht (gleich Programmier-LED) in PortB .equ vor=3 ;Bit Vorwärts in PortB und Richtungsregister .equ zur=4 ;Bit Rückwärts in PortB und Richtungsregister .equ rfl=1 ;Bit Rückfahrlicht in Richtungsregister .def srsk=r1 ;Sicherheitskopie vom Statusregister während ISR Timer0-Überlauf .def srsk1=r2 ;Sicherheitskopie vom Statusregister während ISR externer Interrupt .def tsw=r3 ;Timer-Startwert .def tempo=r4 ;Fahrtempo .def max=r5 ;Maximaltempo, Zählumfang PWM-Treppenzähler .def tw=r6 ;aktueller Scannwert Kanalimpulsbreite .def sw=r7 ;Nachlaufwert vom Scannwert Kanalimpulsbreite .def mitte=r8 ;Mittelwert Kanalimpuls (Stop-Bereich) .def tou=r9 ;Time-out für Fehlererkennung .def zein=r10 ;Zähler zum Einschalten (zählt Neutralstellungen) .def zaus1=r11 ;Fehler-Zähler zum Ausschalten bei Impulsbreitenfehler .def zaus2=r12 ;Fehler-Zähler zum Ausschalten bei Impulspausenfehler .def taz=r13 ;Tastenzeitzähler .def ipv=r14 ;Impulspausen-Vorteiler .def temp=r16 ;Tempo-Zwischenwert .def flags=r17 ;Flags zur Ereignissteuerung .equ imend=0 ;Flag "Impulsende" .equ imanf=1 ;Flag "Impulsanfang" .equ aktiv=2 ;Flag "Ausgänge aktiv" .equ menak=3 ;Flag "Menü aktiv" .equ drich=6 ;Flag "Drehrichtung Motor" .equ richt=7 ;Flag "Richtung" .def ipz=r18 ;Impulspausenzähler .def pwz=r19 ;PWM-Treppenzähler .def ri=r20 ;Fahrtrichtung .def mp=r21 ;Menüpunkt-Zähler .def leb=r22 ;Blinktakt LED .def tmp=r23 ;temporär .include"tn15def.inc" .cseg .org 0 ;Reset- und Interrupt-Vektoren AT-Tiny15 rjmp RESET ;Reset handler rjmp impuls ;IRQ0 handler reti ;rjmp PIN_CHANGE ;Pin change handler reti ;rjmp TIM1_CMP ;Timer1 compare match reti ;rjmp TIM1_OVF ;Timer1 overflow handler rjmp takt ;Timer0 overflow handler reti ;rjmp EE_RDY ;EEPROM Ready handler reti ;rjmp ANA_COMP ;Analog Comparator handler reti ;rjmp ADC ;ADC Conversion Handler RESET: ldi r16, 0x7E ; <- hier den ausgelesenen Wert eintragen out OSCCAL, r16 ; ORIGINAL ; | | ; | | ; V V ;ser temp ;Referenz für Vergleich Kalibration ;ldi zl,low(kalad) ;Adresse auf Kalibrationsbyte L (Taktfrequenzeinstellung AVR) ;ldi zh,high(kalad) ;und H (da schreibt der Brenner das automatisch hin...) ;lpm ;Kalibrationsbyte lesen ;cp r0,temp ;Kalibrationsbyte gültig? ;breq reset0 ;nein, keine Kalibration durchführen ;out osccal,r0 ;ja, Chip kalibrieren... reset0: clr ri ;Fahrtrichtung ausschalten clr pwz ;PWM-Zähler clr mp ;Menüpunkt clr leb ;LED-Blinkzähler clr taz ;Tastenzeitzähler ldi flags,0 ;Ereignis-Flags clr ipz ;Impulspause H clr ipv ;Impulspause L clr leb ;LED-Blinker ldi temp,errors ;Fehleranzahl mov tou,temp ;in Vorgabewert mov zein,tou ;in Einschaltzähler mov zaus1,tou ;in Impulsbreitenfehlerzähler mov zaus2,tou ;und in Impulspausenfehlerzähler ldi temp,15 ;Watchdog auf 1,9s out wdtcr,temp ;einschalten ldi temp,neutral ;Mittelwert (Stop) mov mitte,temp ;zuweisen ldi temp,(neutral/3-sprz-1) ;Maximalwert Tempo mov max,temp ;zuweisen ldi temp,timstart ;Startwert für mov tsw,temp ;Timer zuweisen ldi temp,0b00000110;Pull-Ups ein und Bremslicht und out portb,temp ;PWM-Impulsports aus ldi temp,24 ;außer PWM-Impulsports erstmal out ddrb,temp ;alles als Eingang ldi temp,1 ;externen Interrupt out mcucr,temp ;auf Pegelwechsel sbic pinb,taste ;Programmiertaste gedrückt? sbr flags,1<