Sida 1 av 1

Problem med att få flera utgångar höga på port A - 18F26

Postat: 1 september 2008, 06:32:03
av mcdanne82
Håller på att programmera en PIC 18F2680
http://ww1.microchip.com/downloads/en/D ... 39625c.pdf

men har fått problem då den inte vill ha mer än en pinne hög samtidigt(förutom RA4 och RA5)
Använder PROTON+ Compiler och antar att det är något som den missar eller något register jag måste sätta som jag missat.
Men här finns ju många assembler rävar så ni ser nog vad felet är. :wink:

Bifogar assembler koden som proton genererar.
Testprogrammet sätter alltså pin RA0-RA5 höga skall sedan göra en paus på 1 sekund. Resultatet blir att endast RA4 och RA5 lyser.

Kod: Markera allt

;----------------------------------------------------------
; Code Produced by the PROTON+ Compiler. Version 3.2.5.5
; Copyright Rosetta Technologies/Crownhill Associates
; Written by Les Johnson. February 2007
;----------------------------------------------------------
 NOLIST
 #include "D:\DOKUMENT\PROGRA~1\PIC\14B2A~1.RFS\VERSIO1A\TEST2A.PBP"
 LIST

F2_SOF equ $ ; TEST2A.PRP
F2_EOF equ $ ; TEST2A.PRP
F1_SOF equ $ ; TEST2A.BAS
F1_000006 equ $ ; in [TEST2A.BAS] ALL_DIGITAL On
	Movlw 7
	Movwf ADCON1,0
START
F1_000009 equ $ ; in [TEST2A.BAS] High PORTA.0
	Bcf TRISA,0,0
	Bsf PORTA,0,0
F1_000010 equ $ ; in [TEST2A.BAS] High PORTA.1
	Bcf TRISA,1,0
	Bsf PORTA,1,0
F1_000011 equ $ ; in [TEST2A.BAS] High PORTA.2
	Bcf TRISA,2,0
	Bsf PORTA,2,0
F1_000012 equ $ ; in [TEST2A.BAS] High PORTA.3
	Bcf TRISA,3,0
	Bsf PORTA,3,0
F1_000013 equ $ ; in [TEST2A.BAS] High PORTA.4
	Bcf TRISA,4,0
	Bsf PORTA,4,0
F1_000014 equ $ ; in [TEST2A.BAS] High PORTA.5
	Bcf TRISA,5,0
	Bsf PORTA,5,0
F1_000015 equ $ ; in [TEST2A.BAS] DelayMS 1000
	Movlw 3
	Movwf PP1H,0
	Movlw 232
	F@Call dly@w
F1_000016 equ $ ; in [TEST2A.BAS] GoTo Start
	F@Jump START
F1_EOF equ $ ; TEST2A.BAS
 LIST
	END

Postat: 1 september 2008, 07:25:24
av digitaliz
Testa skriva till LATA istället för PORTA. :)

Edit:
Att det blir så beror på att när du ändrar en bit så läser den först av värdet på porten, gör ändringen, och skriver tillbaka. Om du har belastat den hårt (kanske med en kondensator) så kan porten ha ett annat värde än det du tror.
Genom att skriva till latchen (LATx) så påverkas den inte av vilket värde porten har i verkligheten.

Postat: 1 september 2008, 08:36:24
av H.O
En annan anledning kan vara att flera av PortA's pinnar "kommer upp" som analoga och måste sättas till digitala genom skrivning till ADCON1-registret.

Postat: 1 september 2008, 09:02:15
av mcdanne82
digitaliz: Tack för förklaringen, skall pröva LATA, dock driver utgången bara en liten ytmonterad lysdiod med 1k motstånd, så belastningen borde inte vara enorm, men kanske är tillräckligt, blir ju lite nerdragen mot jord ändå.

H.O:
En annan anledning kan vara att flera av PortA's pinnar "kommer upp" som analoga och måste sättas till digitala genom skrivning till ADCON1-registret.
Räcker det med koden nedan för att sätta de till digitala?

Kod: Markera allt

Movlw 7
Movwf ADCON1,0

Postat: 1 september 2008, 09:22:35
av H.O
Jag är kass på ASM men om den koden skriver värdet 7 till ADCON1 (vilket det verkar göra) så borde det räcka. Jag har inte lusläst databladet men PortA är även kopplat till komparatorn så du kanske måste stänga av något där också.

Jag har inte Proton+ själv men borde du bara kunna göra:
ADCON1 = 7 eller ADCON1 = %00001111

EDIT: ADCON1 = %00000111 ska det så klart vara om det nu är värdet 7 som skall skrivas.....

Postat: 1 september 2008, 10:38:26
av sodjan
Jag ser inte direkt kopplingen, men du kan ju prova att stänga
av även komparatorn så som de gör i exemplet i databladet.
Sen, som digitaliz skrev, använd LATx istället för PORTx när
du skriver till pinnarna.

Sen är det lite märkligt att Proton genererar TRIS instruktioner
varje gång man sätter en pinne. Lite onödigt...

Postat: 1 september 2008, 12:40:32
av H.O
Japp det är lite onödigt... Jag har som sagt inte Proton+ själv men Melabs kompilatorer gör lika dant OM man använder High/Low kommandona.

Men om man själv har satt aktuell TRIS-bit till 0 så kan man med fördel skriva direkt till PORT eller, som i det här fallet, LAT registret med till exempel PortA.5 = 1 Då genereras inga "extra" skrivningar till TRIS. Jag gissar att det funkar lika dant med Proton+

Postat: 1 september 2008, 21:03:16
av mcdanne82
Tackar nu funkar det. :)
Det räckte inte med att köra med LATA.1=1 utan var tvungen att definiera att alla pinnar på porta skall vara utgångar.
Men denna koden funkar iaf.
;----------------------------------------------------------
; Code Produced by the PROTON+ Compiler. Version 3.2.5.5
; Copyright Rosetta Technologies/Crownhill Associates
; Written by Les Johnson. February 2007
;----------------------------------------------------------
NOLIST
#include "D:\DOKUMENT\PROGRA~1\PIC\14B2A~1.RFS\VERSIO1A\TEST2A.PBP"
LIST

F2_SOF equ $ ; TEST2A.PRP
F2_EOF equ $ ; TEST2A.PRP
F1_SOF equ $ ; TEST2A.BAS
F1_000006 equ $ ; in [TEST2A.BAS] ALL_DIGITAL On
Movlw 7
Movwf ADCON1,0
F1_000008 equ $ ; in [TEST2A.BAS] TRISA = %000000
Clrf TRISA,0
START
F1_000011 equ $ ; in [TEST2A.BAS] LATA.0=1
Bsf LATA,0,0
F1_000012 equ $ ; in [TEST2A.BAS] LATA.1=1
Bsf LATA,1,0
F1_000013 equ $ ; in [TEST2A.BAS] LATA.2=1
Bsf LATA,2,0
F1_000014 equ $ ; in [TEST2A.BAS] LATA.3=1
Bsf LATA,3,0
F1_000015 equ $ ; in [TEST2A.BAS] LATA.4=1
Bsf LATA,4,0
F1_000016 equ $ ; in [TEST2A.BAS] LATA.5=1
Bsf LATA,5,0
F1_000017 equ $ ; in [TEST2A.BAS] DelayMS 1000
Movlw 3
Movwf PP1H,0
Movlw 232
F@Call dly@w
F1_000018 equ $ ; in [TEST2A.BAS] GoTo Start
F@Jump START
F1_EOF equ $ ; TEST2A.BAS
LIST
END

Postat: 1 september 2008, 22:42:01
av sodjan
> utan var tvungen att definiera att alla pinnar på porta skall vara utgångar.

Exakt. Det var just det som var det idiotiska med "High" kommandot.
Att det "dolde" behovet av att även se till att TRIS ska vara rätt.
För den som bara har sett sådan kod, så blir det lite överaskningar...

Men, med det sagt, så *ska* det även fungera med PORTA. Att det inte gör
det pekar på att det fortfarande är något som inte är helt rätt. Jag tror inte
att ett par vanliga LEDs (med korrekta motstånd) ska kunna åstakomma
det klassiska timing-rellaterade R-M-W problemet.

Om man däremot t.ex kopplar (som en del id--oter sägar att man kan/ska)
LEDs direkt till I/O pinnarna *utan* motstånd, så kan de mycket väl lasta ner
pinnarna så att R-M-W problemet uppstår...