Problemas com o CCS

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Problemas com o CCS

Mensagempor bonella » 25 Out 2006 18:19

Alguém poderia me dar uma ajuda no seguinte problema.

Estou com uma interrupção do timer1 com da seguinte maneira

cpp code
#INT_TIMER1
void timer1(void){
le_hora();
le_data();
le_tecla();
}



Porém apesar de ainda ter bastante rom livre ele da erro OUT OFF ROM o que significaria estouro da memória rom. percebi que ele tenta colocar o código das funções dentro da rotina timer ao invés de chamar rotinas externas. tentei usar a diretiva #SEPARATE mas não adiantou, se alguém puder ajudar...

Ahh, se possuirem exemplos com um código um pouco mais longo dentro do timer eu agradeço.

Abraços Patrick
bonella
 
Mensagens: 4
Registrado em: 25 Out 2006 18:11

Mensagempor alessandro » 25 Out 2006 18:41

Creio que somente essa parte do programa para analisar seja dificil ajudar. O Ideal seria o codigo inteiro.
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor andre_luis » 26 Out 2006 07:17

Voce está usando a diretiva #device=16 ?
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor pbernardi » 26 Out 2006 07:50

Cara, o ideal mesmo é não chamar nenhuma função externa dentro de uma interrupção... especialmente de uma interrupção de TMR.

Quanto a limitação, pode ser uma limitação do PIC, e não do CCS. O PIC 16F tem sua e2prom dividida em 4 blocos, e se uma função fica maior que um desses blocos, não funfa.

Mas de qq maneira, tente colocar o #separate na função timer1 também. tentar usar o #separate nas 4 maiores funções do programa (para colocar cada função em um bloco da e2prom diferente) pode dar resultado também.

Isso assumindo que você esteja usando um pic16F, o 18F não tem essa limitação, se não me engano.

Att,
But to us there is but one God, plus or minus one - Corinthians 8:6±2. (xkcd.com)
pbernardi
Word
 
Mensagens: 707
Registrado em: 12 Out 2006 19:01
Localização: Curitiba-PR

Mensagempor Anderson_Arantes » 26 Out 2006 08:16

André a diretiva não seria #device*=16 ????
Anderson_Arantes
Bit
 
Mensagens: 42
Registrado em: 13 Out 2006 15:58
Localização: Rio de Janeiro

Re: Problemas com o CCS

Mensagempor andre_luis » 26 Out 2006 08:21

Bem lembrado pelo pbernardi,

O usual em programação seria voce setar os flags na interrupção :

Código: Selecionar todos
flag_le_hora = true ;
flag_le_data = true ;
flag_le_tecla = true ;


para que no Main() voce execute :

Código: Selecionar todos
if ( flag_le_hora ) le_hora() ;
if ( flag_le_data ) le_data() ;
if ( flag_le_tecla ) le_tecla() ;


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Renie » 26 Out 2006 08:32

Olá pessoALL!

Só uma correçãozinha!

pbernardi escreveu:...
Quanto a limitação, pode ser uma limitação do PIC, e não do CCS. O PIC 16F tem sua e2prom dividida em 4 blocos, e se uma função fica maior que um desses blocos, não funfa.
...


A e2prom dos 16F é de apenas um bloco, a Flash é endereçada
por páginas em alguns modelos.

Obs: a Ram é que é por blocos.

[]'s
Renie
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor andre_luis » 26 Out 2006 09:14

Anderson_Arantes escreveu:André a diretiva não seria #device*=16 ????


sim, tem razao.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Fábio Pereira » 26 Out 2006 09:14

O Renie está certo.

Além disso, a limitação é do CCS sim e não do PIC.

A questão de paginação da memória FLASH dos PICs já foi bastante discutida aqui no ASM51, assim como esta questão sobre a limitação do tamanho de uma função no CCS.

No caso da limitação do tamanho de funções, o CCS não permite que o código de uma função seja maior que um segmento ou página de memória FLASH (ou seja, 2kword).

No seu caso, mesmo você tendo apenas chamado funções dentro da sua ISR (o que já não é um bom hábito de programação), o que pode ter acontecido é que você não utilizou estas funções no resto do programa. Aí o compilador, ao invés de inserir uma chamada para a mesma, inseriu o próprio código da função no local da chamada.

Acho que a sugestão do andre_teprom poderia ajudar a resolver o seu caso, mas provavelmente iria transferir o erro para a função main.

Por isso, seria importante utilizar a diretiva #separate (como o pbernardi sugeriu) para forçar o compilador a inserir uma chamada à função e não o código dela.

Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor pbernardi » 26 Out 2006 10:09

pois é, me confundi todo....

não sei pq cargas dágua escrevi e2prom, eu queria dizer flash. :oops: deve ser o sono da manhã... :roll:
But to us there is but one God, plus or minus one - Corinthians 8:6±2. (xkcd.com)
pbernardi
Word
 
Mensagens: 707
Registrado em: 12 Out 2006 19:01
Localização: Curitiba-PR

Pergunta

Mensagempor mega.rod » 31 Out 2006 10:20

Por favor, me ajudem....

Presciso saber como usar o regitrador TRISA E TRISB...
ex: TRISA=0b10101010;

Este axempo abaixo esta correto ?

cpp code
#define led RA4 
TRISA=0b10101010; // ?? não sei como corfigurar este registrador como
// entrade e nem como saida

void main()
{
while(1)
{
led=!led;
delay_ms(500);
}
}


Presciso deste programa apenas para piscas este bendito léd...

Obrigado e aguardo retorno de quem puder me ajdar o mais breve possivel....

Abraço
Editado pela última vez por mega.rod em 15 Jul 2012 19:28, em um total de 2 vezes.
Avatar do usuário
mega.rod
Nibble
 
Mensagens: 83
Registrado em: 17 Out 2006 09:52

Mensagempor alex_a » 31 Out 2006 12:05

Um exemplo:

cpp code
#bit botao = portB.0
#bit led1 = portB.2

// configura os TRIS
set_tris_a(0b11111111); // configuração dos pinos de I/O
set_tris_b(0b00000011);
set_tris_c(0b11110001);
set_tris_d(0b00000000);
set_tris_e(0b00000111);

// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte

0 = saida ; 1= entrada. (para CCS).
ALEX_A
Avatar do usuário
alex_a
Bit
 
Mensagens: 43
Registrado em: 11 Out 2006 19:25
Localização: Ipiranga- São Paulo-SP

Agradecimentos...

Mensagempor mega.rod » 31 Out 2006 12:35

Muito Obrigado Alex....
Éra isso mesmo que eu prescisava...

Abraços...
Avatar do usuário
mega.rod
Nibble
 
Mensagens: 83
Registrado em: 17 Out 2006 09:52

Mensagempor guest2003 » 31 Out 2006 12:45

Rodrigo,

Vale lembrar que na maioria dos PICs 16 o pino RA4 é do tipo Dreno Aberto... ou seja... quando configurado como saida apenas pode "puxar" corrente e não fornecer... no seu caso do LED, o mesmo acenderia quando vc escrevesse "0" na saida... e se estivesse lidado ao VCC (com resistor em serie claro)

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Ajuda....

Mensagempor mega.rod » 31 Out 2006 12:55

Não sei o que estou fazendo de errado mas não esta querendo compilar....
Eu se alguém puder me ajudar agradeço de coração....

cpp code
#include <16F628A.h>
#use delay(clock=4000000)
#fuses INTRC_IO,NOWDT,PUT,PROTECT,BROWNOUT,NOLVP,NOMCLR
#use rs232(baud=19200, xmit=PIN_b4,rcv=PIN_b5)

#bit botao= portB.0
#bit led = portB.2

// configura os TRIS
set_tris_a(0b11111111); //Todas as portA como entradas
set_tris_b(0b11111011);

// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb

void main()
{
while(1)
{
led=!led;
delay_ms(500);
}
}


Abraço
Editado pela última vez por mega.rod em 15 Jul 2012 19:28, em um total de 1 vez.
Avatar do usuário
mega.rod
Nibble
 
Mensagens: 83
Registrado em: 17 Out 2006 09:52

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x