memória 1 X 0 Eu

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

memória 1 X 0 Eu

Mensagempor juniorlucival » 11 Dez 2010 19:41

Caros colegas, estou implementando um projeto com pic 16f877/a em assembler onde necessito usar toda uma memória que possui 4Kbytes, para isso estou usando o i2c que tem como capacidade de endereçamento 10bits ou 1024 posições, como fazer para mudar e acessar o restante da memória.
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor vtrx » 11 Dez 2010 19:55

Não entendí bem,mas até a 24C16 voce usa 7 bits de endereçamento.
PS:Pensando bem,acho que entendí sua duvida.
Voce deve estudar um pouco sobre o protocolo I2C,veja ,este 10 bits não são de endereçamento direto de uma eeprom I2C.
Eeprom 24C01 até 24C16,voce usa 8 bits para endereço e mais o byte de controle com o bloco a ser lido,tipo,endereço zero bloco 1,e assim por diante até endereço 255 bloco 8(24C16).
Acima da 24C16,tipo,24C32 etc,voce tem que enviar 2 bytes do endereço,endereço High e endereço Low.
Então para acessar o byte do endereço 0 voce envia;
EndHigh=00,EndLow=00.
Voce pode tambem ler sequencialmente a memória,aí o esquema ja muda mas voce pode ler em alta velocidade os bytes sequencialmente(com pic a 4 mhz voce le a 5 khz).
Quando voce 'seta' para 10 bits ou 7 bits,na verdade voce está selecionando se vai usar 1 endereço de acesso na Eeprom (ou afins)ou vai usar 2 endereços de acesso.
se não foi essa sua dúvida desconsidere tudo :lol:
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor juniorlucival » 11 Dez 2010 20:42

é exatamente essa a minha dúvida, quero lhe agradecer, por gentileza me confirme algo, então vamos supor que tenha que acessar um endereço na memória que possua um valor maior que 10 bits (máximo no i2c) basta eu dividir em dois blocos sendo a parte alta e a parte baixa do endereço, com isso consigo até 16bits de endereçamento ou mais dependendo do tamanha da memória e de suas caracteristicas próprias de endereçamento?
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor vtrx » 11 Dez 2010 20:58

Exato,mas veja,acima da 24C16 voce não usa a idéia de 'bloco',mas sim de dividir o endereço em 2 bytes.
Exemplo,para 24C512(65535) voce usará 00,00 para ler a primeira posição e FF,FF para a última.
Não esqueça que a idéia de endereçamento em 10 bits não é o valor real de memória.
Até 24C16 voce envia byte de controle(Leitura/Escrita e bloco)+ byte de endereço,acima dela voce envia byte de controle(Escrita ou Leitura de dados)+ byte de endereço(parte alta)+byte de endereço(parte baixa).
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor juniorlucival » 11 Dez 2010 21:44

valeu obrigado, muito claro.
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor juniorlucival » 11 Dez 2010 22:10

So mais uma coisa, no protoco spi quando eu uso mais de uma memória para selecionar qual memória estou lendo basta mandar um chip select, ou um nível alto, é no protoco i2c com varios slaves como seleciono qual slave quero chamar, isso com os slave iguais, ou seja memórias iguais?
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor Jozias del Rios » 12 Dez 2010 00:25

Tao confundindo as coisas.

Esse endereçamento de 7 ou 10 bits eh justamente para escolher qual chip i2c vc quer se comunicar... só considere usar 10 bits se vc tem realmente centenas de chips conectados, o q não é o caso né? acho q vc soh deve ter uma única memoria eeprom...

Então presume-se que vc deva usar o endereço de 7 bits. Cada chip 24C* tem 2 ou 3 terminais onde vc escolhe qual os ultimos 2 ou 3 bits do endereço dele.

Para comunicar com sua memoria eeprom, vc precisa primeiro enviar um byte que indica o ENDEREÇO DO CHIP no barramento i2c (7 bits) e mais um bit indicativo de sentido (read ou write).

O proximo 1 ou 2 bytes (dependendo da capacidade da eeprom) é o ENDEREÇO DENTRO DOS DADOS DA EEPROM. Veja que com 2 bytes, tem-se 16 bits de endereçamento, logo são 64KBytes endereçaveis ou 512Kbits, que é uma 24C512.
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 juniorlucival » 12 Dez 2010 08:25

pretendo usar tres memórias e um pic como slave e um pic como master, então o pic master tera que se comunicar com os slaves, em explicações no livro "conectando o pic" e na net não achei material especifico sobre isso, pois bem, so acho a explicação de que no protoco eu envio um byte de endereçamento e um byte de dados, pois bem, como no protocolo ele ira saber que o primeiro byte se trata de endereço de slave e o segundo byte é de endereçamento na memória, existe algum flag ou instrução para isso? como ele saberá que o segundo byte não é de dados?
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor juniorlucival » 12 Dez 2010 08:28

Por gentileza, se os senhores souberem de algum livro ou material sobre os protocolos dos pics, por gentileza postem.
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor vtrx » 12 Dez 2010 10:26

Continuando...
Esse endereçamento de 7 ou 10 bits eh justamente para escolher qual chip i2c vc quer se comunicar... só considere usar 10 bits se vc tem realmente centenas de chips conectados, o q não é o caso né? acho q vc soh deve ter uma única memoria eeprom...

Voce deve dar uma olhada no protocolo I2C.
como no protocolo ele ira saber que o primeiro byte se trata de endereço de slave e o segundo byte é de endereçamento na memória, existe algum flag ou instrução para isso? como ele saberá que o segundo byte não é de dados?

O tipo de endereçamento de 7 bits ou 10 bits é que define isso no PIC;
SSPCON(SSPM3:SSPM0) no PIC 16F877.
SSPM0=0110 seta endereçamento de 7 bits(Byte de controle + Byte de dados).
SSPM0=0111 seta endereçamento de 10 bits (Byte de controle+Byte do endereço alto+Byte do endereço baixo).
A seleção de qual memória voce vai ler/Gravar,fica no byte de controle é é específico para cada tipo de memória,exemplo;
Para a 24C512,voce poderá conectar na memsa linha 4 memórias.
O byte de controle é assim;
10100AAX=10100 fixo para essa memória,AA voce seleciona qual memo da linha vai usar(00,01,10 e 11),X define se voce vai ler a memória o vai escrever nela.
Eu geralmente uso roinas I2C por software para ter liberdade de pinos e facilidade em leitura/gravação sequencial de alta avelocidade.
me mande seu esquema mínimo de hardware dizendo qual pic e te mando uma rotina exemplo.
PS: A capacidade do protocolo não é limitada,voce pode usar uma memo 24C1024 de 131k usando o mesmo sistema só o byte de controle que muda no bit 6.
Voce deve ler o DataSheet da memória que for usar para saber as configurações possíveis.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor juniorlucival » 12 Dez 2010 11:06

Veja lhe agradeço pelas explicações, o que estou tentando fazer é o seguinte, preciso montar um gerador de sinal com frequencias de 0.7 a 10khz, e para isso usarei um conjunto de 512bytes e um dac0808, cada conjunto determina um sinal, pretendo fazer 30 sinais diferentes, esses bytes precisam estar na rom do pic, devido a questões de velocidade de amostragem, o oscilador para clock do pic que fornecera os bytes ao dac0808 é variável, mas a atualizações desses bytes pretendo fazer com uma ou duas memórias externas utilizando para gerenciar tudo isso outro pic, ou seja esse pic que ira gerenciar é o mestre com cristal para clock normal de 4mhz, para atualizar a rom do pic que fornecera os bytes vou usar i2c devido a um clock exclusivo para isso. (obsrvações, não da para fazer com ad, nem outro metodo, porque a frequencia do sinal é elevada e so consegui usando um clock externo variável)
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44

Mensagempor vtrx » 12 Dez 2010 12:37

Eu não entendí muito bem oque quer fazer e não sou bom em matemática,aguarde mais respostas para uma solução melhor do seu projeto mas acho que tem solução mais simples e melhor.
Detalhe melhor,voce quer apenas gerar frequencias?
Essas frequencias podem ser onda quadrada?
Voce quer gerar as frequencia por amostragem armazenada?
Ha realmente a nescessidade de outro PIC?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor Guri » 12 Dez 2010 14:17

Bom se ajudar usa essa rotina para i2c, eu a utilizo para manipular um banco de memórias (8 no total)...A seleção das memórias deve ser feita via hardware em primeiro lugar, em A0,A1,A2 e depois no sofware de controle na variavel word...

Se tiver dúvidas avise, já faz tempo que mexi com essa rotina e hoje a utilizo como um include e não me lembro direito...mas funciona muito bem a mais de 10 anos...

Aquí voce configura qual memo quer ler/gravar esse é o comando gloabal de acesso a i2c:

#define rd_wt word, 0
#define a_m word, 1
#define b_m word, 2
#define c_m word, 3
#define x0 word, 4
#define x1 word, 5
#define x2 word, 6
#define x3 word, 7

NOTA: X0,X1,X2 e X3 são configs basicos do fabricante, vc só altera a,b,c para selecionar a memoria e o rd_wt é escreita leitura.

;*Bits de memo*
bcf x0
bsf x1
bcf x2
bsf x3
bcf a_m
bcf b_m
bcf c_m


;---------------
; *** INICIA BLOCO LEITOR i2C ***
;* Transmite dados em 16 bits *

txdados_i2c:
bcf ackf
rbyte:
bcf rd_wt
call bstart
movf word,w
movwf txbuf
call tx
movf addr_h,w
movwf txbuf
call tx
movf addr_l,w
movwf txbuf
call tx
movf datao,w
movwf txbuf
call tx
call bstop
call delaymem
return
;---------------
;*Recebe dados em 16 bit*

rxdados:
bcf ackf
rbyte_:
bcf rd_wt
call bstart
movf word, w
movwf txbuf
call tx
movf addr_h, w
movwf txbuf
call tx
movf addr_l, w
movwf txbuf
call tx
bsf rd_wt
call bstart
movf word, w
movwf txbuf
call tx
call rx
call bstop
return
bstart:
bsf sdata
bsf status, rp0
bcf trisc, 3
bcf trisc, 4
bcf status, rp0
bcf sclk
nop
bsf sclk
nop
nop
nop
nop
nop
bcf sdata
nop
nop
nop
nop
nop
bcf sclk
nop
nop
return
bstop:
bcf sdata
bsf status, rp0
bcf trisc, 3
bcf trisc, 4
bcf status, rp0
bcf sdata
nop
nop
nop
bsf sclk
nop
nop
bsf sdata
nop
nop
bcf sclk
nop
nop
nop
return
bitout:
bsf status,rp0
bcf trisc,3
bcf trisc,4
bcf status,rp0
btfss do
goto bitlow
bsf sdata
goto clkout
bitlow:
bcf sdata
clkout:
bsf sclk
nop
nop
nop
nop
bcf sclk
return
bitin:
bsf di
bsf status,rp0
bcf trisc,3
bsf trisc,4
bcf status,rp0
bsf sclk
nop
nop
nop
nop
nop
btfss sdata
bcf di
bcf sclk
return
tx:
movlw .8
movwf count
txlp:
bcf do
btfsc txbuf, 7
bsf do
call bitout
rlf txbuf, f
decfsz count, f
goto txlp
call bitin
btfsc di
bsf ackf
return
rx:
clrf datai
movlw .8
movwf count
bcf status, 0
rxlp:
rlf datai, f
call bitin
btfsc di
bsf datai, 0
decfsz count, f
goto rxlp
bsf do
call bitout
return
;---------------
delaymem: ;+/- 10 MS
bank2
clrf loops
movlw .60
movwf loops2
delaymemo:
decfsz loops,f
goto delaymemo
decfsz loops2,f
goto delaymemo
bank0
return
;---------------
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Mensagempor Guri » 12 Dez 2010 14:26

Xiiii....acho qu eu comi bola....desculpa.

Que tipo de sinal você quer realizar?

Se você quer ter precisão e gerar uma escala muito ampla, poderá utilizar a técnica DDS, é possivel vc gerar senoides, triangular, retangular entre outras formas de onda, porém com precisão...

Eu tive um dúvida dessas aquí no forum e me indicaram esse método, após estudar um pouco e garimpar na net fiz varios testes e consegui ter uma precisão excelente,...

para se ter uma idéia eu consegui gerar a frequencias de 8372,38hz enquanto a frequencia correta era: 8372,55...

quanto maior a frequencia maior o erro...mas no caso do dds o erro é muito pequeno, menos de 1%.

Em relação a reprodução de sons contidos em waves, tome muito cuidado, o ideal ´e utilizar um flash ou eprom paralela ou até mesmo um ram que no caso sofreria um but de uma eeprom para carregar as waves na ram.

paralela porque a velocidade deve ser respeitada e se você quer fazer alguma coisa simples e eficiente pense nisso...

Outra dica legal, procure utilizar um DAC i2s do tipo tda1311 que é bem comum no mercado...porém para vc tocar um dac destes com um pic de 8 bits não vai conseguir bons resultados, então eu sugiro vc utilizar um pic só para pegar o sinal proveniente de outro mcu e esse pic vai só enviar o dado para o dac1311 no caso sobre o protocolo i2s...

A qualidade de som é muito melhor e o protocolo não é bicho de 7 cabeças para idealizar-se.

outro detalhe legal é as amostras serem feitas no sound forge por ex. e estarem em 16bits...esse dac é para 16 bits estereo...
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Mensagempor juniorlucival » 13 Dez 2010 11:36

meu proposito e montar um injetor de sinal de rotação automotivo, para conseguir simular centrais de injeção eletronica, seus sinais particularidades que dificultam usar recursos mais simples.
juniorlucival
Nibble
 
Mensagens: 63
Registrado em: 02 Jan 2010 14:44


Voltar para PIC

Quem está online

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

cron

x