escrever e ler memoria de programa

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

escrever e ler memoria de programa

Mensagempor Doglao » 04 Jun 2007 12:03

Ola!
Estou tentando escrever na memoria de programa com a funcao
Código: Selecionar todos
write_program_eeprom(endereco, valor)
das bibliotecas do compilador ccs, usando o pic16f877A que aceita escrita na area de programa. Oque acontece eh que quando esta funcao eh chamada ele coloca o valor em quatro enderecos consecutivos:
//aqui escrevo o valor 0x1010 no endereco 1860 da memoria de programa, (rom)
Código: Selecionar todos
write_program_eeprom(1860,0x1010);
Na memoria de programa fica assim:
a linha 1860 eh ignorada nao eh gravado nada neste linha
linha 1861 0x1010
linha 1862 0x1010
linha 1863 0x1010
linha 1864 0x1010
sao gravadas estas linhas mas nao a desejada 1860, e sao gravadas 4 linhas consecutivas sendo que somente queria gravar uma. O outro problema segue no momento de ler estes enderecos.
Código: Selecionar todos
iPageWidth=read_program_eeprom(1860);// tento ler o endereco 1860

iPageWidth eh uma varialvel que declarei afim de guardar o valor lido. Como ja visto , no momento de escrever o endereco 1860 eh ignorado entao a leitura nao vai dar certo neste endereco, mas se eu tento ler o endereco seguinte:
Código: Selecionar todos
iPageWidth=read_program_eeprom(1861);//tento ler o endereco 1861

nao leio nada, a variavel iPageWidth continua intacta. Coloquei a simulacao do mplab com o codigo assembler gerado e vi que no momento de gravar usa uma macro GOTO @FLASHLOAD do compilador ccs(eu acho) que esta macro escreve na memoria de programa mas nao encontrei nenhuma indicacao , ou seja de chamada ou desvio a uma funcao que leia este valor da memoria de programa na simulacao. Eu testei este codigo com varios enderecos da memoria do pic e os resultados sao os mesmos. Alguem sabe efetivamente como posso fazer que esta funcao funcione? minha memoria eeprom ja nao suporta os dados que necesito para avancar no meu projeto e se tem esta capacidade de escrever e ler na memoria de programa com o pic16f877a melhor faco bom uso dela doque trocar de micro ou colocar uma memoria externa.
muito obrigado
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Doglao » 12 Jun 2007 11:30

Alguem escreve na memoria de programa do pic16f877?
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Andre Rasminio » 12 Jun 2007 11:36

Vc quer escrever na EEPROM ou na FLASH?
Se for na EEPROM, para o PIC16F o endereço incial é 0x2100.

A função para escrever é:

write_eeprom(Add,Dado);

A função para ler é:

read_eeprom(Add);

A função que você está usando escreve na Flash, e é essa mesmo, o que pode estar acontecendo é que como o barrameto interno de dados deste PIC é de 14bits,você não consegue escrever um valor de 16bits.

Você já tentou escrever um valor de 8bits (char, ou int(8 bits))?
Andre Rasminio
Bit
 
Mensagens: 26
Registrado em: 14 Abr 2007 17:30
Localização: Vale da Eletrônica

Mensagempor Doglao » 12 Jun 2007 14:56

Ok! obrigado por responder!
Realmente estava escrevendo um valor de 16 bits no opcode do pic que eh de 14 bits, troquei os valores e fiz as simulacoes ele grava e le com estas funcoes na memoria de programa(flash):
Código: Selecionar todos
   write_program_eeprom(1860,1);
   iPageWidth=read_program_eeprom(1860);// tento ler o endereco 1860
   write_program_eeprom(1865,2);
   iPageWidth2=read_program_eeprom(1865);

mas fica muitas duvidas ainda. Por que nao consigo fazer que grave somente no endereco que quero? se tento gravar no endereco 1860 ele na simulacao do mpla grava nos enderecos 1861, 1862, 1863, 1864 e nao no endereco 1860 e se uso a funcao de leitura da memoria flash no endereco 1860 que tem valor distinto doque gravei anteriormente ele le corretamente o valor que guardei, mas nao no endereco que passei como parametro na funcao de leitura da memoria flash.
Para conseguir colocar valores em outro endereco tenho que pular quatro enderecos para realizar com sucesso a escrita e leitura.Isto eh: nao consigo escrever e ler em enderecos de memoria flash consecutivas, se tento escrever um valor qualquer de 8 bits em um destes quatro enderecos que foi gravado anteriormente nao consigo gravar nada como se estes enderecos estivessem protegidos, so consigo escrever pulando estes 4 enderecos ja gravados, reage como por exemplo o endereco que passei para escrita 1860 fosse o indice e os enderecos 1861,1862,1863,1864 fosse o conteudo, e somente posso modificar este conteudo modificando o valor atravez da funcao de escrita no endereco 1860 e para poder escrever um segundo valor no programa tenho que fazer isso no endereco 1865 que sera meu novo indice e o mais estranho eh que neste endereco 1865 grava o valor a partir de ai e continua nos enderecos 1866, 1867, 1868. veja o trecho da memoria de programa como ficou para quatro valores.
Código: Selecionar todos
  1858   0741    3FFF         ADDLW 0xff                             
  1859   0742    3FFF         ADDLW 0xff                             
  1860   0743    3FFF         ADDLW 0xff                             
  1861   0744    0001                                               
  1862   0745    0001                                               
  1863   0746    0001                                               
  1864   0747    0001                                               
  1865   0748    0002                                               
  1866   0749    0002                                               
  1867   074A    0002                                               
  1868   074B    0002                                               
  1869   074C    0003                                               
  1870   074D    0003                                               
  1871   074E    0003                                               
  1872   074F    0003                                               
  1873   0750    0004                                               
  1874   0751    0004                                               
  1875   0752    0004                                               
  1876   0753    0004                                               
  1877   0754    3FFF         ADDLW 0xff                             
  1878   0755    3FFF         ADDLW 0xff                             

Ja tentei colocar no lugar do numero de linha o endereco em Hex na escrita e leitura. mas os resultados foram mais surpreendentes, que poderia almentar mais ainda este post.
Oque estou fazendo de errado neste caso? ou sera que o programa no chip vai funcionar como quero e este problema eh uma limitacao do simulador?
muito obrigado
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null


Voltar para PIC

Quem está online

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

x