My new OpenGl technology engine 3DOT for your information
is
Pro více informací je zde formulář
(c) 2000 Pavel Pindora
Jak je řešena komunikace slave stanic po RS485 new 15.9.2002
New 15.3.2003 Stručný popis vizualizace teplot pro tuto aplikaci Atmelu na PC
New 4.5.2008 Solární ohřev vody v bazénu a aplikace Atmel
New 28.3.2009 Digitální teploměry Dallas 18B20 připojeny na Atmel
na konci je připojení LCD 4x16 na 89C52 včetně asembleru

slouží k regulaci teplot v max. 15 pokojích, pomocí elektroventilů instalovaných na jednotlivých radiátorech ústředního topení.Skládá se z výše zobrazené jednotky Hlavního řídícího systému komunikující po RS485 s komunikátory, doplněnými elektronickými teploměry, viz obrázek 1 a 2.
obrázek 1 větší krabička komunikátor, menší teploměr

obrázek 2 větší krabička komunikátor,pl.spoj s AT89C2051

Obrázek 3. Hlavní jednotka se skládá z AT89C52,FLASH 29F010B a static RAM.

Několik LCD obrazovek znázorňuje možnosti systému.
LCD 1 : Základní obrazovka se zobrazeným časem a vybraným cyklem 10_12 říká, že je vybrán cyklus v čase 10:00 až 12:00 hod a dle LCD 4 tento cyklus reguluje na 21.5 st.C
LCD 2 : Volba jednotlivých obrazovek stiskem tlačítek 1-4
LCD 3 : Volba pokojů (1-15), ve kterých se nastaví jednotlivé cykly, např. na LCD 4 je vybraný pokoj 1 s nastavenými cykly od 6:00 až 8:00 na 21.0 st.C, 8:00 10:00 také na 21.0, 10:00 až 12:00 na 21.5 st.C další hodiny (12:00 14:00, ... ) se přepnou tlačítkem 4
LCD 5 : Pokud se na LCD 2 přepneme tlačítkem 2 Mericich mist, můžeme si nechat zobrazit teploty v jednotlivých pokojích a zároveň vidíme zda se v nich topí nebo ne a zda je v nich zapnut automatický nebo místní režim.Například Na znamená, že v daném pokoji 1(M.mst1) se netopí,ventil vypnut a režim je automatický ale v pokoji 3 (M.mst3) se netopí a režim je ruční to znamená, že na komunikátoru můžeme ručně zapnout ventil a tím přitopit.

Obrázek 4 Připojení LCD displeje 4x16 z GM Elecktronics na 89C52

;/////////////////////////////////////////////////////////////////////////////
UVITANI: .TEXT "System Rizeni a "
.TEXT " mereni teplot "
.TEXT " SRM52 verze 1 "
.TEXT " "
ADUVITAN: MOV DPTR,#UVITANI
;vypis uvodni text
mov Kmenu,#SYSTEM ;co je na displeji
LCALL MENU
;rutina vypisu na displej
LCALL JEKLAV
;rutina testu klavesy
LJMP ADMENUSYS
;/////////////////////////////////////////////////////////////////////////////
; MENU - zapise data pro LCD 4 x 16 zn. do vnitřní paměti 89C52 od adresy 30h
; v DPTR adresa textu z pameti programu
MENU: MOV R0,#030H ;1.adr videoram
MOV R1,#64 ;pocet vypisovanych znaku
MENU1: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R1,MENU1
ret
;-----------------------------------------
LCD displej je obsluhován z obsluhy přerušení časovače T1, kde se 10x za sec volá rutina ViRAM, která zobrazí obsah vnitřní RAM 89C52 od adresy 30h na displej.
ViRAM:
MOV R1,#030H
LCALL LCD416
ret
;/////////////////////////////////////////////////////////////////////////////
; LCD416 - vypise data na LCD 4 x 16 zn.
; Pred spustenim je treba nastavit R1
LCD416: MOV R7,#16
MOV R6,#080H ;nastav 1.radek LCD
LCALL LCD
MOV R7,#16
MOV R6,#0C0H ;nastav 2.radek LCD
LCALL LCD
MOV R7,#16
MOV R6,#090H ;nastav 3.radek LCD
LCALL LCD
MOV R7,#16
MOV R6,#0D0H ;nastav 4.radek LCD
LCALL LCD
RET
;/////////////////////////////////////////////////////////////////////////////
; Pred spustenim rutiny LCD
;----------------------------------------
; R7 - nastav pocet vypisovanych znaku
; R6 - nastav vychozi pozici kurzoru
; R1 - 1.adresa s daty z vnitrni pameti
;----------------------------------------
LCD: MOV DISPLAY,R6
LCALL SETD
LCD1: CLR A
MOV A,@R1
MOV DISPLAY,A
LCALL WRD
INC R1
DJNZ R7,LCD1
RET
SETD:
CLR RS
MOV R0,#0
DJNZ R0,$
SETB E
;CLR E
MOV R0,#0
DJNZ R0,$
CLR E
;SETB E
MOV R0,#0
DJNZ R0,$
SETB RS
MOV R0,#0
DJNZ R0,$
RET
WRD: SETB E
;CLR E
MOV R0,#0
DJNZ R0,$
CLR E
;SETB E
MOV R0,#0
DJNZ R0,$
RET
LCDL: .DB 3FH,0CH,01H,06H
;/////////////////////////////////////////////////////////////////////////////
Jak je řešena komunikace slave stanic po RS485
Na obrázku je schéma zapojení Atmelu 89C2051 ( U1 ) a v dolní části obvod pro dvouvodičovou komunikaci RS485 (U4), jeho připojení na U1 je zřejmé dle odkazů na pinech. Zbývá dodat že pin 4 (R) obvodu U4 a P1.7 U1 slouží k řízení vysílání (Tx), pokud je na něm log.1 tak je povoleno. Příjem (Rx) je trvale v log.0 a je tedy stále povolen . Při vysílání tedy stanice zachytává vlastní znaky , které se musí odfiltrovat, např. ignorovat je nebo zakázat během vysílání vyvolání přerušení . Leckdy je možné jich použít k identifikaci funkčnosti vlastní linky RS485.
Odpory R5,R6 zajišťují klidovou úroveň na lince a to tak, že když jsou stanice na příjmu a žádná nevysílá tak vlastně je linka v jakémsi třetím stavu a je náchylná na rušení a mohly by nám přicházet falešné znaky, které ale by měl protokol odfiltrovat. Na lince je připojen master Hlavního řídícího systém , viz výše, který komunikaci řídí a dotazuje se slave na data.

Dále bude naznačeno jak takovou komunikaci řešit programově .
Nejdříve bude třeba udělat seznam potřebných proměnných a konstant :
;***** Obsluha protokolu Konstanty *******************************
NUL .EQU 000h
SOH .EQU 001h
STX .EQU 002h
ETX .EQU 003h
ACK .EQU 006h
DLE .EQU 010h
NAK .EQU 015h
SYN .EQU 016h
POC_SL .EQU 031h ;Pocatecni adresa slave
MAX_SL .EQU 041h ;Konecna adresa slave+1 pocatecni je 31h
MAX_ZS .EQU 008h ;Pocet znaku v protokolu od slave
MAX_ZM .EQU 006h ;Pocet znaku v protokolu Master
KDE_SX .EQU 000h ;Kde je STX slave v buffru BUF_SL
KDE_AD .EQU 001h ;Kde je adresa od slave v buffru BUF_SL
KDE_T1 .EQU 002h ;Kde je teplot od slave v buffru BUF_SL
KDE_EX .EQU 006h ;Kde je ETX slave v buffru BUF_SL
KDE_S1 .EQU 007h ;Kde je soucet 1 slave v buffru BUF_SL
KDE_S2 .EQU 008h ;Kde je soucet 2 slave v buffru BUF_SL
;***** Obsluha protokolu Promenne ********************************
.org 040h
ADR_SL .DB 0 ;1 Pocitadlo vyslanych adres slave
BUF_SL .DB 0 ;10 Pocatek buffru STX 81h 0
.DB 0 ; ADR SL 82h 1
.DB 0 ; T1 83h 2
.DB 0 ; T2 84h 3
.DB 0 ; T3 85h 4
.DB 0 ; STAV 86h 5
.DB 0 ; ETX 87h 6
.DB 0 ; SOUCET1 88h 7
.DB 0 ; SOUCET2 89h 8
.DB 0 ; REZERVA 8Ah 9
VYS_SL .DB 0 ;1 Vypocet konecne adresy pro vyslani
BUF_MR .DB 0 ;6 Pocatek bufru STX 8Ch 0
.DB 0 ; ADR 8Dh 1
BUF_TA .DB 0 ; Pozadovana teplota 10
.DB 0 ; Pozadovana teplota 1
.DB 0 ; Pozadovana teplota 0.1
.DB 0 ; ETX 8Eh 2
UKZ_SL .DB 0 ;1 Ukazatel pozice bufru Slave BUF_SL
UKZ_MR .DB 0 ;1 Ukazatel pozice bufru Master BUF_MR
TEP_01 .DB 02Dh ;3 Teplota ze slave
TEP_02 .DB 02Dh
TEP_03 .DB 02Dh
TEP_RA .DB 030h ;1 Zda automat/rucne
pomoc .DB 0 ;pomocna pro ascii na hexa
topit .DB 0 ;zda topit nebo ne automatu
vysil .DB 0 ;Vysilam sve znaky,neprijimat
pimp0 .DB 0 ;Pocet impulsu
pimp1 .DB 0 ;Pocet impulsu
Ze seznamu proměnných je již zřejmé jak vypadá komunikační protokol , odpověď ze slave
začíná STXem, ADResou SLave , teploty jsou v T1,T2,T3 v ASCII znacích následuje STAV (zda slave topí , jeli v automatu... opět ASCII) , konečným znakem je ETX za kterým následuje kontrolní součet.
Samozřejmě , že odpověď musí následovat teprve po dotazu z Master a ten vypadá takto (BUF_MR)
STX, ADResa slave, Požadované teploty 10(desítky),1(jednotky),0.1(desetiny) v ASCII a ukončení je ETX
Jak vypadá obsluha přerušení od seriové linky demonstruje následující okomentovaný výpis SLAVE
INKOM: CLR ES
PUSH ACC
PUSH B
PUSH PSW
PUSH DPL
PUSH DPH
MOV PSW,#BAN3 ;BANKA REG 3
;-----------------------------------
JB RI,PRI00
;JB TI,VYS00
;-----------------------------------
LJMP VYS00 ;KOMEND
;-----------------------------------
PRI00: CLR RI
mov a,flagSer
anl a,#0FFh
jz PRIvyh
LJMP KOMEND
PRIvyh: mov a,vysil ; Tady se rozlisuje zda vysila slave pokud ano znaky se ignoruji
cjne a,#001h,PRIjmi
LJMP KOMEND
PRIjmi: mov a,SBUF
cjne a,#STX,PRIEX
mov UKZ_MR,#000h ;nulovat ukazatel pozice bufru
mov UKZ_SL,#000h ;nulovat ukazatel pozice bufru
ajmp PRI01
;----------- Prisel ETX otestovat a odpovedet ---------
PRIEX: cjne a,#ETX,PRI01
mov R0,#BUF_MR
mov a,@R0
cjne a,#STX,PRINK
inc R0
lcall vypAdr
mov a,@R0
xrl a,ADRVYP
jnz PRINK
cpl LEDNATP ;Jen Debug
mov R0,#BUF_TA ;Naplnit zadanou teplotu pro Automat
mov R1,#TEPA10
mov a,@R0
mov @R1,a
inc R0
inc R1
mov a,@R0
mov @R1,a
inc R0
inc R1
mov a,@R0
mov @R1,a
ajmp PRIPB
PRINK: ljmp PRIEN
PRIPB: mov a,ADRVYP
cjne a,#040h,Prird ;Pokud se jedna o kotel tak dosadit znaky
mov TEP_01,#'K'
mov TEP_02,#'O'
mov TEP_03,#'T'
Prird: clr a
mov R0,#BUF_SL ;STX se vysila primo zde
lcall vypAdr
mov @R0,ADRVYP
mov a,@R0
inc R0
mov @R0,TEP_01
add a,@R0
inc R0
mov @R0,TEP_02
add a,@R0
inc R0
mov @R0,TEP_03
add a,@R0
inc R0
mov @R0,TEP_RA
add a,@R0
inc R0
mov @R0,#ETX
add a,@R0
inc R0 ;Vypocet souctu
mov B,R0
mov R1,B
lcall hexas
mov vysil,#001h
setb C485
mov SBUF,#STX
ljmp PRIEN
;------------------------------------
PRI01: PUSH ACC ;uschovat SBUF
mov a,UKZ_MR ;testovat preplneni bufru
clr c
subb a,#MAX_ZM
jc PRI02
POP ACC
ljmp PRIEN
PRI02: mov a,#BUF_MR
mov R0,#UKZ_MR
add a,@R0
mov R0,a
POP ACC
mov @R0,a ;obnovit SBUF a ulozit do BUF_MR+UKZ_MR
mov a,UKZ_MR
add a,#001h
mov UKZ_MR,a
PRIEN: ljmp KOMEND
;------------------------------------
VYS00: CLR TI
mov R0,#UKZ_SL ;na pocatek vysil bufru
mov a,@R0
clr c
subb a,#MAX_ZS
jc VYS01
mov vysil,#000h ;Povolit prijem
clr C485
mov flagSer,#1
AJMP KOMEND ;Jinde se postarat o setovani UKZ_MR
VYS01: mov a,@R0 ;ukazatel pozice bufru
add a,#001h ;ukazat na dalsi pozici
mov R2,a ;uschovat zatim
mov a,@R0
add a,#BUF_SL
mov R0,a
mov a,@R0
mov SBUF,a
mov a,R2
VYS02: mov UKZ_SL,a
ljmp KOMEND
;------------------------------------
KOMEND: POP DPH
POP DPL
POP PSW
POP B
POP ACC
SETB ES
RETI
;-------------------------------------------
;KONEC OBSLUHA PRERUSENI OD SERIOVEHO KANALU
;*******************************************
Výše uvedený systém byl netradičně použit pro řízení solárního systému, napojeného na bazén. Je použit buď v módu SolarSingle nebo SolarDouble, což je dáno počtem teploměrů, viz dříve uvedený obrázek 1.
Mód SolarSingle
Teploměrem se snímá teplota vody v solárního kolektoru, pokud dosáhne požadované teploty je spuštěno čerpadlo a to po nastavenou dobu ( standartně 5 - 10 minut ) .
Pokud není čerpadlo spuštěno v daném časovém úseku x-krát, značí to, že není dostatek slunce a proto je nutné jej spustit aby došlo k provzdušnění vody, čas spuštění a počet za den je dále podmíněn zadanými faktory, aby se voda neochlazovala je vhodné systém doplnit o přepínací klapu a vyřadit tak z oběhu kolektor..
Také je možné sledovat rychlost/velikost narůstání hodnoty teploty a měnit požadovanou v závislosti na slunečních podmínkách.

| Pohled na rozváděč |
| Řízení pomocí Atmelů, projekt SolarDouble je již postupně realizován na FreeScale |
Mód SolarDouble
Teploměrem se snímá teplota vody v solárního kolektoru a v bazénu, pokud dosáhne požadované teploty, odvislé od teploty vody v bazénu, je spuštěno čerpadlo a to po nastavenou dobu ( standartně 5 - 10 minut ) .

Digitální teploměry Dallas 18B20 připojeny na Atmel
Vlastní digitální teploměr DS18B20