TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: tretas en 22 de Noviembre de 2009, 13:08:26
-
Ola,
tenho o seguinte codigo para testar o timer0
#include <16f877A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT, NODEBUG
#device ADC=10 //CAN 10 bits
#use delay(clock=8000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8)
#define sortie_piston14 PIN_A1
#define sortie_piston58 PIN_A2
unsigned int16 temps_piston14 =10000, temps_piston58=20000;
////////////////////////////////////////////////////////////////////////////////
// TIMER 0 //
////////////////////////////////////////////////////////////////////////////////
#INT_timer0
void trata_timer0 ()
{
static int conta;
// reinicia o timer0 em 6 mais a contagem que já passou
set_timer0 ( 6 + get_timer0() );
conta++;
// se já ocorreram 250 interrupções ( 256 - 6 = 250 )
if ( conta == 250 ) //
{
conta = 0;
// temps_piston14 -= temps_piston14 ;
temps_piston14 = temps_piston14 - temps_piston14;
}
}
////////////////////////////////////////////////////////////////////////////////
// MAIN //
////////////////////////////////////////////////////////////////////////////////
void main()
{
output_high(PIN_E0);
enable_interrupts ( GLOBAL ) ;
// configura o timer 0 para clock interno e prescaler dividindo por 32
setup_timer_0 ( RTCC_INTERNAL|RTCC_DIV_32 );
set_timer0 ( 6 ); // inicia o timer 0 em 6
// habilita interrupções
enable_interrupts ( INT_timer0 );
while(TRUE)
{
if (temps_piston14 > 1)
output_high(sortie_piston14);
else
output_low(sortie_piston14);
if (temps_piston58 > 1)
output_high(sortie_piston58);
else
output_low(sortie_piston58);
}
}
e queria activar a saida RA1 durante 10 segundos, so que ela fica 1 segundo activa no maximo que estarei a fazer de mal ?
pois penso que o timer0 esta bem programado ... estou a dar em loco :(
-
Así como configuras el timer interrumpirá cada 4ms, y para realizar una temporización de 10s deberás contar 2500 interrupciones :?
Otra puede ser configurar el timer para que interrumpa cada 16ms y contar 625, ect.
Saludos!
-
ola,
sim eu genero uma interrupção todos os 4ms mas ...
unsigned int16 temps_piston14 =10000, temps_piston58=20000;
if ( conta == 250 ) //
{
conta = 0;
// temps_piston14 -= temps_piston14 ;
temps_piston14 = temps_piston14 - temps_piston14;
0.004 ms * 250 = 1s .... ou estou errado ?
logo a variável temps_piston14 só deveria ser = a 0 passado 10s ... ou o timer0 não funciona assim ?
-
Lo podes hacer con 1 variable:
int16 DiezSegundos=2500;
void trata_timer0 ()
{
set_timer0(6);
DiezSegundos--;
if(DiezSegundos==0){...
Saludos!