Hallo,
ich habe jetzt versucht, die Interrupts zu enablen.
Leider nicht mit dem gewünschten Erfolg.
Jetzt habe ich meinen gesamten Code angehängt, da sich zwischenzeitlich einige bei mir gemeldet haben, die gerne etwas mehr über die RS485 Steuerung erfahren möchten.
Da das Programm weitestgehend ohne Probleme läuft, kann sich hier jeder etwas abkugen.
Verbesserungsvorschläge nehme ich gerne entgegen!
Vielleicht findet ja auch jemand den oben beschriebenen Fehler im Programm?!
Tobias
Code:'***** RS-485 ************************* ' RS485 Ansteuerung von 5 Relais mit Zeitschaltfunktion und manueller vor Ort Bedienung mit Tastern ' Erstellt von Tobias Riesbeck, Dezember 2006 '************************************** $regfile = "m8def.dat" $crystal = 7372800 $baud = 4800 '------------------------------------ Config Pind.4 = Input '1 Dil Schalter für Adresse Config Pind.3 = Input '2 Dieser muss beim programmieren Config Pinb.4 = Input '3 auf allen Positionen auf 0 stehen Config Pinb.3 = Input '4 Config Pinc.0 = Input ' Schaltport Config Pinc.1 = Input Config Pinc.2 = Input Config Pinc.3 = Input Config Pinc.4 = Input Config Pinc.5 = Input ' N.N. Config Portb.0 = Output ' Schaltport's Config Portb.1 = Output Config Portb.2 = Output Config Portd.7 = Output Config Portd.6 = Output Config Portb.5 = Output ' Kontrollport Dim T1 As Long Dim T2 As Long Dim T3 As Long Dim T4 As Long Dim T5 As Long Dim Zeit1 As Long Dim Zeit2 As Long Dim Zeit3 As Long Dim Zeit4 As Long Dim Zeit5 As Long Dim Sz As Long 'Sendezeit Zeit1 = 20000000 'Flur EG Zeit2 = 20000000 'Schlafzimmer Zeit3 = 20000000 'Keller Zeit4 = 10000000 'Gang Zeit5 = 20000000 'Flur OG Dim Myadress As Byte 'Variable Myadress wird für Adresse über Dip Schalter festgelegt '"Hex(myadress)" gibt die Adresse in Hex-Format aus Myadress.0 = Pind.4 Myadress.1 = Pind.3 Myadress.2 = Pinb.4 Myadress.3 = Pinb.3 Dim Db1_ As Byte ' db1 zur Aufnahme des Modulzustandes in Hex T1 = 0 T2 = 0 T3 = 0 T4 = 0 T5 = 0 Sz = 0 Config Portd.2 = Output ' RS485 Config Debounce = 50 Dim I As Byte Dim Key As Byte Dim S As String * 10 Dim B(10) As Byte 'At S Overlay Dim N As Byte ' Adresse festlegen ------------------------------------------------- Dim Preamble_ As Byte 'Preamble-Byte Dim Sync_ As Byte 'Syncronisation-Byte Dim Hdb2_ As Byte 'Kopf-Byte 1 Dim Hdb1_ As Byte 'Kopf-Byte 2 Dim Dab1_ As Byte Dim Crc2_ As Byte 'CRC2 Preamble_ = &H55 'H55 Sync_ = &H54 'H54 Hdb2_ = &H51 'H51 Hdb1_ = &H42 'H42 Dab1_ = &H00 ' Protokoll --------------------------------------------------------- Dim Preamble As Byte 'Preamble-Byte Dim Sync As Byte 'Syncronisation-Byte Dim Hdb2 As Byte 'Kopf-Byte 1 Dim Hdb1 As Byte 'Kopf-Byte 2 Dim Dab1 As Byte 'Empfänger-Byte 1 Dim Sab1 As Byte 'Sender-Byte 1 Adresse Dim Db1 As Byte 'Daten-Byte 1 (in diesem Modul als Hex) Dim Db2 As Byte 'Date-Byte 2 fals erforderlich Dim Crc2 As Byte 'CRC2 Dim Crc1 As Byte 'CRC1 Dim Aktion As Byte 'CRC1 als Sender Const Keys = 5 On Urxc Onrxd Enable Urxc Enable Interrupts Portd.2 = 0 ' R/W für RS485 '---------- Programm ---------- Gosub Zustand Prog_start: N = 0 Do If Sz > 0 Then Sz = Sz + 1 If Sz > 10000 Then Gosub Zustand 'Zeitschalter (Zähler) If T1 > 0 Then T1 = T1 + 1 If T1 > Zeit1 Then Portd.6 = 0 T1 = 0 Aktion = &H00 Sz = 1 Else End If If T2 > 0 Then T2 = T2 + 1 If T2 > Zeit2 Then Portb.0 = 0 T2 = 0 Aktion = &H00 Sz = 1 Else End If If T3 > 0 Then T3 = T3 + 1 If T3 > Zeit3 Then Portb.2 = 0 T3 = 0 Aktion = &H00 Sz = 1 Else End If If T4 > 0 Then T4 = T4 + 1 If T4 > Zeit4 Then Portd.7 = 0 T4 = 0 Aktion = &H00 Sz = 1 Else End If If T5 > 0 Then T5 = T5 + 1 If T5 > Zeit5 Then Portb.1 = 0 T5 = 0 Aktion = &H00 Sz = 1 Else End If For I = 1 To Keys Key = I Select Case Key Case 1 : Debounce Pinc.0 , 0 , Key_o1 , Sub 'Port 1. Case 2 : Debounce Pinc.1 , 0 , Key_o2 , Sub 'Port 2 Case 3 : Debounce Pinc.2 , 0 , Key_o3 , Sub 'Port 3 Case 4 : Debounce Pinc.3 , 0 , Key_o4 , Sub 'Port 4 Case 5 : Debounce Pinc.4 , 0 , Key_o5 , Sub 'Port 5 End Select Next Loop End Key_o1: Toggle Portb.0 'Buchse 1 Aktion = &HFF Sz = 1 If T2 = 0 Then T2 = 1 Else T2 = 0 End If Return Key_o3: Toggle Portb.2 'Buchse 3 Aktion = &HFF Sz = 1 If T3 = 0 Then T3 = 1 Else T3 = 0 End If Return Key_o5: Toggle Portd.6 'Buchse 4 Aktion = &HFF Sz = 1 If T1 = 0 Then T1 = 1 Else T1 = 0 End If Return Key_o4: Toggle Portd.7 'Buchse 5 Aktion = &HFF Sz = 1 If T4 = 0 Then T4 = 1 Else T4 = 0 End If Return Key_o2: Toggle Portb.1 'Buchse 2 Aktion = &HFF Sz = 1 If T5 = 0 Then T5 = 1 Else T5 = 0 End If Return '---------- Einlesen ---------- Onrxd: Disable Interrupts Incr N B(n) = Udr If N > 9 Then Preamble = B(1) : Sync = B(2) : Hdb2 = B(3) Hdb1 = B(4) : Dab1 = B(5) Sab1 = B(6) Db1 = B(7) Db2 = B(8) Crc2 = B(9) Crc1 = B(10) N = 0 Enable Urxc Enable Interrupts Gosub Pruefung Else End If Return '---------- Prüfung ---------- Pruefung: 'SNAP Prüfung der eingehenden Byte If Sync <> Sync_ Then : Goto Prog_start Elseif Hdb2 <> Hdb2_ Then : Goto Prog_start Elseif Hdb1 <> Hdb1_ Then : Goto Prog_start Elseif Dab1 <> Myadress Then : Goto Prog_start End If Gosub Steuerung Return '---------- Fernsteuerung Steuerung ---------- Steuerung: Sz = 1 If Db1 = &H01 Then : Gosub Key_o1 : End If If Db1 = &H02 Then : Gosub Key_o2 : End If If Db1 = &H03 Then : Gosub Key_o3 : End If If Db1 = &H04 Then : Gosub Key_o4 : End If If Db1 = &H05 Then : Gosub Key_o5 : End If If Db1 = &H06 Then : Sz = 1 : End If Db1 = 0 Return '---------- Übertragung des Zustandes -------- Zustand: Db1_.0 = Portb.0 'Auswertung der Portzustände Db1_.1 = Portb.1 Db1_.2 = Portb.2 Db1_.3 = Portd.7 Db1_.4 = Portd.6 Portb.5 = 1 ' Übertragungs LED an Disable Urxc Disable Interrupts Portd.2 = 1 : Waitms 20 'RS485 PIN auf Senden Print Chr(preamble_) ; Chr(sync_) ; Print Chr(hdb2_) ; Chr(hdb1_) ; Print Chr(dab1_) ; Chr(myadress); Print Chr(db1_) ; Chr(db2); Print Chr(crc2) ; Chr(aktion) ; Waitms 100 Do Loop Until Ucsra.txc = 1 Reset Ucsra.txc Waitms 10 : Portd.2 = 0 'RS485 PIN auf Enpfang Enable Urxc Enable Interrupts Aktion = "" Sz = 0 Portb.5 = 0 ' Übertragungs LED aus N = 0 Return End







Zitieren
Lesezeichen