www.mikrocontroller.net

Forum: Codesammlung DCC Decoder

Autor: maddax (Gast)
Datum: 15.09.2005 07:43
Dateianhang: Dec_T15.asm (32,4 KB, 1722 Downloads) | formatierter Code

Ich habe mir einen funktionierenden DCC Decoder auf Basis des Tiny 15
gebastelt. Das ganze ist jedoch eingeschlafen, da ich das Layout für
die Platine in SMD nicht so richtig klein gekriegt habe. Auf dem
Prüfstand mit den Tiny 15 in DIL lief das ganze problemlos. Ich hoffe
mein Code hilft für eure Projekte. Den Code für einen Encoder für
Langsamfahrstellen oder Signalhalte werde ich auch noch einstellen.

mfg DXM
Autor: maddax (Gast)
Datum: 15.09.2005 07:44
Dateianhang: Enc_T15.asm (8,2 KB, 1361 Downloads) | formatierter Code

Hier noch der Encoder. Ich hoffe er läuft.

mfg DXM
Autor: leif (Gast)
Datum: 27.09.2005 15:05

DCC:

National Model Railroad Association's Digital Command Control
Standards and Recommended Practices. DCC is simply the best form of
model railroad control available.
Autor: Patrick (Gast)
Datum: 08.10.2005 13:59

Hallo DXM

Wie siehts bei der Hardware aus, ich habe vor da noch Lichtfunktion und
weiteres einzubauen...
Die F-Ausgänge ist klar, bei mehr mA Transistoren, aber wie siehts bei
der Ansteuerung des Motors aus, könnte ich diesen gleichsetzen mit z.B.
den Schaltplan von dem Lokdecoder LD-G5 von Tams? (mir geht es dabei um
die Hardware)

Gruß
Patrick
Autor: maddax (Gast)
Datum: 08.10.2005 20:10
Dateianhang: DCC.sch (164,9 KB, 1539 Downloads)

Hier der einfache Schaltplan für Eagle 4.11.
Der L272D kann 1000 mA, das leicht locker für Spur N.
Für H0 oder größer müsste man nachrechnen.

mfg dxm
Autor: Patrick (Gast)
Datum: 08.10.2005 20:31

Super, danke!

Also 1000mA reichen auch für H0-Loks, H0-Lokdecoder haben meist auch
nicht mehr mA.
Bei älteren Loks vieleicht problematisch

Gruß
Patrick
Autor: Patrick (Gast)
Datum: 08.10.2005 21:13

Nochmal ich,

welchen Wert haben die Widerstände R1 - R6 (R5 & R6 klar)
Und welche Z-Diode ist eingebaut?
und was soll da zwischen 4 und 6 sitzen (beim Elko)

Danke im Vorraus

Gruß
Patrick
Autor: Hannes Lux (hannes)
Datum: 09.10.2005 07:19

> welchen Wert haben die Widerstände R1 - R6 (R5 & R6 klar)

R1 berechnet sich aus dem gewünschten Strom über die Z-Diode, der
Z-Spannung (üblicherweise 5V als AVR-Betriebsspannung) und der Höhe der
Digitalspannung.

R2 sollte so bemessen sein, dass sie Eingangs-Schutzdioden des AVRs
nicht überlastet werden. Es liegt schließlich die Digitalspannung an.
R2 wird also recht hochohmig sein.

R3 und R4 bilden einen Spannungsteiler zum Erzeugen der halben
AVR-Spannung als Schaltschwelle für den L272. Da sie die
Betriebsspannung des AVRs belasten, sollten sie recht hochohmig sein.
Grenzen setzt der Eingangswiderstand des (Power-)OPVs.

R5 und R6 ist ja klar, richtet sich nach Spannung zwischen AVR-Ausgang
und Transistorbasis und dem Basisstrom für 5 bis 10-fache Übersteuerung
des Transistors für sauberen Schaltbetrieb. Und natürlich nach der
Belastbarkeit des Ausgangs des AVRs.

Da der Basisstrom die AVR-Betriebsspannung belastet, muss er (als
wechselnde Last) bei der Berechnung von R1 und der Z-Diode
berücksichtigt werden.

Mit etwas Grundwissen solltest du alle Widerstände berechnen bzw.
schätzen können. Wenn nicht, dann solltest du dir vor dem Weitermachen
dieses Grundwissen aneignen. Mit P=U*I und U=R*I, sowie etwas Englisch
zum Lesen der Datenblätter solltest du vorerst zurechtkommen.

> Und welche Z-Diode ist eingebaut?

Da die Z-Diode zum Erzeugen der Betriebsspannung des AVRs dient, sollte
ihr Wert der zulässigen Betriebsspannung entsprechen. Wenn ich mich
recht erinnere, waren das 5V. Eine 5V1 dürfte also brauchbar sein.

> und was soll da zwischen 4 und 6 sitzen (beim Elko)

Das sind Pin 4 und 6 des Power-OPVs (L272), also dessen
Stromversorgungspins. Denn ohne Stromversorgung kann der nunmal
schlecht den Motor treiben.

Diese Fragen hättest du dir auch selbst beantworten können, wenn du die
Schaltung analysiert hättest und dabei die Datenblätter der ICs
herangezogen hättest.

Übrigens würde ich jedem IC noch einen 100nF-Keramik-Chipkondensator
spendieren, möglichst dicht an den Power-Pins.

...
Autor: Patrick (Gast)
Datum: 13.10.2005 18:40

Hallo Hannes!

Danke für deine Antwort,

also mit der Z-Diode, das hatte ich mir mit 5V1 gedacht, da die
Versorgungsspannung des tinys ja meistens 5V beträgt, aber es hätte ja
auch 3V sein (bei tiny15L).
Die Beschaltung mit den beiden Pins 4 und 6 hatte ich mir allerdings
noch nicht angeschaut, da ist das Nachfragen einfacher, die Elektronik
ist mir gut vertraut, mir ist z.B. klar das der Widerstand zum
"DCC-Eingang" sehr hochohmig sein muss, der Controller verkraftet da
nicht unbedingt eine so hohe spannung.
Jedoch wenn ich die exakten Daten haben kann ist es doch umso besser
:-)

Gruß
Patrick
Autor: Bernhard Schulz (bernhard)
Datum: 14.10.2005 20:44

>Hier der einfache Schaltplan für Eagle 4.11.

Interessantes Projekt, könntest Du uns bitte den Schaltplan als jpg
oder als pdf zur Verfügung stellen, denn leider hat nicht jeder
Eagle 4.11.

Danke

Bernhard
Autor: Klaus Ruebsam (Gast)
Datum: 14.10.2005 21:07
Dateianhang: DCC-Decoder_t15.jpg (75,3 KB, 3121 Downloads)
preview image for DCC-Decoder_t15.jpg

>denn leider hat nicht jeder Eagle 4.11.

aber jeder kann es sich kostenlos und ganz legal bei
http://www.cadsoft.de/ in der jeweils aktuellsten Version herunterladen
und damit sogar Platinenlayouts und Schaltpläne bearbeiten! Für die, die
jedoch weder Windoof noch Linux als Betriebssystem verfügbar haben, habe
ich den Schaltpan von maddax als JPEG beigefügt.

Gruss,

Klaus
Autor: Bernhard Schulz (bernhard)
Datum: 14.10.2005 22:16

@KLAUS

Danke für die jpg-Datei und für den Link zum Download von eagle

Gruß

Bernhard
Autor: Thomas Riesen (Gast)
Datum: 25.10.2005 17:06

Hallo zusammen

Mit Interesse habe ich diese Beiträge gelesen. Ich selber suche
schon länger Code für einen DCC-Decoder (Weichen, Signale) auf
Basis von Bascom-AVR. Hat hier jemand Erfahrung?

Freundliche Grüsse
Thomas Riesen
Autor: Klaus Ruebsam (Gast)
Datum: 25.10.2005 17:32

BASCOM-Sourcen für etwas so Timing-Kritisches ? Also wirklich alles, was
ich bislang für DCC gesehen habe (auf Hardwareseite) war mit
Microcontrollern (früher PIC, in letzter Zeit häufiger AVR) realisiert
und in Maschinensprache geschrieben. Mit Ausnahme einer DCC-Zentrale,
die sich der Pins der seriellen Schnittstelle bedient; die war soweit
ich mich richtig erinnere in Visual-C geschrieben.

Schau die mal die Seite http://www.avr-asm-tutorial.net/ an. Assembler
ist wirklich nicht so kompliziert wie man anfangs denkt. Und der Source
von maddax ist wirklich gut kommentiert. Wenn Du Dir zusätzliche die
Docs der NMRA reinziehst (siehe
http://www.dcc.info/standards_rps/index.html) ist es kein Hexenwerk.
Vorteil für Dich: Du hast mit den Sourcen von maddax einen
funktionierenden Code mit dem Du anfangen kannst; die gesamte
Entwicklungsumgebung ist kostenlos (AVRstudio) und das
"Programmiergerät" für die AVRs kannst Du mit Bauteilen aus der
Grabbelkiste zusammenlöten und die AVRs anschließend mit PonyProg
(wieder kostenlos) programmieren.

So, ich hoffe ich habe genug Begeisterung rüberbringen können. Viel
Erfolg!!! Und lass uns an Deinen Ergebnissen teilhaben.

Gruss,

Klaus
Autor: Hannes Lux (hannes)
Datum: 25.10.2005 19:18

@Klaus:

Völlig richtig...

<provokation>
Aber BASCOM vermittelt den Eindruck, dass man das auch realisieren
kann, ohne sich mit der Materie vertraut machen zu müssen. Denn BASIC
ist ja "kinderleicht", das macht man doch mit links und vierzig
Fieber...
</provokation>

Ich programmiere in ASM, das ist einfacher und übersichtlicher als
BASCOM.

...
Autor: pic16x84 (Gast)
Datum: 29.11.2005 20:31

It is possible to make a 'DCC decoder' with basic (look at the
qoutes).
I was looking for a basicsource for quite a time. Until I decided NOT
to use the real NMRA protocol, but to focus on the function itself:
trying to have a train (h0 in my case)controlled by on onboard micro.
I now use the ATTINY13 (onboard PWM, onboard osc) and try to time the
micro as good as it gets.
In my case, between 14 and 18 cycles (depending on OSC) means a
startBIT
After receving the startBIT, between 6 and 9 cycles means a '1', and
between 10 and 14 means '0'. All other values mean error and start
over. Even in the real NMRA protocol it is advisable to tranmit the
same info for about 5 times in a row. The same with my protocol.
Try to experiment.....
Autor: Klaus Ruebsam (Gast)
Datum: 01.12.2005 07:56

Hi pic16x84

I´m not quite understanding what you are trying to say. On one hand you
write that a DCC-Decoder (conformant to NMRA) is possible with BASIC
(which I personally doubt) on the other hand you write that you "focus
on the function itself", what ever that means and "your protocol",
which sounds to me as being NOT DCC (according to NMRA specs). However
perhaps I just didn´t get the point you tried to make. Would you please
clarify?

Kind regards,

Klaus
Autor: pic16x84 (Gast)
Datum: 08.12.2005 17:22

NMRA is a protocol to "Digitally Command Control" a train. So the
function is NOT the NMRA protocol but (Digitally) Control a Train.
The NMRA protocol has strict 'rules' about timing, bits and bytes.
It is very difficult if not impossible to control a train with the NMRA
protocol in BASIC!

What is the problem if you don't focus on the strict timing of the
NMRA protocol.Use your own protocol ! Think of items like asking for
attention from a train. In my case I transmit a '1' for lets say 10
milliseconds. After that I transmit an address package. In this package
a '1' is only ' 5' milliseconds instead of 10. a '0' is about 2
milliseconds.
My decoder detects the upflank, waits till the downflank and sees if
its 10, 5 or 2 milliseconds. When it has nothing to do (the PWM does
its job independantly) it waits untill a new 10 milliseconds
startpulse. After the startpulse it reads 16 bits. 8 for the adress and
8 for the function (speed and lights). It decodes the 2-bytes, refreshes
the PWM (if the address byte equals the trainnumber) and...waits for the
10 millisecond startbit.

Yes, if I miss a pulse, the train ERRORS.. So what, I transmit the same
info about 5 times in a row. So I can transmit less packages than the
NMRA protocol. So what, I don't have 256 trains to control at
once....

Think what you want (function: control a train) and think HOW you want
to do it (protocol). If you persist using the NMRA protocol...think of
ASM and NOT BASIC.


Hope this helps.
Autor: Patrick (Gast)
Datum: 26.01.2006 23:27

Hallo,

Wenns jetzt darum geht mehr Ausgänge zu haben muss man ja auf einen
anderen Atmel umspringen, ich dachte da an den ATtiny2313, da beide aus
der Tiny-Reihe sind hoffe ich das das anpassen nicht allzu schwer ist,
kann mir einer von euch sagen, wenn er sich den Code mal so durchschaut
ob es da Stellen gibt die bei dem tiny2313 eine andere Bezeichung haben
bzw. angepasst werden muss?
Und wie siehts um den internen Takt aus?

Danke
Patrick
Autor: Klaus Ruebsam (Gast)
Datum: 27.01.2006 06:57

Hallo Patrick,

ohne mir den Code jetzt im Detail angeschaut zu haben fallen mir da
folgende Punkte ein:

Sprungvektoren: Tiny 15 hat 9 Vektoren der Tiny2313 hat 19 !!! Hier
solltest DU in jedem Fall DummyVektoren eintragen. Ja, wer sauber
programmiert brauch die nicht, aber sicher ist sicher, tut ja keinem
weh.

Watchdog: hat der tiny15 nicht

Takt: Hier musst Du sicherlich Hand anlegen. Ist aber kein Hexenwerk.

Ansonsten fallen mir auf Anhieb keine weiteren Punkte ein. Daß die
beiden Tinys nicht Pin-kompatibel sind muss ich wohl nicht erwähnen
:-)

Viel Erfolg und veröffentlich doch die geänderten Sourcen ruhig hier im
Forum sodaß wir alle was davon haben. Dank im voraus.

Gruß

Klaus
Autor: Patrick (Gast)
Datum: 27.01.2006 21:22

Danke, naja ob der Tiny15 Watchdog hat oder nicht ist ja egal ;-)
Brauch ich ja dann ebenfalls nicht wenn ich auf tiny2313 wechsle...
Mit den Vektoren muss ich mir mal anschauen.

gruß
Patrick
Autor: Georg Dankesreiter (Gast)
Datum: 25.02.2006 19:06

Hallo Patrik,

möchte meine Eigenentwicklung im Fahrbereich auch auf DCC umstellen.Da
meine Selbstbaudecoder mit dem AT90S2313 aufgebaut sind und mit dem
eingebauten UART arbeiten, wäre Hardwaremässig ein Umbau möglich.

Mein Hauptproblem ist der Takt, da der At90s2313 mit 8 Mhz getaktet
wird und ich maddax seinen Code nicht so hinbekomme das er mit 8 Mhz
die Empfangszeiten einhält.

Da ich mit RVK Basic arbeite und mich mit Assembler nicht auskenne
hätte es mich interessiert ob dein Vorhaben gelang.


Mit freundlichen Grüssen

Georg
Autor: Mario Mai (Gast)
Datum: 26.02.2006 11:07

Hallo,

hat auch jemand einen Schaltplan für einen DCC-Decoder mit
Lastregelung?

Gruß
Mario
Autor: Hannes Lux (hannes)
Datum: 26.02.2006 11:19

Habe ich glaube mal auf der Webseite von TAMS gesehen.

...
Autor: Patrick (Gast)
Datum: 26.02.2006 15:42

Ich habe mich bis jetzt noch nicht drum gekümmert, zu viele andere
Sachen sind noch zu tun, aber in absehbarer Zeit will ich mich da dann
auch mal ran setzen und probieren, im  Keller liegt auch noch ein neuer
Brenner der noch fertig gelötet werden muss...

Gruß
Patrick
Autor: peter dannegger (Gast)
Datum: 26.02.2006 20:04

@Klaus

"Sprungvektoren: Tiny 15 hat 9 Vektoren der Tiny2313 hat 19 !!! Hier
solltest DU in jedem Fall DummyVektoren eintragen. Ja, wer sauber
programmiert brauch die nicht, aber sicher ist sicher, tut ja keinem
weh."

Ganz im Gegenteil !

Wenn man dort RETIs einträgt, verschleiert man Programmierfehler nur
und sucht dann tagelang an der falschen Stelle.
Auch ein Sprung zu 0x0000 verwirrt mehr, als das er hilft.

Wenn man schon an nicht benutzten Interrupts was einträgt, dann einen
Sprung zu einer Routine, die den Fehler deutlich signalisiert, z.B.
eine LED blinken läßt.

Alles andere ist witzlos.


Peter
Autor: Patrick (Gast)
Datum: 26.02.2006 21:40

Oh, da oben sollte eigendlich nur einmal meine Antwort stehen, warum da
3mal das gleich steht, fragt nicht mich, ist nicht beabsichtigt, bitte
2 löschen...

Gruß
Patrick
Autor: Hannes Lux (hannes)
Datum: 26.02.2006 21:51

> ist nicht beabsichtigt...

Schuldhaft verursachte Verkehrsunfälle sind auch nicht beabsichtigt.

> bitte 2 löschen...

Wer sollte das tun??
Die derzeit zwei aktiven Moderatoren haben genug Anderes und
Wichtigeres zu tun. Du wirst wohl damit leben müssen, dass jeder Leser
sieht, dass du gleich dreimal geantwortet hast...

;-)

...
Autor: Thomas Riesen (Gast)
Datum: 02.03.2006 21:06

Ihr habt ja allo so tolle Ideen. Hat aber nun einer von euch einen
lauffähigen Code für den AVR2313 (Bascom oder Assembler)? Zur Zeit
möchte ich wirklich nur einfach Schaltbefehle decodieren..
Autor: Holger Seider (Gast)
Datum: 11.04.2006 08:48

Funktioniert dieser DCC Decoder Code wirklich.
Funktionen F1 F2 gehen, aber die PWM spinnt.
Habt Ihr auch die Erfahrung gemacht.
Autor: Thomas Riesen (Gast)
Datum: 11.04.2006 08:58

Welchen Code hast du denn nun implementiert?
Einen Bascom-Code? Wenn ja, welchen, und wie
würde ich da rankommen?
Autor: Hannes Lux (hannes)
Datum: 11.04.2006 09:26

> Einen Bascom-Code?

Solch zeitkritische Dinge (DCC-Decoder) lassen sich eigentlich nur
vernünftig mit Interrupt-Programmierung realisieren. Da BASCOM wohl bei
jedem Interrupt alle Register sichert und wiederherstellt, wird das
einfach zu langsam. Mit BASCOM wirst du also keinen vernünftig
arbeitenden DCC-Decoder realisieren können, es sei denn, der
BASCOM-Hersteller löst das in ASM und bietet das als weiteren Baustein
(Bibliothek) für den "Baukasten" BASCOM an.

Ich würde ja versuchen, ein ASM-Programm dafür zu schreiben, aber mir
fehlt das Equipment. Ich habe seit Jahrzehnten keine Modellbahn mehr
und daher auch keine DCC-Zentrale. Und ich glaube kaum, dass du mir
eine DCC-Zentrale sponsern willt, damit ich Programme für einige
verschiedene Decoder schreiben kann/soll. - Oder?

...
Autor: maddax (Gast)
Datum: 11.04.2006 21:20

Hallo zusammen,
welche Probleme macht denn der PWM. Wenn die Schaltfunktionen
funktionieren kann nicht mehr viel sein. Beim Test mit dem DDW-Server
ist mir aufgefallen daß er bei Full-Speed auf einmal Zero sendet. Ist
wohl ein Überlauf im DDW-Server selber. Da ich aber selber keinen
C-Compiler zum Korrigieren habe, habe ich mich darum nicht gekümmert.
Stelle doch mal die Belegung deiner EEProm-Variablen ein. Vieleicht ist
nur ein Parameter oder die Oszillatorkalibrierung krumm. mfg dxm
Autor: Holger Seider (Gast)
Datum: 12.04.2006 10:22

Hallo

Die EEPROM - Variablen sind ok.
Die PWM "schwingt". Das hört sich blöd an, ist aber so.
Ich habe mit dem Oszi nachgemessen.
Sie geht erst auf den eingestellten Wert (mit den eingestellten
Verzögerungszeiten)und dann "rapide" wieder auf WERT NULL.
Danach geht das ganze wieder von Vorne los.
Autor: maddax (Gast)
Datum: 14.04.2006 09:15

Also ich finde nichts. Der PWM wird nur durch den Interupt gesteuert:

TIM1_OVF: ;Beschleunigungs/Verzögerungszähler
    ;bei Timer 1 = 1,6 MHz wird der
    ;Interupt wid demnach alle 6250 Hz ausgelöst
    ;die kürzeste Rampen-Zeit ist 0,12 Sec für den Sprung von  0 auf 252
bei IncVAL = 0
    ;die längste Rampen-Zeit ist 31,3 sec  für den Sprung von 0 auf 252
bei IncVAL = 255


    ldi TEMPI, 3    ; Verzögerungsfaktor
    inc IncCNT1    ; erhöhe Zähler
    cp IncCNT1, TEMPI
    brne OVF1
    clr IncCNT1    ; lösche Beschleunigungszähler
    inc IncCNT

          cp ISTSpeed, SOLLSpeed; vergleiche IST <> SOLL
    breq Gleich    ; wenn Wert nicht gleich
    brsh DECSpeed    ; wenn Wert größer gleich
    brlo INCSpeed    ; wenn Wert kleiner

Gleich:    clr IncCNT    ; lösche Beschleunigungszähler
    clr IncCNT1    ; lösche Beschleunigungszähler
    reti                  ; Rücksprung und Interupts wieder einschalten

INCSpeed: cp IncCNT, IncVAL  ; vergleiche Beschleunigungszähler
    brne OVF1    ; Springe wenn kleiner
    clr IncCNT    ; lösche Beschleunigungszähler
    clr IncCNT1    ; lösche Beschleunigungszähler
    inc ISTSpeed    ; erhöhe Speed
    rjmp PWMOut     ; weiter

DECSpeed: cp IncCNT, DECVAL  ; vergleiche Beschleunigungszähler
    brne OVF1    ; Springe wenn kleiner
    clr IncCNT    ; lösche Beschleunigungszähler
    clr IncCNT1    ; lösche Beschleunigungszähler
    dec ISTSpeed    ; verringere Speed

PWMOut:   tst  ISTSpeed    ; ist Speed 0
    brne OUT    ; dann 0 ansonsten Out
    ldi  TEMPI,0b01000101  ; Timer/Counter1 PWM vom
          out  TCCR1,TEMPI  ; Ausgang trennen
          cbi  PortB, PB0  ; alles auf Null
          reti                  ; Rücksprung und Interupts wieder
einschalten

OUT:    sbrs DCCReg, DIR  ; wenn Fahrtrichtung vorwärts
    rjmp REV    ; überspringe setzen Ausgang rückwärts

    cbi  PORTB, PB0  ; setze Ausgang für vorwärts
    out  OCR1A, ISTSpeed  ; Wert für Speed nach Timer 1 Compare
    ldi  TEMPI,0b01100101  ; Timer/Counter1 PWM
    out  TCCR1,TEMPI  ; Ausgang direkt
    reti                  ; Rücksprung und Interupts wieder einschalten

REV:    sbi  PORTB, PB0  ; setze Ausgang für rückwärts
    out  OCR1A, ISTSpeed  ; Wert für Speed nach Timer 1 Compare
    ldi  TEMPI,0b01110101  ; Timer/Counter1 PWM
    out  TCCR1,TEMPI  ; Ausgang indirekt

OVF1:    reti                  ; Rücksprung und Interupts wieder
einschalten

Vieleicht ist der Stützkondensator C2 zu klein gewählt und der Tiny15
geht in Reset. Dann ist für 20ms im Programmiermodus tote Hose an den
Ausgängen. Danach läuft er wieder im DCC Modus hoch.
mfg dxm
Autor: Hannes Lux (hannes)
Datum: 14.04.2006 10:47

Warum sicherst du eigentlich in tim1_ovf das SREG nicht?

In den anderen ISRs machst du es doch. Bei der umfangreichen Mainloop
ist das auch unbedingt erforderlich.

Ob da noch weitere Fehller sind, weiß ich nicht, so tief bin ich jetzt
auf die Schnelle nicht vorgedrungen.

...
Autor: franz (Gast)
Datum: 17.06.2006 07:38

Hallo,
habe die Schaltung aufgebaut und mit AVR-Studio 4.12 Build 460
uebersetzt. Getestet mit Roco Lokmaus 2 und Booster,
CV-Programmierung ok., Adresse laesst sich aendern.
F1 und F2 ok, Motor ruckt auch beim Programmieren.
Fahren --- ohne Funktion ---
(Die 5V macht ein Regler 78L05, Stuetzkondensatoren genug vorhanden.)
mfg franz eff
Autor: maddax (Gast)
Datum: 24.06.2006 07:16

Hallo Leute,

ich habe gestern noch mal den Prüfstand hervorgekramt und einen Fehler
im Mehrzugbetrieb gefunden. Tauscht doch mal die paar Zeilen aus:

SpeedCalc:;Speed Berechnung 14 und 28 Fahrstufen

    mov TEMP2, ByteB  ; Daten sichern
    tst ISTSpeed    ; schreibe Richtung nur
    brne Speed28    ; wenn Speed 0

Das Register für die Fahrstufen wird sonst falsch gesichert.
Wenns funzt bitte melden, vielleicht mach ich dann doch noch mit mehr
Funktionen und anderen Controllern weiter.

mfg dxm
Autor: Patrick (Gast)
Datum: 25.06.2006 19:44

Auf jeden Fall wäre Interesse an mehr Ausgängen (F0, Licht, F3, F4...)
sowie an anderen Atmels (ATtiny2313...) meinerseits da.
Das umbauen des Codes auf den 2313er, was ich ja machen wollte, habe
ich bis jetzt noch nicht in Angriff genommen, mir fehlt die Zeit
momentan...

Gruß
Patrick
Autor: maddax (Gast)
Datum: 09.07.2006 20:19
Dateianhang: Dec_T15_Adv.asm (29,4 KB, 708 Downloads) | formatierter Code

Hallo Leute,

hier  habich noch mal eine Version die ganz gut aussieht. Das SREG wird
jetzt auch gesichert. Der Betrieb mit kurzer oder langer Adresse läuft
jetzt über CV29. Die Hersteller CVs 7 und 8 sind schreibgeschützt.
Dafür habe ich jetzt keinen Platz mehr für Consistbetrieb, braucht bei
den neuen Steuergeräten eh keiner mehr.
Die Fahrtrichtungsumkehr ist nun nur mehr bei komplettem Stillstand
möglich. Feedback von Euch würde mich freuen. Weiß jemand einen Weg
einen Tiny15 zu programmieren ohne ihn einzulöten ?
mfg dxm
Autor: franz eff (Gast)
Datum: 18.07.2006 22:34
Dateianhang: IMG_4025_web.jpg (129,6 KB, 1040 Downloads)
preview image for IMG_4025_web.jpg

Hallo,
habe heute die neue Version kompiliert. Es gibt immer noch den
Error weil "Out" in Zeile 262 kein Label sein darf.
Das war wieder schnell geaendert. Die Default-Adresse im eep
setze ich uebrigens nach NMRA immer auf 3. Nach dem Flashen
habe ich den Tiny schnell fliegend in meine vorbereitete Lok
eingesetzt. Anbei mal ein Bild: BTTB BR81 Baujahr 1979.
Alle Teile fliegend am Rahmen, der Tiny sitzt spaeter dann
mal vorne auf dem Motor.
Lok aufs Gleis, Lokmaus eingestoepselt und Lok ruckte kurz.
Die an angeschlosse LED reagierte bei F-Tasten nicht. Durch
Rechtsdrehen am Regler fing die LED plötzlich an heller zu werden.
Beim Linksdrehen ging sie dann langsam wieder aus und beim
Ueberschreiten von Null leuchtete sie ploetzlich hell. Motor ohne
Funktion. Dann habe ich an der Lokmaus 14 Fahrstufen eingestellt. Jetzt
fuhr die Lok plötzlich los, liess sich aber nicht regeln. Dafuer
funktioniert jetzt Funktion tadellos, ich kann Licht ein und
ausschalten. Zum Schluss habe ich versucht die Lokadresse zu
programmieren, es ging nicht, uebrigens das ging mit der
Vorgaengerversion noch. Habe den alten EEPROM-Inhalt noch gesichert.
Bei Conrad im Business-Bereich gibt es uebrigens Adapter wo die SO-IC
eingespannt werden, leider nicht ganz billig...
Autor: remo (Gast)
Datum: 19.07.2006 10:22

Mal ne ganz doofe Frage:
DCC und das Motorola/Märklin Protokoll sind nicht zufällig kompatibel?

Hat jemenad einen Signal/Weichendekoder auf Atmel Basis für das
Motorola /Märklin Protokoll, um ein bischen Code zu spicken, möchte
nicht gerne das Rad neu erfinden.

Danke Remo
Autor: Hannes Lux (hannes)
Datum: 19.07.2006 11:02

Sind nicht kompatibel. Märklin Infos (zumindest brauchbare Links)
findest du vermutlich bei Herrn König (mal suchen).

...
Autor: Patrick (Gast)
Datum: 19.07.2006 16:41

Ich habe den Code ebenfalls kompiliert, das Out zu Outx geschrieben
damit es geht und da gerade Zeit da war mal den Code an den tiny2313
angepasst jedoch fehlt mir jetzt noch das anpassen der Zeiten (87µs
usw...) da mein tiny2313 mit 4Mhz laufen möchte...
Die Testschaltung ist schon aufgebaut.

Gruß
Patrick
Autor: Wolfgang (Gast)
Datum: 28.07.2006 05:54

Unter http://www.opendcc.de haben ich einen Zubehördecoder für DCC inkl.
Source veröffentlicht. ATtiny2313, geschrieben in C (mit dem gcc
(winavr)).

Gruß Wolfgang
Autor: Patrick (Gast)
Datum: 31.07.2006 19:52
Dateianhang: tiny15-Lokdecoder.jpg (385,2 KB, 1051 Downloads)
preview image for tiny15-Lokdecoder.jpg

Moin Moin,
So ich habe nun auch mal, neben den Anpassen auf den tiny2313 (welchen
ich warscheinlich doch nicht nehme), den Code auf einen tiny15 gebrannt
und meine Roco-Lokmaus raus geholt und aufgebaut, nach ein ganz klein
wenig Zeitanpassung beim Timer laufen auf jeden Fall schon mal die
Funktionstasten F1 & 2 problemlos.
Den OP habe ich noch nicht angeschlossen, da alles in DIL aufgebaut ist
und ich keine Lust hatte den OP in SMD da dran zu löten...
Anbei ein Bild, da sieht man noch die Testschaltung mit dem eigendlich
eingesetzen tiny2313, um den tiny15 zu testen habe ich mal schnell
einen Sockel im Sockel im Sockel gebaut ;-).
Die Tage werde ich mal die Ansteuerung des Motors anschauen...

Gruß
Patrick
Autor: manu (Gast)
Datum: 12.09.2006 19:03
Dateianhang: Enc_T15.asm (8,3 KB, 700 Downloads) | formatierter Code

In maddaxs DCC Encoder steckten noch ein paar Fehler drin (u.a. Timer0
nur einmal initialisiert, Timing falsch). Ich habe mir die Freiheit
genommen diese zu korrigieren. Getestet wurde der Code mit Hilfe eines
Oszilloskops und einem DCC Protokoll-Dekoder und scheint soweit zu
funktionieren.

Have fun,
 manu
Autor: Frysk (Gast)
Datum: 14.09.2006 08:28

Manu,

Ich bin neugierig geworden. Hast du vielleicht einen schaltplan für die
encoder?

Frysk
Autor: manu (Gast)
Datum: 14.09.2006 19:55

...also einen Schaltplan gibt es dazu eigentlich nicht, bzw. steht alles
in der ASM-Datei drin. An Pin5 (PB0) kommt ein geeigneter Booster hin.
Diese lassen sich einfach selber bauen (Halbbrücke/Vollbrücke) -
Anleitungen/Anregungen findet man z.B. bei www.opendcc.de (links unter
Booster) oder in den Anleitungen von Tams Elektronik.

manu

Tiny15 Anschlussbelegung:
;RESET        PB5 = 1  8 = VCC
;        PB4 = 2  7 = PB2
;             PB3 = 3  6 = PB1
;             GND = 4  5 = PB0 DCC Ausgang
Autor: Frysk (Gast)
Datum: 14.09.2006 20:25

Manu,

Danke, es ist Mir klar. Ich habe zu hause einen Lenz Booster.
Kan ich den encoder auch direkt ansliesen an diesen Booster?

Frysk
Autor: Thorsten (Gast)
Datum: 18.09.2006 16:03

ist hier ja ein klasse Forum.
Als typischer Nachbauer von DCC Decoder auf Atmelbasis verfolge ich mit
interresse diese Thread hier.
Bin seit längerem auf der Suche nach einem reinem Funktionsdecoder so
mit 8-12 Ausgängen, die man  über F1-F12 Ein- und Auschalten kann und
bei dem man die Ausgänge beliebig dimmen kann. Wenn dann noch eine
Blinkfunktion intergriert wäre, wäre es natürlich megaklasse.
Hat jemand sich mal an so etwas rangemacht?
Gruß aus Hamburg

Thorsten
Autor: Zdenek (Gast)
Datum: 26.10.2006 09:24

Hello DXM,

i was surprised by your simple, attiny15 based DCC loco decoder.
Yesterday i tried to program tiny15 by PonyProg and make wiring with
L2722 and my old BTTB loco. The first test was unsuccessfull - reset pin
of ATTINY on your scheme is "in the air", also PWM outputs to power
amplifier doesn't work with pull-ups turned off in your source. After
changing this line

ldi  TEMP1,0b01000011  ;Interupt auf Rise-Flanke, Pull-Up Disabble

to

ldi  TEMP1,0b00000011  ;Interupt auf Rise-Flanke, Pull-Up Enable

was all OK, but PWM frequency for motor in my old BTTB loco was too
high. Please, which lines i must change to reduce PWM frequency to
~100Hz ?
Please, can yuo also tell me, in which state (working, development, not
working, working with problems...) is source code on
Beitrag "DCC Decoder" ? Have you newer one for
testing? Thank you for your answer and perfect work on decoder

best regards

Zdenek
Autor: maddax (Gast)
Datum: 30.10.2006 20:38

Hello Zdenek,

try this for your decoder for run parameter:

           ldi  TEMP1,0b01001011  ; 0 0 0 0 Timer/Counter1 is stopped.
           out  TCCR1,TEMP 1  ; 0 0 0 1 CK*16 (=PCK)
                         ; 0 0 1 0 CK*8 (=PCK/2)
        ; 0 0 1 1 CK*4 (=PCK/4)
        ; 0 1 0 0 CK*2 (=PCK/8)
        ; 0 1 0 1 CK für PWM mit 6125 Hz
        ; 0 1 1 0 CK/2
        ; 0 1 1 1 CK/4
        ; 1 0 0 0 CK/8
        ; 1 0 0 1 CK/16
        ; 1 0 1 0 CK/32
        ; 1 0 1 1 CK/64 für PWM mit 97,6 Hz
        ; 1 1 0 0 CK/128
        ; 1 1 0 1 CK/256
        ; 1 1 1 0 CK/512
        ; 1 1 1 1 CK/1024
Caution at TIM1_OVF:

delete!!   in  TEMPS,SREG           ; SREG sichern
    ldi TEMPI, 3    ; Verzögerungsfaktor
    inc IncCNT1    ; erhöhe Zähler
    cp IncCNT1, TEMPI
    brne OVF1
    clr IncCNT1    ; lösche Beschleunigungszähler
    inc IncCNT

because the ramp for speed inc and dec will get to slow.

good luck
dxm
Autor: yjn (Gast)
Datum: 31.10.2006 17:53

Hallo,

ich habe mit der Schaltung folgendes Problem.

In Richtung 'rückwärts' funktioniert der angeschlossene Motor ganz
wunderbar, in Richtung 'vorwärts' nicht, bzw. nur bei Vollgas.

Die PWM-Signale aus dem Tiny and den OV sehen für beide Richtungen
gleich aus.

Bei 'vorwärts' 'fehlen' am Ausgang des OV jedoch 2 von 3 Pulsen.

ungefähr so

  +--+  +--+  +--+  +--+
 I  I__I  I__I  I__I  I        rückwärts OK


  +--+              +--+
 I  I______________I  I        vorwärts, nix passiert

Hat jemand eine Idee, woran das liegen kann ?

Danke
Autor: Zdenek (Gast)
Datum: 01.11.2006 09:29

Hello YJN,

if you use higher PWM frequency for older motor driven by L272,
typically PWM>200 Hz, you can get this results: in one direction goes
motor OK, but in the reverse direction has motor very low torque. This i
have tested with many other DIY decoders. You can solve this problem by
decreasing PWM freq about to 100 Hz.

Zdenek

P.S.: Thanks to DXM for updated code, i'll try it today
Autor: yjn (Gast)
Datum: 01.11.2006 21:47

Hello Zdenek,

many thanks for your reply, reducing the PWM frequency get's it all to
work !

Could you or anybody else in this forum please explain the
'electr(on)ically' background for this behaviour to me ?

I have searched the whole internet to find informations about this, but
i could not find anything explaining this ...

thx

yjn
Autor: Patrick (Gast)
Datum: 16.11.2006 21:11

Moin,

@Maddax
Wie hast du den OSCCAL-Wert raus gekriegt, durch messen oder versuchen?

Hast du zufällig auch einen (Cirka)Wert für 4Mhz?

Gruß
Patrick
Autor: maddx (Gast)
Datum: 20.11.2006 07:39

Hallo,

wer lesen kann hats leichter, siehe Datenblatt.
OSCCAL steht beim Tiny 15 im Auslieferungszustand auf Adresse 0 im
EEprom.
Einfach auslesen ;)

mfg dxm
Autor: Hannes Lux (hannes)
Datum: 20.11.2006 09:50

>> Hast du zufällig auch einen (Cirka)Wert für 4Mhz?

> OSCCAL steht beim Tiny 15 im Auslieferungszustand auf Adresse 0 im
> EEprom.

Muss ich das jetzt verstehen?
Der Tiny15 wird doch auf 1,6 MHz calibriert und nicht auf 4 MHz.

Desweiteren hat jedes Exemplar der calibrierbaren AVRs seine eigenen
Calibrationsbytes (unverlierbar) im Signature-Space gespeichert. Die
muss man halt mittels ISP-Programm auslesen und ins AVR-Programm
übertragen. Ich nutze dazu immer das L-Byte der letzten Flash-Zelle, da
schreibt ATMEL nämlich auch das Calibrationsbyte hin.

Im Übrigen empfehle ich mal die Appnotes, da ist eine dabei, die sich
mit der Calibration des internen RC-Oszillators befasst.

...
Autor: Willi (Gast)
Datum: 02.01.2007 01:01
Dateianhang: T15_lok_dec.zip (88,1 KB, 15376 Downloads)

Hallo,

ersteinmal allen ein gesundes und erfolgreiches 2007!
im anhang mal meine version von maddax T15 code. er ist auf meine
ansprüche verkürzt und erweitert. der t15 hat nunmal nur 1k
progspeicher. weggelassen habe ich lange add., consist, 128 fahrstufen,
genaue Vmax begrenzung und F3 Rangiergang. dazugekommen sind Vmax
begrenzung in 12,5% schritten von 50% bis 100% das reicht in der praxis
vollkommen aus, fahrtrichtungsabhängige beleuchtung pwm gedimmt, motor
pwmfreq. veränderbar, merken der letzten geschwindigkeit im eeprom
(damit riskiert man auf dauer die zellen, hilft aber ungemein bei
schlechtem schienenkontakt).
die platine ist einseitig 16x40 mm, kann man gut nachbauen, wem sie zu
groß ist der kann sie in der mitte durchbrechen und umklappen. ist
einfacher als zweiseitig mit dukos.

gruß willi
Autor: Sebastian Voitzsch (Gast)
Datum: 02.01.2007 20:56

Hallo,

nach sowas habe ich schon lange gesucht. Vor allem, weil der Decoder so
klein aufzubauen ist.

Mit dem DCC-Format kenne ich mich nicht wirklich aus, daher: kann jemand
evtl. die Software für einen Funktionsdecoder umstricken?  Ein paar
reine Schaltausgänge würden genügen...

Danke & Gruße,
Sebastian
Autor: Willi (Gast)
Datum: 02.01.2007 23:09
Dateianhang: 2313s-bahn.asm (36,3 KB, 710 Downloads) | formatierter Code

Hallo Sebastian,

schau Dir mal das asm vom meinem T15 DCC Dek an, da ist alles für einen
Funktionsdecoder schon bei, ist beim T15 nur rauskommentiert. Es sind
halt keine Ports mehr frei, ich benutze das Grundgerüst aber auch für
einen s1200 bzw s2313 mit 8mhz Keramikschwinnger oder jetzt auch mit
einem T2313 und dann reicht das auch für die Funktionsausgänge. Ich
hänge Dir mal mein File für einen s2313 an. Das habe ich für einen
Triebwagen geschrieben, bei F1 wird vorm anfahren ein klingeldreiton
abgespielt und für diese zeit auch ein pin für klingelleuchte gesetzt,
F2 F3 F4 schalten einfach nur portpins. Ansonsten ist der
Funktionsumfang genauso wie beim T15 dek.

Viele Grüße
Willi
Autor: Sebastian Voitzsch (Gast)
Datum: 06.01.2007 15:39

Hallo Willi,

danke für die Antwort - ich hatte den Code in der Tat nur grob
überflogen schäm

Ich werde das mal ausprobieren - außerdem möchte ich´s noch auf den
Tiny13 portieren. Soweit ich gesehen habe, ist der fehlende zweite Timer
der einzige größere Unterschied. Ohne Motor-PWM sollte man aber gut ohne
auskommen.

Nochmals Danke & Grüße,
Sebastian
Autor: Willi (Gast)
Datum: 06.01.2007 22:19

Hallo Sebastian,

das sollte kein Problem sein, Du mußt es nur auf die 4,8 bzw 9,6MHz beim
T13 anpassen, der T15 läuft nur mit 1,6 MHz. Ich habe auch eine Version
für einen s1200, der hat auch nur einen Timer, da mache ich die
Motor-PWM genauso wie die für Licht. Das ist halt nicht so genau, macht
sich aber in der Praxis überhaupt nicht bemerbar.
Meine Files von oben haben übrigens noch einen Fehler. Ich habe
vergessen das Reverse bit beim Lichtsetzen mit zu beachten(
Motorrichtung wir gedreht, Lichtausgänge bleibenaber in der alten
Richtung), muß ich noch änderen.

Gruß Willi
Autor: Willi (Gast)
Datum: 06.01.2007 22:45

Nocheinmal kurz, Licht bei rev_betrieb ist doch i.o.
gruß willi
Autor: Sebastian Voitzsch (Gast)
Datum: 15.01.2007 13:13

Hallo Willi,

ich habe den Code jetzt auf AVR-GCC und den Tiny13 portiert. Als Takt
habe ich 9,6MHz mit Divisor 8 genommen, also 1,2 MHz. Die Konstanten
habe ich entsprechend angepaßt - funktioniert einwandfrei. Den
Programmiermodus konnte ich noch nicht testen - habe nur eine Roco
Lokmaus 1 zum Test (die IntelliBox braucht mein Vater selbst ;-)), aber
ich sehe da keine Probleme (lediglich beim ACK, aber das ist wohl nicht
unbedingt nötig, hab´s erstmal auskommentiert). Für eine Licht-PWM
könnte man evtl. auf 4,8 MHz umsteigen, dann sollte die Genauigkeit
etwas größer sein. Aber für Licht ist es allemal ausreichend.

Die Platine ist 17x31mm "groß", für die Ausgangstreiber habe ich
Transistorstufen vorgesehen. 500mA (BC817) sollten für Funktionsausgänge
reichen (mein Vater will seine Wagen damit beleuchten, die vorgesehene
LED-Beleuchtung braucht 20mA)

Schaltplan ist der weiter oben gepostete, allerdings habe ich der
Z-Dioden-Regulierung einen Transistor verpaßt, dann wird der Widerstand
nicht so belastet - 0,5W sind für SMD ein bißchen fett.

Noch ein Tipp für Deinen Code: das Einlesen der Bytes könnte man wohl
etwas eleganter per Subroutine lösen - 6x derselbe Codeblock ist nicht
so effizient. Außerdem solltest Du bei den Portpins und Timing-Werten
mit Konstanten arbeiten, das erleichtert ggfls. das Portieren auf andere
Controller (Konstanten in .h-Datei ändern und fertig).

Bei der Hardware halte ich einen 7805 für Overkill, nimmt viel Platz und
so gut geregelt braucht man´s nicht.

Hat jemand der Beteiligten etwas dagegen, wenn ich den modifizierten
Schaltplan/Code auf meiner Webseite (www.voitzsch.net) veröffentliche?
Selbstredend ohne kommerziellen Hintergrund und mit Quellenangabe -
alles was dort liegt, ist GPL.
Autor: Willi (Gast)
Datum: 15.01.2007 14:14

Hallo Sebastian,

-Licht PWM ist absolut unkritisch, ich habe mir der software schon mal
eine LED bei 1% zum Test! ohne Vorwiderstand betrieben. Die lebt immer
noch.
-als Treiber verwende ich MOS SN7002 (ist auch im SOT-23)(ich habe die
Teile halt), das geht dann direkt ohne Vorwiderstand, die machen ca
200mA Dauerstrom und 700mA Impulsstrom mit, das reicht aus. Wenn ich
alle Ausgänge benötige nehme ich auch schon mal einen ULN2803 als SMD.
Der braucht auch wenig Platz.
-der 7805 ist übrigens ein SMD und braucht mit Sicherheit weniger Platz
als eine z-Diode, ein Widerstand und ein BC !
Ich hatte auch Probleme mit der Abwärme bzw Leistung des Widerstand,
wobei das noch aus meiner 1. Version mit einem S1200 und ext BrownOut
stammt, hat sich aber bewährt, kostet 50 Cent und läßt sich einfach und
Betriebssicher aufbauen.
-mit dem Code hast Du recht, das geht effizienter, aber das stammt von
maddax das habe ich auch nur übernommen. Der Code ist übrigens für einen
Tiny15 (bzw bei mir auch noch auf alten 90S1200) ohne SRAM ausgelegt.
Das bedeutet bei Vorsicht mit verschachtelten Sprüngen und kein
Push/Pop.
-für meine Codeanteile gilt GPL mit Quellenangabe ist ok

Gruß Willi
Autor: Sebastian Voitzsch (Gast)
Datum: 15.01.2007 14:34
Dateianhang: decoder.zip (64,5 KB, 796 Downloads)

Hallo Willi,

- die MOS SN7002 sind nett - leider bei Segor nur Bestellware; ebenso
der 7805 im SOT-23. Woher beziehst Du sie? Das ist der Vorteil der
Transistor-Variante - alles "Stangenware". Der 78L05 scheint mir zudem
mit 1,80 (Segor) reichlich teuer. Z-Diode, Widerstand und BC bekommt man
schon hingequetscht ;-)

- Für die Ausgänge müßte man auch Schieberegister vorsehen können - aber
es gibt wohl keine mit Schaltausgang. Mir langen die 4 Ausgänge aber
vollkommen - wie gesagt, Wagenbeleuchtung. Da bräuchte es eigentlich nur
1 Ausgang...

- Den fehlenden SRAM hatte ich nicht bedacht - hatte mich schon darüber
gewundert, wieso im Code der Stackpointer nicht initialisiert wird
(dachte, das geschieht wie beim AVR-GCC automatisch)

Habe mal meinen Schaltplan/Platine/Code angehängt, vielleicht nützt es
wem. Das funktioniert so übrigens nur mit dem 13er, der externe IRQ
hängt auf Pin PB1 und nicht PB2.

Grüße,
Sebastian