Página 1 de 1
Comando equivalente no 8051

Enviado:
13 Jul 2007 15:25
por luiggibr
Boa tarde,
Estou desenvolvendo um projeto final para a faculdade e achei uma solução boa(aparentemente) para reprodução de sons de forma simples e barata.
Se trata do BTC sound encoder pra quem nao conhece o link está em:
http://www.romanblack.com/picsound.htm
Você converte um arquivo de audio .wav, em uma forma de onda digital que vai ser gerada pelo microcontrolador de maneira que esta se aproxima da onda analogica original.
O programa dele já até gera o código para o microcontrolador, entretanto trata-se do micro PIC. E estou desenvolvendo o meu projeto no 8051 que é com quem tenho mais familiaridade.
O código para o PIC é apenas um comando: RETLW.
retlw b'10010101'
São várias linhas com esse código ai, para um som de poucos segundos.
Pelo que já pesquisei esse comando move o conteúdo para W, do bit mais significativo para o menos.
Como eu executaria isso no 8051? Alguem pode me ajudar? Porque não gostaria de ter de refazer o que já fiz e além de tudo ter que aprender o PIC, que eu não sei nada.
Alguem já conhece esse encoder do Roman Black e sabe se funciona bem para me adiantar?
Desde já obrigado.

Enviado:
17 Jul 2007 18:47
por B-EAGLE
instrução que execute exatamente a mesma coisa, algo como RETA (ret acumulador) até onde eu sei não tem não...
daria pra voce substituir o RETLW por:
- Código: Selecionar todos
MOV A,#0x97
RET
abraço

Enviado:
18 Jul 2007 18:34
por luiggibr
o comando Mov A,#DADO
o "#" n significa que move o "#DADO" pro acumulador?
Estilo Mov A ,#01H
Esse comando Mov A, #0x97
não daria algum erro? N entendi esse 0x97 hehe...
Pelo o que eu entendi da teoria do Roman Black eu tenho que variar uma porta naquela sequencia de 0 e 1 que ele me gera, e adicionar um filtro RC nessa saida antes de leva-la pra um gerador de audio.
Mas imagina eu ficar dando um Mov pra cada Bit desse, no codigo gerado tem VÁRIOS.... deve ter algum jeito mais simples.
Ninguem nunca implementou esse projeto do roman black pra dar uma luz ai não?
Abraço e desde ja obrigado...

Enviado:
18 Jul 2007 18:53
por barboza
Tem tempo que nao escrevo em asm para 8051, mas vou tentar!
Você precisa criar uma tabela de dados (o audio), usando o db
e usar o dptr para endereçar o inicio da tabela e usar um incremento para buscar os dados.

Enviado:
18 Jul 2007 20:04
por luiggibr
barboza...
ja tinha pensado nisso... na verdade até já tinha feito um programa usando +/- isso q vc ta falando...
se eu armazenar td com o db
e dar um mov usando dptr
e jogando os dados do audio do db pra uma porta daria certo? Eu conseguiria reproduzir um audio?
O problema e q eu fiz pra cada 0 ou 1 um db, e dá db pra kct...

Enviado:
19 Jul 2007 10:23
por barboza
Cara não conheço esse metodo/tecnica de reprodução de audio, mas você pode fazer um "db" para cada byte ou sequencia de bytes.
E com este byte "movido" fazer uma subrotina usando o deslocamento de bits para colocar estes bits na porta que deseja.
Esta tecnica usa PWM ou rede 2R?

Enviado:
19 Jul 2007 11:08
por enigmabox
Fiz algo parecido usando um DAC0808, ligado numa porta do 8051. Não sei qual versão do 8051 tem porta PWM, talvez um 80c535. Não conheço o PIC utilizado, mas penso que a instrução RETLW mandava um byte para uma porta PWM.

Enviado:
19 Jul 2007 13:06
por brasilma
Vamos voltar ao inicio?
Então, veja com o pessoal do forum de PIC o que faz esta instrução, depois passa prá gente que encontramos o equivalente.

Enviado:
08 Ago 2007 12:45
por luiggibr
estou tentando implementar isso aqui no 8051... já avancei mto acho q consigo fazer os primeiros testes no protoboard essa semana.
Mas preciso que me ajudem a solucionar um problema.
quando eu faço um
Mov A,#ACH
Por exemplo, eu moveria para o acumulador um dado
ficando o conteudo do acumulador igual a "10101100" por exemplo, no caso do comando acima...
Eu preciso fazer um loop movendo cada valor desse do acumular (zerosa e ums) para um pino de uma porta, antes de carregar o acumulador com outro valor,
como fazer essa varredura mandando esses zeros e um do acumulador para um unico pino de uma porta (P1.1 por exemplo), enviando da esquerda para direita?
Alguem sabe como fazer isso? To quebrando a cabeça mas ainda não consegui... Falta apenas isso.
Obrigado.

Enviado:
08 Ago 2007 13:20
por j.silvestre

Enviado:
08 Ago 2007 20:30
por brasilma
Tem muitos jeitos de fazer isso, abaixo um exemplo apenas para vc pegar a idéia (dá para melhorar a estrutura, detesto esse monte de desvios)...
SAIDA BIT P1.1
MOV R0,#9
MOV A,#XXH
D1: RRC A
JNC D3
SETB SAIDA
D2: DJNZ R0,D1
JMP FIM
D3: CLR SAIDA
JMP D2
FIM: JMP FIM

Enviado:
09 Ago 2007 08:20
por barboza
TX equ p1.1 ; Pino de TX
MOV r2,#08 ; prepare para deslocar 8 bits
LOOP:
RLC A ; desloca o bit para trx dentro do carry
MOV TX,C ; coloca o conteudo do carry no pino TX
DJNZ r2,LOOP ; continuo ate os 8 bits terem sido trx
FIM!

Enviado:
08 Set 2007 00:13
por luiggibr
consegui fazer aqui com as ajudas que me deram,
o programa ficou o seguinte...
$mod51
TX equ p1.1
org 00H
ljmp inicio
org 30H
inicio:
mov a,#00h
mov P1,a
mov dptr,#musica
loop:
push acc
movc a,@a+dptr
mov r2,#08
ljmp transf
pula:
pop acc
inc a
ljmp loop
transf:
rlc a ; desloca o bit para trx dentro do carry
mov TX,C ; coloca o conteudo do carry no pino TX
djnz r2,transf ; continuo ate os 8 bits terem sido trx
ljmp pula
org 100H
musica:
Db 0aaH
Db 0abH
Db 0aaH
Db 0b5H
Db 055H
Db 05aH
Db 0aaH
Db 0adH
....
Só que agora tenho outro problema, essa tabela que eu chamei de musica tem VÁRIAS linhas(mais de 10mil), isso faz com que meu programa .hex tenha por volta de 30kb, e não cabe na memoria do micro.
O que vcs aconselhariam eu utilizar?
Teria como eu utilizar memorias auxiliares só com os dados dessas tabela das "musica", e qndo rodar o programa ir buscando nessas memorias externas?
Se tiver como seria essa comunicação?
Qual seria a alternativa mais facil de implementar pra solucionar esse meu problema?
Desde já muito obrigado pra quem vem me ajudando ai, abraço.