Zdravím, RS485tku jsem rozchodil zdárně, jenže mi nastal problém s opakovaným aktualizováním slave displaye s informacemi poslanými od mastera - jinými slovy chce aby ta teplota byla aktuální na obouch displayích - momentálně mě po resetování mikropočítače problikne aktuální hodnota a pak se zase vrátí do 0 stavu (slave) - nedostává další hodnoty od mastera nejspíše
-Bascom, RS485 (MAX485), EvB 4.3 kit, Atmega32
Master program:
$lib “modbus.lbx” 'použité knihovny
$regfile = “m32def.dat” 'použitý mikroprocesor
$crystal = 16000000 'nastavení krystalu
$baud = 9600 'nastavení baudové rychlosti
$hwstack = 42 'nastavení HW stacku
$swstack = 40 'nastavení SW stacku
$framesize = 40 'nastavení velikosti rámce
'Zapojeni LCD pinu do mikrokontroleru
’ Rs = PortC.2
’ E = PortC.3
'Db4 = PortC.4
'Db5 = PortC.5
'Db6 = PortC.6
'Db7 = PortC.7
'Zapojení sériové linky
'DI = PortB.3
'R0 = PortB.2
'RE/DE = PortB.1
'Zapojení ostatních pinů do microkontroleru
'DS18B20(levý pin) = PortC.1
'Červená led(signál ohřívání) = PortA.0
'Zelená led(signál chlazení) = PortA.1
'RS485
Config Print1 = Portd.2 , Mode = Set 'konfigurace UARTu na RS485 a nastavení směru vysílání
Rs485dir Alias Portd.2 'abstrakce pinu sériové linky
Config Rs485dir = Output 'nastavení pinu na výstupní
Rs485dir = 1 'nastavení halfduplexu na transtmit/recieve
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0 'nastavení master - slave musí být stejný
'RS485
Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 'určení pinů pro komunikaci s LCD
Config Lcd = 16 * 2 'konfigurace řádků
Config 1wire = Portc.1 'konfigurace pripojeni teplotniho cidla DS18B20
Config Porta.0 = Output 'konfugurace I/O pinů
Config Porta.1 = Output
Cool Alias Porta.0 'abstrakce pinu pro chlazení
Set Cool 'zhasnutí LED kontrolky
Heat Alias Porta.1 'abstrakce pinu pro přitápění
Set Heat 'zhasnutí LED kontrolky
'nastavení dimenzí pro proměnné
Dim Temp(8) As Word
Dim X As Word
Dim Celsius As Integer
Dim T As Single
'začátek exekutivní části
Cls 'reset displaye
Locate 1 , 1 'alokace kurzoru/zápisu na první řádek
Lcd “” 'podpis pracovníků
Locate 2 , 1 'alokace kurzoru/zápisu na druhý řádek
Lcd “Termostat s AT8” 'zadání práce
Wait 2 'čekání
Cls 'reset displaye
Locate 1 , 1 'alokace kurzoru/zápisu na první řádek
Lcd “Teplota” 'informace o významu 2. řádku
Cursor Off 'vypnutí kurzoru
Do 'nekonečná smyčka
1wreset 'resetování busu
1wwrite &HCC 'přeskočení ROM paměti
1wwrite &H44 'převeď na teplotu
Waitms 200 'čekání
1wreset 'resetování busu
1wwrite &HCC 'přeskočení ROM paměti
1wwrite &HBE 'příchod čtení
For X = 1 To 2 'uložení čtení do pole
Temp(x) = 1wread()
Next
Celsius = Makeint(temp(1) , Temp(2)) 'převedení z pole do proměnné
T = Celsius / 16 'převod z hexa
Locate 2 , 1 'alokace kurzoru/zápisu na druhý řádek
Lcd Fusing(t , “##.##”) + " C" 'fůzování proměnné T na LCD display
If T > 27 Then Heat = 0 'kontrola podchlazení -> zapnutí vyhřívání
If T < 28 Then Cool = 0 'kontrola přehřátí -> zapnutí chlazení
If T > 27 And T < 28 Then 'v případě přípustné odchylky od nastavené teploty vypnout
Set Heat
Set Cool
End If
Rs485dir = 1 'poslání dat RS485
Print Celsius
Loop 'skočení zpátky do smyčky
End
Slave program:
$lib “modbus.lbx”
$regfile = “m32def.dat” ’ slave
$crystal = 16000000
$hwstack = 42
$swstack = 40
$framesize = 40
$baud = 9600
Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2
Locate 1 , 1
Lcd “Teplota”
Cls
Cursor Off
Dim T As Single
Dim Celsius As Integer
Config Print1 = Portb.2 , Mode = Set
Rs485dir Alias Portd.2
Config Rs485dir = Output
Rs485dir = 0
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0
Do
Rs485dir = 0
Locate 1 , 1
Lcd “Teplota”
Input Celsius
T = Celsius / 16 'převod
Locate 2 , 1 'alokace kurzoru/zápisu na druhý řádek
Lcd Fusing(t , “##.##”) + " C" 'fůzování proměnné T na LCD display
Waitms 200
Loop
End
Za každou radu děkuji.
PS: již jsem požádal admina s smazání minulého příspěvku, moje chyba, že jsem se nepřihlásil omlouvám se.