Página 1 de 1

Mirror byte Z8encore

MensagemEnviado: 02 Jun 2007 00:12
por Nightcrawler
Estou usando a SPI do Z8F0822, pra se comunicar com um HT1380. Só que a o padrão de envio e recebimento do HT1380 é iniciando pelo LSB. Pelo que eu li, o Z8F0822 inica somente pelo MSB. Como poderia fazer uma rotina para inverter os bits MSB pelos LSB ?? Programo em C.

Re: Mirror byte Z8encore

MensagemEnviado: 02 Jun 2007 09:27
por Rodrigo_P_A
Nightcrawler escreveu:Estou usando a SPI do Z8F0822, pra se comunicar com um HT1380. Só que a o padrão de envio e recebimento do HT1380 é iniciando pelo LSB. Pelo que eu li, o Z8F0822 inica somente pelo MSB. Como poderia fazer uma rotina para inverter os bits MSB pelos LSB ?? Programo em C.


char dado, dadoswap,n;
dadoswap=0x00;
for ( n=0x00;n<0x08;n++){
if ( dado&0x01 ) dadoswap|=0x01;
dado>>=1;
dadoswap<<=1;
}

acho que funciona

MensagemEnviado: 02 Jun 2007 10:36
por Nightcrawler
Valeu a dica Rodrigo. Como eu tava com um pouco de pressa, fiz da maneira mais simples... hehhehe
Código: Selecionar todos
unsigned char inverte_bits(unsigned char dado)
{
   unsigned char d = 0;

   if(dado & 0x80) d |= 1;
   if(dado & 0x40) d |= 2;
   if(dado & 0x20) d |= 4;
   if(dado & 0x10) d |= 8;
   if(dado & 8) d |= 0x10;
   if(dado & 4) d |= 0x20;
   if(dado & 2) d |= 0x40;
   if(dado & 1) d |= 0x80;

   return d;

}


Vou testar a sua hoje.

MensagemEnviado: 02 Jun 2007 21:46
por eletroinf
Eita...
Que mão de obra...
Pode fazer assim:

unsigned char near teste; //Variável global, usa o near (pág. direta)

Daí, no programa:
asm("BSWAP teste"); //Pronto, faz o que tu quer!

MensagemEnviado: 02 Jun 2007 23:14
por Nightcrawler
Grande Morin.... nada como entender um pouco de assembler do mcu. Valeu a ajuda.

MensagemEnviado: 02 Jun 2007 23:45
por Rodrigo_P_A
eletroinf escreveu:Eita...
Que mão de obra...
Pode fazer assim:

unsigned char near teste; //Variável global, usa o near (pág. direta)

Daí, no programa:
asm("BSWAP teste"); //Pronto, faz o que tu quer!


kra, esta instrução troca os NIBBLES ela num inverte os bits, ou inverte?

MensagemEnviado: 06 Jun 2007 10:29
por Nightcrawler
Rodrigo_P_A escreveu:kra, esta instrução troca os NIBBLES ela num inverte os bits, ou inverte?


A instrução que inverte os nibbles é SWAP. BSWAP inverte os bits.

Imagem

MensagemEnviado: 06 Jun 2007 13:05
por KrafT
Por isso que eu amo a Zilog.

MensagemEnviado: 06 Jun 2007 13:08
por Rodrigo_P_A
KrafT escreveu:Por isso que eu amo a Zilog.


a bão, acho que eu cafundi com os PICas

MensagemEnviado: 07 Jun 2007 13:51
por Nightcrawler
eletroinf escreveu:unsigned char near teste; //Variável global, usa o near (pág. direta)
Daí, no programa:
asm("BSWAP teste"); //Pronto, faz o que tu quer!


É, só funciona se for variavel global. E se for local???

SE a variavel for STATIC, vi o seguinte código numa AN da Zilog:

Código: Selecionar todos
unsigned char Zswap_bits( unsigned char data_byte)
{
    static unsigned char  temp_value;
     
    temp_value = data_byte;
    asm("ldx R0,_0temp_value");    // Static variables to be
                                                  // prefixed by_0
    asm("bswap R0");                    // when  accessing through the assembly
    function
    asm("ldx _0temp_value, R0");
}


MensagemEnviado: 12 Jun 2007 21:51
por eletroinf
Bueno,
eu fiquei alguns dias sem internet, não pude acompanhar esse tópico, mas, só complementando, concordo com o post do Kraft, ainda mais depois de experimentar os HC/HCS...
Pena que não tem instrução de divisão nos Z8encore.

MensagemEnviado: 13 Jun 2007 09:45
por Nightcrawler
Ricardo, e com relação a minha duvida acima?? O comando só funciona com variaveis globais e statics???

MensagemEnviado: 14 Jun 2007 16:45
por eletroinf
Pelo que entendi, olhando rapidamente o manual da Zilog, a instrução SWAP usa o endereçamento de 4 bits. Então, o caso do teu código, a variável static não é especificada como near, ou seja, está fora do alcance de endereçamento da instrução SWAP. Então, é usado o "asm("ldx R0,_0temp_value")" para "trazer" a variável para um endereço ao alcance da instrução SWAP (no caso o registrador R0) e por fim, após a execução do SWAP, o valor é "devolvido" com "asm("ldx _0temp_value, R0");".
Ainda, mexendo no "RP[7:4]" ou usando o endereçamento indireto (swap @Rx) pode-se acessar até 255 endereços.
Falando sério, asm pra Z8Encore é coisa pra doido. Mas é bom pegar umas mãnhas do dito cujo pra fazer aquilo que os compiladores não sabem fazer direito :lol: :lol: