collapse

* Posts Recentes

VS-Solar Challenge 2018 por Njay
[Ontem às 21:57]


Pensamento do dia... por Njay
[Ontem às 21:45]


Ziphius: The Aquatic Drone por senso
[Ontem às 17:28]


Relógio com Arduino UNO. por Joanito
[Ontem às 16:29]


BostonDynamics - Vai uma mãozinha? por Njay
[21 de Fevereiro de 2018, 20:25]


Formatação de Arduinos (Uno, Nuovemila, Diecimila) por jm_araujo
[21 de Fevereiro de 2018, 18:57]


Mais um avanço na pele sintetica para robots e nao só... por Hugu
[20 de Fevereiro de 2018, 18:30]


Como ver se uma tomada tem a terra ligada? por LVirtual
[20 de Fevereiro de 2018, 15:08]


Via Verde - Identificador por TigPT
[17 de Fevereiro de 2018, 09:56]


Estação de soldadura da Banggood, será boa compra ? por vasco
[16 de Fevereiro de 2018, 17:47]

Autor Tópico: Tempo de interrupção. PIC18F4550  (Lida 3334 vezes)

0 Membros e 2 Visitantes estão a ver este tópico.

Offline MMM

  • Mini Robot
  • *
  • Mensagens: 64
Tempo de interrupção. PIC18F4550
« em: 15 de Dezembro de 2012, 02:10 »
Boas. Estou com um problema no tempo do TIMER0 de um pic 18f4550, basicamente na simulação tanto no mplab como no proteus tenho a interrupção de 1 em 1s e quando faço upload pro pic o tempo passa para aproximadamente 4/5s. Eu resolvi o problema reduzindo o prescaller de 256 para 64, mas mesmo assim gostava de perceber o que está a acontecer. Se for necessário disponibilizo o código completo, mas deixo aqui as inicializações e a rotina de interrupção. Cumprimentos.
Código: [Seleccione]

//Inicialização do timer
        T0CON=0b11000101; //Timer0 activo;8-bit;pré-scaler 256
TMR0L=246;  //|TMR0=246 interrupções a cada 10ms
INTCON=0b10100000; //Habilita as interrupções gerais e do timer0

//-------------------------------------INTERRUPÇÃO-------------------------------------------

void int0 (void);
#pragma code HIGH_INTERRUPT_VECTOR = 0x8
void high_ISR (void)
{
_asm
goto int0
_endasm
}
#pragma code

#pragma interrupt int0
void int0 (void)
{
TMR0L=246;   //|TMR0=246 interrupções a cada 10ms

cnt_1s++;
INTCONbits.TMR0IF=0;//Reinicializa flag de interrupção timer0
}
Segmentation fault (core dumped)

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.642
    • Electronic Gear for Musicians
Re: Tempo de interrupção. PIC18F4550
« Responder #1 em: 15 de Dezembro de 2012, 07:49 »
Não dizes qt é o teu CLOCK.

Não te esqueças q o CLOCK é dividido por 4 internamente.

Está tudo descrito no datasheet.

Offline MMM

  • Mini Robot
  • *
  • Mensagens: 64
Re: Tempo de interrupção. PIC18F4550
« Responder #2 em: 15 de Dezembro de 2012, 09:31 »
Obrigado pela resposta, eu acho que o fclk=1MHz.

Eu tive o cuidado de fazer os calculos direitinhos, o que para mim é mais estranho é no mplab meto um breakpoint dentro do código que acontece de 1 em 1s para medir o tempo e bate certinho, já no PIC entra muito mais tarde.
Deixo o programa em anexo. Obrigado.

Código: [Seleccione]
#pragma config FOSC=INTOSCIO_EC  //utiliza o cristal interno
#pragma config  MCLRE = OFF   

#define led_ON LATAbits.LATA0 //|LUZES DE AVISO
#define led_WORK LATAbits.LATA1 //|

//---------------------------------------VARIAVEIS----------------------------------------

int cnt_1s=0;
//-------------------------------------INTERRUPÇÃO----------------------------------------

void int0 (void);
#pragma code HIGH_INTERRUPT_VECTOR = 0x8
void high_ISR (void)
{
_asm
goto int0
_endasm
}
#pragma code

#pragma interrupt int0
void int0 (void)
{
TMR0L=246;   //|TMR0=246 interrupções a cada 10ms
// TMR0H=0xff;   //|

cnt_1s++;
INTCONbits.TMR0IF=0;//Reinicializa flag de interrupção timer0
}

void inic (void){
TRISAbits.TRISA0=0; //|Luz de ON ligada
led_ON=1;  //|

TRISAbits.TRISA1=0; //|Luz de trabalho
LATAbits.LATA1=1;   //|
T0CON=0b11000111; //Timer0 activo;8-bit;pré-scaler 256
TMR0L=246;  //|TMR0=246 interrupções a cada 10ms
INTCON=0b10100000; //Habilita as interrupções gerais e do timer0

ADCON1 = 0x0F; //Desliga os pinos do AD

}
void main (void){
inic();
while(1){
if(cnt_1s==100){
cnt_1s=0;
// nivel();
led_WORK=~led_WORK;

}
}
}
Segmentation fault (core dumped)

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.642
    • Electronic Gear for Musicians
Re: Tempo de interrupção. PIC18F4550
« Responder #3 em: 15 de Dezembro de 2012, 09:33 »
e tens o clock certo configurado no MPLAB ?

Offline MMM

  • Mini Robot
  • *
  • Mensagens: 64
Re: Tempo de interrupção. PIC18F4550
« Responder #4 em: 15 de Dezembro de 2012, 09:40 »
Acho que sim, aparece me mesmo na ultima barra naqueles quadradinhos 1MHz.
Segmentation fault (core dumped)

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.507
Re: Tempo de interrupção. PIC18F4550
« Responder #5 em: 15 de Dezembro de 2012, 15:47 »
E o clock que usas na simulação (proteus) e na realidade é da mesma frequência?
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline MMM

  • Mini Robot
  • *
  • Mensagens: 64
Re: Tempo de interrupção. PIC18F4550
« Responder #6 em: 15 de Dezembro de 2012, 15:51 »
Boas, Beirão. Como eu tinha a linha
Código: [Seleccione]
#pragma config FOSC=INTOSCIO_ECele assumia logo como a frequencia do micro, aparecendo mesmo um warning a referir o mesmo.
Eu acabei por resolver o problema apagando essa linha do código, pelo menos quando testo na breadboard funciona, já no proteus ainda não tive oportunidade de experimentar, mas no mplab funciona bem.

Cometi algum erro ao configurar assim? xD
Segmentation fault (core dumped)

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.507
Re: Tempo de interrupção. PIC18F4550
« Responder #7 em: 15 de Dezembro de 2012, 16:01 »
Boas, Beirão. Como eu tinha a linha
Código: [Seleccione]
#pragma config FOSC=INTOSCIO_ECele assumia logo como a frequencia do micro, aparecendo mesmo um warning a referir o mesmo.
Eu acabei por resolver o problema apagando essa linha do código, pelo menos quando testo na breadboard funciona, já no proteus ainda não tive oportunidade de experimentar, mas no mplab funciona bem.

Cometi algum erro ao configurar assim? xD

Mas na breadboard usas que frequência de clock? em que pins?
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.507
Re: Tempo de interrupção. PIC18F4550
« Responder #8 em: 15 de Dezembro de 2012, 16:04 »
Esquece. Estás a usar o interno, ne?
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline MMM

  • Mini Robot
  • *
  • Mensagens: 64
Re: Tempo de interrupção. PIC18F4550
« Responder #9 em: 15 de Dezembro de 2012, 16:20 »
Sim, uso o interno.
Segmentation fault (core dumped)