Autor Tema: RS485 por Software sin CCS  (Leído 2999 veces)

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

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
RS485 por Software sin CCS
« en: 21 de Octubre de 2010, 23:12:10 »
Hola a todos...
Quiero hacer una aplicación con unos PIC12F629 y SN75176 que tengo por aca de sobra  8)..con ganas de controlar algunas cositas que tengo en casa, como unas lámparas, controlar el TV para mi hija entre otros....por ahora la idea es usar el 12F629 como modulo esclavo para varias aplicaciones básicas como un dimmer, encender o apagar un relé..bueno al grano..
Tengo el famoso CCS ,pero solo tengo como sistema operativo el Ubuntú 10.10, y aunque lo tengo con el Wine, este no funciona del todo bien, algunos bloqueos y cosas de ese estilo..y no pienso volver a instalar Windows, ya me ha dañado 2 discos duros por culpa de su inseguridad....el hecho es que estoy usando el SDCC con el Piklab, ya hice algunos programas básicos, vamos los de iniciación....pero ahora se me ha presentado un problema al querer ponerle a estos 12F629 comunicación serial por software, simplemente no hago bien la rutina o hay algo más que desconozco por eso recurro al foro..dejo el código, de las pruebas que llevo hasta ahora..sin resultados..como información adicional, use  el módulo serial de un PIC16F628, con un hyperterminal para linux, y este va bien, de hecho es el que tengo como Master para enviarle datos al esclavo (12F629) ...

Código: C
  1. /* ----------------------------------------------------------------------- */
  2. /* Plantilla generada por Piklab */
  3. #include <pic12f629.h>
  4.  
  5. /* ----------------------------------------------------------------------- */
  6. /* Bits de configuración: adapte los parámetros a su necesidad */
  7. typedef unsigned int word;
  8. word at 0x2007 CONFIG = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON & _CP_OFF & _CPD_OFF;
  9.  
  10.  
  11.  
  12. #define FREQ 4000
  13. #define En GP5
  14. #define Tx GP4
  15. #define Rx GP3
  16.  
  17. unsigned char temporal;
  18. unsigned char estado;
  19. unsigned char dato_recibido;
  20.  
  21.  
  22. //  Calibración del OSCCAL
  23.  
  24. void osc_cali(){
  25.  
  26. _asm
  27.  
  28. bsf     0x03,5
  29. call    3FFh
  30. movwf   OSCCAL_ADDR
  31. bcf     0x03,5
  32.  
  33. _endasm;
  34.  
  35. }
  36.  
  37.  
  38. // rutina en microsegundos de retardo, en ASM , para la lectura de los bits  a 9600 baudios
  39. // 1/9600 = 104.2 uS , pero para garantizar la lectura de cada bit, en el nivel y no en los flancos. lo dejo a 150uS
  40. // estos 150uS los divido por los 5 que usa la rutina en ASM dando como valor 30
  41.  
  42. void espera_us()
  43. {
  44. _asm
  45.  
  46.         movlw   .30
  47.         nop
  48. loop:
  49.         nop
  50.         nop
  51.         decfsz  0
  52.         goto    loop
  53.         retlw   0
  54.  
  55. _endasm;
  56. }
  57.  
  58.  
  59. // Rutina de espera en ms, para usos varios, nada importante
  60.  
  61. void espera(char _ms)
  62. {
  63.   while (--_ms)
  64.    {
  65.   _asm
  66.         nop
  67. _endasm;
  68.       }
  69. }
  70.  
  71.  
  72. void espera_ms(unsigned int ms)
  73. {
  74.         ms = ms * (FREQ / 4000);  
  75.     while (ms > 0 )
  76.     {
  77.         espera(108);
  78.         ms--;
  79.     }
  80. }
  81.  
  82.  
  83.  
  84. void alarma(){
  85.  
  86. En=1;
  87. espera_ms(400);
  88. En=0;
  89. espera_ms(800);
  90.  
  91. }
  92.  
  93. // Sensores de entrada para una alarma, o interruptores
  94.  
  95. void info_sensores()
  96. {
  97. estado=GPIO & 0x07;
  98.  
  99. }
  100.  
  101.  
  102. // Rutina para recibir los datos seriales  a 8 bits, 1 bit de stop sin paridad
  103.  
  104.  
  105. void recibir_datos()
  106. {
  107. unsigned char i;
  108. dato_recibido=0;
  109. espera_us();
  110.  
  111. while(Rx==0){        // decidi usar el while para garantizar de que se a comenzado una recepción de datos.
  112.  
  113. for(i=0;i==8;i++){
  114.  
  115. temporal=Rx;
  116. dato_recibido |=(temporal<<i);  // a medida que van llegando los bits estos se van poniendo de derecha a izquierda  en el registro dato_recibido
  117. // para formar el byte
  118. espera_us();
  119.  
  120. }
  121.  
  122. }
  123. }
  124.  
  125.  
  126.  
  127. void main() {
  128.     /* << agregue el código >> */
  129.  
  130. osc_cali();
  131. CMCON=0x07;
  132. TRISIO=0x0f;       // los primeros 4 bits del puerto GPIO son entradas
  133. NOT_GPPU=0;      // habilito la Pull-up
  134.  
  135. espera_ms(800);
  136.  
  137. En=0;   // habilitar modo Recibir Datos
  138.  
  139. espera_ms(200);
  140.  
  141. while(Rx==1){          // mientras no se reciban datos, se escanean los sensores.
  142.  
  143. info_sensores();
  144.  
  145. }
  146.  
  147. // Recibo los datos y espero 5ms para estabilizar la linea RX
  148.  
  149. recibir_datos();
  150. espera_ms(5);
  151. alarma();                     // Para indicarme mediante un led, que he recibido datos seriales..hasta acá funciona bien..o eso creo
  152.  
  153. // Me aseguro de que el dato recibido corresponda al módulo y que la linea 485 esté desocupada
  154.  
  155. if (dato_recibido == 0x08 )      // el dato 0x08 lo envía el master, dato que lo puedo verificar en el hyperterminal
  156. {
  157.  
  158. En=1;            // la entrada En, comparte funciones con un salida hacia un Led, con un Diodo en serie para evitar retornos o errores
  159. espera_us();
  160. espera_ms(400);       // esta rutina solo es para saber si el dato lo recibió bien o no.
  161. En=0;
  162. espera_ms(400);
  163. En=1;
  164. espera_us();
  165. //transmitir_dato();
  166. espera_ms(400);
  167. En=0;
  168. espera_ms(400);
  169.  
  170. }
  171.  
  172. while(1){
  173.  
  174. }
  175.  
  176.  
  177. }


Bueno, como ven,mi idea es usar el lenguaje C , sin ayuda de librerías como las que trae el CCS, que de por si facilitan mucho..diría  tanto, que hasta se vuelve un juego de niños; pero quien no quiere aprender hacer algo que sirva para todo, sin depender de un software que de por si, es costoso y por lo que he leído con bugs.

Saludos y agradezco de antemano alguna sugerencia, ya que lo que he encontrado en el foro todo es con el CCS, y al famosa linea #use RS232 ....


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS485 por Software sin CCS
« Respuesta #1 en: 21 de Octubre de 2010, 23:27:55 »
  Hola yo también estoy usando linux (kubuntu 10.04) y PikLab como entorno de desarrollo. Pero el compilador C que estoy utilizando es el de Hitech que en su versión lite es free. En el sitio www.microchipc.com encontré distintos tipos de rutinas para este compilador funcionan bien. No recuerdo muy bien si es que hice rutinas de RS232 por soft (sí recuerdo haber hecho de SPI) o es que estaban en el sitio que te mencioné anteriormente pero de todos modos en estos momentos no estoy desde mi PC. Mañana me fijo en mi PC y si te interesa te la subo para ver si las podés adaptar al SDCC.

  Me acabo de fijar en www.microchipc.com y sí están las rutinas de RS232 para 16Fxxx y 18Fxx pero son por hard. Mañana me fijo en mi PC
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: RS485 por Software sin CCS
« Respuesta #2 en: 22 de Octubre de 2010, 09:51:23 »
  Hola yo también estoy usando linux (kubuntu 10.04) y PikLab como entorno de desarrollo. Pero el compilador C que estoy utilizando es el de Hitech que en su versión lite es free. En el sitio www.microchipc.com encontré distintos tipos de rutinas para este compilador funcionan bien. No recuerdo muy bien si es que hice rutinas de RS232 por soft (sí recuerdo haber hecho de SPI) o es que estaban en el sitio que te mencioné anteriormente pero de todos modos en estos momentos no estoy desde mi PC. Mañana me fijo en mi PC y si te interesa te la subo para ver si las podés adaptar al SDCC.

  Me acabo de fijar en www.microchipc.com y sí están las rutinas de RS232 para 16Fxxx y 18Fxx pero son por hard. Mañana me fijo en mi PC

Gracias amigo por tu respuesta y por la ayuda que me puedas brindar, con este tema...estaré atento..

Saludos

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: RS485 por Software sin CCS
« Respuesta #3 en: 22 de Octubre de 2010, 11:14:12 »
Aca te dejo las rutinas que hice. Las simulé en el proteus y funcionaron bien. Dentro de estas rutinas hago uso de unas rutinas de delay que bajé de www.microchipc.com

Rutinas de USART por Soft
Código: C
  1. /***********************************************************************
  2. *
  3. * Rutinas para USART por soft
  4. *
  5. * Con clock de 4MHz la velocidad máxima de transmisión es de 38400 Baud
  6. * Con clock de 8MHz en adelante la velocidad mínima de transmisión es de
  7. * 2400 Baud
  8. *
  9. * Hay que definir los siguientes parámetros dentro de nuestro programa
  10. * antes de incluir nuestro archivo de rutinas de USART por soft
  11. *
  12. *       #define PIC_CLK                         Frecuencia de Clock en Hz
  13. *
  14. *       #define TxPort          Puerto de salida
  15. *       #define TxBit           bit de salida
  16. *       #define RxPort          Puerto de entrada
  17. *       #define RxBit           bit de entrada
  18. *       #define BaudRate        Velocidad de transferencia
  19. *
  20. /***********************************************************************/
  21.  
  22.  
  23. /*********************************************************************
  24. * Ejemplo
  25.  
  26. #define PIC_CLK 10000000
  27.  
  28. #define TxPort  PORTA
  29. #define TxBit   0               // bit a usar
  30. #define RxPort  PORTB
  31. #define RxBit   0               // bit a usar
  32. #define BaudRate 9600
  33.  
  34. /*******************************************************************/
  35.  
  36.  
  37. #include "delayhd.h"
  38.  
  39. #if (PIC_CLK < 16000000)
  40.         #define BitDelay (1000000/BaudRate)
  41.         #define HalfBitDelay (500000/BaudRate)
  42. #else
  43.         #define BitDelay (500000/BaudRate)
  44.         #define HalfBitDelay (250000/BaudRate)
  45. #endif
  46.  
  47.        
  48. #if (PIC_CLK == 4000000)
  49.         #define DelayReceivebit DelayUs(BitDelay-7)\
  50.                                                         DelayUs(HalfBitDelay-7)
  51.         #if (BaudRate <= 19200)
  52.                 #define DelayStartBit DelayUs(BitDelay-7)
  53.                 #define DelaySendBit NDelayUs(BitDelay-18)
  54.         #elif (BaudRate == 28800)
  55.                 #define DelayStartBit DelayUs(BitDelay-6)
  56.                 #define DelaySendBit NDelayUs(BitDelay-18)
  57.         #elif (BaudRate == 38400)
  58.                 #define DelayStartBit DelayUs(BitDelay-7)\
  59.                                                          dly2u
  60.                 #define DelaySendBit DelayUs(BitDelay-19)\
  61.                                                          dly1u
  62.         #endif
  63.  
  64. #elif (PIC_CLK == 8000000)
  65.         #define DelayReceivebit DelayUs(BitDelay-7)\
  66.                                                         DelayUs(HalfBitDelay-2)
  67.  
  68.         #define DelayStartBit DelayUs(BitDelay-4)
  69.         #if (BaudRate <= 38400)
  70.                 #define DelaySendBit NDelayUs(BitDelay-10)
  71.         #else   //(BaudRate == 57600)
  72.                 #define DelaySendBit NDelayUs(BitDelay-9)
  73.         #endif
  74.  
  75. #elif (PIC_CLK == 10000000)
  76.         #define DelayReceivebit DelayUs(BitDelay-7)\
  77.                                                         DelayUs(HalfBitDelay)
  78.  
  79.         #if (BaudRate <= 38400)
  80.                 #define DelayStartBit DelayUs(BitDelay-4)
  81.                 #define DelaySendBit NDelayUs(BitDelay-8)
  82.         #else //(BaudRate == 57600)
  83.                 #define DelayStartBit DelayUs(BitDelay-3)
  84.                 #define DelaySendBit NDelayUs(BitDelay-7)
  85.         #endif
  86.  
  87.  
  88.  
  89. #elif (PIC_CLK == 16000000) || (PIC_CLK == 20000000)
  90.  
  91.         #if (PIC_CLK == 16000000)
  92.                 #define DelayReceivebit DelayUs(BitDelay)\
  93.                                                                 DelayUs(BitDelay)\
  94.                                                                 DelayUs(BitDelay-5)\
  95.                                                                
  96.        
  97.         #else //(PIC_CLK == 20000000)
  98.                 #define DelayReceivebit DelayUs(BitDelay)\
  99.                                                                 DelayUs(BitDelay)\
  100.                                                                 DelayUs(BitDelay-4)
  101.                                                                
  102.         #endif
  103.                
  104.         #if (BaudRate <= 38400)
  105.                 #define DelayStartBit DelayUs(BitDelay)\
  106.                                                           DelayUs(BitDelay-2)
  107.                 #define DelaySendBit NDelayUs(BitDelay)\
  108.                                                          NDelayUs(BitDelay-4)
  109.         #else //(BaudRate == 57600)
  110.                 #define DelayStartBit DelayUs(BitDelay)\
  111.                                                           DelayUs(BitDelay-1)
  112.                 #define DelaySendBit NDelayUs(BitDelay);\
  113.                                                          NDelayUs(BitDelay-3)
  114.         #endif
  115. #endif
  116.  
  117. volatile bit TxPin @ (unsigned)&TxPort*8+TxBit;
  118. volatile bit TrisTx @ (unsigned)&TxPort*8+0x080*8+TxBit;
  119. volatile bit RxPin @ (unsigned)&RxPort*8+RxBit;
  120. volatile bit TrisRx @ (unsigned)&RxPort*8+0x080*8+RxBit;
  121.  
  122.  
  123.  
  124. void init_usart(void)
  125. {
  126.         TxPin = 1;
  127.         TrisTx = 0;
  128.         RxPin = 1;
  129.         TrisRx = 1;
  130. }
  131.  
  132. unsigned char getch_s(void)
  133. {
  134.         unsigned char contador = 7;
  135.         unsigned char letra = 0;
  136.         DelayReceivebit;
  137.         do
  138.         {
  139.                 if (RxPin == 1) letra += 128;
  140.                 letra = letra >> 1;
  141.                 contador--;
  142.                 DelaySendBit;
  143.         }
  144.         while (contador > 0);
  145.         DelaySendBit;
  146.         return letra;
  147. }
  148.  
  149.  
  150. void putch_s (unsigned char data)
  151. {
  152.         unsigned char contador = 8;
  153.         TxPin = 0;
  154.         DelayStartBit;
  155.         do
  156.         {
  157.                 TxPin = data;
  158.                 DelaySendBit;
  159.                 data = data >> 1;
  160.                 contador--;
  161.         }
  162.         while (contador > 0);
  163.         TxPin = 1;
  164.         DelayStartBit;   //tiempo de espera del bit de stop
  165. }
  166.  
  167. void putst_s (const char *word)
  168. {
  169.         while (*word != 0)
  170.         {
  171.                 putch_s(*word);
  172.                 if (*word==13) putch_s(10);
  173.         if (*word==10) putch_s(13);
  174.                 word++;
  175.         }
  176. }

Rutinas de delay
Código: C
  1. /*
  2.  
  3. lowlevel delay routines
  4.  
  5. Designed by Shane Tolmie of www.microchipC.com corporation.  Freely distributable.
  6. Questions and comments to webmaster@microchipC.com.
  7.  
  8. Completely re-written by Matthew Swabey and Paul Hoy of Southampton University, July 2005.
  9. Questions and comments to mas@ecs.soton.ac.uk
  10.  
  11. Freely distributable, as above. Please add any other clock frequencies you want.
  12.  
  13. This uses no memory resources, and is precise.
  14.  
  15. Hi-Tech C and
  16.  
  17. Example C:
  18.  
  19. #define PIC_CLK 8000000
  20. #include "delay.h"
  21.  
  22. void main(void)
  23. {
  24.    TRISC = 0x00;
  25.    while(1)
  26.    {
  27.       PORTC = 0x00;
  28.       DelayUs(x);
  29.       PORTC = 0xFF;
  30.    }
  31. }  
  32.  
  33. */
  34.  
  35. #ifndef __DELAY_H
  36. #define __DELAY_H
  37.  
  38. #if (PIC_CLK == 4000000)
  39.    #define dly125n please remove; for 32Mhz+ only
  40.    #define dly250n please remove; for 16Mhz+ only
  41.    #define dly500n please remove; for 8Mhz+ only
  42.    #define dly1u asm("nop")
  43.    #define dly2u dly1u;dly1u
  44. #elif (PIC_CLK == 8000000)
  45.    #define dly125n please remove; for 32Mhz+ only
  46.    #define dly250n please remove; for 16Mhz+ only
  47.    #define dly500n asm("nop")
  48.    #define dly1u dly500n;dly500n
  49.    #define dly2u dly1u;dly1u
  50. #elif (PIC_CLK == 10000000)
  51.    #define dly400n asm("nop")
  52. #elif (PIC_CLK == 16000000)
  53.    #define dly125n please remove; for 32Mhz+ only
  54.    #define dly250n asm("nop")
  55.    #define dly500n dly250n;dly250n
  56.    #define dly1u dly500n;dly500n
  57.    #define dly2u dly1u;dly1u
  58. #elif (PIC_CLK == 20000000)
  59.    #define dly200n asm("nop")
  60.    #define dly400n dly200n;dly200n
  61.    #define dly1u dly400n;dly400n;dly200n
  62.    #define dly2u dly1u;dly1u
  63. #elif (PIC_CLK == 32000000)
  64.    #define dly125n asm("nop")
  65.    #define dly250n dly125n;dly125n
  66.    #define dly500n dly250n;dly250n
  67.    #define dly1u dly500n;dly500n
  68.    #define dly2u dly1u;dly1u
  69. #else
  70.    #error please define PIC_CLK correctly
  71.    
  72. #endif
  73.  
  74. /* ======================================== */
  75. /* Delay Routines for less than 255us       */
  76. /* These give a precise delay.              */
  77. /* DelayUs(10) is 10us exactly!             */
  78. /* Only multiples of 2 available at slower  */
  79. /* speeds (16Mhz or less)               */
  80.  
  81. #if PIC_CLK == 4000000
  82.    #define DelayUs(x)\
  83.    asm("\tMOVLW "___mkstr(x>>2));\
  84.    asm("\tADDLW 0xFF");\
  85.    asm("\tBTFSS _STATUS, 2");\
  86.    asm("\tGOTO $ - 2");
  87. #elif PIC_CLK == 8000000
  88.    #define DelayUs(x)\
  89.    asm("\tMOVLW "___mkstr(x>>1));\
  90.    asm("\tADDLW 0xFF");\
  91.    asm("\tBTFSS _STATUS, 2");\
  92.    asm("\tGOTO $ - 2");
  93. #elif PIC_CLK == 10000000
  94.    #define DelayUs(x)\
  95.    asm("\tMOVLW "___mkstr(x>>1));\
  96.    asm("\tNOP");\
  97.    asm("\tADDLW 0xFF");\
  98.    asm("\tBTFSS _STATUS, 2");\
  99.    asm("\tGOTO $ - 3");
  100. #elif PIC_CLK == 16000000
  101.    #define DelayUs(x)\
  102.    asm("\tMOVLW "___mkstr(x));\
  103.    asm("\tADDLW 0xFF");\
  104.    asm("\tBTFSS _STATUS, 2");\
  105.    asm("\tGOTO $ - 2");
  106. #elif PIC_CLK == 20000000
  107.    #define DelayUs(x)\
  108.    asm("\tMOVLW "___mkstr(x));\
  109.    asm("\tNOP");\
  110.    asm("\tADDLW 0xFF");\
  111.    asm("\tBTFSS _STATUS, 2");\
  112.    asm("\tGOTO $ - 3");
  113. #elif PIC_CLK == 32000000
  114.    #define DelayUs(x)\
  115.    asm("\tMOVLW "___mkstr(x));\
  116.    asm("\tNOP");\
  117.    asm("\tNOP");\
  118.    asm("\tNOP");\
  119.    asm("\tNOP");\
  120.    asm("\tADDLW 0xFF");\
  121.    asm("\tBTFSS _STATUS, 2");\
  122.    asm("\tGOTO $ - 6");
  123. #else
  124.    #error please define PIC_CLK correctly
  125. #endif
  126.  
  127. /* ======================================== */
  128. /* NDelay Routines for less than 255us      */
  129. /* These give a precise delay to the Next   */
  130. /* Instructions ACTIVATION, so NDelayUs(10) */
  131. /* is 10us - 1 instruction!                 */
  132.  
  133. #if PIC_CLK == 4000000
  134.    #define NDelayUs(x)\
  135.    asm("\tNOP");\
  136.    asm("\tNOP");\
  137.    asm("\tNOP");\
  138.    asm("\tMOVLW "___mkstr((x>>2)-1) );\
  139.    asm("\tADDLW 0xFF");\
  140.    asm("\tBTFSS _STATUS, 2");\
  141.    asm("\tGOTO $ - 2");
  142. #elif PIC_CLK == 8000000
  143.    #define NDelayUs(x)\
  144.    asm("\tNOP");\
  145.    asm("\tNOP");\
  146.    asm("\tNOP");\
  147.    asm("\tMOVLW "___mkstr((x>>1)-1) );\
  148.    asm("\tADDLW 0xFF");\
  149.    asm("\tBTFSS _STATUS, 2");\
  150.    asm("\tGOTO $ - 2");
  151. #elif PIC_CLK == 10000000
  152.    #define NDelayUs(x)\
  153.    asm("\tNOP");\
  154.    asm("\tNOP");\
  155.    asm("\tNOP");\
  156.    asm("\tNOP");\
  157.    asm("\tMOVLW "___mkstr((x>>1)-1) );\
  158.    asm("\tNOP");\
  159.    asm("\tADDLW 0xFF");\
  160.    asm("\tBTFSS _STATUS, 2");\
  161.    asm("\tGOTO $ - 3");
  162. #elif PIC_CLK == 16000000
  163.    #define NDelayUs(x)\
  164.    asm("\tNOP");\
  165.    asm("\tNOP");\
  166.    asm("\tNOP");\
  167.    asm("\tMOVLW "___mkstr(x-1));\
  168.    asm("\tADDLW 0xFF");\
  169.    asm("\tBTFSS _STATUS, 2");\
  170.    asm("\tGOTO $ - 2");
  171. #elif PIC_CLK == 20000000
  172.    #define NDelayUs(x)\
  173.    asm("\tNOP");\
  174.    asm("\tNOP");\
  175.    asm("\tNOP");\
  176.    asm("\tNOP");\
  177.    asm("\tMOVLW "___mkstr(x-1));\
  178.    asm("\tNOP");\
  179.    asm("\tADDLW 0xFF");\
  180.    asm("\tBTFSS _STATUS, 2");\
  181.    asm("\tGOTO $ - 3");
  182. #elif PIC_CLK == 32000000
  183.    #define NDelayUs(x)\
  184.    asm("\tNOP");\
  185.    asm("\tNOP");\
  186.    asm("\tNOP");\
  187.    asm("\tNOP");\
  188.    asm("\tNOP");\
  189.    asm("\tNOP");\
  190.    asm("\tNOP");\
  191.    asm("\tMOVLW "___mkstr(x-1));\
  192.    asm("\tNOP");\
  193.    asm("\tNOP");\
  194.    asm("\tNOP");\
  195.    asm("\tNOP");\
  196.    asm("\tADDLW 0xFF");\
  197.    asm("\tBTFSS _STATUS, 2");\
  198.    asm("\tGOTO $ - 6");
  199. #else
  200.    #error please define PIC_CLK correctly
  201. #endif
  202.  
  203. #endif
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: RS485 por Software sin CCS
« Respuesta #4 en: 22 de Octubre de 2010, 19:26:31 »
Aca te dejo las rutinas que hice. Las simulé en el proteus y funcionaron bien. Dentro de estas rutinas hago uso de unas rutinas de delay que bajé de www.microchipc.com

.
.
.
.
.


Mil gracias Angel..voy a agregar las librerías al proyecto, las pruebo y te comento..de nuevo mil gracias..

Saludos