RS485

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.

Nejspíše bude někde problém. Ty ani nevíš, jestli Ti po lince běží data nebo ne a chceš poradit ? Ledaže by někdo z nás měl křišťálovou kouli…

Signály A a B NESMÍŠ nikdy propojit. Přepínací signál bys měl propojit na piny 2 a 3 tý MAX485-ky. Ta zelená propojka slouží jen k připojení odporu 120Ohmů jako terminátoru linky. Pokud posíláš data jenom jedním směrem, pak na vysílací straně je signál DE=1 a nRE=1, na přijímací je DE=0 a nRE=0 a nemusíš je přepínat. Jako začátečníkovi Ti víc hlavu motat nebudu.

Děkuji, lepší než ten neupravený příspěvek, jinak to propojení už plyne, jen příjde první informace vypíše se na display a poté už se vypíšou pouze 00.00, nevim zda-li je to tím že nepřichází informace nebo zda se nečtou či je potřeba nějaká sychronizace na to

popřípadě mi tedy poraďte prosím vás jak zjistím jestli mi tam něco proudí? když normální zobrazování na display mi ukazuje prd

Logický analyzátor nebo alespoň logická sonda. V nejhorším případě stačí LEDka s odporem.

Presne tak.

na napajanie reba dat LED cez odpor
na RX MCU treba dat LED cez odpor
na TX MCU treba dat LED cez odpor
na jeden volny pin MCU treba dat LED cez odpor, aby si si mohol ladit aplikáciu napriklad tak, že ak sa prijme spravna sprava, potom LED 3x krátko zabliká. Alebo zmení stav, alebo… čo si len vymyslíš.

Ak tak zistíš, čo sa vlastne vo vnutri MCU vlastne deje