Sida 1 av 1

Problem med simulering assembler PIC

Postat: 14 december 2005, 21:21:05
av Goliath
Har stött på de här lilla problemet! jag vill skicka ut data på PORTA men lyckas inte få ut värdet när jag kollar i SPECIAL FUNCTION REGISTER

har skrivit de här lilla koden för att visa vad jag menar
funkar fint att skicka ut värdet på PORTC men inte PORTA


;**********************************************************
;PIC16F877A, MBLAB IDE v7.20

list p=pic16f877a
include p16f877a.inc
errorlevel -302 ;Eliminate bank warning

status equ 03
trisa equ 85
trisb equ 86
trisc equ 87
porta equ 05
portb equ 06
portc equ 07

;**************** Program Start ***********************
org 0 ;Reset Vector
goto init
org 4 ;Interrupt Vector
goto init

;**************** Initial Process *********************
org 5
init bsf status,RP0 ;Change to Bank1
clrf trisa ;Set PORTA to Output mode
clrf trisc ;Set PORTC to Output mode
movlw H'FF'
movwf trisb ;Set PORTB to Input mode
bcf status,RP0 ;Change to Bank0

Main
movlw b'10101011' ;Set data
movwf porta ;Output data
movwf portc ;Output data
goto Main

end
;**********************************************************

Postat: 14 december 2005, 21:33:51
av Jeppsson
Om du nu måste deklarera status, trisa, trisb osv måste du inte då oxå berätta vilket värde RP0 har i status registert???

Postat: 14 december 2005, 21:36:56
av Goliath
Jeppsson, egentligen behövde jag inte deklarera trisa, trisb... eftersom jag har includerat p16f877a.inc där finns alla RP0 m.m deklarerade!

jag kan ändra RP0 till 5 men de hjälper fortfarande inte!

Postat: 14 december 2005, 21:40:05
av John
PortA fungerar väl som AD-omvandlare på 877an. Tror du måste ställa in ADCON-registren innan du kan använda porten som utgång

Postat: 14 december 2005, 21:40:45
av sodjan
> status equ 03
> trisa equ 85
> trisb equ 86
> trisc equ 87
> porta equ 05
> portb equ 06
> portc equ 07

Gör ABSOLUT INTE så där !!!
Plocka bort raderna omedelbart...

> errorlevel -302 ;Eliminate bank warning

OK generellt, men kan väll vara bra under felsökning att få lite extra varningar.

> bsf status,RP0 ;Change to Bank1
Eller till Bank 3 !!

> bcf status,RP0 ;Change to Bank0
Eller till Bank 2 !!

Använd BANKSEL istället och peta inte direkt på bank select bitarna.

För övrigt så får du kolla om inte PORTA är defualt som analoga ingångar...

EDIT : kompletterade bank-kommentaren...

Postat: 14 december 2005, 21:47:46
av Jeppsson
Jag var lite osäker :roll: , för jag brukar inte själv includera *.inc filerna utan deklarera värdena på registerna ibörjan av programmet...

Så som du gör fast du inte behöver... :)

Vad har du för värde i trisa???

Vid deklarera som du har med så skriver du bara siffror, vet ej hur mplab tolkar det, du bör kanske skriva tex porta equ 0x05 så den fattar att det är HEX tal...

Postat: 14 december 2005, 21:48:33
av Icecap
Håller helt med sodjan!

Definiera INGET som redan är definierat!

Sen PORTA....jag brukar att använda följande i alla mina program där jag inte använder AD-funktionen:

Kod: Markera allt

 ifdef ADCON1
        BANKSEL 1
	movlw	b'00000110'
	movwf	ADCON1		; Set A/D totally off
	BANKSEL	0
	clrf	ADCON0		; Be sure that A/D is off
 endif ; def ADCON1

Postat: 14 december 2005, 21:55:46
av Jeppsson
Microchip data sheet PIC16F87XA sidan 41 om PORTA

Note: On a Power-on Reset, these pins are configured
as analog inputs and read as 0.
The comparators are in the off (digital)
state.


:oops:

Postat: 14 december 2005, 22:03:52
av sodjan
> för jag brukar inte själv includera *.inc filerna utan deklarera värdena på registerna ibörjan av programmet...

Varför göra om samma jobb som Microchip redan har gjort ??

> 0x05 så den fattar att det är HEX tal...

Microchips rekomendation är :

hex : h'05'
oct : o'05'
dec : d'05'
bin : b'01010101'
asc : a'A'

Problemet med 0x05 (och de andra specialvarianterna för andra radix)
är att de inte har samma format mellan alla radix.

Icecap, din kod borde väll se ut så här :

Kod: Markera allt

 ifdef ADCON1
        BANKSEL ADCON1
   movlw   b'00000110'
   movwf   ADCON1      ; Set A/D totally off
   BANKSEL   ADCON0
   clrf   ADCON0      ; Be sure that A/D is off
 endif ; def ADCON1
Som du har skrivit det så måste man ju i alla fall
slå upp vilken bank ADCON0 och ADCON1 ligger i.
Tanken med BANKSEL är ju just att man inte behöver
ta reda på det själv ! Jag vet inte något fall där
man skulle "hårdkoda" banknumret i BANKSEL direktivet.

Postat: 14 december 2005, 22:30:28
av Goliath
tack för alla svar!

Sodjan, de var väldigt smidigt med BANKSEL tack för tipset!

de går fortfarande inte trots koden som ni skrev
i databladet så säger dom att On a Power-on Reset, these pins are configured
as analog inputs and read as 0 men hur jag ska ändra det är fortfarande oklart!

Postat: 14 december 2005, 22:42:11
av Goliath
nu har jag hittat felet!

jag skrev så här så funkade det

Kod: Markera allt

		BCF 	STATUS, RP0 	;
		BCF 	STATUS, RP1	  	; Bank0
		CLRF 	PORTA 			; Initialize PORTA by
		BSF 	STATUS, RP0 	; Select Bank 1
		MOVLW 	0x06 			; Configure all pins
		MOVWF 	ADCON1 			; as digital inputs
		MOVLW 	b'11000000'		; Value used to
		MOVWF 	TRISA 			; Set RA<3:0> as inputs
EDIT: kommentaren är fel, jag kopierade rakt av databladet

Postat: 14 december 2005, 23:14:33
av sodjan
Fint att det fungerar.

När det gäller BANKSEL, så är väll det enda "problemet" att den
sätter in bankswitching kod oavsett om det behövs eller inte.

Det finns andra lösningar där man låter MPASM hålla reda på
vilken bank man är i, och bara sätter in bcf/bsf kommandon om
det faktiskt behövs. Men det är lite överkurs just nu... :-)

Postat: 14 december 2005, 23:35:58
av Jeppsson
Sodjan du verkar vara kung på Assembler och framför allt på PIC processorer. :D :D

Finns det någon bra lathund på "bra och ha" kommando i MPASM? Så som till exempel BANKSEL eller det är sådant som man lär sig efter man har läst några hundra rader kod från andra asm-gurus??? :shock:

Postat: 15 december 2005, 00:06:51
av sodjan
> Finns det någon bra lathund på "bra och ha" kommando i MPASM?

Japp, den heter "MPASM/MPLINK PICmicro Quick Chart".
Kolla längst ner på MPLAB sidan hos Microchip.

Sedan finns naturligtsvis detaljerna i "MPASM/MPLINK User's Guide".
Men den har du säkert redan laddat ner, eller hur ? :-)

Det är ju komplett omöjligt att missa dessa då de finns på samma sida
där MPLAB laddas ner !

EDIT :
Jag vill bara lägga till att, att läsa andras ASM kod inte behäver vara fel alls,
problemet är att avgöra vad som är *bra* kod ! :-)
99% av det som finns "på nätet" är mest skräp där bäst-före datumet
sedan länga är passerat...