Página 1 de 1

Construindo um Byte [Resolvido]

MensagemEnviado: 17 Nov 2009 20:20
por eduardo_gsp_oliveira
boa noite a todos do forum
alguem sabe me dizer se é possivel criar um programa que realiza a seguinte rotina

veja o sinal que esta entrando no pino D5 ex 1
armazena na variavel =1
espera um tempo
veja o sinal que esta entrando no pino D5 ex 0
armazena na variavel =10
espera um tempo
veja o sinal que esta entrando no pino D5 ex 0
armazena na variavel =100
espera um tempo
veja o sinal que esta entrando no pino D5 ex 1
armazena na variavel =1001
espera um tempo
....
e assim vai até formar 1 byte para ser armazenado
estou usando o mikroC e o pic 18f452
espero ter espllicado direito e obrigado a todos

MensagemEnviado: 17 Nov 2009 20:29
por MOR_AL
Verifique o capítulo de comunicação serial USART no datasheet. Lá tem algo assim. Capítulo 16, página 165.
Este capítulo não trata de exatamente o que você procura. O que você deseja fazer é bem mais simples, mas é o mesmo princípio.
O que você quer fazer é algo assim (em pseudo código, ou quase assembler)

Imagem
MOR_AL

MensagemEnviado: 17 Nov 2009 20:40
por Jozias del Rios
Acho que SPI seria um periférico mais apropriado... para não ter erro de formato

Mas o que seria mais apropriado para ele mesmo seria tipo:


getbyte:
movlw 8
movwf counter
clrf value

inloop:
bcf STATUS, C
rcl value, F

btfsc PORTA, BIT
incf value, F

;espera....

decfsz counter
goto inloop

return


espero que o eduardo não fique todo embananado com esse codigo hehe... estuda ele menino, e mete a cabeça nesse ASM tosco do PIC... boa sorte... e sem luta não há recompensa... lute com ASM e sua recompensa será maior :P

MensagemEnviado: 17 Nov 2009 21:32
por eduardo_gsp_oliveira
obrigado a todos pelas respostas :D
realmente de ASM eu não entendo muito, mas estou aqui fuçando em
tudo quanto é lugar para aprender mais sobre rs232 e spi.

agora só pra explicar um pouco mais meu problema:

estou recebendo dados de um placa que codifica em PCM e ela não segue nenhum protocolo, somente codifica os dados em 0 = 0v ou 1 = 5v sem usar nenhum bit de paridade ou bit de começo ou fim.

Eu quero receber esses dados, armazenar em um cartão SD e depois reproduzir

atualmente ja consigo gravar e ler dados no cartão SD, e agora preciso aprender como pegar os dados dessa placa

TRABALHÃO HEIM RSRSRSRS
no que vcs puderem me ajudar eu agradeço, estou precisando :!:
Obrigado

MensagemEnviado: 18 Nov 2009 09:05
por ze
um peixe...
Código: Selecionar todos
...
#define D5 RA0
char recebe()
{
char dado=0,i;
for (i=0;i<8;i++)
   {
   dado|=D5; // "veja o sinal que esta entrando no pino D5" e "armazena na variavel"
   delay(10); // "espera um tempo"
   dado<<=1; // "Construindo um Byte"
   }
return dado;
}
...
main()
{
...
_byte=recebe();
...
}
se tua cabeça num for muito dura, mete neste. ui!!
de nada

MensagemEnviado: 18 Nov 2009 12:02
por vtrx
Eduardo,voce precisa saber em que frequencia receber estes dados ou contruir uma rotina automática de calculo.

MensagemEnviado: 18 Nov 2009 12:23
por fabim
tio, não to entendendo esse PCM com SPI e o scabal.
vamos supor serial.

Suponha que o baud rate é de 9600.
Sendo assim, o tempo de corte de cada bit = (1/9600)/2.

Calma.
O tempo de cada bit = 1/9600 = 1,0416666666666666666666666666667e-4
ou seja. 0, 0 0 0 1 0 4uS.
ou 104uS arredondando.

Como deve saber, se sabe.
O Serial não tem um pino de sincronismo, ele é regido por tempo.

Sendo 1 startbit
8 bits de dados
1 Stop bit

Sendo assim, cada palavra ou cada frame de 1 byte ocupa na verdade 10 bits.
O tempo total de framebyte = 10 * 104uS. ou 1,04mS.

Código: Selecionar todos
Bom como saber o que é o start e como testar os bits.
   ORAS FACIL.

   ´´´´´|_____XXXXXXXXXXXX
        |borda de descida
        |     |
        |     |1 T bit

   se 1 bit = 104uS, então no start bit.
   Aconteceu a borda de descida,
   espero 1/2Tbit = 104uS/2 = 52uS.
   
   veja.

   ´´´´´´|
         |___X___X X X X X X X X
        |    | 1/2Tbit.

    Daqui pra frente, você espera 104uS e faz o teste pra saber se é 1 ou zero.
    IF ( pino.receive==1)
          meubyte.0 = 1;
            else
           meubyte.0 = 0;
         meubyte <<=1;

    Observe que com esta lógica tu vai fazer 8 testes, e preencher 8 bits, ja sabendo que, o 9° teste é o stop bit que sempre vai ser = 1.
 
   Mais alguma duvida ?

MensagemEnviado: 18 Nov 2009 14:22
por Djalma Toledo Rodrigues
E esse PCM não esta comprimido , isto é, não passou por um CODEC ?.

MensagemEnviado: 22 Nov 2009 16:14
por eduardo_gsp_oliveira
Obrigados a todos pelas dicas, consegui contruir parte do programa usando a dica do Lellis
lellis escreveu:um peixe...
Código: Selecionar todos
...
#define D5 RA0
char recebe()
{
char dado=0,i;
for (i=0;i<8;i++)
   {
   dado|=D5; // "veja o sinal que esta entrando no pino D5" e "armazena na variavel"
   delay(10); // "espera um tempo"
   dado<<=1; // "Construindo um Byte"
   }
return dado;
}
...
main()
{
...
_byte=recebe();
...
}
se tua cabeça num for muito dura, mete neste. ui!!
de nada

Tenho ainda muitas duvidas sobre meu projeto mas vou abrir outro tópico
agora vou mostrar como ficou o código

while(portd.b7)
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Gravando");
setor = 10;
for(j=0; j<512; j++)
{
dado = 0;
if (Button(&PORTD, 5, 1, 0)) oldstate1 = 1; // Ativa na borda de decida
if (oldstate1 && Button(&PORTD, 5, 1, 1)) // do clock de 64KHz
{
oldstate1 = 0; // Zera o flag
for(i=0; i<8; i++)
{
if (Button(&PORTD, 4, 1, 1)) oldstate2 = 1; // Ativa na borda de decida
if (oldstate2 && Button(&PORTD, 4, 1, 0)) // do clock de 64KHz
{
oldstate2 = 0; // Zera o flag
dado = dado <<1;
dado|= portd.B3; // "veja o sinal que esta entrando no pino D5" e "armazena na variavel"
}
}
data1[j] = dado;
}
}
x = Mmc_Write_Sector(setor, data1);
setor ++;
}

Novamente obrigados a todos