Problem med simulering assembler PIC
Problem med simulering assembler PIC
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
;**********************************************************
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
;**********************************************************
> 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...
> 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...
Jag var lite osäker
, 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...

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...
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:
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
> 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 :
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.
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
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.
nu har jag hittat felet!
jag skrev så här så funkade det
EDIT: kommentaren är fel, jag kopierade rakt av databladet
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
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...
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...

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