Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/11/2010 #1


Duda en interrupcion de recepcion con CCS
Hola a todos.

Tengo montado un programa en CCS que quiero controlar acciones a traves de la interrupcion de tipo #int_RDA por puerto serie, y lo envio por labview.

La cuestion es que envio un caracter, lo recibe y me lo envia para confirmar, activo y desactivo variables a nivel de 1 y 0, pero cuando el programa principal empieza no hace nada se estanca en la primera condicion que le ordeno dentro del main, es como sino reaccionara con las condiciones que le doy en la interrupcion.

Haber si se me puede decir donde fallo

Muchas gracias.

Dejo el codigo del programa.

Código PHP:
#include "NewPFC.h"
#include <ds1307.c>
#include <24AA1025.c>
#define SIZE 32

int clock_on=250,i=0,j=0,k=0;
int16 address=0,count=0;
char buffer1[SIZE],buffer2[SIZE],buffer3[SIZE],buffer4[SIZE],buffer5[SIZE],buffer6[SIZE];
BYTE hora,minuto,segundo,mes,any,dia,semana;
BYTE start1,start2,start3,start4,flag1,flag2,flag3

#int_RDA
void  RDA_isr(void
{
   
disable_interrupts(INT_RDA);
   if(
kbhit())
   {
      switch (
getc())
      {
         case 
'K':
                  
putc('R');
                  
start3=1;
                  
start2=0;
                  break;
         case 
'J':  
                  
putc('M');
                  
start2=1;
                  
start3=0;
                  
start4=0;
                  break;
         case 
'D':
                  
start1=1;
                  break;       
      }
   }
   
enable_interrupts(INT_RDA);
}

#int_TIMER0
void  TIMER0_isr(void
{
   
disable_interrupts(INT_TIMER0);
   if(
i<SIZE)
   {
      
set_adc_channel(4);
      
buffer1[i]=read_adc();
      
set_adc_channel(5);
      
buffer2[i]=read_adc();
      
set_adc_channel(6);
      
buffer3[i]=read_adc();
      
set_adc_channel(7);
      
buffer4[i]=read_adc();
      
set_adc_channel(8);
      
buffer5[i]=read_adc();
      
set_adc_channel(9);
      
buffer6[i]=read_adc();
      
i++;
      
set_timer0(clock_on);
   }
   
enable_interrupts(INT_TIMER0);   
}



void main()
{

   
setup_adc_ports(sAN4|sAN5|sAN6|sAN7|sAN8|sAN9|VSS_VDD);
   
setup_adc(ADC_CLOCK_DIV_4);
   
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   
setup_timer_1(T1_DISABLED);
   
setup_timer_2(T2_DISABLED,0,1);
   
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   
enable_interrupts(INT_RDA);
   
enable_interrupts(INT_TIMER0);
   
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   
start2=1;
   
flag1=1;
      
   
// TODO: USER CODE!!

   
while(true)
   {
         if(
start1==1)
         {
            
dia=getc();
            
mes=getc();
            
any=getc();
            
hora=getc();
            
minuto=getc();
            
segundo=getc();
            
ds1307_introducir_tiempo(diamesanysemanahoraminutosegundo);
            
start1=0;
            
flag2=1;
            
start3=1;
         }   
         if(
start2==1)
         {
            while(
flag1==1)
            {
               for(
j=0;j<=SIZE;j++)
               {
                  
output_high(PIN_A0);
                  
write_ext_eeprom(addressbuffer1[j]);
                  
address++;
                  
write_ext_eeprom(addressbuffer2[j]);
                  
address++;
                  
write_ext_eeprom(addressbuffer3[j]);
                  
address++;
                  
write_ext_eeprom(addressbuffer4[j]);
                  
address++;
                  
write_ext_eeprom(addressbuffer5[j]);
                  
address++;
                  
write_ext_eeprom(addressbuffer6[j]);
                  
address++;
                  
ds1307_obtener_calendario(diamesanysemana);
                  
write_ext_eeprom(address,dia);
                  
address++;
                  
write_ext_eeprom(address,mes);
                  
address++;
                  
write_ext_eeprom(address,any);
                  
address++;
                  
ds1307_obtener_hora(horaminutosegundo);
                  
write_ext_eeprom(address,hora);
                  
address++;
                  
write_ext_eeprom(address,minuto);
                  
address++;
                  
write_ext_eeprom(address,segundo);
                  
address++;
               }
               
count++;
               
i=0;
               
j=0;
            }
            
count=0;
            
address=0;
         }   
         if(
start3==1)
         {
            while(
flag2==1)
            {
               for(
j=0;j<=count;j++)
               {
                  for(
k=0;k<=32;j++)
                  {
                     
output_high(PIN_A1);
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
putc(read_ext_eeprom(address));
                     
address++;
                     
delay_ms(100);
                  }
               }
               
start3=0;
               
flag2=0;
            }
               
start4=1;
               
flag3=1;
               
address=0;
         }         
         if(
start4==1)
         {
            while(
flag3==1)
            {
               for(
j=0;j<=SIZE;j++)
               {
                  
putc(buffer1[j]);
                  
putc(buffer2[j]);
                  
putc(buffer3[j]);
                  
putc(buffer4[j]);
                  
putc(buffer5[j]);
                  
putc(buffer6[j]);
                  
ds1307_obtener_calendario(diamesanysemana);
                  
putc(dia);
                  
putc(mes);
                  
putc(any);
                  
ds1307_obtener_hora(horaminutosegundo);
                  
putc(hora);
                  
putc(minuto);
                  
putc(segundo);   
               }
            }
            
         }
     }

22/08/2011 #2


Has intentado limpiar la interrupción con clear_interrupt(INT_RDA), antes del enable... pues algunas veces no se limpia el flag automáticamente con la lectura del registro serial. Si no te funciona prueba sacar toda tu rutina de captura y comparación fuera del RDA y ponla en el main envuelta de un IF cuya variable clave de acceso se habilita en la interrupcion RDA por ejemplo:

Código PHP:
int1 clave=0;
#INT_RDA
void SerialRX()
{
clave=1;
disable_interrupts(INT_RDA);
}

void main()
{
do
{
....
...
if(
clave)
{
...
......
...
}
}while(
true);

Y ya que estamos con la INT_RDA te pregunto si supieras alguna forma de desertar del SLEEP con esta interrupcion, puesto que en proteus funciona pero en la practica no.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.