Home www.visualprog.cz

 

My new OpenGl technology engine 3DOT  for your information

is

here

 

 

Aplikace s mikrořadičem Atmel 89C52 a 89C2051

Email Kontakt .

Pro více informací je zde formulář

(c) 2000 Pavel Pindora 

 

Click on of the PayPal button to donate money to this Project

 

 

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

Komunikátor s teploměrem

 

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

Solární ohřev vody v bazénu a aplikace Atmel  89C2051

Atmel 89C2051 for Controlling Solar Swimming Pool Heating Systems

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.

 

 

Foto - Realizovaný projekt

 

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

¨