ASM-kode til PICs

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
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





Re: ASM-kode til PICs
Quoted text here. Click to load it
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



Re: ASM-kode til PICs

Quoted text here. Click to load it

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.


Quoted text here. Click to load it

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

Quoted text here. Click to load it

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

mvh.
Erik Klausen

Re: ASM-kode til PICs
Quoted text here. Click to load it

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 !
Quoted text here. Click to load it
sat
Jeg bruger en PIC16F84

Quoted text here. Click to load it
Ja, jeg simulerer i MPLAB



Re: ASM-kode til PICs
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



Re: ASM-kode til PICs
$ snipped-for-privacy@dread11.news.tele.dk:

Quoted text here. Click to load it

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


Quoted text here. Click to load it

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.

Quoted text here. Click to load it

OK, den har kun to banker.

Quoted text here. Click to load it

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

Re: ASM-kode til PICs
Quoted text here. Click to load it

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.

Quoted text here. Click to load it
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.

Quoted text here. Click to load it

???? 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



Re: ASM-kode til PICs

Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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

Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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

Re: ASM-kode til PICs
Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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' ?

Quoted text here. Click to load it
jeg

Quoted text here. Click to load it

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



Site Timeline