Página 1 de 1

Mikrobasic - paginação memoria

MensagemEnviado: 22 Mar 2007 16:38
por Rota
Olá pessoal,

estou programando um pic 16f685 (4K) em mikrobasic, porem quando o programa passou dos 2k, (tarefa facil com basic) comessou a travar por problemas de paginação de memoria.
Andei vendo no forum do compilador (http://www.mikroe.com/forum/viewtopic.p ... 00a28123fd)
e pelo que eu entendi, o prgrama acerta as paginas sozinho, porem tem que estar registrado.
É isso? o compilador não apresenta nenhum erro nem mensagem. O programa esta cra.... digo "adaptado"

Marcelo

MensagemEnviado: 22 Mar 2007 16:43
por fabim
ta meio estranho isso. C vc usou uma micha, era pra estar funcionando bem. Deve ser so mais um bizouro como varios que tem.rsrs

Expeguimenta, dar uma olhada no asm que ele gerou..

Fabim

MensagemEnviado: 22 Mar 2007 18:04
por Rota
Fabim,
O que eu fiz foi o seguinte:

eu tinha uma sub-procedure que estava locada antes dos 2K de memoria,
e a rotina principal (main) estava entre 1,8K e 2,5K (nessas condições,
o programa travava).Em assembler não teria problema.

Então eu realoquei a sub-procedure no endereço 3500
(sub procedure menu ORG 3500),ai main ficou todo no banco 0
e a sub-procedure no banco 1, e quando eu chamava a sub-procedure,
atraves de main, eu mudava de pagina:

main:
if testbit (porta,5)=0 then
asm
bcf pclath,4
bsf pclath,3 'muda pclath para banco 1
end asm
menu 'que na realidade é um call em assembler



Na procedure main, ele só ligava um rele e voltava. Até ai tudo bem,
funcionou perfeito, eu pressionava a tecla (porta,5), escutava o som
doce do clicar do contato do rele, eu nunca tinha percebido como
é lindo esse som.

Proximo passo:
coloquei a função lcd_cmd(Lcd_Move_Cursor_Left),na sub-procedure
ai fu... tudo, pois o compilador chama uma sub-rotina que esta em
outro banco (CALL_lcd_cmd), ai trava o programa.

A conclusão que eu cheguei, é que o programa tem que acertar a
paginação sozinho (impossiver acertar na mão), ou o programa esta
(como vc mesmo disse) com bug, ou o cream-craquer (acho que ninguem
percebeu né), não funciona.

será isso?? se vc tiver alguma idéia para me ajudar, ou fazer algum
outro teste.....

obrigado

marcelo

MensagemEnviado: 23 Mar 2007 08:06
por fabim
olha.. tem uma coisa muitissimo importante.

Não crie procedures, contendo dentro dessa functions da bibli...

Eu programo em pascal por isso conheço basic. E no pascal acontecia o mesmo.. sofri feito um doido pra descobrir isso,..

Esperimenta criar uma rotina no main .. e dentro dela através de estados vc dar um goto e ficar dentro de um outro loop´.. isso evita muita dor de cabeça.

Fabim

MensagemEnviado: 25 Mar 2007 16:24
por Rota
Fabim,
para confirmar o problema com o compilador,
eu fiz um programinha simples, um rele fica ligando/desligando de 100
em 100ms, quando pressiono uma tecla, o programa desvia para uma
sub-rotina, essa sub-rotina aguarda 2seg e volta para a principal:

main:
osccon=%01111000
ansel= 0
anselh=0
adcon0=0
TRISB=0

principal:

setbit (portb,7) 'liga rele
delay_ms(100) 'pausa 100ms
clearbit (portb,7) 'desliga rele
delay_ms(100) 'pausa 100ms
if testbit (porta,5)=0 then 'se pressionar tecla
goto sub 'vai para sub
end if
goto principal 'reinicia principal

sub:
delay_ms(2000) 'pausa 2seg
goto principal ' vai para rotina principal

end.

até ai normal, não usei nenhuma procedure, o programa funciona legal,
Após isso, eu copiei esse bloco:

setbit (portb,7) 'liga rele
delay_ms(100) 'pausa 100ms
clearbit (portb,7) 'desliga rele
delay_ms(100) 'pausa 100ms
if testbit (porta,5)=0 then 'se pressionar tecla
goto sub 'vai para sub
end if


e fui colando um abaixo do outro, para ir enchendo a memoria de programa. Até uns 2K, o programa funcionava legal, pois estava tudo num banco só. Depois que passou os 2K, o rele ficava clicando, só que quando eu pressiono a tecla, o programa trava.
A conclusão que cheguei é a seguinte (com o programa >2K):
Se eu não pressionar a tecla, o programa não vai travar, pois ele vai passar do banco 1 para o banco 2 na sequencia do programa:
.
.
.
2045 banco 1
2046 banco 1
2047 banco 1
2048 banco 2
2049 banco 2
2050 banco 2
.
.
.

Nessa condição, não é preciso alterar o banco,
Agora se eu pressionar a tecla, (pc estara no banco 1) o programa
desvia para a sub-rotina que estara no banco 2.
.
.
.
1100 if testbit (porta,5)=0 then
1101 goto 2100
.
.
.
Nesse caso, como o pc esta em 1100 (banco 1), e chama uma rotina que esta no endereço 2100 (banco 2), teria que ser mudado o pclath, para chamar a rotina no banco 2, e como o mikrobasic não faz isso, o programa se perde (trava).

Acho que é isso.. ou não??


marcelo

MensagemEnviado: 26 Mar 2007 08:57
por fabim
De forma alguma...

Todos os mikro.. tem na biblioteca as definições de trabalho..sem excessão, eles ageitam o pclatch e tudo mais.. automaticamente..

Acho que é algum tipo de bug, va em lib no patch do mikroeletronica, procure pelo inc do pic que vc esta usando e olhe as definições de banco etc, eu estava com problema no pic12F675, precisei arrumar algumas definições que estavam doidas..


Fabim

MensagemEnviado: 27 Mar 2007 06:50
por Rota
Fabim,

vc acertou na mosca,
No arquivo P16F685.MLK esta assim:

//ROM MEMORY
#pragma SetRomSize(4096)
#pragma SetPage(PAGE0, 0x0004, 0x0FFF)

ou seja, o compilador pensava que a memoria estava em uma
pagina só, então quando eu compilava, não apresentava
nenhum erro, porem quando ira rodar o programa no pic, ele
travava, (o programa só iria ficar rodando na primeira pagina)

copiei essa configuração do pic 16f690 (que tb é 4k)

//ROM MEMORY
#pragma SetRomSize(4096)
#pragma SetPage(PAGE0, 0x0004, 0x07FF)
#pragma SetPage(PAGE1, 0x0800, 0x0FFF)

ai o programa funcionou certinho, porem se alguma parte do
programa "cai" entre uma pagina e outra, o compilador apresenta
uma mensagem de erro.Mas nada que atrapalhe, pois coloquei
o main na segunda pagina:
main: org 2100
O programa ja esta com 3,5K, vou usar os 500bytes restantes para ascender um LED, se eu tivesse 800bytes, faria ele piscar.....


Tava olhando no forum mikroelektronika (veja bem, olhando, (as figuras) não disse lendo)
e tem um cara comentando como o compilador "ajeita" o programa na memoria, se uma subrotina vai ficar alocado entre uma pagina e outra, ele pula para a proxima pagina.
http://www.mikroe.com/forum/viewtopic.p ... ght=pclath
Recomendaram para ele usar um pic da serie 18F, que só tem uma pagina.

Sera que o mikrobasic não faz essa alocação sozinho?? ou o kraft não funciona?
(falar assim não tem problema né: quem tem o kraft do programa XXX)

Valeu Fabim

MensagemEnviado: 27 Mar 2007 07:50
por fabim
ageita sim sinho...

tem mais alguma definição erradinha.. so bizoiar..

no mais

8)

Fabim

á mais uma coisa.. com 500 restantes, vc faz um led piscar.. eu faço cum fusor nuclear..rsrs
o basic se souber brincar,,,, e incluir uns ASM da vida... 500 faz muitissima coisa

MensagemEnviado: 02 Abr 2007 04:42
por Rota
Fabim

finalizando:

terminei o programa (3,7k), esta funcionando certinho!!

realmente o compilador aloca sozinho os blocos do programa,
se um bloco cair entre a pagina 0 e pagina 1, ele pula
para a pagina 1, ficando um pouco da pagina 0 vazia.
Conforme alterava o programa, o compilador ia mudando de
lugar os blocos, para aproveitar melhor a memoria.



Obrigado mais uma vez


Marcelo