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
© Copyright 2024