Sida 1 av 2
BSF instruktionen?
Postat: 17 februari 2008, 16:03:54
av jeken
Håller på att programmera en 16F690 och kommer inte överenns med BSF instruktionen.
Om jag enablar "kill LED DS1" slocknar de övriga tre dioderna.
Varför blir det så det ska ju bara påverka bit 0?
Kod: Markera allt
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
org 0
Start:
banksel TRISC ; select bank 1
clrf TRISC
banksel PORTC ; select bank 0
movlw b'00001111'
movwf PORTC
;bsf PORTC,0 ;kill LED DS1
end
[/list]
Postat: 17 februari 2008, 16:16:36
av sodjan
Står i databladet.
Kapitlet om PORTs, bara att läsa.
Postat: 17 februari 2008, 20:02:18
av vfr
Tips: Läs om RMW (Read/Modify/Write) och dom problem som kan uppstå med liknande instruktioner.
Postat: 17 februari 2008, 22:23:30
av sodjan
Speciellt den lilla gråa ruten med ett tydligt "Note !" i fet stil.
Den finns där av en anledning...

Postat: 18 februari 2008, 22:06:17
av jeken
Tack så mycket för era svar nu förstår jag och har fått det att fungera. Har precis införskaffat en PICkit2 och har börjat botanisera lite.
Postat: 19 februari 2008, 09:23:52
av bos
Jag får gratulera till att du greppade det så snabbt. R-M-W-problemet hörde jag redan från början, men det tog mig nästan ett halvår att *riktigt* förstå vad det innebar.
Postat: 19 februari 2008, 10:00:52
av Tottish
Och jag har tydligen inte gjort det æn...
RMW fel borde væl egentligen inte kunna upptræda så længa alla portens pinnar ær outputs? (TRISx='00'h)
Just eftersom pinnens status då alltid ær lika med latchens...
Vad har jag missat?
MVH
/Tottish
Postat: 19 februari 2008, 10:07:06
av Icecap
Du har missat att pinnens status inte alltid ÄR lika med latchens värde!
Edit:
Scenario 1: en okunnig har monterat en NPN-transistor på utgången men ingen motstånd mellan pinnen och basen. Resultatet är att pinnen aldrig kommer över 0,7V = '0'. Det görs en RMW där den läsas som '0' och skrivs tillbaka som '0'.
Scenario 2: en maskincykel består av 4 st "kristallcykler" och utgången sätts på den siste cykel. Men på utgången är det en kapacitiv belastning också så den blir inte '1' sådär *PANG*, det tar en (kort) tid. En RMW-instruktion läser på första cykel, modifierar och skriver på resten så utgången hinner inte att stiga nog till att bli '1'. Placerar man en NOP mellan går det dock oftast alldeles utmärkt.
Postat: 19 februari 2008, 10:18:46
av sodjan
> så længa alla portens pinnar ær outputs?
Det är inte det som är problemet!
*Analoga* pinnar läses alltid som "0" oavsett om de är in eller utgångar.
Vilket är *exakt* vad den lilla gråa rutan i kapitlet om "PORTS" i databladet säger!
Vad är problemet ??
Det som Icecap beskriver är ett annat scenario som uppkommer p.g.a
av timingproblem och kapacitiva laster. Dock är analog-problemet vanligare
bland nybörjare (som tror att databladet inte behöver läsas...)

Postat: 19 februari 2008, 15:38:23
av Tottish
Ahaaa...
Letade efter en grå ruta som det stod om RMW-fel i (ej analoga funktioner) och tænkte att du (Sodjan) kanske hade ett annat datablad. Men då har det satt sig lite hårdare. =)
MVH
/Tottish
Postat: 19 februari 2008, 16:48:52
av sodjan
Lite beroende på PIC kanske, men det brukar stå något om att
alla analoga pinnar läses digitalt som "0". Och de pinnarna
blir alltså "nollade" om man kör BCF/BSF mot någon annan pinne.
Postat: 19 februari 2008, 16:49:41
av bos
Nu hittade jag dokumentet jag tänkte länka till tidigare:
http://ww1.microchip.com/downloads/en/d ... 33023a.pdf
Läs FAQ 4 på sidan 158 (page 9-18). Där står det klart och tydligt med ett bra exempel.
Postat: 19 februari 2008, 17:08:22
av sodjan
Även den grå rutan på sidan 9-3 i samma dokument är bra och tydlig.
Ett annat kapitel som jag brukar rekomendera i samma dokument är
kapitel 29 "Instruktion Set". Mycket bättre exempel till varje instruktion
än de i databladen.
Postat: 21 februari 2008, 20:40:46
av jeken
Tack till er alla för de fina tipsen. Nu börjar till och med hitta vad jag letar efter i dokumenten...BSF är solklart nu, det gäller att initsiera portarna på rätt sätt bara, så enkelt var det!!...

Postat: 21 februari 2008, 22:18:01
av Swech
Generellt tips vad gäller portar
Man kan använda sig av en byte i ram för att mellanlagra sina portar.
Så man "grejar" med sin rambyte istället med BSF BCF mm och när man
är klar kopierar man ut den till porten.
På AVR kan man använda sig av något av de 32 registerna...
Detta tips kommer säkert att mottagas med "bättre att pilla direkt på porten, det går snabbare"
men ju större programmen blir destå bättre är detta tips, allra bäst är om man endast uppdaterar sina portar regelbundet i
sin huvudloop. med t.ex. 100Hz intervall.
Det absolut bästa är att göra en "virtuell" port, man lägger alltså upp
portens alla bitar i ramcellen/registret i den ordning man vill ha dem och
översätter till den riktiga portens bitar endast på ett ställe.
Ändrar man i hårdvaran behöver man då endast justera virtuell-riktig port översättaren och programmet funkar direkt utan att man måste leta igenom hela programmet efter alla referenser till porten.
Swech