HC11 styret lysdæmper

HC11 styret lysdæmper
Udført og skrevet af:
Jacob Christiansen, 146415
Thomas Duerlund Jensen, 148809
Thomas Nordahl Petersen, 151021
Ernst Winther, 152289
Udført i:
Lokale 209
Odense Teknikum
Niels Bohrs Allé 1
5230 Odense M
I forbindelse med:
PRA, Projekt A
I tidsrummet:
Fra 10/2 2003 til 25/5 2003
Vejleder:
Jørgen Jeppe Madsen
Projektet har til formål at konstruere en HC11 styret lysdæmper. Den skal kunne dæmpe lyset til et
forud indstillet niveau og ved indtræden i en bevægelsesfølers detektionsområde øge lysstyrken i et
forud fastlagt tidsrum, til et forudbestemt niveau. Endvidere skal den kunne slukke og tænde lyset, når
sollyset er hhv. over og under et vist niveau.
Projektet løses ved brug af en lysfølsom modstand som reference for sollyset og en knap som gør det
ud for en bevægelsesføler. Selve lysdæmpningen udføres ved hjælp af pulsbreddemodulation i HC11.
Signalet sendes til en transistor, som giver gennemgang i en brokobling og derved tændes lyset.
Selve hardwaredelen har vist sig problematisk at komme igennem. Dog er denne del løst i
overensstemmelse med oplægget. Software delen viste sig overkommelig, dog opstod der visse
problemer, ved programmering af timerstyringen af pulsbreddemodulationen. Projektet er løst på en
måde, så al hardware og software virker og er funktionsdygtig. Om projektet er løst på den mest
hensigtsmæssige måde, er op til læseren.
1
Forord
Som et led i vores uddannelse til henholdsvis datateknologer og dataloger, skal vi på 2. semester
gennemføre et projekt, Projekt A, PRA. For at få de bedste muligheder for at gennemføre dette projekt,
har IOT, Ingeniørhøjskolen Odense Teknikum, stillet et projektlokale og en vejleder til rådighed. Vores
vejleder, Jørgen Jeppe Madsen, har hele projektet igennem løbende været vores sparringspartner i de
forskellige faser vi har været igennem, hvilket vi gerne vil takke for.
For at løse projektets problemer er vi nødt til at forstå og bruge de redskaber, som vi har tilegnet os ved
at følge undervisningen i Elektronik A, ELA, og Digitalteknik, DIG, på IOT. Disse egenskaber
inkluderer fremstilling af kredsløb på print og programmering af HC11 vha. assemblerkode, blandt
meget andet.
2
Indholdsfortegnelse
FORORD ................................................................................................................................................. 2
PROBLEMSTILLING ........................................................................................................................... 5
LØSNINGSMETODE ............................................................................................................................ 6
LYSDÆMPNINGENS FUNKTIONSMÅDE: ..................................................................................... 7
PULSBREDDEMODULATION: ................................................................................................................... 7
STIGNING OG FALD I LYSSTYRKE:........................................................................................................... 8
PRINT ...................................................................................................................................................... 9
LCD-DISPLAY ...................................................................................................................................... 10
Print ................................................................................................................................................ 10
Styring af LCD-display ................................................................................................................... 11
LYSFØLSOM MODSTAND....................................................................................................................... 12
Print ................................................................................................................................................ 12
Styring af lysfølsom modstand i assembler ..................................................................................... 14
POTMETER ........................................................................................................................................... 15
Print ................................................................................................................................................ 15
Styring af potmeter i assembler ...................................................................................................... 16
BROKOBLING ....................................................................................................................................... 17
Print ................................................................................................................................................ 17
Styring af brokobling i assembler ................................................................................................... 18
BEVÆGELSESFØLER ............................................................................................................................. 19
Print ................................................................................................................................................ 19
Styring af bevægelsesføler/knap i assembler .................................................................................. 20
ASSEMBLER METODER OG TEKNIKKER ................................................................................. 21
TIMER TEKNIKKER ............................................................................................................................... 21
INTERRUPT TEKNIKKER ........................................................................................................................ 21
METODE TIL LYSDÆMPNING: ............................................................................................................... 22
METODE TIL AT FADE OP OG NED FOR LYSNIVEAUET............................................................................ 22
SERIEL KOMMUNIKATION .................................................................................................................... 23
STYRE PROGRAM .................................................................................................................................. 24
PC-PROGRAM..................................................................................................................................... 26
KONKLUSION ..................................................................................................................................... 29
LITTERATURLISTE: ......................................................................................................................... 30
BØGER ................................................................................................................................................. 30
DATABLADE ......................................................................................................................................... 30
HJEMMESIDER:..................................................................................................................................... 30
3
ORDFORKLARING ............................................................................................................................ 31
APPENDIKS A...................................................................................................................................... 33
HC11 ................................................................................................................................................... 33
Porte................................................................................................................................................ 33
Lager ............................................................................................................................................... 33
Registre ........................................................................................................................................... 34
Timer ............................................................................................................................................... 34
APPENDIKS B...................................................................................................................................... 35
PROJEKT FORLØB: ................................................................................................................................ 35
FEBRUAR.............................................................................................................................................. 35
MARTS ................................................................................................................................................. 36
APRIL ................................................................................................................................................... 36
MAJ...................................................................................................................................................... 36
BILAG.................................................................................................................................................... 37
PRINTDIAGRAM .................................................................................................................................... 37
HC-11 FLOWCHARTS ........................................................................................................................... 37
HC-11 FLOWCHARTS ........................................................................................................................... 38
Main Loop ....................................................................................................................................... 38
Aflæs potmeter................................................................................................................................. 39
Dagslystest ...................................................................................................................................... 40
Bit check.......................................................................................................................................... 41
Fade loop ........................................................................................................................................ 42
Seriel Kommunikation..................................................................................................................... 43
Motiondetector ................................................................................................................................ 44
Send status (komplet) ...................................................................................................................... 45
Send Status (automatisk)................................................................................................................. 46
Baselevel ......................................................................................................................................... 47
ActiveLevel ...................................................................................................................................... 48
Fade ned.......................................................................................................................................... 49
Fade op ........................................................................................................................................... 50
Timer 1 Interrupt............................................................................................................................. 51
Timer 2 Interrupt............................................................................................................................. 52
Timer 3 Interrupt............................................................................................................................. 53
HC-11 KILDETEKST.............................................................................................................................. 54
PC-PROGRAM KILDETEKST................................................................................................................... 65
VARIABEL LISTE................................................................................................................................... 71
DATABLADE ......................................................................................................................................... 72
4
Problemstilling
Der skal konstrueres en HC11 styret lysdæmper. Lysdæmperen skal have følgende egenskaber:
•
•
•
•
Tænde lyset når sollyset er under et vist niveau og slukke når det er over.
Skrue op for lysniveauet, når en person træder ind i bevægelsesfølerens område over et givent
tidsrum og omvendt.
Aktuelle oplysninger skal kunne aflæses på et indbygget LCD-display.
Tids- og niveau-konstanter skal kunne ændres fra en PC via en RS232-forbindelse.
Projektet løses så lysdæmperen virker, som det ses på fig. 1. Fig. 2 er udgangspunktet for selve
projektet.
Fig. 1
Fig. 2
5
Løsningsmetode
Oprindeligt var der lagt op til at løse projektet ud fra fig. 2. Dog stødte vi ret hurtigt på problemer med
nulgennemgangsdetektoren og triac’en, i det vi ikke kunne få nogle af delene til at trigge som planlagt.
Derfor tog vi udgangspunkt i en alternativ løsningsmetode, givet af vores vejleder. Dog er store dele af
projektet konsistent med det oprindelige oplæg.
En lysfølsom modstand sættes op og kobles til bit 1 på port E på HC11. Derefter sættes et potmeter op
som reference og kobles til bit 0 på port E. De to værdier som kommer ind på port E sammenlignes nu i
programmet og er spændingen fra den lysfølsomme modstand større end den fra potmeteret, vil der
blive sendt signal til en transistor, som er koblet til bit 0 på port B. Når transistoren får et logisk 1, (5
V), fra HC11, vil den åbne og der er nu gennemgang i en brokobling, hvortil der er koblet en 24 V
strømforsyning i serie med en pære. Er transistoren åben vil pæren tænde. Men da pæren skal lyse med
forskellig styrke, er vi nødt til at lave pulsbreddemodulering styret fra HC11. Dette gøres ved at tænde
og slukke pæren hurtigt efter hinanden. Alt efter bredden på disse pulser, vil pæren lyse med forskellig
styrke. En bevægelsesføler (knap) sættes nu op og tilsluttes bit 2 på port E. Aktiveres knappen vil der
blive sendt et logisk 1 til HC11 og lysniveauet vil nu hæve sig fra niv1 til niv2. Dette gøres ved at
definere en tæller, som holder styr på niveauet på lyset ud fra tiderne Rise Time (tid1), Hold Time
(tid2), og Fall Time (tid3, som vi bruger i stedet for tid1). Efter en tid, tid 2, vil lyset igen dæmpe sig til
niv1. LCD-displayet kobles til port C og bit 5, 6 og 7 på port B. Til LCD-displayet skrives nu de data,
som ønskes oplyst til brugeren.
Selve assembler programmet er opbygget med et main-loop hvor fra de enkelte subrutiner og interrupts
kaldes fra, til de forskellige dele af processen.
6
Lysdæmpningens funktionsmåde:
Pulsbreddemodulation:
Hvert sekund er delt op i 400*2500 = 1 000 000 dele, hver på 1µs.
1
sekund indeholder en positiv og en negativ puls, hver med en bredde fra 1 til 2500 * 1µs.
400
Bredden bestemmes af variablen CurrentLevel. Vi bruger to timere til at styre pulsbreddemodulationen.
1
sekund, og tænder pæren. Dermed sørger den for den opadgående
Timer 1 trigger altid hvert
400
CurrentLevel
flanke. Timer 2 sættes til en værdi på
[s] for bredden på den positive puls. Den slukker
1000000
pæren, og sørger dermed for den nedadgående flanke.
Hver
CurrentLevel =1:
1
Pulsbredde=
[s]
1000000
1 [s]
Fig. 3
CurrentLevel=1700:
1700
Pulsbredde=
[s]
1000000
1 [s]
Fig. 4
7
Stigning og fald i lysstyrke:
Når bevægelsesføleren trigges skal lysstyrken gradvist skrues op på højt niveau. Der skal den holdes i
et vist tidsrum, for derefter gradvist at blive dæmpet til normalt niveau igen. Tiderne styres ved hjælp
af de tre variable RiseTime, HoldTime og FallTime.
Niveauet styres ved hjælp af BaseLevel, ActiveLevel, CurrentLevel og LevelStep. BaseLevel
indeholder værdien for det normale niveau og ActiveLevel er højt niveau. CurrentLevel er det
nuværende niveau, og LevelStep bestemmer hastigheden for stigning og fald.
Dagslys (Lys slukket)
Lys tændt (ActiveLevel)
Normalt niveau (BaseLevel)
Stigetid [s]
(RiseTime)
Holdetid [s]
(HoldTime)
Faldtid [s]
(FallTime)
Fig. 5
Da tiderne samt forskellen mellem CurrentLevel og ActiveLevel, samt mellem BaseLevel og
ActiveLevel er kendte kan vi regne os frem til hvor meget hver positiv puls skal hhv. forøges og
formindskes:
( ActiveLevel − BaseLevel)
( BaseLevel − ActiveLevel )
eller LevelStep =
afhængig af om
RiseTime * 400
FallTime * 400
der er tale om stigning eller fald i niveauet. Idet der i er 400 pulser pr. sekund ganges tiden med 400.
For hver puls forøges eller formindskes CurrentLevel med LevelStep:
LevelStep =
CurrentLev el = CurrentLev el + LevelStep , idet LevelStep er negativ ved fald i lysstyrken.
8
Print
Selve printet er et forsøgsprint med en standard DIN41612 konnektor påmonteret, nærmere betegnet en
Apfel RF64acR, så sammenkobling med HC11-kit er mulig. Påmonteret dette print er alle de
komponenter, som vi bruger til at løse projektet. Alle disse komponenter er delt ind i delkredsløb. Alle
delkredsløb har et afsnit tilknyttet, hvor selve printdelen er beskrevet, samt en assemblerdel. Der er
følgende afsnit:
•
•
•
•
•
LCD-display
Lysfølsom modstand
Potentiometer
Brokobling
Bevægelsesføler
Hver del beskriver hvordan komponenterne er sat sammen og hvordan de er koblet til HC11 og de
andre delsystemer. Hele printet kan ses på printdiagram i bilag sektionen.
9
LCD-display
Print
LCD-displayet er den delkomponent, som sikrer at vi kan vise informationer om den proces der foregår
inde i HC11. Selve displayet er skruet fast til printet og de 14 pins på displayet er forbundet til HC11
på følgende måde:
1. GND til stel.
2. V5 til Vcc
3. Vdd til et 10 kΩ multiturn-trimmepotmeter som spændingsdeler.
4. RS til PB5
5. R/W til PB6
6. E til PB7
7. DB0 til PC0
8. DB1 til PC1
9. DB2 til PC2
10. DB3 til PC3
11. DB4 til PC4
12. DB5 til PC5
13. DB6 til PC6
14. DB7 til PC7
De første 3 ben er strømdelen af displayet. Vdd bruges til at kontrollere spændingen til kontrasten i
LCD-displayet. Pin 4 til 6 er kontrol ben til displayet. De sidste 8 pins er databussen, hvor data til selve
displayet sendes. Opsætningen af LCD-displayet ses på fig. X
Fig. 6
10
Styring af LCD-display
Til at kontrollere LCD-displayet har vi fra Ib Refers hjemmeside hentet en driver, der er implementeret
i vores hoved-assemblerprogram. I denne driver er der udover initialiseringen af variabler og masker, to
subrutiner, LCDinit og mem2LCD, der køres, når der skal skrives til LCD-displayet. Den første
LCDinit er, som navnet antyder, til at initialisere displayet, altså sætte registre op, for at gøre displayet
klar til at blive skrevet til.
Mem2LCD er så til at overføre den ønskede tekst til LCD-displayet. LCDinit skal kun køres en gang,
hvorefter man kan skrive tekststrenge til displayet med mem2LCD-subrutinen så mange gange man vil
i programmet. Den tekst som man ønsker at udskrive skal skrives i en 32 byte konstant kaldet screen.
Men da rutinen ikke hele tiden udskriver hvad der står i screen, er det nødvendigt at kalde mem2LCD
hver gang man vil lave en ændring på displayet. LCD-displayet er et to liniers display, hvor der kan
være 16 tegn per linie, så i screen må man tage højde for dette når man ønsker at skrive i displayet.
Tegn 0-15 er linie 1, og tegn 16-32 er linie 2.
De bits på udgangene, der er brugt i LCD-driveren er de samme, som vi har valgt at bruge på vores
print, så det har ikke været nødvendigt at modificere driveren i den retning.
Dog har vi modificeret rutinen mem2LCD lidt. Vi har fjernet linien ldy #screen i mem2LCD, som
bestemmer at teksten skal hentes fra screen, så vi selv har kunnet bestemme hvor teksten skal hentes
fra. Så hver gang vi ønsker at kalde rutinen mem2LCD, skal y-registret sættes til at pege på den adresse
hvorfra teksten ligger.
Assembler-eksempel på at skrive en tekst til LCD-displayet:
tekst
fcc "Tekst som skal
.
.
ldy
jsr
.
.
skrives til LCD "
#tekst
mem2LCD
11
Lysfølsom modstand
Print
Den lysfølsomme modstand er den komponent der bruges som reference til, hvornår lyset skal tændes
på laveste niveau, niv1. Ideen bag en lysfølsom modstand er, at den enten øger eller mindsker sin
modstand, alt efter hvor stor lysstyrke den udsættes for. I vores tilfælde bruger vi en modstand, som
øger sin modstand jo mørkere det bliver. Dette illustreres på fig. X.
Fig. 7
Dog er denne illustration ikke konsistent med virkeligheden, da praktiske forsøg viser at man ved fuldt
sollys kan få modstanden helt ned på omkring 50 Ω. Den lysfølsomme modstanden sættes op i en
spændingsdeler med en modstand på 6,2 kΩ. Selve kredsløbet ses på fig. X.
Fig. 8
12
Størrelsen af modstanden er afgjort ud fra hvor meget spænding HC11 skal have. Ved fuld mørke skal
der sendes et signal på 0 V til HC11 og ved fuld lys skal den sendes et signal på 5 V til HC11. Metoden
som vi brugte til at finde frem til modstandens størrelse, var den gode gamle ”prøve-sig-frem”-metode,
hvor vi lavede en testopstilling, med en dekade modstand. Den modstandsværdi, hvor alt passede bedst
sammen, valgte vi at bruge. Grunden til denne fremgangsmåde, er at vi ikke havde nogen konkrete data
på den lysfølsomme modstand, da det ikke har vist sig mulig at fremskaffe et datablad.
Til beregning af den spænding som HC11 vil modtage, ved forskellige værdier af den lysfølsomme
modstand, bruges ligning X til at beregne spændingen over R3, da dette er nemmest, da dette er i
forhold til stel.
R3
RLDR + R3
Lig. 1
V = Vcc
Ved at indsætte de værdier som den lysfølsomme modstand kan antage, vil HC11 modtage et signal
mellem 0 V og 5 V. Forskellige værdier er beregnet i tabel 1.
RLDR
50 Ω
500 Ω
1 kΩ
6 kΩ
1 mΩ
2 mΩ
R3
6,2 kΩ
6,2 kΩ
6,2 kΩ
6,2 kΩ
6,2 kΩ
6,2 kΩ
Vcc
5V
5V
5V
5V
5V
5V
Tabel 1
V
4,98 V
4,97 V
2,46 V
0,69 V
0,37 V
0,04 V
Selve størrelsen af R3 kunne sagtens have været anderledes, men vi skulle undgå at afsætte for meget
effekt i HC11.
Når modstandens værdi er fundet sættes det hele op og delsystemet tilsluttes HC11 til bit 1 på port E og
værdierne for sollyset kan nu aflæses i HC11.
13
Styring af lysfølsom modstand i assembler
Assemblerdelen til at måle en lysfølsom modstand er ikke særligt kompliceret. For at kunne tjekke
signalet fra den lysfølsomme modstand, er det først nødvendigt at sætte bit 7 i OPTION-registret for at
starte A/D systemet. Bit 4 og bit 5 i ADCTL-registret sættes for at konverterer det analoge signal til
digital form. Efter at registrene er sat, kan man aflæse porten ved at læse port e bit 1 ind en af
akkumulatorerne, eller ind i x eller y registret. Port e bit1 har adressen $1032 og betegnes ADR2.
Assembler-eksempel på at læse fra en lysfølsom modstand:
regbase
adctl
option
adr2
equ
equ
equ
equ
$1000
$30
$39
$32
ldx
bset
ldaa
staa
#regbase
option,x %10000000
#%30
adctl,x
init
.
.
ldaa adr2,x
.
.
; bit 7 saettes i option
; bit 4 & 5
; saettes i adctl
; load adr2 i akk. a
14
Potmeter
Print
Potmeteret er vores reference til hvornår vi skal have vores pære tændt på niv1. Potmeteret er en
variabel modstand, som kan antage værdier fra 0 Ω til 10 kΩ, lineært. De to ende terminaler er sat
henholdsvis til stel og Vcc. Den tredje terminal er sat til bit 0 på port E. Potmeteret kan derved sende
signal fra 0 V til 5 V til HC11. Selve opsætningen kan ses på fig. 9.
Fig. 9
Selve potmeteret virker som en spændingsdeler, i det de to ender på hver side af den variable terminal,
kommer til at virke som to modstande. Dette gør at størrelsen på selve potmeteret ikke har nogen
egentlig betydning, dog skal det have en vis størrelse, så man ikke trækker for mange ampere igennem
HC11. Hvis potmeteret bliver for lille, vil det trække så mange ampere, at der er mulighed for at selve
HC11 kan brænde af, pga. for stor effektafsættelse. Størrelsen på potmeteret er taget ud fra at der sidder
to 10 kΩ skydemodstande på standardboardet til HC11.
Til beregning af værdien for spændingen som kommer ind i HC11, bruges ligning 1. Dog kaldes
modstandene noget andet, her henholdsvis RHØJRE og RVENSTRE. Tabel 2 viser nogle forskellige værdier
af spændingen til HC11 for forskellige værdier af modstandene. Vi beregner over den modstand der er
sluttet til stel for nemheds skyld.
RHØJRE
0Ω
500 Ω
1 kΩ
2 kΩ
5 kΩ
10 kΩ
RVENSTRE
10 kΩ
9,5 kΩ
9 kΩ
8 kΩ
5 kΩ
0 kΩ
Vcc
5V
5V
5V
5V
5V
5V
Tabel 2
V
5V
4,75 V
4,50 V
4,00 V
2,50 V
≈0,00 V
Signalet fra potmeteret kommer ind i HC11 og sammenlignes med den værdi der kommer fra vores
lysfølsomme modstand. Denne værdi kan være mellem 0 og 255, idet den spænding som kommer på
porten, som er mellem 0 V og 5 V, sendes igennem HC11’s A/D-konverter, som igen sender en værdi
mellem 0 og 255 videre til selve HC11, svarende til den tilhørende spænding.
15
Styring af potmeter i assembler
Da potmeteret er sluttet til port e bit 0, er rutinen til at læse fra potmeteret næsten den samme som
rutinen for den lysfølsomme modstand. Ligesom i rutinen for den lysfølsomme modstand sættes Bit 7 i
OPTION-registret, bit 4 og bit 5 sættes i ADCTL-registret. Derefter kan potmeterets værdi læses på
adresse $1031. Adresse $1031 benævnes også som ADR1.
Assembler eksempel for læsning af potmeter:
regbase
adctl
option
ADR1
equ
equ
equ
equ
$1000
$30
$39
$31
ldx
bset
ldaa
staa
#regbase
option,x %10000000
#$30
adctl,x
init
.
.
ldaa adr1,x
.
.
; bit 7 saettes i option
; bit 4 & 5
; saettes i adctl
; load adr1 i akk. a
16
Brokobling
Print
Selve brokoblingen, BK, er en diodebro, indeholdende 4 dioder, som gør det muligt at lave pulserende
jævnstrøm. Men selve brokoblingsdelen på vores print indeholder også en transistor, T. Selve vores
kredsløb er bygget op som set på fig. 10.
Fig. 10
Der kommer et signal fra HC11, som kommer ind i T, via modstanden Rb. Dette gør at T åbner og
strømmen fra vores 24 V strømforsyning, kan løbe i det lukkede kredsløb, med BK, T og pæren. Dette
giver en pulserende jævnstrøm, se fig. 11, med en peak værdi på 24 V.
Fig. 11
Modstanden R1 er sat ind i systemet, for ikke at brænde transistoren af. Den transistor som vi bruger
kan max holde til at få 5 V på base benet og da der kommer 5 V fra HC11 vil der være overhængende
fare for at transistoren står af. Derfor er der sat en modstand ind til at tage en del af spændingen.
Grunden til at brokoblingen i det hele taget er sat ind er, at transistoren kun leder en vej og da ACspænding kommer i begge veje, er vi nød til at ensrette denne strøm og dette gøres vha. brokoblingen.
På denne måde kan vi styre om pæren skal være tændt eller slukket. For at kontrollerer hævning og
sænkning af lyset, når der kommer signal fra bevægelsesføleren, vil vi bruge pulsbreddemodulering.
Selve brokoblingsdelen er koblet til HC11 via bit 0 på port B, samt til stel.
17
Styring af brokobling i assembler
Da brokobling kun kræver en DC-spænding ind i transistoren for at tænde pæren, så kræver det i
assembler ikke andet end at sætte bit 0 I port B høj. De forskellige lysniveauer sættes med timerdelays
som er beskrevet senere. Assembler eksempel på at sætte bit 0 på port b højt
regbase
portb
bit0
equ
equ
equ
$1000
$04
%00000001
.
.
bset portb,x bit0
.
.
18
Bevægelsesføler
Print
I et ideelt tilfælde ville vi bruge en bevægelsesføler til vores projekt til at detektere, når en
person kommer forbi og der dermed skal skrues op for lyset. Men da denne komponent ikke er
til rådighed, har vi til formålet påmonteret en sluttekontakt, som skal give sig ud for en
bevægelsesføler. Når kontakten sluttes vil et signal på 5 V sendes til HC11 på bit 2 på port E.
Kontakten er sat i serie med en modstand for ikke at afsætte al effekten i HC11. Selve
opsætningen kan ses på fig. 12.
Fig. 12
Denne del af det store print er nok det mest simple, men dog lige så vigtig som alle andre
komponenter. Da denne kontakt skal starte hele den proces, som kittet skal udføre.
19
Styring af bevægelsesføler/knap i assembler
For at tjekke om en kontakt eller knap er trykket ind er meget nemt i HC11’erens assembler, normalt
bliver knapper og kontakter tilsluttet til Port C, da denne port har den egenskab at dens signal kan gå
begge veje. På port c kan man have 8 knapper tilsluttet. Hver knap har et bit hver, som så kan tjekkes.
Men da hele port c bliver brugt til LCD-displayet i vores løsning, har vi sat knappen på port e, bit 2. At
læse en knap på port e bit 2 er en smule mere kompliceret end at læse en knap på port c. Da port e er
HC11’erens indbyggede A/D-konverter får man en værdi fra 0-255. I en perfekt verden ville man få
255 når knappen var trykket ned, og 0 når den ikke trykket. Men i vores knap så perfekte verden fås der
en værdi mellem 0-150 når knappen ikke er trykket, til gengæld fås der 255 når knappen trykkes ned.
For at forhindre at knappen udløser sig selv har vi valgt at sige at alle værdi under 240 er lig med at
knappen ikke er trykket ned. Normalt ville man have delt på midten og sagt at fra 0-127 ville svare til
at knappen ikke var trykket, og 128-255 ville svare til at knappen var trykket ned. Desuden skal
knappen sættes op lige som potmeteret og den lysfølsomme modstand, altså bit 7 sættes i OPTIONregistret, bit 4 og bit 5 sættes i ADCTL. Bit 2 på port e benævnes ADR3
Eksempel på hvordan man tjekker en knap tilsluttet port e bit 2:
regbase
adctl
option
adr3
equ
equ
equ
equ
$1000
$30
$39
$33
ldx
bset
ldaa
staa
#regbase
option,x %10000000
#$30
adctl,x
init
.
.
ldaa adr3,x
cmpa #240
bhs knap_trykket
.
.
knap_trykket
.
.
; bit 7 saettes i option
; bit 4 & 5
; saettes i adctl
; load adr3 i akk. a
;
; er vaerdien over 240?
; naar knappen er trykket hoppes
; der
; her ned
20
Assembler metoder og teknikker
Timer teknikker
Den timer teknik som vi benytter os af kaldes Output Compare. Output Compare fungerer ved at man
har sin hovedtimer, TCNT, der hele tiden tæller op, hvilket den har et 16 bits register til. At det er 16
bits gør at man maksimalt kan sætte et timerdelay til at vare den tid det tager main timeren at køre
FFFF16 værdier igennem. Når vi sætter vores timerdelay gøres det ved hjælp af interrupts. Når man vil
sætte et interrupt så indlæser man den værdi TCNT skal have, når man vil stoppe i et TOC register.
Eksempelvis TOC2. Når man så vil sætte et bestemt interval, så tager man værdien i TCNT og lægger
f.eks. 200 til og gemmer det i TOC2 registeret. Når timeren så har kørt 200 værdier igennem, og TCNT
er lig TOC2, så bliver der trigget et interrupt tilhørende TOC2. Dette interrupt bliver trigget ved at der i
registeret TFLG1 bliver sat et bit højt, der tilhører det timer register man bruger.
For at dette skal fungere skal man initialisere timerinterrupts i registrene TCTL1 og TMSK1. TCTL1
kontrollerer hvordan de forskellige bit i TFLG1 skal reagere når TCNT når den ønskede værdi. TMSK1
kontrollerer om der skal trigges et interrupt på det tilhørende bit i TFLG1. Eksempelvis tilhører bit6 i
TFLG1 TOC2 registeret. Hvis bit 6 i tmsk1 er sat, så vil TOC2 interruptet blive trigget når bit 6 er høj i
TFLG1. Er bittet tmsk1 ikke sat høj, så vil værdien i TFLG1 stadig blive høj, men det vil ikke trigge et
interrupt. Dette muliggør at man kan bruge timeren uden interrupt ved at tjekke på TFLG1 bittene.
Dette er dog ikke hensigtsmæssigt i vores tilfælde, da vi ønsker et meget præcist timerdelay, hvilket
godt kan forstyrres, hvis vi skal vente på at assemblerprogrammet når til den del, hvor der tjekkes på
TFLG1.
Interrupt teknikker
Et interrupt er en rutine, der kaldes (trigges), når der sker noget bestemt. Dette kan for eksempel være
et signal på en port eller en timer trigger. Når et interrupt bliver trigget, så gemmes program-counteren
og de forskellige registre på stakken, hvor efter rutinen køres. Når rutinen er slut, så lægges de gemte
værdier fra stakken tilbage og programmet fortsætter hvor den slap.
For at et interrupt kan trigges, er det nødvendigt at initialiserer interrupt rutinen. Første skal
interruptvektortabellen sættes op. Det betyder at HC11’eren skal vide, hvilken rutine der skal køres, når
interruptet trigges. Der næst skal man huske at sætte CLI kommandoen i sit program, så interrupts er
mulig. Modsat kan kommandoen SEI sættes i programmet, så interrupts ikke er mulig. Heraf følger, at
man selv er herre over hvornår interrupts ønskes i programmet. Ved et interrupt, hoppes til
interruptvektoren, hvor adresse på selve interruptet er. For eksempel ligger TOC2 på adressen FFE6 og
FFE7. Når man så vil sætte dette interrupt, lægges adressen på denne i føromtalte adresse med en FDB
kommando, hvori rutinens navn lægges. Denne lægges så fra FFE6. F. eks:
ORG
FDB
$FFE6
TOC2_ISR
Ved et interrupt, vil bittet der tilhører TOC2 i TLFG registeret, bliver sat høj og interruptet vil blive
trigget. Herefter vil programmet gemme registre på stakken og hoppe til den pågældende interrupt
21
rutine. I dette tilfælde til TOC2_ISR. ISR står for Interrupt Service Rutine og det er skik at kalde sine
interrupt rutiner for xxx_ISR.
For at afslutte en interrupt rutine og vende tilbage til programmet, benyttes RTI kommandoen. Denne
kommando, gendanner alle registre fra stakken
Metode til lysdæmpning:
Ved lysdæmpningen bruger vi to timer output compare registre, TOC2 og TOC3. TOC2 vil være det
timerdelay, der afgør tiden fra puls til puls, eller høj til høj. TOC3, vil så afgøre pulsbredden og dermed
lysstyrken. Tiden for TOC3 hentes fra variablen lstyrke. Lstyrke er altså den værdi, der bestemmer
pulsbredden og dermed lysstyrken.
Dette gøres således at når TOC2 bliver trigget, så vil der i interrupt rutinen blive sat en ny tid for både
TOC2 og TOC3, hvor TOC3 er mindre end TOC2. Samtidig vil pæren blive tændt og vi sørger for at
bittet for TOC2 bliver sat lav i TFLG1. At dette gøres er vigtigt, for, hvis dette bit stadig er højt, når
interrupt rutinen forlades, så vil interruptet blive trigget med det samme igen.
Fig. 13
Når programmet først startes vil TOC2 blive initialiseret, men bittet i tmsk1 bliver sat lav. Så når man
ønsker pæren tændt sætter man bit 6 i tmsk1 og TOC2 bliver trigget og tænder pæren og sætter TOC2
og TOC3 igen og så kører pulsbreddemoduleringen. Når pæren ønskes slukket sættes bit 6 i tmsk1 til
lav igen og TOC2 kan ikke trigge et interrupt og pæren holder op med at lyse igen.
Metode til at fade op og ned for lysniveauet
I det interrupt der trigges af TOC2 bliver der lagt en værdi, levelstep til lstyrke-værdien. Denne værdi
er til at starte med 0, så pærens styrke forbliver det samme. Når assemblerprogrammet registrerer et
tryk på knappen (bevægelsesføleren), så vil levelstep blive sat til 1, eller en højere værdi, hvis man
skulle man ønske at fade op hurtigere. Så vil der hver gang man kører TOC2 blive lagt 1 til
pulsbredden. I mainloopet tjekkes der så om pulsbredden har nået det tilladte maksimum (Activelevel).
Er dette tilfældet, så vil levelstep blive sat til nul igen, og der startes et tredje timerinterrupt på TOC4,
der igen initialiserer sig selv, så det bliver trigget med et bestemt interval. Når dette timerinterrupt
bliver tændt, så lægges der 1 til variablen count. Denne værdi nulstilles, når der registreres at knappen
er trykket. I mainloopet bliver der tjekket om denne værdi har nået sit maksimum og er det tilfældet, så
22
sættes levelstep til -1 og der fades ned igen. Count angiver så den tid hvor lysstyrken er på activelevel.
Igen bliver der tjekket på lstyrke-værdien og er den lig baselevel, så sættes levelstep igen til 0. Herfra
forbliver lysstyrken den samme indtil der igen trykkes på knappen, eller at den lysfølsomme modstand
når et niveau, så pæren slukkes helt.
Det at count nulstilles ved tryk på knappen betyder at hvis der er bevægelse i længere tid vil lyset
forblive på activelevel, da count er længere tid om at nå sit maks. Denne maks værdi kan så indstilles,
så activelevel er holdt i længere tid. Det samme kan levelsteps, så fade op og ned går hurtigere.
Seriel Kommunikation
I vores program skal vi kunne overskrive vores variable og tænde og slukke for pæren via vores serielle
port, som er af standarden RS232. I starten af vores program initialiseres de tilhørende registre. Baud
sætter overførselshastigheden.
Selve overførselen starter med at tjekke bit 5 på SCSR registeret. Hvis denne er 0, så er der ikke noget
data til at føre ind og programmet går ud af rutinen. Hvis denne bit er 1, så går programmet videre og
indlæser den værdi, der venter på den serielle port. Variablen InBuf er et array af bytes. InBufPtr er en
pointer, der angiver hvor i arrayet man skriver til. Derfor lægges adressen til InBuf sammen med
værdien af InBufPtr, så man har adressen på den byte InBufPtr peger på. I denne adresse gemmes så
akkumulator A, hvor værdien fra den serielle port er gemt. Derefter incrementeres InBufPtr.
Værdien i akk. B er så InBufPtr. Der blive så trukket 1 fra den, så akk B peger på den værdi, der lige er
indlæst. Derefter tjekkes der om denne værdi er lig med nogle forudbestemte værdier. Er den ikke lig
med den første værdi i programmet hoppes der videre og der tjekkes der på den næste og så videre
indtil den kommer til en gældende værdi. Når en gældende værdi opnås, så sættes der nogle
forudbestemte bit i registeret opt, ikke at forveksle med Option-registeret der er et fast register i hc11.
Opt er et register vi selv har reserveret.
Er værdien af det første bit 72, så sættes bit 1 og 7 og bit 0 cleares. Er værdien 73, så cleares bit 1 og bit
7 og 0 sættes. Er værdien 74, så cleares bit 1, 0 og 7. Ved værdien 75 cleares bit 1 og 0, og bit 7 sættes.
Ved 81 er der ingen ændringer. Ved 91 sættes nye værdier for potlevel, lstyrke, maxima, levelsteppos,
maxc og levelstepneg. Disse læses fra henholdsvis plads 1 til 6 i InBuf. Da disse værdier skal lægge i
InBuf, så tjekkes der også om InBufPtr er lig 7, hvilket den vil have hvis der ligger værdier fra 0
Når der er tjekket for 91 så hoppes tilbage til starten af den serielle rutine. Er den første værdi ikke en
af de nævnte, så vil det ikke være en gyldig kommando ud fra vores definition. Dette er en måde at
sortere ”fejlforsendelser” fra. Altså er den første værdi ikke en af de ovennævnte, så må vi konkludere
at det ikke er en vi har sendt.
23
Styre program
Programmet startes med initialisering af konstanter og variabler, samt opsætning af A/D-konverter og
timer-interrupt. Derefter initialiseres LCD-displayet og timerne sættes.
Her efter starter hoved-løkken, kaldet mainloop. I denne kaldes 4 subrutiner efter hinanden og laver
derefter en branch til starten af løkken.
Den første subrutine, der bliver kaldt er fadeloop, der tjekker om hvorvidt, der skal holdes den
nuværende lstyrke værdi eller der skal fades op eller ned. Dette fungerer ved først at tjekke om hvorvidt
lstyrke-værdien er højere end eller lig med maxima, og hvis den er det, så hoppes der til hold. Hvis ikke
den er så hopper programmet tilbage i hovedløkken, og programmet fortsættes.
I hold skrives der først til LCD-displayet at denne tilstand er opnået. Hvis den er det, så hoppes der til
fadened. Hvis ikke, så aktiveres TOC4 i timer masken, så interruptet kan trigges. Derefter lægges 0 ind
i levelstep og programmet hopper tilbage i hovedløkken
I fadened skrives der ligeledes ind i LCD-displayet at den pågældende tilstand er nået. Derefter lægges
-1 ind i levelstep, hvilket gør at der fades ned, og derefter hopper programmet tilbage i hovedløkken.
Den næste subrutine, pe01test tjekker om hvorvidt potmeterværdien er højere end værdien for den
lysfølsomme modstand. Hvis dette er tilfældet så hoppes der til taend. Hvis ikke, så sættes bit 6 i
TMSK1 til nul, hvilket gør at TOC2 ikke kan trigges og derefter slukkes pæren. Så indlæses teksten
case1 i LCD-displayet. Derefter hoppes der tilbage til hovedløkken.
Hoppes der til taend, så sættes TMSK1 bit 6 til høj, hvilket gør at TOC2 kan trigges og dermed tændes
pæren med den nuværende dæmpning, der er angivet i lstyrke. Der hoppes derefter tilbage til
hovedløkken.
Subrutinen knaptest tjekker, som navnet antyder om bevægelsesføleren/knappen er trykket. Dette gøres
ved at indlæse værdien fra port e bit 2 i akkumulator a, hvorefter der sammenlignes med F016. Er
værdien lavere end F016 så er knappen ikke trykket, og der hoppes tilbage til hovedløkken. Er den
derimod lig med eller højere, så hoppes der til fadetaend, som først indlæser teksten case3 i LCDdisplayet. Derefter indlæses 1 i levelstep og count sættes lig nul. Dette gør at pæren fader op indtil
lstyrke når maxima, som det er beskrevet ovenover. Det at count nulstilles hver gang knappen trykkes
gør at hvis knappen trykkes mens at der fades ned, så vil der blive fadet op selvom pæren er i gang med
at fade ned. Er den i hold, så vil counteren bliver nul og activelevel vil holdes længere. Dette er i god
overensstemmelse med at lave en bevægelsesstyret lysdæmper, hvor man jo ønsker at lyset forbliver
tændt, hvis der er en fortsat bevægelse. Derefter hoppes tilbage til hovedløkken.
Når knaptest subrutinen er overstået, så starter hovedløkken forfra.
24
Tekstliste til LCD-display
Tekst Nr.
1
2
3
4
5
Linie
1
2
1
2
1
2
1
2
1
2
Tekst
Dimmer Off
Ref. Level
Dimmer On
Light Low
Dimmer On
Light Rising
Dimmer On
Light High
Dimmer On
Light Falling
Tabel 3
25
PC-program
Fig. 14
Til kontrol af kittet har vi skrevet et program i Borland Delphi. I programmet sættes værdier for
stige(Rise Time)-, holde(HoldTime)- og faldtider(Fall Time) for lysstyrken ved trigning af
bevægelsesføleren samt værdier for overstyring af potentiometeret (Reference Level) og lysniveau ved
drift i mørke(Idle Level), når bevægelsesføleren ikke er trigget, samt lysniveau ved drift når
bevægelsesføleren ER trigget(Active Level). Desuden indeholder det visning af status for kittet. Disse
værdier omfatter niveau for potentiometers faktiske værdi(Reference Level), lysføler(LDR Level),
normal(Idle Level)- og driftsniveauer(Active Level),stige-, holde- og faldtider for lysstyrken, samt om
bevægelsesføleren er trigget. Der vises også status for om kittet er sat i tvungen tilstand. Der er ved
hjælp af en række knapper mulighed for at tvinge kittet i en række tilstande:
26
•
•
•
•
•
Lights On – Lyset tændes på max. niveau uanset hvad.
Lights Off – Lyset slukkes uanset hvad.
Normal Operation – Sætter kittet tilbage i normal funktionsmåde, hvor Reference Level styres
af potentiometeret.
Normal Op. W Ref. Override – Som ovenfor, men hvor potentiometerets værdi overstyres af
PC-programmet.
Status Request – Beder kittet om at sende komplette statusværdier – dem der er vist i Status
vinduet (kommando 83 – se nedenfor).
Kittet sender automatisk en række statusværdier til programmet (kommando 82 – se nedenfor). Disse
værdier omfatter:
•
•
•
•
Reference Level – Potentiometerets værdi.
LDR Level – Lysfølerens værdi.
Motion Detector – Om bevægelsesføleren er trigget.
Override Mode – Om kittet befinder sig i tvungen tilstand.
Der er også mulighed for at sætte diverse parametre for den anvendte serielle port. Efter indstillingerne
er foretaget aktiveres den serielle port med Enable-knappen.
Programmet kommunikerer med kittet ved hjælp af en seriel forbindelse i form af kommandoer, både
med og uden parametre. Se Variabelliste i bilags sektionen.
27
Kommando
LightsOn
LightsOff
NornalOp
NormalOpWRefOverride
StatusRequest
SendStatus (automatisk)
(Fra HC11-kittet)
Kode
72
73
74
75
81
82
SendStatus (komplet)
83
(Fra HC11-kittet)
SendSetup
91
Parametre
Ingen
Ingen
Ingen
Ingen
Ingen
ReferenceLevel
LDRLevel
StatusBits
ReferenceLevel
LDRLevel
IdleLevel
ActiveLevel
RiseTime
HoldTime
FallTime
StatusBits
OverrideLevel
IdleLevel
ActiveLevel
RiseTime
HoldTime
FallTime
Tabel 4
Format
Byte
Byte
Bitmap (1 byte)
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Bitmap (1 byte)
Byte
Byte
Byte
Byte
Byte
Byte
Desværre virker den serielle kommunikation med kittet ikke. Vi har talkeren undermistanke for at
blokere den serielle port. PC-programmet virker som det er, idet vi har testet det op imod et andet
program kørende på en anden PC forbundet med et null-modemkabel. En anden ting der heller ikke
fungerer er tilbagemeldinger fra kittet til PC-programmet. Dette skyldes den ekstremt lille mængde fri
hukommelse i kittet. Vi har været nødt til at barbere den del af koden væk for at få det til at køre.
Uheldigvis opnåede vi først den erkendelse mindre end seks timer før deadline, hvorfor vi har
koncentreret os om rapportskrivningen. IOT-kittet udvidet med en A/D-konverter ville måske være
bedre egnet til løsningen af denne opgave. Den nuværende udgave af HC11 med sine 256 byte RAM er
ganske utilstrækkelig.
28
Konklusion
Vi har valgt at bruge en lidt alternativ løsning til at tænde pæren med brokoblingen, men det har vist sig
at fungere udmærket til formålet. Vi har til lysdæmpning valgt at bruge timerinterrupts, hvilket også
har givet et ret tilfredsstillende resultat.
I problemformuleringen var den tid det tog at fade op og den tid det tog at fade ned benævnt som den
samme. Vi har i vores løsning valgt at sætte to konstanter. Vi mener dog ikke det er noget problem at
skulle ændre værdien to steder. Vi har også med succes fået udskrevet tilstande på et LCD-display.
Vores serielle kommunikation har voldt nogle problemer, men vi mener at selve programdelen fungerer
som det skal i både assembler og på pc, da tests i simulator fungere som forventet og ønsket, og at det
er en indstilling i talkeren, der låser for kommunikation med den serielle port.
En enkelt bug i vores program er at når der er for meget bevægelse, altså hvis knappen trykkes for ofte
i activelevel, så blinker pæren på en uhensigtsmæssig måde.
Set bort fra disse fejl mener vi at vi har løst opgaven så den ligger meget tæt op ad det ønskede resultat.
29
Litteraturliste:
Bøger
Han-Way Hang
MC68HC11 An Introduction – Software and Hardware Interfacing
Thomson Learning
2001, 2nd Edition
ISBN 0-7668-1600-1
Steven E. Schwarz & William G. Oldham
Electrical Engineering: An Introduction
Oxford University Press
1993, 2nd Edition
ISBN 0-19-510585-0
Datablade
Brokobling – BR3505
Transistor – BD139
LCD – JM162A
Hjemmesider:
http://www.iot.dk/jjm/adsen/
http://www.iot.dk/ir/index1.htm
30
Ordforklaring
A/D-konverter:
Omdanner en spænding til en digital
værdi.
Ampere, A:
Enhed hvori strømmen i et elektrisk
kredsløb måles.
Assembler:
Primitivt programmeringssprog, som i
abstraktionsniveau ligger lige over
maskinkode. Bruges oftest til at
programmere mikroprocessorer.
Bit:
Mindste del i hukommelsen. Kan antage
værdien 0 eller 1.
Brokobling:
Også kaldt diodebro. Bruges til at
ensrette vekselspænding, til pulserende
jævn-spænding.
Bus:
Samling af ledninger, som alle er sluttet
til samme enhed, så data kan flyttes.
Byte:
8 sammenhørende bit.
CPU:
Central Processing Unit.
DIG:
Kurset Digitalteknik, som følges på 1.
og 2. semester på IOT, som en del af
uddannelsen
til
civilingeniør
i
datateknologi.
Diode:
Elektrisk komponent, som kun kan lede
strøm en vej.
Effekt, W:
Mål for hvor meget energi der afsættes i
en elektrisk komponent.
ELA:
Obligatorisk elektronik kursus, som
følges på 1. semester på IOT, som led i
uddannelsen
til
civilingeniør
i
datateknologi.
HC11:
1 MHz mikroprocessor fra Motorola,
indeholdende timere, A/D-konverter,
EEPROM, RAM og I/O-porte, så
kommunikation med eksterne enheder
er mulig.
Interrupt:
Subrutine som udføres straks den
trigges.
LCD-display:
Liquid Crystal Display. Display som
virker ved at påvirke flydende krystaller
med spænding.
Lysfølsom modstand:
Modstand vis modstand afhænger af
hvor meget lys den udsættes for.
Ohm, Ω:
Enhed til måling af modstand.
Pin:
Ben på digitalt enhed, hvor igennem et
digitalt signal kan sendes.
Port:
Er et antal ben som er sluttet til CPU’en,
hvor der kan sendes og/eller modtages
signaler i form af 0 og 1.
Potmeter:
Variabel modstand. Kan bruges både
som
ren
modstand
eller
som
spændingsdeler.
Print:
Epoxyglasfiber,
med
pådampet,
fortinnet kobberfilm, hvorpå det er
muligt at lodde.
Pulsbreddemodulering:
Regulering af bredde på elektriske
pulser.
RAM:
Random Access Memory. Hukommelse,
hvor der både kan skrives i og læses fra.
Register:
En defineret del af hukommelsen, der
bruges til at gemme data eller
hukommelsesadresser.
RS232:
Serielkommunikations standart, til brug
31
ved seriel kommunikation mellem
computere.
Spændingsdeler:
Serie af to eller flere modstande, hvor
spændingen deles over modsandene.
Subrutine:
Underprogram.
Timer:
Tæller.
Transistor:
Komponent, som leder ved påførsel af
et eksternt signal.
Volt, V:
Mål for spænding i elektriske kredsløb.
32
Appendiks A
HC11
Selve HC11, består af flere dele. I dette afsnit vil vi gennemgå de vigtigste ting for projektet.
Porte
HC11-kittet er i besiddelse af flere forskellige slags porte.
•
•
•
•
•
Port A:
o Timer port, med 3 input-, 3 output- og 2 I/O-pins. Bruges til eksternt at styrer HC11’s
timere, når ting skal sammenlignes i en tælle proces.
Port B:
o Er en output only port. Dvs. at det kun er muligt at sende data ud af denne port og ikke
modtage data. Denne port bruges oftest til at styrer eksterne enheder.
Port C:
o Er en in/output port, hvor det er muligt både at sende og modtage signaler. Denne port
bruges oftest til digitalt input fra eksterne enheder, men også til styring af eksterne
enheder.
Port D:
o Seriel kommunikations port. Denne port bruges til at kommunikerer med HC11 fra en
PC, men også fra andre eksterne enheder.
Port E:
o Porten er indgangen til HC11’s A/D-konverter. Denne port bruges når analogt input fra
eksterne enheder, skal konverteres til digital form.
Lager
HC11 er i besiddelse af 256 byte ram, som står brugeren frit for at bruge. Dog er det begrænset hvor
meget et evt. program i dette område kan fylde. Desuden er HC11 i besiddelse af 2 kilo byte lagerplads.
Det meste af denne lagerplades er til rådighed for brugeren. I vores tilfælde, kan vi ikke bruge fra FE00
til FFFF, da det er her Talkeren er installeret. Desuden indeholder dette område en interrupt vektor.
Denne interrupt vektor ligger til allersidst i hukommelsen fra FFC0 til FFFF.
33
Registre
Selve HC11 CPU er i besiddelse af en del registre. En stor del af disse registre, kommer sjældent i
brug, dog bruger vi registrene til A/D-konvertering og til timerne.
Når selve HC11 programmeres bruger men dataregistrene. Disse er som følgende:
•
•
•
•
•
Akkumulator A og B:
o Begge er 8 bit registre, som kan forenes til et 16 bit register, kaldet D, double
accomulator. Bruges oftest til at lagre værdier i.
X og Y register:
o Begge 16 bits registre. Bruges oftest til at sætte offset, til brug ved RAM adressering.
PC register:
o 16 bit register, kaldet programcounter. Bruges til at holde styr på, hvor i koden der
afvikles kode. Ændres normalt ikke af brugeren, kun af branch og jump kommandoer.
SP register:
o 16 bit register, kaldet stackpointer. Bruges til at holde styr på, hvor i stakken sidste
værdi er lagret. Ændres normalt ikke af brugeren.
CCR register:
o 8 bit register, kaldet Condition Code Register. Indeholder oplysninger om sidste brugt
værdi. Bruges oftest ved matematiske beregninger. Sætter HC11 i stand til at regne.
Ændres sjældent af brugeren.
Timer
HC11 er også i besiddelse af en timer. I CPU forstand, er der ikke tale om en enhed der kan holdestyr
på tiden. Den rigtige benævnelse burde være, tæller, da timeren bare er en tæller, hvor man ved hvor
lang tid den er om at tælle et bestemt antal.
Tilknyttet timeren er der et antal registre, som bruges når selve timerfunktionen skal bruges. For i det
hele taget at bruge timeren, er det nødvendigt at starte den. Dette gøres ved at sætte de rigtige bits i de
tilhørende kontrol, maske og flag registre. Når dette er gjort, vil timeren give interrupts. Til brug med
timeren, hører der et antal sammenlignings registre. Disse registre sættes til en værdi, som er højere end
den som tælleren er ved. Når timeren har talt op til den værdi der står i sammenlignings registret, vil
der komme et interrupt, som så kan bruges til at trigge, f.eks. et ur, en pærer osv.
34
Appendiks B
Projekt forløb:
Projektet er tiltænkt at forløbe i 5 faser:
1. Planlægning:
a. Fremstilling af tidsplan.
b. Diagram over print
c. Skematisk oversigt over assemblerprogrammer til HC11.
d. Skematisk oversigt af PC-program til kommunikation mellem PC ogHC11.
2. Fremstilling af print.
3. Programmering af HC11.
4. Fremstilling af kommunikations software til PC.
5. Skrivning af rapport.
Følgende tidsplan blev fremstillet:
•
•
•
•
Februar:
o Oplæg til projekt fremlagt af Jørgen Jeppe Madsen.
o Skematisk fremstilling af print og assemblerprogram.
o Start på fremstilling af print.
Marts:
o Print laves færdig.
o Assembler-programmering påbegyndes.
April:
o Assembler-programmering gøres færdig.
o PC-program skrives.
Maj:
o Rapport skrives.
o Hardware og software testes og debugges.
Februar
Februar startede med at vi fik projektoplægget og fik gennemgået hvordan et projekt af denne størrelse
skulle foregå og struktureres, for at opnå et optimalt resultat.
Vi startede med at følge vores tidsplan, hvor vi lavede skematiske oversigter over vores print og over
hvordan vi havde tænkt os, at HC11 skulle programmeres. Hele denne fase gik efter planen og blev
afsluttet medio februar. Herefter gik vi i gang med at fremstille printet. De første par delkredsløb, kom
på og vi fik dem til at virke med HC11, men da vi kom til de delkredsløb som skulle sættes til HC11
A/D-konverter, begyndte problemerne at opstå.
35
Marts
Det meste af marts måned gik med at få de forskellige delkredsløb, som skulle sluttes til A/Dkonverteren til at virke. Efter næsten 3 uger uden at komme videre og uden at kunne finde fejlen, som
drillede, kom løsningen som et lyn fra en klar himmel. En anden gruppe havde haft det samme
problem, dog i knap så lang tid som os. Det viste sig at vi havde glemt at sætte en reference spænding
til VRL, Reference Low, hvilke A/D-konverteren behøver, for at kunne foretage en A/D-konversion.
Efter at dette problem var løst, fortsatte de med de næste kredsløb. Vi delte nu holdet op i to dele, hvor
den ene arbejdede på nulgennemgangsdetektoren og den anden på selve triac delen. Men vores
problemer stoppede ikke her. Hverken triac eller optokobler kunne vi få til at trigge. Men som om dette
ikke var nok, så brændte vores COM-port på vores PC også af. Det var startskuddet til en halvanden
måned lang kamp, for at få vores PC til at virke. IOT var dog ikke til megen hjælp. Den eneste hjælp vi
fik fra IOT’s computeransvarlig, var et indstikskort, som efter lang tids afprøvning ikke virkede. I
samme forbindelse fik vi afprøvet ca. 10 HC11-kit, for at se om det var dem der var noget i vejen med,
men gang på gang viste det sig at de virkede på alle andre PC’ere end vores egen. Problemet med
COM-porten blev først løst hen ad april, da et af de andre hold opgav deres projekt og vi fik lov til at
låne deres PC.
April
Igennem det meste af april arbejdede vi på triac- og nulgennemgangs-delen, dog uden at komme
væsentligt videre. Til sidst opgav vi denne del af projektet og begyndte at bruge det alternative
kredsløb, som vi måtte bruge, i tilfælde af, at triac-delen voldte for mange problemer. Dette kredsløb
fik vi til at virke med det samme og vi kunne nu endelig komme videre. Ved at bruge det alternative
kredsløb, kunne vi også undvære nulgennemgangsdetektoren, og styre lysniveauet ved at bruge
pulsbreddemodulation i stedet. Herefter fik vi monteret et LCD-display og dermed var selve printet var
færdig. Nu manglede vi bare at få alle delene til at spille sammen med central styring fra HC11. Vi fik
rimeligt hurtigt de enkelte delkredsløb til at virke hver for sig. Nu bestod problemet i at få alle de
enkelte kredsløb til at spille sammen.
Maj
I starten af maj begyndte vi at skrive vores rapport, samtidig med at vi stadig bøvlede med HC11-delen.
Men også PC-softwaren begyndte vi på. Sammensætning af programmet, gik fint, men problemerne
opstod da vi ville implementere selve lysdæmpnings-rutinerne. Det viste sig nemlig at det som vi
tidligere havde lavet og som virkede fint alene, ikke virkede med selve hoved-programmet. Dette
problem arbejdede vi med helt op til afleveringen, men fik det dog løst. Det meste af maj måned brugte
vi på at skrive rapport, finde og lave bilag. Rapporten var færdig søndag aften inden vi skulle aflevere
næste middag.
36
Bilag
Printdiagram
37
Start
HC-11 Flowcharts
Sæt variable+
initialisering
Main Loop
Start LCD
Start A/Dkonverter
Sæt timer4=
0,1 ms
Initialiser Serielt
Kommunikation
Dagslystest
J
OverrideMode
=1?
N
Aflæs
Potmeter
Bit Tjek
Fade Loop
Serielt In- &
Output
MotionDet.
38
Aflæs potmeter
Start
Aflæs potmeter
Gem værdi i
POTlevel
Stop
39
Dagslystest
Start
LDR<POT
J
Timer 2=On
N
Timer 2 =
Off
Lys Off Bit = 1
Stop
40
Bit check
Start
Lys Off bit=1?
J
LightOff
J
LightOn
N
Lys On bit=1?
N
Stop
41
Fade loop
Start
CurrentLevel=
ActiveLevel?
J
N
CurrentLevel=
BaseLevel?
J
N
Hold
BaseLevel
Stop
42
Seriel Kommunikation
Start
Data i Seriel
Ind?
J
N
Læs Data;
Gem i
InBuf[InBufPtr];
InBufPtr++;
OutBufPtr>
OutBufOrg?
N
LightOn=True;
OverrideMode=True;
LightOff=False;
Timer=Disabled;
J
InBuf[1]=72?
J
J
Seriel Ud tom?
J
Send OutBuf
[OutBufOrg]
N
Fra OutBufOrg:
Gentag OutBufPtrOutBufOrg-1
gange:
InBufPtr>
InBufOrg?
N
LightOn=False;
OverrideMode=True;
LightOff=True;
Timer=Disabled;
J
OutBuf[tæller]=
OutBuf[tæller+1]
InBuf[1]=73?
N
LightOn=False;
OverrideMode=Fals
e;
LightOff=False;
Timer=Enabled;
J
Løkke slut;
OutBufPtr--;
InBuf[1]=74?
N
LightOn=False;
OverrideMode=True;
LightOff=False;
Timer=Enabled;
J
InBuf[1]=75?
N
N
SendStatus
(automatisk)
InBuf[1]=81?
J
SendStatus
(komplet)
N
InBuf[1]=91?
N
J
InBufPtr=8?
J
OverrideLevel=InBuf[2];
IdleLevel=InBuf[3];
ActiveLevel=InBuf[4];
RiseTime=InBuf[5];
HoldTime=InBuf[6];
FallTime=InBuf[7];
InBufPtr=InBufOrg;
N
Stop
43
Motiondetector
Start
Knap trykket?
J
Fade op
N
Stop
44
Send status (komplet)
Start
OutBuf[OutBufPtr]=83;
OutBuf[OutBufPtr+1]=PotLevel;
OutBuf[OutBufPtr+2]=LDRLevel;
OutBuf[OutBufPtr+3]=IdleLevel;
OutBuf[OutBufPtr+4]=ActiveLevel;
OutBuf[OutBufPtr+5]=RiseTime;
OutBuf[OutBufPtr+6]=HoldTime;
OutBuf[OutBufPtr+7]=FallTime;
OutBuf[OutBufPtr+8].Bit[1]=MotionLight;
OutBuf[OutBufPtr+8].Bit[2]=OverrideMode;
OutBufPtr+=9;
Stop
45
Send Status (automatisk)
Start
OutBuf[OutBufPtr]=82;
OutBuf[OutBufPtr+1]=PotLevel;
OutBuf[OutBufPtr+2]=LDRLevel;
OutBuf[OutBufPtr+3].Bit[1]=MotionLight;
OutBuf[OutBufPtr+3].Bit[2]=OverrideMode;
OutBufPtr+=4;
Stop
46
Baselevel
Start
LCD - Skriv
Tekst 2
LevelStep=0
Stop
47
ActiveLevel
Start
LCD - Skriv
Tekst 4
Count=
HoldTime?
N
Genstart Timer 4
J
Fade Ned
LevelStep=0
Stop
48
Fade ned
Start
LCD - Skriv
Tekst 5
LevelStep=
LevelStepNeg
Stop
49
Fade op
Start
LCD - Skriv
Tekst 3
LevelStep=
LevelStepPos
Count =0
Stop
50
Timer 1 Interrupt
Timer 1
IRQ Start
Tænd Pære
Timer2=
CurrentLevel +
LevelStep
Genstart Timer 2;
Genstart Timer 1
(100ms);
IRQ Stop
51
Timer 2 Interrupt
Timer 2
IRQ Start
Sluk Pære
IRQ Stop
52
Timer 3 Interrupt
Start
Count++
Timer 4
genstartes
Stop
53
HC-11 kildetekst
***************************************************************************
*
*
*
Lysdæmper v1.0 Alpha By Hold 9 A.K.A. Misser & Pirat + det løse *
*
*
***************************************************************************
**************
* Bit masker *
**************
bit0
bit1
bit2
bit3
bit4
bit5
bit6
bit7
alle
timerbit
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
%00000001
%00000010
%00000100
%00001000
%00010000
%00100000
%01000000
%10000000
%11111111
%01010100
; Alle bit
; Enable timer interrupt
***********
* Offsets *
***********
regbase
equ
$1000
equ
equ
equ
equ
equ
equ
equ
equ
$0e
$18
$1a
$1c
$23
$22
$24
$20
* Timer *
tcnt
toc2
toc3
toc4
tflg1
tmsk1
tmsk2
tctl1
; Timer Counter Register
; Timer Output Compare Register 2
; Timer Output Compare Register 3
; Timer Output Compare Register 4
; Timer Flag Resister 1
; Timer Mask Register 1
; Timer Mask Register 2
; Timer Control Register 1
* Porte *
54
portb
portc
equ
equ
$04
$03
; Port B
; Port C
$30
$31
$32
$33
$39
; A/D-converter Control Register
; Port E bit 0
; Port E bit 1
; Port E bit 2
; A/D-converter Option Register
* A/D-konverter *
adctl
pe0
pe1
pe2
option
equ
equ
equ
equ
equ
* LCD-display *
DDRC
LCDlin1
LCDlin2
LCDclr
LCDhome
LCDinc
LCDdec
LCDon
LCDoff
LCDleft
LCDrght
CURon
CURoff
CURblk
CURleft
CURrght
LCDCG
LCDfn
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ $07
; Data Direction Port C
$80
; Linie 1 position 1
$C0
; Linie 2 position 1
$01
; Clear display, cursor home
$02
; Cursor home, DDram u‘ndret
$06
; Cursor increment mode
$04
; Cursor decrement mode
$0C
; Display on
$08
; Display off
$18
; Skift display til venstre
$1C
; Skift display til højre
$0E
; Display on, cursor on
$0C
; Display on, cursor off
$0F
; Display on, cursor blink
$10
; Flyt cursor til venstre
$14
; Flyt cursor til højre
$40
; CGRAM start adresse
%00111000 ; LCD function (opsætning)
; 8 databit; 2 linier og
; font = 5x7 dots
* Seriel *
InBufOrg
OutBufOrg
BAUD
SCCR1
SCCR2
CR1_INI
CR2_INI
baud_ini
SCSR
EQU 0
EQU 0
EQU $2B
EQU
EQU
EQU
EQU
EQU $30
EQU $2E
$2C
$2D
$00
$0C
55
SCDR
TDRE
RDRF
EQU $2F
EQU $80
EQU $20
*************
* Variabler *
*************
org
* Lysdæmpning *
lstyrke
toc2time
levelsteppos
levelstep
levelstepneg
levelstep0
maxima
low
toc4time
count
maxc
opt
fdb
fdb
fdb
fdb
fdb
fdb
fdb
fdb
fdb
fdb
fdb
fcb
$0000
0400
2500
0001
0000
-0001
0000
2400
0400
0100
0000
0050
%00000000
; Lysstyrken
; Timer 2 compare værdi
; Step ved fade op
; Aktuel stepværdi
; Stepværdi ved fade ned
; Steværdi ved hold
; Max. lysniveau
; Min. lysniveau
; Timer 4 compare værdi
; Hold counter
; Hold counter max.
* Seriel *
InBuf
InBufPtr
POTLevel
LDRLevel
FDB
FCB
FCB
FCB
$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
0
0
0
* Tekst til LCD-display *
case1
case2
case3
case4
case5
fcc
fcc
fcc
fcc
fcc
"Dimmer off
"Dimmer on
"Dimmer on
"Dimmer on
"Dimmer on
"
Light low
"
Light rising "
Light high "
Light falling "
*************************************
* Initialisering af interruptvector *
*************************************
org
fdb
$ffe6
toc2_isr
; Timer 2 interrupt vector
56
org
fdb
org
fdb
$ffe4
toc3_isr
$ffe2
toc4_isr
; Timer 3 interrupt vector
; Timer 4 interrupt vector
****************
* Main program *
****************
org
$f800
ldx
jsr
ldy
jsr
bset
ldaa
staa
bclr
bset
ldd
addd
std
#regbase
LCDinit
; Initialisering af LCD-display
#case1
mem2LCD
; Visning på LCD-display
option,x bit7 ; Initialisering ad A/D-konverter
#$30
adctl,x
portb,x bit0 ; sluk paeren
tctl1,x timerbit ; Aktivering af timere
tcnt,x
; Timer 4 sættes
toc4time
toc4,x
start
SerialSetup
LDAA #baud_ini
STAA BAUD,X
LDAA #CR1_INI
STAA SCCR1,X
LDAA #CR2_INI
STAA SCCR2,X
cli
* Mainloop *
mainloop
main3
main2
brclr
bsr
bra
bsr
jsr
bsr
bra
opt bit7 pe0read
pe01test
optchk
fadeloop
QSIF
knaptest
mainloop
* Sub-rutiner *
57
optchk
brset
brset
bra
opt bit0 lightoff ; Tjek om lys skal slukkes
opt bit1 lighton ; Tjek om lys skal tændes
main2
ldx
ldy
jsr
jsr
bclr
bra
#regbase
#case1
LCDinit
mem2LCD
opt bit0
mainloop
ldx
ldy
jsr
jsr
ldd
std
bclr
bra
#regbase
#case4
LCDinit
mem2LCD
maxima
lstyrke
opt bit1
main2
ldx
ldaa
staa
bra
#regbase
pe0,x
POTLevel
main3
ldx
ldaa
cmpa
blo
bset
bclr
rts
#regbase
pe1,x
POTLevel
; Sammenligner potmeter og LDR
taend
; Tænd lyset, hvis true
opt bit0
tmsk1,x bit6 ; Timer 2 interrupt deaktiveres
ldx
bset
rts
#regbase
tmsk1,x bit6 ; Timer 2 interrupt aktiveres
lightoff
; Tekst på LCD-display
; Clear sluk bit
lighton
; Tekst på LCD-display
; Sæt lys til max
; Clear tænd bit
pe0read
; Aflæs potmeter
pe01test
taend
knaptest
ldx
#regbase
ldaa pe2,x
cmpa #$F0
; Er knappen trykket??
58
bhs
rts
fadetaend
ldy
jsr
ldd
std
ldd
std
rts
#case3
mem2LCD
levelsteppos
levelstep
#0000
count
ldd
cpd
bhs
cpd
bls
rts
lstyrke
maxima
hold
low
holdlow
ldx
ldy
jsr
ldd
cpd
bhs
bset
ldd
std
rts
#regbase
#case4
mem2LCD
; Tekst på LCD-display
count
; Er holdtime færdig??
maxc
fadened
tmsk1,x bit4 ; Timer 4 interrupt aktiveres
levelstep0
; Levelstep sættes til 0
levelstep
ldy
jsr
ldd
std
rts
#case5
mem2LCD
; Tekst på LCD-display
levelstepneg ; Levelstep sættes negativ
levelstep
ldy
jsr
ldd
std
rts
#case2
mem2LCD
levelstep0
levelstep
fadetaend
; Tekst på LCD-display
; Levelstep positiv
; Hold counter initialiseres
fadeloop
; Er fadeop færdig??
; Er fadened færdig
hold
fadened
holdlow
; Levelstep sættes til 0
59
* LCD-Display rutine *
*************************************************
*
* Følgende rutiner er lavet af:
*
* Ib Refer
Rev: 23. nov. 1999
* Rettet af Rasmus Maagaard Rev: 10. apr. 2001
* Modifiseret af Hold 9
Rev: 25. maj. 2003
*
*************************************************
LCDinit
ldx
bset
bclr
ldaa
jsr
jsr
jsr
jsr
jsr
jsr
ldaa
jsr
ldaa
jsr
ldaa
jsr
rts
#regbase
DDRC,x alle
; port C = udgange
portb,x %11100000
; register-mode/Write-mode
#LCDfn
; l‘g ops‘tning i acc.A
LCDreg
; og send den til LCD
wait5ms
; vendt 5 ms
LCDreg
; og send den til LCD
wait5ms
; vendt 5 ms
LCDreg
; og send den til LCD
wait5ms
; vendt 5 ms
#LCDon
; LCD on og cursor off
LCDreg
; send komando til LCD
#LCDclr
; clear display
LCDreg
; send komando til LCD
#LCDinc
; cursor increment mode
LCDreg
; send komando til LCD
; returner
LCDreg
jsr LCDchk
bclr portb,x bit5
bra LCDsend
; check LCD busy-flag
; g† i register-mode
; send data
LCDdata
jsr LCDchk
; check LCD busy-flag
bset portb,x bit5
; g† i ASCII-mode
LCDsend bset DDRC,x alle
; port C = udgang
bclr portb,x bit6
; g† i write-mode
staa portc,x
; send data til port C
bra LCDen
; enable-puls til LCD
LCDchk
60
bclr
bclr
bset
bset
nop
brset
bclr
rts
DDRC,x alle
portb,x bit5
portb,x bit6
portb,x bit7
; port C = indgang
; g† i register-mode
; g† i read-mode
; enable LCD
; pause (en E-clock)
portc,x bit7 *
; vent til busy-flag=lavt
portb,x bit7
; disable LCD
; returner fra sub.
LCDen
bset portb,x bit7
nop
bclr portb,x bit7
rts
; enable LCD
; (puls p† mindst 500ns)
; disable LCD
; returner fra sub.
wait5ms
pshx
ldx #612
w5ms1 nop
nop
dex
bne w5ms1
pulx
rts
; skub x-reg. ud p† stakken 4
; l‘g 612 i X-reg.
3
; gennemf›r
2!
; loopet (8,138 us)
2!
; 612 gange
3!
; 8,138us x 612 = 4,98 ms 3!6120
; hent x-reg. fra stakken 5
;
ialt 6132
mem2LCD
ldab #16
ldaa #LCDlin1
jsr LCDreg
jsr lin2LCD
ldab #16
ldaa #LCDlin2
jsr LCDreg
lin2LCD ldaa 0,y
jsr LCDdata
iny
decb
bne lin2LCD
rts
; l‘g linie counter i acc.B
; g† til linie 1 pos 1
; send kommando til LCD
; send en linie data til LCD
; l‘g linie counter i acc.B
; g† til linie 2 pos 1
; send kommando til LCD
; hent data fra memory
; send data til LCD
; increment Y
; decrement acc.B
; er linien skrevet? (acc.B=0)
; returner fra sub.
* SERIAL *
tmp
rts
QSIF
61
LDX #regbase
BRCLR
SCSR,X RDRF tmp
; Tjek om der er noget i register
GSC
LDAA SCDR,X
LDAB InBufPtr
LDX #InBuf
ABX
STAA 0,X
INCB
STAB InBufPtr
BRA QIBE
; Gem byte fra seriel i buffer
TSE
JMP
SE
QIBE
LDAB InBufPtr
CMPB #InBufOrg
BEQ TSE
DECB
QCC72
LDX #InBuf
LDAA 0,X
CMPA #72
BNE QCC73
bset opt bit1
bset opt bit7
bclr opt bit0
JMP QSIF
QCC73
CMPA #73
BNE QCC74
bclr opt bit1
bset opt bit7
bset opt bit0
JMP QSIF
QCC74
CMPA #74
BNE QCC75
bclr opt bit1
bclr opt bit7
bclr opt bit0
; Er buffer tom?
; Find kommando der er sendt
; Sæt tænd bit
; Sæt override bit
; Clear sluk bit
; Find kommando der er sendt
; Clear tænd bit
; Sæt override bit
; Sæt sluk bit
; Find kommando der er sendt
; Clear tænd bit
; Clear override bit
; Clear sluk bit
62
JMP
QSIF
QCC75
CMPA #75
BNE QCC91
bclr opt bit1
bset opt bit7
bclr opt bit0
JMP QSIF
QCC91
CMPA #91
LDAB InBufPtr
CMPB #7
BNE SE
LDAB #1
LDX #InBuf
ABX
LDAA 0,X
STAA POTLevel
LDAA 1,X
STAA lstyrke
LDAA 2,X
STAA maxima
LDAA 3,X
STAA levelsteppos
LDAA 4,X
STAA maxc
LDAA 5,X
STAA levelstepneg
BRA SE
; Find kommando der er sendt
; Clear tænd bit
; Sær override bit
; Clear sluk bit
; Find kommando der er sendt
; Sæt potmeterværdi
; Sæt nuværende lysværdi
; Sæt højt lysniveau
; Sæt fade op værdi
; Sæt holde tid
; Sæt fade ned værdi
SE
jmp
QSIF
*********************
* Interrupt rutiner *
*********************
toc2_isr
bset
bset
bset
ldd
addd
portb,x bit0
tflg1,x bit6
tmsk1,x bit5
tcnt,x
toc2time
; Pæren tændes
; Interrupt flag cleares
; Timer 3 interrupt aktiveres
; Timer 2 sættes
63
std
ldd
addd
std
ldd
addd
std
rti
toc2,x
tcnt,x
lstyrke
toc3,x
lstyrke
levelstep
lstyrke
; Timer 3 sættes
; Lysstyrke øges med levelstep
toc3_isr
bclr
bclr
bclr
rti
portb,x bit0
tflg1,x bit5
tmsk1,x bit5
; Pæren slukkes
; Interrupt flag cleares
; Timer 3 interrupt deaktiveres
toc4_isr
ldd
addd
std
ldd
addd
std
bclr
bset
rti
count
#1
count
tcnt,x
toc4time
toc4,x
tmsk1,x bit4
tflg1,x bit4
; Holdcounter inkrementeres
; Timer 4 sættes
; Timer 4 interrupt deaktiveres
; Interrupt flag cleares
64
PC-program kildetekst
unit PCprogram;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CPort, StrUtils, CPortCtl, Spin, IAgaloLED;
type
TMainForm = class(TForm)
ComPort1: TComPort;
GroupBox1: TGroupBox;
RefLevel: TEdit;
LDRLevel: TEdit;
RiseTime: TEdit;
HoldTime: TEdit;
FallTime: TEdit;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
LightsOn: TButton;
LightsOff: TButton;
NormalOp: TButton;
NormalOpCRef: TButton;
StatusReq: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
SendVal: TButton;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
65
Label17: TLabel;
Label18: TLabel;
GroupBox4: TGroupBox;
ComComboBox1: TComComboBox;
ComComboBox2: TComComboBox;
ComComboBox3: TComComboBox;
ComComboBox4: TComComboBox;
ComComboBox5: TComComboBox;
ComComboBox6: TComComboBox;
ComLedConnect: TComLed;
ComPortEnable: TButton;
ComLedRX: TComLed;
ComLedTX: TComLed;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Label27: TLabel;
Label28: TLabel;
Label29: TLabel;
ORRiseTime: TSpinEdit;
ORHoldTime: TSpinEdit;
ORFallTime: TSpinEdit;
MotionDetectorLED: TIAgaloLED;
OverrideModeLED: TIAgaloLED;
Label30: TLabel;
Label31: TLabel;
Label32: TLabel;
ORIdleLevel: TSpinEdit;
ORRefLevel: TSpinEdit;
ORActiveLevel: TSpinEdit;
Label33: TLabel;
Label34: TLabel;
IdleLevel: TEdit;
ActiveLevel: TEdit;
Label35: TLabel;
Label36: TLabel;
Label37: TLabel;
Label38: TLabel;
procedure ComPortEnableClick(Sender: TObject);
procedure LightsOnClick(Sender: TObject);
66
procedure LightsOffClick(Sender: TObject);
procedure StatusReqClick(Sender: TObject);
procedure NormalOpClick(Sender: TObject);
procedure NormalOpCRefClick(Sender: TObject);
procedure SendValClick(Sender: TObject);
procedure ComPort1RxChar(Sender: TObject; Count: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
RefLevelVal: Integer;
LDRLevelVal: Integer;
IdleLevelVal: Integer;
ActiveLevelVal: Integer;
RiseTimeVal: Integer;
HoldTimeVal: Integer;
FallTimeVal: Integer;
MotionDet: Boolean;
OverrideMode: Boolean;
InBuf :
Array[1..10] of Integer;
IBP:
Integer;
implementation
{$R *.dfm}
procedure TMainForm.ComPortEnableClick(Sender: TObject);
begin
ComPort1.Connected:=True;
end;
procedure TMainForm.LightsOnClick(Sender: TObject);
var
buffer: Integer;
begin
buffer:=72;
ComPort1.Write(buffer,1);
end;
67
procedure TMainForm.LightsOffClick(Sender: TObject);
var
buffer: Integer;
begin
buffer:=73;
ComPort1.Write(buffer,1);
end;
procedure TMainForm.StatusReqClick(Sender: TObject);
var
buffer: Integer;
begin
buffer:=81;
ComPort1.Write(buffer,1);
end;
procedure TMainForm.NormalOpClick(Sender: TObject);
var
buffer: Integer;
begin
buffer:=74;
ComPort1.Write(buffer,1);
end;
procedure TMainForm.NormalOpCRefClick(Sender: TObject);
var
buffer: Integer;
begin
buffer:=75;
ComPort1.Write(buffer,1);
end;
procedure TMainForm.SendValClick(Sender: TObject);
var
buffer: Integer;
begin
buffer:=91;
ComPort1.Write(buffer,1);
68
buffer:=(ORRefLevel.Value*255) div 100;
ComPort1.Write(buffer,1);
buffer:=(((ORIdleLevel.Value*230) div 100)+10);
ComPort1.Write(buffer,1);
buffer:=(((ORActiveLevel.Value*230) div 100)+10);
ComPort1.Write(buffer,1);
buffer:=ORRiseTime.Value;
ComPort1.Write(buffer,1);
buffer:=ORHoldTime.Value;
ComPort1.Write(buffer,1);
buffer:=ORFallTime.Value;
ComPort1.Write(buffer,1);
end;
procedure TMainForm.ComPort1RxChar(Sender: TObject; Count: Integer);
var
i: Integer;
temp: String;
begin
for i:=1 to Count do
begin
ComPort1.Read(InBuf[IBP],1);
IBP:=IBP+1;
end;
if (InBuf[1]=82) and (IBP=5) then
begin
RefLevelVal:=(((InBuf[2]-10)*100) div 230);
LDRLevelVal:=((InBuf[3]-10)*100)div 230;
MotionDet:=((InBuf[4]=1) or (InBuf[7]=3));
OverrideMode:=((InBuf[4]=2) or (InBuf[7]=3));
Str(RefLevelVal, temp);
RefLevel.Text:=temp;
Str(LDRLevelVal, temp);
LDRLevel.Text:=temp;
MotionDetectorLED.LedOn:=MotionDet;
OverrideModeLED.LedOn:=OverrideMode;
IBP:=1;
end;
if (InBuf[1]=83) and (IBP=10) then
begin
RefLevelVal:=((InBuf[2]*100) div 255);
69
LDRLevelVal:=(InBuf[3]*100)div 255;
IdleLevelVal:=(((InBuf[4]-10)*100) div 255);
ActiveLevelVal:=((InBuf[5]-10)*100)div 255;
RiseTimeVal:=InBuf[6];
HoldTimeVal:=InBuf[7];
FallTimeVal:=InBuf[8];
MotionDet:=((InBuf[9]=1) or (InBuf[7]=3));
OverrideMode:=((InBuf[9]=2) or (InBuf[7]=3));
Str(RefLevelVal, temp);
RefLevel.Text:=temp;
Str(LDRLevelVal, temp);
LDRLevel.Text:=temp;
Str(RiseTimeVal, temp);
RiseTime.Text:=temp;
Str(HoldTimeVal, temp);
HoldTime.Text:=temp;
Str(FallTimeVal, temp);
FallTime.Text:=temp;
MotionDetectorLED.LedOn:=MotionDet;
OverrideModeLED.LedOn:=OverrideMode;
IBP:=1;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
IBP:=1;
end;
end.
70
Variabel liste
Variabelnavn
PotLevel
LDRLevel
IdleLevel
ActiveLevel
OverrideLevel
BaseLevel
CurrentLevel
RiseLevelStep
FallLevelStep
RiseTime
HoldTime
FallTime
Format
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Startværdi
0
0
125
250
200
0
0
0
0
3
10
3
Kommentar
Læses fra PE0
Læses fra PE1
Sættes af PC-program
Sættes af PC-program
Sættes af PC-program
Programvariabel
Programvariabel
Programvariabel
Programvariabel
Sættes af PC-program
Sættes af PC-program
Sættes af PC-program
InBuf
InBufPtr
InBufOrg
OutBuf
OutBufPtr
OutBufOrg
Array af 10 Byte
Byte
Byte
Array af 10 Byte
Byte
Byte
0
InBufs 1. celle
InBufPtr
0
OutBufs 1. celle
OutBufPtr
10 sekventielle bytes i lageret
Den første byte i InBuf
Den første byte i InBuf
10 sekventielle bytes i lageret
Den første byte i OutBuf
Den første byte i OutBuf
PulseState
Rise
Hold
Fall
MotionDet
MotionLight
OverrideMode
LightOn
LightOff
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
Byte
1
0
0
0
0
0
0
0
0
Programvariabel
Programvariabel
Programvariabel
Programvariabel
Læses fra PE2
Programvariabel
Sættes af PC-program
Sættes af PC-program
Sættes af PC-program
71
Datablade
Brokobling – BR3505
Transistor – BD139
LCD – JM162A
- se vedlagte ark.
72
BR3505
RECTRON
THRU
SEMICONDUCTOR
TECHNICAL SPECIFICATION
BR3510
SINGLE-PHASE SILICON BRIDGE RECTIFIER
VOLTAGE RANGE 50 to 1000 Volts CURRENT 35 Amperes
FEATURES
*
*
*
*
Superior thermal desing
400 amperes surge rating
//
1/4 universal faston terminal
Hole thru for # 8 screw
MECHANICAL DATA
* UL listed the recognized component directory, file #E94233
* Epoxy: Device has UL flammability classification 94V-O
BR-35
MAXIMUM RATINGS AND ELECTRICAL CHARACTERISTICS
Ratings at 25 o C ambient temperature unless otherwise specified.
Single phase, half wave, 60 Hz, resistive or inductive load.
BR-35W
For capacitive load, derate current by 20%.
MAXIMUM RATINGS (At T A = 25 oC unless otherwise noted)
SYMBOL
BR3505
BR351
BR352
BR354
BR356
BR358
BR3510
UNITS
Maximum Recurrent Peak Reverse Voltage
VRRM
50
100
200
400
600
800
1000
Volts
Maximum RMS Bridge Input Voltage
VRMS
35
70
140
280
420
560
700
Volts
Maximum DC Blocking Voltage
VDC
50
100
200
400
600
800
1000
Volts
RATINGS
o
Maximum Average Forward Rectified Output Current at Tc = 55 C
Peak Forward Surge Current 8.3 ms single half sine-wave
IO
35.0
Amps
I FSM
400
Amps
T J, T STG
-55 to + 150
superimposed on rated load (JEDEC method)
Operating and Storage Temperature Range
0
C
ELECTRICAL CHARACTERISTICS (At TA = 25oC unless otherwise noted)
CHARACTERISTICS
SYMBOL
Maximum Forward Voltage Drop per element at 17.5A DC
Maximum Reverse Current at Rated
@T A = 25 oC
DC Blocking Voltage per element
@T C = 100 oC
NOTE: Suffix ”W” for wire type
VF
BR3505
BR351
BR352
BR354
BR356
BR358
BR3510 UNITS
1.1
Volts
5.0
uAmps
0.5
mAmps
IR
2002-8
RATING AND CHARACTERISTIC CURVES ( BR3505 THRU BR3510 )
FIG. 2 - TYPICAL FORWARD CURRENT
DERATING CURVE
FIG. 1 - MAXIMUM NON-REPETITIVE FORWARD
8.3ms Single Half Sine-Wave
(JEDEC Method)
400
300
200
100
0
INSTANTANEOUS FORWARD CURRENT, (A)
1
2
AVERAGE FORWARD CURRENT, (A)
500
50
40
30
20
FIG. 3- TYPICAL INSTANTANEOUS FORWARD
CHARACTERISTICS
100
10
TJ = 25
Pulse Width = 300us
1% Duty Cycle
1.0
.1
.01
1.2 1.3
.6
.7
.8
.9
1.0
1.1
INSTANTANEOUS FORWARD VOLTAGE, (V)
60 Hz RESISTIVE OR
INDUCTIVE LOAD
10
0
4 6 8 10
20
40 60 80100
NUMBER OF CYCLES AT 60Hz
0
INSTANTANEOUS REVERSE CURRENT, (uA)
PEAK FORWARD SURGE CURRENT, (A)
SURGE CURRENT
50
100
CASE TEMPERATURE, (
1.181 (30.0)
1.102 (28.0)
.673 (17.1)
.633 (16.1)
10
1.0
TJ = 25
.1
.01
0
20
40
60
80
100
AC
.543 (13.8)
BR-35
.452
MAX.
(11.5)
.042 (1.1)
DIA.
.080 (2.0)
TYP.
.591
MAX.
(15.0)
1.181 (30.0)
1.102 (28.0)
.033 x .250
(0.8 x 6.4)
HOLE FOR NO.
8 SCREW
1.181 (30.0)
1.102 (28.0)
AC
.732 (18.6)
.692 (17.6)
AC
.582 (14.8)
120
140
PERCENT OF RATED PEAK REVERSE VOLTAGE, ( % )
HOLE FOR
NO. 8 SCREW
1.181 (30.0)
1.102 (28.0)
.673 (17.1)
.633 (16.1)
AC
.732 (18.6)
.692 (17.6)
175
FIG. 4 - TYPICAL REVERSE CHARACTERISTICS
.452
MAX.
(11.5)
.480 (12.2)
.425 (10.8)
150
)
.468 (11.9)
.429 (10.9)
.732 (18.6)
.692 (17.6)
BR-35W
RECTRON
SPECIFICATION
Character Type Dot Matrix LCD Module
JM162A
SHENZHEN JINGHUA DISPLAYS CO.,LTD.
JINGHUA
JM162A
! GENERAL SPECIFICATION
Interface with 4-bit or 8-bit MPU(directly connected M6800 serial MPU)
Display Specification
Display Character: 16 characterX2line
Character Font:5X7dots+cursor
Display color-Display background color:
STN: Black-Yellow Green,Blue-Gray
Black-White
TN: Position,Negative
Polarizer mode: Positive,Negative;Reflective ,Transflective, Transmissive
Viewing angle: 6:00 OR 12:00
Display duty: 1/16
Driving bias: 1/5
Character Generator ROM (CGROM):8320 bits(192 characterX5X7 dots)&(32 character
X5X10 dots)
Character Generator RAM (CGRAM): 64 X 8 bits (8 charactersX5X8 dots)
Display Data RAM (DDRAM): 80X8 bits ( 80 characters max)
Mechanical characteristics (Unit:mm)
Extenal dimension 84.0X44.0X10.0 (15.0 for LED Backlight)
View area 61.0X15.8
Character font: 5X7dots+cursor
Character size 2.96X5.56
Dots size: 0.528X0.625
Character pitch 3.55X6.15
POWER: +5V power
2
JINGHUA
JM162A
! Optical Characteristics
(1) Definition of viewing Angle
TOP
TOP
BOTTOM
BOTTOM
(2) Definition of Contrast Ratio:
Reflectance value of non-selected state brightness
Contrast Ratio =
Reflectance value of selected state brightness
Test condition : standard A light source
(3) Response Time
Response time is measured as the shortest period of time possible between the change
in state of an LCD segment as demonstrated below
3
JINGHUA
JM162A
! External Dimension
4
JINGHUA
JM162A
! Absolute Maximum Ratings
Item
Conditio
n
Symbol
Supply Voltage for logic
Supply Voltage for LCD
Input Voltage
Operating Temperature(T)
Storage Temperature(T)
Operating Temperature(HT)
Storage Temperature(HT)
Operating Temperature(EHT)
Storage Temperature(EHT)
Vdd
V5
Vi
Top
Tstg
HTop
HTstg
EHTop
EHTstg
Ta=25
-
! Electrical Characteristics(Ta=25
Item
Standard Value
Unit
Min
Max
-0.3
Vdd-15.0
-0.3
0
-20
-20
-30
-30
-40
7.0
Vdd+0.3
Vdd+0.3
50
70
70
80
80
80
V
V
V
,Vdd=5.0V)
Symbol
Condition
Supply Voltage for logic
Vdd-GND
-
Supply Current for logic
Driving Current for LCD
Idd
Iee
Driving Voltage for LCD
Vdd-V5
Standard Value
Unit
Min
Type
Max
4.5
5.0
5.5
V
-
1.0
0.6
-
mA
mA
3.8
4.5
4.9
V
Vdd=5V
Input Voltage H level
Vih
2.2
-
Vdd
V
Input Voltage L level
Output Voltage “H”
Output Voltage “L”
Vil
Voh
Vol
-0.3
2.4
-
-
0.6
0.4
V
V
V
Ioh=-0.205mA
Iol=1.2mA
! Absolute Maximum Ratings For LED Backlight
PARAMETER
Supply Voltage
LED Forward
Consumption Current
LED Allowable
Dissipation
SYMBOL
CONDITION
MIN.
TYP.
MAX.
UNIT
VLED
If=200mA
-
4.2
-
V
If
Ta=25
Vf=4.2V
-
83
-
mA
Pd
-
-
350
-
mW
5
JM162A
JINGHUA
! Block Diagram
GND
Vdd
V5
RS
R/W
E
DB0~DB7
A
K
COM16
PANEL
16X2CHARACTER
LCD
SEG80
DRIVER
BACKLIGHT
LCD
LED
6
JINGHUA
JM162A
! Bus Timing
Write Mode Timing Diagram
Read Mode Timing Diagram
7
JINGHUA
JM162A
! AC Characteristics (Vdd=4.5V~5.5V,Ta=-30~+85
Mode
Characteristic
Symbol
Min.
Typ.
Max.
tC
500
-
-
tR,tF
-
-
20
E Pulse Width (High,Low)
tW
230
-
-
R/W and RS Setup Time
tSU1
40
-
-
R/W and RS Hold Time
tH1
10
-
-
Data Setup Time
tSU2
80
-
-
Data Hold Time
tH2
10
-
-
E Cycle Time
tC
500
-
-
tR,tF
-
-
20
E Pulse Width (High,Low)
tW
230
-
-
R/W and RS Setup Time
tSU
40
-
-
R/W and RS Hold Time
tH
10
-
-
Data Output Delay Time
tD
-
-
120
Data Hold Time
tDH
5
-
-
E Cycle Time
E Rise/Fall Time
Write Mode
E Rise/Fall Time
Read Mode
)
! IC Specifications
See The Reference of Samsung Data Book-----S6A0070(KS0070B)
8
Unit
ns
ns
JINGHUA
JM162A
! Pin assignment
Pin NO.
Symbol
Function
Remark
1
GND
2
Vdd
3
V5
4
RS
Register Select(H=Data,L=Instruction)
5
R/W
Read/Write L=MPU to LCM,H=LCM to MPU
6
E
Enable
7
DB0
Data bus bit 0
8
DB1
Data bus bit 1
9
DB2
Data bus bit 2
10
DB3
Data bus bit 3
11
DB4
Data bus bit 4
12
DB5
Data bus bit 5
13
DB6
Data bus bit 6
14
DB7
Data bus bit 7
15
A
Anode of LED Unit
16
K
Cathode of LED Unit
0V
Power supply
+5V
Variable
For LCD
! Reflector of Screen and DDRAM Address
Display position
1-1 1-2 1-3 1-4 1-5 1-6
DDRAM address
00
01
02
03
04
05
Display position
1-11 1-12 1-13 1-14 1-15 1-16
DDRAM address
0A 0B
0C 0D
0E
0F
Display position
DDRAM address
14
15
16
17
18
19
Display position
DDRAM address
1E
1F
20
21
22
23
Display position
2-1 2-2 2-3 2-4 2-5 2-6
DDRAM address
40
41
42
43
44
45
Display position
2-11 2-12 2-13 2-14 2-15 2-16
DDRAM address
4A 4B
4C 4D
4E
4F
Display position
DDRAM address
54
55
56
57
58
59
Display position
DDRAM address
5E
5F
60
61
62
63
“1-1” means first character of line 1 on screen
9
1-7
06
1-8
07
1-9 1-10
08
09
10
11
12
13
1A
1B
1C
1D
24
2-7
46
25
2-8
47
26
2-9
48
27
2-10
49
50
51
52
53
5A
5B
5C
5D
64
65
66
67
JINGHUA
JM162A
! Instruction Table
Instruction Code
Instruction
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
Clear Display 0
0
0
Return Home 0
0
0
Entry Mode
Set
0
0
0
Display
ON/OFF
Control
0
0
0
Cursor or
Display Shift
0
0
0
Function Set
0
0
0
0
0
0
0
0
1
0
1
BF
Write Data to
1
RAM
0
D7
1
D7
Set CGRAM
Address
Set DDRAM
Address
Read Busy
Flag and
Address
Read data
from RAM
1
Description
Write”20H” to DDRAM
0
0
0
0
0 0
1 set DDRAM address to
“00H” from AC
Set DDRAM address to
“00H” from AC and
return cursor to its
0
0
0
0
0 1
original position if
shifted. The contents of
DDRAM are not
changed
Assign cursor moving
0
0
0
0
1 I/D SH direction and enable the
shift of entire display
Set display(D)
0
0
0
1 D C B cursor(C) and blinking
of cursor(B) on/off
Set cursor moving and
display shift control
0
0
1 S/C R/L bit,and the direction,
without changing
DDRAM data
Set interface data
length(DL:8bit/4bit),
number of display line
0
1 DL N F
(N:2line/1line)
and,display font type
F:5X11dots / 5X8dots
Set CGRAM address in
1 AC5 AC4 AC3 AC2 AC1 AC0
address counter
Set DDRAM address in
AC6 AC5 AC4 AC3 AC2 AC1 AC0
address counter
Whether during internal
operation or not can be
AC6 AC5 AC4 AC3 AC2 AC1 AC0 known by reading BF
The contents of address
counter can also be read
Write data into internal
D6 D5 D4 D3 D2 D1 D0
RAM
(DDRAM/CGRAM)
Read data from internal
D6 D5 D4 D3 D2 D1 D0
RAM
(DDRAM/CGRAM)
10
Execution
Time(fosc=
270kHz)
1.53ms
1.53ms
39
s
39
s
39
s
39
s
39
s
39
s
0
s
43
s
43
s
JINGHUA
JM162A
! Instruction Description
A. Clear Display
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
0
1
Clear all the display data by writing “20H”(space code) to all DDRAM address,and set
DDRAM address to “00H” into AC(address counter).
Return cursor to the original status,namely,bring the cursor to the left edge on the first line
of the display.
Make the entry mode increment(I/D=”High”).
B. Return Home
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
1
-
Set DDRAM address to “00H” into the address counter.
Return cursor to its original site and return display to its original status,if shifted.
Contents of DDRAM does not change.
C. Entry Mode Set
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
1
I/D
SH
Set the moving direction of cursor and display.
I/D:Increment /decrement of DDRAM address(cursor or blink)
I/D=High,cursor/blink moves to right and DDRAM address is increased by 1.
I/D=low,cursor/blink moves to left and DDRAM address is decreased by 1.
*CGRAM operates the same way as DDRAM, when reading from or writing to CGRAM.
SH:Shift of entire display
When DDRAM read (CGRAM read/write) operation or SH=Low,shifting of entire
display is not performed.if SH=High, and DDRAM write operation,shift of entire display
is performed according to I/D value(I/D=High,shift left,I/D=Low, shift right).
11
JINGHUA
JM162A
D. Display ON/OFF Control
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
1
D
C
B
D:Display ON/OFF control bit
When D=High, entire display is turned on.
When D=Low, display is turned off,but display data remains in DDRAM.
C:Cursor ON/OFF control bit
When C=High, cursor is turned on.
When C=Low, cursor is disappeared in current display ,but I/D register preserves its data.
B:Cursor Blink ON/OFF control bit
When B=High, cursor blink is on, which performs alternately between all the “High” data
and display characters at the cursor position.
When B=Low ,blink is off.
E. Cursor or Display Shift
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
1
S/C
R/L
-
-
Shifting of right/left cursor position or display without writing or reading of display data.
This instruction is used to correct or search display data.
During 2-line mode display,cursor moves to the 2nd line after the 40th digit of the 1st line.
Note that display shift is performed simultaneously in all the lines.
When displayed data is shifted repeatedly,each line is shifted individually.
When display shift is performed,the contents of the address counter are not changed.
S/C
R/L
Operation
0
0
Shift cursor to the left, AC is decreased by 1
0
1
Shift cursor to the right, AC is increased by 1
1
0
Shift all the display to the left,cursor moves according to the display
1
1
Shift all the display to the right,cursor moves according to the display
12
JINGHUA
JM162A
F. Function set
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
1
DL
N
F
-
-
DL:Interface data length control bit
When DL=High, it means 8-bit bus mode with MPU.
When DL=Low, it means 4-bit bus mode with MPU.
When 4-bit bus mode, it needs to transfer 4-bit data twice.
N:Display line number control bit
When N=Low, 1-line display mode is set.
When N=High, 2-line display mode is set.
F:Display font type control bit
When F=Low, 5x8 dots format display mode is set.
When F=High, 5x11 dots format display mode.
G. Set CGRAM Address
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
Set CGRAM address to AC.
This instruction makes CGRAM data available from MPU.
H. Set DDRAM Address
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
Set DDRAM address to AC.
This instruction makes DDRAM data available from MPU.
When 1-line display mode(N=Low),DDRAM address is from “00H” to “4FH”.
In 2-line display mode(N=High),DDRAM address in the 1st line is from “00H” to
“27H”,and DDRAM address in the 2nd line is from “40H” to “67H”.
13
JINGHUA
JM162A
I. Read Busy Flag & Address
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
This instruction shows whether IC is in internal operation or not .
If BF is “High”,internal operation is in progress and should wait until BF is to be
Low,which by then the next instruction can be performed. In this instruction you can also
read the value of the address counter.
J. Write data to RAM
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
0
D7
D6
D5
D4
D3
D2
D1
D0
Write binary 8-bit data to DDRAM/CGRAM.
The selection of RAM from DDRAM,and CGRAM,is set by the previous address set
instruction(DDRAM address set,CGRAM address set).
RAM set instruction can also determine the AC direction to RAM.
After write operation, the address is automatically increased /decreased by 1,according the
entry mode.
K. Read data from RAM
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
1
D7
D6
D5
D4
D3
D2
D1
D0
Read binary 8-bit data from DDRAM/CGRAM.
The selection of RAM is set by the previous address set instruction.If the address set
instruction of RAM is not performed before this instruction, the data that has been read
first is invalid, as the direction of AC is not yet determined. If RAM data is read several
times without RAM address instructions set before read operation,the correct RAM data
can be obtained from the second. But the first data would be incorrect,as there is no time
margin to transfer RAM data.
14
JINGHUA
JM162A
In case of DDRAM read operation,cursor shift instruction plays the same role as DDRAM
address set instruction,it also transfers RAM data to output data register.
After read operation,address counter is automatically increased/decreased by 1 according
to the entry mode.
After CGRAM read operation,display shift may not be executed correctly.
Note:In case of RAM write operation,AC is increased/decreased by 1 as in read operation.
At this time,AC indicates the next address position, but only the previous data can be read
by the read instruction.
! Relationship between Character Code and CGRAM
Character code
CGRAM Address
D7 D6 D5 D4 D3 D2 D1 D0 A5 A4 A3 A2 A1 A0
0 0 0 0 x 0 0 0 0 0 0 0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
CGRAM Data
P7 P6 P5 P4 P3 P2 P1 P0
x x x 0 1 1 1 0
x x x 1 0 0 0 1
x x x 1 0 0 0 1
x x x 1 1 1 1 1
x x x 1 0 0 0 1
x x x 1 0 0 0 1
x x x 1 0 0 0 1
x x x 0 0 0 0 0
Pattern
number
pattern 1
0
x
x
x
x
x
x
x
x
pattern8
0
0
0
x
1
1
1
0
0
0
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
1
1
1
1
1
1
1
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
! Display Data RAM(DDRAM)
DDRAM stores display data of maximum 80x8 bits(80 characters).
DDRAM address is set in the address counter(AC) as a hexadecimal number
MSB
AC6
AC5
AC4
AC3
15
AC2
AC1
LSB
AC0
1
1
1
1
1
1
1
0
JINGHUA
JM162A
! Initializing Flowchart(Condition:fosc=270KHZ)
Power on
Wait for more than 30ms
after Vdd rises to 4.5V
Function set
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0
0
0
0
1
1
N
Wait for more than 39
F
X
N
0
1
1-line mode
2-line mode
F
0
1
5x8 Dots
5x11 Dots
D
0
1
Display off
Display on
C
0
1
Cursor off
Cursor on
B
0
1
Blink off
Blink on
X
s
Display ON/OFF Control
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0
0
0
0
0
0
1
Wait for more than 39
D
C
B
s
Display Clear
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0
0
0
0
0
0
0
0
0
1
Wait for more than 1.53mS
Entry Mode Set
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0
0
0
0
0
0
0
1 I/D SH
Initialization End
16
I/D
0 Decrement mode
1 Increment mode
SH
0
1
Entire shift off
Entire shift on
JINGHUA
JM162A
! Application Example
Application Circuit
6MHz
Application Flowchart
IC Initializing
Set Display ON
Set display line
Write data to CGRAM
Write data to line 1
Write data to line 2
End
17
JINGHUA
JM162A
! Program Example
ORG 0000H
AJMP MAIN8
MAIN8 : MOV P1,#00H
CLR P3.0
CLR P3.1
CLR P3.2
LCALL INST0
LCALL OPRN
LCALL INST1
LCALL CGRAM
MAIN : MOV 30H,#04H
MOV 31H,#04H
LCALL MAIN1
LJMP MAIN
INST0: MOV R1,#03H
ABC:
CLR P3.0
CLR P3.1
SETB P3.2
MOV A,#30H
MOV P1,A
CLR P3.2
LCALL T2
DJNZ R1,ABC
RET
OPRN: CLR P3.0
CLR P3.1
MOV A,#0CH
MOV P1,A
LCALL WRITE
RET
INST1: CLR P3.0
CLR P3.1
MOV A,#38H
MOV P1,A
LCALL WRITE
RET
CGRAM:CLR P3.0
CLR P3.1
;IC Initializing,Set interface data length(8bit),numbers of
display line (1line)and ,display font type(5X8dots)
;Set display ON
;Set numbers of display line (2lines)
;Write data to CGRAM
;Call main program
; IC Initialed subprogram
; Display ON subprogram
;Set numbers of display line (2lines) subprogram
; Write data to CGRAM subprogram
18
JINGHUA
MOV A,#40H
MOV P1,A
LCALL WRITE
MOV R1,#20H
SETB P3.0
CLR P3.1
MOV DPTR,#TAB2
X1:
CLR A
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE
INC DPTR
DJNZ R1,X1
RET
MAIN1: MOV DPTR,#TAB1
MOV R1,30H
MOV R2,31H
LCALL LINE1
LCALL LINE2
LCALL T3
MOV DPTR,#TAB7
MOV R1,30H
MOV R2,31H
LCALL LINE1
LCALL LINE2
LCALL T3
MOV DPTR,#TAB8
MOV R1,30H
MOV R2,31H
LCALL LINE1
LCALL LINE2
LCALL T3
MOV DPTR,#TAB9
MOV R1,30H
MOV R2,31H
LCALL LINE1
LCALL LINE2
LCALL T3
MOV DPTR,#TAB10
MOV R1,30H
JM162A
;Display TAB1 on screen
;Display TAB7 on screen
;Display TAB8 on screen
;Display TAB9 on screen
;Display TAB10 on screen
19
JINGHUA
MOV R2,31H
LCALL LINE1
LCALL LINE2
LCALL T3
MOV DPTR,#TAB11
MOV R1,30H
MOV R2,31H
LCALL LINE1
LCALL LINE2
LCALL T3
RET
LINE1: CLR P3.0
CLR P3.1
MOV A,#80H
MOV P1,A
LCALL WRITE
SETB P3.0
CLR P3.1
N1:
MOV R0,#04H
L1:
CLR A
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE
INC DPTR
DJNZ R0,L1
DJNZ R1,N1
RET
LINE2: CLR P3.0
CLR P3.1
MOV A,#0C0H
MOV P1,A
LCALL WRITE
CLR P3.1
SETB P3.0
N2:
MOV R0,#04H
L2:
CLR A
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE
INC DPTR
JM162A
;Display TAB11 on screen
;Write data to line 1
;Set DDRAM address
;Write data to DDRAM
;Write data on line 2
;Set DDRAM address
;Write data to DDRAM
20
JINGHUA
JM162A
DJNZ R0,L2
DJNZ R2,N2
RET
WRITE: SETB P3.2
;Write subprogram
MOV R7,#01H
AB:
MOV R6,#0FFH
AC:
DJNZ R6,AC
DJNZ R7,AB
CLR P3.2
RET
T1:
MOV R7,#40H
;Delay subprogram 1
AD:
MOV R6,#0FFH
AE:
DJNZ R6,AE
DJNZ R7,AD
RET
T2:
MOV R7,#20H
;Delay subprogram 2
AF:
MOV R6,#0FFH
AG:
DJNZ R6,AG
DJNZ R7,AF
RET
T3:
MOV R7,#03H
;Delay subprogram 3
AH:
MOV R6,#8FH
AI:
MOV R5,#0FFH
AJ:
DJNZ R5,AJ
DJNZ R6,AI
DJNZ R7,AH
RET
TAB1: DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
TAB2: DB 1FH,00H,1FH,00H,1FH,00H,1FH,00H
DB 00H,1FH,00H,1FH,00H,1FH,00H,1FH
DB 15H,15H,15H,15H,15H,15H,15H,15H
21
JINGHUA
JM162A
DB 0AH,0AH,0AH,0AH,0AH,0AH,0AH,0AH
TAB7: DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H
TAB8: DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
DB 01H,01H,01H,01H,01H,01H,01H,01H
TAB9: DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
DB 02H,03H,02H,03H,02H,03H,02H,03H
TAB10: DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
DB 03H,02H,03H,02H,03H,02H,03H,02H
22
JINGHUA
JM162A
DB 03H,02H,03H,02H,03H,02H,03H,02H
TAB11: DB 31H,32H,33H,34H,35H,36H,37H,38H
DB 39H,41H,42H,43H,44H,45H,46H,47H
DB 31H,32H,33H,34H,35H,36H,37H,38H
DB 39H,41H,42H,43H,44H,45H,46H,47H
DB 31H,32H,33H,34H,35H,36H,37H,38H
DB 39H,41H,42H,43H,44H,45H,46H,47H
DB 31H,32H,33H,34H,35H,36H,37H,38H
DB 39H,41H,42H,43H,44H,45H,46H,47H
DB 31H,32H,33H,34H,35H,36H,37H,38H
DB 39H,41H,42H,43H,44H,45H,46H,47H
END
23
JINGHUA
JM162A
! Application Circuit 1
8
P0.0~0.7
8
DB0~7
A0
R/W
RS
A1
373
8031
A7~4
138
G2
E
RD
WR
02
08
!
Application Circuit 2
8
DB0~7
P0.0~0.7
8
RS
8031
373
WR
RD
E
R/W
24
JINGHUA
!
JM162A
Character Generator ROM(ROM CODE 00)
25