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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

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

Inlägg 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
Användarvisningsbild
digitaliz
Inlägg: 278
Blev medlem: 10 oktober 2003, 21:27:38
Ort: Stockholm, Sverige

Inlägg 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.
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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.
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

Inlägg 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
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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.....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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+
mcdanne82
EF Sponsor
Inlägg: 213
Blev medlem: 22 november 2004, 19:51:31

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Skriv svar