LusoRobótica - Robótica em Português
Sistemas específicos => PIC => Tópico iniciado por: iyahdub em 01 de Agosto de 2012, 10:31
-
Ver se consigo explicar-me.
Estou a tentar compreender completamente, como usar o Enderecamento directo , e a diferenca, ja agora, do indirecto...
Acrescentei estas intrucoes ao codigo original exemplo (Mais para usar em conjunto com o debugger e tentar compreender e "documentar" o funcionamento do chip em relacao ao programa.
Alguem me pode explicar por exemplo, se eu quiser acender os 5 ledds , por exemplo ... Como usaria o RP0, Como parte do STATUS em relacao ao codigo ?!
Porque ainda nao consegui perceber muito bem esta funcao do register !
O Sena usa um codigo que me fez pensar e realizar que afinal nao tinha percebido bem este detalhe ainda( e muitos outros, mas um de cada vez lol)
Ja digeri o funcionamento dos SFR's PCL e PCLATCH ( que nos da o tal total teorico de 8192 divididos pelos 13 bits, sendo os 8 LSB no PCL ...,ais ou menos lol). Portanto nem tudo esta mal !
#include <p16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
org 0
Start:
bsf STATUS,RP0 ; escolher Register 1
bcf TRISD,0 ; Pin RD0 Como Output
bcf STATUS,RP0 ; Clear Register Bank 0
bsf PORTD,0 ; activar LED RD0 (DS0)
bcf PORTD,0
bcf STATUS,RP0
bsf STATUS,RP0 ; escolher Register 1
bcf TRISD,1 ; Pin RD1 Como Output
bcf STATUS,RP0 ; back to Register Bank 0
bsf PORTD,1 ; activar LED RD1 (DS1)
bcf PORTD,1
bcf STATUS,RP0
bsf STATUS,RP0 ; escolher Register 1
bcf TRISD,2 ; Pin RD2 Como Output
bcf STATUS,RP0 ; back to Register Bank 0
bsf PORTD,2 ; activar LED RD2 (DS2)
bcf PORTD,2
bcf STATUS,RP0
bsf STATUS,RP0 ; escolher Register 1
bcf TRISD,3 ; Pin RD3 Como Output
bcf STATUS,RP0 ; back to Register Bank 0
bsf PORTD,3 ; activar LEDRD3 (DS3)
bcf PORTD,3
bcf STATUS,RP0
bsf STATUS,RP0 ; escolher Register 1
bcf TRISD,4 ; Pin RD4 Como Output
bcf STATUS,RP0 ; back to Register Bank 0
bsf PORTD,4 ; activar LED RD4 (DS4)
bcf PORTD,4
bcf STATUS,RP0
goto Start ; wait here
end
PS- Acho que estou a comecar a perceber...Acho !!
-
Olá iyahdub,
se bem que tenha achado a tua pergunta um tanto ao quanto confusa vou ver se clarifico...
Se consultares o datasheet do PIC em questão vais ver que a memória RAM do mesmo está dividida em quatro bancos.
Os bits RP0 e RP1 do registo STATUS permitem-te alternar entre os quatro escolhendo a combinação certa, por exemplo para ires para o banco 1 tens de meter os bits (RP1:RP0) = 01 o que implica Bank 1 (80h-FFh)
é o que tens no código, basicamente eu só faria uma coisa para optimizar....
em vez de estares constantemente a mudar para o banco 1 e dps regressar ao 0, eu mudaria para o 1 faria todas as operações possiveis de fazer na altura (neste caso mudar todos os TRIS) e dps disso é que regressaria ao banco0.
@sena, se quiseres dizer mais alguma coisa ou explicar melhor.....
Cumps, Mauro.
-
Consegues explicar iisso em codigo?! Se puderes agradecia...
Estou a usar MPASM...
Eu sei que e confuso , porque nao percebo bem como e que entao e distribuida, nem como...
Ou como usar correctamente. Dai estar a tentar perceber
Obrigada por o interesseem ajudar !
-
Olá novamente,
então para inicializar o porto D todo como saída e dps escrever-lhe qq coisa poderia escrever o seguinte código.
#include <p16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
org 0x00
Start:
bsf STATUS,RP0 ; escolher Register 1
MOVLW 0x00 ;carregar o registo W com 0
MOVWF TRISD ;inicializar o registo TRISD com 0 (atraves de W)
bcf STATUS,RP0 ; Voltar ao Bank 0
MOVLW b'10101010' ;Padrao com que quero acender os LEDs (um sim um nao)
MOVWF PORTD ;escrever para o porto D
GOTO $ ; Salta para a mesma instrução (ciclo infinito)
end ;fim
Espero que ajude, qq duvida é só dizer
Mauro.
-
iyahdub,
o endereçamento directo/indirecto até bastante simples, depois de entenderes o princípio da coisa. Lê bem o capítulo no meu manual sobre isso, a meu ver está lá devidamente explicado. Se não chegar, eu respondo ao resto aqui. O datasheet do micro também é jeitoso.
Como estás a programar em Assembly, é natural que tenhamos de nos preocupar com o endereçamento. Faz parte do processo.
Como, infelizmente, a memória RAM destes PIC de gama baixa está toda particionada, temos que andar a saltar de banco-em-banco para conseguir usar os registos. (um dos pontos a favor do AVR)
No endereçamento podes usar o switch dos bancos, através do RP0-RP1-Status e trabalhar com o PCL-PCLATH, e no indirecto com o IRP e FSR-INDF.
São formas diferentes de o fazer, e o seu uso depende mesmo da tua aplicação.
Se queres trabalhar com um registo apenas, então RP0-RP1-Status. Se queres trabalhar com arrays na memória, então FSR-INDF é o caminho a seguir.
O MPLAB tem várias macros internas para ajudar nos trabalhos. Uma delas é o BANKSEL, que te ajuda a mudar de bancos quando necessário.
Basta apenas fazer BANKSEL TRISA, para mudar "automaticamente" para o banco onde está o TRISA.
Não precisas de mudar de banco de cada vez que usas um registo. É claro que podes, mas não há essa necessidade.
Podes ver onde estão os registos e se o seguinte com que vais trabalhar está no mesmo banco que o anterior, então poupas passos e memória.
Para ver as macros disponiveis no MPLAB, ver o HELP file do mesmo.
-
HHH, agora comeca a fazer sentido .
Desde entao estive a ler com muita calma e estudar outros codigos e era mais ou menos nessa direccao que me estava achar !
Nao consegui formular a pergunta muito bem porque ainda nao sabia o que perguntar
Obrigado !
PS-Sena, O teu codigo do exemplo ajudou bastante ja que tem mais uns passos que ajudam a perceber melhor.
@Mauro - Obrigado, agradeco ajuda !!
-
Ah, Sena - assim e muito mais facil, ja que o BANKSEL faz tudo pro pessoal... Incluindo o STATUS !
Depois de ler a explicacao
#include <p16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
org 0
Start:
banksel TRISD ;Pelos vistos comeca no banco 1 ,
;e nao o 0: Isto para assegurar
;nunca cruzar dados (pelo que percebo)...
clrf TRISD ;Limpa TRISD. PORTD como saida.
banksel PORTD ;banksel usa agora o banco 0,
;aonde a PORTD esta.
movlw 0x55 ;Valor para PORTD .
movwf PORTD
clrf PORTD
goto Start
end ; end.
-
boa! ;D
-
E engracado ou nao, consegui agora perceber plenamente o Status !!
E o mesmo que o Banksel faz por tras por nos: {rimeiro manda para o banco um, e a seguir temos que chamar de novo para o 0, de forma a podermos inserir o novo bloco de instrucoes...
Dai o Sena dizer que isso e coisa que os ATMEL fazem de diferente.
Esta cena de ter o debugger disponivel da um jeito incrivel para perceber isto como deve de ser...
Obrigada !
Mais duvidas em breve...lol
-
Podes ver todo esse processo apenas som o SIMULATOR do MPLAB.
O Debbuger também funciona,mas estás a ver os registos internos do micro em "tempo-real".
-
Sim eu sei , Sena... Mas nao sei porque , ele costuma aprvalhar comigo, enquanto o PickIt2 nunca aparvalha... O MPLAB SIM tem ajudado em varios codigos, mas parece ter muito mais do que eu vejo...
O Debugger pelo PickIt e mais porque um homem ve os leds acender, etc, devagarinho ( porque a tempo real um homem nem ve essas quebras off dos leds).
Coisa que o SIM nao faz, correcto ?
E Mauro, o teu codigo ajudou tb... fixe ter-vos a explicarem -me, pq sozinho nao ia la tao depressa !
PS- Foi engracado teres mencionado o endereco do Bank 1 (80h-FFh), porque vi um exemplo que usa o endereco direco, atraves de uma definicao pelo menos ? Tipo STATUS equ 80h , ou parecido !!
Devagar hei-de la chegar !! lol