ajuda Matriz bit sdcc

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

ajuda Matriz bit sdcc

Mensagempor Meson » 12 Set 2008 19:09

Alguém sabe como fazer uma matriz do tipo bit no sdcc?

Normalmente matriz do tipo char é assim:

char matriz[22];

Funciona legal só que eu quero usar apenas um bit em cada lugar da matriz, dai é um desperdício usar uma matriz do tipo char para salvar apenas um bit em cada espaço.

já tentei assim mas não funcionou:

bit matriz[22];

alguém tem uma luz?


Obrigado.
Meson
Nibble
 
Mensagens: 54
Registrado em: 13 Out 2006 08:31

Mensagempor Djalma Toledo Rodrigues » 12 Set 2008 19:18

Eu programo em Assembler. O 8051 me parece que é o único uC com a opção boleano, de apenas um bit . É o uC ideal para o Grafcet.

Existe possibilidade de incluir instruções Assembler no C ?
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Maurício » 12 Set 2008 20:22

Djalma.

O que é Grafcet?

Tú mistura as estações, a gente fica perdido! :cry:

E, sim! Existe a possibilidade de se incluir código assembler, dentro de um programa em C. Se vc programar usando o Keil.

Meson.

Eu nunca ví matriz de bits no 8051, usando o Keil.
Esse tipo de notação, no Keil é proibido. Com relação ao SDCC não sei te dizer.

O que vc pode fazer, é declarar uma varíavel inteira (byte, int, long, etc), dentro da área binária do 51, p. ex:

Código: Selecionar todos
unsigned long int bdata dado;
sbit dado_bit31 = dado^31;


Não lembro mais se é essa notação, mas, a idéia é por aí!

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor barboza » 12 Set 2008 21:04

Sim, é possível incluir Assembler dentro do C, e a forma depende de cada compilador.

Sobre a matriz de bit, vai umas correções e dicas.
Não conheço o sdcc, mas se é C, deve ou deveria ser padrão.

em C, para declar matriz é:

tipo nome[y][x];

Assim é só um vetor;

tipo nome[x];

Mas como no C não tem o tipo bit, você pode fazer uma matriz de bit, através de um simples vetor, ou de uma matriz mesmo.


Um exemplo:
Matriz de bit 8 x 8;

Código: Selecionar todos
unsigned char matriz[8];


Neste caso você terá 8 elementos, que você deve tratar como sendo o alinhamento no eixo y, e a variação em x você faz com logica binária.

Se você quer o bit da posiçao y = 5, x = 3;

Código: Selecionar todos
bit = ((matriz[y] & (1<<x)) >> x);


Neste caso o bit MSB será o oitavo elemento da posição x.

Se precisar uma matriz maior em x, basta trocar o tipo de dado. Exemplo, 16 usa tipo int, mais vai pra long,.....
Claro isso depende da plataforma que esta trabalhando.

Se não tiver o tamanho que precisa, você pode usar multiplos elementos com uma declaração do tipo matriz mesmo.

Exemplo de 8 x 16, usando unsigned char.

Código: Selecionar todos
unsigned char matriz[8][2];


Neste caso, o byte da posição 0, será seus bits de 0 a 7, e o byte de index 1, os bits de 8 a 15. O mesmo conceito vale para outros tipos de dados. Só que ai sua logica de acesso vai ter que melhorar para saber qual o index do bit que quer. Nada dificil.

Código: Selecionar todos
index_byte = (index_bit / 8);
index_real_bit = (index_bit % 8);


Se quiser usar mais recursos do C, poderia usar bit field, mas ai neste momento, acho que sua lógica de acesso pode ficar pior.

Se bem que com ponteiro e um swicth fica facil.




Código: Selecionar todos
BOOL   p_get_bit_matriz   (U8   *u8_matriz, U8 u8_x, U8 u8_y)
{
   swicth (u8_x)
   {
   case 0:   return   u8_matriz[u8_y].bit_0;
   case 1:   return   u8_matriz[u8_y].bit_1;
   case 2:   return   u8_matriz[u8_y].bit_2;
   case 3:   return   u8_matriz[u8_y].bit_3;
   case 4:   return   u8_matriz[u8_y].bit_4;
   case 5:   return   u8_matriz[u8_y].bit_5;
   case 6:   return   u8_matriz[u8_y].bit_6;
   case 7:   return   u8_matriz[u8_y].bit_7;
   }   
}



Acho que funciona, tem que testar.

Acho que chega, pois este foi meu maior post aqui. Inspirado.[/code]
Editado pela última vez por barboza em 12 Set 2008 21:18, em um total de 1 vez.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Meson » 12 Set 2008 21:16

Mauricio, o que eu quero fazer é isso aqui:



while (conta_mat<=28){

chav1[conta_mat]=bits[conta_mat];
conta_mat++;

}

só que a matriz bits ten 28 posições e é do tipo char

char bits[27];

posso declarar as variáveis bits na munheca no inicio do programa:

bit bits1;
bit bits2;
bit bits3;
.
.
bit bits28;

não tem problema só naum sei como poderia fazer uma função que, como a anterior após incrementar uma variável que serviria para o índice. Pra não ter que fazer na maum a comparação assim:


chav1[1]=bits1;
chav1[2]=bits2;
.
.
chav1[27]=bits27


Pois terei q comparar e atribuir varias vezes com as matrizes chav1,chav2 ... até chav29, dai o programa fica muito grande. e vou desperdiçar muita memória assim.

Tem idéia de com posso fazer assim?



Obrigado.
Meson
Nibble
 
Mensagens: 54
Registrado em: 13 Out 2006 08:31

Mensagempor Djalma Toledo Rodrigues » 12 Set 2008 21:21

Barbosade minha parte - Obrigado
Do restante estou "embasbacado" ( ki palavra rsrs) . Como sabe de C.
Parabens.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor barboza » 12 Set 2008 21:32

Djalma Toledo Rodrigues escreveu:Barbosade minha parte - Obrigado
Do restante estou "embasbacado" ( ki palavra rsrs) . Como sabe de C.
Parabens.


Não há o que agradecer...
Mas eu também fico embasbacado as vezes com algumas coisas que vejo por ai, muitas do tipo "ainda faço isso sozinho", outras vezes do tipo "não faço isso mais..."

Afinal se tiver 4 anos que programo em C é muito.
Quando se rala escovando bit em assembler, MCU de 4, 8 bits, ..... e trabalhando com códigos de gente "grande" se aprende mto.

Aqui no fórum tem gente "grande" também, outros se acham grande demais (ou seria maiores?), é verdade.

Acho que um que irá se dar bem com o C é o brasilma, pois depois de penar com assembler, esta se deliciando com o C. rs
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Maurício » 12 Set 2008 22:12

Meson.

Quando for postar código, usa o botão CODE, logo abaixo do campo "Assunto", no alto da janela de edição.

Apareceu um whink no seu código, que bagunçou a visualização.

Descreva o que vc quer fazer com bits. Não se pode usar matriz de bits em C, pelo menos no Keil. E nem campo de bits o compilador permite.

Como eu não conheço o SDCC, não sei te dizer se o mesmo se aplica à ele.

Posta aí, dom!

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Meson » 16 Set 2008 11:30

Barboza, muito obrigado!
Mauricio, obrigado pela dica!

Vou tentar fazer como o Barbosa indicou.
Obrigado.
Assim que tiver algo posto aqui.
Meson
Nibble
 
Mensagens: 54
Registrado em: 13 Out 2006 08:31

Mensagempor Sergio38br » 17 Set 2008 08:19

Alguem poderia me informar se o SDCC ou o Keil aceita struct ou union, com declaração de bits????

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor barboza » 17 Set 2008 08:28

Keil:

Você pode criar bit filed e inserir na estrutura e/ou union.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Sergio38br » 17 Set 2008 08:32

Obrigado..

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor joao » 18 Set 2008 06:19

Aproveitando a idéia do Barboza deixo um exemplo aqui...
Testei no windows e funcionou.
Provavelmente irá funcionar no 8051, desde que ele aceite o comando define.

Código: Selecionar todos
#define SET_BIT(matriz,x,y)   ( matriz[y] |= (1<<x))
#define GET_BIT(matriz,x,y)   ((matriz[y] & (1<<x)) >> x)
#define CLEAR_BIT(matriz,x,y) ( matriz[y] = (matriz[y] & ~(00000000 | (1<<x))) >> x)

int main()
{
    unsigned char teste[8];    //gera uma matriz de bits de 8x8

    SET_BIT(teste,5,3);        //Seta bit posi 5x3
    if (GET_BIT(teste,5,3))   //Pega o valor do bit posi 5x3
    {
          CLEAR_BIT(teste,5,3); //Limpa o valor do bit posi 5x3
    }
}


Desta maneira, vc pode ainda ter várias matriz se quiser...
Pois vc passa como parametro ela.

Se você ver no código, vai achar um 00000000 escrito. São 8 ZEROS porque é um char. Caso vc queira trabalhar com uma matriz maior, como por exemplo um int. muda essa mascara para 32 ZEROS.
Se quiser ver os valores eu tava usando:
printf("%d", teste[3]);
vc vai ver que ele muda de 0 para 32 quando vc seta o bit 5.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x