Forum: Mikrocontroller und Digitale Elektronik Schrittmotor mit ULN2803 und 8052 uC


von Andre T. (andret)


Lesenswert?

Hallo Gemeinde,

ich habe hier ein Projekt und finde im Moment leider im Netz noch hier 
eine Antwort auf meine Fragen, evtl suche ich aber auch falsch, oder die 
verwendeten Teile sind einfach schon zu alt.

Ich habe vor mir eine fertige Platine, welche 2 Steppermotoren über 2 
ULN2803 Darlington ansteuert, von daher kann ich die Gegebenheiten nicht 
ändern. Die Stepper sind unipolar, 5 Adrig und wie gesagt alles schon 
fix und fertig auf einer "kommerziellen" Platine. Die Frequenz des Quarz 
ist 16.000.

Es fehlt ein 40Pin 8051/8052 Prozessor, welches dem ganzen Leben 
einhaucht.
Den will ich nun programmieren.

Ich habe ein kleines Testprogramm geschrieben welches mal einen der 
Motoren antreibt. über einen 10-fach DIPschalter, der gerade zum testen 
eingebaut wurde kann man im Moment die Geschwindigkeit umschalten.

Der Motor dreht, Voll- und Halbschritt, CW und CCW - kein Problem.

Wenn der Motor "schnell" und "mittelschnell" dreht, ist eigentlich alles 
ok, nur wenn ich die Geschwindigkeit drossel das er ca. 3u/min macht, 
ruckelt der Motor. Also er dreht schon noch, aber halt Schritt für 
Schritt für Schritt. Da der Motor eine Spiegelscheibe für eine 
Lichtprojektion antreibt, sieht man leider das "ruckeln".

Ich weiß das man von halbschritt noch in Viertelschritten oder 
Achtelschritt antreiben kann, mit einem KontrollerIC, also choppen, aber 
geht denn das in der Konstellation mit einem 8052er uC + ULN2803, der 
hat kein PWM, und ich kann leider an der Platine nix ändern.

Würde das funktionieren, wenn man die Frequenz rausfindet, und dann 
quasi den Port an/aus macht, so das man doch Viertelschritt machen kann 
? Ist das überhaupt mit dem Darlington machbar ?

Was ich auch nicht verstehe, es sind immer 2 Input Ports am Darlington 
parallel verbunden, dafür reichen meine Kenntnisse nicht, wozu das , 
mehr Leistung ?

Leider habe ich auch noch nie die Platine mit der original Cpu in Aktion 
gesehen, sonst könnte ich wenigstens sehen, wie langsam es beim Original 
überhaupt geht.

Mein Ziel ist es wenn möglich , so langsam wie möglich, so ruckelfrei 
wie möglich zu fahren ohne Änderung der Hardware nur reine Software.

Bin für jeden Hinweis dankbar.

Gruß Andre

von Ansgar Z. (osram)


Lesenswert?

Hi,
Schrittmotoren sind halt Schrittmotoren. Also Schritt => Ruckeln.
Mit deiner Hardware kenne ich mich nicht aus aber der Weg die 
Schrittanzahl zu erhöhen beziehungsweise den Schrittwinkel zu verringern 
klingt erstmal nach "The Way to go".
Ich könnte mir noch ein Mechanisches Dämpfungsystem vorstellen um das 
Bewegungsverhalten zu glätten.

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?

Da mußt Du halt die PWM in Software selbst machen. Da Du es lansam 
willst, sollte das auf dem 8051 kein Problem sein.
Stichwort: Timer-Interrupt.

> es sind immer 2 Input Ports am Darlington parallel verbunden

Alter Trick wenn die 500mA/Kanal des 2803 nicht reichen. Einfache 
Lösung, aber nicht unbedingt gut.

von MaWin (Gast)


Lesenswert?

Andre Thomas schrieb:
> Was ich auch nicht verstehe, es sind immer 2 Input Ports am Darlington
> parallel verbunden, dafür reichen meine Kenntnisse nicht, wozu das ,
> mehr Leistung ?

Ja.

Andre Thomas schrieb:
> Würde das funktionieren, wenn man die Frequenz rausfindet, und dann
> quasi den Port an/aus macht, so das man doch Viertelschritt machen kann
> ? Ist das überhaupt mit dem Darlington machbar ?

Nein.

Auch Mikroschritt führt nicht zu vollkommen rundem Lauf (dagegen geht 
das Rastmoment des Schrittmotors, nur variable reluctance Motoren ohne 
Rastmoment laufen bei Mikroschritt sauber, aber du hast Hybridmotore mit 
Permanentmagnet).

Es ist halt der falsche Antrieb.

von m.n. (Gast)


Lesenswert?

Andre Thomas schrieb:
> geht denn das in der Konstellation mit einem 8052er uC + ULN2803,

Nein, das geht nicht direkt. Ein 8051 kann den ULN28xx nicht ansteuern. 
Seine '1'-Pegel sind zu 'weak'.
Entweder nimmst Du zusätzlich Pullup-Widerstände mit der Konsequenz, daß 
beim Einschalten alle Ausgänge aktiv sind, schaltest einen Puffer 
dazwischen oder nimmst einfach einen pinkompatiblen AVR.

von Andre T. (andret)


Lesenswert?

m.n. schrieb:
> Entweder nimmst Du zusätzlich Pullup-Widerstände mit der Konsequenz, daß
> beim Einschalten alle Ausgänge aktiv sind

Die Pullups gibt es, da ist eine Widerstandsleiste an den Leitungen zw 
uC und Darlington. Ich denke das es im Original auch so war.

Ich brauche im Übrigen keinen perfekten runden Lauf, also wenn man es 
mit 3 uMin schafft, im 16tel Schritt, wäre das Ergebnis gabsolut 
akzeptabel. Nur wenn es so ruckelt wie jetzt im Halbschritt ist es noch 
zu unsauber.

Das heisst ich könnte mit den Pullups einen Microschritt (8tel/16tel) 
doch realisieren ?

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo MaWin,

> Auch Mikroschritt führt nicht zu vollkommen rundem Lauf (dagegen geht
> das Rastmoment des Schrittmotors, nur variable reluctance Motoren ohne
> Rastmoment laufen bei Mikroschritt sauber, aber du hast Hybridmotore mit
> Permanentmagnet).
>
> Es ist halt der falsche Antrieb.

Da stimme ich dir nur bedingt zu. Wenn die Motoren bipolar wären oder 
wenigstens 6 Adern hätten, könnte man sehr wohl mit einer vernünftigen 
Ansteuerung einen sehr viel ruhigeren Lauf erzielen. So wird das aber 
nichts.

Aber da der OP die Elektronik ohnehin nicht ändern will, bleiben nur 
mechanische Maßnahmen. Also Motor nicht ohne Last betreiben, Lastmasse 
möglichst schwingungsarm ankoppeln, ggf. zusätzliche Dämper verwenden. 
Und unbedingt Halbschritt statt Vollschritt verwenden. Falls möglich, 
problematische Drehzahlbereiche vollständig vermeiden oder schnell 
durchfahren.

Mit freundlichen Grüßen
Thorsten Ostermann

von Andre T. (andret)


Lesenswert?

Thorsten Ostermann schrieb:
> Aber da der OP die Elektronik ohnehin nicht ändern will, bleiben nur
> mechanische Maßnahmen

Ja, leider. Also "kann" und "will". Die Schaltung muss so bleiben wie 
sie ist, das ist leider Teil des Projekts. Der Chip muss quasi vom einen 
ins andere Gerät ohne Platinenumbau bzw Änderungen am original-Layout.

Leider kenne ich wie schon erwähnt nicht das Original, es kann sein, 
dass der Hersteller sich gar nicht auf sowas wie langsames drehen 
eingelassen hat und wie Thorsten Ostermann sagt, den problematischen 
Bereich gar nicht zulässt.

Ich für meinen Teil, muss eben das Projekt so gut wie möglich ausführen. 
Ich habe alle Funktionen des Originals nachgebildet, plus noch ein paar 
Goodies mehr, wenn ich nun noch langsames Drehen ohne allzu starkes 
Ruckeln ( 16er statt 1/2 Auflösung ) hinbekomme, dann ists perfekt.

Nochmal zurück:

m.n. schrieb:
> Nein, das geht nicht direkt. Ein 8051 kann den ULN28xx nicht ansteuern.
> Seine '1'-Pegel sind zu 'weak'.
> Entweder nimmst Du zusätzlich Pullup-Widerstände

Das wäre vorhanden! das heisst hier kann ich den "Softwarehebel" 
ansetzen mit einer Erfolgsaussicht ?

m.n. schrieb:
> daß
> beim Einschalten alle Ausgänge aktiv sind,

Das ist ok, ich schalte die beim init wieder aus, würde ja nur den Motor 
kurz "blockieren" wenn alle an sind - dann ausschalten und in 
"Nullstellung" bringen kommt dann eh.

m.n. schrieb:
> schaltest einen Puffer
> dazwischen oder nimmst einfach einen pinkompatiblen AVR.

Puffer , nein. Wäre eine Änderung im Layout der Platine.

Pinkompatibler AVR, ok , aber ist das nicht auch "nur" ein 8051 Klon, 
mit den gleichen Features, oder hat kann der PWM auf 8 Pin? Sorry, da 
reicht wiedereinmal meine Erfahrung nicht aus.

Ich bekomme heute abend den abgerauchten originalchip, mal sehen was es 
ist. Laut Aussage ist es ein Atmel AT89C51, also ein 8051 uC.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo Andre,

> Ich für meinen Teil, muss eben das Projekt so gut wie möglich ausführen.
> Ich habe alle Funktionen des Originals nachgebildet, plus noch ein paar
> Goodies mehr, wenn ich nun noch langsames Drehen ohne allzu starkes
> Ruckeln ( 16er statt 1/2 Auflösung ) hinbekomme, dann ists perfekt.

Mikroschritt ohne Stromregelung wird nicht gehen. Ich habe das zumindest 
noch nie gesehen. Dafür müsste ja auch die Versorgungsspannung deutlich 
höher sein als die Motornennspannung, und dann wären wir wieder bei den 
nicht gewünschten Änderungen an der Schaltung.

Mit freundlichen Grüßen
Thorsten Ostermann

von Andre T. (andret)


Lesenswert?

Thorsten Ostermann schrieb:
> Dafür müsste ja auch die Versorgungsspannung deutlich
> höher sein als die Motornennspannung,

Tja, ich vermute auch, da die ganze Platine mit 5V versorgt wird, wird 
das nix. Die Motoren haben eine Nennspannung von 5V. Mehr kann ich 
leider auch nicht dazu sagen. Es gibt zwar noch Lampenbauteile mit 24V 
auf der Platine, aber da führt nix in die Stromkreise der Steuerung, 
ausser ein Schaltkreis mit nem Triac zum an/ausmachen der Hauptlampe 
über den 8051.

von m.n. (Gast)


Lesenswert?

Andre Thomas schrieb:
> Pinkompatibler AVR, ok , aber ist das nicht auch "nur" ein 8051 Klon,
> mit den gleichen Features, oder hat kann der PWM auf 8 Pin? Sorry, da
> reicht wiedereinmal meine Erfahrung nicht aus.

Ein erster AVR war der AT90S8515, der Atmel einen leichteren Einstieg 
als 8051-Ersatz ermöglichte - bei mir zumindest ;-).
Der pinkompatible Nachfoger ist der ATmega8515, der mit 16 MHz laufen 
kann und mindestens 10 x schneller ist als ein original 8051. Mit der 
höheren Leistung könnte man PWM per Software realisieren.
Ein größerer Typ wäre der ATmega162, der mehr RAM, Flash, Timer +++ hat.

von Andre T. (andret)


Lesenswert?

Habe gestern die abgebrannte original CPU bekommen... Es ist ein Atmel 
89c51 - somit ist die Idee das es an der "neuen" schwächeren 89C52 CPU 
liegen könnte auch dahin.

Sollte jemand doch noch einen Tipp haben, wie man mit der Kombination 
8052 / ULN2803 / Unipolarer 5-adriger Stepper und Pullup widerständen 
auf den Ports mehr wie Halbschritte hinbekommt, bitte hier posten.

Grüße Andre

von michael_ (Gast)


Lesenswert?

Wie sehr abgebrannt ist die?
Vielleicht kann man das Programm doch auslesen.

von Andre T. (andret)


Lesenswert?

Also so abgebrannt, das in meinem Testboard immer andere LED´s an sind, 
bei jedem boot und die in der Platine gar nichts mehr macht. Vom 
Auslesen von CPU´s habe ich mal gar keine Ahnung.

von m.n. (Gast)


Lesenswert?

Andre Thomas schrieb:
> Sollte jemand doch noch einen Tipp haben, wie man mit der Kombination
> 8052 / ULN2803 / Unipolarer 5-adriger Stepper und Pullup widerständen
> auf den Ports mehr wie Halbschritte hinbekommt, bitte hier posten.

Man könnte jeden Strang eines Motors per PWM steuern und damit bei 
langsamen Drehzahlen ein 'Überblenden' erreichen. Ein lineares 
'Überblenden' wird wohl nicht funktionieren. Daher müßte man die 
sinnvolle Abstufung experimentell ermitteln.
Voraussetzung dafür wären, einen AVR zu nehmen und die PWM-Routine am 
besten in Assembler auszuführen.
Alles machbar, aber auch für Dich?

von Lothar (Gast)


Lesenswert?

m.n. schrieb:
> Voraussetzung dafür wären, einen AVR zu nehmen und die PWM-Routine am
> besten in Assembler auszuführen.

Gibt doch 8051 DIP40 mit Hardware PWM:

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en549557

Es ginge aber doch auch, eine kleine Adapterplatine zu machen und einen 
ARM SOIC zu nehmen, da geht Hardware PWM auch ohne Assembler.

von m.n. (Gast)


Lesenswert?

Lothar schrieb:
> Gibt doch 8051 DIP40 mit Hardware PWM:
>
> http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en549557

AVRs haben auch PWM, aber nicht 8-fach und zudem nicht an den 
notwendigen Pins.

Lothar schrieb:
> Es ginge aber doch auch, eine kleine Adapterplatine zu machen und einen
> ARM SOIC zu nehmen, da geht Hardware PWM auch ohne Assembler.

Hast Du denn nicht gelesen, was die ganze Zeit immer wieder betont 
wurde: die Hardware soll nicht verändert werden! Wenn doch, könnte man 
vernünftige Mikroschritt-Treiber mit brauchbaren Motoren nehmen, koste 
es, was es wolle.

von Andre T. (andret)


Lesenswert?

Das Projekt sieht keine Änderung der Hardware vor. Die Platine ist auch 
tausendmal so hergestellt worden. Da ich den defekten iC vor mir habe 
und es ein 8051 ist, ist der jetzt verwendete 8052 schon besser. Jetzt 
gibt es 2 Möglichkeiten: die Hersteller waren hammerharte cracks, die es 
irgendwie mit der Hardware geschafft haben, dass sich der Motor 
ruckelfreier dreht, oder die haben es erst gar nicht versucht. Da der 
quartz sich nun auch noch als 8mhz herausstellt und nicht wie gedacht 
16, wird's langsam klar, dass das leider mit dem langsamen drehen nichts 
wird. Die Motoren sind dazu dann auch noch "billig". Ich weiß jetzt auch 
noch , dass das Gerät den Spitznamen "racer" hat, was mich noch mehr 
davon überzeugt , dass es wohl nicht geht. Leider habe ich auch keinen 
Vergleich mit einer funktionierenden Version, interessieren würde es 
mich aber schon.

Gruß Andre

von Lothar (Gast)


Lesenswert?

>> Es ginge aber doch auch, eine kleine Adapterplatine zu machen und einen
>> ARM SOIC zu nehmen, da geht Hardware PWM auch ohne Assembler.
>
> Hast Du denn nicht gelesen, was die ganze Zeit immer wieder betont
> wurde: die Hardware soll nicht verändert werden!

Ich meinte selbstverständlich eine Adapterplatine in den DIP40 Sockel. 
Es gibt auch ARM DIP aber nicht pinkompatibel zu 8051. ARM mit 8 
Hardware PWM gibt es auch.

von Andre T. (andret)


Lesenswert?

Ich bins wieder,
das Projekt hat super funktioniert, jedoch nur bis die DMX Adresse von 1 
auf 15 geändert wurde. Der Fehler liegt meiner Meinung nach am 
Programmierer ( also mir ), da ich kein Assembler aus dem FF behersche, 
ich bin eben nur in C soweit , das ich mir Programme schnitzen kann.

Ich habe den Fehler, dass wenn ich die Startadresse auf DMX-Kanal 15 
gehe, die Werte von Kanal 22 eingelesen werden. Und der 2. Kanal den ich 
noch brauche ist dann zw 23 und 24, klingt komisch, is aber so. Wenn 
beide Kanäle auf unterschiedliche Werte gestellt werden, nimmt er mal 
den , mal den ...

Ich habe jetzt schon eine switch Schleife drin, die quasi solange DMX 
Empfang da ist, alles andere abschaltet , so das der 8052 Zeit hätte. 
Erst wenn das letzte Byte empfangen wird, wird alles andere wieder 
abgerufen, bis das nächste Datenpaket kommt. Ich habe dann mal Hennes 
DMX Code genommen, damit wurde es aber noch schlimmer. Also Empfang war 
da , nur noch weiter hinten in den Kanälen.

Es scheint, als ob C, DMX und 8Mhz nicht zusammenpassen.

Ich benutze KEIL uVision 4, es ist ein STC 8052 mit 8Mhz. Kann ich noch 
irgendwas am Compiler einstellen, das es mehr optimiert wird ?

Ich habe testweise einen 16Mhz Quarz rein, damit gehts, aber die 
Hardware soll eigentlich so bleiben wie sie ist. Wenn nichts hilft muss 
es eben so sein.

Hier mal der Empfangscode
1
void serial0 (void) interrupt 4
2
{  
3
    static int rx_count;                   // signed!!!
4
    static bit dmx_valid;                         // Startbit 
5
    static bit dmx_break;                         // Break 
6
    static unsigned char temp ;
7
  
8
  
9
    temp = SBUF;  
10
    RI = 0;                                       // Interrupt Flag
11
    
12
    
13
  if (RB8 == 1){         
14
                               // Brauchbare Daten empfangen
15
        if (dmx_break == 1){
16
            if (dmx_valid == 0){                     // 1. Byte nach break
17
                if (temp == 0x00){          // Freigabe
18
          dmx_valid = 1;
19
        }  
20
                else {                // kein Startbit
21
          dmx_break = 0;
22
        }               
23
            }
24
            else{
25
                rx_count++;
26
                if (rx_count == CHANNELS){        // alle Kanäle empfangen?
27
                    dmx_break = 0; 
28
            step=0;                         // Pause
29
                }
30
                else if (rx_count >= 0){             // Startadresse erreicht?
31
                    dmx_data[rx_count] = temp;
32
                }
33
            }
34
        }
35
     }
36
    else{
37
        dmx_valid = 0;
38
        dmx_break = 1;
39
        rx_count = -addr;
40
    } 
41
  
42
43
  }


Bin für jeden Tipp dankbar. Gruß Andre

von Falk B. (falk)


Lesenswert?

@Andre Thomas (andret)

>Sollte jemand doch noch einen Tipp haben, wie man mit der Kombination
>8052 / ULN2803 / Unipolarer 5-adriger Stepper und Pullup widerständen
>auf den Ports mehr wie Halbschritte hinbekommt, bitte hier posten.

Wurde doch schon genannt, mit Soft-PWM. Ich weiß nicht, wieviel 
CPU-Power so ein 8051 von Atmel wirklich hat, der originale 8051 hat 
einen /12 geteilten Maschinentakt, das wäre eine Katastrophe. Ich tippe 
mal dass der von Atmel bei /2 oder schlimmstenfalls /4 arbeitet.

Einen DMX-Empfänger + 24 PWM Kanäle mit 100 Hz auf einem AVR gibt es 
hier.

Beitrag "Re: DMX Steuerung 24 Kanal"

Ob allerdings 100 Hz PWM für einen Schrittmotor reicht, glaube ich 
nicht, da braucht man eher 1-5 kHz. Muss man halt mal testen.

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Falk Brunner schrieb:
> Ich weiß nicht, wieviel
> CPU-Power so ein 8051 von Atmel wirklich hat, der originale 8051 hat
> einen /12 geteilten Maschinentakt, das wäre eine Katastrophe. Ich tippe
> mal dass der von Atmel bei /2 oder schlimmstenfalls /4 arbeitet.

Es ist so schlimm: 1/12 Quarzfrequenz!

von Falk B. (falk)


Lesenswert?

@ Route 66 (route_66)

>Es ist so schlimm: 1/12 Quarzfrequenz!

Damit läuft das Ding auf 666 kHz Maschinentakt. Damit DMX zu empfangen 
ist wahrscheinlich bestenfalls mit Assembler möglich, zumindest für die 
UART RX ISR. Und auch dann wird die CPU ordentlich ausgelastet sein. PWM 
per Software darf man da getrost vergessen.

Ergo. Man MUSS an der Hardware was ändern. Wenigstens eine andere CPU, 
besser ein Miniboard, wo auch gleich passende PWMs in Hardware mit 
rauskommen.

Frage: Wer baut und vor allem wer KAUFT im Jahr 2015 noch so eine CPU? 
Wenn es wenigstens ein moderner Single Cylce oder /2 Kern wäre, dann 
könnte man es noch verstehen.

von Andre T. (andret)


Lesenswert?

Es sind laut Datenblatt bei meiner verwendeten CPU /6 (8052)

@Falk:

Das ist eine Restauration, dabei ist wichtig, so nahe am Original zu 
bleiben. Es ist auch so, dass es mehrere geben wird, und wenn man nun 
anfängt alles umzubauen geht es in die falsche Richtung. Und es geht 
auch ein bisschen um den Ehrgeiz und Spass. Ich frage mich wie der 
Hersteller das geschafft hat, DMX bis Kanal 510 zuverlässig zu empfangen 
und dabei noch 2 Stepper zu drehen, und auch noch so, dass die 
Stepperposition dabei benutzt wird. Ich habe jetzt alles am laufen, nur 
eben mit dem Problem, das selbst wenn alles aus ist, DMX zuverlässig 
empfangen wird, aber mit diesem Kanal-versatz. Der wird nach hinten raus 
auch immer schlimmer, bei Adresse 100 ist man 30 Kanäle daneben. Also es 
wird empfangen und das auch immer gleich (schlecht). Mit dem 
ansteigenden Versatz.

Ich frage mich aber gerade ob denn nicht evtl der sn75176 oder der Quarz 
was hat. Denn wie gesagt, ich schalte alles ab, also während des 
Empfangs gibt es im Superloop nix zu tun ausser einer if-Abfrage , if 
pause==1 dann nix, bzw warte auf Interrupt 4, wenn alles in der ISR 
erledigt wurde ( alle Kanäle empfangen, wird serieller Interrupt 
abgeschalten und die Motoren bedient, sind die 1nen Schritt in die 
Richtung wo sie hinsollen, wird serieller Interrupt wieder freigegeben 
und es geht von vorne los. Jedoch halt - schlecht.

Wenn ich nun sagen kann, in Assembler gehts 50% schneller, dann wäre es 
ein Versuch wert, aber ich denke und da kann ich mich auch täuschen, das 
es max 10% sind. Das wird aber evtl nicht reichen.

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Andre Thomas schrieb:
> es ist ein STC 8052 mit 8Mhz.

Hallo!
Habe gerade erst gelesen, dass es kein Atmel sondern ein TI ist.
Der läuft standardmäßig mit 1/6 Quarz als Maschinentakt, kann aber auch 
auf 1/12 umgestellt werden für Kompatibilität.

(standardmäßig: hängt vom core ab)

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Andre Thomas (andret)

>Es sind laut Datenblatt bei meiner verwendeten CPU /6 (8052)

Das rettet dich nicht.

>Das ist eine Restauration,

Das erklärt einiges ;-)

> dabei ist wichtig, so nahe am Original zu
>bleiben.

Dann brauchst du auch keinen supersanften Rundlauf bei niedrigen 
Geschwindigkeiten. Denn das konnte das Original auch nicht.

> Es ist auch so, dass es mehrere geben wird, und wenn man nun
>anfängt alles umzubauen geht es in die falsche Richtung. Und es geht
>auch ein bisschen um den Ehrgeiz und Spass. Ich frage mich wie der
>Hersteller das geschafft hat, DMX bis Kanal 510 zuverlässig zu empfangen
>und dabei noch 2 Stepper zu drehen, und auch noch so, dass die
>Stepperposition dabei benutzt wird.

In Assembler. Und mit Tricks.

> Ich habe jetzt alles am laufen, nur
>eben mit dem Problem, das selbst wenn alles aus ist, DMX zuverlässig
>empfangen wird,

Das glaube ich mal spontan nicht. Du GLAUBST dass das so ist. Du musst 
es aber NACHWEISEN. Dazu kann man einen Pin nutzen und immer am Start 
der ISR einschalten und am Ende ausschalten. Schau dir das auf dem Oszi 
an. Es wird dir nicht gefallen. Ich vermute, deine CPU verschluckt 
Interrupts, weil sie überlastet ist. DMX ist kein Kindergeburtstag 
mehr, die ISR Rate von ~25kHz muss die CPU erstmal schlucken. Und das 
bei 1,2MHz Maschinentakt! Das sind läppische 48 Takte / Byte!

Hmmm. Jetzt wo ich drüber nachdenke. Wahrscheinlich läuft das OHNE 
Interrpts besser und performanter, wenn man das Ganze in einer Schleife 
per Polling betreibt und den Rest per Statemachine immer mal wieder 
bearbeitet. So wie bei Multitasking.

>Ich frage mich aber gerade ob denn nicht evtl der sn75176 oder der Quarz
>was hat.

Nimm ein Oszi und schau nach. Ich glaube es eher nicht.

> Denn wie gesagt, ich schalte alles ab, also während des
>Empfangs gibt es im Superloop nix zu tun ausser einer if-Abfrage , if
>pause==1 dann nix, bzw warte auf Interrupt 4, wenn alles in der ISR
>erledigt wurde ( alle Kanäle empfangen, wird serieller Interrupt
>abgeschalten und die Motoren bedient,

Ob das so ein gutes Konzept ist?

>Wenn ich nun sagen kann, in Assembler gehts 50% schneller,

Dann NIMM Assembler! Hier ist einer der wenigen Fälle, wo er WIRKLICH 
SINNVOLL und NOTWENDIG ist! Zumal das Programm nicht sonderlich komplex 
ist, das kriegt man in ASM ohne Mühe hin.

> dann wäre es
>ein Versuch wert, aber ich denke und da kann ich mich auch täuschen, das
>es max 10% sind. Das wird aber evtl nicht reichen.

Mach die Messung mit dem Oszi wie oben beschrieben. Teste deinen C Code 
systematisch, sprich, gib die DMX-Daten mit steigender Adresse auf einen 
8 Bit Port aus und schau, ob die Stabil abliegen oder wackeln. Wenn ja, 
ist den CPU überlastet.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Der ATMega8515/8535 ist bis auf den Reset Pin 100% pinkompatibel zum 
8052, man muss also den Reset Pin 9 hochbiegen, hat dann aber die RISC 
CPU mit 6MHz und deutlich mehr Luft nach oben, was die Rechenleistung 
anbelangt.
Ich habe das selber schon bei einem DMX LED Matrix Beamer gemacht, bei 
dem die Winbond 8051 abgeraucht war.

von Andre T. (andret)


Lesenswert?

Falk Brunner schrieb:
>>Es sind laut Datenblatt bei meiner verwendeten CPU /6 (8052)
>
> Das rettet dich nicht.

Mist ...

Falk Brunner schrieb:
> Denn das konnte das Original auch nicht.

Das weiß ich eben nicht, aber sagen wir mal 2 u/min waren sicher nicht 
drin. So langsam/schnell wie er jetzt dreht im Halbschritt ist ok.

Falk Brunner schrieb:
>> Ich habe jetzt alles am laufen, nur
>>eben mit dem Problem, das selbst wenn alles aus ist, DMX zuverlässig
>>empfangen wird,
>
> Das glaube ich mal spontan nicht. Du GLAUBST dass das so ist.

Das ist "verschrieben", ich wollte schreiben DMX UNzuverlässig ist... 
und ja ich denke auch das es sich irgendwo verschluckt... sonst wären ja 
die 2 aufeinander folgenden Kanäle nicht um 1 von einander entfernt, 
d.h. er bekommt das Signal nicht zuverlässig aufeinanderfolgend.

Falk Brunner schrieb:
> Dann NIMM Assembler! Hier ist einer der wenigen Fälle, wo er WIRKLICH
> SINNVOLL und NOTWENDIG ist! Zumal das Programm nicht sonderlich komplex
> ist, das kriegt man in ASM ohne Mühe hin.

Da meinte ich, dass ich es tatsächlich nicht weiß ob der 
Leistungszuwachs mit Assembler so groß ist, dass es geht.  Und es wäre 
schön wenn ich das so mühelos könnte, aber Assembler ist so fremd für 
mich. Ich weiß nicht ob ich besser als mein Compiler bin.

Falk Brunner schrieb:
> Ob das so ein gutes Konzept ist?

Mir ist diesmal nichts besseres eingefallen, es geht immer gleich 
schlecht, mit Interrupt, mit Timer fürs DMX, mit seriellem Interrupt und 
Timer für die Motoren, es ist immer das gleiche Ergebnis mit marginalen 
Verbesserungen. Ich dachte anfangs das der Superloop zu voll ist, bin 
von 40 Cycles ausgegangen, eine if(bit==1)-Schleife verbraucht keine 40, 
von daher dieser Ansatz. Bin natürlich für Vorschläge immer offen.

Ein Oszi steht mir leider noch nicht zur Verfügung, aber ich glaub da 
ich viel in der Richtung noch machen werde, wird früher oder später 
einer hier neben mir stehen. Jetzt aber leider noch nicht.

Gruß Andre

von Klaus (Gast)


Lesenswert?

Andre Thomas schrieb:
> Falk Brunner schrieb:
>>>Es sind laut Datenblatt bei meiner verwendeten CPU /6 (8052)
>>
>> Das rettet dich nicht.
>
> Mist ...

Gabs da nicht mal von Dallas den DS80C320, einen kompatiblen aber 
wesentlichen schnelleren 8052? Der konnte nicht nur einen höheren Takt, 
sondern teilte auch nicht so stark runter. Das müßte jetzt bei Maxim 
sein.

MfG Klaus

von Andre T. (andret)


Lesenswert?

UND LÄUFT JETZT WIE ES SOLL !!!!

Andre Thomas schrieb:
> Falk Brunner schrieb:
>>>Es sind laut Datenblatt bei meiner verwendeten CPU /6 (8052)
>>
>> Das rettet dich nicht.
>
> Mist ...


OHH DOCH !

Falk, das hat mich tatsächlich gerettet. Ich war nur so blöd im 
Programmer noch Kompatibilität 12T zu fahren - Einmal umgeschalten auf 
6T + PCON wieder auf 0 und schwupps , das Ding geht bis Kanal 510 jetzt 
... so wie es soll.

Oh Gott sei dank, mal wieder ums Assembler gekommmen.

Grüße Andre

von Route_66 H. (route_66)


Lesenswert?

Klaus schrieb:
> Gabs da nicht mal von Dallas den DS80C320, einen kompatiblen aber
> wesentlichen schnelleren 8052? Der konnte nicht nur einen höheren Takt,
> sondern teilte auch nicht so stark runter. Das müßte jetzt bei Maxim
> sein.

Der hat zwar Quarz/4 Arbeitstakt, aber keinen internen 
Programmspeicher!

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Andre Thomas schrieb:
> Falk, das hat mich tatsächlich gerettet. Ich war nur so blöd im
> Programmer noch Kompatibilität 12T zu fahren - Einmal umgeschalten auf
> 6T + PCON wieder auf 0 und schwupps , das Ding geht bis Kanal 510 jetzt
> ... so wie es soll.
>
> Oh Gott sei dank, mal wieder ums Assembler gekommmen.

Das hat mit Assembler nichts zu tun, Deine Baudrate war falsch, das ist 
alles.

Finds auch lustig, daß hier gedacht wird, bei popeligen 3U/min ginge 
einem 8051 gleich die Puste aus. Da muß man wirklich sehr wenig Ahnung 
vom 8051 haben. Der Befelssatz ist super optimiert, damals haben die 
Leute noch wirklich mitgedacht.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Peter Dannegger (peda)

>Finds auch lustig, daß hier gedacht wird, bei popeligen 3U/min ginge
>einem 8051 gleich die Puste aus.

Lesen und Verstehen. Die 3U/min sind NICHT das Problem, sondern das 
Ruckeln bei dieser niedrigen Geschwindigkeit, welches durch 
Halb/Vollschrittbetrieb entsteht. Einen Mikroschrittbetrieb rein in 
Software kriegt man da kaum hin, bestenfalls mit Tricks

> Da muß man wirklich sehr wenig Ahnung
>vom 8051 haben. Der Befelssatz ist super optimiert, damals haben die
>Leute noch wirklich mitgedacht.

Aber bei einem Takteiler von /12 oder /6 ist man nicht wirklich auf der 
Höhe der Zeit. Selbst der uralte 6811 machte nur /4

von Peter D. (peda)


Lesenswert?

Falk Brunner schrieb:
> Einen Mikroschrittbetrieb rein in
> Software kriegt man da kaum hin, bestenfalls mit Tricks

Unterschätze mal den 8051 nicht.

Andre Thomas schrieb:
> Ich bins wieder,
> das Projekt hat super funktioniert

Wird also in Software sein, vermutlich im Timerinterrupt.

Andre Thomas schrieb:
> Die Frequenz des Quarz
> ist 16.000.

Andre Thomas schrieb:
> es ist ein STC 8052 mit 8Mhz.

Wenn man den Quarz ändert, ist klar, daß sich auch die Baudrate ändert.
Daher muß man auf XTAL/6 setzen, damit es wieder stimmt.
Man hätte aber auch den Baudratengenerator auf den anderen Wert setzen 
können.

von Andre T. (andret)


Lesenswert?

Falk Brunner schrieb:
> Aber bei einem Takteiler von /12 oder /6 ist man nicht wirklich auf der
> Höhe der Zeit.

Das stimmt. Aber ich muss die damaligen Entwickler auch loben, die 
hatten mehr Tricks und Kniffe auf Lager wie ich.

Peter Dannegger schrieb:
> Das hat mit Assembler nichts zu tun, Deine Baudrate war falsch, das ist
> alles.

Nein, die Baudrate war immer richtig 250.000 für DMX, die Cpu hatte 
einfach nur keine Zeit noch viel anders zu tun, als zu empfangen.

Das hat sehr wohl mit Assembler zu tun, wenn ich nun nicht die 
Möglichkeit gehabt hätte, den Maschinenzyklus auf 6T hochzuschrauben, 
dank 2 Kernen (laut Hersteller-Datenblatt) sondern mit den originalen 
12T eines Atmel 89C51 (und natürlich PCON=0x80, um die Richtige Baudrate 
zu haben), dann wäre ich wohl zu Assembler übergegangen, und hätte 
mächtig tricksen müssen um das aus einem 89C51 rauszuholen, so wie es 
der Hersteller damals gemacht hat.

Glücklicherweise bin ich nochmal drumrumgekommen, da mich das 
Tage/Wochen gekostet hätte, da mir Assembler einfach nicht in Fleisch 
und Blut liegt.

Falk Brunner schrieb:
> Die 3U/min sind NICHT das Problem, sondern das
> Ruckeln bei dieser niedrigen Geschwindigkeit

Ganz genau so isses, das Ding dreh ich auch mit 1U/h, aber nicht sanft.

Leider gibt es keinerlei Unterlagen oder ein Vergleichsgerät um mal zu 
sehen wie langsam es vom Hersteller aus ging. Könnte sein, dass die das 
einfach nicht implementiert hatten, könnte sein, dass die aber sich auch 
gesagt haben, es geht nicht anderst, Kunde soll damit zufrieden sein.

Zu Beginn dieses Threats dachte ich noch das es mit SOFT-PWM oder rein 
mit Software besser geht als mit Halbschritt. Da die CPU aber mit 
seriellem Empfang schon gut ausgelastet ist, ist mir keine Möglichkeit 
bekannt wie man nun es doch hinbekommen kann, ohne zusätzlichen MotorIC. 
Es laufen ja auch noch andere Funktionen im Programm, die auch noch 
Rechenzeit brauchen, jetzt noch einen schnellen Interrupt dazu würde 
niemals gehen.

Grüße Andre

PS: Ich habe nun nochmal die Empfangsroutine von Henne genommen, die 
läuft bei hohen Adressierungen besser als meine andere. (Falls das hier 
mal jemand liest, der ähnliche Probleme hat.)

von Peter D. (peda)


Lesenswert?

Kannst ja mal den Code als Anhang reinstellen, da ist bestimmt noch 
Optimierungspotential.

Hast Du mal nen Link zum Datenblatt, ich finde keinen STC 8052.

von Peter D. (peda)


Lesenswert?

Bei 8MHZ / 12 bleibt wirklich kaum Zeit zwischen 2 UART-Bytes (~26 
Zyklen).

Man könnte aber auch die AT89LP51 Serie nehmen, die teilt XTAL/1.

http://www.digikey.de/product-detail/de/AT89LP51-20PU/AT89LP51-20PU-ND/2774081

Mit 20MHz Quarz sind dann 800 Zyklen Zeit.

: Bearbeitet durch User
von Andre T. (andret)


Lesenswert?

Peter Dannegger schrieb:
> Kannst ja mal den Code als Anhang reinstellen, da ist bestimmt noch
> Optimierungspotential.
>
> Hast Du mal nen Link zum Datenblatt, ich finde keinen STC 8052.

Hier mal der Link zum Datenblatt:

http://www.stcmicro.com/datasheet/STC89C51RC-RD-en.pdf

Und gerne poste ich den Quelltext, bin über jede Optimierung froh. Und 
bin gerne bereit was dazuzulernen. Super.

Hier isser im Anhang.

Gruß Andre

Huch das geht nicht im Anhang.

: Bearbeitet durch User
von Andre T. (andret)


Angehängte Dateien:

Lesenswert?

Hier der Quelltext in C im Anhang.

Bitte beachten, ich habe gerade gesehen, Zeile 292
1
m2_gobo_shaker(gobo,(2))  ;     //dmx_data[0]%10

sollte
1
m2_gobo_shaker(gobo,(1))  ;     //dmx_data[0]%10

heissen, bin da noch am debuggen gewesen.

Dafür entschuldige ich mich. Und, ja die doppelte Klammer ist unnütz, 
zeigt mir aber das da was noch nicht ok ist.

: Bearbeitet durch User
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.