DMX-Empfangs-Programm für AVR

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 5 2024  21:37:51      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
DMX-Empfangs-Programm für AVR
Suche nach: dmx (395)

    







BID = 17169

twice_rock

Neu hier



Beiträge: 24
 

  


Hi!
Weiss jemand wo ich ein fertiges Programm zum Empfangen von DMX-Signalen herkriege? Am besten wäre, wenn es in Basic oder ähnlichem geschrieben wäre. Assembler geht zur Not auch. Ich will mir nämlich einen DMX-Empfänger bauen, der die empfangenen Daten auf einem Display ausgibt. Das ganze basiert dann auf einem Mikrocontroller der AVR-Serie von Atmel.

Danke schon mal im Vorraus, Stefan.

P.S.: DMX ist ein Übertragunsprotokoll im Bereich der Licht-Technik.

BID = 17180

Jornbyte

Moderator



Beiträge: 7090

 

  

Welchen Type willst du einsetzen?
Ich habe da was für den 1200, 4433 oder 8515 in ASM. Die LCD-Anzeige geht nur für einen Kanal da der Eigenbedarf des LCD an Zeit zu hoch ist. Es ist aber jeder Kanal einstellbar. Basic (Bascom oder Fast-AVR) sind dafür nicht geeignet, oder du Implementierst eine ASM-Routine.

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 17181

twice_rock

Neu hier



Beiträge: 24

ähm...für den 8515 wär nicht schlecht. benutzt du dabei den timer? am besten postest du einfach den programm-text. danke, stefan.

BID = 17202

einDäne

Gerade angekommen
Beiträge: 9
Wohnort: in der Nähe vom Limfjord

Hi,
schau mal bei http://www.mikrocontroller.com/ vorbei.
Gruß

BID = 17210

Jornbyte

Moderator



Beiträge: 7090

Das Forum http://www.mikrocontroller.com/ (.net ist das gleiche) ist Gut. Programme wirst aber nur im AVR-Tutorial und in der Codesammlung finden. Da ist aber sowas nicht dabei. Hier ist es, mußt es nur noch Compelieren und Brennen Ach ja, ich benutze die Uart.


Uploaded file: Tester.asm

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 17233

twice_rock

Neu hier



Beiträge: 24

Danke! das hilft mir schon mal weiter. hast du das ganze vielleicht auch noch schriftlich vorliegen? also ich meine jetzt nicht in programmiersprache, sondern so umgangssprachlich verfasst. dann ist es für mich leichter das in bascom zu schreiben, da ich nicht so der assembler-experte bin. dann müsste ich mir wieder die ganzen assemblerbefehle aneignen, um das zu verstehen. ich bin halt ein bißchen faul

BID = 17236

Jornbyte

Moderator



Beiträge: 7090

In Bascom geht es nicht. Das hatte ich schon mal weiter oben geschrieben. Da hast du nur die Möglichkeit das in ASM zu machen. Dazu kannst du die "get_byte" Routine verwenden.
Die UART musst du da auf 250 kbaut stellen. Das habe ich aber noch nicht getestet, weil nur 44µs Zeit ist um die Auswertung vorzunehmen. Für deinen Tester brauchst nur noch das im Upload liegende Hex-File in den 90S8515 zu Brennen.


Uploaded file: Tester.hex

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 17237

twice_rock

Neu hier



Beiträge: 24

aber muss ich das denn zwingend über uart machen? die wollte ich mir nämlich noch freihalten, um die eingelesenen werte auch auf dem pc ausgeben zu können. dann muss ich mir wohl doch mein eigenes programm schreiben...trotzdem danke!

BID = 17242

dos6510

Stammposter


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 357
Wohnort: Raum Stuttgart

Hi,

bei den Datenraten solltest Du den internen UART nehmen. Auf der ATMEL Website gibt es ein paar Beispielprogramme für einen "Soft" UART; wenn Du nur ausgeben willst (zum PC) ist das unkritisch und sollte leicht nachzurüsten sein.
Ansonsten 'nen 16550 extern dranhängen (ist aber ein bisserl ein G'schiss); es gibt auch noch von Maxim einen UART mit SPI Interface (weiss die Bezeichnung gerade nicht auswendig)...

mfg

DoS

BID = 17252

twice_rock

Neu hier



Beiträge: 24

Hi nochmal!
In Bascom kann man doch auch ASM-Routinen einbinden, oder? Könnte das dann funktionieren? Auf den Uart muss ich halt verzichten.
Wenn das geht, wie muss ich den ASM-Code von Jornbyte dann verändern, und wie geht das Einbinden in Bascom? Aus der Hilfe bei Bascom werd ich nicht wirklich schlau.
Grüße, Stefan

BID = 17285

Jornbyte

Moderator



Beiträge: 7090

Also in Bascom geht das so:
$baud = 250000
On Urxc Rx_sub
Enable Serial
Declare Sub get_byte
Config Lcd = 16 * 2
Do
'dein programm
Loop

$asm
get_byte:

' das unterprogramm aus dem ASM-Listing
' inc dmx_countL mußt du als inc r22 schreiben
' so wie es in den .def steht
' also die Namen gegen die Register tauschen

$end asm

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 17304

twice_rock

Neu hier



Beiträge: 24

vielen dank! ich werds ausprobieren!

BID = 17306

twice_rock

Neu hier



Beiträge: 24

hm...da tut sich mir noch ein problem auf: ich muss doch der getbyte-routine noch einen wert mitgeben, welchen kanal ich haben will. und anschliessend soll sie mir ja auch den wert des entsprechenden kanals zurückgeben. sorry falls ich nerve, aber ich bin noch nicht so der profi Wo muss ich den kanal reinschreiben, und wo krieg ich den wert zurück? oder hab ich was falsch verstanden?

Grüße, Stefan.

BID = 17320

Jornbyte

Moderator



Beiträge: 7090

Ich gehe mal davon aus das du das DMX - Protokoll kennst.
Im Programm lese ich eine eingestellte Adresse von dem PortA des 90S8515.
Die steht dann in dmx_adrL (r24). Das ist die Geräteadresse.
Das Register dmx_countL (r22) zählt die empfangenen Byte des DMX – Senders.
Mit cp dmx_countL,dmx_adrL wird der Zähler (dmx_countL) mit der eingestellen Adresse (dmx_adrL) verglichen.
Ist das Ergebnis Gleich steht in Register dmx_Byte (r21) das empfangene Byte.
In Bascom werden alle Werte, Variablen u.s.w. im Ram gespeichert. Da musst nun einen Weg finden um an den Wert zu kommen. Bascom hat dazu den Befehl „Loadadr“. Nun fügst du in der ersten Zeile der ISR get_byte den Befehl Loadadr dmx_Byte , Z ein. In deiner „Do.... Loop“ Schleife ist es nun möglich mit „LCD dmx_Byte“ den Wert an das LCD zu senden.


_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 17346

twice_rock

Neu hier



Beiträge: 24

also, bevor ich jetzt tausendmal nachfrage, poste ich doch einfach mal den programmtext, und du kannst dann ja mal das nötige verändern. falls du da die zeit zu hast . den teil für das lcd hab ich schon grösstenteils entfernt, weil der ja dann im bascom-text drin stehen soll.



$baud = 250000
On Urxc Rx_sub
Enable Serial
Declare Sub Get_byte

'*******************************************************************************

Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.6 , Rs = Porta.4
Config Lcd = 16 * 2
Cls
Cursor Off

'*******************************************************************************

Do
'hier soll erstmal nur der wert des eingestellten dmx-kanals in eine varible geschrieben werden!
Loop

'*******************************************************************************

$asm
Get_byte:

' das unterprogramm aus dem ASM-Listing
' inc dmx_countL mußt du als inc r22 schreiben
' so wie es in den .def steht
' also die Namen gegen die Register tauschen

' 8515 mit 8MHz

.include "8515def.inc"

.equ Channels_all = 1 'Hier Kommt Die Anzahl Der Kanäle Rein!
.equ Dmx_in = Pd0
.equ Rxd = 0 'Receive Pin Ist Portd0

'****

.def Temp = R16
.def Temp1 = R17
.def Temp2 = R18
.def Temp3 = R19
'****
'.def dmx_Reset =R1 '=00
.def Dmx_status = R20 ' Bit Counter*
.def Dmx_byte = R21 ' Received Data*
.def Dmx_countl = R22 ' Adress Register*
.def Dmx_count_in = R23 ' Byte Counter Low*
.def Dmx_adrl = R24 ' Dmx -adresse
.def Timer = R25 ' Zeitschleife Für Lcd
.def Raml = R30 ' Ramadresse = 0x060
.def Ramh = R31
'****


.org $000
rjmp INIT 'Program/Reset Handler
.org Int0addr
reti 'External Interrupt0 Vector Address
.org Int1addr
reti 'External Interrupt1 Vector Address
.org Icp1addr
reti 'Input Capture1 Interrupt Vector Address
.org Oc1aaddr
reti 'Output Compare1A Interrupt Vector Address
.org Oc1baddr
reti 'Output Compare1B Interrupt Vector Address
.org Ovf1addr
reti 'Overflow1 Interrupt Vector Address
.org Ovf0addr
reti 'Overflow0 Interrupt Vector Address
.org Spiaddr
reti 'SPI Interrupt Vector Address
.org Urxcaddr
rjmp get_byte 'UART Receive Complete Interrupt Vector Address
.org Udreaddr
reti 'UART Data Register Empty Interrupt Vector Address
.org Utxcaddr
reti 'UART Transmit Complete Interrupt Vector Address
.org Aciaddr
reti 'Analog Comparator Interrupt Vector Address
.org 0x010 ' Code Follows From Here


Init:
ldi temp1,High(RamEnd)
Out Sph , Temp1
ldi temp1,Low(RamEnd)
Out Spl , Temp1
ldi temp1, 0b00000000
Out Ddrd , Temp1 ' Port D = Eingang
ldi temp1, 0b11111111
Out Ddrc , Temp1 ' Port C = Ausgang
ldi dmx_count_in,0x00
ldi ramh,0x00
ldi raml,0x60
rcall start_adress 'get start adress

'**** initial uart
ldi temp,0x01 'set uart to 250 kbaud @ 8mhz
Out Ubrr , Temp '
ldi temp,0b00000000 'set uart to 8 bit
Out Ucr , Temp '
ldi dmx_status,0x01 'set dmx-status byte to 'wait for reset'
in dmx_Byte,UDR 'clear uart receive interrupt flag
cbi UCR,FE 'clear frame error flag
sbi UCR,RXCIE 'enable uart receive interrupt
sbi UCR,RXEN 'enable uart receiver
'**** initial lcd
rcall lcd_init 'Display initialisieren
rcall lcd_clear 'Display löschen
rcall textout 'Text ausgeben
sei
'****
Loop:
in dmx_adrL,PinA 'Kanal von PortA Laden
cp dmx_countL,dmx_adrL 'mit den Datenconter vergleichen
brne loop 'wenn gleich
in temp,PinA 'nochmal Adresse von Port laden
rcall adrbcd 'und an LCD ausgeben
cpi dmx_adrL,0x00 'ist Dmxadresse 0 dann ungültig
brne loop1
ldi temp,0x00
rcall rbcd
rjmp loop
Loop1 : Lds Dmx_byte , 0x60 ' Das Dmx -byte Steht In Der Ramadresse 0x60
mov temp,dmx_Byte 'das empfangene Byte an das LCD ausgeben
rcall rbcd 'Anzeige
rjmp loop 'auf neuen Wert warten

'******************************************************
Get_byte:
in dmx_Byte,UDR
sbic USR,OR 'ist es ein überlauf -> reset
rjmp overrun
sbic USR,FE 'check auf fehler -> reset
rjmp frame_error
cpi dmx_status,0x01 'warten auf reset
breq ret1 'return
cp dmx_countL,R1 'startbyte?
breq startbyte '
cp dmx_countL,dmx_adrL 'vergleiche adresse and bytenummer
brlo return
breq first

Next_t:
cpi dmx_count_in,channels_all 'sind alle kanäle gelesen?
brsh return
First:
inc dmx_count_in 'aresszähler +1
st z,dmx_Byte 'DMX-Wert in Ram speichern
Return : Inc Dmx_countl ' Neuer Kanal
Ret1 : Reti
Frame_error:
ldi raml,0x60
ldi ramh,0x00
ldi dmx_countL,0x00 'reset counter
ldi dmx_count_in,0x00
ldi dmx_status,0x00 'statusbyte auf 'ok' setzen
cbi USR,FE 'lösche frame-error flag
rcall start_adress 'kanaladresse laden
reti
Overrun:
ldi dmx_status,0x01 'setze status-byte 'warte auf reset'
reti 'return
Startbyte:
cp dmx_Byte,R1 'startbyte=0
brne overrun 'warte auf nächsten reset-cycle
rjmp return

'******************************************************
' Hier kommt deine Adressauswertung rein '*
' in diesem Beispiel 8 Dilschalter für 255 Kanäle '*
' (mal auf die schnelle zum Testen) '*
Start_adress : ' *
in dmx_adrL,pinA '*
ret '*
'******************************************************

'***** BCD Ausgabe ************************************
Rbcd:
rcall hex2bcd
push temp1
ldi temp1,lcd_pos2+5
rcall lcd_command
mov temp1,temp2
rcall lcd_data 'Byte senden 100
ldi temp1,lcd_pos2+6
rcall lcd_command
pop temp1
rcall lcd_data 'Byte senden 10
ldi temp1,lcd_pos2+7
rcall lcd_command
mov temp1,temp
rcall lcd_data 'Byte senden 1
ret
'*****
Adrbcd:
rcall hex2bcd
push temp1
ldi temp1,lcd_pos2+13
rcall lcd_command
mov temp1,temp2
rcall lcd_data 'Byte senden 100
ldi temp1,lcd_pos2+14
rcall lcd_command
pop temp1
rcall lcd_data 'Byte senden 10
ldi temp1,lcd_pos2+15
rcall lcd_command
mov temp1,temp
rcall lcd_data 'Byte senden 1
ret

'***** Wandlung Binär nach BCD ************************
'input: R16 = 8 bit value 0 ... 255
'output: R18, R17, R16 = digits (ASCII)

Hex2bcd:
ldi temp2, -1 + '0'
_bcd1 : Inc Temp2
subi temp, 100
brcc _bcd1
ldi temp1, 10 + '0'
_bcd2 : Dec Temp1
subi temp, -10
brcs _bcd2
subi temp, - '0'
ret


'***** Längere Pause für manche Befehle ***************
Delay5ms : ' 5ms Pause
push temp2
push temp1
ldi temp1,0x43
Wgloop0 : Ldi Temp2 , 0xc6
Wgloop1 : Dec Temp2
brne WGLOOP1
dec temp1
brne WGLOOP0
nop
pop temp1
pop temp2
ret 'wieder zurück

$end Asm

'*******************************************************************************


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 14 Beiträge im Durchschnitt pro Tag       heute wurden bisher 5 Beiträge verfasst
© x sparkkelsputz        Besucher : 181375993   Heute : 5205    Gestern : 5462    Online : 435        29.5.2024    21:37
2 Besucher in den letzten 60 Sekunden        alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0754330158234