Autor Tema: Cursillo en C18 para PICS DESDE CERO  (Leído 300293 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #225 en: 30 de Marzo de 2009, 13:30:39 »
Hola, camigod, gracias por tu ayuda, mira, tengo exactamente hecho lo que escribes, funcionando, mi pregunta existencial es la siguiente:

si escribes:

void int_recepcion(){                   
   if(PIR1bits.RCIF){
   PIR1bits.RCIF = 0; 
                }
}


nunca se sale de la interrupcion, por que?

Saludos,

chaos :)
SIEMPRE TE RECORDARE AMADO Y FIEL COMPAÑERO "LOBO"

Desconectado camigod

  • PIC10
  • *
  • Mensajes: 40
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #226 en: 30 de Marzo de 2009, 20:20:01 »
No esque nunca se salga de la interrupcion, lo que pasa es q sale de ella y vuelve a entrar inmediatamente... porque?

Primero:   No es necesario que preguntes por el estado de RCIF  (  if(PIR1bits.RCIF){).... puesto que si el programa entro a esa rutina automaticamente el RCIF esta en 1... entonces esa condicion no sirve de nada hay...

Segundo:   Como te lo mencione anteriormente, la interrupcion por RX se activa cuando se recibe un dato... y no estoy seguro con lo q voy a decir... pero eso equivale a que el buffer del micro se llene. ENTONCES... si el buffer se llena, el programa llama la interrupcion, y como NUNCA lees lo que hay en el buffer, cuando pones en 0 la bandera RCIF... el programa sale de la instruccion y se va a dar cuenta que HAY OTRO DATO EN EL BUFFER (que en realidad vendria siendo el mismo que no leiste)... lo cual provocara otro llamado a la interrupcion.

Espero haberte ayudado
Hasta Luego
Un hombre no muere cuando su corazon deja de latir, un hombre muere, cuando deja de pensar

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #227 en: 31 de Marzo de 2009, 10:15:22 »
Como se que nunca sale?

void int_recepcion(){                   
   if(PIR1bits.RCIF){
 
  manda_datos_TX();
   
  PIR1bits.RCIF = 0; 
   }
GIE=0
}

Y en el Main un loop tirando datos. Estos datos no llegan, solo llegan los datos enviados por la funcion dentro de la interrupcion. El bit GIE, no se setea nunca mas, osea que debiese mandar solo una vez el dato de la interrupcion y despues quedar en un loop enviando el dato desde el Main.


Lo otro es que si tengo activa mas de una fuente de interrupcion, necesitare del  "if(PIR1bits.RCIF){).... ", pero si no esta funcionando, como lo encuento entonces?

Saludos y gracias por seguir el hilo.

chaos :)
SIEMPRE TE RECORDARE AMADO Y FIEL COMPAÑERO "LOBO"

Desconectado freshdesing

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 88
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #228 en: 07 de Abril de 2009, 07:09:24 »
Felicitarte por todo este trabajo. Si no lo has hecho ya, te recomendaría escribir un libro, he visto libros del 16F876/77  con menos contenido que lo que muestras aquí, y tienen éxito.

Gracias de nuevo y un saludo.

¿Para cuándo el USB?  :mrgreen:

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #229 en: 07 de Abril de 2009, 11:39:55 »
justo voy a entrar a un proyecto con esas caracteristicas de utilizar las rutinas de microchip para usb pero en c30, supongo que pasarlo para c18 no será muy dificil, espero tener tiempo para continuar con esto y tambien seguir tu consejo. Muchas Gracias  :-)
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #230 en: 13 de Abril de 2009, 18:38:00 »
seria re bueno, un colega ya le echo mano al USB y auna entrenadora con unchip ethernet, debe ser mas o menos transparente con el pic qeu tiene dicho puerto, a ver si tengo un tiempito y le pido una clasecita :)

salu2 :)

chaos :)

PD. a que nadie le ha pasado lo de la usart interrupt?
SIEMPRE TE RECORDARE AMADO Y FIEL COMPAÑERO "LOBO"

Desconectado SiO2

  • PIC10
  • *
  • Mensajes: 6
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #231 en: 25 de Mayo de 2009, 18:01:18 »
Hola a todos.

   Me he resultado muy interesante este cursillo. ¿Se ha terminado? Que lastima, es realmente útil si quieres empezar, o en mi caso, migrar de los 16f a los 18f

Saludos.

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #232 en: 26 de Mayo de 2009, 08:24:02 »
Hola a todos. no se si deberia postear esto aqui, pero no se donde ponerlo.

Os comento, resulta que quiero recibir datos, a traves de la eusart, estoy usando el pic18f97j60 para implementar un servidor web, este pic tiene dos puertos eusart, uno lo estoy usando como viene por defecto en la tpcip stack de microchip para comunicaciones 232 con el pc, el cual funciona perfectamente, porque ya viene implementado por la stack de microchip. Y el otro lo quiero comunicar con otro pic para recibir datos, para mostrar datos en mi web y estoy usando comunicacion 485.

asi que tengo una interrupcion, de este estilo, en la que recibo los datos que me llegan y los guardo en unas variables:

volatile int v;
volatile unsigned char *m;


volatile unsigned char flagGuardado;
volatile unsigned char flagEnvio;
unsigned char empieza;
volatile int temInt;
int aneInt;
int preInt;
int radInt;
int humInt;
int velInt;
int pluInt;
unsigned char ano;
unsigned char mes;
unsigned char dia;
unsigned char hora;
unsigned char min;
//unsigned char acaba;
unsigned char flagRecepcion;


void interrupciones_bajas (void);
                  //interrupcion
   #pragma code las_interrupciones_bajas = 0x18
   void interrupciones_bajas_asm (void)
      {
           _asm goto interrupciones_bajas _endasm
         
      }
      #pragma code

      #pragma interruptlow interrupciones_bajas
      void interrupciones_bajas (void){
   
         
      if(PIR1bits.RCIF==1){//confirmo que el buffer esta llenandose
                        
            while(PIR1bits.RCIF==0); //wait until you receive a character
            flagRecepcion=RCREG;
            if(flagRecepcion==0x69){   
         
      
               m = (unsigned char *)&empieza;//coloco los datos a partir de este puntero
               for (v = 0; v< 20; v++)//el for hace que se repita 21 veces y cada una de ellas incrementa el puntero
                  {
                  while(PIR1bits.RCIF==0); //wait until you receive a character
                  *m=RCREG;
                  ++m;
                  
                  }
               flagGuardado=1;
               LATCbits.LATC1=1;
               flagRecepcion=0x00;
            }
      }
   
   }

esta interrupcion funciona correctamente en un pic cualquiera, pero al intentar integrarla en la tpcip stack, me da un error de este estilo:

Error - section 'lowVector' can not fit the absolute section. Section 'lowVector' start=0x00000018, length=0x00000006

todavia no he configurado la eusart , pero no creo que tenga nada  que ver con esto.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #233 en: 26 de Mayo de 2009, 16:14:26 »
Hola a todos. no se si deberia postear esto aqui, pero no se donde ponerlo.

Puedes ponerlo en el subforo Lenguaje C para microcontroladores, de esa manera mas personas podran revisar tu post y ayudarte mejor.

saludos  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado gabimelgar

  • PIC10
  • *
  • Mensajes: 11
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #234 en: 19 de Septiembre de 2009, 14:00:41 »
Hola a todos, como va? elpintas, tengo exactamente el mismo problema q vos (comunicar el 97j60 con un pic via USART) y me estoy volviendo loco, probe cambiando el linker, reinslalando el C18, reinstalando el MPLAB y no hay forma, lo mas loco es q el mismo proyecto para el 18f2550 anda perfecto, pero cdo lo quiero adaptar para el 97j60 (le cambio el linker y el Select device) me tira un error como q no reconoce las sentencias referidas al USART (openUSART, getUSART, etc...), pudiste solucionarlo?
Muchas gracias!

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #235 en: 21 de Septiembre de 2009, 17:50:07 »
hola gabimelgar, perdon por el retraso en contestar. Pues la verdad es que ya hace tiempo que solucioné esto y no logro recordar donde estaba el error exactamente.

Creo recordar que es a la hora de definir la interrupcion, ya que tienes que hacerlo dentro del main.c de la TCPIP STACK incluyendola en los bloques donde se definen las interrucpciones de alta y baja prioridad de la propia Stack. Tambien recuerdo que tuve problemas al hacer esta interrupcion de baja prioridad ya que se evaluaba continuamente la condicion de recepción de datos, asi que la puse en las de altaprioridad y se solucionó este problema.
Y tambien me gustaria informarte, que intentes evitar las interrupciones en la medidad de lo posible, a mi por lo menos me han dado muchos problemas al intentar integrarlos en la stack y se acababa parando el programa.

saludos!

Desconectado gabimelgar

  • PIC10
  • *
  • Mensajes: 11
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #236 en: 23 de Septiembre de 2009, 06:28:26 »
Hola a elpintas, gracias por responder, el problema es q hay q poner Open1USART, gets1usart, etc... para enviar datos con eso se soluciona, pero igualmente sigo teniendo problemas para la recepción de datos... puse este codigo:

Código: [Seleccionar]
BYTE inputstr[]="vacio";

#pragma code Interrupcion = 0X12
void VectorInterrupcion(void){
_asm goto ISRRecepcion _endasm
}
#pragma code

// Rutina de Interrupcion.-
#pragma interrupt ISRRecepcion
void ISRRecepcion(void){
if(PIR1bits.RC1IF==1){
gets1USART(inputstr, 9);
Kbhit=1; // Indicamos que se ha recibido un dato.-
PIR1bits.RC1IF=0; // Borramos bandera.-
}
}

pero no puedo leer nada.. tenes idea q puede ser?
gracias por el consejo de las interrupciones, pero creo q no nos queda otra q recurrir a ellas para recibir por usar  :?
saludos!

Desconectado Ciul

  • PIC10
  • *
  • Mensajes: 7
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #237 en: 19 de Diciembre de 2009, 19:05:02 »
Buenas buenas.

Soy nuevo en este foro y pues, he estado ensayando las rutinas para la memoria i2c que han posteado aqui pero, no logro hacerlas funcionar.
Estoy simulando en Protheus, por favor, podría alguien ayudarme?, a ver qué estoy haciendo mal.
luiscarlosjayk@gmail.com


Código: [Seleccionar]
/*=========================================================================

Title:

Description:






   Author: Luis Carlos Osorio Jayk


===========================================================================*/
/*===========================================================================
HEADER FILES
===========================================================================*/

#include <p18f452.h>
#include "myVars.h"
#include <delays.h>
#include <i2c.h>
#include "myI2C.h"


/*===========================================================================
CONFIGURATION BITS
===========================================================================*/

#pragma config WDT = OFF // Turn OFF Watch Dog
#pragma config WDTPS = 128 //
#pragma config OSC = XT // Oscilator selection: HS {Using 20MHz Crystal}
#pragma config PWRT = ON // Turn ON Power Up Time Delay
#pragma config LVP = OFF // Turn OFF Low Voltage Progamming
#pragma config WRTC = ON //
#pragma config WRTD = ON //
#pragma config EBTR0 = ON //
#pragma config EBTR1 = ON //
#pragma config EBTR2 = ON //
#pragma config EBTR3 = ON //
#pragma config EBTRB = ON //
#pragma config DEBUG = OFF //
#pragma config STVR = OFF //
#pragma config CP0 = ON //
#pragma config CP1 = ON //
#pragma config CP2 = ON //
#pragma config CP3 = ON //
#pragma config CPB = ON //
#pragma config CPD = ON //
#pragma config CCP2MUX = OFF //
#pragma config BOR = OFF //
#pragma config BORV = 25 //

/*===========================================================================
USER DATA
===========================================================================*/

#define LedRed PORTBbits.RB0
#define LedGreen PORTBbits.RB1
unsigned char arrayrd[20];
unsigned char *parrayrd = &arrayrd[0];

unsigned char arraywr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
unsigned char *parraywr = &arraywr[0];

//charBitVar var; // A 8bits variable with bit acces. e.g: var.bit0~var.bit7
//intBitVar leds;
/* A 16bit variable with bit and nibble acces.
e.g: leds.bit0~leds.bit15 and leds.nibble0~leds.nibble3*/



/*===========================================================================
User Functions
===========================================================================*/



/*===========================================================================
INTERRUPTION SERVICE ROUTINES
===========================================================================*/

/*High Priority Iterruption Service*/
/*---------------------------------*/
#pragma interrupt high_ISR
void high_ISR (void)
{
// Do...

}

/*Low Priority Interruption Service*/
/*---------------------------------*/
#pragma interruptlow low_ISR
void low_ISR (void)
{
// Do...




}


/*===========================================================================
INTERRUPTION CODE LOCATION
===========================================================================*/

/*High Priority Section*/
/*---------------------*/
#pragma code highPriorityVector = 0x08
void jumpHighPriority (void)
{
_asm
goto high_ISR
_endasm
}
#pragma code // End this code section

/*Low Priority Section*/
/*--------------------*/
#pragma code lowPriorityVector = 0x18
void jumpLowPriority (void)
{
_asm
goto low_ISR
_endasm
}
#pragma code // End this code section



/*===========================================================================
Main Program
===========================================================================*/

void main()
{

/*Configuration*/
/*-------------*/
//RCONbits.IPEN = 1; // Enable Interrupt Priority.

//INTCONbits.GIEH = 1; // Enable High Priority Interruptions.
//INTCONbits.GIEL = 1; // Enable Low Priority Interruptions.

/*TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;*/
TRISC = 0x18;
LATC = 0x00;
TRISB = 0; // PORTB pins -> All as Outputs.
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 0x18;
/*SSPSTAT = 0x80;
SSPADD = 0x18;
SSPCON1 = 0x28;
SSPCON2 = 0x00;*/


EscribeDato_i2c_eeprom(0xA0,0x00,0x00,'@');
Ack_i2c_eeprom(0xA0);

while(1)
{

}











} /* End Main Prgram */
/*=========================================================================*/
/*=========================================================================*/
Entre más aprendo, más reconozco que desconozco

Desconectado Ciul

  • PIC10
  • *
  • Mensajes: 7
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #238 en: 20 de Diciembre de 2009, 09:43:03 »
Buenas buenas de nuevo.

Intente hacer tal cual el ejemplo de i2c que escribe ||PERU||  :D con una ligera modificación, y pues simulando paso a paso en protheus, realiza la primera operación de escritura pero me dí cuenta que están ocurriendo errores luego: primero ocurre una falta del bit de reconocimiento por parte de la memoria i2c a partir de allí ocurren siempre error de colisión del bus.

Por favor si alguien puede ayudarme, se lo agradecería enormemente.


Código: [Seleccionar]
#include <p18f2525.h>
#include <delays.h>
#include <i2c.h>
#include "memoria_externa.h"
 
#pragma config OSC = XT,FCMEN = OFF,IESO = OFF //CONFIG1H
#pragma config PWRT = ON,BOREN = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = PORTC//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = ON,CP1 = ON,CP2 = ON//CONFIG5L
#pragma config CPB = ON,CPD = ON//CONFIG5H
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON//CONFIG6L
#pragma config WRTB = ON,WRTC = ON,WRTD = ON//CONFIG6H
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON//CONFIG7L
#pragma config EBTRB = ON//CONFIG7H
 
int caracter;
unsigned char henry[]="*micro_cadaver*",
cadena[16];
void main(void)
{
TRISA = 0X00;
TRISB = 0X00;
TRISC = 0X18;
LATA = 0X00;
LATB = 0X00;
LATC = 0X00;
Delay1KTCYx(100);
//*******************************************************
// configuración del modulo i2c
//*******************************************************
OpenI2C(MASTER,SLEW_OFF);//inicializo modulo
SSPADD = 9;//100KHz para 4MHz
//*******************************************************
EscribeDato_i2c_eeprom(0XA0,0X00,0X00,'M');
EscribeDato_i2c_eeprom(0XA0,0X00,0X01,'E');
EscribeDato_i2c_eeprom(0XA0,0X00,0X02,'N');
EscribeDato_i2c_eeprom(0XA0,0X00,0X03,'S');
EscribeDato_i2c_eeprom(0XA0,0X00,0X04,'A');
EscribeDato_i2c_eeprom(0XA0,0X00,0X05,'J');
EscribeDato_i2c_eeprom(0XA0,0X00,0X06,'E');
Ack_i2c_eeprom(0XA0);
caracter=LeeDato_i2c_eeprom(0XA0,0X00,0X00);
Delay1KTCYx(500);
 
EscribeDatos_i2c_eeprom(0XA0,0X00,0X10,"|||PERU|||");
Ack_i2c_eeprom(0XA0);
 
EscribeCadena_i2c_eeprom(0XA0,0X00,0X00,henry);
Ack_i2c_eeprom(0XA0);
 
LeeDatos_i2c_eeprom(0XA0,0X00,0X10,cadena,10);
 
LeeDatos_i2c_eeprom(0XA0,0X00,0X00,cadena,15);
 
while(1);
 
//*******************************************************
//*******************************************************
}
Entre más aprendo, más reconozco que desconozco

Desconectado Ciul

  • PIC10
  • *
  • Mensajes: 7
Re: Cursillo en C18 para PICS DESDE CERO
« Respuesta #239 en: 20 de Diciembre de 2009, 10:07:19 »
Hola otra vez.

Disculpen mi desespero pero bueno...sigo intentado una y otra y otra vez.

He logrado entre comillas "resolverlo" colocando un retardo de mínimo 5000 ciclos de reloj, para un cristal de 4 MHz pues serían unos 5ms.
Pero para la aplicación que quiero desarrollar, 5ms es una eternidad. Requiero leer al menos 6 bytes de la memoria, en un lapso máximo de 1 ms.

HEEEEEEEEEEEEEEEEEEEEEEEEEEELP  :sad: :8}
Entre más aprendo, más reconozco que desconozco