mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zu Bascom DMXSLAVE


Autor: Stefan Voll (lj-products)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

habe ein paar fragen zum HIGHLEVEL Befehl "Config DMXSLAVE" in Bascom.

Hier erst mal mein Code:

'$sim
$regfile = "m8515.dat"                                      'Atmega 8515-16PU
$crystal = 16000000                                         'Quarz 8Mhz extern
$hwstack = 100
$swstack = 100
$framesize = 100
Config Dmxslave = Com1 , Channels = 9 , Store = 9
Enable Interrupts



'Programmmvariablen:
Dim Teiladresse1 As Bit
Dim Teiladresse2 As Byte
Dim Teiladresse3 As Byte
Dim Teiladresse4 As Byte
Dim Teiladresse5 As Byte
Dim Teiladresse6 As Byte
Dim Teiladresse7 As Byte
Dim Teiladresse8 As Byte
Dim Teiladresse9 As Word
Dim Adresse As Word
Dim Timer_zaehler As Byte
Dim Dimmer_kanal_1 As Byte
Dim Dimmer_kanal_2 As Byte
Dim Dimmer_kanal_3 As Byte
Dim Dimmer_kanal_4 As Byte
Dim Dimmer_kanal_5 As Byte
Dim Dimmer_kanal_6 As Byte
Dim Dimmer_kanal_7 As Byte
Dim Dimmer_kanal_8 As Byte
Dim Dimmer_kanal_9 As Byte


'Subs / Funktionen deklarieren
Declare Sub Dmx_adresse_auslesen
Declare Sub Led_rot_doppelblinken



'Eingänge zuweisen
Config Pinc.0 = Input                                       'Eingänge von PortC.0 bis PortC.7 = DIP-Schalter
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
Config Pinc.6 = Input
Config Pinc.7 = Input
Config Pine.1 = Input                                       'Eingänge von PortE.1 bis PortE.2 = DIP-Schalter
Config Pine.2 = Input
Config Pind.5 = Input                                       'Spare 1 (Ausgabe Invertieren)
Config Pind.4 = Input                                       'Spare 2
Config Pind.3 = Input                                       'Spare 3


'Ausgänge zuweisen
Config Portd.7 = Output                                     'LED Rot (Fehler)
Config Portd.6 = Output                                     'LED Orange (DMX Aktiv)
Config Porte.0 = Output                                     'Kanal 1
Config Porta.7 = Output                                     'Kanal 2
Config Porta.6 = Output                                     'Kanal 3
Config Porta.5 = Output                                     'Kanal 4
Config Porta.4 = Output                                     'Kanal 5
Config Porta.3 = Output                                     'Kanal 6
Config Porta.2 = Output                                     'Kanal 7
Config Porta.1 = Output                                     'Kanal 8
Config Porta.0 = Output                                     'Kanal 9




'Eingänge Alias Zuweisen
Dip_1 Alias Pinc.0
Dip_2 Alias Pinc.1
Dip_3 Alias Pinc.2
Dip_4 Alias Pinc.3
Dip_5 Alias Pinc.4
Dip_6 Alias Pinc.5
Dip_7 Alias Pinc.6
Dip_8 Alias Pinc.7
Dip_9 Alias Pine.2
Dip_10 Alias Pine.1
Spare_1 Alias Pind.5
Spare_2 Alias Pind.4
Spare_3 Alias Pind.3


'Ausgänge Alias Zuweisen
Led_rot Alias Portd.7                                       'Fehler LED
Led_orange Alias Portd.6                                    'DMX aktiv LED
Kanal_1 Alias Porte.0
Kanal_2 Alias Porta.7
Kanal_3 Alias Porta.6
Kanal_4 Alias Porta.5
Kanal_5 Alias Porta.4
Kanal_6 Alias Porta.3
Kanal_7 Alias Porta.2
Kanal_8 Alias Porta.1
Kanal_9 Alias Porta.0


'interne Pullup aktivieren
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
Porte.2 = 1
Porte.1 = 1
Portd.5 = 1
Portd.4 = 1
Portd.3 = 1



Config Timer0 = Timer , Prescale = 1
On Timer0 Timerueberlauf
Enable Timer0


'##################START#################


'Power-On Sequenz
Led_rot = 1
Led_orange = 1
Waitms 500
Led_rot = 0
Led_orange = 0





'Hauptschleife

Do
Main:





'Adresse auslesen:
Call Dmx_adresse_auslesen


'Adresse auswerten:
If Adresse = 0 And Dip_10 = 1 Then
Call Led_rot_doppelblinken
End If



'Test

If _dmx_received(1) = 1 Then
Dimmer_kanal_1 = 255
End If

dimmer_kanal_2 = _dmx_received(2)









Loop


'Sub DMX_Adresse_Auslesen
Sub Dmx_adresse_auslesen:

'Dip-Schalter abfragen
  If Dip_1 = 0 Then
  Teiladresse1 = 1
  Else
  Teiladresse1 = 0
  End If

  If Dip_2 = 0 Then
  Teiladresse2 = 2
  Else
  Teiladresse2 = 0
  End If

  If Dip_3 = 0 Then
  Teiladresse3 = 4
  Else
  Teiladresse3 = 0
  End If

  If Dip_4 = 0 Then
  Teiladresse4 = 8
  Else
  Teiladresse4 = 0
  End If

  If Dip_5 = 0 Then
  Teiladresse5 = 16
  Else
  Teiladresse5 = 0
  End If

  If Dip_6 = 0 Then
  Teiladresse6 = 32
  Else
  Teiladresse6 = 0
  End If

  If Dip_7 = 0 Then
  Teiladresse7 = 64
  Else
  Teiladresse7 = 0
  End If

  If Dip_8 = 0 Then
  Teiladresse8 = 128
  Else
  Teiladresse8 = 0
  End If

  If Dip_9 = 0 Then
  Teiladresse9 = 256
  Else
  Teiladresse9 = 0
  End If

'Adresse zusammenrechnen

  Adresse = 0
  Adresse = Adresse + Teiladresse1
  Adresse = Adresse + Teiladresse2
  Adresse = Adresse + Teiladresse3
  Adresse = Adresse + Teiladresse4
  Adresse = Adresse + Teiladresse5
  Adresse = Adresse + Teiladresse6
  Adresse = Adresse + Teiladresse7
  Adresse = Adresse + Teiladresse8
  Adresse = Adresse + Teiladresse9

'Adresse festlegen
  _dmx_address = Adresse


End Sub






'Timerüberlauf

Timerueberlauf:


 Timer0 = 6
'If Timer_zaehler = 255 Then
'Timer_zaehler = 0
'End If

Incr Timer_zaehler                                          ' Zähler hochzählen lassen


 If Timer_zaehler < Dimmer_kanal_1 Then
    Kanal_1 = 1
  Else
    Kanal_1 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_2 Then
    Kanal_2 = 1
  Else
    Kanal_2 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_3 Then
    Kanal_3 = 1
  Else
    Kanal_3 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_4 Then
    Kanal_4 = 1
  Else
    Kanal_4 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_5 Then
    Kanal_5 = 1
  Else
    Kanal_5 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_6 Then
    Kanal_6 = 1
  Else
    Kanal_6 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_7 Then
    Kanal_7 = 1
  Else
    Kanal_7 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_8 Then
    Kanal_8 = 1
  Else
    Kanal_8 = 0
  End If

  If Timer_zaehler < Dimmer_kanal_9 Then
    Kanal_9 = 1
  Else
    Kanal_9 = 0
  End If



Return


'Sub Led_rot_doppelblinken
Sub Led_rot_doppelblinken:

Led_rot = 1
Waitms 50
Led_rot = 0
Waitms 20
Led_rot = 1
Waitms 50
Led_rot = 0
Waitms 200
End Sub






'Ende des Programms
End

1. Das umwandeln von _dmx_received(x) in die Dimmerwerte funktioniert 
leider nicht. Kann mir jemand sagen warum?
2. Wie kann ich mit "DMXSLAVE" auswerten, ob ein DMX-Signal 
angeschlossen ist?
3. Wie kann ich feststellen, ob momentan Daten empfangen werden?
4. Wie kann ich feststellen, ob das DMX Signal vertauscht ist?

Ich hoffe ihr könnt mir da ein bisschen mit Helfen.

Danke schonmal

PS: Im Anhang meine Fuses für den 8051

Bye

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Quelltext stimmt die Quarzfrequenz nicht mit dem Kommentar 
überein.
Bei DMX muß $Baud die Übertragung mit 250kBaud laufen, sonst wird es
nicht gehen.

Schreib erst mal nur ein Probierprogramm, was die LED mit 1Hz blinken
läßt, um zu sehen, ob überhaupt der richtige Takt eingestellt ist, bevor
Du hier weitersuchst.

Guck auch mal hier hin:
http://www.ledstyles.de/ftopic11072.html

MfG Paul

Autor: Stefan Voll (lj-products)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das mit der Quarzfrequenz war mein Fehler. Das Kommentar war falsch.

So Baud habe ich mit rein gemacht. Hier mein neuer Code

'$sim
$regfile = "m8515.dat"                                      'Atmega 8515-16PU
$crystal = 16000000                                         'Quarz 16Mhz extern
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 250000
Config Dmxslave = Com1 , Channels = 9 , Start = 1 , Store = 9
Enable Interrupts





'Eingänge zuweisen
Config Pinc.0 = Input                                       'Eingänge von PortC.0 bis PortC.7 = DIP-Schalter
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Input
Config Pinc.5 = Input
Config Pinc.6 = Input
Config Pinc.7 = Input
Config Pine.1 = Input                                       'Eingänge von PortE.1 bis PortE.2 = DIP-Schalter
Config Pine.2 = Input
Config Pind.5 = Input                                       'Spare 1 (Ausgabe Invertieren)
Config Pind.4 = Input                                       'Spare 2
Config Pind.3 = Input                                       'Spare 3


'Ausgänge zuweisen
Config Portd.7 = Output                                     'LED Rot (Fehler)
Config Portd.6 = Output                                     'LED Orange (DMX Aktiv)
Config Porte.0 = Output                                     'Kanal 1
Config Porta.7 = Output                                     'Kanal 2
Config Porta.6 = Output                                     'Kanal 3
Config Porta.5 = Output                                     'Kanal 4
Config Porta.4 = Output                                     'Kanal 5
Config Porta.3 = Output                                     'Kanal 6
Config Porta.2 = Output                                     'Kanal 7
Config Porta.1 = Output                                     'Kanal 8
Config Porta.0 = Output                                     'Kanal 9




'Eingänge Alias Zuweisen
Dip_1 Alias Pinc.0
Dip_2 Alias Pinc.1
Dip_3 Alias Pinc.2
Dip_4 Alias Pinc.3
Dip_5 Alias Pinc.4
Dip_6 Alias Pinc.5
Dip_7 Alias Pinc.6
Dip_8 Alias Pinc.7
Dip_9 Alias Pine.2
Dip_10 Alias Pine.1
Spare_1 Alias Pind.5
Spare_2 Alias Pind.4
Spare_3 Alias Pind.3


'Ausgänge Alias Zuweisen
Led_rot Alias Portd.7                                       'Fehler LED
Led_orange Alias Portd.6                                    'DMX aktiv LED
Kanal_1 Alias Porte.0
Kanal_2 Alias Porta.7
Kanal_3 Alias Porta.6
Kanal_4 Alias Porta.5
Kanal_5 Alias Porta.4
Kanal_6 Alias Porta.3
Kanal_7 Alias Porta.2
Kanal_8 Alias Porta.1
Kanal_9 Alias Porta.0


'interne Pullup aktivieren
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
Portc.5 = 1
Portc.6 = 1
Portc.7 = 1
Porte.2 = 1
Porte.1 = 1
Portd.5 = 1
Portd.4 = 1
Portd.3 = 1



'##################START#################


'Power-On Sequenz
Led_rot = 1
Led_orange = 1
Waitms 1000
Led_rot = 0
Led_orange = 0
Waitms 1000
Led_rot = 1
Led_orange = 1
Waitms 1000
Led_rot = 0
Led_orange = 0
waitms 1000




'Hauptschleife

Do
Main:

If _dmx_received(1) > 0 Then
Kanal_1 = 1
End If

If _dmx_received(2) > 0 Then
Kanal_2 = 1
End If

If _dmx_received(3) > 0 Then
Kanal_3 = 1
End If

If _dmx_received(4) > 0 Then
Kanal_4 = 1
End If















Loop









'Ende des Programms
End


Leider läuft es immer noch nicht.

PS: Den Link kannte ich schon, hat mir aber leider nicht weiter 
geholfen.



Bye

Autor: Stefan Voll (lj-products)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm keiner eine Idee? Wenn nicht dann muss ich mich mal an MCS wenden ;)

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Voll schrieb:
> Config Porte.0 = Output

Du hast manchmal Port E  geschrieben sollte das so sein

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Grundlagen Prüfen.
Dein Avr ist ein Mega8515? Gibt es den überhaupt noch?
Du hast 16Mhz anliegen Quarz oder Oscilator und keinen Avr internen 
Teiler aktiv.
Woher kommt dein Dmx Signal? Der Bus Treiber alias sn75176 arbeiten 
ordentlich ? An Rxd vom Avr angeschlossen? Spannungsversorgung 
abblockkondensatoren Resetbeschaltung ordentlich?

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja
Config Pinc.0 = Input Ich kenne nur Config portc.0 = Input
Hast du ein Logic analyser oder ein Oscilloscope ? Zum prüfen ob 
Ordentliche Signale vom Bus am Avr ankommen.

Autor: Daniel B. (monsterhero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Sven schon schrieb:

Es muss "Config PORTx.x = Input" heißen (x natürlich mit dem 
entsprechenden Port/Pin ersetzen).

Edit: Ausgelesen werden Sie dann mit "PINx.x"

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.