/****************************************************************************************
* DCC Wagen Decoder Software V1.1 *
* Copyright 2011 Toralf Wilhelm *
* *
* private Nutzung erwünscht, gewerbliche Nutzung erfordert zwingend meine Zustimmung! *
* Datei: DCC_Decoder.inc *
* Kontakt: toralfwilhelm@web.de *
* Webseite: www.toralfwilhelm.de *
* Version: 01/2011 Version 1 Start *
* 01/2013 Fehler bei langer Adressierung und Decoderreset beseitigt *
* Beschreibung: Decodiert das DCC Telegramm und verzweigt dann zur Verarbeitung zu: *
* "Programmierung.inc" Programmiert den Dekoder *
* "Funktionsbefehle.inc" ermittelt die Funktionen der Funktionsausgänge *
* "Fahrbefehle.inc" ermittelt die Fahrbefehle *
* (Geschwindigkeit + Richtung + Licht) *
****************************************************************************************/
#include "definitionen.h"
/*******************************
* DCC Telegramm entschlüsseln *
*******************************/
DCC_DECODER:
sbrs flag,resetbit // wenn 1 war reset da gehe zu
rjmp 1f // sonst normal weiter
rcall SERVICE_MODE // Programmiermodus CV-Lesen, Schreiben, Bitmanipulation
ret
1: // eigene Adresse ist angesprochen
tst byteB // Vergleich auf dcc reset
brne 1f // wenn ungleich 1x springen
rjmp DCCreset // sonst Reset machen (ret nicht nötig da SP init)
1: sbrs DCCreg,erwAdresse // hier erst noch auf lange Adresse testen
rjmp 2f // wenn nicht gleich weiter
lds w,AdresseLow // sonst erst noch auf richtiges LowAdressbyte testen
cp byteB,w
breq 1f // wenn ja 3x springen
cbr flag,(1<<neuerBefehl); sonst Daten bearbeitet Empfangsspeicher wieder freigeben
ret // und fertig
1: mov byteB,byteC // wenn gleich alle datenBytes an die position
mov byteC,byteD // für 7bit addressen verschieben
mov byteD,byteE
mov byteE,byteF
//AN_ALLE: // alle Decoder sind angesprochen
2:
//hier je nach Datenformat verzweigen
mov w,byteB // Daten sichern
andi w,0b11100000 // Datenbits ausblenden
//ERWEITERTE_OPERATION:
cpi w,0b00100000 // Vergleiche auf erweiterte Operation (enthält befehl für 128 Fahrstufen)
brne 2f // wenn ungleich zu BASISFORMAT rückwärts springen
mov w2,byteB // w2 mit inst Byte laden
mov w,byteC // w mit Daten laden
cbr flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
rcall ERW_OPERATION // wenn gleich gehe zu..
ret
2:
cpi w,0b01000000 // Vergleiche mit V Rückwärts einfaches Format
brne 2f // wenn ungleich zu BASISFORMAT vorwärts springen
mov w,byteB // w mit Daten laden
cbr flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
rcall V_BASIS // wenn ja gehe zu
ret
2:
cpi w,0b01100000 // Vergleiche mit V Vorwärts einfaches Format
brne 1f // wenn ungleich zu FUNKTIONSGRUPPE_1 springen
mov w,byteB // w mit Daten laden
cbr flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
rcall V_BASIS // wenn ja gehe zu..
ret
1:
cpi w,0b10000000 // Vergleiche mit Funktionsgruppe F1-F4
brne 2f // wenn ungleich zu FUNKTIONSGRUPPE_2 springen
mov w,byteB // w mit Funktionsdaten laden
cbr flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
rcall F_GRUPPE_1 // und dann gehe zu..
ret
2:
cpi w,0b10100000 // Vergleiche mit Funktionsgruppe F5-F8
brne 1f // wenn ungleich zu PROGRAMMIERUNG springen
mov w,byteB // w mit Funktionsdaten laden
cbr flag,(1<<neuerBefehl); Daten gesichert Empfangsspeicher wieder freigeben
rcall F_GRUPPE_2 // und dann gehe zu..
ret
1:
cpi w,0b11100000 // Vergleich auf CV reg Manipulation
brne 1f // wenn ungleich 1x springen
rcall CV_edit // wenn gleich gehe zu..
ret
1:
cbr flag,(1<<neuerBefehl); Daten bearbeitet Empfangsspeicher wieder freigeben
ret // alles andere wird nicht unterstüzt -> verwerfen und zurück
Vorgefundene Kodierung: UTF-8 | 0
|