ASM-kode til PICs

Mellem PORTB Bit5 og Bit2 er i serie

PORTB.5 - R220 - et ringetryk - R2.2K - PORTB.2

og når jeg benytter følgende asm-kode til at testen om der trykkes på "ringetrykknappen"

; sætter PORTB.5=Input og PORT.2=0 til FRYS-knappen TestFRYS clrf Frys ; FRYS flaget fjernes ; PORTB skal åbenbart sættes FØR ændring af TRISB movlw b'00100000' ; Bit7 er INDGANG movwf PORTB ; Sæt værdier på PORTB bsf STATUS,RP0 ; Set bitten = select Bank1 bsf TRISB,5 bcf STATUS,RP0 ; clear bitten = select Bank0 btfss PORTB,5 ; skip næste hvis PORTB.5 er sat incf Frys,1 ; sæt FRYS flaget til 1 return

Ja, så rejses Frys-flaget i linien "incf Frys, 1" SELV OM DER IKKE TRYKKES på "ringetryk" !

Når jeg indsætter et breakpoint på linien kan jeg se, at PORTB.5 faktisk er CLEARED - så mit problem må vel være, at jeg sætter PORTB forkert i starten af koden.

Hvordan sætter jeg PORTB.5 i starten af koden så den holder sin værdi til testen i linien "btfss PORTB,5" ?

Mvh KS

Reply to
KS
Loading thread data ...

"KS" skrev i en meddelelse news:41e24056$0$134$ snipped-for-privacy@dread11.news.tele.dk...

Og der selvfølgelig IKKE er trykket på "ringetryk" -

Omvendt

HVIS der trykkes på "ringetryk" SKAL den netop rejse Frys-flaget i testen "btfss PORTB,5"

Mvh KS

Reply to
KS

"KS" wrote in news:41e24056$0$134$ snipped-for-privacy@dread11.news.tele.dk:

Det vil sige at når ringetrykket ikke er trykket, svæver pin 5. det er ikke pænt. Træk den til plus-spændingen, eventuelt med de indbyggede pull-up modstande.

Hvilken kreds bruger du? Du styrer den laveste bit i bank-nummeret, men mange kredse har mere end 2 banker.

Hvad snakker vi om her? Kører du programmet i debugger?

mvh. Erik Klausen

Reply to
Erik Klausen

"Erik Klausen" skrev i en meddelelse news:Xns95DAC31AAAD91ErikKlausen@62.243.74.162...

Ja, det gør jeg også - sker ved initiering af porten, men skal det ske IGEN ved omdefineringen i nedenstående - det har jeg i mellemtiden afprøvet og det hjælper IKKE noget !

sat

Jeg bruger en PIC16F84

Ja, jeg simulerer i MPLAB

Reply to
KS

Det har sandsynligvis noget med netop det, der advares mod i dokumentationen under

5.3.2 SUCCESSIVE OPERATIONS ON I/O PORTS

Men jeg kan sgu' ikke gennemskue det !

Mvh KS

Reply to
KS

"KS" wrote in news:41e2d2ea$0$185 $ snipped-for-privacy@dread11.news.tele.dk:

Nej, når pull-uperne er aktiveret i init-koden, så er det fint.

Hvis pin 5 er en indgang behøver du ikke skrive en 1-bit til den. Der sker ikke noget ved det, men det forvirrer i koden. Til gengæld får du ikke sat TRISB-registeret fuldt ud. Du sætter pin 5 til indgang, men de øvrige pins er udefinerede. Det vil sige, de er faktisk indgange efter reset. Du skal have sat pin 2 til udgang:

clrf PORTB ; Sæt pin 2 på PORTB til 0 (overkill, men hva'fan) bsf STATUS,RP0 ; Set bitten = select Bank1 movlw b'00100000' ; Bit5 er INDGANG movwf TRISB ; Sæt værdier på TRISB bcf STATUS,RP0 ; clear bitten = select Bank0

Selvom, det er ligemeget i din simulation. Så vi har stadig ikke fundet fejlen.

OK, den har kun to banker.

Problemet er måske at du satser på den 1-bit du skriver til PORTB. Du skal bruge simulatorens "input-modul" til at trække pin 5 høj.

Hvis det ikke hjælper, må jeg til at starte MPLAB. Det bliver godt; det er snart længe siden. Jeg har ikke haft den kørende siden ver. 6.40.

mvh. Erik Klausen

Reply to
Erik Klausen

"Erik Klausen" skrev i en meddelelse news:Xns95DAEA8FE2FErikKlausen@62.243.74.162...

Det er jo her vigtigt, at indgange netop et "1" for at "simeulere" at der IKKE er trykket på knappen - og der oplevede jeg tidligere, at når jeg omdefinerede porten - ja, så fik den værdien "0" - altså som om der ER trykket på knappen - én gav så det råd, at skrive til porten med værdien "1" - derfor !

Jeg gik udfra, at de andre porte (herunder Bit2) beholdt deres tildelte status som I/O fra tidligere - derfor omdefinere jeg ikke de andre pins.

Jeg vil jo netop benytte mig af "1" på PORTB.5 og "0" på PORTB.2 til at illudere "indgange" trukket op til "1" (men det sker måske med pull up'en ?) og udgangen med "0" som evt. kan bruges til at trække indgangen til "0" HVIS der trykkes på knappen.

???? kan det gøres automatisk - ellers kan jeg jo ikke simulere et forløb, hvor jeg bare "klikker" for at illudere de indkommende pulser, som skal tælles - jeg kan jo ikke "stoppe" op (hver gang der skal testes for FRYS med ovenstående kode) og så MANUELT sætte PORTB.5 til "1" inden jeg kører videre - eller kan jeg ... ?

--

MEN er har mit problem ikke netop noget med de advarsler i
dekumentationen:

5.3.2 SUCCESSIVE OPERATIONS ON I/O PORTS

at gøre - jeg kan bare ikke liiiiige gennemskue problematikken !

mvh KS
Reply to
KS

"KS" wrote in news:41e38cab$0$154$ snipped-for-privacy@dread11.news.tele.dk:

Jo, men når en pin er konfigureret til input er det ligemeget hvad du har skrevet til den fra programmet. Simulatoren forventer at indgangen sættes jvf. nedenfor.

Simulatoren tager ikke hensyn til pull-up. Den tager kun hensyn til hvad du sætter indgangen til, jvf. nedenfor.

Og her kommer det: Du kan sætte en indgang på en af følgende to måder:

  1. Du kan skrive en "simulator-indgangs-fil", hvor du skriver at efter 533 clockcykler skal pin B.2 gå høj, og efter 719 clockcykler skal pin B.5 gå lav, etc. ´ Det virker OK, men den næste metode er som regel nemmere:
  2. Vælg Debugger, Select Tool (dette gælder for MPLAB 6.40) vælg MPLAB SIM. Vælg Debugger, Stimulus. Klik på Add Row, sæt Pin til RB5, sæt Action til Toggle.

Vælg nu Debugger, Animate. Dit program bliver nu kørt, og ved at klikke åp "Fire"-knappen kan du nu skifte pin B.5 mellem høj og lav.

Dokumentationen til 16F84 nævner ikke denne problemstilling, men nu har jeg fundet den i dokumentationen til nogle andre kredse.

Det handler om at hvis du skriver til en port der er konfigureret som udgang, så kan programmet læse den værdi det selv har skrevet. Men i modsætning til alle andre registre har I/O portene noget tung elektronik på slæb. Derfor, hvis du skifter en pin fra 0 til 1 kan du risikere at spændingen ikke er nået op, inden næste instruktion aflæser porten. Derfor skal der udføres en operation mellem læs og skriv. Denne problemstilling er ikke relevant i dit tilfælde.

mvh. Erik Klausen

Reply to
Erik Klausen

"Erik Klausen" skrev i en meddelelse news:Xns95DBCBBB59ACCErikKlausen@62.243.74.162...

Det vil jo nok være det bedste at bruge denne metode så jeg kan simulere "full running" og KUN klikke for at illudere de indkommende pulser, der skal tælles.

DET virker nu ikke SÅ stabilt her - nogle gange sættes den høj andre gange ikke ! (Jeg går ud fra, at ændringen afspejles i watch-vinduet - efter en refresh) Er det vigtigt at stå et bestemet sted i koden - f.eks. LIIIGE før jeg vil aflæse eller hva' ?

jeg

Jeg sagde dette FORDI jeg troede, at jeg SKULLE skrive til porten for at få den til "1" - men da jeg IKKE skal det, bliver ovenstående jo irrelevant.

JA - jeg må ned at prøve det af med det samme !

Tak for din indsats og see you later !

Mvh KS

Reply to
KS

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.