Mikrobasic - paginação memoria

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mikrobasic - paginação memoria

Mensagempor Rota » 22 Mar 2007 16:38

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
Rota
Byte
 
Mensagens: 116
Registrado em: 16 Nov 2006 21:29

Mensagempor fabim » 22 Mar 2007 16:43

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
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Rota » 22 Mar 2007 18:04

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
Rota
Byte
 
Mensagens: 116
Registrado em: 16 Nov 2006 21:29

Mensagempor fabim » 23 Mar 2007 08:06

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
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Rota » 25 Mar 2007 16:24

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
Rota
Byte
 
Mensagens: 116
Registrado em: 16 Nov 2006 21:29

Mensagempor fabim » 26 Mar 2007 08:57

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
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Rota » 27 Mar 2007 06:50

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
Rota
Byte
 
Mensagens: 116
Registrado em: 16 Nov 2006 21:29

Mensagempor fabim » 27 Mar 2007 07:50

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
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Rota » 02 Abr 2007 04:42

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
Rota
Byte
 
Mensagens: 116
Registrado em: 16 Nov 2006 21:29


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x