Comando equivalente no 8051

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Comando equivalente no 8051

Mensagempor luiggibr » 13 Jul 2007 15:25

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.
luiggibr
Bit
 
Mensagens: 16
Registrado em: 10 Jul 2007 17:48

Mensagempor B-EAGLE » 17 Jul 2007 18:47

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
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Mensagempor luiggibr » 18 Jul 2007 18:34

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...
luiggibr
Bit
 
Mensagens: 16
Registrado em: 10 Jul 2007 17:48

Mensagempor barboza » 18 Jul 2007 18:53

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.
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 luiggibr » 18 Jul 2007 20:04

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...
luiggibr
Bit
 
Mensagens: 16
Registrado em: 10 Jul 2007 17:48

Mensagempor barboza » 19 Jul 2007 10:23

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?
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 enigmabox » 19 Jul 2007 11:08

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.
enigmabox
 

Mensagempor brasilma » 19 Jul 2007 13:06

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.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor luiggibr » 08 Ago 2007 12:45

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.
luiggibr
Bit
 
Mensagens: 16
Registrado em: 10 Jul 2007 17:48

Mensagempor j.silvestre » 08 Ago 2007 13:20

j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor brasilma » 08 Ago 2007 20:30

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
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor barboza » 09 Ago 2007 08:20

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!
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 luiggibr » 08 Set 2007 00:13

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.
luiggibr
Bit
 
Mensagens: 16
Registrado em: 10 Jul 2007 17:48


Voltar para 8051

Quem está online

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

x