Alterar apenas um bit de um byte, como?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor neto_e_khelen » 19 Jan 2010 10:45

Ok, mas ainda não entendi...Sou iniciante ainda e com muito pouca experiência. Será que você tem algum exemplo pra mim de como alterar o bit sem mudar o restante???? :roll:
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Mensagempor Djalma Toledo Rodrigues » 19 Jan 2010 11:35

O problema é que você criou através do C, uma Variável de muitos Bits , ou Bytes.

Mas o µC trabalha com Byte.

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor neto_e_khelen » 19 Jan 2010 11:42

Como você acha que daria certo então??? estou mais perdido que cego em tiroteio.....
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Mensagempor ze » 19 Jan 2010 13:11

"saida &= 0b10111111;
Veja apenas o bit6 como zero, ou seja, o and força este bit a zero, sem fuçar nos outros bits.

saida &= 0b00000100;
Veja apenas o bit2 como 1, ou seja, o or força este bit a 1, sem fuçar nos outros bits."

veja o que teclou nosso véio amigo. errou ou melhor enganou (mestre não erra) no 2º ex. mas tudo bem. O desengano seria: saida |= 0b00000100;
outro véio: "Mas o µC trabalha com Byte. " corrigindo, ou melhor complementando (mestre não erra): Mas o µC "de 8 bits" trabalha "melhor" com Byte.

De novo: manipular bits INTERNOS ao uC é diferente de manipular de seus "periféricos". Depende de seu hw. Vamos varrer 8 bits no seu 74hc595 então?

sinal A (pino 14) em RB0, shift ck (pino 11) em RB1, latch ck (pino 12) em RB2

void shift(unsigned char sh)
{
unsigned char s;
for (s=0; s<8; s++) //desloca 8 bits
{
RB0=sh; //bit de dado a partir do bit 0
RB1=1;RB1=0;// shift ck
sh>>=1;//próximo bit
}
RB2=1;RB2=0; //latch ck
}

o parâmetro sh é interno e pode ser manipulado via outra variável 2º dicas anteriores. ex. a=0;setbit(a,1);shift(a);//só liga 2º bit

quer que eu vá aí montar pra você? rs.

sorry no msn. may be skype?
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor neto_e_khelen » 19 Jan 2010 13:41

Certo, mas como isso funcionaria com uma variavel de 32 bits ????
Qual seu skype?
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Mensagempor Djalma Toledo Rodrigues » 19 Jan 2010 17:42

Mas, Lellis ele colocou 4 Shift Reg. em série - Daí naturalmente essa Variável de 32 Bits.

creio que a melhor solução é Enviar 4 Bytes pois, aí pode selecionar o Byte e alterar
o Bit (desse Byte) que quizer e depois enviar os 4 Bytes


DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor neto_e_khelen » 19 Jan 2010 21:10

Djalma Toledo Rodrigues escreveu:Mas, Lellis ele colocou 4 Shift Reg. em série - Daí naturalmente essa Variável de 32 Bits.

creio que a melhor solução é Enviar 4 Bytes pois, aí pode selecionar o Byte e alterar
o Bit (desse Byte) que quizer e depois enviar os 4 Bytes


DJ

Não entendi.... :?
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Mensagempor Djalma Toledo Rodrigues » 19 Jan 2010 22:55

Você mesmo disse :

O negócio é o seguinte: Estou montando um circuito com 4 ci´s 74hc595 e 4 74ls165.

E como fala em Variável de 32 Bits ( = 4 Bytes), deduzo que os Shift Register estão
em Série.

Não é isso ?

Das diversas opções você pode criar 4 Variáveis de 8 Bits, ou 1 Byte, e envia-las em
sequência para os Shift Register .

- assim fica mais fácil alterar um Bit de uma delas.


DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor neto_e_khelen » 20 Jan 2010 06:42

O problema é que mesmo usando só um byte, quando altero um bit dela ela está mudando o restante. QUero aprender a mudar um bit de uma variavel sem alterar o restante...
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Mensagempor fabim » 20 Jan 2010 07:19

Bom, antes que eu seja mau educado, e diga inferno da m****.

http://www.asm51.eng.br/phpbb/viewtopic ... ght=makros

Cara dificil eim? E me diga uma coisa, tu colocou 4 shifts externos, tu tem certeza que essa rotininha esta enviando os 4 bytes ?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 20 Jan 2010 07:24

ouça as sabias palavras do dj. vou tentar pela última vez traduzir antes de ir aí te dar uns cóques: manipule só byte ex. as macros clrbit(a,b) e setbit(a,b) isso é INTERNO ao chip. pra mandar pro mundo EXTERNO e DEPOIS disto, envie 1 byte por vez com função semelhante as que te passei 4 vezes totalizando 4 bytes de 8 bits que significa 8 vezes 4 é igual a 32 pois seus 4 shift regs 74hc595 devem estar em série!!!!!
Tô sem lápis e papel pra lhe desenhar
(tô brincando amiguinho... pode continuar a perguntar caso ainda não esteja claro, claro)

skype só perguntei se podia ser e não significa que vou te dar


abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Vonnilmam » 20 Jan 2010 10:18

Nossa qui doidera é essa,


Se eu fize-se esse treco em assembler seria a coisa mais facil do mundo!

Uma sugestão de quem esta aind aprendendo a lidar com C.

Em assembler eu faria o seguinte:

Vc irá utilizar 4 shift register em cascata certo? Então vc poderia, poderia criar ao invés de uma variável de 32 bits, criaria 4 variáveis de 8 bits cada uma, montaria o seu drive que seria responsável pelo envio correto dos sinais de controle do shift (clock, strob e data "mensionei esses sinais porque eu trabalho muito com o CD4094, ok)...

Segundo: Vc manipula as variáveis bit a bit e envia no final da sua rotina todas as 4 variáveis de uma só vêz para o seu drive (sim assim podemos chama-lo) que controla os shifts ou seja só faria o refresh dos shifts apenas no final do loop da sua rotina....

Peço desculpas se falei abobrinha, porque como eu disse estou aprendendo C, porém em assembler eu faria desta forma como explicado, aliás eu faço assim,

boa sorte,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor fabim » 20 Jan 2010 11:45

vonnilman, não falô gilósinho não. é isso mesmo.

Só lembrando que o ANSI C, pode ser chamado de ASM em alto nivel, tu manipula diretamente o hw e os dados...
O que diferencia um de outro, é a capacidade de entender e usar a linguagem. Veja por exemplos as makros que eu montei... coisamaissimplesdomundoatéummacacoconseguiriausaraquiloeessetalde shiftregisteréigualofamoso94tudomesmacoisa, nãoseiporqueeleestasofrendotantocomumacoisatãoidiota.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor neto_e_khelen » 20 Jan 2010 12:02

fabim escreveu:vonnilman, não falô gilósinho não. é isso mesmo.

Só lembrando que o ANSI C, pode ser chamado de ASM em alto nivel, tu manipula diretamente o hw e os dados...
O que diferencia um de outro, é a capacidade de entender e usar a linguagem. Veja por exemplos as makros que eu montei... coisamaissimplesdomundoatéummacacoconseguiriausaraquiloeessetalde shiftregisteréigualofamoso94tudomesmacoisa, nãoseiporqueeleestasofrendotantocomumacoisatãoidiota.


Pior que to sofrendo mesmo...ACho que estou tentando dar um passo maior que as pernas.... To quase desistindo....Peguei o Makro que você fez. Criei um arquivo <neto.c> e adicnionei no meu código. Consegui usar as funções:
clrbit0(saidas);
setbit0(saidas);
Mas não entendi como juntar 4 variaveis de 1 byte em uma só de 32 bytes. Precisava de um exemplo de uso do código pra eu enteder melhor, sou muito leigo ainda. Se puder ajudar ainda eu agradeço, caso não, agradeço mesmo assim a ajuda que já me deu.
neto_e_khelen
Bit
 
Mensagens: 33
Registrado em: 22 Jul 2009 19:01

Mensagempor ze » 20 Jan 2010 13:33

Prepara a cabeça que tô ino aí te dar um cocão.
aula 666. vamos colocar 4 bytes dentro de uma variável long 32 bits então uai:

struct bs
{
unsigned char byt0;
unsigned char byt1;
unsigned char byt2;
unsigned char byt3;
};
union
{
struct bs _4bytes; //4 bytes contidos em...
unsigned long longbyte; //32 bits olha ela aí!
} ulongbyte;

o macete é usar union (pesquise isso) que faz variáveis diferentes ocuparem o mesmo espaço na mem mas com um certo respeito entre elas.
pra facilitar o uso no fonte faço assim:
#define var32 ulongbyte.longbyte //long 32 bits dividido em
#define byte0 ulongbyte._4bytes.byt0 //4 bytes de 8 bits
#define byte1 ulongbyte._4bytes.byt1
#define byte2 ulongbyte._4bytes.byt2
#define byte3 ulongbyte._4bytes.byt3

se eu fizer var32=0x12345678 voce consegue ver byte3 a byte0 dentro dela (?? e !!)

já sei já sei "num entendi ainda, tiu". até parece que ia entender mesmo neh! mas daqui a algum tempo quando tiver + véio, volta neste post e faz ctrl-c ctrl-v. na verdade nem eu entendo direito aquela m**** acima apesar de ser eu mesmo o autor há alguns anos. pede pra um outro trôx... amigo, implementar campos de bit na doidera acima. Fica mais lôco ainda (e acho que até + fácil). ou você mesmo faz no futuro espero que próximo. Mas repetindo: fica elegante no sw mas não otimizado pro teu hw. long e uC 8 bits não combinam muito. muito menos pruma aplicação tão simples como a tua. O certo é as dicas que JÁ LHE DEMOS!!!!

abç & boa sorte! agora cansei...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x