Mirror byte Z8encore

Software e Hardware para uC Zilog

Moderadores: 51, guest2003

Mirror byte Z8encore

Mensagempor Nightcrawler » 02 Jun 2007 00:12

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.
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Re: Mirror byte Z8encore

Mensagempor Rodrigo_P_A » 02 Jun 2007 09:27

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
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor Nightcrawler » 02 Jun 2007 10:36

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.
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor eletroinf » 02 Jun 2007 21:46

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!
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor Nightcrawler » 02 Jun 2007 23:14

Grande Morin.... nada como entender um pouco de assembler do mcu. Valeu a ajuda.
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor Rodrigo_P_A » 02 Jun 2007 23:45

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?
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor Nightcrawler » 06 Jun 2007 10:29

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
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor KrafT » 06 Jun 2007 13:05

Por isso que eu amo a Zilog.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor Rodrigo_P_A » 06 Jun 2007 13:08

KrafT escreveu:Por isso que eu amo a Zilog.


a bão, acho que eu cafundi com os PICas
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor Nightcrawler » 07 Jun 2007 13:51

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");
}

Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor eletroinf » 12 Jun 2007 21:51

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.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor Nightcrawler » 13 Jun 2007 09:45

Ricardo, e com relação a minha duvida acima?? O comando só funciona com variaveis globais e statics???
Diego
Avatar do usuário
Nightcrawler
Byte
 
Mensagens: 450
Registrado em: 11 Out 2006 14:20
Localização: Santa Maria - RS

Mensagempor eletroinf » 14 Jun 2007 16:45

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:
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS


Voltar para Zilog

Quem está online

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

x