Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 603823 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #360 en: 07 de Abril de 2008, 12:16:41 »
El registro ANSEL tiene que dar fallo al compilar porque no existe en el PIC16F628.
Hay que tener cuidado con el registro ANSEL ya que no existe en todos los PIC.

El PSI esta correcto ya que no solo el ADC permite entradas analogicas, tambien el modulo comparador
analogico, que no tiene nada que ver con el modulo digital CCP. En teoria seria posible lograr un ADC
lento con el modulo comparador, pero esto solo es especulacion porque no lo he probado.
« Última modificación: 08 de Abril de 2008, 18:14:05 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #361 en: 08 de Abril de 2008, 18:10:15 »
Estoy probando una pequeña placa de ampliación de tres servos para la EBasic y que mejor
presentación que la prueba que podremos ver en el siguiente video. Se trata de la unión de
un acelerómetro de motorola el MMA1260D a un servo, que tiene como controladora a nuestra
PIC EBasic. Teniendo en cuenta que el chip del acelerómetro no esta solidamente fijado a la
EBasic (estos chip son muy sensibles a las vibraciones) creo que se puede apreciar bien
el efecto deseado, y es girar la placa EBasic mientras el servomotor mantiene vertical la pequeña
pieza de mecano fijada a su eje.

El funcionamiento del chip acelerómetro es muy simple, cuando esta vertical su única salida analógica
nos suministra 2.5v y según lo giramos a un lado o a otro este valor se incremente o se decrementa.

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #362 en: 08 de Abril de 2008, 18:27:26 »
Imagen de los protagonistas:

Saludos desde Granada, España.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #363 en: 09 de Abril de 2008, 02:00:23 »
Muy chula la aplicación, Carlos. Parece que el servo fuera un equilibrista del circo  :D

Desde mi modesta opinión, creo que esas vibraciones no se deben a vibraciones en el acelerómetro, sino a que la lectura no es completamente estable. Yo he jugado alguna vez con ellos y también me ha pasado algo parecido. Quizás con un algoritmo que haga un promedio de lecturas se podría eliminar bastante ese efecto.

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2060
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #364 en: 09 de Abril de 2008, 15:59:47 »
Que tal amigos!
dogflu66 que bonita tarjeta y la alpicacion con el servo y el acelerometro te quedo fenomenal  :mrgreen:
Aunque a mi me gusto fue la tarjeta  :lol: :lol:

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #365 en: 09 de Abril de 2008, 19:13:43 »
Para Ralf:

jaja, pues a ti no te seria nada difícil construirte una...:P :D

Para Nocturno:

Pues tienes parte de razón Manolo, no suavicé las lecturas por soft, pero sí por hard. Quedando con algunos ligeros vaivenes.
Pero en este caso estos vaivenes tan abruptos es por culpa de la plaquita que esta muy flojucha, en realidad reconozco que
no me he esmerado mucho en esta primera prueba. Esto no es mas que una ligera toma de contactos con el acelerómetro,
para en realidad hacer algo un poco más complejo... :mrgreen:
« Última modificación: 09 de Abril de 2008, 19:16:57 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #366 en: 22 de Abril de 2008, 18:49:20 »
Esquema de la placa de ampliación de 3 servos. En este caso para el servo Futaba S3003.
Para usar con servomotores distintos al anterior, verificar la configuración de pin
en el datasheet del fabricante del servo a utilizar.

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #367 en: 02 de Mayo de 2008, 10:01:44 »
Programa simplificado para probar la placa de ampliacion 3 servomotores:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '********************************** PIC Entrenadora BASIC (PicEBasic)******************************
  5. 'NOMBRE: 16F88_Pic_EBasic_Ejemplo_30
  6. 'MICRO: PIC16f88
  7. 'FECHA/AUTOR: 05/08 - By COS
  8. 'Version: 1.0
  9. 'Programa simplificado para el Test de la placa de ampliacion 3 servos Futaba S3003
  10. '*****************************************************************************************************
  11. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo para el simulador
  12. '******************************************************************************************************
  13. '_____Variables
  14. DIM adc_4 AS Byte  'contendra el valor de la entrada del ADC
  15. DIM tiemp_resta AS Word  'tiempo en que la señal de control estara a OFF
  16. '_____ASIGNACION DE I/O y valores de inicio de las salidas, configracion ADC
  17. ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
  18. ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.5uSeg), channel RA4, Power on ADC (ADON)
  19. ADCON1 = %01000000  'V. Ref. (AVdd/AVss) y seleccion escala division clock/2 ADCON1.ADCS2=1 y 8Bit ADC (ADFM)
  20. CMCON = 0x07  'comparador a off
  21. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  22. TRISA = 0x00  'Puerto A como salidas
  23. TRISB = 0x00  'puerto B como salidas
  24. TRISA.4 = 1  'como entrada (RA4, adc)
  25. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  26. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  27. PORTB.3 = 1  'luz lcd a on (RB3), compartido con servomotor
  28. PORTA.7 = 1  'led amarillo a off
  29. PORTB.0 = 1  'led verde a off
  30. '_____Main Programa
  31. WaitMs 20  'pausa estabilizacion, cuando se habilita el modulo ADC tarda un tiempo en estar operativo
  32. ADCON0.GO = 1  'Activa la primera lectura del ADC
  33. WaitMs 1  'pausa, hasta terminar el modulo ADC de hacer la primera lectura
  34. main:  'Cuerpo del pograma o rutina principal
  35.         IF ADCON0.GO = 0 THEN  'se comprueba si termino de hacer la lectura el modulo ADC
  36.                 adc_4 = ADRESH  'asignacion de valores, 8bit ADC
  37.                 ADCON0.GO = 1  'inicializa una nueva lectura por el modulo ADC
  38.         Endif
  39.         IF adc_4 < 50 THEN adc_4 = 50  'acota el minimo para que el mecanismo del servo no sufra
  40.         IF adc_4 > 230 THEN adc_4 = 230  'acota el desplazamieto maximo para que el servo no sufra
  41.         ServoOut PORTB.5, adc_4  'declaracion para el control de servo motores, resolucion de 10uSeg.
  42.         ServoOut PORTB.3, adc_4  'declaracion para el control de servo motores, resolucion de 10uSeg.
  43.         ServoOut PORTB.2, adc_4  'declaracion para el control de servo motores, resolucion de 10uSeg.
  44.         tiemp_resta = 20000 - ((adc_4 * 10) * 3)  'calculo de la señal de control a off en uSeg.,___
  45.                                                                 '___periodo - duty = tiempo pendiente hasta completar el periodo___
  46.                                                                 '___seleccionado, en este caso 20mseg.
  47.         WaitUs tiemp_resta  'pausa en uSeg. hasta completar el periodo de la señal de control
  48. GOTO main  'impide que termine la rutina principal

Se programa el modulo ADC para trabajar a la máxima velocidad que permite el reloj de 8Mhz, recordar que solo se puede trabajar con múltiplos de de la velocidad del reloj, puede darse la paradoja que a una menor velocidad de reloj se pueda programar una mayor velocidad de conversión de ADC. Se emplea la función ServOut para el control de los tres servos.
« Última modificación: 03 de Mayo de 2008, 09:15:55 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #368 en: 02 de Mayo de 2008, 20:58:48 »
Pruebas para realizar con modulos de RF:

Una plaquita adaptadora de Tx para la 1º EBasic:

Una placa EBasic conectada mediante el modulo USART al puerto RS232 del PC, con
una velocidad de comunicación 1200Baudios. Los datos que se escriben en
el teclado son enviados mediante el hyperterminal a la placa, y a su vez, la placa
los devuelve al hyperterminal para que los escriba en pantalla, ósea no
tengo activada la opción de eco en el hyperterminal. Este dato es recibido y va
siendo enviado al modulo de RF (Tx) por una emulación de UAR a 2400 baudios,
ósea una UAR por soft. Los datos son mostrados en el display de 2x16 caracteres
de la placa.

Una plaquita adaptadora de Rx para 2º EBasic:

Los datos recibidos de forma inalámbrica por el modulo adaptador de RX montado
en otra placa EBasic, son mostrados también en un LCD 2x16 caracteres, En este
caso si esta conectada la placa de RX al modulo USART del PIC.

La trama esta compuesta:

1º Byte = 0, basura o de apertura del puerto (mejor resultado obtenido con el 0)
2º Byte = 255, Byte de cabecera, sincronismo de trama o red.
3º Byte = dato, es el dato
4º Byte = checsum.lb, Byte menos significativo del checsum
5º Byte = checsum.hb, Byte más significativo del checsum

Serout RA4, 2400, 0, 255, dato, checsum.LB, checsum.HB
« Última modificación: 03 de Mayo de 2008, 08:40:52 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #369 en: 02 de Mayo de 2008, 21:06:18 »
Los modulos hibridos de RF utilizados son comercializados en España por Cebek.

El modulo de TX es el C-0503 y el de Rx es el C-0504.

La foto de las placas adaptadoras:


« Última modificación: 03 de Mayo de 2014, 15:29:16 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #370 en: 03 de Mayo de 2008, 08:51:53 »
PD:
 
1º Byte = 0, basura o de apertura del puerto (mejor resultado obtenido con el 0)
2º Byte = 255, Byte de cabecera, sincronismo de trama o red.
3º Byte = dato, es el dato
4º Byte = checsum.lb, Byte menos significativo del checsum
5º Byte = checsum.hb, Byte más significativo del checsum

Checsum es la suma de comprobación que en este caso es:

checsum = 255 + dato, siendo:

checsum.LB el Byte menos significativo de checsum y

checsum.HB es el Byte mas significativo de checsum.

Para reconstruir la trama de datos se espera la recepción de un Byte = 255 y, se pasa a la espera del Byte "dato", que es almacenado, seguidamente se esperan los dos Bytes de checsum, que una vez obtenidos se reconstruye con ellos la variable checsum y, esta es comparada con la suma de 255 + dato recibidos, si es igual se acepta el dato como correcto y si no es igual se ignora. En ambos casos que damos pendientes otra vez de la recepción del dato de cabecera 255.
« Última modificación: 03 de Mayo de 2008, 10:14:05 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #371 en: 03 de Mayo de 2008, 09:07:37 »
La foto en conjunto:

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #372 en: 03 de Mayo de 2008, 09:10:11 »
El programa del Tx:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '********************************** PIC Entrenadora BASIC ***************************************
  5. 'NOMBRE: 16F88_Pic_EBasic_Modulos_RF_Tx_11
  6. 'VERSION: 1.1
  7. 'MICRO: PIC16F88
  8. 'Fecha/Autor: 5/08 By COS
  9. 'DESCRIPCION: Se recibe por el teclado del pc mediante el hyperterminal caracteres que son
  10. 'reenviados al aire mediante un modulo de rf a 2400 baudios.
  11. 'programar el hyperterminal del Windows:
  12. 'Bits por segundo: 1200
  13. 'Bits de datos: 8
  14. 'Paridad: Ninguno
  15. 'Control de flujo: Ninguno
  16. 'LCD a 4 bit, sin bit de RW
  17. '************************************************************************************************
  18. '-------------------------------------PUERTOS DEFINIDOS POR EL SISTEMA----------------------------
  19. '-------------------------------------Puertos del LCD---------------------------------------------
  20. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  21. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  22. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  23. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  24. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  25. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  26. Define LCD_EBIT = 6  'se usara el RB6 como E
  27. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  28. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  29. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  30. '-----------------------------Define la forma de trabajo de la funcion SEROUT------------------
  31. Define SEROUT_DELAYUS = 0  'no hay delay entre caracter y caracter enviado al puerto serie
  32. '--------------------------------Reasignacion de nombres---------------------------------------
  33. Symbol led_amarillo = PORTA.7  'led amarillo
  34. Symbol led_verde = PORTB.0  'led verde
  35. '--------------------------------Definicion de caracteres de control del Hyperterminal--------
  36. CONST ff = 0x0c  'FF, Avance de pagina
  37. CONST bell = 0x07  'BELL, Señal sonora
  38. CONST sp = 0x20  'SP, Espacio
  39. CONST bksp = 0x08  'BKSP, Retroceso
  40. CONST cr = 0x0d  'retorno de carro
  41. '--------------------------------------Declaracion DE VARIABLES-------------------------------------
  42. '-------------------------------------Variables globales-------------------------
  43. DIM checsum AS Word
  44. DIM lcd_control AS Byte
  45. '-------------------------------------Variables rutinas del bufer puerto serie----------------------
  46. DIM ascii AS Byte  'Contiene el valor de lectura del puerto serie
  47. DIM n_usart AS Byte  'Numero de datos del USART y del bufer IMAGEN de control
  48. DIM usart AS Byte  'Variable indice que apunta al ultimo dato adquirido por la USART
  49. DIM aux_usart AS Byte  'Auxiliar de la variable indice usart del USART
  50. DIM c_serial AS Byte  'Como USART pero para la lectura de control del bufer IMAGEN
  51. DIM bufer AS Byte  'Indica si hay datos por leer en el bufer USART
  52. DIM n_aux AS Byte  'contador para borrar el bufer_soft
  53. '************************************variables de los timer****************************************
  54. DIM pause AS Word  'contiene el valor para simular el comando Waitms
  55. DIM timer_1ms AS Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
  56. DIM timer_1ms_tiempo AS Word  'seleciona el tiempo de la base de tiempos timer_1
  57. '------------------------------------Variables tipo array bufer puerto serie----------------------------------
  58. DIM usart_imagen(80) AS Byte  'Componen el bufer IMAGEN para control del bufer USAR
  59. DIM usart_bufer(80) AS Byte  'Componen el bufer de la USAR de bajo nivel
  60. '-----------------------------------------------ASIGNACIONES----------------------------------------
  61. '-------------------------------------Asignacion de valores del TIMER1----------------------------
  62. pause = 0  'genera una pausa en MSeg
  63. timer_1ms = 0  'en mSeg
  64. timer_1ms_tiempo = 0
  65. '-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
  66. usart = 0
  67. aux_usart = 0
  68. c_serial = 0
  69. bufer = 0
  70. n_usart = 80
  71. ascii = 0
  72. n_aux = 0
  73. '-----------------------------------Asiga valores a las variables globales--
  74. lcd_control = 0
  75. '**************************************DEFINICION DE PUERTOS*************************************
  76. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  77. ANSEL = 0x00  'los pin I/O digitales
  78. CMCON = 0x07  'comparador a off
  79. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  80. TRISA = 0x00  'Puerto A como salidas
  81. TRISB = 0x00  'puerto B como salidas
  82. TRISA.4 = 0  'como salida (RA4, RS232 POR SOFT)
  83. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  84. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  85. 'TRISB.5 = 0 'RB5(Tx, RS232)
  86. TRISB.2 = 1  'RB2 (Rx, RS232)
  87. PORTB.3 = 1  'luz lcd a on (RB3)
  88. PORTA.7 = 1  'led amarillo a off
  89. PORTB.0 = 1  'led verde a off
  90. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCIONES------------------
  91. Hseropen 1200  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
  92. GOSUB clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
  93. T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
  94. T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
  95. T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
  96. TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
  97. TMR1L = 0x2f  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
  98. T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
  99. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  100. Enable  'INTCON.GIE habilita todas las interrupciones globales
  101. '--------------------------------------Inicio Programa--------------------------------------------------
  102. Lcdinit  'inicializa el LCD sin cursor
  103. PIE1.TMR1IE = 1  'activa las interrupciones del timer1
  104. PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  105. pause = 1000  'prepara una pausa de 1Seg
  106. GOSUB pause_ms  'espera el tiempo que indica pause
  107. Lcdout "RS232_Tx RF 1.1"  'imprime en el LCD el literal
  108. Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
  109. Lcdout "Rx1200B-Tx2400B"  'escribe la cadena de literales en el lcd
  110. Hserout ff, CrLf, CrLf, "VER. 1.1 - RF (TX)", CrLf, "TX -> RS232 y RF", CrLf, "By COS", CrLf, CrLf  'envia presentacion al RS232
  111. GOSUB clear_bufer  'Borra el bufer imagen y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
  112. pause = 3000  'prepara una pausa de 3Seg
  113. GOSUB pause_ms  'hace una pausa de tiempo indicado por pause
  114. Lcdcmdout LcdLine1Home
  115. '--------------------------------------Main Programa----------------------------------------------------
  116. main:
  117.         IF bufer > 0 THEN  'si hay datos en el bufer serie
  118.                 GOSUB d_read  'salta a la rutina que procesa el dato recibido por el puerto serie
  119.         Endif
  120. GOTO main
  121. END                                              
  122. '--------------------------------------FIN DEL MAIN-------------------------------------------
  123. '--------------------------------------Sub_Rutinas Programa-----------------------------------------------
  124. d_read:  '___________________rutina de lectura del teclado del pc, a travez del hyperterminal
  125.                 GOSUB readserial  'lee un dato del bufer serie
  126.                 Hserout ascii  'Envia el dato recibido al hyperterminal, Tx del modulo UART
  127.                 Lcdout ascii  'Imprime el byte leido en el LCD
  128.                 IF lcd_control = 15 THEN Lcdcmdout LcdLine2Home  'detecta que la linea 1 esta llena y pasa a la 2 del LCD
  129.                 IF lcd_control = 31 THEN Lcdcmdout LcdLine1Home  'Detecta que la linea 2 esta llena y pasa a la 1 del LCD
  130.                 lcd_control = lcd_control + 1  'contador que indica la proxima posicion del LDC a escribir
  131.                 IF lcd_control > 31 THEN lcd_control = 0  'Cuando el LCD esta lleno hace reset al cntador
  132.                 checsum = 255 + ascii  'calcuala el checsum a insertar en la trama de datos, suma de seguridad
  133.                 PIE1.TMR1IE = 0  'desactiva las interrupciones del timer1
  134.                 PIE1.RCIE = 0  'desActiva la interrupcion de la USART en modo rx
  135.                 Serout RA4, 2400, 0, 255, ascii, checsum.LB, checsum.HB  'envia la trama a la radio de tx
  136.                 PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  137.                 PIE1.TMR1IE = 1  'activa las interrupciones del timer1
  138. RETURN                                            
  139. pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
  140.         timer_1ms_tiempo = pause  'nuevo valor para contar, waitms
  141.         timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de mSeg
  142.         WHILE timer_1ms < timer_1ms_tiempo  'tiempo en mSeg maximos a contar
  143.         WEND
  144. RETURN                                            
  145. '------------------------------ rutinas para el control del bufer del puerto serie-------------
  146. readserial:
  147. 'RUTINA DE LECTURA DEL BUFFER DEL PUERTO SERIE (ascii)
  148.         IF bufer = 1 THEN  'si bufer tiene datos
  149.                 ascii = usart_bufer(c_serial)  'se lee el valor del bufer y se asigna ascii
  150.                 usart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
  151.                 c_serial = c_serial + 1  'se incrementa el indice del bufer
  152.                 IF c_serial >= n_usart THEN c_serial = 0  'se verifica si se llego al final del bufer
  153.                 IF usart_imagen(c_serial) = 0 THEN bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
  154.         ELSE
  155.                 ascii = 0  'si se hace una lectura del bufer estando vacio devuelve 0
  156.         Endif
  157. RETURN                                            
  158. clear_bufer:  'inicializa el bufer imagen y borra error del puerto fisico en modo Rx
  159. '_________________________Borra e inicializa el bufer imagen del puerto serie
  160.         c_serial = 0  'nos indica la posicion a borrar del bufer
  161.         WHILE c_serial < n_usart  'se ejecuta tantas veces como variables tiene el bufer
  162.                 usart_imagen(c_serial) = 0  'borra el indicador indice, informa que esa posicion del bufer no tiene datos
  163.                 c_serial = c_serial + 1  'contador que nos indica la proxima posicion del bufer a borrar
  164.         WEND
  165.         c_serial = 0  '___variables de control del bufer
  166.         usart = 0
  167.         bufer = 0
  168.         ascii = 0  '______
  169. '__________________________Borra el error del puerto serie en Rx
  170.         RCSTA.OERR = 0
  171.         RCSTA.CREN = 0
  172.         RCSTA.CREN = 1
  173. RETURN                                            
  174. '--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
  175. ON Interrupt  'desactiva las interrupciones
  176.         Save SYSTEM  'Guarda los valores del sistema
  177. '*****************************base de tiempos********************************************
  178.         IF PIR1.TMR1IF = 1 THEN  'comprueba que la interrupcion la proboco el timer1
  179.                 IF timer_1ms < timer_1ms_tiempo THEN timer_1ms = timer_1ms + 1  'contador para control del timer_1ms
  180.                 TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
  181.                 TMR1L = 0x2f  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
  182.                 PIR1.TMR1IF = 0  'borra el bit de salto del timer1
  183.         Endif
  184. '*****************************BUFFER PUERTO SERIE****************************************
  185.         IF PIR1.RCIF = 1 THEN  'comprueba que es esta la interrupcion activa del modulo USAR
  186.                 IF usart < n_usart THEN  'comprueba que el bufer de entrada no esta lleno
  187.                         IF usart_imagen(usart) = 0 THEN  'comprueba que la posicion esta vacia
  188.                                 aux_usart = usart  'retiene la posicion antigua del bufer
  189.                                 usart = usart + 1  'indica cual sera la posicion siguiente del bufer
  190.                                 usart_imagen(aux_usart) = 1  'indica que hay dato en el bufer de entrada
  191.                                 bufer = 1  'indica que el bufer tine datos
  192.                                 Hserget usart_bufer(aux_usart)  'carga el dato en el bufer
  193.                         ELSE
  194.                                 Hserget usart_bufer(n_usart)  'descarga la usart para que no se bloquee porque el bufer de entrada esta lleno
  195.                         Endif
  196.                 ELSE
  197.                         IF usart_imagen(0) = 0 THEN  'comprueba que esta vacia la primera posicion del bufer
  198.                                 usart_imagen(0) = 1  'marca que hay dato en esa posicion del bufer
  199.                                 bufer = 1  'marca que el bufer tiene datos
  200.                                 usart = 1  'establece la proxima posicion del bufer
  201.                                 Hserget usart_bufer(0)  'lee la usart y guarda el dato en el bufer
  202.                         ELSE
  203.                                 Hserget usart_bufer(n_usart)  'descarga la usart porque el bufer esta lleno
  204.                         Endif
  205.                 Endif
  206.                 PIR1.RCIF = 0  'borra el bit de salto del Rx
  207.         Endif
  208. '_________________________Borra el error del puerto serie en Rx
  209.         IF RCSTA.OERR = 1 THEN
  210.                 RCSTA.OERR = 0
  211.                 RCSTA.CREN = 0
  212.                 RCSTA.CREN = 1
  213.         Endif
  214. RESUME  'activa las interrupciones y retorna al curso normal del programa antes del salto
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #373 en: 03 de Mayo de 2008, 09:11:30 »
El programa del Rx:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '********************************** PIC Entrenadora BASIC ********************************************
  5. 'NOMBRE: 16F88_Pic_EBasic_Modulos_RF_RX_11
  6. 'VERSION: 1.1
  7. 'MICRO: PIC16F88
  8. 'Fecha/Autor: 5/8 By COS
  9. 'VERSION 1.1
  10. 'DESCRIPCION: Se recibe por el aire "RF" (2400 Baudios) los datos reenviados por la placa de TX que a su
  11. 'vez los recibio via RS232 desde el hyperterminal.
  12. 'led verde cambia de estado cada vez que se recibe una trama completa
  13. 'led amarillo cambia de estado cada vez que falla el byte de cabecera
  14. '*******************************************************************************************************
  15. '--------------------------------------PUERTOS DEFINIDOS POR EL SISTEMA---------------------------------
  16. '-------------------------------------------Puertos del LCD---------------------------------------------
  17. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  18. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  19. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  20. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  21. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  22. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  23. Define LCD_EBIT = 6  'se usara el RB6 como E
  24. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  25. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  26. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  27. '------------------------------------------Reasignacion de nombres---------------------------------------
  28. Symbol led_amarillo = PORTA.7  'led amarillo
  29. Symbol led_verde = PORTB.0  'led verde
  30. '-----------------------------------------Declaracion de variables----------------------------------------
  31. '-------------------------------------Variables sub_rutinas del puerto serie (trama de datos)-------------
  32. DIM dato AS Byte  'almacenara el dato deceado del bufer serie
  33. DIM checsum AS Word  'suma de verificacion de la trama recibida
  34. DIM checsum_rs AS Word  'suma de verificacion de la trama enviada
  35. DIM control AS Byte  'determina la posicion del dato recibido en la trama
  36. '---------------------------------Variables sub_rutinas del puerto y bufer serie---------------------------
  37. DIM ascii AS Byte  'Contiene el valor de lectura del puerto serie
  38. DIM n_uart AS Byte  'Numero de datos del uart y del bufer IMAGEN de control
  39. DIM uart AS Byte  'Variable indice que apunta al ultimo dato adquirido por la uart
  40. DIM c_serial AS Byte  'Como uart pero para la lectura de control del bufer IMAGEN
  41. DIM bufer AS Byte  'Indica si hay datos por leer en el bufer uart
  42. '***************************************variables de los timer*********************************************
  43. DIM aux_pause AS Word  'variable auxiiar el PAUSE
  44. DIM pause AS Word  'contiene el valor para simular el comando Waitms
  45. DIM timer_1ms AS Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
  46. DIM timer_1ms_tiempo AS Word  'contiene el valor del tiempo del timer_1ms
  47. '--------------------------------------Variables Programa------------------------------------------
  48. '-----------------------------variables rutina muestra datos en el LCD-----------------------------
  49. DIM n AS Byte  'se utiliza para posicionar caracter en el lcd
  50. DIM flag AS Byte  'controla la alternancia para imprimir en el lcd el caracter "(" o el ")"
  51. DIM flag_1 AS Byte  'controla la alternacia entre secuencia 1 y 2, tramas tx
  52. DIM lcd_control AS Byte  'controla la linea a escribir en el LCD
  53. '------------------------------------VARIABLES tipo array programa----------------------------------
  54. '------------------------------------VARIABLES tipo array sub_rutinas-------------------------------
  55. '------------------------------------Variables tipo array puerto serie------------------------------
  56. DIM uart_imagen(80) AS Byte  'Componen el bufer IMAGEN para control del bufer UART
  57. DIM uart_bufer(80) AS Byte  'Componen el bufer de la UART de bajo nivel
  58. '-----------------------------------------------ASIGNACIONES----------------------------------------
  59. '-----------------------------Asigna valores a las bases de tiempos del TIMER1----------------------
  60. control = 0
  61. lcd_control = 0
  62. aux_pause = 0
  63. pause = 0
  64. timer_1ms = 0
  65. '---------------------Asigna valores a las variables de la rutina del puerto serie----------------
  66. uart = 0
  67. c_serial = 0
  68. bufer = 0
  69. n_uart = 80
  70. ascii = 0
  71. '--------------------------------------asignacion de valores generales-----------------------------
  72. n = 0
  73. flag = 0
  74. flag_1 = 0
  75. '************************************DEFINICION DE PUERTOS*****************************************
  76. '-----------------------ASIGNACION DE I/O y valores de inicio de las salidas-----------------------
  77. ANSEL = 0x00  'los pin I/O digitales
  78. CMCON = 0x07  'comparador a off
  79. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  80. TRISA = 0x00  'Puerto A como salidas
  81. TRISB = 0x00  'puerto B como salidas
  82. TRISA.4 = 1  'como entrada (RA4, adc)
  83. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  84. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  85. 'TRISB.5 = 0 'RB5(Tx, RS232)
  86. TRISB.2 = 1  'RB2 (Rx, RS232)
  87. PORTB.3 = 1  'luz lcd a on (RB3)
  88. PORTA.7 = 1  'led amarillo a off
  89. PORTB.0 = 1  'led verde a off
  90. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCIONES------------------
  91. Hseropen 2400  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la uart
  92. GOSUB clear_bufer  'Borra el bufer IMAGEN y por lo tanto tambien al uart, OBLIGATORIO POR LO MENOS UNA VEZ
  93. T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
  94. T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
  95. T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
  96. TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
  97. TMR1L = 0x2f  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
  98. T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
  99. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  100. Enable  'INTCON.GIE habilita todas las interrupciones globales
  101. '--------------------------------------Inicio Programa--------------------------------------------------
  102. Lcdinit  'inicializa el LCD sin cursor
  103. PIE1.TMR1IE = 1  'activa las interrupciones del timer1
  104. PIE1.RCIE = 1  'Activa la interrupcion de la uart en modo rx
  105. pause = 1000  'prepara una pausa de 1Seg
  106. GOSUB pause_ms  'espera el tiempo que indica pause
  107. Lcdout "RS232_Rx RF 1.1"  'imprime en el LCD el literal
  108. Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
  109. Lcdout "Rx 2400 Baudios"  'escribe la cadena de literales en el lcd
  110. Hserout CrLf, CrLf, "VER. 1.0 - RF (RX)", CrLf, "Rx -> RS232 y RF", CrLf, "By COS", CrLf, CrLf  'envia presentacion al RS232
  111. GOSUB clear_bufer  'Borra el bufer IMAGEN y por lo tanto tambien al uart, OBLIGATORIO POR LO MENOS UNA VEZ
  112. pause = 3000  'prepara una pausa de 3Seg
  113. GOSUB pause_ms  'hace una pausa de tiempo indicado por pause
  114. Lcdcmdout LcdLine1Home  'borra el display
  115. '--------------------------------------Main Programa----------------------------------------------------
  116. main:
  117.         IF RCSTA.OERR = 1 THEN GOSUB clear_bufer  'borra bufer y error uar en modo Rx
  118.         IF bufer > 0 THEN  'Si hay datos en el bufer serie
  119.                 GOSUB readserial  'lee caracter del bufer
  120.                 IF control = 3 THEN  'se procesa el ultimo dato de la trama
  121.                         checsum_rs.HB = ascii  'se almacena el ultimo byte de la trama
  122.                         IF checsum = checsum_rs THEN  'se comprueba que el checsum recibido es correcto
  123.                                 Lcdout dato  'imprime caracter leido del bufer en el LCD
  124.                                 IF lcd_control = 15 THEN Lcdcmdout LcdLine2Home  'controla cuando hay que imprimer en la 2 linea del LCD
  125.                                 IF lcd_control = 31 THEN Lcdcmdout LcdLine1Home  'Controla cuando hay que imprimir en la 1 linea del LCD
  126.                                 lcd_control = lcd_control + 1  'lleva la posicion del caracter a imprimir en el LCD
  127.                                 IF lcd_control > 31 THEN lcd_control = 0  'Inicializa posicion del LCD
  128.                                 control = 0  'inicializa la posicion de la trama de datos.
  129.                                 ascii = 0  'borra caracter residual
  130.                                 Toggle led_verde  'cambia de estado cada vez que se recibe una trama correcta
  131.                         ELSE
  132.                                 control = 0
  133.                         Endif
  134.                 Endif
  135.                 IF control = 2 THEN  'tercer byte de la trama
  136.                         checsum_rs.LB = ascii  'se almacena el tercer byte
  137.                         control = 3  'se habilita la recepcion del 4 byte de la trama
  138.                 Endif
  139.                 IF control = 1 THEN  'segundo dato de la trama y valor deceado, se habilita el siguiete
  140.                         checsum = 255 + ascii  'se calcula el checsum posible
  141.                         dato = ascii  'se almacena el dato deceado
  142.                         control = 2  'se habilita el siguiente dato de la trama
  143.                 Endif
  144.                 IF ascii = 255 AND control = 0 THEN
  145.                         control = 1  'primer dato de la trama leido correcto, se habilita el siguiente
  146.                 ELSE
  147.                         Toggle led_amarillo  'cambia de estado el indicador de error de cabecera
  148.                 Endif
  149.         Endif
  150.         ascii = 0  'borra caracter residual
  151. GOTO main
  152. END                                              
  153. '--------------------------------------FIN DEL MAIN-------------------------------------------
  154. '--------------------------------------Sub_Rutinas Programa-----------------------------------------------
  155. pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
  156.         timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de mSeg
  157.         WHILE timer_1ms < pause  'tiempo en mSeg maximos a contar
  158.         WEND
  159. RETURN                                            
  160. '------------------------------ rutinas para el control del bufer del puerto serie-------------
  161. readserial:
  162. 'RUTINA DE LECTURA DEL BUFER DEL PUERTO SERIE (ascii)
  163.         IF bufer > 0 THEN  'si bufer tiene datos
  164.                 ascii = uart_bufer(c_serial)  'se lee el valor del bufer y se asigna ascii
  165.                 uart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
  166.                 c_serial = c_serial + 1  'se incrementa el indice del bufer
  167.                 IF c_serial >= n_uart THEN c_serial = 0  'se verifica si se llego al final del bufer
  168.                 IF uart_imagen(c_serial) = 0 THEN bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
  169.         ELSE
  170.                 ascii = 0  'si no hay datos en el bufer devuelve 0
  171.         Endif
  172. RETURN                                            
  173. clear_bufer:  'inicializa el bufer imagen y borra error del puerto fisico en modo Rx
  174. '_________________________Borra e inicializa el bufer imagan del puerto serie
  175.         c_serial = 0
  176.         WHILE c_serial < n_uart  'se ejecuta tantas veces como variables tiene el bufer
  177.                 uart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
  178.                 c_serial = c_serial + 1
  179.         WEND
  180.         c_serial = 0  'variables de control del bufer
  181.         uart = 0
  182.         bufer = 0
  183.         ascii = 0
  184. '_________________________Borra el error del puerto serie fisico en Rx
  185.         RCSTA.OERR = 0
  186.         RCSTA.CREN = 0
  187.         RCSTA.CREN = 1
  188. RETURN                                            
  189. '--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
  190. ON Interrupt  'desactiva las interrupciones
  191. Save SYSTEM  'Guarda los valores del sistema
  192. '*****************************base de tiempos********************************************
  193.         IF PIR1.TMR1IF = 1 THEN  'comprueba que la interrupcion la proboco el timer1
  194.                 TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
  195.                 TMR1L = 0x2f  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
  196.                 timer_1ms = timer_1ms + 1  'contador para control del timer_1ms
  197.                 PIR1.TMR1IF = 0  'borra el bit de salto del timer1
  198.         Endif
  199. '*****************************BUFER PUERTO SERIE****************************************
  200.         IF PIR1.RCIF = 1 THEN  'comprueba que es esta la interrupcion activa del modulo USART
  201.                 IF uart_imagen(uart) = 0 THEN  'comprueba que la posicion esta vacia
  202.                         uart_imagen(uart) = 1  'indica que hay dato en el bufer de entrada
  203.                         bufer = 1  'indica que el bufer tine datos
  204.                         Hserget uart_bufer(uart)  'carga el dato en el bufer
  205.                         uart = uart + 1  'indica cual sera la posicion siguiente del bufer
  206.                         IF uart >= n_uart THEN uart = 0  'comprueba el final del bufer y lo inicializa
  207.                 ELSE
  208.                         Hserget uart_bufer(n_uart)  'descarga la uart para que no se bloquee porque el bufer de entrada esta lleno
  209.                 Endif
  210.                 PIR1.RCIF = 0  'borra el bit de salto del Rx, esto ya lo hace de forma automatica Hserget
  211.         Endif
  212. RESUME  'activa las interrupciones y retorna al curso normal del programa antes del salto

PD. Ahora cambia de estado el led verde cada vez que se descodifica una trama correctamente.
      Ahora cambia de estado el led amarillo al recibir un byte de cabecera erroneo.

« Última modificación: 09 de Mayo de 2008, 21:42:25 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #374 en: 03 de Mayo de 2008, 09:13:39 »
Y un pequeño video, lo que se escribe en el teclado del PC va saliendo en ambas Pic EBasic.

Saludos desde Granada, España.