collapse

* Posts Recentes

protecção equipamentos por dio123
[28 de Janeiro de 2023, 11:26]


Mais uma reparação - frigorífico Fagor por jm_araujo
[21 de Janeiro de 2023, 10:08]


Desumidificador avariado por almamater
[20 de Janeiro de 2023, 23:20]


Câmara SPI para microcontroladores por SerraCabo
[17 de Janeiro de 2023, 16:18]


Symmetrical soft-start por dropes
[08 de Janeiro de 2023, 16:46]


Compressor sem óleo por senso
[07 de Janeiro de 2023, 19:41]


Filtro para ruido por filjoa
[06 de Janeiro de 2023, 17:58]


Gráfica e Monitor avariados.. por almamater
[04 de Janeiro de 2023, 23:12]


Bom ano novo por TigPT
[01 de Janeiro de 2023, 23:35]


+um LASER simples por dropes
[01 de Janeiro de 2023, 12:49]

Autor Tópico: Routina de 1ms com o tmr0  (Lida 17231 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Routina de 1ms com o tmr0
« Responder #30 em: 03 de Novembro de 2014, 10:07 »
E tenho de ver se arranjo um oscilóscpio para tirar as teimas.

Sim... é melhor que cronometrar à mão.... muito melhor  ;D ;D
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Routina de 1ms com o tmr0
« Responder #31 em: 03 de Novembro de 2014, 10:30 »
Ok pessoal, já deu para tirar umas conclusões.
Usar a interrupção com apenas uma flag(state machine) a dar indicação que o timer rolou.
Ter em conta a chamada e saida para a função de delay assim como fazer o load do tmr0 com o respectivo valor.
Mais logo quando chegar a casa já esperimento isto outa vez.
E tenho de ver se arranjo um oscilóscpio para tirar as teimas.


Olha q possivelmente para trabalho digital, ha algo melhor q o osciloscopio ::  um Logic Analyzer

Tipo estes muito bons: https://www.saleae.com/  com a vantagem de agora as entradas tb medirem sinais analogicos substituindo completamente o osciloscopio e com  memoria "infinita"

Mais baratuxo tens o Bus Pirate mas c as specs muito muito abaixo.
Tambem o USBEE, mais caro q o Saleae e nao eh melhor.

Ha outros.
O meu conselho eh comecar com um Analyzer q faca analogico tb e depois se precisares de medir RF, entao outro aparelho dedicado.
E podes levar na bolsa do computador, o q nao acontece c o scope.

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Routina de 1ms com o tmr0
« Responder #32 em: 03 de Novembro de 2014, 10:51 »
Boa dica, é que eu até tenho aqui um bus pirate  :D

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Routina de 1ms com o tmr0
« Responder #33 em: 03 de Novembro de 2014, 22:22 »
Ora já tirei umas amostras com o bus pirate, a unica consistencia é que os valores são completamente inconsistentes, talvez por causa do cristal interno.
Ora vejam :
Para este código ,
Código: [Seleccione]
#include <pic12f1822.h>


/* Setup chip configuration */
__code int __at(_CONFIG1) __CONFIG = _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF;

void setup(void);
void delay_ms(int milis);
void minute_delay(void);


void main(void) {

    setup();


    while(1) {

        delay_ms(1);
        LATA |= (1<<2);
        delay_ms(1);
        LATA &= ~(1<<2);
    }

}

void setup(void) {

    OSCCON = 0b01011000; // 1MHZ internal clock
    LATA = 0;
    TRISA = 0x00;
    PORTA = 0x00;

__asm
cblock 0x20
d1
endc
__endasm;

}

void delay_ms(int milis) {

    while (milis--) {
    __asm
        movlw   0x51
        movwf   d1
        Delay_0:
        decfsz  d1, f
        goto    Delay_0
    __endasm;
    }
}


void minute_delay(void) {

    unsigned char minute = 60;

    while (minute--) {
    delay_ms(1000);
    }
}
O ficheiro logic_sniffer_asm.png

E para este código,
Código: [Seleccione]
#include <pic12f1822.h>


/* Setup chip configuration */
__code int __at(_CONFIG1) __CONFIG = _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF;

void setup(void);
void delay_ms(int milis);



void main(void) {

    setup();


    while(1) {

        delay_ms(1);
        LATA |= (1<<2);
        delay_ms(1);
        LATA &= ~(1<<2);
    }

}

void setup(void) {

    OSCCON = 0b01011000; // 1MHZ internal clock
    LATA = 0;
    TRISA = 0x00;
    PORTA = 0x00;


//  Clock source selection (Fosc/4)
    TMR0CS = 0;
    PSA = 1;    // No prescaler

}

void delay_ms(int milis) {

    while (milis--) {

        TMR0 = 6;  //
        while (!TMR0IF);  //latch till 1ms interrupt happens
        TMR0IF = 0;
    }
}
O ficheiro logic_sniffer_C_no_int.png.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Routina de 1ms com o tmr0
« Responder #34 em: 03 de Novembro de 2014, 22:30 »
Tanto num como noutro é normal teres essas diferenças, quando apagas o led tens mais código a ser executado para voltares ao inicio do loop while, isso leva-te a que o on/off não tenha um duty cycle de 50%, terás sempre ligeiras diferenças, no outro, isso parece-me jitter devido a caminhos de execução diferentes, tempo de entrada numa ISR e la la la, não sei se num pic é totalmente deterministico mas num AVR um salto para uma interrupção pode demorar 3 ou 4 ciclos de relógio, depende de algumas coisas.
Avr fanboy

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Routina de 1ms com o tmr0
« Responder #35 em: 03 de Novembro de 2014, 22:40 »
Tambem me cheira a imprecisão do próprio bus pirate, afinal é um PIC e não estou a ver nenhum cristal na placa pelo que tambem deve estar a usar o cristal interno. cómico no minimo.

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Routina de 1ms com o tmr0
« Responder #36 em: 03 de Novembro de 2014, 22:43 »
Bom, eu acho q a aproximacao ao problema estah a ser feita da maneira menos correcta.
Andas preocupado no porque das funcoes nao darem o tempo correcto, qd dever-se-ah pensar de outra maneira.

Se sabes quanto tempo demora cada instrucao a executar, entao contar instrucoes eh a melhor solucao. E ASM eh a melhor solucao p esta situacao. Uma funcao completamente TODA em ASM apenas para fazer o temporizador.

Este exemplo em ASM estah feito par aum cristal de 4MHz tendo entao um Fosc de 1MHz. No teu caso eh aumentar o teu clock soh dividir o numero multiplicado.
Experimenta. Este garanto-te que te dah 1.000ms ou 2*500us

Código: [Seleccione]

processor 16F886 ;configura o tipo de CPU usado
radix hex ;pre-definicao do tipo de valores numericos usados

include "P16F886.inc" ;inclui pre-definicoes do processador

;---------------------------
temp equ 0x20 ;define endereco 0x20 com o nome de TEMP

;---------------------------


inicio

call atraso_500u ;chama rotina de atraso
call atraso_500u ;chama rotina de atraso

goto inicio ;faz temporizacao de novo

;---------------------------

atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5
movwf temp ;move valor em W para TEMP

decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1


nop
nop

return ;sai fora da rotina de ATRASO

;---------------------------
end


Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Routina de 1ms com o tmr0
« Responder #37 em: 03 de Novembro de 2014, 22:46 »
Tambem me cheira a imprecisão do próprio bus pirate, afinal é um PIC e não estou a ver nenhum cristal na placa pelo que tambem deve estar a usar o cristal interno. cómico no minimo.


Infelizmente equipamente barato tem sempre concessoes. E os cristais bons sao caros. Um cristal barato eh igual a usar o RC interno cortado a laser q vai alterar com a tensao e a temperatura.

Tambem o compilador nao estah provavelmente a optimizar para o melhor servico (soh vendo o ASM final) logo aih tambem tem falhas.


Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Routina de 1ms com o tmr0
« Responder #38 em: 03 de Novembro de 2014, 23:02 »
Bem acho que definitivamente já não vou confiar no bus pirate para isto.
Esta foi feita com o mikroC.
Mas asena uma coisa eu garanto-te de todos os métodos com o mikroC tenho o melhor resultado se não perfeito com oscilador interno.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Routina de 1ms com o tmr0
« Responder #39 em: 03 de Novembro de 2014, 23:04 »
Não tens nada mais standalone?
O bus pirate está a correr montes de código enquanto está a olhar para os pinos.
Avr fanboy

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Routina de 1ms com o tmr0
« Responder #40 em: 03 de Novembro de 2014, 23:06 »
Bem tenho oscilóscopio no trabalho, é o próximo passo.
Mas asena o teu asm está simples e eficaz, não duvido que funcione, estás-me a sugerir que escreva o código todo em asm então ?
De outra maneira não estou a ver como transporto isto para projectos maiores.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.889
  • NERD!
Re: Routina de 1ms com o tmr0
« Responder #41 em: 03 de Novembro de 2014, 23:44 »
Código: [Seleccione]
void delay_ms(int milis) {

    while (milis--) {

        TMR0 = 6;  //
        while (!TMR0IF);  //latch till 1ms interrupt happens
        TMR0IF = 0;
    }
}

Devias ler com mais atenção o que já te disseram pelo menos o Dave (http://lusorobotica.com/index.php?topic=7725.msg86679#msg86679), o asena (http://lusorobotica.com/index.php?topic=7725.msg86685#msg86685) e também ler os vários  exemplos que deram.
Deves adicionar ao TMR0 em vez de fazer uma atribuição para diminuir o erro: usar "TMR0+=6;" em vez de "TMR0=6;". Eu próprio ia fazer essa sugestão quando eles se me adiantaram, é usada desde os tempos em que praticamente só se programava PICs em assembly (ainda não havia compiladores de C de jeito).

Enquanto não eliminares o básico vai-te ser difícil despistar se é imprecisão do oscilador ou outro fator.

Offline Electropepper

  • Mini Robot
  • *
  • Mensagens: 116
    • Electropepper
Re: Routina de 1ms com o tmr0
« Responder #42 em: 04 de Novembro de 2014, 05:41 »
Ok peço desculpa não prestei mesmo atenção.
Vou fazer isso.

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Routina de 1ms com o tmr0
« Responder #43 em: 04 de Novembro de 2014, 09:37 »
Não quero ser chato, mas faz lá teste ao exemplo que te deixei aí de 1s...

Só mesmo para matar a curiosidade...
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Routina de 1ms com o tmr0
« Responder #44 em: 04 de Novembro de 2014, 09:52 »
Mas asena o teu asm está simples e eficaz, não duvido que funcione, estás-me a sugerir que escreva o código todo em asm então ?
De outra maneira não estou a ver como transporto isto para projectos maiores.

Toda nao, mas a funcao de temporizacao se nao fizeres por Interrupcoes, deverahs fazer em ASM e inxluir no teu codigo.

Nem q seja educativo, merece a pena faze-lo.