;Fahrtregler (korrekt: "Steller") für Modellbau-Funkfernsteuerung ;zur Ansteuerung von Raupenfahrwerken mit positiven Kanalimpulsen. ;Die Impulsbreite des Empfangsdecoders sollte 1,0ms...1,5ms...2,0ms betragen. ;AT90S2313 mit Quarz 8,0 MHz, Version 1... ;Der Steller lässt sich mittels Programmierung per Menü an das Modell ;und die Fernsteueranlage anpassen. ;Menüpunkte: ;1 Alle vier Neutralstellungen... ;2 Vollgas vorwärts... ;3 Lenkung links... ;4 Schaltschwelle Schaltkanal 3 (Neutralstellung deaktiviert Schaltkanal 3) ;5 Schaltschwelle Schaltkanal 4 (Neutralstellung deaktiviert Schaltkanal 4) ;Die Parameter werden im EEPROM gespeichert. ;Folgende Adressen (zuzüglich Basisadresse!) haben folgende Bedeutung: ;Adr Bedeutung Vorgabewert aktiviert deaktiviert ;01 Neutralstellung Antrieb (Stop) 255 (150) ;02 Neutralstellung Lenkung 255 (150) ;03 Neutralstellung Kanal 3 255 (150) ;04 Neutralstellung Kanal 4 255 (150) ;05 Anzahl Fahrstufen 255 (45) ;06 Flag Umkehr Fahrtrichtung 128 0 ;07 Umkehr Lenkrichtung, 64 0 ;08 Schaltschwelle Schaltkanal 3 255 (0) ~30 0 ;09 Schaltschwelle Schaltkanal 4 255 (0) ~30 0 ;Anschlussbelegung: ;Pin 01: /Reset (3k3 gegen +VCC ;Pin 02: PD0 Kanalimpuls 1 Fahrwerk ;Pin 03: PD1 Kanalimpuls 2 Lenkung ;Pin 04: Quarz 8MHz ;Pin 05: Quarz 8MHz ;Pin 06: PD2 Kanalimpuls 3 Schalter 1 ;Pin 07: PD3 Kanalimpuls 4 Schalter 2 ;Pin 08: PD4 Rückfahrlicht und PullDown-R gegen GND, Prog-Taste gegen +VCC ;Pin 09: PD5 Bremslicht (Prog-Dialog-LED) und Pulldown-R gegen GND ;Pin 10: GND ;Pin 11: PD6 PWM vorwärts für linke Brücke ;Pin 12: PB0 PWM rückwärts für linke Brücke ;PIN 13: PB1 PWM vorwärts für rechte Brücke ;Pin 14: PB2 PWM rückwärts für rechte Brücke ;Pin 15: PB3 Schaltkanal 3a ;Pin 16: PB4 Schaltausgang 3b ;Pin 17: PB5 Schaltkanal 4a ;Pin 18: PB6 Schaltkanal 4b ;Pin 19: PB7 Takt für Ladungspumpe ;Pin 20: +VCC ;------------------------------------------------------------------------------------------- ;Folgende Einstellungen dürfen vom Benutzer verändert werden: .equ errors=20 ;Anzahl erlaubter Impulsfehler und erforderlicher Neutralstellungen ;Nach erfolgreichem Test sollte der Wert auf 5 eingestellt werden. .equ neutral=150 ;Vorgabe für Steuerknüppelmitte aller 4 Kanäle (1,5ms) .equ sprz=5 ;Mittenspreizung Fahrwerk und Lenkung .equ bremsz=140 ;Bremszeit in 20ms-Schritten (Kanalimpulse) (50 = 1s) .equ lenkgrip=0 ;"Griffigkeit" der Lenkung (0=100%, 1=50%, 2=25%, 3=12,5%) .equ eebas=0 ;Basisadresse im EEPROM (Verschleiß) (0,16,32,48,64,80,96,112) ;Hier nur 0 oder 1 eintragen! .equ flip3l=0 ;Modus Schaltkanal 3 langer Impuls (0=direkt, 1=toggelnd) .equ flip3k=0 ;Modus Schaltkanal 3 kurzer Impuls (0=direkt, 1=toggelnd) .equ flip4l=1 ;Modus Schaltkanal 4 langer Impuls (0=direkt, 1=toggelnd) .equ flip4k=1 ;Modus Schaltkanal 4 kurzer Impuls (0=direkt, 1=toggelnd) ;Weiterhin kann durch Hinzufügen von Unterprogrammaufrufen "rcall trgh" etwas hinter ;den Sprungmarken "iXend:" (X=Kanalnummer 1...4) die Reaktion auf Änderungen der ;Steuerknüppelstellung beschleunigt werden, durch Entfernen von Aufrufen wird die ;Trägheit erhöht. 1 Aufruf muss unbedingt erfolgen, mehr als 5 Aufrufe sind Unfug... ;------------------------------------------------------------------------------------------- ;Die folgenden Einstellungen dürfen nicht ohne zwingenden Grund verändert werden... .equ timstart=183 ;Startwert Timer0 (Differenz bis 256...) 183 .equ taste=4 ;Bit Programmiertaste und Rückfahrlicht in PortD .equ rfs=4 ;Bit Rückfahrscheinwerfer (gleich Programmiertaste) in PortD .equ led=5 ;Bit Programmier-LED bzw. Bremslicht in PortD .equ pwm1v=6 ;Bit PWM in PortD und Richtungsregister .equ rfl=7 ;Bit Rückfahrlicht in Richtungsregister .equ pwm1r=0 ;Bit Vorwärts in PortB und Richtungsregister .equ pwm2v=1 ;Bit Rückwärts in PortB und Richtungsregister .equ pwm2r=2 ;Bit Relais in PortB .equ sk4a=3 ;Bit Schaltkanal 4a in PortB .equ sk4b=4 ;Bit Schaltkanal 4b in PortB .equ sk3a=5 ;Bit Schaltkanal 3a in PortB .equ sk3b=6 ;Bit Schaltkanal 3b in PortB .equ lapu=7 ;Bit Ladungspumpe für MOSFETs in Port B .equ flip=(flip3l<<0)+(flip3k<<1)+(flip4l<<2)+(flip4k<<3) ;Zusammenfassung Schaltmodus .equ bremszeit=256-bremsz ;Startwert Bremszeit-Zähler setzen .def srsk=r1 ;Sicherheitskopie vom Statusregister während ISR Timer0-Überlauf .def ipv=r2 ;Impulsbreitenzähler 1 und Impulspausen-Vorteiler .def ibz=r3 ;Impulsbreitenzähler 2 .def ialt=r4 ;Impulspegel alt (vorheriger Zustand) .def tsw=r5 ;Timer-Startwert .def max=r6 ;Maximaltempo, Zählumfang PWM-Treppenzähler .def taz=r7 ;Tastenzeitzähler .def tempol=r8 ;Tempo, linker Antrieb .def tempor=r9 ;Tempo, rechter Antrieb .def ib=r10 ;Impulsbreite .def t5=r12 ;temporär unten .def t6=r13 ;temporär unten .def t7=r14 ;temporär unten .def t8=r15 ;temporär unten .def t1=r16 ;temporär oben .def t2=r17 ;temporär oben .def t3=r18 ;temporär oben .def t4=r19 ;temporär oben .def flags=r20 ;Flags zur Ereignissteuerung .equ aktiv=0 ;Flag "Ausgänge aktiv" .equ menak=1 ;Flag "Menü aktiv" .equ sk3akt=4 ;Flag "Schaltkanal 3 aktiv" .equ sk4akt=5 ;Flag "Schaltkanal 4 aktiv" .equ richtl=6 ;Flag "Lenkungs-Richtung" .equ richtf=7 ;Flag "Fahrtrichtung" .def iflg=r21 ;Impulsflag .equ impe1=0 ;Flag "Impulsende Kanal 1" .equ impe2=1 ;Flag "Impulsende Kanal 2" .equ impe3=2 ;Flag "Impulsende Kanal 3" .equ impe4=3 ;Flag "Impulsende Kanal 4" .equ impa1=4 ;Flag "Impulsanfang Kanal 1" .def sflg=r22 ;Schalter-Flags (für Schaltkanäle 2 und 4) .equ k3lang=0 ;Flag "Kanal 3 langer Impuls" .equ k3kurz=1 ;Flag "Kanal 3 kurzer Impuls" .equ k4lang=2 ;Flag "Kanal 4 langer Impuls" .equ k4kurz=3 ;Flag "Kanal 4 kurzer Impuls" .equ k3laff=4 ;Flag "Kanal 3 Flipflop langer Impuls" .equ k3kuff=5 ;Flag "Kanal 3 Flipflop kurzer Impuls" .equ k4laff=6 ;Flag "Kanal 4 Flipflop langer Impuls" .equ k4kuff=7 ;Flag "Kanal 4 Flipflop kurzer Impuls" .def ri=r23 ;Fahrtrichtung .def ipz=r24 ;Impulspausenzähler .def pwz=r25 ;PWM-Treppenzähler .def mp=r26 ;Menüpunkt-Zähler .def ineu=r27 ;Impuls-Status, neu ;Adressen für Variablen im SRAM .equ einz=$60 ;Einschaltzähler .equ errzib=$61 ;Errorzähler Impulsbreite .equ errzip=$62 ;Errorzähler Impulspause .equ neutf=$63 ;Neutralwert Fahrimpuls .equ neutl=$64 ;Neutralwert Lenkimpuls .equ neut3=$65 ;Neutralwert Schaltimpuls 3 .equ neut4=$66 ;Neutralwert Schaltimpuls 4 .equ nlwf=$67 ;Nachlaufwert Fahrimpuls .equ nlwl=$68 ;Nachlaufwert Lenkimpuls .equ nlw3=$89 ;Nachlaufwert Impuls 3 .equ nlw4=$8a ;Nachlaufwert Impuls 4 .equ tempo=$6b ;Fahrwert (signed Byte) .equ lenk=$6c ;Lenkwert (signed Byte) .equ impu1=$6d ;ungespiegelter Fahrimpuls .equ impu2=$6e ;ungespiegelter Lenkimpuls .equ trig3=$6f ;Einschaltschwelle Schaltkanal 3 .equ trig4=$70 ;Einschaltschwelle Schaltkanal 4 .include"2313def.inc" .cseg .org 0 ;Reset und INT-Vektoren ;Vektoren 2313 rjmp reset ;Programm-Initialisierung reti ;IRQ0 (extern, PD2, Pin 6) reti ;IRQ1 (extern, PD3, Pin 7) reti ;Timer1 capt1 reti ;Timer1 comp1 reti ;Timer1 ovf rjmp takt ;Takt durch Timer0-Überlauf 2313 reti ;UART RX reti ;UART UDRE reti ;UART TX reti ;Analog-Comparator RESET: ldi t1,ramend ;Stackpointer out spl,t1 ;initialisieren clr ri ;Fahrtrichtung ausschalten clr mp ;Menüpunkt clr pwz ;PWM-Zähler clr taz ;Tastenzeitzähler clr ialt ;Impuls-Pegel alt clr ineu ;Impuls-Pegel neu ldi flags,0 ;Ereignis-Flags clr sflg ;Schalter-Flags clr iflg ;Impuls-Flags clr ipz ;Impulspause H clr ipv ;Impulspause L ldi t1,errors ;Fehleranzahl sts einz,t1 ;in Einschaltzähler, sts errzib,t1 ;in Impulsbreiten-Fehlerzähler, sts errzip,t1 ;in Impulspausen-Fehlerzähler ldi t1,neutral ;Mittelwert (Stop) sts neutf,t1 ;in Neutralstellung Fahrwerk sts neutl,t1 ;in Neutralstellung Lenkung sts neut3,t1 ;in Neutralstellung Schaltkanal 3 sts neut4,t1 ;in Neutralstellung Schaltkanal 4 sts nlwf,t1 ;in Nachlaufwert Fahrwerk sts nlwl,t1 ;in Nachlaufwert Lenkung sts nlw3,t1 ;in Schaltkanalwert 3 sts nlw4,t1 ;in Schaltkanalwert 4 clr t1 ;Null in sts tempo,t1 ;Fahrwerk sts lenk,t1 ;Lenkung sts trig3,t1 ;Schaltschwelle 3 sts trig4,t1 ;Schaltschwelle 4 ldi t1,(neutral/3-sprz-1) ;Maximalwert Tempo mov max,t1 ;zuweisen ldi t1,10 ;Watchdog auf 64ms out wdtcr,t1 ;einschalten ldi t1,timstart ;Startwert für mov tsw,t1 ;Timer zuweisen clr t1 ;PortB erstmal out portb,t1 ;alle Bits aus ldi t1,255 ;und als out ddrb,t1 ;Ausgang ldi t1,0b00000000 ;Pull-Ups für Impulseingänge aus, out portd,t1 ;Bremslicht und Rest aus ldi t1,0b01100000 ;außer Pin 9 und 11 erstmal out ddrd,t1 ;alles als Eingang sbic pind,taste ;Programmiertaste gedrückt? sbr flags,1<