Construindo um Byte [Resolvido]

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Construindo um Byte [Resolvido]

Mensagempor eduardo_gsp_oliveira » 17 Nov 2009 20:20

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
Editado pela última vez por eduardo_gsp_oliveira em 22 Nov 2009 16:15, em um total de 1 vez.
eduardo_gsp_oliveira
Bit
 
Mensagens: 29
Registrado em: 25 Jun 2009 18:31

Mensagempor MOR_AL » 17 Nov 2009 20:29

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
Editado pela última vez por MOR_AL em 18 Nov 2009 10:22, em um total de 3 vezes.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Jozias del Rios » 17 Nov 2009 20:40

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
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor eduardo_gsp_oliveira » 17 Nov 2009 21:32

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
eduardo_gsp_oliveira
Bit
 
Mensagens: 29
Registrado em: 25 Jun 2009 18:31

Mensagempor ze » 18 Nov 2009 09:05

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor vtrx » 18 Nov 2009 12:02

Eduardo,voce precisa saber em que frequencia receber estes dados ou contruir uma rotina automática de calculo.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor fabim » 18 Nov 2009 12:23

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 ?
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 Djalma Toledo Rodrigues » 18 Nov 2009 14:22

E esse PCM não esta comprimido , isto é, não passou por um CODEC ?.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor eduardo_gsp_oliveira » 22 Nov 2009 16:14

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
eduardo_gsp_oliveira
Bit
 
Mensagens: 29
Registrado em: 25 Jun 2009 18:31


Voltar para PIC

Quem está online

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

cron

x