Autor Tema: Concatenar contenido de dos registros  (Leído 7209 veces)

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

Desconectado Mecátronica2012

  • PIC10
  • *
  • Mensajes: 19
Re:Concatenar contenido de dos registros
« Respuesta #15 en: 29 de Junio de 2019, 18:01:07 »
Muchas gracias, investigando en los foros de microchip encontre algunos ejemplos para uso de sockets, creen que habra que ir sobre la serie PIC18 para implementar el stack TCP/IP de microchip, o bastara por ejemplo con los 7kb de memoria de programa y 368bytes de ram de un PIC16f88? , estoy poco familiarizado con los PIC18, preferira un PIC16 si fuera posible

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7363
Re:Concatenar contenido de dos registros
« Respuesta #16 en: 29 de Junio de 2019, 21:02:23 »
Si lo haces en C, va a haber poca diferencia entre un PIC16 y un PIC18.

Y siempre tenes algun tutorial:

https://www.studentcompanion.co.za/interfacing-enc28j60-ethernet-controller-with-pic-microcontroller-xc8/

Desconectado Mecátronica2012

  • PIC10
  • *
  • Mensajes: 19
Re:Concatenar contenido de dos registros
« Respuesta #17 en: 02 de Septiembre de 2019, 01:15:21 »
Buenas tardes a todos, he estado tratando de implementar en un programa que estoy realizando las interrupciones por cambio de estado en los pines RB4-RB7, sin embargo habra manera de que solo lance esta interrupcion en determinado flanco, ya sea el de subida o de bajada? he buscado informacion pero no encuentro nada al respecto.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7363
Re:Concatenar contenido de dos registros
« Respuesta #18 en: 02 de Septiembre de 2019, 12:49:36 »
Buenas tardes a todos, he estado tratando de implementar en un programa que estoy realizando las interrupciones por cambio de estado en los pines RB4-RB7, sin embargo habra manera de que solo lance esta interrupción en determinado flanco, ya sea el de subida o de bajada? he buscado información pero no encuentro nada al respecto.

La interrupción se dispara por cambio de nivel (los dos flancos podríamos pensar)..
Si buscas un flanco ascendente, no vas a evitar que entre en un flanco descendente a tu interrupción. Pero lo que si podes evitar es realizar algo.
Entonces necesito determinar cuando es ascendente. Lo que voy a hacer es guardar el valor de la entrada que me interesa. Por ejemplo imagínate quiero saber el flanco ascendente de RB6.

Tengo las siguientes situaciones donde entrarías a tu interrupción:

- Que cambie cualquier otra entrada
- Que cambie la entrada RB6 de 1 a 0
- Que cambie la entrada RB6 de 0 a 1

En la unica que voy a querer hacer algo es en la tercera.
Por lo que cada vez que entre a la interrupción voy a fijarme el valor de RB6 con el valor de la misma entrada que tenia guardado de la ultima ves que entro a la interrupción.
Si lo que tenia guardado es en 0, y paso a 1, entonces hubo un flanco ascendente y actúo en consecuencia. En todos los casos debo actualizar los valores que tengo guardado de las entrada asi determinar que flanco es.

Desconectado Mecátronica2012

  • PIC10
  • *
  • Mensajes: 19
Re:Concatenar contenido de dos registros
« Respuesta #19 en: 03 de Septiembre de 2019, 01:42:53 »
Gracias me funciono a la perfeccion, pongo el codigo de la funcion de interrupcion :


int volatile CurrentState;
int volatile PreviusState;
void Isr_ToggleBit();

void interrupt Isr_ChangeState()
{
    if (INTCONbits.RBIF == 1)
    {
        //Se guarda el estado actual
        if (PORTBbits.RB7 == 1)
        {
            CurrentState = 1;
        }
        else
        {
            CurrentState = 0;
        }
       
        //se valida si es flanco ascendente
        if ((PreviusState == 0) && (CurrentState == 1))
        {
            Isr_ToggleBit();
        }
    }
   
    PreviusState = CurrentState;
    INTCONbits.RBIF = 0;
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7363
Re:Concatenar contenido de dos registros
« Respuesta #20 en: 03 de Septiembre de 2019, 06:46:23 »
El if no tiene sentido...
Código: C
  1. void interrupt Isr_ChangeState()
  2. {
  3.     if (INTCONbits.RBIF == 1)
  4.     {
  5.         CurrentState = PORTBbits.RB7;
  6.        
  7.         //se valida si es flanco ascendente
  8.         if ((PreviusState == 0) && (CurrentState == 1))
  9.         {
  10.             Isr_ToggleBit();
  11.         }
  12.  
  13.     PreviusState = CurrentState;
  14.     INTCONbits.RBIF = 0;
  15.  
  16.     }
  17. }

Y tambien estaba pensando si es posible hacerlo asi, ya que solo me interesa cuando sea menor es decir Previous en 0 y Current en 1.
Código: C
  1. void interrupt Isr_ChangeState()
  2. {
  3.     if (INTCONbits.RBIF == 1)
  4.     {
  5.         CurrentState = PORTBbits.RB7;
  6.        
  7.         //se valida si es flanco ascendente
  8.         if (PreviusState < CurrentState)
  9.         {
  10.             Isr_ToggleBit();
  11.         }
  12.  
  13.     PreviusState = CurrentState;
  14.     INTCONbits.RBIF = 0;
  15.  
  16.     }
  17. }

Desconectado Mecátronica2012

  • PIC10
  • *
  • Mensajes: 19
Re:Concatenar contenido de dos registros
« Respuesta #21 en: 11 de Septiembre de 2019, 18:41:54 »
Muchas gracias por la ayuda, ahora estoy empezando a introducirme a la gama PIC18, en concreto con el 18F4550, pero el manejo de los bits de configuracion es un poco mas lioso y no me aclaro muy bien con la parte que tiene que ver con la configuracion del oscilador, quiero manejar una frecuencia de 4mhz, usando un oscilador externo de cristal, sin preescaler ni postacaler de ningun tipo :

// CONFIG1L
#pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 1       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)

// CONFIG1H
#pragma config FOSC = XT_XT     // Oscillator Selection bits (XT oscillator (XT))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

esta correcto ?
Una duda mas , este bit : #pragma config PBADEN = OFF, segun la descripcion, los bits, RB4-rb0 son configurados como analogicos en el reset, pero haciendo pruebas no he encontrado ninguna diferencia entre dejarlo en 1 o en 0, alguien sabe que utilidad tiene este bit?
Un saludo a todos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7363
Re:Concatenar contenido de dos registros
« Respuesta #22 en: 11 de Septiembre de 2019, 19:57:58 »
El USB necesita si o si 6Mhz o 48Mhz para funcionar.
Por lo tanto si usas el USB vas a necesitar una de esas dos frecuencias. La primera es con un cristal directo, y la segunda usando el PLL.

La mejor forma de entender el oscilador es viendo el diagrama del mismo. El diagrama lo tenes en la parte de "oscilador" en el datasheet. Y necesitas seguir la "linea" desde la entrada del oscilador hacia donde quieras ir.

El PLL necesita si o si una frecuencia de 4Mhz. Si pones un cristal mas grande entones tenes que dividirlo para eso esta el PLLDIV

Citar
quiero manejar una frecuencia de 4mhz, usando un oscilador externo de cristal, sin preescaler ni postacaler de ningun tipo :

Suponiendo que tenes un cristal de 4Mhz y necesitas 4Mhz, entonces no vas a poder usar el USB:

Código: C
  1. #pragma config FOSC = XT_XT     // Oscillator Selection bits (XT oscillator (XT))
  2. #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])

Y lo demas no importa, Estamos seleccionado XT sin el PLL, y sin preescaler (1:1)

Si necesitas si o si USB, Entonces no vas a lograr tener tus 4Mhz, solo vas a lograr un minimo de 16Mhz (maximo 48Mhz) y quedaria así para el minimo:
Código: C
  1. // CONFIG1L
  2. #pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
  3. #pragma config CPUDIV = OSC4_PLL6// System Clock Postscaler Selection bits ([Primary Oscillator Src: /4][96 MHz PLL Src: /6])
  4. #pragma config USBDIV = 2       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from the 96 MHz PLL divided by 2)
  5.  
  6. // CONFIG1H
  7. #pragma config FOSC = XTPLL_XT  // Oscillator Selection bits (XT oscillator, PLL enabled (XTPLL))


Citar
Una duda mas , este bit : #pragma config PBADEN = OFF, segun la descripcion, los bits, RB4-rb0 son configurados como analogicos en el reset, pero haciendo pruebas no he encontrado ninguna diferencia entre dejarlo en 1 o en 0, alguien sabe que utilidad tiene este bit?
Un saludo a todos

Usualmente siempre pero siempre modificas el TRIS, el ADCON1 para ponerlos en digital... si es que lo necesitas como digital.
Y SI, apenas ocurre el reset estan como analogicos, si vos desactivas este bit, inician como digitales. Esto te ahorraría el modificar el registro ADCON1 para pasarlos a digitales.
O basicamente esto es lo que ocurre...
Si PBADEN es OFF (entradas en digital) el ADCON1 tiene los bits asi PCFG<3:0> = 0111. (todos los RB como digitales) , si lo tenes en ON el ADCON1 tiene los bits asi PCFG<3:0> = 0000; (Todos analogicos), pensalo como un pre-set del registro ADCON1.

Por si no queda claro:
Todo esta en el datasheet :3