Página 1 de 1
Dúvida assembler no Hitech PICC !!!

Enviado:
06 Out 2009 18:57
por Andre_Cruz
Estou fazendo um termometro usando o compilador hitech picc, e por curiosidade eu quero colocar uma tabela usando a instrução RETLW do assembler para retornar o valor adquado da conversão.
Estou tentando fazer da seguinte maneira:
Código:
- Código: Selecionar todos
.
.
.
ctemp = (ADRESH*256 + ADRESL);
#asm // INICIO DO BLOCO EM ASSEMBLER
movf _ctemp,w
call tab_temp
movwf _temp
goto fa
tab_temp
addwf pcl,f
retlw 10
retlw 11
fa
#endasm // FIM DO BLOCO EM ASSEMBLER
O que eu quero fazer é:
Realizar a conversão do A/D e buscar esse valor em uma tabela.
Usar uma matriz consome muita memória e eu acho que usar a tabela em assembler é possivel só não consegui ainda.
No proteus da erro na instrução RETLW
Toda ajuda é bem vinda
Muito obrigado

Enviado:
06 Out 2009 19:13
por fabim
o andré, só me diz uma coisa.
essa tabela tem quantas casas, e qual pic esta usando.
Um mixo ponteirinho em C, não vai consumir nadinha.
Vai ser o mesmo tamanho da table em ASM, mais alguns bytes de comando..
Abraços
Fabim

Enviado:
06 Out 2009 19:23
por Andre_Cruz
fabim,
A tabela n�o tem casa decimal, � numero inteiro variando de 0 a 120, uma matriz com 121 posições, acredito que vai consumir uma boa parte da memória.
Esta em um 16F628.
Eu ja resolvi o problema.
Mas por motivo de aprendizado gostaria de fazer funcionar dessa maneira.
Obrigado

Enviado:
06 Out 2009 22:41
por vtrx
Ae Andre,te dou a maior força,C para microcontroladores é disperdício.

Enviado:
07 Out 2009 08:39
por Andre_Cruz
vtrx,
Programar em C para microcontroladores é uma faca de dois gumes, em C a construção do programa é mais rapida, mas consome mais memória e a execução do programa é mais lenta. Já no assembler a construção do programa é mais demorada, consome uma quantidade menor de memória e a execução do programa é mais rapida.
Estes novos PICs que trabalham com o clock acima de 20 MHz, acredito que eles ja estão sendo construidos de tal forma que otimize, a execução dos programas escritos em C, esta é a tendência eu acho.
Mas o preço é maior que um PIC simples, que em assembler trabalha com folga.
Mas meu objetivo é tentar usar as coisas boas das duas linguagens, em C eu efetuo os calculos e em assembler procuro na tabela, para deixar o código menor e mais rapido.
Agradeço a todos que visitaram o tópico.
Abraço

Enviado:
07 Out 2009 08:50
por fabim
maior força, tu ta enganado.
Eu programo em ASM, PASCAL, BASIC E C.
Quer source gerado bem grandinho ?
basic.. esse sim.
o montador pascal e c, deixam o asm para hex bem parecidos, apesar do pascal ainda ganhar.
Essa lenda de á fica grande isso fica grande aquilo.
Pô meu, se você sabe pegar uma string, formatar e tal´s em asm, porque demonios você quer usar librarys sprintf printf print ?
pô.
int a;
a = 1024; isso em C.
Olha o asm gerado.
movlw 0x04
movwf _a+0
movlw 0x00
movwf _a+1
tem alguma outra forma de fazer isso em ASM ? se tem não aprendi, fiquei 8 anos escovando bit, e mesmo assim não aprendi..rs
O pessoal confunde muito e se assusta.
quer ver uma coisa, num 16f877, usa o sprintf para formatação!!
Ele aloga uma pá de tabela, de funções etc.
um simples sprintf come quase 4K..
reveja os conceitos irmão, eu ja pensei como você, depois que comecei a colocar a mão na massa!!! a istoria mudou.

Enviado:
07 Out 2009 09:21
por Andre_Cruz
fabim,
Acho que me expressei mau.
É exatamente isso que eu quero fazer, fugir dessas bibliotecas que consomem um número absurdo de memória, por isso eu disse que o código fica maior.
Concordo com você no código assembler gerado, é a unica maneira de fazer um inteiro de 16 Bits.
No meu caso eu preciso de uma matriz com 121 posições, mas se eu declarar uma matriz desse tamanho vai consumir muita memória, estou procurando uma solução, para criar essa tabela, consumindo a menor quantidade de memória, e eu pensei em colocar essa tabela em assembler mas não estou conseguindo implementar.
Que futuramente esse código vai para um 12F675 também.
Obrigado pela resposta.
Abraço

Enviado:
07 Out 2009 10:38
por Djalma Toledo Rodrigues
fabim escreveu:maior força, tu ta enganado.
Eu programo em ASM, PASCAL, BASIC E C.
Quer source gerado bem grandinho ?
basic.. esse sim.
o montador pascal e c, deixam o asm para hex bem parecidos, apesar do pascal ainda ganhar.
Essa lenda de á fica grande isso fica grande aquilo.
Pô meu, se você sabe pegar uma string, formatar e tal´s em asm, porque demonios você quer usar librarys sprintf printf print ?
pô.
int a;
a = 1024; isso em C.
Olha o asm gerado.
movlw 0x04
movwf _a+0
movlw 0x00
movwf _a+1
tem alguma outra forma de fazer isso em ASM ? se tem não aprendi, fiquei 8 anos escovando bit, e mesmo assim não aprendi..rs ... .
Fabim
1024 Decimal -----> 400 Hexadecimal
Se o uC for de 8 Bits óbvio que ocupará dois Bytes , duas posições de Memória.
04 00 ou
00 04
Que dificuldade há em "Assemblar" isso ?
--------------------------------------------
André_Cruz - Matriz existe na idéia , no papel
a Memória, ou o Arquivo, é uma fila
Uma boa prática ao construir Tabela é colocar na primeira Posição o Comprimento da dita cuja.
.

Enviado:
07 Out 2009 12:49
por vtrx
Algumas pessoas me levam a mal quando tento incentivar a usar ASM.
Quero que os programadores saibam bem todas as linguagens possíveis,pois só assim´os brazucas não serão alienados dos alemães ou americanos.
Sei que para muitos ASM é demorado ou complicado,mas aí que está a diferença,se voce entende-la bem,será o melhor(pois as outras linguagens parecerão 'brincadeira').
No meu caso,tenho muita afinidade com ASM pois programo em ASM desde o Z80.
Garanto que ninguem deixou de fazer os 'windows' da vida,os video-games etc por não ter C disponível.
Eu programo para PC em Delphi,mas uso as rotinas principais em Assembly,por isso comentei que não usaria C em microcontroladores,pois o espaço de memoria é pequeno e as intruções são poucas,mas não desprezo a linguagem C,apenas acho que se alguem quer conhece-la(ASM),tem essa oportunidade de aprende-la ou usa-la com microcontroladores.

Enviado:
07 Out 2009 13:07
por fabim
vtrx, de forma alguma te levei a mal.
Apenas coloquei que.
Se o programador não for um completo xupinho de tecnologia, que apenas pega o que ja esta pronto e CTRL+C, V, compila e faz funcionar.
Ele com certeza, conhece o ASM, que é o basico para saber o que passa no hw do uC.
Ja vi foristas aqui, querendo saber no CCS, como faz pra desligar os comparadores analogicos.. tipo qual o comando do CCS.
Pô meu,
CMCON = 0x07;
Olha o carilho do datasheet, se a IDE for um pouquinho inteligente vai ter um header do uC com o nome CMCON, e não um comando alienado ao endereço do registrador apenas.
Por isso eu digo.
Quem aprende apenas em alto nivel, apanha, apanha, apanha.
Até que um dia descobre que o C, pode ser encarado como um ASM em alto nivel..rsrs
Quer pior.?
- Código: Selecionar todos
XXXX diz:
Fabim, como separar "DM, M, C, D, U". De uma variavel de 16 bits ?
Eu uso o comando IntToStr, e os valores não são decimais, são ASCII.
Fabim diz:
Bom, realmente cara, não tem como. Vou ficar te devendo.
XXX diz:
Blz, Obrigado assim mesmo
Pô meu.
Char variavel[6], cont;
for(cont=0; cont<6; cont++){
if(variavel[cont]!=null){ variavel[cont] -= '0'; }
}
Tendeu agora ?
Em alto nivel, PC, existem comandos prontos.
Alto nivel para uC, tambem existe os mesmos comandos. Sabe-se La Deus, que tamanho e como ele pega ASC, tira DEC.
Tendeu ? Tendeu ?
Abração Cara!!
Fabim

Enviado:
07 Out 2009 13:47
por Djalma Toledo Rodrigues
fabim escreveu: Pô meu,
CMCON = 0x07;
Olha o carilho do datasheet, se a IDE for um pouquinho inteligente vai ter um header do uC com o nome CMCON, e não um comando alienado ao endereço do registrador apenas. ... Fabim
Comando Alienado ?
Movlw 0x07
Movwf CMCON
Você tem a ousadia de chamar uma coisa tão clara, que até dispensa comentário de Comando Alienado Fabim ?
.

Enviado:
07 Out 2009 13:52
por fabim
Ja programou em CCS? ja usou ? ja teve o saco cheio de explicar pra um iniciante ?
Intão cale-se.rs

Enviado:
07 Out 2009 16:11
por Andre_Cruz
Pessoal só pra constar.
O código que eu postei no inicio do tópico, funciona corretamente !
Estava com problema na variavál "ctemp", efetuo mais alguns calculos para tratar o resultado do A/D para buscar o valor correspondente na tabela e ai estava o problema.
Consumiu pouca memória, acredito que foi uma boa solução para criar uma tabela consumindo pouca memória em C, ai vai minha dica para quem também precisa economizar memória do uC.
Agradeço a todos que ajudaram!
A discussão sadia sobre as linguagens de baixo, médio e alto nivel esta interessante.
Fabim nesse ponto do CCS eu concordo contigo, é muito cheio de nove horas rsrsrss
Abraço