Autor Tema: AYUDA CON PROYECTO  (Leído 2047 veces)

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

Desconectado garea88

  • PIC10
  • *
  • Mensajes: 3
AYUDA CON PROYECTO
« en: 08 de Junio de 2015, 16:28:37 »
HOLA AMIGOS:
Tengo que presentar un proyecto y necesito ayuda.

El proyecto es el siguiente.

- DISPONGO DE DOS PIC 18F45K20 los cuales tengo que conectar entre ellos,unicamente mediante TX Y RX,al pulsar el boton (RB0) del primer pic se tienen que encender 8 leds del pic 2,al pulsar rb0 en el pic2 se tienen que apagar sus leds y encenderse los del pic1.

Para ello usamos mplab c18 y mplab IDE y proteus y la placa que veis en la foto.





« Última modificación: 17 de Junio de 2015, 07:56:10 por garea88 »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: PAGO POR AYUDA CON PROYECTO.URGENTE!
« Respuesta #1 en: 08 de Junio de 2015, 17:22:38 »
Así se sale luego al mundo laboral, muy bien luego nos quejaremos
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PAGO POR AYUDA CON PROYECTO.URGENTE!
« Respuesta #2 en: 08 de Junio de 2015, 18:09:42 »
... En si el proyecto no tiene ninguna dificultad..

Encima es el mismo programa en uno u otro PIC :P

UART pic 1 - UART pic 2

En ASM ese programa deberia llevar unas 30/40 lineas de codigo xD y en C tal ves unas 10 a 20 como mucho. xD  (3 o 4 lineas programa principal + 2 lineas interrupcion + tal ves 15 lineas para configurar puertos y setear los baudiso)
Esos pics tienen oscilador interno, seguro que se puede omitir el MCLR, en fin. lo unico a conectar sera el pulsador a gnd (por que tiene pullup interno), la alimentacion y los leds con sus resistencia a cada pic, y entre ellos los RX y TX de las UART.

O sea es MUY MUY MUY pero MUY facil.

Pero bueno si deseas "comprarlo" entonces suerte con eso. Si deseas aprender, podes usar la interrupcion de la UART y listo, serian 2 funciones, una de la interrupcion y otra que es la principal. Fin del programa y HW
Hasta los fuses te los genera el propio MPLAB X,
« Última modificación: 08 de Junio de 2015, 18:27:23 por KILLERJC »

Desconectado garea88

  • PIC10
  • *
  • Mensajes: 3
Re: PAGO POR AYUDA CON PROYECTO.URGENTE!
« Respuesta #3 en: 09 de Junio de 2015, 06:53:00 »
gracias
« Última modificación: 17 de Junio de 2015, 07:56:50 por garea88 »

Desconectado garea88

  • PIC10
  • *
  • Mensajes: 3
Re: PAGO POR AYUDA CON PROYECTO.URGENTE!
« Respuesta #4 en: 09 de Junio de 2015, 13:44:17 »
algo mas?
« Última modificación: 17 de Junio de 2015, 07:57:05 por garea88 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PAGO POR AYUDA CON PROYECTO.URGENTE!
« Respuesta #5 en: 09 de Junio de 2015, 14:55:55 »
Cosas a tocar en este programa:

  • UART configuracion y envio
  • Funciones (vectores) de Interupciones
  • Configuracion de puertos
  • Fuses
  • Oscilador

Bueno empecemos con las interrupciones, ese PIC posee 2 vectores de interrupcion, uno de baja prioridad y el otro de alta prioridad. Buscando por google "interrupt XC8" tenes:
http://microchip.wikidot.com/faq:31

O directamente podes ponerlo para que haga uso de un solo vector de interrupcion y usar el codigo de arriba, como hice yo.
Ahi tenes un ejemplo de un main, con sus funciones de interrupcion.

Falta aqui habilitar la interrupcion por recepcion de la UART
QUe lo podes agregar donde se configura la UART

Código: C
  1. PIE1bits.RCIE = 1;
Y al final de toda la configuracion ponemos

Código: C
  1. // Limpiar buffer y limpiar flag
  2. int basura;
  3. basura = RCREG;
  4. PIR1bits.RCIF=0;  // Aunque se deberia poner a 0 cuando se lee el RCREG
  5.  
  6. // Habilitamos las interrupciones
  7. INTCONbits.PEIE=1;
  8. INTCONbits.GIE=1;

---------------------

Configuracion de puertos... cada puerto tienen varios registros a configurar, algunos no hacen falta por que ya cuando arranca el PIC estan en 0 y es el valor que deseamos tener, otros comienzan en 1.
Para saber que registros tocar nos vamos al datasheet del micro
http://ww1.microchip.com/downloads/en/DeviceDoc/41303G.pdf

En la seccion I/O ports ( Pag 107 ) comienzan todos los puertos. Y al final de cada explicacion de cada uno de los puertos hay una tabla con todos los registros que involucran a ese puerto
PORTA (Pag 123),PORTB (Pag 126),PORTC (Pag 129)

Solo de ejemplo voy a poner todos los registros por PORT A

PORTA - Este registro sirve para leer el estado del pin de entrada
LATA   - Este registro sirve para escribir un dato al pin, si es que lo usamos de salida
TRISA  - Este registro indica si es entrada o salida, si uso el porta para los leds entonces lo tengo que poner a 0 para que sean salidas
ANSEL - Este registro es para indicarle si es una entrada analogica o digital, comienzan como analogicas asi que tengo que ponerlas como digital
SLRCON - Slew Rate, esto no nos interesa asi que lo desactivariamos ya que viene activado
CM1CON0
CM1CON1 - Ambos de los comparadores y vienen deshabilitado por defecto
CVRCON   - Es una tension de referencia para los comparadores, tambien no necesitamos tocarlo.


Muchos registros? en realidad solo debemos tocar 3 para el PORTA, si dejamos todos los pin del PORTB como entrada entonces deberiamos tocar solo 2

Código: C
  1. // PORTA todos salidas, para los leds
  2.  
  3. LATA = 0;     // Lo pongo a 0 asi quedan toso apagados
  4. TRISA = 0;    // Configurado todos como salida
  5. ANSEL = 0;   // Configurado digital
  6. SLRCON = 0; // Desactivado el Slew Rate de todos los puertos
  7.  
  8. // PORTB todas entradas, aunque uso solo RB0
  9.  
  10. ANSELH = 0;    // Configurado como digital
  11. WPUB = 0x01;  // Pull-up RB0
  12. INTCON2 = 0;  // Habilito los pull-up que seteo en WPUB
  13.  
  14. // PORTC donde esta la UART, debo ponerlos como entrada pero ya estan en el reset como entradas
  15. // Nada a configurar ya que todo viene bien desde el reset

-------------------

Fuses
Abris el MPLAB X, creas tu proyecto con tu PIC, abajo dice Configuration Words y ahi elegis lo que queres.

Código: C
  1. // PIC18F25K20 Configuration Bit Settings
  2.  
  3. // 'C' source line config statements
  4.  
  5. #include <xc.h>
  6.  
  7. // #pragma config statements should precede project file includes.
  8. // Use project enums instead of #define for ON and OFF.
  9.  
  10. // CONFIG1H
  11. #pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
  12. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
  13. #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
  14.  
  15. // CONFIG2L
  16. #pragma config PWRT = ON        // Power-up Timer Enable bit (PWRT enabled)
  17. #pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
  18. #pragma config BORV = 18        // Brown Out Reset Voltage bits (VBOR set to 1.8 V nominal)
  19.  
  20. // CONFIG2H
  21. #pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
  22. #pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
  23.  
  24. // CONFIG3H
  25. #pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
  26. #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
  27. #pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
  28. #pragma config HFOFST = OFF     // HFINTOSC Fast Start-up (The system clock is held off until the HFINTOSC is stable.)
  29. #pragma config MCLRE = OFF      // MCLR Pin Enable bit (RE3 input pin enabled; MCLR disabled)
  30.  
  31. // CONFIG4L
  32. #pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
  33. #pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
  34. #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
  35.  
  36. // CONFIG5L
  37. #pragma config CP0 = OFF        // Code Protection Block 0 (Block 0 (000800-001FFFh) not code-protected)
  38. #pragma config CP1 = OFF        // Code Protection Block 1 (Block 1 (002000-003FFFh) not code-protected)
  39. #pragma config CP2 = OFF        // Code Protection Block 2 (Block 2 (004000-005FFFh) not code-protected)
  40. #pragma config CP3 = OFF        // Code Protection Block 3 (Block 3 (006000-007FFFh) not code-protected)
  41.  
  42. // CONFIG5H
  43. #pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
  44. #pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
  45.  
  46. // CONFIG6L
  47. #pragma config WRT0 = OFF       // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
  48. #pragma config WRT1 = OFF       // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
  49. #pragma config WRT2 = OFF       // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
  50. #pragma config WRT3 = OFF       // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)
  51.  
  52. // CONFIG6H
  53. #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
  54. #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
  55. #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
  56.  
  57. // CONFIG7L
  58. #pragma config EBTR0 = OFF      // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
  59. #pragma config EBTR1 = OFF      // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
  60. #pragma config EBTR2 = OFF      // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
  61. #pragma config EBTR3 = OFF      // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
  62.  
  63. // CONFIG7H
  64. #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)

Eso como es muy largo lo podes grabar en otro archivo y luego incluirlo desde tu archivo principal.

-------------------------

UART, lo mas dificil..

Bueno el codigo de la interrupcion es simple seria un:
Código: C
  1. basura = RCREG; // Leo asi se borra el dato y el flag
  2. PORTA ^= 0xFF;  //Invierte todos los bits

La configuracion es lo que puede llevar mas lineas.
El oscilador interno es de 16Mhz
Buscamos una comunicacion asincrona, utilizamos una calculadora online para calcular los baudios de y seleccionar un valor.
http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=PIC18F25J10&Fosc=16.000&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1

9600 baudios = BRG16 = 1, BRGH = 1, SYNC = 0 y SPBRG:16 = 416

En la pag 240 y 246 tenes como configurarlos paso a paso en transmision y recepcion.

Transmision:

Código: C
  1. // Configuracion de velocidad
  2.  
  3. BAUDCONbits.BRG16= 1; // Habilito 16 bits para los baudios
  4. SPBRG = 416            // cargo valor para 9600 baudios
  5. TXSTAbits.SYNC = 0; // asincrono
  6. TXSTAbits.BRGH = 1; // Habilito alta velocidad
  7.  
  8. // Hablitacion de la UART, TX y RX
  9.  
  10. RCSTAbits.SPEN=1;  // Habilito los pines al USART
  11. TXSTAbits.TXEN = 1; // Habilito el transmisor ya listo para enviar
  12.  
  13. // Fin de configuracion.

--------------------

Programa principal

Código: C
  1. void main (void) {
  2.  
  3. //Aca toda la configuracion
  4.  
  5. while(1){   //Loop infinito
  6.   if (!PORTBbits.RB0)  //Si esta en 0 entra
  7.   {
  8.      TXREG=0xFF;  // Envio cualquier cosa
  9.      __delay_ms(100);  // Espero por el rebote del boton
  10.     while(!PORTBbits.RB0);  // Espero que lo suelte, sino no hago nada.
  11.     while(!TXSTAbits.TRMT);  // Solo por las dudas si en el delay o cuando no se solto el boton, no llego a enviar todo, espero que envie todo antes de volver a meter algo en el buffer.
  12.    }
  13. }
  14. }

Para que funcione el delay si o si necesitas declarar una constante para que sepa que valor tiene el oscilador. Esto se pone al comienzo del programa

Código: C
  1. #define _XTAL_FREQ 16000000


-------------

Oscilador, como dije el oscilador es de 16Mhz, pero comienza dividido por otro valor, asiq ue hay que configurarlo

OSCCON = 0; configuramos a 16Mhz



Eso es todo, divertite juntandolo, ya que es poner una cosa dentro de otra. y listo, ya mas no te puedo dar, te di la configuracion de todos los puertos/UART/oscilador, te di los fuses, te di el codigo de adentro de la interrupcion. te di el codigo del programa principal, lo unico que falta es que lo juntes, y oficialmente eh desperdiciado 1 hora de mi vida xD
« Última modificación: 09 de Junio de 2015, 15:00:31 por KILLERJC »


 

anything