X As Byte , Y As Byte , Z As Byte
Pointer As Byte At &H82
byte geht halt nur von 0-255
für mehr dann halt word variablen
Hallo Vitis,
bis auf ein paar Kleinigkeiten läufts jetzt.
Doch bei Kanal 255 ist Schluß.
Gibt es eine Beschränkung die ich übersehen hab?
Günter
X As Byte , Y As Byte , Z As Byte
Pointer As Byte At &H82
byte geht halt nur von 0-255
für mehr dann halt word variablen
Vor den Erfolg haben die Götter den Schweiß gesetzt
Leider kann ich zu Eueren Bascom Codes keine Stellung nehmen, dazu kenn ich mich zu wenig damit aus - Bin ein "C" Jünger.
Prinzipiell braucht man nur so viele Bytes des DMX Frames puffern, wie das Gerät Kanäle verwalten kann.
Die USART Abfrage sollte im Interrupt laufen.
Wenn die Frame Synchronisation ( Codeverletzung ) stattgefunden hat, ist das FE ( Framing Error ) Bit gesetzt. Das nächste übertragene Byte müsste dann 0 sein ( ist im DMX Protokoll für Dimmer so festgelegt ).
Das darauf folgende Byte ist der Wert des ersten Kanals des DMX Frames.
Ein DMX Empfänger Programm könnte nun so aussehen.
1. Das USART Statusregister wird im Interrupt abgefragt.
Ist das FE Bit gesetzt, wird der Kanalzähler, sowie die Empfangskanal Hilfsvariable auf 0 gesetzt.
2. Im nächsten USART RX Interrupt wird überprüft, ob der Kanalzähler 0 ist und dann ob auch der übertragene Wert 0 ist ( Startbyte ).
Der Kanalzähler wird um 1 erhöht.
3. In den nächsten Interrupts wird der Kanalzähler jeweils um 1 erhöht und überprüft, ob der eingestellte erste zu verarbeitende Kanal schon erreicht ist.
Ist das der Fall, wird der Wert in einem Puffer abgelegt und eine Hilfsvariable ( Anzahl der zu verarbeitenden Kanäle ) hochgezählt.
Wurden alle zu verarbeitenden Kanäle eingelesen wird ein Flag gesetzt, das es neue Kanalinformationen gibt.
Dieses Flag wird im Hauptprogramm verarbeitet und zurückgesetzt.
Alle noch folgenden Bytes bis zur nächsten Frame Synchronisation werden verworfen.
Somit läuft der komplette DMX Empfang im Interrupt und sollte auch als Bascom Programm noch mehr als schnell genug laufen.
Es müssen nur so viele Bytes gepuffert werden, wie die Schaltung tatsächlich verwalten muß.
Die komplette Werteverarbeitung kann im Hauptprogramm laufen, ohne den DMX Empfang wirklich zu stören.
Treibt man es auf die Spitze, braucht der Controller überhaupt kein Hauptprogramm ( außer einer Warteschleife ) mehr, weil auch die Phasenanschnittsteuerung in einem Interrupt laufen kann.
Ich Denke das ist eine relativ einfache Methode ein DMX Signal zu dekodieren.
Meine Idee zu Pins sparen ist eigentlich keine, aber -
Zu einem vernünftigen DMX Gerät gehört meiner Meinung nach ein Display.
Ein 1x16 Zeichen Dotmatrix Modul reicht schon und kostet nicht viel.
Dieses Modul braucht aber schon 7 Controllerpins, dazu kommen dann noch 3..4 Tasten. Also Insgesamt min. 10 Ports.
Ein Dip Fix Schalter verbrät aber auch schon 9 Ports und ist wesentlich unkonfortabler in der Anwendung.
Ausserdem kann man das Display super für Diagnosefunktionen verwenden, wenn z.B. ein Kanal parout nicht funktionieren will.
Eine weitere Möglichkeit um Ports zu sparen, wäre die A/D Wandler des Microcontrollers zu nutzen und den Dip Fix Schalter über gewichtete Widerstände in einen Spannungsteiler zu schalten.
Dazu bräuchte man, meiner Meinung nach, 2 A/D Wandler Ports - dann bräuchen die benutzten Widerstände auch nicht unbedingt eng toleriert zu sein.
Die Information, welche Dip Fix Schalter aktiviert sind, kann man so aus den jeweiligen A/D Wandlerwerten gewinnen.
man kann den pcf8574 über TWI dran hängen wenn man
vom ATMega Pins sparen möchte ... Das Display u.U.
über SPI ...
ansonsten hab ichs in meinem programm ähnlich gemacht
wie du es vorschlägst wkrug
Vor den Erfolg haben die Götter den Schweiß gesetzt
Hallo Vitis,
anbei mein Code, der geht bis 255. Bei 256 ist Schluß !?
GünterCode:$regfile = "m8def.dat" $crystal = 8000000 $baud = 250000 Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 On Timer2 Ontimer2 Tccr2 = &B00000010 Timsk.toie2 = 1 Config Portb.5 = Output Config Portb.4 = Output Portb.4 = 0 Kanal1 Alias Portb.4 Dim Tick As Byte Dim Range As Byte Range = 100 Dim X As Byte Dim Buffer(514)as Byte Dim Kanal As Word Dim Adresse As Word On Urxc Empfang Enable Urxc Enable Interrupts Adresse = 255 '255 geht noch 256 nicht mehr!!!!! Do Loop Empfang: X = Udr 'das muss erst abgeholt werden, sonst geht nix 'Die Interruptroutine verheizt 10,875µs bei 16MHz der vorhandenen Framezeit von 44µs If Ucsra.fe = 1 Then Kanal = 0 Ucsra.fe = 0 'damit verbleiben 33,125µs für die Mainloop pro Frame Else Incr Kanal Buffer(kanal) = X End If Return Ontimer2: Tick = Tick + 1 Timer2 = 50 If Tick >= Range Then Tick = 0 If Tick < Buffer(adresse) Then Kanal1 = 1 Else Kanal1 = 0 End If Return
hmmm ... schon mal stack frame usw. probiert zu erhöhen?
sollte eigentlich auch über 256 gehen wie ich das sehe.
Bei arrays bin ich mir aber auch nicht sicher mit mehr als
255. hast du mal probiert ob er überhaupt über 255 zählt,
sprich ob der Sender mehr als 255 sendet?
Vor den Erfolg haben die Götter den Schweiß gesetzt
Hallo Vitis,
es wird immer kurioser, anscheinend liegts an meinem DMX-Sender, den ich nach erfolgreichen Tests nochmal modifiziert habe. Mit dem nächsten DMX-Pult das zur Reparatur reinkommt werde ich das mal gegenchecken.
Die Ein/Ausgabe mache ich jetzt mit Taster und Display zusammen über I2C und PCA9555D
Günter
tjaja, hab ich glaub ich schon mal im thread erwähnt,
dass es da "semiprofi" teile gibt, die nur bis 255 senden
Welchen sender benutzt du denn?
Vor den Erfolg haben die Götter den Schweiß gesetzt
Aaaaaaaaaarrrrrrggggghhhhhh,
>Welchen sender benutzt du denn?
MEINEN EIGENEN !!!!!
Mein kleiner DMX-Sender war mit I2C, Inkrementalgeber, serieller Schnittstelle und einem DMX, das nicht mal in einem Interrupt liegt zeitweise überfordert.
Jetzt habe ich den DMX-Generator in den Interrupt des Timer0 gelegt und ein paar µs Bedenkzeit für den Rest eingebaut und schon läufts.
Günter
Hallo Vitis,
der hier:
https://www.roboternetz.de/phpBB2/ze...ghlight=dmx512
wir wollen ja schliesslich kein "Semiprofi" Gerät bauen
Günter
Lesezeichen