Forum: Mikrocontroller und Digitale Elektronik Hilfe bei AVR-Assembler Erstversuch


von Paul Baumann (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal meinen Erstversuch in Assembler angehangen. Diese Stück 
Programm möchte ich in das Programm "DCC-Decoder" von Maddax aus dem 
Forum
Codesammlung einfügen. Hintergrund: Dort ist kein Gleichspannungsbetrieb
vorgesehen.
Erklärung: Im dortigen Programm wird ein DCC-Signal an PB2 mittels 
Interrupt ausgewertet. Wenn aber kein DCC-Signal anliegt, da 
Gleichspannungsbetrieb passiert nichts.

Mein beigefügtes Programm funktioniert (jedenfalls als Simulation mit 
AVR-Studio) ;-)

Es gibt nun 3 Möglichkeiten des Signals an PB2:
DCC - Signal
Statischer H-Pegel
Statischer L-Pegel

Frage: Mit welchem ASM-Befehl kann ich abfragen, ob KEIN DCC-Signal an
PB2 anliegt und darauf hin mein Programmstück anspringen?

Mit seinem ASM-Latein am Ende
Paul :-)


von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote:
> Ich habe mal meinen Erstversuch in Assembler angehangen. Diese Stück
> Programm möchte ich in das Programm "DCC-Decoder" von Maddax aus dem
> Forum
> Codesammlung einfügen. Hintergrund: Dort ist kein Gleichspannungsbetrieb
> vorgesehen.

Ich habe mir das Projekt (noch) nicht näher angesehen, kenne also das 
Programm nicht. Habe vorläufig auch keine Zeit dazu.

> Erklärung: Im dortigen Programm wird ein DCC-Signal an PB2 mittels
> Interrupt ausgewertet. Wenn aber kein DCC-Signal anliegt, da
> Gleichspannungsbetrieb passiert nichts.
>
> Mein beigefügtes Programm funktioniert (jedenfalls als Simulation mit
> AVR-Studio) ;-)
>

Du möchtest also Deine H-Brücke (in Abhängigkeit von der Polung der 
Gleichspannung vor dem Gleichrichter) umschalten, um vorwärts und 
rückwärts fahren zu können, wenn kein DCC-Signal anliegt.

> Es gibt nun 3 Möglichkeiten des Signals an PB2:
> DCC - Signal
> Statischer H-Pegel
> Statischer L-Pegel
>

Wobei DCC-Signal aus Sicht des (schnellen) AVRs auch erstmal ein 
statisches Signal ist. ;-)

> Frage: Mit welchem ASM-Befehl kann ich abfragen, ob KEIN DCC-Signal an
> PB2 anliegt und darauf hin mein Programmstück anspringen?

Dazu reicht kein "ASM-Befehl"...
Du bräuchtest dazu einen Timeaut, der bei jedem ext. Interrupt 
(Pegelwechsel, DCC-Signal) wieder auf Startwert gesetzt wird und bei 
Ausbleiben der Pegelwechsel abläuft und auf Deine Routine verzweigt. Die 
Zeitkonstante sollte auch ein "stretched 0 bit" akzeptieren, um NMRA 9.1 
konform zu sein.

Jeder erneut auftretende Pegelwechsel muss diesen "Gleichstrom-Modus" 
sofort deaktivieren und, falls er aktiv war (aber auch nur dann!) die 
Brücke deaktivieren, bevor die DCC-Routine die Brücke wieder bedienen 
darf.

Dazu ist die Sicherung über ein Flag erforderlich, das aussagt, ob der 
Gleichstrom-Mode aktiv ist). Weiterhin wird ein Timer als Timeout für 
das ausbleibende DCC-Signal gebraucht. Dies kann ein Zählregister sein, 
falls im Programm ein Timer-Interrupt durchläuft. Falls kein Timer diese 
Arbeit mitmachen kann, könnte man den ADC als Timer missbrauchen.

Auf alle Fälle ist davon auszugehen, dass diese Erweiterung sehr eng mit 
dem bereits existierenden Programm verzahnt werden muss, für eine 
eigenständige Lösung reichen vermutlich die noch freien Ressourcen nicht 
aus. Aber wie gesagt, ich kenne das Programm nicht. Und nur mal kurz 
reinschaun (ohne es komplett zu analysieren) bringt auch nicht viel 
Übersicht, da muss man sich schon intensiv mit beschäftigen. Das ist 
eben einer der Nachteile von ASM.

>
> Mit seinem ASM-Latein am Ende
> Paul :-)

Beste Grüße,
Hannes,
der Dich nicht fragt, warum Du das nicht mit BASCOM machst... ;-)

von Stevko (Gast)


Lesenswert?

Guten Morgen Paul,

ich kann Dir zwar nicht auf der elektrischen Seite helfen(wie ist DCC 
definiert) aber zum Programm hätte ich einige Anmerkungen.
Allerdings schreibe ich hier aus dem Kopf, deshalb keine Garantie, doch 
vom Prinzip dürfte es so funktionieren.

Du willst:

1. den Port einlesen
-> in R28, Portb     ;ist ok

2. wenn Bit 2 gesetzt ist was tun
-> SBIS R28,2     ;Skip if Bit in I/O Register is Set
   (überspinge nächsten Befehl wenn Bit 2 gesetzt )
->   rjmp Bit_2_not_set

   ;jetzt die Befehle für Bit_2 = 1
     nop
     nop
      rjmp Bit_eval_ok

   ;nun Auswertung für Bit_2 = 0
   Bit_2_not_set:
     nop
     nop
      rjmp Bit_eval_ok


So würde ich die Auswertung vornehmen. Wahrscheinlich bin ich zu spät, 
da hier nebenbei noch gearbeitet wird.

Gruß
  Stevko
   ;und weiter im Programm
   Bit_eval_ok:
    nop
    nop
    .......




von Stevko (Gast)


Lesenswert?

Mist da ist was Durcheinander vom Kopieren.
Hier die richtige? Fassung!

Guten Morgen Paul,

ich kann Dir zwar nicht auf der elektrischen Seite helfen(wie ist DCC 
definiert) aber zum Programm hätte ich einige Anmerkungen.
Allerdings schreibe ich hier aus dem Kopf, deshalb keine Garantie, doch 
vom Prinzip dürfte es so funktionieren.

Du willst:

1. den Port einlesen
-> in R28, Portb     ;ist ok

2. wenn Bit 2 gesetzt ist was tun
-> SBIS R28,2     ;Skip if Bit in I/O Register is Set
   (überspinge nächsten Befehl wenn Bit 2 gesetzt )
->   rjmp Bit_2_not_set

   ;jetzt die Befehle für Bit_2 = 1
     nop
     nop
      rjmp Bit_eval_ok

   ;nun Auswertung für Bit_2 = 0
   Bit_2_not_set:
     nop
     nop
      rjmp Bit_eval_ok

   ;und weiter im Programm
   Bit_eval_ok:
    nop
    nop
    .......

So würde ich die Auswertung vornehmen. Wahrscheinlich bin ich zu spät, 
da hier nebenbei noch gearbeitet wird.

Gruß
  Stevko














von Paul Baumann (Gast)


Lesenswert?

@Hannes
Zitat: >der Dich nicht fragt, warum Du das nicht mit BASCOM machst... 
;-)

Das habe ich kommen sehen. ;-)
Ich hatte das ganze Programm tatsächlich schon mal mit $asm in Bascom 
eingefügt und wollte meine Routine mit Bascom-Quelltext dazuschreiben.
Aber der Compiler hat das nicht mehr verkraftet; es wurde zu groß. :-(

Da muß ich mal ein wenig weiter experimentieren. Deine Überlegungen
helfen mir dabei sehr.

@Stevko
Deine Lösungsmöglichkeit ist auch interessant. Ich habe bisher noch 
nichts
mit Assembler gemacht, (bin eigentlich Bascom-Fan) und habe länger dazu
gebraucht, mir die entsprechenden Befehle zu suchen und zu verstehen, 
als alles wert war. ;-) SBIS ist ein schönes Ding.


MfG Paul

von Stevko (Gast)


Lesenswert?


@Paul

Ich bin zwar nur stiller Mitleser doch Paul Baumann = Bascom war in 
meinem Hinterkopf.

Noch einen Tip für den Anfang:

In dem Atmel-Verzeichnis für das AVR-Studio gibt es eine 
Hilfedatei(AVRASM.chm) für Assembler. Bei mir ist es in:

  "D:\Programme\Atmel\AVR Tools\Help\AVRASM.chm".

Dort auf den Reiter "Index" klicken und schon hast Du alle ASM-Befehle 
und die nötigen Erklärungen.
Hat mir am Anfang sehr geholfen.

Gruß
  Stevko

von Hannes L. (hannes)


Lesenswert?

Paul, meine Betonung lag auch auf "nicht" (ich frage also nicht)... 
;-)

Noch'n Hinweis: Wenn man in AVR-Studio den Textcursor im Editorfenster 
auf einem ASM-Befehl stehen hat, dann sollte man mal die F1-Taste 
drücken, falls man Informationen zum Befehl braucht.

Ich habe den Quelltext mal kurz überflogen. Neben zwei Registern sind ja 
noch ein paar (als Flags nutzbare) Bits Bits im Register 'flagreg' frei. 
Ich konnte aber auf die Schnelle nicht zweifelsfrei feststellen, ob ein 
Timer ständig durchläuft und somit geeignet ist, den Timeout zu managen.

Dumm ist auch, dass ich keine Modellbahn betreibe (ich habe zwar etwas 
TT-Zeugs herumliegen, aber nix Digitales), also auch keinerlei 
Motivation habe, den ultimativen DCC-Decoder zu entwickeln. Auch ist mir 
der Standard zu 'offen', man muss auf zuviele Dinge Rücksicht nehmen, 
die auf den ersten Blick irrelevant erscheinen.

Ernst gemeintes Gedankenspiel: Hast Du Dir schonmal den Tiny25/45/85 
angesehen? Der hat SRAM und ein paar Features mehr. Kann gut sein, dass 
Du die gesammte Aufgabe mit einer Hochsprache lösen kannst.

...

von Paul Baumann (Gast)


Lesenswert?

@Stevko
Das ist ein guter Tip. Ich habe auch noch etwas Anderes gefunden:
http://www.avr-asm-tutorial.net/

Das ist ganz prima, weil es in deutscher Sprache ist. Mit Englisch habe 
ich
enorme Schwierigkeiten, weil ich schon so alt bin, daß es zu meiner 
Schulzeit noch gar keine Engländer gab. :-))

@Hannes
Ich habe gesehen, daß Maddax dort die Register 28 und 29 noch frei 
hatte.
Die Timer sind beide "voll im Streß". Er hat eine Routine "Ext_int0" 
drin,
die den Flankenwechsel an PB2 auswertet. Da will ich "mit rein".
Heute Abend versuche ich das mal. Jetzt habe ich 2 Loks fertig 
umgerüstet
(BR80 von Piko und V60 von Gützold). Die laufen beide prima mit 
Eigenbaubooster und der Software "DDW-Server" und "Rayliplan" sowie 
"Rayliprog".Motivation ist bei mir: Kein Geld, um fertige Komponenten zu 
kaufen, dafür aber Zeit und eine einigermaßen gute
Ausrüstung, um selbst zu bauen. Außerdem ist es auch ein Training für
den Graukopf, sich vorsichtig an ASM heranzupirschen. Wahrscheinlich 
ginge es mit Bascom einfacher, aber ich müßte den ganzen Algorithmus 
"umstricken". Ich habe nur mal probeweise mit einem Attiny2313
eine Routine nur zum Auswerten des DCC-Signals auf 0 oder 1 gemacht, da 
war er voll und es ging nichts Anderes mehr rein. ;-)

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote u.a.:
> @Hannes
> Ich habe gesehen, daß Maddax dort die Register 28 und 29 noch frei
> hatte.
> Die Timer sind beide "voll im Streß". Er hat eine Routine "Ext_int0"
> drin,
> die den Flankenwechsel an PB2 auswertet. Da will ich "mit rein".

Da musst Du rein, um den Timeout zu verhindern, also den Timeout-Zähler 
zurückzusetzen. Und da musst Du prüfen, ob der 'Gleichstrom-Mode' aktiv 
ist (dann hat die H-Brücke nämlich einen Zustand, von dem die 
DCC-Steuerung nichts weiß!) und, falls aktiv, die H-Brücke ausschalten 
und den Gleichstrom-Mode deaktivieren. War die Flanke DCC-bedingt, dann 
findet DCC eine stehende Lok vor und kann korrekt arbeiten. War die 
Flanke aber nur ein Gleichstrom-Richtungswechsel, dann schafft es der 
Timeout erneut, den Gleichstromm-Mode zu aktivieren, also das 
Gleichstrom-Flag (das Du in dem nicht vollen Flagregister anlegen musst) 
zu setzen und die pegelabhängige Fahrtrichtung zu setzen.

Der Timeout muss von einem anderen 'Ereignis' heruntergezählt werden, 
das auch dann eintritt, wenn (aufgrund von Gleichstrom) keine 
Pegelwechsel mehr stattfinden, also von einem Timer (bzw. dessen 
zyklischen Interrupt), der auch dann läuft, wenn kein DCC-Signal mehr 
empfangen wird.

Wenn der Timeout-Zähler abläuft (0 erreicht oder Unterlauf, was 
vermutlich in der Timer-ISR erfolgt), dann muss Deine Routine zum Setzen 
einer Fahrtrichtung aufgerufen werden und das 'Gleichstrom-Flag' in 
'flagreg' gesetzt werden, damit beim nächsten Pegelwechsel die H-Brücke 
abgeschaltet wird um Kollisionen mit der DCC-Steuerung zu verhindern.


> Heute Abend versuche ich das mal. Jetzt habe ich 2 Loks fertig
> umgerüstet
> (BR80 von Piko und V60 von Gützold). Die laufen beide prima mit
> Eigenbaubooster und der Software "DDW-Server" und "Rayliplan" sowie
> "Rayliprog".Motivation ist bei mir: Kein Geld, um fertige Komponenten zu
> kaufen, dafür aber Zeit und eine einigermaßen gute
> Ausrüstung, um selbst zu bauen. Außerdem ist es auch ein Training für
> den Graukopf, sich vorsichtig an ASM heranzupirschen.

Es ist ja auch ein schönes Hobby... Nur stehen die Modellbahner, denen 
ich gelegentlich etwas helfe, nicht auf Digital. Auch müssten die 
Lokdecoder und Booster sehr starke Endstufen haben. Einige Fotos dieser 
Modellbahner und ihrer Fahrzeuge findest Du auf 
http://www.gartenbahn.de.md

> Wahrscheinlich
> ginge es mit Bascom einfacher, aber ich müßte den ganzen Algorithmus
> "umstricken".

Vermutlich nicht, BASCOM macht zuviele unnötige Dinge in den 
Interrupt-Routinen und verschwendet dadurch die (beim Tiny15) eh schon 
knappe Rechenzeit.

> Ich habe nur mal probeweise mit einem Attiny2313
> eine Routine nur zum Auswerten des DCC-Signals auf 0 oder 1 gemacht, da
> war er voll und es ging nichts Anderes mehr rein. ;-)

Ja richtig, es wird auch viel Code erzeugt, den niemand wirklich 
braucht.

>
> MfG Paul

Gruß, Hannes

von Paul Baumann (Gast)


Lesenswert?

Das sind ja schöne Bilder auf der Seite. Naja, bei Gartenbahnfahrzeugen 
und deren Motoren käme ich mit meinem Booster wahrscheinlich nicht weit, 
wenn mehrere fahren sollten. Das Ding gibt etwas mehr als 4 Ampere her 
und
ist kurzschlußfest.

Ich habe mal versucht, Deine Tips in die Tat umzusetzen, aber einen 
derartigen Mumpitz erzeugt, daß jetzt weder das Eine noch das Andere
geht. Ich fange nochmal neu an, den ganzen "Fromm`s" auf einem Blatt 
Papier
auseinanderzuziehen, um zu sehen, woran es liegt.

Ein Problem beim Simulieren mit AVR-Studio: Ein Programm beginnt ja 
immer von "ganz oben" aus zu laufen. Wie erzwinge ich einen Start 
"mittendrin"
Hintergrund: Es ist ganz schwer, mittels Mausklicks ein DCC-Signal zu 
erzeugen und an PB2 "einzuspeisen" ;-)

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote:
> Das sind ja schöne Bilder auf der Seite.

Da hat meine einfache Digitalknipse (Fixfocus) von Kodak auch ganz schön 
arbeiten müssen.

> Naja, bei Gartenbahnfahrzeugen
> und deren Motoren käme ich mit meinem Booster wahrscheinlich nicht weit,
> wenn mehrere fahren sollten. Das Ding gibt etwas mehr als 4 Ampere her
> und
> ist kurzschlußfest.
>
> Ich habe mal versucht, Deine Tips in die Tat umzusetzen, aber einen
> derartigen Mumpitz erzeugt, daß jetzt weder das Eine noch das Andere
> geht.

Naja, das Projekt ist auch etwas komplex für den Einstieg...

> Ich fange nochmal neu an, den ganzen "Fromm`s" auf einem Blatt
> Papier
> auseinanderzuziehen, um zu sehen, woran es liegt.
>
> Ein Problem beim Simulieren mit AVR-Studio: Ein Programm beginnt ja
> immer von "ganz oben" aus zu laufen. Wie erzwinge ich einen Start
> "mittendrin"

Nur durch einen RJMP, den Du am Anfang (nach der Initialisierung) 
einfügst. Aber das brauchst Du nicht...

> Hintergrund: Es ist ganz schwer, mittels Mausklicks ein DCC-Signal zu
> erzeugen und an PB2 "einzuspeisen" ;-)

Und genau dagegen ist auch ein Kraut gewachsen: Stimuli-Dateien...
Du schreibst Dir mit einem Texteditor eine Textdatei (Liste), in der in 
jeder Zeile zwei Einträge sind, dazwischen ein Doppelpunkt. Der erste 
Eintrag ist die Nummer des Taktes, bei dem 'zugeschlagen' werden soll. 
Diese Zahl wird dezimal angegeben und darf maximal 9-stellig sein. Die 
Zahl hinter dem Doppelpunkt ist hexadezimal (aber ohne Präfix) zu 
notieren und gibt das Bitmuster an, das am Eingang (PINB) zu diesem Takt 
eingestellt wird. Diese Datei (mit der Endung '.sti') legst Du im 
Temp-Ordner Deines Rechners ab. Dann rufst Du bei aktivem Simulator 
Debug, Simulator-Optionen auf, wählst Logging und Stimuli, dann Stimuli 
an PortB und wählst die Datei aus. Und schon wird beim Simulieren beim 
jeweils angegebenen Takt das entsprechende Bit verändert. Mit einem 
Breakpunkt in der ISR des Int0 (F9-Taste) hältst Du das (mit F5 'Run' 
gestartete) Programm an und kannst dann mit F11 'Eintelschritt' weiter 
steppen. Somit kannst Du auch im Simulator ein exaktes Impulsmuster am 
Eingang abarbeiten. Einzelheiten (in Neudeutsch) findest Du unter 
Help/AVR-Studio, Suche nach 'stimuli'.


>
> MfG Paul

Viel Erfolg...

...

von Paul Baumann (Gast)


Lesenswert?

@Hannes
Das habe ich eben mal getestet. Geht wunderbar! Das wird mir helfen, 
meinen
Unsinn zu durchschauen und zu sehen, wieso er in Routinen springt, die 
ich ihm gar nicht "gesagt" habe. ;-) (Ich weiß, daß das Problem VOR dem 
Rechner sitzt) :-)
Jetzt muß ich erst mal meine alte Tastatur wieder dran machen, weil die 
hier nur bis F10 geht. Aber nun habe ich mir erst mal ein Bier verdient 
und Du auch! Leider kann ich Dir keins im Anhang schicken; meine 
Firewall läßt das nicht durch. :-)

Schönen Abend noch
Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote:
> @Hannes
> Das habe ich eben mal getestet. Geht wunderbar!

Leider habe ich Unsinn geschrieben, was die Menüpunkte betrifft, aber Du 
bist ja pfiffig und findest das auch so... ;-)

> Das wird mir helfen,
> meinen
> Unsinn zu durchschauen und zu sehen, wieso er in Routinen springt,

Ich habe Stimuli auch erst vor ein paar Tagen das erste mal eingesetzt. 
Es waren aber RC-Impulse (Funkfernsteuerung) für einen Gartenbahn 
Fahrtregler.

> die
> ich ihm gar nicht "gesagt" habe. ;-) (Ich weiß, daß das Problem VOR dem
> Rechner sitzt) :-)

Das Problem, ist eigentlich die ungewohnte Benutzeroberfläche. Ich 
konnte mich deshalb mit BASCOM nicht anfreunden obwohl ich BASIC kann 
(PC, C16).

> Jetzt muß ich erst mal meine alte Tastatur wieder dran machen, weil die
> hier nur bis F10 geht.

Besser iss datt, Einzelschritt ist F11.....

> Aber nun habe ich mir erst mal ein Bier verdient
> und Du auch!

Naja, datt muss nicht sein. Ich habe 10 Jahre lang Hopfengerüste gebaut, 
da ist mir nicht mehr nach Bier... ;-)

> Leider kann ich Dir keins im Anhang schicken; meine
> Firewall läßt das nicht durch. :-)

Besser iss datt...

>
> Schönen Abend noch
> Paul

Ich habe nochmal kurz ins Programm reingeschaut und festgestellt, dass 
beide Timer ein- und ausgeschaltet werden. Sie sind also nicht oder nur 
bedingt für Timeout geeignet. Es sind auch nur noch 24 Bytes (12 
Befehle) frei. Es wird also eng.

Mir ist auch aufgefallen, dass der Oszillator gar nicht calibriert wird. 
Er rattert also nicht mit 1,6 MHz, sondern dümpelt je nach Exemplar mit 
800 bis 1200 kHz vor sich hin.

Schönen Abend noch und prost...

...

P.S.: In welchem Landstrich bist Du eigentlich zu Hause?

von Paul Baumann (Gast)


Lesenswert?

Guten Morgen Hannes,
ich habe die Sache mit den Stimuli auch so herausgekriegt. (Eine 
Suchmaschine hat mir geholfen) GRINS.

Die Benutzeroberfläche von BASCOM ist mir auch lieber als dieses Studio, 
aber das ist sicher ein Gewöhnungseffekt.

Zitat: >Naja, datt muss nicht sein. Ich habe 10 Jahre lang Hopfengerüste 
gebaut, da ist mir nicht mehr nach Bier... ;-)

Na, dann ist ja bei Dir Hopfen und Malz verloren. ;-)
Ich halte es da mit "Werner": Hau wech, die Sch...ße!

Ja, Programmspeicher ist da nicht mehr üppig, ich würge noch daran 
herum.
Aber der Oszillator ist kalibriert, denke ich. Weiter unten im EEPROM 
-Bereich hat er das Kalibrationsbyte abgelegt und man kann es später in
Form eines CV-Wertes ändern, wenn der Ablauf nicht stimmt. Das aüßert 
sich in verschieden großen Geschwindigkeiten bei Vor/Rück oder gar nicht 
erst anfahren in eine Richtung.

Schönen Gruß aus einer Stadt nordwestlich von Erfurt

Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote:
> Guten Morgen Hannes,
> ich habe die Sache mit den Stimuli auch so herausgekriegt. (Eine
> Suchmaschine hat mir geholfen) GRINS.
>
> Die Benutzeroberfläche von BASCOM ist mir auch lieber als dieses Studio,
> aber das ist sicher ein Gewöhnungseffekt.
>
> Zitat: >Naja, datt muss nicht sein. Ich habe 10 Jahre lang Hopfengerüste
> gebaut, da ist mir nicht mehr nach Bier... ;-)
>
> Na, dann ist ja bei Dir Hopfen und Malz verloren. ;-)

Das ist wohl wahr...

> Ich halte es da mit "Werner": Hau wech, die Sch...ße!
>
> Ja, Programmspeicher ist da nicht mehr üppig, ich würge noch daran
> herum.
> Aber der Oszillator ist kalibriert, denke ich.

Stimmt (habe jetzt nachgesehen), da war ich wohl doch zu voreilig.

> Weiter unten im EEPROM
> -Bereich hat er das Kalibrationsbyte abgelegt und man kann es später in
> Form eines CV-Wertes ändern, wenn der Ablauf nicht stimmt. Das aüßert
> sich in verschieden großen Geschwindigkeiten bei Vor/Rück oder gar nicht
> erst anfahren in eine Richtung.

Nunja, ich kenne das nicht mit "ausprobieren", sondern mit Auslesen aus 
dem Signature-Space und Ablegen in der letzten Flash- oder EEP-Zelle, 
also da, wo auch neue AVRs eine Kolie ihres exemplarabhängigen 
Calibrationsbytes haben. Lies mal einen werksneuen Tiny15 aus (Flash und 
EEP), dann weißt Du was ich meine. Ich kam nicht auf die Idee, dass man 
das über eine CV macht... ;-(

>
> Schönen Gruß aus einer Stadt nordwestlich von Erfurt

Na dann wird's wohl nix mit'm Käffchen...
Bin bei Magdeburg "vom Dorfe".

>
> Paul

Gruß,
Hannes

von Willi (Gast)


Lesenswert?

Hallo Paul,

das mit dem Gleichspannungsbetrieb hab ich auch schon im Hinterkopf. Bis 
jetzt ist das immer dem Platz im Tiny15 Programmspeicher zum Opfer 
gefallen. Nächstes Problem, wenn Du es über den Atmel löst, brauchst Du 
mind. 7-8 Volt (1,4V Gleichrichter, 5V Atmel, Rest für den Stabi) auf 
dem Gleis bevor Du die H-Brücke ansteuern kannst. Anfahren könnte man 
über PWM lösen, aber anhalten ist dann schon sehr abrupt.
Da bleibt dann nur wieder die H-Brücke über zusätzliche Widerstände vom 
Gleis immer voll durchzuschalten oder mit einem AD Wandler bei 
Analogbetrieb die Höhe der Gleisspannung zu überwachen.
Ob DCC Befehle eintreffen, kannst Du übrigens auch schon bei Maddax 
seinem Code einfach mit Hilfe des Timer 0 auswerten. Ich hab mal ein 
Beispiel angehängt:

;************************************
;*    Timer_0_interrupt    *
;************************************
; wird ca 78us nach ext_int ausgelöst und liest dann bit von int0/d2 ein
; danach max 10000us auf neuen ext_int warten
; dazu teiler auf 1024 und zähler auf 255-79=176

TIM0_OVF:
    in    intsreg,sreg    ;sreg sichern
    clr    inttemp      ;timer anhalten
    out    tccr0,inttemp
    in    inttemp,pind    ;port einlesen
    sbrs        flag,messen      ;wenn messen aktiv springen
    rjmp        warten_aktiv    ;sonst gehe zu
    com    inttemp      ;port umdrehen
    bst    inttemp,2      ;bit d2 holen
    bld    flag,bit      ;und in flag bit0 sichern
    sbr    flag,(1<<neuesbit)  ;neues bit da setzen
    cbr    flag,(1<<messen)        ;flag für messen aus
    ldi    inttemp,176      ;Zähler auf 176
    out    tcnt0,inttemp
    ldi    inttemp,0b00000101  ;timer mit Teiler auf ck/1024 starten
    out    tccr0,inttemp
    out    sreg,intsreg
    reti
warten_aktiv:    ;ca 10000us kein bit mehr eingetroffen

    sbr    flag,(1<<keinDCC)  ;bit für keine befehle setzen
    out    sreg,intsreg
    reti


Gruß Willi

von Paul Baumann (Gast)


Lesenswert?

@Hannes
Schade, da sind wir zu weit voneinander weg, um mal zusammen Kaffee zu 
trinken. Das ist bei den Spritpreisen nicht mehr machbar. :-(

Für das "Anfertigen" von Stimulidateien habe ich hier:
http://www.hot.ee/nppcsoftware/
ein schönes Ding gefunden. Das Kalibrationsbyte habe ich mal bei neuen 
Tiny15 mit Ponyprog ausgelesen. Bis jetzt brauchte ich das nicht, weil 
ich sonst immer Quarze an die anderen AVR´s drangemacht habe. Deine Idee 
ist gut, das Kalibrationsbyte automatisch zu lesen und dann dahin zu 
kopieren.
Aber das Stück Programm dafür braucht auch wieder Platz und es ist schon 
alles so enge.

@Willi
Da hast Du Recht mit Deinen Überlegungen zur Spannung. Ich habe das 
eigentlich nur als "Notlösung" gedacht, wenn man mal bei jemandem 
Anderen
auf der Gleichstromanlage zu Gast ist. Ich werde mal Deinen 
Programmvorschlag auf Port B ändern und mal sehen, ob ich das Ganze noch
"hineinquetschen" kann. Wenn ich das richtig verstehe, müßte ich dann, 
wenn
das Flag-Bit "Keine Befehle" auf 1 steht das ganze Flagregister mit andi
verknüpfen um das Bit "keine Befehle" herauszufiltern und dann in mein
Programm hineinzuhüpfen? Da bleibe ich dann drin bis zum Erbrechen, weil
ja ohnehin kein DCC-Signal kommen kann.

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote:
> Wenn ich das richtig verstehe, müßte ich dann,
> wenn
> das Flag-Bit "Keine Befehle" auf 1 steht das ganze Flagregister mit andi
> verknüpfen

Nein, damit änderst Du ja den Inhalt.

> um das Bit "keine Befehle" herauszufiltern

Dafür gibt es die Skip-Befehle. Das sind SBRS und SBRC (gibt's auch für 
I/O), die überspringen den folgenden RJMP, wenn das Bit gesetzt/gelöscht 
ist.

> und dann in mein
> Programm hineinzuhüpfen? Da bleibe ich dann drin bis zum Erbrechen,

Da bleibst Du drin, bis zum nächsten Pegelwechsel am Eingang, denn sonst 
würde eine Wechselspannung (verstümmeltes DCC?) Deinen Motor grillen 
wollen.

> weil
> ja ohnehin kein DCC-Signal kommen kann.

Das klappert aber schon einige male hinundher, ehe es als DCC decodiert 
ist, oder?

>
> MfG Paul

Bitte nur als Denkanstöße werten. Ein "Dummer Hinweis" meiner Sorte kann 
möglicherweise Alternativen zeigen...

...

von Paul Baumann (Gast)


Lesenswert?

@Hannes
Oh weh, daß ich damit den Inhalt ändere, habe ich gerade gemerkt. SBIS
macht schon vernünftigere Sachen. Es klappert immerzu hin und her, WENN 
ein
DCC-Signal anliegt aber bei Gleichspannung läuft der Timer 0 nur einmal 
durch, dann merkt er, daß der Pegel gleich geblieben ist und springt in
"Warten aktiv". Da heraus muß ich jetzt in meine 
"Gleichspannungsroutine"
hüpfen.
Ich arbeite an mir und dem Programm. :-)


>Zitat:Bitte nur als Denkanstöße werten. Ein "Dummer Hinweis" meiner Sorte kann 
möglicherweise Alternativen zeigen...

Deine Hinweise fand ich gut, nicht nur hier. Das ist kein "Honig um´s 
Maul
schmieren" , das meine ich so.

ldi Mund, Zigarette
rjmp Balkon

:-)

Paul

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.