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
'*******************************************************************************