Página 1 de 1

comandos em HEX

MensagemEnviado: 26 Out 2009 07:38
por cdaonil
SRs. Estou com dificuldades pra enviar comandos em HEX para Rs232, basicamente nao quero usar mais em Assembly , uso CCS.
em asm seria assim:
DT 0X04, 0X09, 0XFD, 0X44, 0X0D, 0XE3 0xCheck Sum .
|_tamanho do comando

No Css ja usei o Putc , fputc , puts etc.. estao dando erro de Stream e nao sei o que significa nem como resolver
A principio estou usando 9600 baud para visualizar no Siow (hiperterminal), mais no final será em 14400. (manchester).

Srs poderiam me dá uma luz , pois sao varios comandos a serem enviados com CS no final.
Mais uma Vez Obrigado.

MensagemEnviado: 26 Out 2009 10:43
por ze
Parabens por tua decisão básica, mas não posso dizer o mesmo sobre o ccs e suas funções malucas. Bom, num “compilador” C veja a sugestão de como faria (não sem antes setar o hw do uc):
Código: Selecionar todos
...
unsigned char const dado={0X04, 0X09, 0XFD, 0X44, 0X0D, 0XE3}; //tirei o chsum da tabela pois ele vai ser calculado na função
...
unsigned char chs=0;
for (i=0;i<6;i++) { //tamanho do comando. se o chsum tiver junto, some 1 --- uc 8 bits gosta + de 8.
chs+=dado[i];
TXREG=dado[i]; //depende do uc   
while(!TRMT); //depende do uc
}
TXREG=chs; //envia chsum   
while(!TRMT); //depende do uc
...


Auto explicativo para um mediano programador e mediano conhecedor do circuito do uc e o tamanho do cód a ser gravado ficaria o mesmo do que feito masoquistamente em asm.
Talvez seja melhor colocar o chsum como constante no fim da série mesmo.
Pra ver em hexa no pc eu usava um tal de docklight
abç

MensagemEnviado: 26 Out 2009 11:32
por vtrx
cdaonil,a sua escolha ja ta te dando trabalho com uma simples função,prepare-se porque não vai conseguir programar em C com a eficiência do ASM,terá que achar uma 'alternativa' em compiladores ou uma função semelhante.

MensagemEnviado: 26 Out 2009 12:07
por cdaonil
:!:
Obrigado pela informação, mais agora me deparei com 2 erros , nao sei se por causa do compilador ccs , usando 16f628a.

#include <16F628A.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=40000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC)


//Transmissão
#BYTE TXREG = 0X19
#BIT TRTM = PORTB.2

void main()

{
unsigned char const dado=(0X04, 0X09, 0XFD, 0X44, 0X0D, 0XE3); //coloquei parenteses
unsigned char chs=0;
char i;
for (i=0;i<6;i++) //tamanho do comando. se o chsum tiver junto, some 1 --- uc 8 bits gosta + de 8.
chs+=dado[i]; // --------> nao aceita chaves
TXREG=dado; // ----------->configurei ok
while(!TRMT); // -------------> quando configuro da erro na 1ª função main.

TXREG=chs; //envia chsum
while(!TRMT); //depende do uc
}
}


Nao sei se usando o mickroC funcionaria.. mais já que estou no CCs o geito e fazer funcionar nele mesmo.

MensagemEnviado: 26 Out 2009 15:27
por ze
tá faltando “{“

isso num tem muito a ver:
//Transmissão
#BYTE TXREG = 0X19 ---> não sei. É assim que o ccs define os regs internos? (não responda não quero saber). 0x19 parece não ser o end do txreg
#BIT TRTM = PORTB.2 ---> TRTM não é bit de porta! O que + se aproximaria é TXSTA.1

uma nano aula sobre os registros deste uC:
TRMT é o bit 1 de TXSTA (status) que indica buffer vazio. Ou seja o dado já saiu. Infelizmente não sei (e não quero saber) como seu precioso ccs trata tais registros (deve ser uma função cavalar só pra ler um bit!) Sugiro passar os olhos pelo datashit do pic e no help desta droga do compilador. Abra os 2 e pressione alt-tab. Tente entender como o circuito interno do pic funciona. Depois disto tente programar os registros sem usar os horrores tipo #uses, #fuses & #fucks. Open your mind!!
abç

MensagemEnviado: 26 Out 2009 17:58
por cdaonil
Obrigado Lellis, estou entrando neste mundo do C, ja no asm estou aposentando. Fiquei facinado com as possibilidades de hoje, bluetooth, Gps, Http , usb etc ..em microcontroladores que parti pra essa empreitada, aqui no Rio nao temos cusos de Mikroc só de CCS , porem mesmo assim comprei um curso webaula de SP baseado no Mikroc.. mais video aula já viu né.. E fiz um curso presencial do CCS...Devagar vou parendendo a usar as novas rotinas e esquecer o passado btfsc rp0...
Mais uma vez obrigado.

MensagemEnviado: 26 Out 2009 20:26
por aureo.oliveira
Tente assim:

char dado[6] = {0X04, 0X09, 0XFD, 0X44, 0X0D, 0XE3};
char chs=0;
char i;
for (i=0;i<6;i++)
{
chs+=dado[i];
putc(dado[i]);
}
putc(chs);
//putc(0x0D);

ps: Para receber com gets tem que terminar com 0x0D.

MensagemEnviado: 27 Out 2009 19:42
por cdaonil
:) Agradeço a todos pela ajuda! Esta ultima Rotina funcionou perfeitamente. Vlw.