TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: dogflu66 en 24 de Noviembre de 2006, 22:25:30

Título: PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 24 de Noviembre de 2006, 22:25:30
---- LENGUAJE DE PROGRAMACIÓN PIC BASIC DEL PIC SIMULATOR IDE (PSI) ----


Indice del hilo
-------------------------------------------------------------------------

  PSI, CONFIGURACION

_______________________________________
  EJEMPLOS BASICOS

            Cambia de estado un PIN de forma cíclica.
            Programa semáforo.
            Cambia de estado un PIN de forma cíclica, TOGGLE.
            Cambia de estado un PIN de forma cíclica, WHILE/WEND.
            Cambia de estado un PIN de forma cíclica, WHILE/WEND, IF/THEN, PORTB.
            Cambia de estado un PIN de forma cíclica, WHILE/WEND, IF/THEN, RB.
            Cambia de estado el puerto B (Contador Binario).
            While/Wend, if/then, incremento de variables, salida de datos por el puerto B.
            Cambia de estado el puerto B (Efecto coche fantástico).
            For/Next, ShiftRight, ShiftLeft, salida datos por puerto B.
            Encender un led distinto por cada pulsación de tecla que ingrese por un mismo pin.
____________________________
  LCD


    '***********************************************
    'NOMBRE:16F88_PicEBasic_LCD
    'Uso del LCD con bus de datos a 4Bit y sin pin de RW
________________________________________________
  LCD, INTERRUPCIONES, Timer1


    '******* Placa Entrenadora *******
    'NOMBRE:16F88_PicEBasic
    'Activacion del Timer1 por rebose cada 1mSeg.
    'Implementacion de timer (bases de tiempos) por soft
    'Cambio de estado del RA7 de forma ciclica (led intermitente)


    '**** Placa Entrenadora (PIC EBadic) ***
    'NOMBRE:16F88_Ejemplo 20
_________________________________________
  LCD, ADC, DECIMALES


    '********************************** PIC Entrenadora BASIC (PicEBasic)***********************************
    'NOMBRE: 16F88_LCD_ADC
    'DESCRIPCION: MUESTRA EN EL DISPLAY EL VALOR DE LA ENTRADA ANALOGICA CON DOS DECIMALES Y EN VOLTIOS
_____________________________
  LCD, I/O


    '********************************** PIC Entrenadora BASIC (PicEBasic)********************
    'NOMBRE: 16F88_LCD_I/O
    'DESCRIPCION: MUESTRA EN EL DISPLAY EL ESTADO DE LA TECLA ACTIVANDO EL LED ASOCIADO
_________________________________
  LCD, I/O, I2C, RELOJ CALENDARIO, TEMPERATURA


    '******* PIC Entrenadora BASIC (PicEBasic)********************
    'NOMBRE: 16F88_LCD_RTC
    'VERSION: 1.0
    'DESCRIPCION: MUESTRA EN EL DISPLAY LA FECHA Y LA HORA
    'para transferir la hora al reloj dejar pulsada la tecla S1


    '***** PIC Entrenadora BASIC (PicEBasic)*****
    'NOMBRE: 16F88_LCD_RTC_12
    '****************************************


    '**** Placa Entrenadora (PIC EBadic) ******
    'NOMBRE:16F88_Pic_EBasic_EJEMPLO_24
    '*************************************


    '**** Placa Entrenadora (PIC EBadic) ****
    'NOMBRE:16F88_Pic_EBasic_EJEMPLO_28


    '***** Placa Entrenadora (PIC EBadic) *****
    'NOMBRE:16F88_Pic_EBasic_EJEMPLO_25
    '*************************************

______________________________________________________
  LCD, INTERRUPCIONES, MODULO UAR


    '********************************** PIC Entrenadora BASIC ***********************************************
    'NOMBRE: 16F88_LCD_RS232
    'VERSION: 1.0
    'DESCRIPCION: MUESTRA EN EL DISPLAY DE 16x2, LOS CARACTERES RECIBIDOS POR RS232 Y ENVIA OTRA CADENA FIJA
    'tiempo de lectura entre byte y byte del puerto serie 10mseg maximo si no hay datos
    '******************************************************************************************************
_______________________________________________________________________
  LCD, ADC, I/O, DECIMALES, INTERRUPCIONES (PWM)


    '******* Placa Entrenadora (PIC EBadic) *****
    'NOMBRE:16F88_LCD_Timer1_ADC_PWM
   '****************************************
__________________________________________________
  LCD, ADC, DECIMALES, FUNCIONES


    '********************************** PIC Entrenadora BASIC (PicEBasic)***********************************
    'NOMBRE: 16F88_LCD_ADC_Funcion_12
    'DESCRIPCION: MUESTRA EN EL DISPLAY EL VALOR DE LA ENTRADA ANALOGICA CON DOS DECIMALES Y EN VOLTIOS


    '************ Placa Entrenadora (PIC EBadic) *********
    'NOMBRE:16F88_Pic_EBasic_Ejemplo_19
    '************************************************
____________________________________________________________________________________
  LCD, ADC, Function, MEDIA ARITMETICA, TEMPERATURA LM35


    '********************************** PIC Entrenadora BASIC (PicEBasic)***************************************
    'NOMBRE: 16F88_LCD_ADC_Funcion_13
    'version: 1.3
    'se añade un sensor de temperatura en la entrada RA4, se conecta un LM35DZ por medio de la placa ETPA_LM35xZ, Ver. 1.2
    'se toma una lectura cada 1000mSeg. y se calcula la media aritmetica con 20 muestras
    'se ajusta la placa ETPA_LM35xZ, para maxima temperatura 60º = 3V (RA2)
    'como 5V=1023=100º, 3V=613.8=60º
    'como el rango de temperatura del LM35DZ es de 0º a 100º, el RA1 se ajusta a cero voltios
    '*******************************************************************************************************
_______________________________________________
  TEMPERATURA CON EL LM35




    '*********** PIC Entrenadora BASIC (PicEBasic)********
    'NOMBRE: 16F88_LCD_ADC_Funcion_14
    '*************************************************


    '********************************** PIC Entrenadora BASIC (PicEBasic)******************************
    'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_10
    'DESCRIPCION: Muestra en el display la fecha, hora (24h)mediante el DS1307 y temperatura (LM35)
    '**********************************************************************************************
_______________________________________
  BASES DE TIEMPOS


    '***************** Placa Entrenadora (PIC EBadic) **************
    'NOMBRE:16F88_Pic_EBasic_Timer0
    'Descripcion: Base de tiempos programable empleando el Timer0
    '**********************************************************
______________________________________________
  COMUNICACION CON EL PC


    '******************* PIC Entrenadora BASIC ***************************************
    'NOMBRE: 16F88_Pic_EBasic_LCD_RS232_Menu_10
    'DESCRIPCION: Control de los led de la EBasic por medio de un menu en el Hyperterminal
    '*******************************************************************************


    '******** PIC Entrenadora BASIC ****************
    'NOMBRE: 16F88_Pic_EBasic_LCD_RS232_Menu_11
    'DESCRIPCION: Control de clave de acceso
    '*********************************************


    '*********** PIC Entrenadora BASIC *************************************
    'NOMBRE: 16F88_Pic_EBasic_LCD_Timer1_MidiendoTiempo_10
    'DESCRIPCION: Midiendo el tiempo que tardan ciertas rutinas en ejecutarse
    'valor por el display y por el hyperterminal
    '*********************************************************************


    '************* PIC Entrenadora BASIC (PicEBasic)*************************
    'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_11
    'Se añade salida de la temperatura, hora y fecha por el puerto serie (Soft)
    '********************************************************************


    '*********** PIC Entrenadora BASIC (PicEBasic)********
    'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_12
    'Se habilita el modulo usar como salida de datos serie
    '*************************************************


    '************ PIC Entrenadora BASIC *********************
    'NOMBRE: 16F88_Pic_EBasic_LCD_RS232_13
    'VERSION: 1.3
    'Se simplifica la rutina bufer de lectura del puerto serie fisico
    'mejora en la precision en las bases de tiempos
    '******************************************************
__________________________________________________________________________________________________
  EJEMPLO DE INTERRUPCION PRODUCIDA POR EVENTO EXTERIOR AL PIC


    '********************************************************************
    'PROGRAMA PARA PRACTICAR CON INTERRUPCIONES EXTERIORES DEL PIN RB0
    'On Interrupt - Interrupts in BASIC
    '********************************************************************
________________________________________________________________________
  USANDO EL MODULO CCP1 (FUNCIONES DEL LENGUAJE)


    '***************** Placa Entrenadora (PIC EBadic) *************************************
    'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_12
    'se elimina el control del PWM por bases de tiempos y se controla mediante el modulo CCP1
    '*********************************************************************************


________________________________________________________________________
  TRABAJANDO CON EL MODULO CCP1 DIRECTAMENTE



    '***************** Placa Entrenadora (PIC EBadic) ***************************
    'NOMBRE:16F88_Pic_EBasic_LCD_CCP1_Timer1_ADC
    'MICRO: PIC16F88/8Mhz reloj interno
    'Fecha/Autor: 3/08, By COS
    'Version: 1.0
    'Uso del modulo CCP1 configurado en especial mode.
    'Se crean bases de tiempos usando el modulo CCP1 configurado en modo comparador
    'y generando el mismo modulo una lectura del ADC cada 1mSeg.
    '***********************************************************************





________________________________________
  MODULO TIMER2

________________________________________
  MODULO WATCHDOG


    '******** PIC Entrenadora BASIC (PicEBasic)********
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_16
    '**********************************************
_______________________________________________
  USO DE LA EEPROM INTERNA


    '******* PIC Entrenadora BASIC (PicEBasic)******
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_17
    '*******************************************


    '****** PIC Entrenadora BASIC (PicEBasic)*****
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_18
    '*****************************************
_________________________________________________
  CALIBRANDO RELOJ INTERNO


    '*********Placa Entrenadora (PIC EBadic) *********
    'NOMBRE:16F88_Ejemplo 22
    'Metodo para el calibrado del reloj interno del pic
    '********************************************
_______________________________________
  NUMEROS ALEATORIOS



    '***** Placa Entrenadora (PIC EBadic) ******
    'NOMBRE:16F88_Pic_EBasic_EJEMPLO_23
    '**************************************


    '****** Placa Entrenadora (PIC EBadic) *******
    'NOMBRE:16F88_Pic_EBasic_EJEMPLO_23.1
    '****************************************
______________________________________
  MODULO ADC


    '****** PIC Entrenadora BASIC (PicEBasic)*****
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_26
    '*****************************************


    '***** PIC Entrenadora BASIC (PicEBasic)******
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_27
    '*****************************************

_____________________________________________________
  COMUNICACION MEDIANTE RS485


    'PARA PROBAR EL CIRCUITO PODEMOS USAR LOS EJEMPLOS DEL RELOJ
__________________________________
  FUNCIONES (MANEJO DE BIT)



__________________________________
  FUNCIONES (MANEJO DE BYTES)



___________________________________
  FUNCION ARRAY DOS DIMENSIONES (VECTORES)

____________________________________
  FUNCIONES PARA TRABAJAR CON CADENAS (STRING)



____________________________________
  FUNCION BASE DE TIEMPOS (INTERRUPCIONES)

____________________________________
  FULL FUNCION ADC

____________________________________
  SERVOMOTORES


    '***************** Placa Entrenadora (PIC EBadic) **********************************
    'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_RB4
    'Descripcion: Control de un servomotor (Futaba S3003) usando el ADC, Timer1, Interrupciones
    '******************************************************************************


    '***************** Placa Entrenadora (PIC EBadic) **********************************
    'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_Servo_11
    'Descripcion: Control de un servomotor (Futaba S3003) usando el ADC, Timer1, Interrupciones
    'Se fusiona la rutina de divicion con decimales
    '******************************************************************************

    '*********************** Placa Entrenadora (PIC EBadic) ********************************
    'NOMBRE:16F88_Pic_EBasic_Adcin_ServoOut
    'Descripcion: Control de un servomotor (Futaba S3003) usando las declaraciones Adcin y ServoOut
    '**********************************************************************************


    '***************** PIC Entrenadora BASIC (PicEBasic) ***************
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_14
    'PROGRAMA PARA PRACTICAR CON SERVOS Y LA DECLARACION WAITUS
    '**************************************************************
___________________________________________________________
  PLACA DE AMPLIACION 3 SERVOMOTORES




    '********************* PIC Entrenadora BASIC (PicEBasic)*********************
    'NOMBRE: 16F88_Pic_EBasic_Ejemplo_30
    'MICRO: PIC16f88
    'FECHA/AUTOR: 05/08 - By COS
    'Version: 1.0
    'Programa simplificado para el Test de la placa de ampliacion 3 servos Futaba S3003
    '************************************************************************
________________________________________________________________________________________________________________
  TRABAJANDO CON COMUNICACION POR RF, MODULOS DE TX Y RX DE AUREL Y LAIPAC



    '******************************* PIC Entrenadora BASIC ***************************
    'NOMBRE: 16F88_Pic_EBasic_Modulos_RF_Tx_11
    'VERSION: 1.1
    'MICRO: PIC16F88
    'Fecha/Autor: 5/08 By COS
    'DESCRIPCION: Se recibe por el teclado del pc mediante el hyperterminal caracteres que son
    'reenviados al aire mediante un modulo de rf a 2400 baudios.
    'programar el hyperterminal del Windows:
    'Bits por segundo: 1200
    'Bits de datos: 8
    'Paridad: Ninguno
    'Control de flujo: Ninguno
    'LCD a 4 bit, sin bit de RW
    '********************************************************************************


    '********************** PIC Entrenadora BASIC ***********************
    'NOMBRE: 16F88_Pic_EBasic_Modulos_RF_RX_11
    'VERSION: 1.1
    'MICRO: PIC16F88
    'Fecha/Autor: 5/8 By COS
    'VERSION 1.1
    'DESCRIPCION: Se recibe por el aire "RF" (2400 Baudios) los datos reenviados
    'por la placa de TX que a su vez los recibio via RS232 desde el hyperterminal.
    'led verde cambia de estado cada vez que se recibe una trama completa
    'led amarillo cambia de estado cada vez que falla el byte de cabecera
    '******************************************************************





_________________________________________________________________________________________
  TRABAJANDO CON NÚMEROS NEGATIVOS

_________________________________________________________________________________________
  MIDIENDO HUMEDAD RELATIVA Y TEMPERATURA CON EL SENSOR RHT03 O DHT22

_________________________________________________________________________________________
  MIDIENDO DISTANCIA MEDIANTE ULTRASONIDOS CON EL SENSOR HC-SR04 Y EQUIVALENTES

_________________________________________________________________________________________
  ACLARACIÓN DE DUDAS

    REGISTRO ANSEL.

    SOBRE ENTRADAS ANALOGICAS DEL MODULO ADC Y
    ENTRADAS ANALOGICAS DEL MODULO COMPARADOR ANALOGICO.


    PROBLEMA WATCHDOG Y MODULO USART

_________________________________________________________________________
HILOS RELACIONADOS:

_________________________________________________________________________
PD: Agradezco cualquier tipo de corrección o sugerencia.
      Me lo podéis comunicar mediante el privado o en el mismo hilo.

-------------------------------------------------------------------------------------------------------[/list]
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: samshiel_pic en 25 de Noviembre de 2006, 19:40:47
Hola dogflu66 que tal? mira pues estoy interesado en el tema ya comence con mikrobasic pero no me hizo mucho tilin asi que lo tengo muy aparcado despues estube miradon un poco de proton pero nada solo por encima, pero el lenguace C sigue siendo para mi la mejor opcion hasta el momento. Asi que si vamos a empezar un nuevo hilo con ejemplos y esplicaciones pues toy dispuesto a empezar con él.  :mrgreen:
Lo que no se es que version del compilador utilizaremos y si hay alguna version free por ahi.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 25 de Noviembre de 2006, 20:23:24
Hola!
Excelente idea. Como ya algunos saben, es el compilador que vengo usando desde que empece con los PIC, hace poco mas de un año.
Se puede descargar una version de prueba por (creo) 30 dias de http://www.oshonsoft.com/ . La version que estoy usando es la PIC Simulator IDE v5.91 , pero me consta que ya se supero la 6.3x . Existe tambien una para los PIC 18Fxxxx

Adjunto unas capturas del IDE, que es muy bueno.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 25 de Noviembre de 2006, 20:24:50
Algunas de las herramientas....
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Noviembre de 2006, 20:37:03
Desde este enlace te puedes descargar las ultimas actualizaciones total mente ejecutables de funcionamiento por tiempo limitado, también puedes echar un vistazo a los ejemplos y el manual.

http://www.oshonsoft.com/downloads.html

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: samshiel_pic en 26 de Noviembre de 2006, 08:13:51
OK dogflu66 y aitopes vamos a ver que podemos hacer con este PIC BASIC jejeje :mrgreen:
Habria que empezar igual que lo hicimos con mikrobasic con un hilo donde poner dudas y poder ir resolviendolas y otro con los ejemplos y sus simulaciones, todo muy bien comentadito para que los que empezemos tiremos para adelante rapido y firmemente. Podemos empezar como siempre con prender un led y a partir de ahi ir subiendo en dificultad.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Veguepic en 26 de Noviembre de 2006, 10:57:29
Por lo que entiendo tiene el compilador y el simulador todo integrado?

Suena muyyyyy interesante, si es asi cuenten conmigo para preguntarles de todo.  :mrgreen:

A la fecha compilo con pbp y luego simulo con proteus, pero a veces me marca error y como mi computadora es una lentium se hace muy aburrido.

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Noviembre de 2006, 13:00:38
jejeje, no es un simulador de circuitos electronicos, es un entorno de trabajo que te permite trabajar tanto en basic como en assembler y "SI" simular el archivo antes de descargarlo al pic, lo bueno que tiene es que no se bloquea, por lo menos a mi, y todos los modulos como el lcd, glcd, terminal rs232, osciloscopio, etc estan ya definidos en el entorno por lo que funcionan muy bien..
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: samshiel_pic en 26 de Noviembre de 2006, 13:03:10
Pues yo estoy dispuesto a empezar cuando antes mejor!!!  :mrgreen: voy a ver un poco la ayuda y a ver que puedo hacer.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: samshiel_pic en 26 de Noviembre de 2006, 14:56:18
Hola chicos que tal? he instalado la version de prueba PIC Simulator IDE - Evaluation Copy v6.41 y la verdad es que no se si hay que instalar algo mas o que. Pero es que no veo donde tengo que escribir el codigo :oops: solo eso.
Cuando inicio el .exe me sale esta ventana que es el simulador.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=14917.0;attach=2757;image)

Haber si me podeis ayudar :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 26 de Noviembre de 2006, 16:13:36
Dentro de la opcion "TOOLS" esta "BASIC COMPILER". Esa opcion te abre el editor de codigo. Si no...pulsa CTRL+C y listo.

Saludos.

PD: No dejes de tener a mano el HTML de la ayuda. Es escueto pero efectivo. Y si no...pregunta nomas! Yo por ahi tarde un poco en responder por que.... mi mujer esta ya en trabajo de parto :-/ Pero segun el medico faltan varias horas, y en lugar de comerme las uñas cada tanto paso por aca. :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 26 de Noviembre de 2006, 16:18:47
PErdon..Tambien deberas pasar por "OPTIONS" y en las opciones "SELECT MICROCONTROLLER", "CONFIGURATION BITS", "CHANGE CLOCK FRECUENCY", etc, seleccionar el micro y configuracion que desees.

Despues de escribir en BASIC, puede compilar y cargar el HEX en el simulador. Tanto el LCD como los demas modulos tienen un boton de configuracion, que te permitiran elegir en que pines estan conectados. La simulacion tambien puede correr a 5 velocidades distintas....fijate cual es la mas adecuada en cada momento. Te combiene hacer los bucles y las demoras lo mas cortos posibles cuando usas el simulador para no perder tiempo esperando, y cuando ya tienes el circuito montado, los pasas al valor real.
Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 26 de Noviembre de 2006, 18:36:29
¡Alucino!, y tú posteando mientras tu mujer apretando...

El foro engancha, macho, pero esto es demasiado  :D

Suerte y que todo vaya bien.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 26 de Noviembre de 2006, 18:46:28
Es que.....estamos en casa todavia, y segun el medico pueden faltar entre 24 y 36 hs, asi que estoy haciendo un caminito entre la compu, unas placas que estoy soldando, y el dormitorio. :)
 
(realmente esto se me ha hecho un vicio, ehhhh!!!! )
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 26 de Noviembre de 2006, 18:52:00
Un poco de codigo comentado....
Este es el primer intento de hacer un programa con PIC SIMULATOR IDE, mostrando el tiempo que transcurre en un display, mediante 4 lineas de datos. Por supuesto, no hay interrupciones, ni nada "raro" (no sabia como hacerlo en ese momento!), simplemente un bucle que incrementa los segundos, minutos, etc.
Me parece que puede servir para que el que esta empezando con este BASIC se haga una idea de como es la sintaxis:

Código: [Seleccionar]
'Voy a usar 4 pines para controlar el LCD
Define LCD_BITS = 4
'por medio del port B
Define LCD_DREG = PORTB
'Las lineas 4,5,6,y 7..
Define LCD_DBIT = 4

'El bit RS en port A bit 0
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 0

'El bit E en port A bit 1
Define LCD_EREG = PORTA
Define LCD_EBIT = 1

'El bit RW en port A bit2
Define LCD_RWREG = PORTA
Define LCD_RWBIT = 2

'Demora despues de un LCDCMDOUT (10000)
Define LCD_COMMANDUS = 10000

'Demora despues de un LCDOUT (100)
Define LCD_DATAUS = 100

'Demora de arranque (LCDINIT) (1000)
Define LCD_INITMS = 1000
Dim s As Byte
Dim m As Byte
Dim h As Byte
Dim alarma As Word
alarma = 1  'Alarma activada.
s = 0  'Segundos
m = 0  'Minutos
h = 0  'Horas

Lcdinit  'Iinitializa LCD; sin cursor

'Defino caracter campanita
Lcddefchar 0, %00100, %01110, %01110, %01110, %11111, %11111, %00100, %00000


Lcdout "EL RELOCITO v3.0"  'linea 1

loop:
Lcdcmdout LcdLine2Clear  'Borra la linea 2
Lcdcmdout LcdLine2Home  'Comienzo linea 2

If h < 10 Then Lcdout "0"
Lcdout #h, ":"
If m < 10 Then Lcdout "0"
Lcdout #m, ":"
If s < 10 Then Lcdout "0"
Lcdout #s, "       "
If alarma = 1 Then Lcdout 0
WaitMs 1000  '1 seg.

s = s + 1
If s > 59 Then
s = 0
m = m + 1
Endif

If m > 59 Then
m = 0
h = h + 1
Endif

If h > 23 Then
h = 0
Endif
Goto loop  'Repite eternamente

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: BrunoF en 26 de Noviembre de 2006, 18:53:11
jajajaj eres todo un personaje aitopes...xd!! :):) :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Noviembre de 2006, 20:45:56
Suerte y que todo vaya bien, como ya te dije en otro hilo Aitopes
------------------------------------------------------------------------------
Lo primero:

Una vez que tenemos el PIC Simulator IDE en la pantalla:

1º en el menu [Options] seleccionar el micro a utilizar mediante [Select MIcrocontroller]

2º seleccionas la frecuencia del cristal en Mhz, a la que trabajara el micro [Options][Change Clock Frequency]

3º selección de los bit del modo de trabajo del micro [Option][Configuration Bits]

Todo esto queda ya configurado para otras ocasiones, pero de todas formas cada vez que se entra en una nueva sesion es conveniente el comprobar que [Configuration Bits] no ha cambiado ya que es sensible a algunas modificaciones.

Y ya solo resta indicar en que se va a trabajar en Basic o Assembler mediante [Tools][BASIC Compiler]
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: navaismo en 26 de Noviembre de 2006, 20:50:37
Que ventajas sobre PBP, SwordFish o Proton posee este Compilador. Ya que estos tres son los que uso aunque frecuentemente uso PBP y MKB mejor ni hablamos ese es en caso de super super emergencia.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Noviembre de 2006, 21:09:27
Ventajas con respecto a otro compilador no te puedo dar, lo que si te puedo dar son mis razones por las que comence a utilizar hace 2 años.

1º simplicidad del lenguaje, a un que hoy en dia ya tiene comandos casi para todo.
2º permite trabajar con los modulos del pic de una forma directa y transparente si se desea.
3º permite integrar el codigo en assembler de una forma facil y directa en el basic
4º permite compilar tambien en Assembler
5º simulador integrado propio
6º la licencia me costo 15 euros
7º te responde por correo cualquier duda de forma rapida, en ingles
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Diciembre de 2006, 10:00:51
Hola Dogflu66!

Tengo ganas de encarar un pequeño proyecto, en PIC BASIC, y por ahi me gustaria hacerlo contigo.
Te cuento mas o menos de que se trata, y si te parece que lo podemos encarar, sin apuros y sin compromisos, posteo el hilo en PROYECTOS:

Quiero hacer un modulito, lo mas universal posible, que contenga un pic pequeño (16F627A por ejemplo) para manejar un LCD y 4 pulsadores (podriamos incluir algun led o buzzer) en forma serial.
Es decir, un modulo al que se le envien comandos e imprima los caracteres en el LCD (o encienda algun LED o haga sonar el buzz) y que tambien se pueda interrogar sobre el estado de los pulsadores (o que al detectar algun cambio en estos envie directame el comando al host).
Te parece potable? No es algo muy complicado, pero bien hechito, con un PCB pequeño, del tamaño del display para montarlo tipo sandwitch detras de este, y con un buen programa en PIC BASIC puede resultar de utilidad en muchos proyectos....

Contame que te parece la idea :mrgreen:

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Diciembre de 2006, 20:18:30
Pues me parece una excelente idea, pero en este caso bajo mi opinión se podria tratar el proyecto mas bien como ejercicio y asi tratarlo por este mismo hilo, se podrían tratar las distintas rutinas que realicemos para su control como ejercicios de ejemplo del lenguaje... que te parece?...

Bien, lo hagamos de una forma u otra la plaquita podria llevar lo siguiente:

1º fuente de alimentación
2º display lcd 16x2 caracteres (7pin)
3º control de la retro-iluminacion del display (1pin)
3º un zócalo de 8x2 para implementar C.I. por I2C (memoria, reloj, etc) (2pin)
4º unos cuantos led (?)
5º puerto rs232 (2pin)
6º una entrada analógica, aun que este micro no tiene (1pin)
7º y 2 teclas, avance-aceptar (2pin)

no lo he mirado con detalle pero es posible que se pueda obtener una configuración que permita tener todo esto en una unica plaquita pequeña.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Diciembre de 2006, 20:45:38
Perfecto! Estoy de acuerdo en las especificaciones.
PAra tener el AD, podemos usar un micro que tengo en el cajon de componentes y que es muy economico, el 16F818A (u 16F819A, que solo tiene el doble de RAM), es pin a pin compatible con el 16F628A pero tiene 4 A/D. Voy a releer la hoja de datos por que lo tengo desde hace unos meses, pero estoy casi seguro que es asi.
El PCB deberia no ser mucho mayor al LCD....digamos algo asi:

-------------------------------------------
!  ------------------------------------       !
! !                                                  !  (P)!
! !                       LCD                      !      !                 
! !                                                  !  (P)!
!  -----------------------------------        !
!     ( L )       ( L )      ( L )        ( L )          !
-------------------------------------------

Donde (L) son los leds (numero a determinar, dependen de los I/O libres), y (P) los pulsadores.

Me gusta!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Diciembre de 2006, 21:31:46
Pues yo utilizaria el 16F88, que tiene varios frecuencias de reloj internas diferentes hasta 8Mhz, asi no utilizamos cristal exterior trabajando a una velocidad razonable... es compatible pin a pin con el 16F84 y tiene practicamente modulos internos de todo tipo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Diciembre de 2006, 21:55:20
Esta seria la configuracion de los pin del 16F88, pero de todas formas cualquier pic compatible con el 16F84 serviria
siempre que tenga reloj interno.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 03 de Diciembre de 2006, 23:00:34
Hola aitopes, me quedo una duda con tu ultimo mensaje
Dijiste que pensabas utilizar el pic 16F818A u 16F819A, pero busque ese PIC y no lo encontre por ningún lado, ni en la pag de microchip aparece la dataste.

Saludos


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 03 de Diciembre de 2006, 23:24:56
Re-hola, me quede con que no puede encontrar el pis ese, y me olvide de comentarles que me pareció muy interesante este hilo, y la idea de hacer esa placa para aprender sobre este compilador y simulador.
Les cuento que hasta el momento solo e trabajado en asembler, pero si utilizo el simulador del PIC Simulator IDE una vez generado el hex desde MPlab, y la verdad es muy Util.

Por lo que vi, parece muy útil el Basic, y estoy interesado en aprender este leguaje, así que me uno a ustedes en el desarrollo de esto, para lo que le pueda ser útil por aquí estaré.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: BrunoF en 04 de Diciembre de 2006, 02:08:48
Hola aitopes, me quedo una duda con tu ultimo mensaje
Dijiste que pensabas utilizar el pic 16F818A u 16F819A, pero busque ese PIC y no lo encontre por ningún lado, ni en la pag de microchip aparece la dataste.

Saludos

Serán 18F818 y 18F819.

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 07:05:17
Bien dia!
Es buena idea lo del 16F88, es mas "conocido" y seguramente facil de conseguir.
En un rato (un par de horas) hago un diagrama tentativo del HARD y lo posteo.

BrunoF: me referia al 16F818 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010226)
se ve que la "A" se me colo sin querer, concretamente es el 16F818-I/P, de 8MHz, con las siguientes caracteristicas:

1 PWM 10-bit
8 MHz Internal Oscillator
ICD
128 bytes of EEPROM data memory
Capture/Compare
This powerful (200 nanosecond instruction execution) yet easy-to-program (only 35 single word instructions) CMOS Flash-based 8-bit microcontroller packs Microchip’s powerful PIC® architecture into an 18-pin package and is upwards compatible with the PIC16C7x, PIC16C62xA, PIC16C5X and PIC12CXXX devices. The PIC16F818 features 8MHz internal oscillator, 128 bytes of EEPROM data memory, a capture/compare/PWM, a synchronous serial port that can be configured as either 3-wire Serial Peripheral Interface (SPI™) or the 2-wire Inter-Integrated Circuit (I²C™) bus and 5 channels of 10-bit Analog-to-Digital (A/D) converter that make it ideal for advantage analog / integrated level applications in automotive, industrial, appliances and consumer applications.

cuya datasheet esta aqui. (http://ww1.microchip.com/downloads/en/DeviceDoc/39598e.pdf)

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 08:55:02
Este es el PINOUT del PIC que vamos a usar, el 16F88 :
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 09:10:52
Houston, estamos en problemas: :shock:

Puede deberse a que nunca use el 16F88, pero me puse a dibujar el diagrama y me parece medio complicada la distribucion de los pines, explico por que:

En PIC BASIC para manejar un LCD con 4 bits de datos es necesario definir que puerto se va a usar con

Define LCD_DREG = PORTB

y que parte del puerto (0..3 o 4..7) con

Define LCD_DBIT = 0    o    Define LCD_DBIT = 4

Debido a la distribucion de pines del 16F88, si usamos los primeros 4 bits del port B, nos quedamos son el RX del RS-232 ...y si usamos la parte superior, nos quedamos son el TX... :(
Con el PIC 16F628A esto no pasa, ya que TX y RX estan ambos en la parte inferior (bits 2 y 3) del PORTB, por lo que se puede usar la parte superior del puerto como conexion para el LCD. (aunque esto nos complicaria para usar algun periferico I2C). Por otra parte, este pic no tiene conversor A/D.

Por supuesto, he visto por ahi que se utilizan pines para conectar el LCD (salida) y un pulsador (entrada) a la vez, pero sinceramente nunca lo use y no se si es posible de hacer con los modulos de comunicacion serie. :lol:

Otra idea linda de implementar en el proyecto: usar PWM para que en conjunto con la entrada A/D (a la que se puede conectar una LDR) ajustar el brillo del backlite de acuerdo a la luz ambiente, por ejemplo.

Espero a ver si alguien que lea esto me confirma que es posible multiplexar el LCD con I2C o RS-232....

Saludos!

PD: Adjunto el pinout de los 16F62x, por las dudas.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 04 de Diciembre de 2006, 09:28:49
Hola, te cuento que para el LCD, se podría usar un shift, como el CD4094 o 74HC4094 que no es un shiht normal, sino que mediante el pin strobe se refrescan las salidas al momento de completar el shift internamente, es una buena opción, lo e visto funcionando, lo que si para eso ya no va a ser posible implementar el modulo para LCD`s del PIC Simulator IDE, pero se podría construir una librería para eso, y lo bueno que todo el LCD se controlaría con solo 3pines

También te cuento, que en un proyecto que tengo actualmente casi terminado, estos trabajando con un LCD y un teclado matricial conectados al mismo puerto, y no es tan complicado, para ahorrar pines se pueden poner los pulsadores en el mismo bus de datos, si es que se conecta el LCD directo al puerto usando el shift ya no es factible. En si consiste en el momento de leer el teclado, configurar las sólidas para el LCD como entradas y leer el teclado, luego a la hora de escribir en el LCD se conf nuevamente como entradas, eso si hay que ubicar por ahí unas resistencias para que si se presiona un pulsador o botón del teclado en mi caso cuando se esta escribiendo en el circuito no se produzca un corto, en realidad se produce igual, solo que al tener esa resistencia la corriente es insignificante, incluso ni se pierde el dato que se esta mandando al LCD.

Otra cosa, porque no usar un PIC un poquito mas grande, podria ser un 16F876, con ese andaria de sobra para implementar todo, o no es mucho mas caro, yo lo consigo poco menos de 2 dólares mas que el 16F88, y físicamente son solo 10 pines mas, el PCB no se incrementaría demasiado, y al poder conectar todo directo al PIC, va a ser posible implementar todos los módulos de control que trae este compilador.



Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 09:54:25
Lo del 876A es una buena posibilidad, si no queda otra con el 16F88. Como decis, el costo es casi el mismo, y fisicamente me parece que es mas eficiente un intefrado mas grande que dos o tres chicos...Veamos que dice Dogflu66.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Diciembre de 2006, 12:03:58
Para corregir el problema con el 16f88 seria de utilizar el puerto A para controlar el lcd, quedando el RA4 libre para poder hacer pruebas con el ADC, que para lo que queremos en este caso seria suficiente.

Lo que si tenemos que tener en cuenta es lo que queremos, una placa simple o usar un micro superior que lo ideal seria cambiar la filosofia de la placa para poder aprovechar los nuevos recursos de este.

echar un vistazo a la placa que utilizo normalmente, el teclado y led los coloco en unos modulitos a parte que se conectan a los conectores de expansión, la placa no es muy grande y tiene un poco de todo con lo que tiene salidas de potencia para controlar motores, reles, etc.

lo unico que yo le implementaria a la placa seria un conmutador para poder programar el micro en placa de una forma mas eficiente de lo que hace ahora y colocaria unos puentes para seleccionar los modulos ccp, que ahora no son utilizados ya que en un principio debido a utilizarla a 20Mhz estos modulos no suelen tener mucha utilidad, pero solo es cuestion de dejar un zocalo para cambiar cristales.

aqui podeis echar un vistazo al es quema y a la placa... asi que como yo no tengo preferencias vosotros mismo decidis... si puedo seguire el hilo desde el curro.

http://www.freewebs.com/glafebre/miguelito.htm
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 12:12:18
Hola Dogflu66!
Si podemos usar el 16F88 con el LCD en PORTA, mejor...
Yo pensaba este proyecto como un "periferico" de algun proyecto mayor....tu "chiquitina V1.4" me parece que excede por mucho esa premisa (por cierto, felicitaciones por Miguelito!)

Me voy a almorzar, seguimos en un rato.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 04 de Diciembre de 2006, 12:37:42
Ahora que lo pienso, si lo planteamos como un periferico de un proyecto mayor, creo qeu si es mejor usar el 16F88, obtendriamos un placa mas compacta y economica aunque sea poco para las futuras aplicaciones.

Taria bueno ademas de dejar prevista la comunicacion RS232, otras como I2C p SPI que este pic lo trae incorporado. y seria de utilidad a la hora de coenctar esre periferico al Ahora que lo pienso, si lo planteamos como un periférico de un circuito mayor, creo que si es mejor usar el 16F88, obtendríamos un placa mas compacta y económica aunque sea poco para las futuras aplicaciones.

Estaría bueno además de dejar prevista la comunicación RS232, tener  I2C o SPI que este pic lo trae incorporado. y seria de utilidad a la hora de conectar este periférico.

Ahora corríjanme si estoy equivocado:
Lo que obtendríamos seria un periférico con comunicación serial (ver cuales) el cual abarca un LCD, una botonera, un par de led y una entrada analogica, la cual por ejemplo conectando un potenciómetro se puede establecer el control de algún dispositivo.

La verdad me parece de gran utilidad, seria una buena interfaz para el usuario de cualquiera de nuestros proyectos o aplicaciones con pic, u solo nos robaria un par de pines en la placa principal.

Saludos, muy buena iniciativa muchachos!!

PD: dogflu66 muy lindo el Miguelito
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Diciembre de 2006, 14:06:19
Pues manos a la obra, seria de hacer un primer esquema y verlo.
Tengo un programita que utiliza el lcd con 4bit de datos, asi que si hay algun problema lo edito en el foro.

Bueno sigo currando a la noche sigo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 17:23:45
Sirve este esquema para empezar?
PD: El que se ria el "soft de diseño" esta en problemas... :mrgreen:
PD2: los pines que estan sin nombre es por que deberiamos ver cual conviene usar. Y falto la expansion para la memoria I2C.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Diciembre de 2006, 20:28:06
Escribe en el LCD "HOLA MUNDO".
Código: [Seleccionar]
'NOMBRE: 16F88_PicEBasic_LCD_01
'MICRO: PIC16F88, 8Mhz reloj interno, PSI v7.41, By COS
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'************************************************************************************************
Define CONF_WORD = 0x2f10  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj a 8 Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'------------------------------------Definicion de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analogicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Lcdinit  'inicializa el lcd sin cursor
WaitMs 500  'pausa para estabilizar
main:  'comienza el programa principal
Lcdcmdout LcdClear  'borra el display
WaitMs 1000  'hace una pausa de 1Seg.
Lcdout "HOLA MUNDO"  'escribe en el display
WaitMs 1000  'hace una pausa de 1Seg.
Goto main  'impide que termine el programa principal
End

Ahi dejo el programita para simular el LCD, a mi me funciona correctamente, a la hora de activar el modulo LCD del simulador, indicarle que tome la configuracion por defecto de pin segun le indica el codigo fuente.
Lo proximo seria simular el LCD y la entrada analogica a ver si da alguna incompatibilidad.

PD. Los tiempos estan trucados para no tener que esperar tanto en el Simulador, los tiempos reales son los que estan indicados entre parentesis.

PD. Corregido ya que este ejemplo se realizo antes de tener la Placa EBasic construida, asi que lo modifique para que funcione sobre ella.

PD. 22/07/07, solo correccion en la descripcion de los pin del LCD.

PD. 15/11/07, añado la configuracion de bit (fuses) del micro y la velocidad del clock en el programa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 04 de Diciembre de 2006, 20:58:15
Perfecto!
Para hacer el PCB uso el mismo "programa" que para los esquemas, asi que espero a que definamos bien todo antes de dibujar nada... ;)

Saldudos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Diciembre de 2006, 21:21:16
Recordar configurar el registro de bit antes de hacer nada con el compilador de basic
es una buena costumbre.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Diciembre de 2006, 09:42:36
Dejo un ejemplo mas, es un poco lento pero merece la pena verlo en el Simulador.
El control y gestion del tiempo es un tema muy importante en la programacion.
Muestra en el display la frase "HOLA MUNDO" con parpadeo y también parpadeo el led amarillo con distinta cadencia cada uno.

Código: [Seleccionar]
'***************** Placa Entrenadora ***************************************
'NOMBRE: 16F88_PicEBasic_02
'MICRO: PIC16F88, 8Mhz reloj interno, PSI v7.41, By COS
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'Activacion del Timer1 por rebose cada 1mSeg.
'implementacion de timer (bases de tiempos)por soft
'cambio de estado del RA7 de forma cíclica (led intermitente)
'***********************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA  'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5  'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'------------------------------------Definicion de puertos------------------------------------------
ANSEL = 0x00  'Los pin I/O digitales (no analogicos)
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'Comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISA.5 = 1  'Como entrada, no permite ser usada como salida digital
TRISB = 0x00  'Puerto B como salidas
PORTB.3 = 1  'luz lcd a on (RB3)
'------------------------------------Inicialización de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarse
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
'Inicializa el LCD ----------------------------------------------------------------------------------
Lcdinit  'inicializa el lcd sin cursor
'Variables de los timer****************************************
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos en ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'Asignacion de valores a las variables--------------------------
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'cuenta 100mSeg
timer1_ms_tiempo = 500  'cuenta 500 mSeg.
timer2_ms_tiempo = 500
timer3_ms_tiempo = 5
timer1_100ms_tiempo = 1  'cuenta 0.1 Seg.
timer2_100ms_tiempo = 1
timer3_100ms_tiempo = 1
'------------------------------------------------------------------------------
Enable  'INTCON.GIE habilita todas las interrupciones globales
WaitMs 500  'pausa para estabilizar
timer1_ms_tiempo = 2  '500
timer2_ms_tiempo = 3  '250
Dim flag As Bit
'------------------------------------rutinas del Programa----------------------
main:  'comienza el programa principal
If timer1_ms >= timer1_ms_tiempo Then  'refresco el display cada timer1_ms_tiempo
Toggle flag
Lcdcmdout LcdClear  'borra el display
If flag = 0 Then Lcdout "HOLA MUNDO"  'escribe el caracter "A" en el display
timer1_ms = 0  'reinicio el timer1_ms
Endif
If timer2_ms >= timer2_ms_tiempo Then  'cambio de estado el pin RA7 cada timer2_ms_tiempo
Toggle RA7
timer2_ms = 0  'reinicio el timer2_ms
Endif
Goto main  'impide que termine el programa principal
End                                               
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'Comprueba que la interrupción del timer1 es activa
'Bases de tiempos
timer_base = timer_base + 1
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1
If timer_base >= timer_base_tiempo Then
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1
timer_base = 0
Endif
TMR1H = 0xf8  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
Endif
Resume  'Activa las interrupciones y retorna al curso normal del programa antes del salto


PD. Cambio el RA5 por el RA7, ya que el RA5 no puede ser seleccionada como Salida Digital.
PD Bis. Segunda correccion cambio RA7 y RA6 por RB7 y RB6 respectivamente para mantener compatibilidad con el esquema de la placa

PD. Donde dice "timer_base = 100  'cuenta 100mSeg", tiene que decir "timer_base_tiempo = 100  'cuenta 100mSeg"
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Diciembre de 2006, 23:05:04
Al final me anime y basandome en el esquema de Aitopes confeccione este ultimo
Aqui lo dejo para que lo corrijan, modifiquen y etc.

PD. Cambio el RA5 por el RA7, ya que el RA5 no puede ser seleccionada como Salida Digital.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 07 de Diciembre de 2006, 06:28:12
Hola Carlos! No le veo errores, esta perfecto!
Estoy medio "callado" por que tengo que resolver varias cosas para poder viajar a la kedada del viernes, pero prometo el lunes seguir con el proyecto.
Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Diciembre de 2006, 20:32:07
Estuve trabajando con el Pic Simulator IDE, y me di cuenta que con el pin RA5 tenia resultados raros, asi que segui investigando y resulta que es un pin que no se puede seleccionar como salida digital.
Asi que corregi los esquemas anteriores, cambiando el pin RA5 por el RA7 y viceversa.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 08 de Diciembre de 2006, 11:55:49
Hola:

A la espera de ver como te queda la placa master  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Diciembre de 2006, 20:39:44
Pues sigo modificando el esquema master, estuve viendo un poco como podrian quedar los componentes
y me parecio que le sobraba espacio asi que le incorpore un reloj calendario.
A ver que les parece.


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Diciembre de 2006, 20:52:22
PD. se me olvido dar alimentacion al RTC... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Diciembre de 2006, 22:07:20
Asi es como me quedo 8.6x6.9cm

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 10 de Diciembre de 2006, 22:59:42
Hola dogflu66, muy bueno el trabajo,

Estoy medio desaparecido, pues estoy tratando de meterle un poco de estudio para la facu jeje,  pero despues de esto de seguro arme el circuito.

saludos

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 11 de Diciembre de 2006, 00:14:13
Hola:

Master yo tambien me apunto a hacer esa placa tengo uno cuantos pic 16F88 esperando ser programodos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2006, 06:25:16
Recien la terminé en la noche, cuando construya una le doy el visto bueno
y posteo los pcbs para que se la construya el que lo desee.

Tambien ire ideando un articulo para ver un poco el criterio de seleccion de los componentes.

Tambien he realizado las pruebas del rellenado de cobre a masa de los huecos
y queda bastante compacta.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 11 de Diciembre de 2006, 07:29:54
Tiene muy pero muy buena pinta!
Este miercoles viajo a comprar componentes, y me traigo lo que me falte (el 16F88 entre otras cosas).
Carlos, podrias postear el PCB en PDF, para poder ir "quemandolo"?

Gracias!

PD: Y despues....a ir pensando en un protocolo para el soft!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2006, 08:42:29
Pues ahora no puedo porque estoy en el curro, luego al medio dia si me da tiempo, o sino ya tendra que ser a la noche.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2006, 11:38:06
De aqui podeis descargar el trabajo

http://www.mytempdir.com/1110168
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2006, 11:45:45
Lo dejo tambien aqui, porque el servidor del otro enlace tiene algun problema

http://rapidshare.com/files/7031258/PicEBasic_Entrenadora.pdf.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 14 de Diciembre de 2006, 09:03:30
Ya mande a pedir el pic y un LCD para  cuando tenga tiempo montar todo.

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Diciembre de 2006, 21:06:46
bien esteca, a mi tambien me faltan algunos componentes todavia y
mejor no tengas prisa hasta que le de el visto bueno.

a si es como esta quedando la plaquita, como podeis ver se monta bien
pero cuando pruebe mañana la parte de pistas por si acaso...  :D
hare esas pequeñas modificaciones, tambien me di cuenta que puedo suprimir
dos puentes mas facilmente, asi que tambien lo incorporare en las modificaciones.


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 14 de Diciembre de 2006, 22:17:26
Hola:

Te va quedando bien la placa Carlos, esperare las futuras versiones para hacerme la mia.  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: PalitroqueZ en 15 de Diciembre de 2006, 19:59:02
Hola amigos, viendo el empeño que le estan poniendo usando este simulador, voy a probar la versión demo del PIC18 Simulator IDE,  miré en la web principal: http://www.oshonsoft.com/pic18usb.html y al parecer tiene soporte para simular el módulo usb que traen algunos de la serie 18F, señores esta empresa se las trae, y el proteus como que se está quedando atrás, veamos que sucederá en versiones futuras.

Salu2
Pedro
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 15 de Diciembre de 2006, 20:11:24
Si, el PIC18 esta como para mirarlo....igual, me parece que viene muy atras del proteus, pero no nos olvidemos que aqui la simulacion es un "extra", el centro de esto es la programacion...

PD: No consigo hasta el martes mi 16F88 !!!!!! :( :( :(
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Diciembre de 2006, 20:28:39
Comprobado hasta ahora:

LCD
Retroiluminacion
y los I/O, leds
Contraste

Dejo unas fotos de como me quedo
me queda por llegar el zocalo de la pila y el reloj I2C



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 15 de Diciembre de 2006, 20:47:41
Ha quedado de maravillas....y en tiempo record!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 15 de Diciembre de 2006, 22:52:12
Hola:

Maestro entre maestros, te quedo muy chevere y muy compacta, esta como para hacerce una al instante  :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Diciembre de 2006, 23:26:25
Ya termine de probar el resto:
pin I/O, teclas
el adc
puerto serie

todo correcto a la primera...   :-)

en las pruebas del rs232, pude recibir mis propios datos (uni los pin tx con rx)
y visualizarlos en el lcd...  :D

pos listo voy a publicar la correccion de los tornillos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 16 de Diciembre de 2006, 02:45:56
todo correcto a la primera...   :-)

¡Qué raro!, a mí eso no me pasa nunca. Bueno, en honor a la verdad me pasó una vez y pensé: ¿qué habre hecho mal para que funcione a la primera?

Felicidades Carlos, está muy chula.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2006, 16:23:02
Si jeje, pura suerte...  :D

La nueva version de la plaquita:

http://www.mytempdir.com/1118866

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Diciembre de 2006, 19:08:30
Me indican que publique de nuevo la parte inferior de PCB como sigue:

    1º Todas las masas solidas
    2º Mayor separacion de pista de la isleta inferior del DB9

http://www.mytempdir.com/1124543

Color de los led:
    led amarillo RA7 (LED1)
    led verde RB0 (LED2)
    led Rojo del RTC (LED3)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Diciembre de 2006, 19:16:01
Ejemplo que utiliza el LCD y el ADC (utilizando el comando ADCIN):

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)**************************
'NOMBRE: 16F88_LCD_ADC_Decimales_01
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.41
'DESCRIPCION:
'Muestra en el display el valor de la entrada analogica con dos decimales y en voltios
'*****************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de control RW será del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg.
'**************************************DEFINICION DE PUERTOS*****************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analógico
Define ADC_SAMPLEUS = 10  'Configuración del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, mínimo permitido por el micro 1.5uSeg, configuración ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
'ANSEL = %00010000  'los pin I/O digitales y RA4 analógico
'ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (mínimo 1.uSeg), channel RA4
'ADCON1 = %01000000  'voltage reference (AVdd/AVss) y selección de escala división clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
Lcdinit  'inicializa el lcd sin cursor
'Variables del ADC y Rutina división------------------------------
Dim num_1 As Word  'valor del adc y retorna la parte entera
Dim num_2 As Word  'factor de la escala y retorna el primer decimal
Dim num_3 As Word  'segundo decimal
Dim dvdo As Word  'dividendo operación
Dim dvsor As Word  'divisor operación
'-------------------------------------------------------------------
WaitMs 1000  'espera 1Seg
Lcdout "16f88_LCD_ADC"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'selecciona la línea dos como próxima para escritura
Lcdout "Pruebas con ADC"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'--------------------------------------Main Programa-----------------------------------------------
main:
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub division_dos_decimales  'salto con retorno, rutina de conversión de valor adc a voltios
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100  'hace una pausa de 100mSeg
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrutinas**********************************************
'--------------------------------------Subrutina lectura ADC, división y LCD
lee_adc:  '_______________________lee la entrada analógica
Dim aux As Long
Adcin 4, num_1  'lee el valor de la entrada analógica y lo carga en num_1
aux = (500 * num_1) / 1023  'Pasa a formato de parte entera con dos decimales integrados
num_1 = aux
Return                                           
division_dos_decimales:  '________Rutina división con dos decimales
Dim resto As Word
dvdo = num_1  'asigna dividendo
dvsor = 100  'asigna divisor (dos decimales)
num_1 = dvdo / dvsor
resto = dvdo Mod dvsor
'Si resto es 0 se asignan valores
If resto = 0 Then
num_2 = 0
num_3 = 0
Endif
If resto = 0 Then Return  'Se sale de la subrutina
'Primer decimal
num_2 = resto * 10
num_2 = num_2 / dvsor
'Segundo decimal
num_3 = resto - (num_2 * 10)
Return                                           
print_lcd:  '____________________Muestra los datos por el display
Lcdcmdout LcdLine1Home  'Primera línea y cursor al principio
Lcdout "ENTR. ADC ", #num_1, ".", #num_2, #num_3, "V"  'Muestra los datos en el lcd
Lcdcmdout LcdLine2Home  'Segunda línea y cursor al principio
Lcdout "Lectura Pin RA4"  'muestra los datos en el lcd
Return                                       
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Diciembre de 2006, 22:42:49
Otro ejemplo, ahora para practicar con las teclas y los led.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_I/O_01
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.41
'DESCRIPCION: MUESTRA EN EL DISPLAY EL ESTADO DE LA TECLA ACTIVANDO EL LED ASOCIADO
'***************************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00000000  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
Lcdinit  'inicializa el lcd sin cursor
'***********************************DEFINICION DE VARIABLES**************************************
'--------------------------------------Variables Programa----------------------------------------
Dim tecla_s1 As Byte  'guarda el estado de la tecla hasta terminar la maniobra
Dim tecla_s2 As Byte  'guarda el estado de la tecla hasta terminar la maniobra
'------------------------------------------ASIGNACIONES------------------------------------------
tecla_s1 = 0
tecla_s2 = 0
WaitMs 1000  'espera 1Seg
Lcdout "16f88_LCD_I/O"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I/O"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'--------------------------------------Main Programa-----------------------------------------------
main:
If RA6 = 0 Then tecla_s1 = 1  'lee el estado de la tecla S1
If RA5 = 0 Then tecla_s2 = 1  'lee el estado de la tecla S2
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100
If tecla_s1 = 1 Then  'si la tecla S1 fue pulsada
Toggle RA7  'invierte el estado de RA7, led amarillo
tecla_s1 = 0  'tecla queda en reposo
Endif
If tecla_s2 = 1 Then  'si la tecla S2 fue pulsada
Toggle RB0  'Invierte el estado de RB0, led verde
tecla_s2 = 0  'tecla queda en reposo
Endif
WaitMs 100  'hace una pausa de 100mSeg
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
print_lcd:  '____________________Muestra los datos por el display
Lcdcmdout LcdLine1Home  'Primera linea y cursor al principio
Lcdout "  S1 ", #tecla_s1, " -- S2 ", #tecla_s2  'imprime en el lcd
Lcdcmdout LcdLine2Home  'Segunda linea y cursor al principio
Lcdout "----------------"  'Muestra los datos en el lcd
Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Diciembre de 2006, 13:12:02
Bien, ya termine de probar el Reloj (DS1307) y todo ok.

Proximamete cuando termine de sanear el programa de ejemplo del RS232 y del RTC, los publico.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Diciembre de 2006, 13:14:14
Y por supuesto un ejemplo para asociar la resistencia ajustable de la entrada analogica al control de iluminaicon del display por PWM...  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Diciembre de 2006, 23:21:27
El programita que sirve para probar el reloj:


Código: [Seleccionar]
'************************* PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_RTC
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.41
'Descripcion: muestra en el display la fecha y la hora.
'Para transferir la hora al reloj dejar pulsada la tecla S1
'***************************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A
'Define LCD_RWBIT = 5 'se usara el RA5 como RW
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'Asignacion de I/O y valores de inicio de las salidas
ANSEL = %00000000  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'------------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
WaitMs 1000  'Espera 1Seg
Lcdout "16f88LCD_RTC/I2C"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Selecciona la linea dos como proxima para escritura
Lcdout "Pruebas con I2C"  'Escribe en el lcd
WaitMs 3000  'Espera 3Seg
Lcdcmdout LcdClear
'Puerto I2C ---------------------------------------------------------
Symbol sda = PORTB.1  'Asignamos nombre al pin que hara de sda del puerto i2c
Symbol scl = PORTB.4  'Asignamos nombre al pin que hara de SCL del puerto I2C
'Variables Generales -------------------------------------------
Dim aux_4h As Byte  'Contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'Contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'Variable indice
Dim reg(7) As Byte  'Contendra los valores finales de fecha y hora en el sistema decimal
'Inicializacion del reloj -------------------------------------------
'Aqui escribimos los valores para cargar al RTC ------
If RA6 = 0 Then  'Si la tecla S1 esta pulsada pasaremos los datos al reloj
I2CWrite sda, scl, 0xd0, 0, 0x00  'Segundos, escrito en hex, porque coincide en este caso con BCD del RTC
I2CWrite sda, scl, 0xd0, 1, 0x59  'Minutos
I2CWrite sda, scl, 0xd0, 2, 0x23  'Horas
I2CWrite sda, scl, 0xd0, 3, 0x01  'Dia de la semana
I2CWrite sda, scl, 0xd0, 4, 0x31  'Dia del mes
I2CWrite sda, scl, 0xd0, 5, 0x12  'Mes
I2CWrite sda, scl, 0xd0, 6, 0x06  'Año
I2CWrite sda, scl, 0xd0, 7, 0x10  'Salida a 1hz
Endif
'Bucle principal -----------------------------------------------------
main:
Gosub print_lcd  'Actualiza la hora
WaitMs 100  'Pausa de 100mSeg.
Goto main
End                                               
'**************************************Subrutinas**********************************************
print_lcd:  'Lee la hora del RTC, la pasa a decimal y la envia al lcd
i = 0
While i <= 6  'Se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
I2CRead sda, scl, 0xd0, i, reg(i)  'Lectura de la direccion de memoria indicada del RTC, formato BCD
aux_4l = reg(i) And %00001111  'Eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'Segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %11110000  'Minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %10110000  'Horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %11110000  'Dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %11110000  'Dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %11110000  'Mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'Año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'Convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'Fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'Incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'Fin del bucle y salta a While
Lcdcmdout LcdLine1Home  'Cursor del lcd a la izquierda en la linea 1
If reg(2) < 10 Then Lcdout "0"  'Si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2), ":"  'Escribe la hora y el separador
If reg(1) < 10 Then Lcdout "0"  'Si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1), ":"  'Escribe los minutos y el separador
If reg(0) < 10 Then Lcdout "0"  'Si segundos es inferior a 10 escribe el cerodelante
Lcdout #reg(0)  'Escribe los segundos
Lcdcmdout LcdLine2Home  'Cursor del lcd a la izquierda en la linea 2
If reg(3) = 1 Then Lcdout "Dom"  'Asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun"
If reg(3) = 3 Then Lcdout "Mar"
If reg(3) = 4 Then Lcdout "Mie"
If reg(3) = 5 Then Lcdout "Jue"
If reg(3) = 6 Then Lcdout "Vie"
If reg(3) = 7 Then Lcdout "Sab"
Lcdout "/"  'Escribe separador
If reg(4) < 10 Then Lcdout "0"  'Si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4), "/"  'Escribe el dia del mes y el separador
If reg(5) < 10 Then Lcdout "0"  'Si mes es inferior a 10 escribe cero
Lcdout #reg(5), "/20"  'Escribe el mes, separador y los dos primeros digitos del año de 4 digitos
If reg(6) < 10 Then Lcdout "0"  'Si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'Escribe el año
Return

PD: Recuerdo que los registros del RTC DS1307 se programan y se leen en BCD.

PD: 03/06/08
      I2CWrite sda, scl, 0xd0, x, x
      I2CRead sda, scl, 0xd1, x, x
      0xd0 = %11010000 => Seleccion del chip DS1307 y modo escritura
      0xd1 = %11010001 => Seleccion del chip DS1307 y modo lectura
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead, por lo que su valor
      es indiferente, la funcion I2CWrite lo pondra a valor "0" de forma automatica y al ser compilada tambien I2CRead lo colocara a 1.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Enero de 2007, 17:00:09
Aquí esta el ejemplo para practicar con el puerto físico RS232 del microcontrolador
es un poco largo pero he intentado aclararlo lo máximo posible con los comentarios en programa.

Este programa requiere mucha velocidad de clock, yo lo utilizo normalmente a 20Mhz



Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC ***************************************
'NOMBRE: 16F88_LCD_RS232_01
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 1/07, By COS, PSI v7.41
'DESCRIPCION: MUESTRA EN EL DISPLAY DE 16x2, LOS CARACTERES RECIBIDOS POR RS232 Y ENVIA OTRA CADENA FIJA
'tiempo de lectura entre byte y byte del puerto serie 10mseg maximo si no hay datos
'************************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'**************************************DEFINICION DE PUERTOS*************************************
'Asignacion de I/O y valores de inicio de las salidas---------------------
ANSEL = 0x00  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCIONES------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Lcdinit  'inicializa el LCD sin cursor
Hseropen 4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
'Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
'--------------------------------------Declaracion DE VARIABLES-------------------------------------
'Variables subrutinas del puerto serie-----------------------------------
Dim assi As Byte  'Contiene el valor de lectura del puerto serie
Dim n_usart As Byte  'Numero de datos del USART y del bufer IMAGEN de control
Dim usart As Byte  'Variable indice que apunta al ultimo dato adquirido por la USART
Dim aux_usart As Byte  'Auxiliar de la variable indice usart del USART
Dim c_serial As Byte  'Como USART pero para la lectura de control del bufer IMAGEN
Dim bufer As Byte  'Indica si hay datos por leer en el bufer USART
Dim w_posrx As Byte  'Tiempo entre lectura y lectura del bufer
Dim n_aux As Byte  'contador para borrar el bufer_soft
'Variables de los timer---------------------------------------------------
Dim aux_pause As Word  'variable auxiiar el PAUSE
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Byte  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos en ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'Variables rutina muestra datos en el LCD
Dim n As Byte  'se utiliza para posicionar caracter en el lcd
Dim flag As Byte  'controla la alternancia para imprimir en el lcd el caracter "(" o el ")"
Dim flag_1 As Byte  'controla la alternacia entre secuencia 1 y 2, tramas tx
'Variables tipo array puerto serie----------------------------------
Dim usart_imagen(91) As Byte  'Componen el bufer IMAGEN para control del bufer USART
Dim usart_bufer(91) As Byte  'Componen el bufer de la USART de bajo nivel
'ASIGNACIONES-----------------------------------------------
'Variables del contador del TIMER1------------------------------
timer_base = 0
aux_pause = 0
pause = 0
timer_1ms = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'cuenta 100mSeg
timer1_ms_tiempo = 5  'cuenta 5mSeg.
timer2_ms_tiempo = 100  'cuenta 0.1Seg
timer3_ms_tiempo = 100  'cuenta 0.1Seg
timer1_100ms_tiempo = 10  'cuenta 1Seg.
timer2_100ms_tiempo = 5  'temporiza 0.5Seg
timer3_100ms_tiempo = 5  'temporiza 0.5seg
'-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
usart = 0
aux_usart = 0
c_serial = 0
bufer = 0
n_usart = 90
assi = 0
w_posrx = 10  '10mSeg rf, se espera un maximo de tiempo antes de leer el bufer si no hay datos
n_aux = 0
'-------------------------------------AsignA valores a las variables del TIMER1---------------------
'--------------------------------------asignacion de valores generales-----------------------------
n = 0
flag = 0
flag_1 = 0
'----------------------------------------------------------------
'Enable  'INTCON.GIE habilita las interrupciones globales
Gosub clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
Enable  'INTCON.GIE habilita todas las interrupciones globales
pause = 1000  'prepara una pausa de 1Seg
Gosub pause_ms  'espera el tiempo que indica pause
Lcdout "18F88_LCD_RS232"  'imprime en el LCD el literal
Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
Lcdout "RS232-4800Baud."  'escribe la cadena de literales en el lcd
Hserout CrLf, CrLf, "VER. 1.0 - TX/RX", CrLf, "TX -> PRUEBAS RS232", CrLf, "By COS", CrLf, CrLf  'envia presentacion al RS232
Gosub clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
pause = 3000  'prepara una pausa de 3Seg.
Gosub pause_ms  'hace una pausa de tiempo indicado por pause
Lcdcmdout LcdClear  'borra el display
'--------------------------------------Main Programa----------------------------------------------------
main:
If timer2_100ms >= timer2_100ms_tiempo And flag_1 = 0 Then  'determina cuando emitir la secuencia_1
Gosub secuencia_1
timer2_100ms = 0
flag_1 = 1  'activa la alternancia entre secuencia_1 y la 2
Endif
If timer2_100ms >= timer2_100ms_tiempo And flag_1 = 1 Then  'determina cuando emitir la secuencia_2
Gosub secuencia_2
timer2_100ms = 0
flag_1 = 0  'activa la alternancia entre secuencia_1 y la 2
Endif
Gosub lcd_control
Goto main
End                                               
'--------------------------------------FIN DEL MAIN-------------------------------------------
'--------------------------------------Subrutinas Programa-----------------------------------------------
secuencia_1:  'envia la trama por el puerto serie
Hserout "@Hola Amigos de TODOPIC", CrLf
Return                                           
secuencia_2:  'envia la trama por el puerto serie
Hserout "@Ejemplo de Trabajo con RS232", CrLf
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= pause  'tiempo en mSeg maximos a contar
aux_pause = aux_pause + 1  'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0  'al borrar el contador se activa y cuenta 1mSeg
While timer_1ms < 1  'espera un miliesegundo
Wend
Wend
Return                                           
pause_ms_rx:  'rutina de espera antes de leer el bufer, w_posrx establese el tiempo total en mSeg
If bufer < 1 Then
aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= w_posrx  'tiempo en mSeg maximos a contar
If bufer > 0 Then aux_pause = w_posrx  'si entran datos en el bufer se termina el contaje
aux_pause = aux_pause + 1  'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0  'al borrar el contador se acitva y cuenta 1mSeg
While timer_1ms < 1  'espera un miliesegundo
Wend
Wend
Endif
Return                                           
'------------------------------ rutinas para el control del bufer del puerto serie-------------
readserial:
'RUTINA DE LECTURA DEL BUFFER DEL PUERTO SERIE (ASSI)
Gosub pause_ms_rx  'valor de entrada en mSeg de espera definido por w_posrx
assi = 0  'se borra el valor de assi, no se debe de utilizar cero como un valor de control
If bufer = 1 Then  'si bufer tiene datos
assi = usart_bufer(c_serial)  'se lee el valor del bufer y se asigna assi
usart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
c_serial = c_serial + 1  'se incrementa el indice del bufer
If c_serial >= n_usart Then c_serial = 0  'se verifica si se llego al final del bufer
If usart_imagen(c_serial) = 0 Then bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
Endif
Return                                           
clear_bufer:  'inicializa el bufer imagen y borra error del puerto fisico en modo Rx
'_________________________Borra el error del puerto serie en Rx
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
'_________________________Borra e inicializa el bufer imagan del puerto serie
c_serial = 0
While c_serial <= n_usart  'se ejecuta tantas veces como variables tiene el bufer
usart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del bufer
usart = 0
bufer = 0
assi = 0
Return                                           
'--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
'*****************************base de tiempos********************************************
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion la proboco el timer1
timer_base = timer_base + 1  'base patron
If timer_1ms < 1 Then timer_1ms = timer_1ms + timer_1ms + 1  'contador para control del timer_1ms
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'contador para control del timer1_ms
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'contador para control del timer2_ms
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'contador para control del timer3_ms
If timer_base >= timer_base_tiempo Then  'usa la base patron para retrazar la rutina 100mSeg.
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'contador para control...
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'contador para control...
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'contador para control...
timer_base = 0  'reset a la base timer
Endif
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
Endif
'*****************************Fin base de tiempos****************************************
'*****************************BUFFER PUERTO SERIE****************************************
If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USAR
If usart < n_usart Then  'comprueba que el bufer de entrada no esta lleno
If usart_imagen(usart) = 0 Then  'comprueba que la posicion esta vacia
aux_usart = usart  'retiene la posicion antigua del bufer
usart = usart + 1  'indica cual sera la posicion siguiente del bufer
usart_imagen(aux_usart) = 1  'indica que hay dato en el bufer de entrada
bufer = 1  'indica que el bufer tine datos
Hserget usart_bufer(aux_usart)  'carga el dato en el bufer
Else
Hserget usart_bufer(n_usart)  'descarga la usart para que no se bloquee porque el bufer de entrada esta lleno
Endif
Else
If usart_imagen(0) = 0 Then  'comprueba que esta vacia la primera posicion del bufer
usart_imagen(0) = 1  'marca que hay dato en esa posicion del bufer
bufer = 1  'marca que el bufer tiene datos
usart = 1  'establece la proxima posicion del bufer
Hserget usart_bufer(0)  'lee la usart y guarda el dato en el bufer
Else
Hserget usart_bufer(n_usart)  'descarga la usart porque el bufer esta lleno
Endif
Endif
Endif
'_________________________Borra el error del puerto serie en Rx
If RCSTA.OERR = 1 Then
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
'_________________________Borra e inicializa el bufer imagan del puerto serie
c_serial = 0
While c_serial <= n_usart  'se ejecuta tantas veces como variables tiene el bufer
usart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del bufer
usart = 0
bufer = 0
assi = 0
Endif  '____________________
If PIR1.TMR1IF = 1 Then PIR1.TMR1IF = 0  'borra el bit de salto del timer1
If PIR1.RCIF = 1 Then PIR1.RCIF = 0  'borra el bit de salto del Rx
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
lcd_control:  'rutina que imprime los valores recibidos por el puerto serie en el display
'parte 1 de la rutina, sincroniza e imprime los caracteres recibidos por el puerto serie
If bufer = 1 Then  'la rutina se ejecuta si hay datos en el bufer
timer1_100ms = 0  'hay datos hace reset al timer1_100ms
Gosub readserial  'salta a la rutina de lectura del bufer serie
If assi = "@" Then  'caracter de sincronismo de la trama
n = 0  'possicion del display
Lcdcmdout LcdClear  'borra el display y posiciona el cursor superior izquierda
Endif
n = n + 1  'incrementa la posicion para escribir el siguiente caracter en le display
If assi > 31 And assi < 128 And assi <> "@" Then  'filtra los caracteres a imprimir
Lcdout assi  'escribe el caracter del bufer en el display
Endif
If n = 16 Then  'detecta fin de la linea primera
Lcdcmdout LcdLine2Home  'situa el cursor al principio de la siguiente linea
Endif
If n >= 32 Then  'detecta fin de la segunda linea
n = 0  'inicializa la posicion del proximo caracter a imprimir en el display
Lcdcmdout LcdHome  'a inicio de linea
Endif
Endif
'parte 2 de la rutina, cuando no se reciben datos imprime en el display "(" y ")" de forma alterna
If timer1_100ms >= timer1_100ms_tiempo Then  'produce un retrazo inicial a la ejecucion de la rutina
If bufer = 0 Then  'si no hay datos en el bufer
If timer1_ms >= timer1_ms_tiempo Then  'produce un retrazo cada vez que se intenta imprimir en el lcd
timer1_ms = 0  'resetea el timer1_ms para que cuente de nuevo
If flag = 0 Then  'produce la alternancia para escribir "("
n = n + 1
Lcdout "("
If n = 16 Then
Lcdcmdout LcdLine2Home
Endif
If n >= 32 Then
n = 0
flag = 1
Lcdcmdout LcdHome
Endif
Endif
If flag = 1 Then  'produce la alternancia para escribir ")"
n = n + 1
Lcdout ")"
If n = 16 Then
Lcdcmdout LcdLine2Home
Endif
If n >= 32 Then
n = 0
flag = 0
Lcdcmdout LcdHome
Endif
Endif
Endif
Endif
Endif
Return


PD: donde decia:
"Symbol led_amarillo = PORTA.7 'led amarillo a off", es "Symbol led_amarillo = PORTA.7 'led amarillo"
"Symbol led_verde = PORTB.0 'led verde a off", es "Symbol led_verde = PORTB.0 'led verde"
"timer2_100ms_tiempo = 5 'temporiza 1Seg", es "timer2_100ms_tiempo = 5 'temporiza 0.5Seg",
"timer3_100ms_tiempo = 5 'temporiza 1seg", es "timer3_100ms_tiempo = 5 'temporiza 0.5Seg",

Errores de usar "COPY y PASTE" del editor del compilador del basic... :mrgreen:

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Enero de 2007, 22:41:54
Y ahora mezclando rutinas anteriores mediante la variación de la resistencia ajustable
de la placa, vario la iluminación del lcd.
La señal generara para el control de la iluminación es un PWM de un periodo de 20mSeg.
basado en las bases de tiempos generadas por el Timer1.

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_LCD_Timer1_ADC_PWM_01
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.0
'Fecha/Autor: 1/07, By COS, PSI v7.41
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'Activación del Timer1 por rebose cada 1mSeg.
'implementación de bases de tiempos por soft, basadas en el Timer1
'lectura de entrada analógica y conversión a voltaje con dos decimales
'Implementacion de PWM con periodo de 20mseg. para el control de la luz del lcd por medio de la entrada adc
'***********************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'------------------------------------Definición de puertos------------------------------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
Define ADC_SAMPLEUS = 10  'Configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________Registros afectados por Define ADC_CLOCK y ADCIN________________
'ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
'ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
'ADCON1 = %01000000  'Voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'Comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off, negado
PORTB.0 = 1  'Led verde a off, negado
'Inicialización de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1, se incrementa cada ciclo de instrucción
T1CON.T1CKPS0 = 0  'Factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'Factor del preescales del timer1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'Habilitación del TMR1, comienza a incrementarse
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
'Enable  'INTCON.GIE habilita todas las interrupciones globales
'Inicio-------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
WaitMs 500  'Pausa para estabilizar
'Reasignación de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
Symbol luz_lcd = PORTB.3  'Retroiluminacion del lcd
'Declaracion de variables --------------------------------------
'Variables de los timer -----------------------------------------
Dim timer_base As Byte  'Tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'Contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'Base de tiempos en ms
Dim timer2_ms As Word  'Base de tiempos en ms
Dim timer3_ms As Word  'Base de tiempos en ms
Dim timer1_100ms As Byte  'Base de tiempos msx100
Dim timer2_100ms As Byte  'Base de tiempos msx100
Dim timer3_100ms As Byte  'Base de tiempos msx100
Dim timer1_ms_tiempo As Word  'Contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'Contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'Contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer3_100ms
'Variables del ADC y Rutina division------------------------------
Dim num_1 As Word  'Valor del adc y retorna la parte entera
Dim num_2 As Word  'Factor de la escala y retorna el primer decimal
Dim num_3 As Word  'Segundo decimal
'Variables generales-----------------------------------------------
Dim flag_1 As Byte  'Determina si la luz del lcd estará a on o a off
Dim adc_4 As Word  'Contiene el valor de la entrada ADC
'Asignacion de valores a las variables--------------------------
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'Cuenta 100mSeg
timer1_ms_tiempo = 1  'Cuenta 1mSeg.
timer2_ms_tiempo = 19  'Cuenta 19mSeg
timer3_ms_tiempo = 5  'Cuenta 5mSeg
timer1_100ms_tiempo = 10  'Cuenta 1 Seg.
timer2_100ms_tiempo = 20  'Temporiza 2Seg
timer3_100ms_tiempo = 1  'Temporiza 0.1seg
flag_1 = 0
adc_4 = 0
Enable  'INTCON.GIE habilita todas las interrupciones globales
'Rutinas Pricipal----------------------
main:
If timer1_100ms >= timer1_100ms_tiempo Then  'Cambio de estado el pin RA7 cada timer1_100ms_tiempo
Toggle led_amarillo
timer1_100ms = 0  'Reinicio el timer1_ms
Endif
If timer2_100ms >= timer2_100ms_tiempo Then  'Cambio de estado el pin RB0 cada timer2_100ms_tiempo
Toggle led_verde
timer2_100ms = 0  'Reinicio el timer2_100ms
Endif
If timer3_100ms >= timer3_100ms_tiempo Then
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub division_dos_decimales  'Salto con retorno, rutina de conversion de valor adc a voltios
Gosub print_lcd  'Salto con retorno, rutina que imprime los valores en el lcd
timer3_100ms = 0
'__________Control de los tiempos del PWM con un periodo de 20mSeg segun el valor de adc_4
timer2_ms_tiempo = (adc_4 * 20) / 1023  'Controla el tiempo del PWM en estado alto, periodo 20mSeg
timer1_ms_tiempo = 20 - timer2_ms_tiempo  'Controla el tiempo del PWM en estado bajo, periodo 20mSeg
'___________________________________________________
Endif
Goto main  'Impide que termine el programa principal
End  'Especifica donde termina la rutina principal y comienzan las subrutinas y funciones
'Subrutina lectura ADC, division y LCD
lee_adc:  '_______________________Lee la entrada analogica
Dim aux As Long
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo carga en adc_4
aux = (500 * adc_4) / 1023
num_1 = aux  'Sede el valor del adc para ser procesado
Return                                           
division_dos_decimales:  '________Rutina division con dos decimales y conversion a voltios
Dim resto As Word
Dim dvdo As Word
Dim dvsor As Word
dvdo = num_1  'Asigna dividendo
dvsor = 100  'Asigna divisor, dos decimales
num_1 = dvdo / dvsor  'Calcula parte entera
resto = dvdo Mod dvsor  'Calcula resto
If resto = 0 Then Return  'Se sale de la subrutina
num_2 = resto / 10  'Asigna primer decimal
num_3 = resto - (num_2 * 10)  'Asigna el segundo decimal
Return                                           
print_lcd:  '____________________Muestra los datos por el display
Lcdcmdout LcdLine1Clear  'Borra la primera linea y cursor al principio
Lcdout "ADC ", #adc_4, " ", #num_1, ".", #num_2, #num_3, "V", "   "  'Muestra los datos en el lcd
Lcdcmdout LcdLine2Clear  'Borra la segunda linea y cursor al principio
Lcdout "LCD On ", #timer2_ms_tiempo, " Off ", #timer1_ms_tiempo, " "  'Muestra los datos en el lcd
Return                                           
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'Comprueba que la interrupcion del timer1 es activa
TMR1H = 0xf8  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
'__________________Base de tiempos
timer_base = timer_base + 1
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1
If timer_base >= timer_base_tiempo Then
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1
timer_base = 0
Endif
'_________________Control fisico de la retroiluminaicon del lcd
If timer1_ms >= timer1_ms_tiempo And flag_1 = 0 Then  'Tiempo en el que estara el lcd apagado
luz_lcd = 1  'Retroiluminacion a on
flag_1 = 1  'Controla la alternancia entre lcd iluminado o apagado
timer2_ms = 0  'Reinicio el timer2_ms
Endif
If timer2_ms >= timer2_ms_tiempo And flag_1 = 1 Then  'Tiempo en el que estara el lcd iluminado
luz_lcd = 0  'Retroiluminacion a off
flag_1 = 0  'Controla la alternancia entre lcd iluminado o apagado
timer1_ms = 0  'Reinicio el timer1_ms
Endif
'_____________________________________________________
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
Endif
Resume  'Activa las interrupciones y retorna al curso normal del programa antes del salto

PD: Donde decia:
"timer2_ms_tiempo = 19   'cuenta 1mSeg", ahora dice "timer2_ms_tiempo = 19   'cuenta 19mSeg"
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: navaismo en 01 de Enero de 2007, 23:37:37
Este Proyecto refleja de manera al parecer "sencilla" cosa que no lo es tanto, los alcances del BASIC y que decir del maestrazo DOGFLU y su sabiduria. Enhorabuena y excelente proyecto :-/ !!!!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: cchhaa en 02 de Enero de 2007, 08:35:04
coincido con navaismo, que facil se ve el trabajo una vez hecho y lo complicado se se hace cuando se empieza desde cero.

ENHORABUENA CALOS y sobretodo GRACIAS por iluminarnos el camino.


un saludo
cchhaa
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Enero de 2007, 18:41:04
Gracias amigos, pero creo que no es para tanto... pero de todas formas hicieron que engordara mi ego 3kgr. de golpe.. jeje.

Un poco de auto-conciencia:

Mi intención con este tipo de ejercicios es la de ocupar un pequeño hueco, en el proceso del aprendizaje en la confección de un programa, ya que podemos encontrar muchos ejercicios simples, en los que no se cuida unas buenas maneras en el proceso de estructurar un programa. Todos de una manera u otra comenzamos con ese tipo de ejercicios simples, pero el uso abusivo de ellos nos suele llevar a unas malas costumbres a la hora de organizar y confeccionar un programa que realmente sea extenso, que a la larga, y peor aun, con tiempo limite de desarrollo, nos producirá verdaderos dolores de cabeza y ya puestos también hay que recordar que es posible que tengamos que mantener/ampliar ese código.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 02 de Enero de 2007, 18:54:18
Hola:

Modestia aparte Carlos, estos ejemplos sirven mucho para quienes se inicien en un compilador, cualquiera que este sea, ademas la unica ves que estuve probando este Pic simulator IDE me lleve una gran desilucion con respecto a la ayuda, en realidad no dice mucho, y es mejor cuando se aprende de alguien que ya tiene experiencia y se ha tomado las molestias de hacer un poco de cosas como los ejemplos que tu has posteado, animo con esa misma energia maestro  :mrgreen: :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 02 de Enero de 2007, 20:03:54
Ha sido un trabajo excelente. Yo me siento algo culpable por que tire la idea, y como decimos por aqui "me borre" del foro por unos dias.
Realmente ha quedado barbaro!

Nocturno: la ayuda del PIC BASIC este es muy escueta, pero el producto es solido, no tiene cuelgues ni fallas (al menos, no se las he encontrado). Por eso es que me he puesto en los pocos ratos libres a escribir algunas guias sobre el para los que se quieran enganchar con el. ;)

Saludos. :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Enero de 2007, 20:17:09
jeje, yo entre en esto como de medio rebote, pero estoy disfrutando mucho..  :D :mrgreen:

Y para no perder la costumbre del foro de robotica un video del invento..  :D :D :D :D

http://www.mytempdir.com/1146434
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 02 de Enero de 2007, 20:22:12
Nocturno:

Hola:

Amigo Ariel, desempañate los lentes que no ha sido Nocturno sino un Humilde servidor  :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 02 de Enero de 2007, 20:39:43
jeje, yo entre en esto como de medio rebote, pero estoy disfrutando mucho..  :D :mrgreen:

Y para no perder la costumbre del foro de robotica un video del invento..  :D :D :D :D

http://www.mytempdir.com/1146434


Hola:

Se ve muy chevere la placa master, mejor que en las fotos, y que decir de su funcionamiento  8)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Enero de 2007, 20:57:40
Hablando de videos, Master te recuerdo que tienes videos pendientes....  :P
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 02 de Enero de 2007, 21:06:43
Hola:

Ya los ire poniendo  :oops: :oops: :oops:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 03 de Enero de 2007, 02:50:59
Arieeeeeel, deja el tinto hombreeeeeee...  :mrgreen:

Maestro Carlos, deberías probar subir los vídeos a Youtube. Es mucho más cómo para su visualización y no caducan. Enhorabuena por el proyecto.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Enero de 2007, 10:18:21
Bueeeeno!! Hic!
Al fin y al cabo, "solo" le erre por unos miles de km... ;)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ascii en 03 de Enero de 2007, 12:53:01
 :shock: muy buen proyecto Felicidades  :P
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: PalitroqueZ en 03 de Enero de 2007, 14:45:49
Felicitaciones dogflu66, muy instructivo. 8)

Salu2
Pedro

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 03 de Enero de 2007, 14:53:37
Hola Todos

Muy buen trabajo dogflu66!!!

En cuento regrese a cordoba de seguro me pondre a armar una de estas placas, asi comienso con las practicas


Saludos (desde La Pampa arg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Enero de 2007, 18:55:19
 :oops: :oops: :oops:


Segui la recomendacion del Maistro Manolo y deje el video en YouTube

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Carli en 23 de Enero de 2007, 23:28:56
Hola, estoy renegando con un LCD que no puedo hacer andar  :8}

Con este codigo:

Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

En que puertos tengo que conectar los d4, d5, d6 y d7 del LCD, o que me falta completar en el codigo.  :z)

Desde ya muchas gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 24 de Enero de 2007, 04:56:42
Hola Carlos!
La conexion de los datos seria:

B4 -> D4
B5 -> D5
B6 -> D6
B7 -> D7

Si no ves nada, asegurate de tener bien los 3 pines de control, y el tema del ajuste del contraste.
¿No se ve nada, o se ve la linea superior ennnegro y la de abajo en blanco? (si es asi, es el contraste seguramente)

Suerte! :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Carli en 24 de Enero de 2007, 09:00:19
Ariel, disculpa mi @%&·$".

Con B$ querés decir Portb.4, por que si es así lo tengo ocupado para la coneccion "E"

Disculpen la ignorancia!!!!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Febrero de 2007, 21:46:57
Aqui dejo un ejemplito:
-Ya se puede cambiar la hora del reloj
-Los datos a cambiar quedan en modo parpadeo
-Se modifican solo con dos teclas
-Las teclas responden muy bien, sin fallos, si pulsas rapido respondes rapidas y si pulsas lento van lentas.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)**************************
'NOMBRE: 16F88_LCD_RTC_12
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS, PSI v7.71
'Vercion 1.2, 18/02/07
'Correccion de fallo en la rutina de lectura de los registros del RTC
'correccion de fallo en la rutina de modificacion de los registros del RTC
'Modificacion de la rutina de configuracion del reloj
'Se trucan todas las posiciones que no usan los registro del RTC, rutina de lectura del RTC
'Se elimina la variable aux1_ajuste
'Version 1.1, 12/02/07
'Se cambia el formato del dia
'Se implementan bases de tiempos, para el control del flujo de las rutinas
'Se incorpora la rutina pause
'Se cambian la funcion de las teclas S1 y S2 pulsadas al mismo tiempo, ahora entramos en programacion
'Una vez en programacion con S1 seleccionamos el dato a cambiar, este queda en modo parpadeo
'Una vez en programacion con S2 incrementamos el dato seleccionado dentro de sus cotas
'Version 1.0
'Descripcion: muestra en el display la fecha y la hora en formato de 24 horas
'para transferir la hora al reloj dejar pulsada la tecla S1
'*******************************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Solo para simulación, acelera los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'Asignacion de nombres
Symbol sda = PORTB.1  'Asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.4  'Asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
Symbol luz_lcd = PORTB.3  'Retroiluminacion del lcd
Symbol s1 = RA6  'Se asigna nombre a la tecla
Symbol s2 = RA5  'Se asigna nombre a la tecla
'Asignacion de I/O y valores de inicio de las salidas
ANSEL = %00000000  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'Inicializacion de Interrupciones
T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'Factor del preescales del timer1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'Habilitacion del TMR1, comienza a incrementarce
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
'-------------------------------------------------------------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
'-------------------------------------------------------------------------------------------------------------------------
'Definicion de variables
'Variables de los timer
Dim aux_pause As Word  'Variable auxiiar el PAUSE
Dim pause As Word  'Contiene el valor para simular el comando Waitms
Dim timer_1ms As Byte  'Base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_base As Byte  'Tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'Base de tiempos en ms
Dim timer2_ms As Word  'Base de tiempos en ms
Dim timer3_ms As Word  'Base de tiempos ms
Dim timer1_100ms As Byte  'Base de tiempos msx100
Dim timer2_100ms As Byte  'Base de tiempos msx100
Dim timer3_100ms As Byte  'Base de tiempos msx100
Dim timer1_ms_tiempo As Word  'Contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'Contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'Contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer3_100ms
'Variables Programa
Dim aux_4h As Byte  'Contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'Contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'Variable indice
Dim reg(7) As Byte  'Contendra los valores finales de fecha y hora en el sistema decimal
Dim flash_1 As Bit  'Controla el parpadeo de los digitos del lcd, activo a 1
Dim dato As Byte  'Indica la direccion del RTC a cambiar de valor
Dim flag_1 As Bit  'Activa la rutina de ajuste del reloj, activo a 1
Dim s1_on As Bit  'Tecla pulsada si s1_on=1
Dim s2_on As Bit  'Tecla pulsada si s2_on=1
Dim aux_ajuste As Byte  'Variable auxiliar para la rutina de ajuste
'Asignacion de valores a las variables
s1_on = 0
s2_on = 0
dato = 7  'Fuera de ajuste o modo normal de trabajo del reloj, de 0 a 6 modo ajuste
flash_1 = 0
flag_1 = 0
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'Cuenta 100mSeg
timer1_ms_tiempo = 50  'Cuenta 50mSeg.
timer2_ms_tiempo = 500  'Cuenta 500mSeg
timer3_ms_tiempo = 5  'Cuenta 5mSeg
timer1_100ms_tiempo = 10  'Cuenta 1 Seg.
timer2_100ms_tiempo = 20  'Temporiza 2Seg
timer3_100ms_tiempo = 1  'Temporiza 0.1seg
'---------------------------------------------------------------------------------------
Enable  'INTCON.GIE habilita todas las interrupciones globales
pause = 1000
Gosub pause_ms  'Espera el tiempo indicado en pause
Lcdout "16f88LCD_RTC/I2C"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I2C"  'Sscribe en el lcd
pause = 3000
Gosub pause_ms  'Wspera el tiempo indicado en pause
Lcdcmdout LcdClear  'Borra el display y cursor a casa
'Bucle principal
main:
If s1 = 1 And s1_on = 1 Then s1_on = 0  'Libera el pulsador S1, control anti-rebotes tecla
If s2 = 1 And s2_on = 1 Then s2_on = 0  'Libera el pulsador S2, control anti-rebotes tecla
If s1 = 0 And s2 = 0 And s1_on = 0 And s2_on = 0 And flag_1 = 0 Then  '________Modo ajuste
flag_1 = 1  'Activa la rutina de ajustes
dato = 0  'Activo cambio de la hora
timer1_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S1
timer3_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S2
s1_on = 1  'Bloquea la tecla S1, elimina rebotes
s2_on = 1  'Bloquea la tecla s2, elimina rebotes
Endif  '___________________
If flag_1 = 1 Then Gosub ajuste_reloj  '__________Saltamos a la rutina de ajuste
If timer3_100ms >= timer3_100ms_tiempo Then  'Actualiza datos en el lcd cada 100ms
Gosub lee_hora  'Lee la fecha y hora del reloj
Gosub print_lcd  'Actualiza los datos del reloj en el display
timer3_100ms = 0
Endif  '__________________
Goto main
End                                               
'**************************************Subrutinas**********************************************
ajuste_reloj:  'Rutina de ajuste del reloj
If s1 = 1 And s1_on = 1 Then s1_on = 0  'Libera el pulsador S1, control anti-rebotes tecla
If s2 = 1 And s2_on = 1 Then s2_on = 0  'Libera el pulsador S2, control anti-rebotes tecla
'________________________Control posicion del dato a variar en el reloj
If s1 = 0 And s1_on = 0 And s2 = 1 Then  'Detecta tecla S1 y eliminacion de rebotes de la misma
If timer1_ms >= timer1_ms_tiempo Then  'Establece el retraso entre pulsaciones de S1
dato = dato + 1  'Seleciona el dato a ser modificado
s1_on = 1  'La tecla queda bloqueada
'If dato > 6 Then dato = 10  'Acota el valor de dato
If dato > 6 Then flag_1 = 0  'Indica fin de rutina de ajuste
timer1_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S1
Endif
Endif  '_____________________________
'____________Lectura de la hora para su modificacion y posterior grabacion, rutina BCD
If s2 = 0 And s2_on = 0 And s1 = 1 Then  'Deteca tecla S2 y eliminacion de rebotes de la misma
If timer3_ms >= timer3_ms_tiempo Then  'Establece el retraso entre pulsaciones de S2
s2_on = 1  'La tecla queda bloqueada
timer3_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S2
If dato < 7 Then  'Limita la direcciones de trabajo del reloj
Gosub lee_hora  'Lee los datos de los registros del RTC y los pasa a decimal, elimina los bit de control
aux_ajuste = reg(dato)  'Hace una imagen del valor del registro a modificar
aux_ajuste = aux_ajuste + 1  'Incrementa el dato a modificar que fue seleccionado
If dato = 2 And aux_ajuste > 23 Then aux_ajuste = 0  'Acota horas
If dato = 0 Or dato = 1 Then  'Acota segundos y minutos
If aux_ajuste > 59 Then aux_ajuste = 0
Endif
If dato = 3 And aux_ajuste > 7 Then aux_ajuste = 1  'Acota el dia de la semana
If dato = 4 And aux_ajuste > 31 Then aux_ajuste = 1  'Acota el dia del mes
If dato = 5 And aux_ajuste > 12 Then aux_ajuste = 1  'Acota el mes
If dato = 6 And aux_ajuste > 30 Then aux_ajuste = 1  'Acota el año, año maximo 2030
If aux_ajuste > 49 And aux_ajuste < 60 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 50
aux_ajuste.4 = 1
aux_ajuste.6 = 1
Endif
If aux_ajuste > 39 And aux_ajuste < 50 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 40
aux_ajuste.6 = 1
Endif
If aux_ajuste > 29 And aux_ajuste < 40 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 30
aux_ajuste.4 = 1
aux_ajuste.5 = 1
Endif
If aux_ajuste > 19 And aux_ajuste < 30 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 20
aux_ajuste.5 = 1
Endif
If aux_ajuste > 9 And aux_ajuste < 20 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 10
aux_ajuste.4 = 1
Endif
If aux_ajuste < 10 Then aux_ajuste = aux_ajuste  'Decimal a BCD
If dato = 0 Then aux_ajuste.7 = 0  'Restaura el bit de configracion, activa el oscilador del reloj
If dato = 2 Then aux_ajuste.7 = 0  'Restaura el bit, no lo utiliza el RTC
If dato = 2 Then aux_ajuste.6 = 0  'Restaura el bit de configuracion, reloj 24h
I2CWrite sda, scl, 0xd0, dato, aux_ajuste  'Actualiza el dato ya modificado
Endif
Endif
Endif  '____________
'__________Controla el parpadeo de los digitos cuando el modo selec es activo
If timer2_ms >= timer2_ms_tiempo Then  'Tiempo del parpadeo
If flash_1 = 1 Then  'Selecciona si el dato a modificar es visible o no
flash_1 = 0  'Dato es visible
Else
flash_1 = 1  'Dato no es visible
Endif
timer2_ms = 0  'Recarga la base de tiempos
Endif  '______________
Return                                           
lee_hora:  'Lee la hora del RTC en formato BCD y la pasa a decimal
i = 0  'Variable indice, asigna los datos de forma ordenada, leidos del RTC
While i <= 6  'Se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
I2CRead sda, scl, 0xd0, i, reg(i)  'Lectura de la direccion de memoria indicada del RTC, formato BCD
aux_4l = reg(i) And %00001111  'Eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'Segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %01110000  'Minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %00110000  'Horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %00000000  'Dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %00110000  'Dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %00010000  'Mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'Año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'Convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'Fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'Incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'Fin del bucle y salta a While
Return                                           
print_lcd:  'Rutina de escritura en el lcd
Lcdcmdout LcdLine1Home  'Cursor del lcd a la izquierda en la linea 1
If dato = 2 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de la hora
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(2) < 10 Then Lcdout "0"  'Si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2)  'Escribe la hora
Endif
Lcdout ":"  'Escribe el separador
If dato = 1 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los minutos
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(1) < 10 Then Lcdout "0"  'Si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1)  'Escribe los minutos
Endif
Lcdout ":"  'Escribe el separador
If dato = 0 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los segundos
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(0) < 10 Then Lcdout "0"  'Si segundos es inferior a 10 escribe el cero delante
Lcdout #reg(0)  'Escribe los segundos
Endif
Lcdcmdout LcdLine2Home  'Cursor del lcd a la izquierda en la linea 2
If dato = 3 And flash_1 = 1 Then  'Control final del parpadeo de los digitos del dia semana
Lcdout "    "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(3) = 1 Then Lcdout "Dom."  'Asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun."
If reg(3) = 3 Then Lcdout "Mar."
If reg(3) = 4 Then Lcdout "Mie."
If reg(3) = 5 Then Lcdout "Jue."
If reg(3) = 6 Then Lcdout "Vie."
If reg(3) = 7 Then Lcdout "Sab."
Endif
Lcdout " "  'Escribe separador
If dato = 4 And flash_1 = 1 Then  'Control final del parpadeo de los digitos del dia del mes
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(4) < 10 Then Lcdout "0"  'Si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4)  'Escribe el dia del mes
Endif
Lcdout "/"  'Escribe el separador
If dato = 5 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los meses
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(5) < 10 Then Lcdout "0"  'Si mes es inferior a 10 escribe cero
Lcdout #reg(5)  'Escribe el mes
Endif
Lcdout "/20"  'Separador y los dos primeros digitos del año de 4 digitos
If dato = 6 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los años
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(6) < 10 Then Lcdout "0"  'Si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'Escribe el año
Endif
Return                                           
pause_ms:  'Rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
aux_pause = 0  'Variable auxiliar lleva la cuenta de los ms
timer_1ms = 0  'Al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= pause  'Tiempo en mSeg maximos a contar
aux_pause = aux_pause + 1  'Variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0  'Al borrar el contador se activa y cuenta 1mSeg
While timer_1ms < 1  'Espera un miliesegundo
Wend
Wend
Return                                           
'***********************************Interrupciones*****************************************************
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'Comprueba que la interrupcion del timer1 es activa
'_________________Bases de tiempos
timer_base = timer_base + 1  'Contador general
If timer_1ms < 1 Then timer_1ms = timer_1ms + timer_1ms + 1  'Contador para control de la rutina Pause
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'Contador
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'Contador
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'Contador
If timer_base >= timer_base_tiempo Then  'Limita el timepo de ejecucion, cada timer_base_tiempo
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'Contador
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'Condtador
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'Contador
timer_base = 0  'Reset a la base de tiempos
Endif  '________________Fin bases de tiempos
Endif
TMR1H = 0xf8  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
If s1 = 0 Then led_verde = 0  'Muestra el estado de la tecla, tecla S1 a on, led verde a on
If s1 = 1 Then led_verde = 1  'Muestra el estado de la tecla, tecla s1 a off, led verde a off
If s2 = 0 Then led_amarillo = 0  'Muestra el estado de la tecla, tecla S2 a on, led amarillo a on
If s2 = 1 Then led_amarillo = 1  'Muestra el estado de la tecla, tecla S2 a on, led amarillo a on
Resume  'Activa las interrupciones y retorna el curso normal del programa, antes del salto

PD. Correccion de algunos fallos que he observado y mejoras en rutinas.

PD: 03/06/08
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Febrero de 2007, 10:11:08
Nueva versión, volviendo a trabajar con el modulo ADC:

Ahora utilizando funciones.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_ADC_Funcion_12
'VERSION: 1.2
'MICRO: PIC16f88A
'FECHA/AUTOR: 24/02/07, 13/07, 12/06 - By COS, PSI v7.41
'version: 1.2
'Simplificado de la rutina de division
'Modificacion de la rutina print_lcd, para hacerla compatible con el nuevo formato salida de datos de la division
'Version: 1.1
'Se acelera la rutina del display
'Se implementa con funciones
'Version: 1.0
'Descripción: muestra en el display el valor de la entrada analogica con dos decimales y en voltios
'**********************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'Definición de puertos y modulos
ANSEL = %00000000  'Los pin I/O digitales
Define ADC_SAMPLEUS = 10  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________Registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'Voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
'------------------------------------------------------------------
WaitMs 1000  'Espera 1Seg
Lcdout "16f88_LCD_ADC"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Selecciona la linea dos como proxima para escritura
Lcdout "Pruebas con ADC"  'Escribe en el lcd
WaitMs 3000  'Espera 3Seg
Lcdcmdout LcdClear  'Borra el display, y cursor al principio de la primera linea
Lcdout "Lectura Pin RA4"  'Muestra los datos en el lcd
'Rutina principal
main:
Call _vadc4()  'Llama a la función de lectura de la entrada ADC, retorna un Word
Call _dvsion_2dcmles(_vadc4)  'Llama a la funcion dvsion_2dcmles, que retorna un long
Call _print_lcd(_dvsion_2dcmles)  'Llama a la función que muestra los datos por el LCD con dos decimales
WaitMs 100  'Hace una pausa de 100mSeg
Goto main
End                                               
'Subrutinas y Funciones
'________Lee la entrada analogica y la pasa a voltios
'Devuelve un word con el voltaje con dos decimales, no tiene argumento de entrada.
Function _vadc4() As Word
Dim _aux As Long  'Variable auxiliar local
Adcin 4, _vadc4  'Lee el valor de la entrada analogica y lo guarda en _vadc4 con dos decimales
_aux = (500 * _vadc4) / 1023  'Pasa a voltios con dos decimales
_vadc4 = _aux  'Asigna valor de salida
End Function                                     
'________Muestra los datos por el display
'Argumento de entrada una variable tipo Long, no devuelve datos.
Proc _print_lcd(_numero As Long)
Lcdcmdout LcdLine2Home  'Selecciona la primera linea y cursor al principio
Lcdout "ENTR. ADC ", #_numero.HW, "."  'Muestra los datos en el lcd
If _numero.LW < 10 Then Lcdout "0"  'Asegura que decimal siempre se escribira con dos digitos
Lcdout #_numero.LW, "V  "  'Muestra los datos en el lcd
End Proc                                         
'________Rutina funcion division con dos decimales
'Argumentos de entrada variable tipo word, argumento de salida una variable tipo long
Function _dvsion_2dcmles(_dvdo As Word) As Long
Dim _dvsor As Word  'Divisor
Dim _entera As Word  'Variable local, contendra la parte entera
Dim _resto As Word  'Varable local, contendra el resto
Dim _decimal As Word  'contendra la parte decimal
_dvsor = 100  'Dos decimales
_entera = _dvdo / _dvsor  'Obtengo la division
_resto = _dvdo Mod _dvsor  'Obtengo el resto
_dvsion_2dcmles.HW = _entera  'Almacena la parte entera en el word alto
_dvsion_2dcmles.LW = _resto  'Almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos siempre
End Function                                     

PD. Donde dice "decimal = division.LW  'sede el byte alto del word bajo a decimal_1"
      ahora dice "decimal = division.LW  'sede el word bajo a decimal"
      ya sabeis, los fallos tipicos de usar "copy/paste"

PD: 03/06/08
      I2CWrite sda, scl, 0xd0, x, x
      I2CRead sda, scl, 0xd1, x, x
      0xd0 = %11010000 => Seleccion del chip DS1307 y modo escritura
      0xd1 = %11010001 => Seleccion del chip DS1307 y modo lectura
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead, por lo que su valor
      es indiferente, la funcion I2CWrite lo pondra a valor "0" de forma automatica y al ser compilada tambien I2CRead lo colocara a 1.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Marzo de 2007, 22:26:37
Esto es en lo siguiente en lo que estoy trabajando:
Circuito adaptador acondicionador para el circuito integrado medidor de temperatura LM35DZ (0C a 100C).

(http://img142.imageshack.us/img142/9546/070318etpalm35xz12no9.jpg)

PD. Se me olvido colocar la R7
Otro PD. Se me olvido colocar la R8
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 03 de Marzo de 2007, 02:27:46
Ojalá todos los esquemas que uno mira vinieran tan claritos y bien explicados, Carlos. Gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Marzo de 2007, 09:53:13
R7 y R8 son importantes para:

R7, como trabajamos sobre una placa para desarrollos, es facil que el pin RA4, que es nuestra entrada analogica, por un despiste u olvido lo dejemos como salida
creando una lucha de niveles entre la salida del IC2B y el pin del PIC, asi que R7 evita este problema.

R8, cierra el entorno de voltaje de ajuste del RA1, solo necesitamos unos pocos cientos de milivoltios, conseguimos hacernos la vida mas facil ya que el RA1 de esta forma, nos dara un grado de preccision muy elevado.


Gracias Manolo, es algo que siempre intento, lo que me fue dificil para mi, hacerlo facil para los demas...  :mrgreen:

PD. o por lo menos lo intento...  :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Marzo de 2007, 09:58:05
Hola Carlos!
Muy bueno! Yo uso siempre sensores "digitales", tipo el DS1820 por no saber justamente hacer lo que hace tu circuito. Gracias por compartir tan excelente trabajo. :)
Seguramente voy a probarlo en el proximo proyecto. :-/

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Marzo de 2007, 10:08:24



Very Well aitopes, estoy con el tema de la pcb, cuando lo tenga todo publicare los pcbs junto con el visto bueno.
mas una pequeña modificacion a la EBasic, para poder trabajar con el RA4 (ADC) con plaquitas externas.

De todas formas estoy realizando un articulo con todo el contenido del hilo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Marzo de 2007, 10:13:45
Perfecto!!!
Muy buen trabajo. ME das permiso para que use este esquema acondicionador (citando la fuente y el articulo original, claro) cuando llegue al capitulo del ADC en la GUIA de PIC BASIC?

(hoy voy a subir dos capitulos mas que tengo listos desde hace dias y no he hecho tiempo de postear en el foro :( )
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 03 de Marzo de 2007, 11:42:15
Hola:

Felicidades Carlos por el gran trabajo que bienes haciendo con la plaquita y los ejemplos  :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Marzo de 2007, 14:21:48
Gracias maistro.

Aitopes puedes hacer uso del circuito como estimes conveniente, me alimenta mucho el ego cuando reconozco un esquema mio en algun proyecto ya me haga mencion o no... :D

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Marzo de 2007, 15:37:54
Gracias Carlos!

El ego se siente mejor cuando es reconocido, asi que lo voy a destacar muy bien. 8)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Marzo de 2007, 22:33:46
Pues la placa ya esta construida y funcionando...  :mrgreen:

(http://img822.imageshack.us/img822/3710/etpalm35x1.jpg) (http://img822.imageshack.us/i/etpalm35x1.jpg/)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Marzo de 2007, 15:52:28
Y ahora añadiendo las rutinas de conversion del valor del adc a temperatura.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_ADC_Funcion_13
'MICRO: PIC16f88A
'FECHA/AUTOR: 24/02/07, 13/07, 12/06 - By COS, PSI v7.41
'Version: 1.3
'Se añade un sensor de temperatura en la entrada RA4, se conecta un LM35DZ por medio de la placa ETPA_LM35xZ, Ver. 1.2.
'Se toma una lectura cada 1000mSeg. y se calcula la media aritmetica con 20 muestras.
'Se ajusta la placa ETPA_LM35xZ, para maxima temperatura 60º = 3V (RA2).
'Como 5V=1023=100º, 3V=613.8=60º.
'Como el rango de temperatura del LM35DZ es de 0º a 100º, el RA1 se ajusta a cero voltios.
'Version: 1.2
'Simplificado de la rutina de division.
'Modificacion de la rutina print_lcd, para hacerla compatible con el nuevo formato salida de datos de la division.
'Version: 1.1
'Se acelera la rutina del display.
'Se implementa una rutina tipo funcion para la division.
'Version: 1.0
'Muestra en el display el valor de la entrada analogica con dos decimales y en voltios.
'***************************************************************************************************
'***********************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación, acelera los comandos WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00000000  'los pin I/O digitales
Define ADC_SAMPLEUS = 10  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
'Definicion de variables -------------------------------------------
'Variables del ADC y Rutina division -----------------------------
Dim entero As Word  'parte entera
Dim decimal As Word  'los dos decimales
Dim division As Long  'almacenara el numero con los dos decimales
Dim adc_4 As Word  'contendra el valor de la entrada del ADC
'Variables temperatura -------------------------------------------
Dim factor_escala As Word  'contiene el factor de correcion para pasar el valor del ADC a voltios, max. 5V
Dim temperatura As Word
Dim temp As Long
'Variables calculo media aritmetica -------------------------------
Dim media_temp(20) As Word
Dim media_indice As Byte
Dim aux_media As Byte
'Asignaciones ----------------------------------------------------
entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 10  'Factor de escala para un decimal
temperatura = 0
media_indice = 0
aux_media = 0
'------------------------------------------------------
WaitMs 1000  'Espera 1Seg
Lcdout "16f88_LCD_ADC_"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Selecciona la linea dos como proxima para escritura
Lcdout "Funcion_1.3"
WaitMs 3000
Lcdcmdout LcdClear
Lcdout "Pruebas LM35DZ"  'EScribe en el lcd
WaitMs 3000  'Espera 3Seg
Lcdcmdout LcdClear  'Borra el display, y cursor al principio de la primera linea
Lcdout "Lectura Pin RA4"  'Muestra los datos en el lcd
'Inicializa variable media_temperatura---------------------------
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
For media_indice = 0 To 19  'Indice para rocorrer todas las direcciones de memoria que forman la variable tipo array media_temp
media_temp(media_indice) = temperatura  'Se de el valor a media_temp
Next media_indice  'Terminacion del bucle For
media_indice = 0  'Se inicializa a cero, para un uso posterior
'--------------------------------------Main Programa-----------------------------------------------
main:
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
Gosub media_arit  'Salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'Llama a la funcion dvsion_dcmles, que retorna un long
Gosub print_lcd  'Salto con retorno, rutina muestra los datos por el LCD
WaitMs 1000  'Hace una pausa de 1000mSeg
Goto main
End                                               
'**************************************Subrutinas**********************************************
'Subrrutina lectura ADC, division y LCD
lee_adc:  '_______________________Lee la entrada analogica
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo guarda en adc_4
Return                                           
print_lcd:  '____________________Muestra los datos por el display
entero = division.HW  'Sede el word alto a entero, parte entera
decimal = division.LW  'Sede el byte alto del word bajo a decimal_1
Lcdcmdout LcdLine2Home  'Selecciona la primera linea y cursor al principio
Lcdout "ADC ", #adc_4, " T ", #entero, "."  'Muestra los datos en el lcd
Lcdout #decimal, "C   "  'Muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'Variable local, contendra la parte entera
Dim f_resto As Word  'Varable local, contendra el resto
Dim f_decimal As Word  'Contendra la parte decimal
f_entera = dvdo / dvsor  'Obtengo la division
f_resto = dvdo Mod dvsor  'Obtengo el resto
f_decimal = (f_resto * 10) / dvsor  'Calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'Almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  'Almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos siempre
End Function                                     
'___________Calculo de la media aritmetica de la temperatura, 10 muestras
media_arit:
media_temp(media_indice) = temperatura  'Asigna el valor
temperatura = 0  'Se inicaliza a cero
For aux_media = 0 To 19  'Blucle for, se ejecuta 20 veces
temperatura = temperatura + media_temp(aux_media)  'Se suman los valores
Next aux_media  'Cierra for
temperatura = temperatura / 20  'Termina el calculo de la media
media_indice = media_indice + 1  'Controla la entrada de datos que corresponde a media_temp(x)
If media_indice > 19 Then media_indice = 0  'Acota el ultimo valor del indice de media_temp
Return                                           
'___________Calculo de la temperatura
temp_calculo:
temp = ((adc_4 * 60) * 100) / 6138  'Temperatura sin decimales, variable tipo long
'temperatura = ((adc_4 * 60) / 613) * 10  'Temperatura sin decimales, variable tipo word
temperatura = temp  'Se pasa de Long a Word, si no se utiliza long se suprime esta linea
Return                                       
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: PalitroqueZ en 12 de Marzo de 2007, 11:48:41
nuevamente, ¡Buen trabajo dogflu66!.  :-/ :-/ :-/

esa LCD ¿a que controlador pertenece? por que las que he visto tiene la baquelita ajustada al cristal

Salu2
Pedro
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Marzo de 2007, 21:03:11
Es compatible con el HD44780

(http://img301.imageshack.us/img301/568/lcdzr7.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2007, 16:39:41
(http://img142.imageshack.us/img142/9546/070318etpalm35xz12no9.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 18 de Marzo de 2007, 20:23:18
Buenisimo.....realmente muy util.

Tanto, que voy a cumplir mi promesa de "robartelo" para ponerlo en mi pagina! ;)

Saludos, y felicitaciones.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2007, 20:38:46
El circuito acondicionador esta pensado para poder elegir el rango de trabajo del lm35, siempre teniendo en cuenta como temperatura mínima 0º, porque se podría fácilmente, con las modificaciones adecuadas según el datasheet del lm35, trabajar con todo el rango de temperaturas del  lm35, pero el actual acondicionador no nos indicaría si la temperatura es positiva o negativa.
Teniendo esto en cuenta procedemos a ajustar el circuito para trabajar con un rango de temperatura de 15º a 30º centígrados.

Ajuste para trabajar en un rango de temperaturas 15º a 30º centígrados:

Procedemos a colocar los puentes en modo ajuste.
Colocamos el voltímetro en el pin 1 del  IC2A
Ajustamos RA1 hasta que el voltímetro indique (30º x 10 mV) - (15º x 10mV) = 150 mV
Y procederemos a ajustar RA2 hasta un valor lineal de trabajo del  IC2B,  en este caso 1.5V
Ya que el RA2 no nos permite mayor nivel de ganancia (es cuestión de cambiarlo por uno mayor que nos permita llegar a los 3v).
Que lo estaremos midiendo en el pin 7 del IC2B con el voltímetro.
Con lo que ya tendremos ajustada la temperatura máxima de trabajo
Procedemos de nuevo a colocar los puentes en modo trabajo
Seguidamente ajustaremos RA1 al valor de 150 mV = 15º x10 mV, que será la temperatura mínima
Mediante la medición del voltaje en IC2A en su pin de salida 1 (en este ejemplo no es necesario porque quedo ajustado a ese mismo valor en el paso anterior).

Y para el calibrado de la rutina del programa procedemos de la siguiente manera:

Como 1.5V son 150mV = 15º, y en nuestro caso serán 30º
50º = (15º x 5Vref) / 1.5V
5Vref. son  50º = 1023 puntos de resolución del ADC a 10Bit.
306.9 = (1023 x 15º) / 50º
15º corresponden a 306.9 puntos de resolución, que son restados físicamente con el RA1.
Así que la formula queda de la siguiente forma, sumando los puntos restados anteriormente
((50ºC  x (RA4 + 306.9)) / 1023) = Temperatura
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2007, 20:59:08
jeje, como gustes Aitopes.

PD. Actualmente el circuito queda ajustado mediante RA2 a ganancia 10, pero para poder llegar a un valor mas próximo al rango dinámico de trabajo del ADC, se podría sustituir este (RA2) por uno de 20K con lo que la ganancia máxima llegaría a 21 = (R5 + RA2) / R5, este cambio permitiría llegar a los 3 voltios.
No conviene llevar la tensión de salida (pin 7) del IC2B muy próxima a la de alimentación porque este dejara de trabajar linealmente.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2007, 21:07:29
El valor de R5 parece redundante en la formulita, pero en realidad no lo es, no hay mas que cambiar el valor de R5 por 2K y veréis que todo cambia...
hay que tener en cuenta que "el que reparte se lleva la mejor parte", en este caso el que diseña se reserva colocar los valores de los componentes, y en este caso ganancia de IC2B es igual a 1 + 10 = 11.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2007, 21:30:06
La ganancia del circuito restador, se calcula de la siguiente manera teniendo en cuenta que siempre se cumpla lo siguiente R1 = R2 y R3 = R4, ganancia = R4/R2.
De esta forma podríamos simplificar el circuito realizando todo con un único amplificador operacional, por ejemplo con el CA3140, en este caso para que el circuito funcionara igual que el otro, tendríamos que darle ganancia 10, y esto se haría cambiando el valor de R3 y R4 por 100K (100K = R3 = R4).
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 21 de Marzo de 2007, 10:23:32
Hola Carlos!

Tengo una duda (casi una certeza, en realidad): No hay ninguna version del PIC SIMULATOR IDE para programar los PIC12C508A, no?

Tengo 20 de ellos, y con el PIC SIMULATOR de los 16 no lo puedo programar. Solo figuran los 12F629, 12F675 y 12F683, que solo se parecen en el "12" :(

Si tenes algun dato, te lo agradezco. Si no.....o bien los uso para hacer unos aritos para la señora, o me busco otro compilador (algo que no quiero hacer!)

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 21 de Marzo de 2007, 12:02:59
Hay una version que incluye el PIC12F508, que es el PIC10F Simulator IDE, que se puede descargar en su pagina.
Me imagino que el codigo generado sera compatible, pero no estoy seguro que sea verdad de la buena, entre
otras cosas porque el compilador tiene el PIC12F508 y el tuyo es el PIC12C508A y no me refiero solo a la C sino especialmente a la terminacion A.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 21 de Marzo de 2007, 12:15:04
Como dicen los chicos por aqui...."estoy en el horno", o sea....no va a andar.

Gracias por el dato!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 25 de Marzo de 2007, 20:19:46
Empece a experimentar con este entorno...no se nada de C, y me parecio posible aprender algo con este simulador, me parece bastante claro...el problema es que no me anda ni una simulacion en el LCD module (2x16)...estoy usando el sistema "copy and paste", de los codigos que subio este "mostro" (va con onda)...

Lei un tutorial de AITOPES, asi es que creo estoy configurando bien el PSI (5.92)...obviamente en estos inicios esto me supera absolutamente, empece encendiendo un led (como dicen por ahi, es "el hola mundo" del PSI) y no tuve problemas...faltaba mas, sino podia hacer tarea tan sencilla, me anotaba en un curso de cocina (por lo menos aprenderia a hacerme unas milanesas napolitanas... :D)...

Me gustaria que me dijeran, como hago para leer algun dato (letra - numero - lo que sea...) en el LCD Module...

Gracias por la leer !!!

PD: este "laburo", es una barbaridad de conceptos, ojala pueda sacar algo en limpio...me gustaria podes hacer realidad este entrenador, para empezar a practicar...


"Que otros se jacten de lo que han escrito, yo me siento orgulloso de lo que he leido" (J.L.B.)

_________________________________
"justo a mi, me toco ser Yo" QUINO



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 26 de Marzo de 2007, 08:22:38
Hola Resistencio!

Citar
Me gustaria que me dijeran, como hago para leer algun dato (letra - numero - lo que sea...) en el LCD Module...

Hasta donde se, no hey instrucciones basic para leer la memoria del LCD. Si se puede hacer "a mano", con la datasheet del LCD y paciencia.

Si lo que necesitas es ESCRIBIR letras en el LCD, entonces esta parte de la ayuda del PSI te va a servir:

Interfacing character LCDs

Basic compiler also features the support for LCD modules based on HD44780 or compatible controller chip. Prior to using LCD related statements, user should set up LCD interface using DEFINE directives. Here is the list of available parameters:
LCD_BITS - defines the number of data interface lines (allowed values are 4 and 8; default is 4)
LCD_DREG - defines the port where data lines are connected to (default is PORTB)
LCD_DBIT - defines the position of data lines for 4-bit interface (0 or 4; default is 4), ignored for 8-bit interface
LCD_RSREG - defines the port where RS line is connected to (default is PORTB)
LCD_RSBIT - defines the pin where RS line is connected to (default is 3)
LCD_EREG - defines the port where E line is connected to (default is PORTB)
LCD_EBIT - defines the pin where E line is connected to (default is 2)
LCD_RWREG - defines the port where R/W line is connected to (set to 0 if not used; 0 is default)
LCD_RWBIT - defines the pin where R/W line is connected to (set to 0 if not used; 0 is default)
LCD_COMMANDUS - defines the delay after LCDCMDOUT statement (default value is 5000)
LCD_DATAUS - defines the delay after LCDOUT statement (default value is 100)
LCD_INITMS - defines the delay for LCDINIT statement (default value is 100)
The last three parameters should be set to low values when using integrated LCD module simulator. If R/W line is connected to microcontroller and parameter LCD_READ_BUSY_FLAG is set to 1 using DEFINE directive, then these delay parameters will be ignored by compiler and correct timing will be implemented by reading the status of the busy flag in the LCD.

LCDINIT statement should be placed in the program before any of LCDOUT (used for sending data) and LCDCMDOUT (used for sending commands) statements. Its argument is used to define the cursor type: 0 = no cursor (default), 1 = blink, 2 = underline, 3 = blink + underline. LCDOUT and LCDCMDOUT statements may have multiple arguments separated by ','. Strings, constants and variables can be used as arguments of LCDOUT statement. If '#' sign is used before the name of a variable then its decimal representation is sent to the LCD module. Constants and variables can be used as arguments of LCDCMDOUT statement and the following keywords are also available: LcdClear, LcdHome, LcdLine2Home, LcdLeft, LcdRight, LcdShiftLeft, LcdShiftRight, LcdLine1Clear, LcdLine2Clear, LcdLine1Pos() and LcdLine2Pos(). Argument of LcdLine1Pos() and LcdLine2Pos() can be a number in the range (1-40) or Byte data type variable. The value contained in that variable should be in the same range. Here are some examples:
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
LCDINIT
loop:
   LCDOUT "Hello world!"
   WAITMS 1000
   LCDCMDOUT LcdClear
   WAITMS 1000
GOTO loop


DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
DIM A AS WORD
A = 65535
LCDINIT 3
WAITMS 1000
loop:
   LCDOUT "I am counting!"
   LCDCMDOUT LcdLine2Home
   LCDOUT #A
   A = A - 1
   WAITMS 250
   LCDCMDOUT LcdClear
GOTO loop

LCD related statements will take control over TRIS registers connected with pins used for LCD interface, but if you use PORTA or PORTE pins on devices with A/D Converter Module then you should take control over the ADCON1 register to set used pins as digital I/O.

You can setup up to eight user defined characters to be used on LCD. This can easily be done with LCDDEFCHAR statement. The first argument of this statement is char number and must be in the range 0-7. Next 8 arguments form 8-line char pattern (from the top to the bottom) and must be in the range 0-31 (5-bits wide). These 8 user characters are assigned to char codes 0-7 and 8-15 and can be displayed using LCDOUT statement. After LCDDEFCHAR statement the cursor will be in HOME position. For example:
LCDDEFCHAR 0, 10, 10, 10, 10, 10, 10, 10, 10
LCDDEFCHAR 1, %11111, %10101, %10101, %10101, %10101,
%10101, %10101, %11111
LCDOUT 0, 1, "Hello!", 1, 0

For LCDs with four lines of characters additional symbolic arguments of LCDCMDOUT statement can be used: LcdLine3Home, LcdLine4Home, LcdLine3Clear, LcdLine4Clear, LcdLine3Pos() and LcdLine4Pos(). Argument of LcdLine3Pos() and LcdLine4Pos() can be a number in the range (1-40) or Byte data type variable. The value contained in that variable should be in the same range. Prior to using these language elements, correct values determining LCD type should be assigned to LCD_LINES and LCD_CHARS parameters using DEFINE directives.
DEFINE LCD_LINES = 4
DEFINE LCD_CHARS = 16
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
LCDINIT 3
loop:
   LCDCMDOUT LcdClear
   LCDCMDOUT LcdLine1Home
   LCDOUT "This is line 1"
   LCDCMDOUT LcdLine2Home
   LCDOUT "This is line 2"
   LCDCMDOUT LcdLine3Home
   LCDOUT "This is line 3"
   LCDCMDOUT LcdLine4Home
   LCDOUT "This is line 4"
   WAITMS 1000
   LCDCMDOUT LcdLine1Clear
   LCDCMDOUT LcdLine2Clear
   LCDCMDOUT LcdLine3Clear
   LCDCMDOUT LcdLine4Clear
   LCDCMDOUT LcdLine1Pos(1)
   LCDOUT "Line 1"
   LCDCMDOUT LcdLine2Pos(2)
   LCDOUT "Line 2"
   LCDCMDOUT LcdLine3Pos(3)
   LCDOUT "Line 3"
   LCDCMDOUT LcdLine4Pos(4)
   LCDOUT "Line 4"
   WAITMS 1000
GOTO loop

Y si tenes paciencia, esta semana justamente voy a escribir los capitulos correspondientes al manejo de LCD alfanumericos. Y la otra, los de 128x64.

Saludos, y avanti con el PSI! :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Marzo de 2007, 16:51:45
Pues lectura de los registros del lcd mediante algun comando del basic todavia no se puede, a un que el numero de comandos para el lcd es ya muy extenso.
y algunos pocos ejemplos no estan probados con el simulador, pero todos fueron descargados en la placa y funcionaron, estando corregidos de errores por lo menos hasta donde me di cuenta y puedo asegurar que suelo ser bastante minucioso antes de publicar algo.

De todas formas si me indicas los que no funcionaron los pruebo de nuevo, a ver si tienen algun error de transcripción.... llamese “Copy/Paste”...  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 28 de Marzo de 2007, 05:11:27
Hola, COS...yo hacia referencia a: si era posible simular este programa, con el simulador en cuestion...es decir, es posible compilarlo y cargarlo y luego elegir el LCD module, para leer en el, la letra A...que es la que escribis en el primer ejemplo ??? porque sino puedo hacer eso, quiere decir que algo estoy haciendo mal con el simulador !!!

Estoy consultando en estas instancias y NO, afirmando que no ande...porque, no conozco el funcionamiento preciso, ni se que esperar de este simulador...no tengo conocimientos de C, lo cual me impide hacer alguna apreciacion de lo que han escrito...solo queria saber si es posible simular el programa, que escribe la letra A, en display...o alguno de los otros !!!

Con el tiempo, espero poder, hacer mis propios programas...Y he pensado que la construccion de este entrenador me serviria para ello...No me queda bien claro, si solo anda volcado en placa o si se puede ver simulado con este u otro software, para tales fines...he leido que casi todos manejan PROTEUS...Que me recomiendan ???

SALUDOS y gracias por leer !!!

______________________________
"Justo a mi, me toco ser Yo." QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Marzo de 2007, 05:30:21
Hola Res. aqui el lenguaje que utilizamos es una version del Basic.
Luego a la noche intentare indicar paso a paso como se simula
el ejemplo al que te refieres.

De todas formas el codigo tiene algunos caracteres raros, no se interpreto bien el caracter del tabulador al pegarlo
en el hilo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Marzo de 2007, 05:36:00
He corregido el ejemplo, le quite los caracteres de tabulacion.
a ver si el fallo estuviera en eso.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Marzo de 2007, 19:37:04
Aqui dejo una descripcion de como simular el ejemplo primero del display.

http://www.mytempdir.com/1274190
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 29 de Marzo de 2007, 16:22:20
Hola COS...gracias por la molestia, y muy buen trabajo...estuve leyendo atentamente la explicacion, y estoy haciendo exactamente lo mismo (cual mono "amaestrado"), lo cual en un principo, me alcanza, ya que queria ver de lo que es capaz este simulador...lo cierto es que, no logre el efecto de la simulacion... :x

Me gustaria que AITOPES, me dijera si el logro poner en marcha, aunque sea la simulacion...segun contas AITOPES, tenes la version 5.91 del PIC SIMULATOR IDE...yo consegui la 5.92, lo cual en principio los hace parecidos...asi que seria bueno, si podes aportarme ese dato... :lol:

Tambien seria bueno que COS, nos contara que version utiliza EL... :-)

Aun en la desesperanza inicial, me gustaria aprender sobre el tema, asi es que insistire con ello...Gracias por el esfuerzo y la excelencia del trabajo, la verdad es que estoy gratamente sorprendido por tanto aporte...sigan asi !!!

Gracias por leer !!!

_______________________________
"Justo a mi, me toco ser Yo" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Marzo de 2007, 17:41:53
Pues desinstale mi version la 6.65, he istale la mas cercana a la vuestra que tengo que es la 5.31, y todo OK... :shock:
Asi que no se lo que puede pasar.

Te recomiendo que te bajes de su pagina una version que funciona por tiempo limitado y pruebes por si tienes
corrompida tu version...  :(

http://www.oshonsoft.com/downloads.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: cchhaa en 29 de Marzo de 2007, 18:29:34
Fantastico trabajo Carlos!!!
Desde luego, entre todos, estais haciendo que trabajar con pics sea tan facil como copiar y pegar.


Un saludo
cchhaa
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 29 de Marzo de 2007, 20:57:00
Tanto trabajo CARLOS, gracias, voy a intentar eso que me decis...sos un "CAPO" (termino "lunfardo" que se usa en Argentina para señalar, a una persona sobresaliente, como "MASTER"...y que nada tiene que ver con la connotacion de "capo" en italiano... :D) Es un halago, por aqui...

=============================================================================

Esto lo agrego luego de probar lo anterior, unas 5 horas despues:

cambié la version y ocurria lo mismo...asi que como tenia la full version, volvi a ella...

Lo que decidi ahora fue ejecutar el programa y esperar lo que fuera necesario, hasta que apareciera la letra "A"...ya que el simulador no enviaba mensajes de error cuando compilaba, supuse que era cuestion de tiempo...

Y asi fue nomas...la letra "A" aparecio a los 4, 15 minutos luego del START (es que Yo era demasiado impaciente, pero 4 minutos es mucha espera...) inicio a los 23ms del RTCC (23456 us) y estaba corriendo en "Extremely Fast"...lo cual me ha hecho pensar, que es hora de "jubilar" a mi vieja XT... :D

Estaba corriendo la simulacion en un PIII a 550MHZ...sera esa la razon de semejante demora ???

Seguire probando lo demas...SALUDOS y un abrazo !!!

______________________________
"Justo a mi, me toco ser Yo" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Marzo de 2007, 18:17:33
Me alegro mucho que ya lo vieras funcionar...  :-/

En mi version 6.65, en la opcion Extremely Fast tarda 60 segundos y en la opcion Ultimate tan solo 2 Segundos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 31 de Marzo de 2007, 02:40:54
Hola CARLOS...ahora si...probe con "Ultimate", tarda 15 o 20 seg...Ni me di cuenta de esa opcion, de hecho sino la mencionas, quizas ni le hubiera prestado atencion... :D :D :D

Gracias y esto me alienta a seguir !!!  :-) :-) :-)

______________________________
"Justo a mi, me toco ser Yo! QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 31 de Marzo de 2007, 09:16:54
(http://img117.imageshack.us/img117/4213/happypg7.gif)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 31 de Marzo de 2007, 12:47:52
Cuanta alegria CARLOS !!! :D

"Me gusta la gente que sabe la importancia de la alegría.

Me gusta la gente de criterio, la gente que no traga entero. La gente que no se avergüenza de reconocer que no sabe algo, o que se equivocó, y la que, al aceptar sus errores, se esfuerza constructivamente para no volver a cometerlos.

Me gusta la gente que piensa que el trabajo en equipo, entre amigos, produce más que los caóticos esfuerzos individuales.

Me gusta la gente capaz de criticarme constructivamente y de frente. " BENEDETTI

Gracias por compartir tu trabajo !!! :)

________________________________
"Justo a mi, me toco ser Yo" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Abril de 2007, 12:10:11
Circuito para operar con el LM35 en el rango de temperaturas positivas y negativas:

(http://img183.imageshack.us/img183/9326/lm35rangopositivoynegatlj4.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Abril de 2007, 12:12:00
LM35: -55C a 150C.
Con este circuito termino las practicas con operacionales, es el acondicionador que nos permite trabajar con todo el rango de temperaturas del LM35 (-55 a 150C), positivas, negativas, con simple tensión de alimentación y con una única entrada analógica y tensión de referencia interna del ADC. El circuito incorpora la etapa para trabajar con simple tensión que indica el datasheet del fabricante, esta etapa consiste en conseguir un plano virtual de masa a través de los diodos D1 y D2, gracias a estos diodos podemos simular la fuente simétrica que necesita el LM35 para pode trabajar en el rango de temperaturas por de bajo de 0ºC. El uso de estos diodos nos genera varios problemas que tenemos que solucionar para que el circuito funcione adecuadamente, uno de ellos es que la tensión de la salida del LM35 que nos indica la temperatura, 10mV por ºC, lleva sumada la tensión que nos genera la masa virtual de los diodos, y otro problemas es que la tensión entre extremos de los diodos varia según la temperatura ambiente, bien, todo esto lo corregimos utilizando la etapa restadora compuesta por el IC2A, con lo que ya tenemos la mayoría de los problemas resueltos, pero seguimos teniendo uno mas, y es que el IC2A no nos puede dar tensiones negativas ya que esta alimentado con simple tensión, esto a efectos prácticos nos provocaría que todas las temperaturas negativas que nos suministraría el LM35 serian convertidas a cero voltios por el Amp. Operacional, asi que para corregir esto lo que hacemos es implementar otra masa virtual al operacional que se consigue mediante el divisor de tensión R8/RA1, asi que sumamos una tensión fija a la tensión de salida del operacional, esta tensión la consideraremos como 0ºC, toda tensión por encima de esta sera temperatura positiva y por supuesto la que este por debajo de este valor se considerara temperatura negativa.

Llegados hasta aquí, todo esto lo resumimos con un ejemplo sencillo:

Para ajustar el circuito solo tendremos que decidir hasta que temperatura mínima queremos que nos mida nuestro termómetro, en este caso serán –55ºC, y eso es 55ºx10mV=550mV, asi que el valor de cero grados sera cuando el IC2A en su salida (pin1) nos muestre esta cantidad de voltaje, seguidamente mediante un voltímetro medimos entre los pines 2 y 3 del LM35 la cantidad de mV que nos esta dando el componente, en este caso supondremos 200mV=20ºC, 200mV/10mV=20, ya con estos datos procedemos a ajustar la resistencia multivuelta RA1 hasta que en la salida del IC2A obtengamos el siguiente valor, 550mV+200mV=750mV, con lo que ya tendremos ajustada la primera etapa de circuito, e incluso podrimos trabajar tan solo con esta etapa si no requerimos cerrar el margen de trabajo de la escala de temperatura, sobre unos 0.5ºC a 10Bit sera la precisión.

La formula para el calculo de la temperatura que daría de la siguiente forma, siempre la tensión referida al pin 1 de IC2A:

Si la tensión es mayor a 550mV la temperatura seria positiva y la temperatura que daria asi Temp. =(Tension-550mV)/10mV.

Si la tensión es igual a 550mV la temp. =  0º

Si la tensión es menor que 550mV la temperatura es negativa y la temperatura que daria asi Temp. =(550mV-tensión)/10mV

Todo esto teniendo en cuenta que el IC2B esta considerado que lo ajustamos a ganancia 1, en el caso de querer cerrar el rango de trabajo del LM35 para conseguir una mayor exactitud en una escala de temperatura seleccionada tendremos que incorporar el factor de amplificación de este Amp. Operacional al calculo de la temperatura.

Si se quiere una mayor precisión con este circuito habría que incorporar componentes del 1% de tolerancia y cambiar los Amp. Operacionales por otros para instrumentación, e incluso hacer correcciones de tensiones de offset y la implementación de tensiones estabilizadas de mayor precisión.

Nota:
    LM35, LM35A: −55C a +150C
    LM35C, LM35CA: −40C a +110C
    LM35D: 0C a +100C
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Abril de 2007, 16:27:27
La nueva version del programa que muestra el signo de la temperatura:

Código: [Seleccionar]
'************************* PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_ADC_Funcion_14
'VERSION: 1.3
'MICRO: PIC16f88A
'FECHA/AUTOR: 04/07, 02/07, 13/07, 12/06 - By COS, PSI v7.41
'Version 1.4
'Para la version 1.3 de hard, 04/07, etpa_lm35xz, LM35: -55 a +150C.
'Se hacen modificaciones para que muestre valores negativos de temperatura con la nueva version del hard.
'Se corrige la rutina de calculo de temperatura para el nuevo circuito acondicionador
'Se corrige la rutina de muestra de datos para mostrar la temperatura con signo.
'Version: 1.3
'Se añade un sensor de temperatura en la entrada RA4, se conecta un LM35DZ por medio de la placa ETPA_LM35xZ, Ver. 1.2
'Se toma una lectura cada 1000mSeg. y se calcula la media aritmetica con 20 muestras
'Se ajusta la placa ETPA_LM35xZ, para maxima temperatura 60º = 3V (RA2)
'Como 5V=1023=100º, 3V=613.8=60º
'Como el rango de temperatura del LM35DZ es de 0º a 100º, el RA1 se ajusta a cero voltios
'Version: 1.2
'Simplificado de la rutina de division
'Modificacion de la rutina print_lcd, para hacerla compatible con el nuevo formato salida de datos de la division
'Version: 1.1
'Se acelera la rutina del display
'Se implementa una rutina tipo funcion para la division
'Version: 1.0
'Descripcion: muestra en el display el valor de la entrada analogica con dos decimales y en voltios
'***********************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación, acelera los comandos WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'************************DEFINICION DE PUERTOS*************************************
'Asignacion de I/O y valores de inicio de las salidas---------------------
ANSEL = %00000000  'Los pin I/O digitales
Define ADC_SAMPLEUS = 10  'El minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________Registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'Voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
'Variables globales
'Variables del ADC y Rutina division------------------------------
Dim entero As Word  'Parte entera
Dim decimal As Word  'Los dos decimales
Dim division As Long  'Almacenara el numero con los dos decimales
Dim adc_4 As Word  'Contendra el valor de la entrada del ADC
Dim aux_adc_4 As Word  'Auxiliar
'Variables temperatura-------------------------------------------
Dim factor_escala As Word  'Contiene el factor de correcion para pasar el valor del ADC a voltios, max. 5V
Dim temperatura As Word  'Almacena la temperatura final
Dim temp As Long  'Contendra la temperatura completa sin coma
Dim signo As Bit  'Indica el signo de la temperatura
'Variables calculo media aritmetica-------------------------------
Dim media_temp(20) As Word  'Numero de muestras para calcular la media aritmetica
Dim media_indice As Byte  'Se utiliza como indice
Dim aux_media As Byte  'Variable auxiliar
'Asignaciones ---------------------------------------------------
entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 10  'Factor de escala para un decimal
temperatura = 0
media_indice = 0
aux_media = 0
'----------------------------------------------------------------
WaitMs 1000  'Espera 1Seg
Lcdout "16f88_LCD_ADC_"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Seleciona la linea dos como proxima para escritura
Lcdout "Funcion_1.4"
WaitMs 3000
Lcdcmdout LcdClear
Lcdout "Pruebas LM35xZ"  'Escribe en el lcd
WaitMs 3000  'Espera 3Seg
Lcdcmdout LcdClear  'Borra el display, y cursor al principio de la primera linea
Lcdout "Lectura Pin RA4"  'Muestra los datos en el lcd
'--------------------------------Inicializa variable media_temperatura---------------------------
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
For media_indice = 0 To 19  'Indice para rocorrer todas las direcciones de memoria que forman la variable tipo array media_temp
media_temp(media_indice) = temperatura  'Se de el valor a media_temp
Next media_indice  'Terminacion del bucle For
media_indice = 0  'Se inicializa a cero, para un uso posterior
'--------------------------------------Main Programa-----------------------------------------------
main:
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
Gosub media_arit  'Salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'Llama a la funcion dvsion_dcmles, que retorna un long
Gosub print_lcd  'Salto con retorno, rutina muestra los datos por el LCD
WaitMs 1000  'Hace una pausa de 100mSeg
Goto main
End                                               
'**************************************Subrutinas**********************************************
'Subrutina lectura ADC, division y LCD
lee_adc:  '_______________________Lee la entrada analogica
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo guarda en adc_4
Return                                           
print_lcd:  '____________________Muestra los datos por el display
entero = division.HW  'Sede el word alto a entero, parte entera
decimal = division.LW  'Sede el byte alto del word bajo a decimal_1
Lcdcmdout LcdLine2Home  'Selecciona la primera linea y cursor al principio
Lcdout "ADC ", #adc_4, " T "  'Muestra los datos en el lcd
If signo = 0 Then Lcdout "+", #entero, "."  'Muestra los datos en el lcd
If signo = 1 Then Lcdout "-", #entero, "."  'Muestra los datos en el lcd
Lcdout #decimal, "C   "  'Muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'Variable local, contendra la parte entera
Dim f_resto As Word  'Varable local, contendra el resto
Dim f_decimal As Word  'Contendra la parte decimal
f_entera = dvdo / dvsor  'Obtengo la division
f_resto = dvdo Mod dvsor  'Obtengo el resto
f_decimal = (f_resto * 10) / dvsor  'Calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'Almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  'Almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos siempre
End Function                                     
'___________Calculo de la media aritmetica de la temperatura, 20 muestras
media_arit:
media_temp(media_indice) = temperatura  'Asigna el valor
temperatura = 0  'Se inicaliza a cero
For aux_media = 0 To 19  'Blucle for, se ejecuta 20 veces
temperatura = temperatura + media_temp(aux_media)  'Se suman los valores
Next aux_media  'Cierra for
temperatura = temperatura / 20  'Termina el calculo de la media
media_indice = media_indice + 1  'Controla la entrada de datos que corresponde a media_temp(x)
If media_indice > 19 Then media_indice = 0  'Acota el ultimo valor del indice de media_temp
Return                                           
'___________Calculo de la temperatura
temp_calculo:  'Calculo de la temperatura y del signo de la misma
If adc_4 > 112 Then  'Determina si la temperatura es superior a 0ºC
aux_adc_4 = adc_4  'Asigna el valor del ra4 a la variable auxiliar
aux_adc_4 = aux_adc_4 - 112  'Elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'Calcuala el valor de la temperatura sin coma decimal
signo = 0  'Temperatura positiva
Endif
If adc_4 = 112 Then  'Determina si la temperatura es 0ºC
temp = 0  'Temperatura 0ºC
signo = 0  'Asigna signo positivo
Endif
If adc_4 < 112 Then  'Determina si la temperatura es inferior a 0ºC
aux_adc_4 = adc_4  'Asigna el valor del RA4 a la variable auxiliar
aux_adc_4 = 112 - aux_adc_4  'Elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'Calcuala el valor de la temperatura sin coma decimal
signo = 1  'Asigna el simbolo menos a la temperatura
Endif
temperatura = temp  'Se pasa de Long a Word
Return

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 07 de Abril de 2007, 02:53:47
Hola, estuve simulando algunos programitas que expone lordfebre en PBP y traducioendolos para PSI (cambie algunas sintaxis)...pude emularlos todos con el PSI...(con 628A)

Tengo problemas cuando trato de hacer esto:

TRISB.0 = 0
Symbol led = PORTB.0
Symbol espera = WaitMs 1 (esta parte "dice" que esta MAL)
inicio:
High led
espera
Low led
espera
Goto inicio
End

Sin embargo si, anda este:

TRISB.0 = 0
Symbol led = PORTB.0
inicio:
High led
WaitMs 1
Low led
WaitMs 1
Goto inicio
End

No se puede hacer como en PBP: (del ejemplo de Lordfebre SEMAFORO)

inicio:
        High 0:LOW 1:low 2:low 3:low 4: high 5
        pause 1000
        High 0:high 1:low 2:low 3:low 4: high 5
        pause 1000
        low 0:LOW 1:high 2:high 3:low 4: low 5
        pause 1000
        low 0:LOW 1:high 2:high 3:high 4: low 5
        pause 1000
        goto inicio
end

Yo hice:

TRISB = 0
Symbol led0 = PORTB.0
Symbol led1 = PORTB.1
Symbol led2 = PORTB.2
Symbol led3 = PORTB.3
Symbol led4 = PORTB.4
Symbol led5 = PORTB.5

inicio:
High led0
Low led1
Low led2
Low led3
Low led4
High led5
WaitMs 1
High led0
High led1
Low led2
Low led3
Low led4
High led5
WaitMs 1
Low led0
Low led1
High led2
High led3
Low led4
Low led5
WaitMs 1
Low led0
Low led1
High led2
High led3
High led4
Low led5
WaitMs 1
Goto inicio
End

Un poco mas largo pero hace lo mismo...(Aca los SYMBOL andan BIEN !!! :shock:)

SALUDOS !!! (sigo intentando)

_____________________________
"Justo a mi, me toco ser Yo" QUINO


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 08:38:28
EJEMPLOS BASICOS:

1º, programa equivalente

Código: [Seleccionar]
'***********************************
'Ejemplo 1
'Solo para simulación, Basic PSI, v7.41
'Cambia de estado un PIN de forma cíclica
'Permite especificar el tiempo del Pin a nivel 1
'y el tiempo a nivel 0.
'***********************************
Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
AllDigital  'Todos los pin digitales
TRISB.0 = 0  'Puerto B como salidas
Symbol led = PORTB.0  'Asigna nombre al pin 0 del puerto B
inicio:  'Rutina principal del programa
High led  'Enciende led
Gosub tiempo_on  'Hace una pausa, salto con retorno
Low led  'Apaga led
Gosub tiempo_off  'Hace una pausa, salto con retorno
Goto inicio  'Crea un bucle infinito, sata a la etiqueta inicio
End  'Separa la rutina principal de las subrutinas y funciones.
'Subrutinas *******************
'Tiempo que el led estara encendido
tiempo_on:
WaitMs 500  'Espera 0.5Seg.
Return  'Retorna al programa                     
'Tiempo que el led estara apagado
tiempo_off:
WaitMs 500  'Espera 0.5Seg.
Return  'Retorna al programa   

El problema que hay es que hay muchas versiones de Basic, y no son exactamente iguales
y el PBP hace muchas cosas automaticas, particularmente esto es algo que no me gusta de
un lenguaje, ya que si quieres pasar a otro diferente tendras algunos inconvenientes.

PD: Es una opinion personal porque todo tiene sus ventajas y sus inconvenientes. :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 08:44:19
Symbol espera = WaitMs 1

Lo que hace el PBP es asignar WaitMs 1 a la palabra espera
asi que cada vez que escribes espera en el programa, cuando
compilas el compilador vuelve a sustituir espera por WaitMs.

En este caso Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
lo hace de forma automática de esta forma no se necesita realizar los cambios y
una vez terminadas las pruebas se suprime la línea.

Código: [Seleccionar]
'Ejemplo 1_1 *********************************************
'Cambia de estado un pin ***********************************
'Solo para simulación, Basic PSI, v7.41 ************************
'-------------------------------------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-----------inicializacion de los modulos internos del micro----------------
AllDigital  'deshabilita el ADC que esta por defecto, todas los pin I/O
TRISB.0 = 0  'PORTB.0 como salida
'Asignacion de nombres-------------------------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
'Cuerpo del programa  (rutina principal)----------------------------------
inicio:
High led  'Pin a nivel 1
WaitMs 500  'Pausa 0.5Seg.
Low led  'Pin a nivel 0
WaitMs 500  'Pausa 0.5Seg.
Goto inicio
End                                         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 09:03:38
Este programa funcionara en el simulador y en la realidad
los ejemplos que expones pueden funcionar en el simulador pero pueden que no funcionen en la realidad
ya que les falta configuraciones.
y el codigo del PBP si no estas bien inciado es dificil de leer por las asignaciones que permite hacer
a mi particularmente me gustan mas las definiciones clasicas como las que tienen otros lenguajes porque
hacen el programa mas legible en el tiempo.

Código: [Seleccionar]
'*****************************************
'Ejemplo 2
'Pic16F88, PSI v7.41
'Programa juego de lueces
'Usará el oscilador interno del pic por defecto a 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'---------------------------------------
AllDigital  'todas los pin como digitales, deshabilita el ADC que esta siempre por defecto
TRISA = 0  'Salidas excepto RA5
TRISB = 0  'Purto B como salida
Symbol led0 = PORTB.0  'Asignacion de nombres a Pin fisicos del micro
Symbol led1 = PORTB.1
Symbol led2 = PORTB.2
Symbol led3 = PORTB.3
Symbol led4 = PORTB.4
Symbol led5 = PORTB.5
'--------------------------Cuerpo del programa-----------------------
inicio:
High led0  'Pone a alto un pin
Low led1  'Pone a estado bajo un pin
Low led2
Low led3
Low led4
High led5
WaitMs 1000  'Hace una pausa de 1 Seg.

High led0
High led1
Low led2
Low led3
Low led4
High led5
WaitMs 1000

Low led0
Low led1
High led2
High led3
Low led4
Low led5
WaitMs 1000

Low led0
Low led1
High led2
High led3
High led4
Low led5
WaitMs 1000
Goto inicio  'Genera un bucle infinito, salta a la etiqueta inicio.
End  'Indica al compilador donde termina la rutina principal
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 09:40:36
Otra version:

Código: [Seleccionar]
'Ejemplo 3
'Pic16F88, PSI v7.41
'Cambia el estado de un pin
'Version: 2
'Oscilador interno y por defecto 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro
AllDigital  'Deshabilita el ADC que esta por defecto, todas los pin I/O
TRISA = 0  'Pins PORTA como salidas excepto el RA5
TRISB = 0  'Pins PORTB como salidas
'----------------Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
'-----------------cuerpo del programa------------------------------------
inicio:
Toggle led  'invierte el estado de un pin output
WaitMs 1000  'espera 1Seg.
Goto inicio  'Impide que se termine el programa
End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 09:50:04
Otro ejemplo utilizando el bucle condicional While/Wend:

Código: [Seleccionar]
'*********************************************************
'Ejemplo 4
'Pic16F88 o equivalente, PSI v7.41
'Cambia el estado de un pin
'Version: 3
'While/Wend
'Usará el oscilador interno del pic por defecto a 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro
AllDigital  'Pines como I/O que esta por defecto como analogicos
TRISA = 0  'Pines como salidas excepto RA5
TRISB = 0  'Pines como salidas
'----------------Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
'----------------Declaracion de variables-------------------------------
Dim buclemain As Byte
'-----------------Asignacion de valores a las variables
buclemain = 1
'-----------------Cuerpo del programa------------------------------------
'main:
While buclemain = 1  'Bucle While/Wend, se ejecuta mientas la igualdad sea cierta (bucle infinito)
Toggle led  'Invierte el estado de un pin output
WaitMs 1000  'Espera 1Seg.
Wend
'Goto main  'Impide que se termine el programa (bucle infinito)
End

PD: Aqui se puede suprimir "main y goto main", porque While/Wend en este caso trabaja como bucle es infinito.
En la realidad no se usa el bucle infinito tipo "main/goto main" o "inicio/goto inicio" se usa un bucle tipo While/Wend.
El goto se usa en basic para realizar la rutina principal por tradición y solo se usa una sola vez en el programa porque
hace más de 3 décadas que no se recomienda su uso en lenguajes de alto nivel, si se está siguiendo un libro que los utiliza
a diestro y siniestro hay que tener presente que se está siguiendo un tipo de programación obsoleta.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 10:02:48
Uno mas:

Cambio de flujo en un programa:
Recuerda que NUNCA se realiza el cambio de flujo de un código utilizando el comando Goto obsoleto.

Código: [Seleccionar]
'*******************************************************
'Ejemplo 5
'Pic16F88 y compatibles, PSI v7.41
'Cambia el estado de un pin
'Version: 4
'While/Wend, If/Then
'Oscilador interno y por defecto 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro-------------
AllDigital  'deshabilita el ADC que esta por defecto, todas los pin I/O
TRISA = 0  'Puerto A como salidas menos RA5
TRISB = 0  'Puerto B como salidas
TRISB.1 = 1  'RB1 como entrada
'Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
Symbol tecla = RB1  'RB1 es la forma abreviada de PORTB.1
'Declaracion de variables-------------------------------
Dim buclemain As Byte
'Asignacion de valores a las variables
buclemain = 1
'Cuerpo del programa------------------------------------
'main:
While buclemain = 1  'bucle While/Wend, se ejecuta mientas la igualdad sea cierta
Toggle led  'invierte el estado de un pin output
WaitMs 1000  'espera 1Seg.
If tecla = 1 Then buclemain = 0  'Proboca que termine el bucle
Wend
'Goto main  'Impide que se termine el programa
End                                         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 10:06:59
Otro equivalente al anterior:
Esta versión seria más correcta.

Código: [Seleccionar]
      '*******************************************************
'Ejemplo 6
'Pic16F88 y compatibles, PSI v7.41
'Cambia el estado de un pin
'Version: 4
'While/Wend, If/Then
'Oscilador interno y por defecto 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro-------------
AllDigital  'deshabilita el ADC que esta por defecto, todas los pin I/O
TRISA = 0  'Puerto A como salidas menos RA5
TRISB = 0  'Puerto B como salidas
TRISB.1 = 1  'RB1 como entrada
'Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
Symbol tecla = RB1  'RB1 es la forma abreviada de PORTB.1
'Cuerpo del programa------------------------------------
'main:
While tecla = 0  'bucle While/Wend, se ejecuta mientas la igualdad sea cierta
Toggle led  'invierte el estado de un pin output
WaitMs 1000  'espera 1Seg.
Wend
'Goto main  'Impide que se termine el programa
End                                     
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 10:31:18
Uno mas:

Código: [Seleccionar]
'************************************************************
'Ejemplo 7
'Pic16F88 o similar, PSI v7.41
'Cambia el estado del puerto B (Contador en Binario)
'Version: 1
'While/Wend, If/Then, incremento de variables, salida datos por pueto
'Oscilador interno y por defecto 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro-------------
AllDigital  'Pin com I/O, deshabilita los pin como analogicos
TRISA = 0  'Puerto A como salidas excepto RA5
TRISB = 0  'Puerto B como salidas
TRISA.0 = 1  'RA0 como entrada
PORTB = 0  'El puerto B tendra todos los pin en estado bajo
'----------------Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
Symbol tecla = PORTA.0
'-----------------Declaracion de variables-------------------------------
Dim a As Word  'Declaracin de la variable a como de 16bit
'-----------------Asignacion de valores a las variables
a = 0
'-----------------Cuerpo del programa------------------------------------
'main:
'________Si el valor de la variable "a" es mayor que 255 termina el programa
While a <= 255  'Bucle While/Wend, se ejecuta mientas la igualdad sea cierta
PORTB = a  'Sale el valor de "a" por el puerto B, en binario
WaitMs 1000  'Espera 1Seg.
a = a + 1  'Incrementa el valor de a
If tecla = 1 Then a = 256  'RA0=1 termina el programa
Wend
'Goto main  'Impide que se termine el programa
End         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 10:33:42
Si me sugeris algun ejemplo en concreto la posteo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 07 de Abril de 2007, 13:02:10
Gracias COS, por los ejemplos, para mi resultan muy didacticos...me gustaria, de ser posible, algunos con shift (desplazamientos o rotaciones)...y como se pueden construir "tablas" (como en ASM) ???

Lo que preguntaba en concreto...era porque no podia hacer "SYMBOL espera WaitsMs = 1 en PSI"... (el PBP usa PAUSE) y vi que el PROTON usa DELAY (esto ultimo no lo puedo asegurar), todas estas "sintaxis" hacen lo mismo, en sus respectivos compiladores...La verdad que una falta de coherencia, de sus creadores...porque no hicieron todos iguales ???  :?

En la pagina de AITOPES, hay un ejemplo, similar...que calculo, NO debe andar !!! Pero donde esta AITOPES ???

Otra pregunta que hacia, estaba referida a saber si como en PBP, no se podia poner, todo en una linea, separado por : (dos puntos), para indicar el estado de los HIGH y LOW...en PSI, tuve que ponerlo todo alineado (hacia abaja)...No se pueden separar con : (dos puntos) o , (comas) o algo ???

En fin, con tiempo, me voy adentrando a las virtudes de este lenguaje !!!

SALUDOS y gracias por los ejemplos !!!

_____________________________
"Justo a mi, me toco ser Yo" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 14:49:48
Pues parece que la declaracion de sentencias en una misma linea este Basic no lo permite, pero es que nunca jamas he colocado dos sentencias en una misma linea,
en ningun lenguaje.

y la asignacion de etiquetas a sentencias, tampoco lo he probado nunca, pero parece que este Basic tampoco lo permite.

y lo de tablas de ASM pues no se exactametne a lo que te refieres, pero si terefieres al tema de hacer asignaciones en una misma linea para declarar por ejemplo
la codificacion de un display de 7 segmentos, pues si lo permite.

te lo busco en el manual.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 14:57:39
LOOKUP function can be used to select one from the list of Byte constants, based on the value in the index Byte variable, that is supplied as the last separated argument of the function. The first constant in the list has index value 0. The selected constant will be loaded into the result Byte data type variable. If the value in the index variable goes beyond the number of constants in the list, the result variable will not be affected by the function. Here is one small example for a 7-segment LED display:
DIM DIGIT AS BYTE
DIM MASK AS BYTE
loop:
TRISB = %00000000
FOR DIGIT = 0 TO 9
   MASK = LOOKUP(0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F), DIGIT
   PORTB = MASK
   WAITMS 1000
NEXT DIGIT
GOTO loop

If all constants in the list (or part of them) are ASCII values, then shorter form of the list can be created by using string arguments. For example:
MASK = LOOKUP("ABCDEFGHIJK"), INDEX

SHIFTLEFT and SHIFTRIGHT functions can be used to shift bit-level representation of a variable left and right. The first argument is input variable and the second argument is number of shifts to be performed. Here are two examples:
TRISB = 0x00
PORTB = %00000011
goleft:
WAITMS 250
PORTB = SHIFTLEFT(PORTB, 1)
IF PORTB = %11000000 THEN GOTO goright
GOTO goleft
goright:
WAITMS 250
PORTB = SHIFTRIGHT(PORTB, 1)
IF PORTB = %00000011 THEN GOTO goleft
GOTO goright


TRISB = 0x00
PORTB = %00000001
goleft:
WAITMS 250
PORTB = SHIFTLEFT(PORTB, 1)
IF PORTB.7 THEN GOTO goright
GOTO goleft
goright:
WAITMS 250
PORTB = SHIFTRIGHT(PORTB, 1)
IF PORTB.0 THEN GOTO goleft
GOTO goright

Structured programs can be written using subroutine calls with GOSUB statement that uses line label name as argument. Return from a subroutine is performed by RETURN statement. User need to take care that the program structure is consistent. When using subroutines, main routine need to be ended with END statement. END statement is compiled as an infinite loop. Here is an example:
SYMBOL ad_action = ADCON0.GO_DONE
SYMBOL display = PORTB
TRISB = %00000000
TRISA = %111111
ADCON0 = 0xC0
ADCON1 = 0
HIGH ADCON0.ADON
main:
GOSUB getadresult
display = ADRESH
GOTO main
END
getadresult:
HIGH ad_action
WHILE ad_action
WEND
RETURN
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 07 de Abril de 2007, 16:35:15
Perdon COS, nose si sentencia es la palabra, yo lo preguntaba, para saber si habia alguna analogia entre esto, que esta escrito para PBP:

High 0:LOW 1:low 2:low 3:low 4: high 5
        pause 1000

En donde se elige el estado de los bits (en este caso del PORTB), desde una sola linea (renglon)...

Queria saber si se podia hacer algo similar en PSI...separando con comas o algo asi...fijate que en PBP se separa con :(dos puntos)...para lograr lo mismo, con el PSI, tuve que escribir...

high led0
low led1
low led2
low led3
low led4
high led5
WaitMs 1000

Sigo a full, con tus ejemplos...me andan todos...los demas podrian animarse, este soft es espectacular, lo de la simulacion esta barbaro...en el website de VLADIMIR SOSO (su autor) hay ejemplos...y hasta un grabador por puerto paralelo, para la serie 16 y 18...(hay que tener preinstalado el simulador)...SALUDOS !!!


PDTA: la remilP_T_ que lo REPARIO...No podremos ganar nunca la DAVIS !!! :x
______________________________
"Justo a mi, me toco ser YO" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 07 de Abril de 2007, 17:27:06
En otro hilo, BRUNO, propuso un ejercicio para poder setear un BIT a voluntad (de cualquier registro), sin alterar el valor del mismo...Yo pude hacerlo en ASM, porque me resulta mas facil, conceptualmente el uso de las instrucciones con los resultados esperados...Como puede hacerse lo mismo en BASIC...

Por ejemplo si tengo un registro MIREG cargado con 00101001 y quiero poner un 1 en el BIT N٥ 2, de manera que MIREG ahora valga 00101101, como se puede hacer en BASIC...

Gracias por responder !!!

______________________________
"Justo a mi, me toco ser YO" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 18:29:47
Otro ejemplo:

Código: [Seleccionar]
  '******************************************************
'Ejemplo 8
'Pic16F88 o similar, PSI v7.41
'Cambia el estado del puerto B
'Versión: 2
'Bucle For/Next, ShiftRight, ShiftLeft, salida datos por puerto B
'Efecto coche fantástico.
'Oscilador interno y por defecto 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro-------------
AllDigital  'Pin como I/O, deshabilita pin analogicos
TRISA = 0  'Puerto A como salida excepto RA5
TRISB = 0  'Puerto B como salida
PORTB = 0  'B tendra todos los pin en estado bajo
'----------------Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
'-----------------Declaracion de variables-------------------------------
Dim a As Word  'Declaración de la variable a como de 16bit
Dim i As Byte  'Variable indice para el bucle For/Next, esta variable no
'importa el valor que tenga cuando llegue al bucle For este la inicializa
'----------------Asignacion de valores a las variables
a = %10000000  'Se da el valor de entrada en forma binaria, no importa en que formato
'se asigne el valor a una variable o registro, el compilador internamente siempre
'lo transforma a binario.
'----------------Cuerpo del programa------------------------------------
inicio:
For i = 1 To 7  'La variable i tomara los valores comprendidos entre 1 to 7
PORTB = a  'Saca el valor de la variable por el puerto B
a = ShiftRight(a, 1)  'Desplaza la variable a un bit a la derecha
WaitMs 1000  'Espera 1Seg.
Next i  'i = 7 termina el bucle y se incrementa i en uno (i=8)
For i = 1 To 7  'La variable i tomara los valores comprendidos entre 1 to 7
PORTB = a  'Saca el valor de la variable por el puerto B
a = ShiftLeft(a, 1)  'Desplaza la variable a un bit a la izquierda
WaitMs 1000  'Espera 1Seg.
Next i  'Si i = 7 termina el bucle y se incrementa i en uno (i=8)
Goto inicio  'Impide que se termine el programa
End                                           

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 18:39:51
Lo ideal para simular el programa:

(http://img404.imageshack.us/img404/9108/ejemplo9rp9.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 18:45:24
Pudes cargar un registro completo de la forma tradicional, que es la que yo utilizo:

PORTB = %01010101

Y con respecto a cambiar uno o varios bit de un registro pues tambien la forma tradicional:

Mirg = Mirg And %11111110 ' pone a cero el bit 0 del registro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 18:59:51
En el ejemplo pasado de la pagina 5, se ve claramente el uso de ShiftRight y tambien modificacion de bit de una variable
esta en la rurina "lee_hora", que nos pasa de BCD a decimal, suprimiendo antes los bit de control del RTC.

Citar
Aqui dejo un ejemplito:
-Ya se puede cambiar la hora del reloj
-Los datos a cambiar quedan en modo parpadeo
-Se modifican solo con dos teclas
-Las teclas responden muy bien, sin fallos, si pulsas rapido respondes rapidas y si pulsas lento van lentas.

Código:

'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_RTC_12
'MICRO: PIC16f88A

http://www.todopic.com.ar/foros/index.php?topic=14917.80
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2007, 19:32:52
hay otras formas tambien de modificar un bit o comprobar en que estado se encuentra.

a.0 = 1 ' el bit de menos peso de a sera igual a 1, dejando el resto como estaban

a=%10000000 'esto es igual que a=128, el %indica que el numero a continuacion esta expresado en binario
b=0 ' esto es igual que b =%00000000
b.0 = a.7
if b = 1 then *****
if b = 0 then *****

esto se puede hacer de una u otra forma con cualquier longitud de registro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Abril de 2007, 17:34:54
Y fusionando el programa del RTC con el de Temperatura:

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_10
'MICRO: PIC16F88A
'FECHA/AUTOR: 04/07 - By COS, PSI v7.41
'Version 1.0
'DESCRIPCION: Muestra en el display la fecha, hora (24h)mediante el DS1307 y temperatura (LM35)
'S1 y S2 pulsadas al mismo tiempo, entramos en programacion del reloj
'Una vez en programacion con S1 seleccionamos el dato a cambiar, este queda en modo parpadeo
'Una vez en programacion con S2 incrementamos el dato seleccionado dentro de sus cotas
'S1, pulsado al principio salida del RTC a on, 1Hz, y S2 salida a off, led off
'Se muestra la temperatura en el LCD mediante un LM35, temperatura positiva y negativa
'************************************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Solo para simulación, acelera los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'Asignacion de nombres ----------------------------------------------
Symbol sda = PORTB.1  'Asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.4  'Asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
Symbol luz_lcd = PORTB.3  'Retroiluminacion del lcd
Symbol s1 = RA6  'Se asigna nombre a la tecla
Symbol s2 = RA5  'Se asigna nombre a la tecla
'Definicion de variables ----------------------------------------------
'Variables de los timer -----------------------------------------------
Dim aux_pause As Word  'Variable auxiiar el PAUSE
Dim pause As Word  'Contiene el valor para simular el comando Waitms
Dim timer_1ms As Byte  'Base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_base As Byte  'Tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'Contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'Base de tiempos en ms
Dim timer2_ms As Word  'Base de tiempos en ms
Dim timer3_ms As Word  'Base de tiempos ms
Dim timer1_100ms As Byte  'Base de tiempos msx100
Dim timer2_100ms As Byte  'Base de tiempos msx100
Dim timer3_100ms As Byte  'Base de tiempos msx100
Dim timer1_ms_tiempo As Word  'Contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'Contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'Contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'Contiene el valor del tiempo del timer3_100ms
'Variables Programa RTC ------------------------------------------
Dim aux_4h As Byte  'Contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'Contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'Variable indice
Dim reg(7) As Byte  'Contendra los valores finales de fecha y hora en el sistema decimal
Dim flash_1 As Bit  'Controla el parpadeo de los digitos del lcd, activo a 1
Dim dato As Byte  'Indica la direccion del RTC a cambiar de valor
Dim flag_1 As Bit  'Activa la rutina de ajuste del reloj, activo a 1
Dim s1_on As Bit  'Tecla pulsada si s1_on=1
Dim s2_on As Bit  'Tecla pulsada si s2_on=1
Dim aux_ajuste As Byte  'Variable auxiliar para la rutina de ajuste
'Variables del ADC y Rutina division (temperatura) ---------
Dim entero As Word  'Parte entera
Dim decimal As Word  'Los dos decimales
Dim division As Long  'Almacenara el numero con los dos decimales
Dim adc_4 As Word  'Contendra el valor de la entrada del ADC
Dim aux_adc_4 As Word  'Auxiliar
'Variables temperatura -----------------------------------------------
Dim factor_escala As Word  'Contiene el factor de correcion para pasar el valor del ADC a voltios, max. 5V
Dim temperatura As Word  'Almacena la temperatura final
Dim temp As Long  'Contendra la temperatura completa sin coma
Dim signo As Bit  'Indica el signo de la temperatura
'Variables calculo media aritmetica (temperatura) ----------
Dim media_temp(20) As Word  'Numero de muestras para calcular la media aritmetica
Dim media_indice As Byte  'Se utiliza como indice
Dim aux_media As Byte  'Variable auxiliar
'Asignaciones ----------------------------------------------------------
Dim error As Byte
error = 0
'Asignacion de valores a las variables (RTC) ---------------
s1_on = 0
s2_on = 0
dato = 7  'Tuera de ajuste o modo normal de trabajo del reloj, de 0 a 6 modo ajuste
flash_1 = 0
flag_1 = 0
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'Temporiza 100 mSeg
timer1_ms_tiempo = 50  'Temporiza 50m Seg.
timer2_ms_tiempo = 500  'Temporiza 500 mSeg.
timer3_ms_tiempo = 5  'Temporiza 5 mSeg.
timer1_100ms_tiempo = 10  'Temporiza 1 Seg.
timer2_100ms_tiempo = 255  'Temporiza 25.5 Seg.
timer3_100ms_tiempo = 1  'Temporiza 0.1seg.
'Asiganacion de valores a las variables (temperatura) -----
entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 10  'Factor de escala para un decimal
temperatura = 0
temp = 0
media_indice = 0
aux_media = 0
'Asignacion de I/O y valores de inicio de las salidas ------
Define ADC_SAMPLEUS = 10  'El minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________Registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'Voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'ANSEL = %00000000  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'Inicializacion de TMR1 e Interrupciones ------------------
T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'Factor del preescales del timer1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'Habilitacion del TMR1, comienza a incrementarce
'PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
'-----------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
PIE1.TMR1IE = 1  'Habilita interrupcion del timer1
pause = 1000
Gosub pause_ms  'Espera el tiempo indicado en pause
Lcdout "16F88LCD_RTC/I2C"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Seleciona la linea dos como proxima para escritura
Lcdout "ADC_Temperatura"  'Escribe en el lcd
pause = 3000
Gosub pause_ms  'Espera el tiempo indicado en pause
Lcdcmdout LcdClear  'Borra el display y cursor a casa
'Inicializa media_temperatura -----------------------------
Gosub inicializa_temp
'Inicializa los registros del RTC ---------------------------
Gosub inicaliza_rtc
'Inicializa la salida del RTC --------------------------------
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
If s1 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x10  'Salida a 1hz, a on
If s2 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x80  'Salida a off, led off
PIE1.TMR1IE = 1  'Habilita las interrupciones del timer1
pause = 1000
Gosub pause_ms  'Espera el tiempo indicado en pause
'Bucle principal
main:
error = 0
If s1 = 1 And s1_on = 1 Then s1_on = 0  'Libera el pulsador S1, control anti-rebotes tecla
If s2 = 1 And s2_on = 1 Then s2_on = 0  'Libera el pulsador S2, control anti-rebotes tecla
If s1 = 0 And s2 = 0 And s1_on = 0 And s2_on = 0 And flag_1 = 0 Then  '________Modo ajuste
flag_1 = 1  'Activa la rutina de ajustes
dato = 0  'Activo cambio de la hora
timer1_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S1
timer3_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S2
s1_on = 1  'Bloquea la tecla S1, elimina rebotes
s2_on = 1  'Bloquea la tecla s2, elimina rebotes
Endif  '___________________
If flag_1 = 1 Then Gosub ajuste_reloj  '__________Saltamos a la rutina de ajuste
If timer3_100ms >= timer3_100ms_tiempo Then  'Actualiza datos en el lcd cada 100ms
Gosub lee_hora  'Lee la fecha y hora del reloj
Gosub print_lcd  'Actualiza los datos del reloj en el display
timer3_100ms = 0
Endif  '__________________

If timer2_100ms >= timer2_100ms_tiempo Then
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
Gosub media_arit  'Salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'Llama a la funcion dvsion_dcmles, que retorna un long
timer2_100ms = 0
Endif
Goto main
End                                               
'********************************* Subrutinas **********************************************
inicaliza_rtc:  'Inicializa el reloj----------------------------------------
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, 0, reg(0)  'Leo los segundos
reg(0) = reg(0) And %01111111  'Habilito bit de control que activa el reloj
I2CWrite sda, scl, 0xd0, 0, reg(0)  'Escribo el registro de los segundos
I2CRead sda, scl, 0xd0, 1, reg(0)  'Leo el registro de los minutos
reg(0) = reg(0) And %10111111  'Habilito bit de control que activa el formato de 24h
I2CWrite sda, scl, 0xd0, 0, reg(0)  'Escribo el registro de los minutos
'Inicializa la salida del RTC -------------------------------------------
If s1 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x10  'Salida a 1hz, a on
If s2 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x80  'Salida a off, led off
ajuste_reloj:  'Rutina de ajuste del reloj
If s1 = 1 And s1_on = 1 Then s1_on = 0  'Libera el pulsador S1, control anti-rebotes tecla
If s2 = 1 And s2_on = 1 Then s2_on = 0  'Libera el pulsador S2, control anti-rebotes tecla
'________________________Control posicion del dato a variar en el reloj
If s1 = 0 And s1_on = 0 And s2 = 1 Then  'Detecta tecla S1 y eliminacion de rebotes de la misma
If timer1_ms >= timer1_ms_tiempo Then  'Establece el retraso entre pulsaciones de S1
dato = dato + 1  'Seleciona el dato a ser modificado
s1_on = 1  'La tecla queda bloqueada
If dato > 6 Then flag_1 = 0  'Indica fin de rutina de ajuste
timer1_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S1
Endif
Endif  '_____________________________
'____________Lectura de la hora para su modificacion y posterior grabacion, rutina BCD
If s2 = 0 And s2_on = 0 And s1 = 1 Then  'Deteca tecla S2 y eliminacion de rebotes de la misma
If timer3_ms >= timer3_ms_tiempo Then  'Establece el retraso entre pulsaciones de S2
s2_on = 1  'La tecla queda bloqueada
timer3_ms = 0  'Resetea la base de tiempos de retraso entre pulsacion y pulsacion de S2
If dato < 7 Then  'Limita la direcciones de trabajo del reloj
Gosub lee_hora  'Lee los datos de los regis. RTC y los pasa a decimal, elimina los bit de control
aux_ajuste = reg(dato)  'Hace una imagen del valor del registro a modificar
aux_ajuste = aux_ajuste + 1  'Incrementa el dato a modificar que fue seleccionado
If dato = 2 And aux_ajuste > 23 Then aux_ajuste = 0  'Acota horas
If dato = 0 Or dato = 1 Then  'Acota segundos y minutos
If aux_ajuste > 59 Then aux_ajuste = 0
Endif
If dato = 3 And aux_ajuste > 7 Then aux_ajuste = 1  'Acota el dia de la semana
If dato = 4 And aux_ajuste > 31 Then aux_ajuste = 1  'Acota el dia del mes
If dato = 5 And aux_ajuste > 12 Then aux_ajuste = 1  'Acota el mes
If dato = 6 And aux_ajuste > 30 Then aux_ajuste = 1  'Acota el año, año maximo 2030
If aux_ajuste > 49 And aux_ajuste < 60 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 50
aux_ajuste.4 = 1
aux_ajuste.6 = 1
Endif
If aux_ajuste > 39 And aux_ajuste < 50 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 40
aux_ajuste.6 = 1
Endif
If aux_ajuste > 29 And aux_ajuste < 40 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 30
aux_ajuste.4 = 1
aux_ajuste.5 = 1
Endif
If aux_ajuste > 19 And aux_ajuste < 30 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 20
aux_ajuste.5 = 1
Endif
If aux_ajuste > 9 And aux_ajuste < 20 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 10
aux_ajuste.4 = 1
Endif
If aux_ajuste < 10 Then aux_ajuste = aux_ajuste  'Decimal a BCD
If dato = 0 Then aux_ajuste.7 = 0  'Restaura el bit de configracion, activa el oscilador del reloj
If dato = 2 Then aux_ajuste.7 = 0  'Restaura el bit, no lo utiliza el RTC
If dato = 2 Then aux_ajuste.6 = 0  'Restaura el bit de configuracion, reloj 24h
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
I2CWrite sda, scl, 0xd0, dato, aux_ajuste  'actualiza el dato ya modificado
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
Endif
Endif
Endif  '____________
'__________Controla el parpadeo de los digitos cuando el modo selec es activo
If timer2_ms >= timer2_ms_tiempo Then  'Tiempo del parpadeo
If flash_1 = 1 Then  'Selecciona si el dato a modificar es visible o no
flash_1 = 0  'Dato es visible
Else
flash_1 = 1  'Dato no es visible
Endif
timer2_ms = 0  'Recarga la base de tiempos
Endif  '______________
Return                                           
lee_hora:  'Lee la hora del RTC en formato BCD y la pasa a decimal
i = 0  'Variable indice, asigna los datos de forma ordenada, leidos del RTC
While i <= 6  'Se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, i, reg(i)  'Lectura de la direccion de memoria indicada del RTC, formato BCD
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
aux_4l = reg(i) And %00001111  'Eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'Segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %01110000  'Minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %00110000  'Horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %00000000  'Dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %00110000  'Dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %00010000  'Mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'Año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'Convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'Fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'Incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'Fin del bucle y salta a While
Return                                           
print_lcd:  'Rutina de escritura en el lcd
Lcdcmdout LcdLine1Home  'Cursor del lcd a la izquierda en la linea 1
If dato = 2 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de la hora
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(2) < 10 Then Lcdout "0"  'Si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2)  'Escribe la hora
Endif
Lcdout ":"  'Escribe el separador
If dato = 1 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los minutos
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(1) < 10 Then Lcdout "0"  'Si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1)  'Escribe los minutos
Endif
Lcdout ":"  'Escribe el separador
If dato = 0 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los segundos
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(0) < 10 Then Lcdout "0"  'Si segundos es inferior a 10 escribe el cero delante
Lcdout #reg(0)  'Escribe los segundos
Endif
Gosub print_lcd_temp  'Salto con retorno a la rutina de impresion de la temperatura
Lcdcmdout LcdLine2Home  'Cursor del lcd a la izquierda en la linea 2
If dato = 3 And flash_1 = 1 Then  'Control final del parpadeo de los digitos del dia semana
Lcdout "    "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(3) = 1 Then Lcdout "Dom."  'Asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun."
If reg(3) = 3 Then Lcdout "Mar."
If reg(3) = 4 Then Lcdout "Mie."
If reg(3) = 5 Then Lcdout "Jue."
If reg(3) = 6 Then Lcdout "Vie."
If reg(3) = 7 Then Lcdout "Sab."
Endif
Lcdout " "  'Escribe separador
If dato = 4 And flash_1 = 1 Then  'Control final del parpadeo de los digitos del dia del mes
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(4) < 10 Then Lcdout "0"  'Si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4)  'Escribe el dia del mes
Endif
Lcdout "/"  'Escribe el separador
If dato = 5 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los meses
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(5) < 10 Then Lcdout "0"  'Si mes es inferior a 10 escribe cero
Lcdout #reg(5)  'Escribe el mes
Endif
Lcdout "/20"  'Separador y los dos primeros digitos del año de 4 digitos
If dato = 6 And flash_1 = 1 Then  'Control final del parpadeo de los digitos de los años
Lcdout "  "  'Borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(6) < 10 Then Lcdout "0"  'Si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'Escribe el año
Endif
Return                                           
'--------------------------------------Subrutina lectura ADC, division y LCD
lee_adc:  '_______________________Lee la entrada analogica
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo guarda en adc_4
Return                                           
print_lcd_temp:  '____________________Muestra los datos por el display
entero = division.HW  'Sede el word alto a entero, parte entera
decimal = division.LW  'Sede el byte alto del word bajo a decimal_1
Lcdout " "
If signo = 0 Then Lcdout "+", #entero, "."  'Muestra los datos en el lcd
If signo = 1 Then Lcdout "-", #entero, "."  'Muestra los datos en el lcd
Lcdout #decimal, "C   "  'Muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'Variable local, contendra la parte entera
Dim f_resto As Word  'Variable local, contendra el resto
Dim f_decimal As Word  'Contendra la parte decimal
f_entera = dvdo / dvsor  'Obtengo la division
f_resto = dvdo Mod dvsor  'Obtengo el resto
f_decimal = (f_resto * 10) / dvsor  'Calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'Almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  'Almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos siempre
End Function                                     
'___________Calculo de la media aritmetica de la temperatura, 20 muestras
media_arit:
media_temp(media_indice) = temperatura  'Asigna el valor
temperatura = 0  'Se inicaliza a cero
For aux_media = 0 To 19  'Blucle for, se ejecuta 20 veces
temperatura = temperatura + media_temp(aux_media)  'Se suman los valores
Next aux_media  'Cierra for
temperatura = temperatura / 20  'Termina el calculo de la media
media_indice = media_indice + 1  'Controla la entrada de datos que corresponde a media_temp(x)
If media_indice > 19 Then media_indice = 0  'Acota el ultimo valor del indice de media_temp
Return                                           
'___________Calculo de la temperatura
temp_calculo:  'Calculo de la temperatura y del signo de la misma
If adc_4 > 112 Then  'Determina si la temperatura es superior a 0ºC
aux_adc_4 = adc_4  'Asigna el valor del ra4 a la variable auxiliar
aux_adc_4 = aux_adc_4 - 112  'Elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'Calcuala el valor de la temperatura sin coma decimal
signo = 0  'Temperatura positiva
Endif
If adc_4 = 112 Then  'Determina si la temperatura es 0ºC
temp = 0  'Temperatura 0ºC
signo = 0  'Asigna signo positivo
Endif
If adc_4 < 112 Then  'Determina si la temperatura es inferior a 0ºC
aux_adc_4 = adc_4  'Asigna el valor del RA4 a la variable auxiliar
aux_adc_4 = 112 - aux_adc_4  'Elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'Calcuala el valor de la temperatura sin coma decimal
signo = 1  'Asigna el simbolo menos a la temperatura
Endif
temperatura = temp  'Se pasa de Long a Word
Return                                           
inicializa_temp:  '__________Inicializa la media aritmetica de la temperatura en el arranque
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
For media_indice = 0 To 19  'Indice para rocorrer todas las direcciones de memoria que forman la variable tipo array media_temp
media_temp(media_indice) = temperatura  'Se de el valor a media_temp
Next media_indice  'Terminacion del bucle For
media_indice = 0  'Se inicializa a cero, para un uso posterior
Gosub media_arit  'Salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'Llama a la funcion dvsion_dcmles, que retorna un long
Return                                           
pause_ms:  'Rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
aux_pause = 0  'Variable auxiliar lleva la cuenta de los ms
timer_1ms = 0  'Al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= pause  'Tiempo en mSeg maximos a contar
aux_pause = aux_pause + 1  'Variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0  'Al borrar el contador se activa y cuenta 1mSeg
While timer_1ms < 1  'Espera un miliesegundo
Wend
Wend
Return                                           
'***********************************Interrupciones*****************************************************
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'Comprueba que la interrupcion del timer1 es activa
'_________________Bases de tiempos
timer_base = timer_base + 1  'Contador general
If timer_1ms < 1 Then timer_1ms = timer_1ms + timer_1ms + 1  'Contador para control de la rutina Pause
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'Contador
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'Contador
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'Contador
If timer_base >= timer_base_tiempo Then  'Limita el timepo de ejecucion, cada timer_base_tiempo
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'Contador
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'Condtador
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'Contador
timer_base = 0  'Reset a la base de tiempos
Endif  '________________Fin bases de tiempos
TMR1H = 0xf8  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'Recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
Endif
If s1 = 0 Then led_verde = 0  'Muestra el estado de la tecla, tecla S1 a on, led verde a on
If s1 = 1 Then led_verde = 1  'Muestra el estado de la tecla, tecla S1 a off, led verde a off
If s2 = 0 Then led_amarillo = 0  'Muestra el estado de la tecla, tecla S2 a on, led amarillo a on
If s2 = 1 Then led_amarillo = 1  'Muestra el estado de la tecla, tecla S2 a on, led amarillo a on
Resume  'Activa las interrupciones y retorna el curso normal del programa, antes del salto                                                                                       
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Abril de 2007, 17:38:16
Código: [Seleccionar]
'---------------

PD. no puse el archivo correcto, ahora si...  :mrgreen:

PD: 03/06/08
      I2CWrite sda, scl, 0xd0, x, x
      I2CRead sda, scl, 0xd1, x, x
      0xd0 = %11010000 => Seleccion del chip DS1307 y modo escritura
      0xd1 = %11010001 => Seleccion del chip DS1307 y modo lectura
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead, por lo que su valor
      es indiferente, la funcion I2CWrite lo pondra a valor "0" de forma automatica y al ser compilada tambien I2CRead lo colocara a 1.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Abril de 2007, 17:40:29
Lo tuve que pegar en dos partes..  :mrgreen:

y una foto para no variar de costumbres...  :D

(http://img136.imageshack.us/img136/2212/rtctempcd4.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Abril de 2007, 19:16:47
Ahora le toco el control a un servo Futaba S3003:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_RB4
'Descripcion: Control de un servomotor (Futaba S3003) usando el ADC, Timer1, Interrupciones
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 4/07, By COS
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'uso del timer1 para controlar el PWM
'lectura de entrada analogica y conversion a tiempo
'conversion de tiempo a valores a cargar en el timer1
'************************************************************************************************
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA  'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5  'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'****************************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'--------------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'------------------------------------declaracion de variables---------------------------------------
'************************************variables de los timer****************************************
'-------------------------------Variables del ADC y Rutina division------------------------------
Dim adc_4 As Word  'contiene el valor de la entrada ADC
'-------------------------------------------------------------------------------------------------
Dim pwm As Word  'variable de paso
Dim pwm_nop As Word  'variable de paso
Dim aux_pwm As Long  'calculo del tiempo a ON, de la señal de control
Dim aux_pwm_nop As Long  'calculo del tiempo a OFF, de la señal de cotrol
Dim timer_pwm As Word  'valor del tiempo a on, para ser interpretado
Dim timer_pwm_nop As Word  'valor del tiempo a off, para ser interpretado
Dim flag1_pwm As Byte  'variable que determina si ON o a OFF de la señal de control
Dim flag2_pwm As Byte  'controla la actualizacion de una nueva posicion del servo
'--------------------------------Variables generales-----------------------------------------------
'------------------------------------asignacion de valores a las variables--------------------------
pwm = 62535
pwm_nop = 28535
aux_pwm = 62535
flag1_pwm = 1
flag2_pwm = 0
adc_4 = 0
'------------------------------------Definicion de puertos------------------------------------------
Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off, negado
PORTB.0 = 1  'led verde a off, negado
'------------------------------------Inicializacion de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
'PIE1.TMR1IE = 1  'activa las interrupciones del timer1
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
'------------------------------------Inicio-------------------------------------------------------
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "LCD_Tmr1_ADC_PWM"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Servo S3003"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
Lcdcmdout LcdClear  'borra el display
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
'------------------------------------rutinas del Programa----------------------
main:  'comienza el programa principal
If flag2_pwm = 1 Then  'permite una nueva posicion del servo
Gosub lee_adc  'salto con retorno a la rutina de lectura del ADC
aux_pwm = ((adc_4 + 213) * 223) / (1023 + 213)  'tiempo a ON de la señal de control del servo
'213, es el valor que se le asigna por defecto al ADC cuando el potenciometro esta a cero
If aux_pwm < 45 Then aux_pwm = 45  'tiempo minimo a ON, de la señal de control del servo
aux_pwm_nop = 2000 - aux_pwm  'calculo del tiempo de la señal de control a OFF
aux_pwm_nop = 65535 - ((aux_pwm_nop * 100) / 5)  'valor a cargar en el timer1, OFF
aux_pwm = 65535 - ((aux_pwm * 100) / 5)  'valor a cargar en el timer1, ON
pwm = aux_pwm  'se cambia de long a word, para acelerar la rutina de interrupciones
pwm_nop = aux_pwm_nop  'se cambia de long a word, apra acelerar la rutina de interrupciones
Gosub print_lcd  'salto con retorno a la rutina que muestra los dato por el display
flag2_pwm = 0  'bloquea la rutina hasta que se procese la nueva posicion
Endif
Goto main  'impide que termine el programa principal
End  'es conveniente ponerlo siempre segun el manual
'--------------------------------------Subrrutina lectura ADC, division y LCD
lee_adc:  '_______________________lee la entrada analogica
Adcin 4, adc_4  'lee el valor de la entrada analogica y lo carga en adc_4
Return                                           
print_lcd:  '____________________muestra los datos por el display
Lcdcmdout LcdLine1Home  'cursor al principio
Lcdout "ADC ", #adc_4, " ", #pwm, "       "  'muestra los datos en el lcd
Return                                           
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
'___________Rutina generadora del PWM, para la entrada de control del servomotor
If flag1_pwm = 1 Then  'controla el tiempo de la señal del servo a OFF
RB4 = 0  'salida del servo a OFF
TMR1H = timer_pwm_nop.HB  'recarga el contador del timer1 para que desborde, tiempo a off
TMR1L = timer_pwm_nop.LB  'recarga el contador del timer1 para que desborde, tiempo a off
flag1_pwm = 0  'permite la alternancia entre señal del servo a ON o a OFF
flag2_pwm = 1  'permiten que entren nuevos valoles del ADC, nueva posicion del servomotor
timer_pwm = pwm  'recarga la rutina con los nuevos valores del potenciometro
timer_pwm_nop = pwm_nop  'recara la rutina con los nuevos valores del potenciometro
Else
RB4 = 1  'salida de la señal de contol del servo a ON
TMR1H = timer_pwm.HB  'recarga el contador del timer1 para que desborde, tiempo a on
TMR1L = timer_pwm.LB  'recarga el contador del timer1 para que desborde, tiempo a on
flag1_pwm = 1  'permite la alternancia entre señal del servo a ON o a OFF
Endif
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
End                                               
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Abril de 2007, 07:13:27
Una imagen con los modulos del simulador:

(http://img257.imageshack.us/img257/3042/pwmsevooc5.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Abril de 2007, 07:20:11
Un ejemplo para darle un valor util al TIMER0:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_Pic_EBasic_Timer0
'Descripcion: Base de tiempos programable empleando el Timer0
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 4/07, By COS
'Las bases de tiempos no interrumpen el flujo normal del programa
'************************************************************************************************
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'--------------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'--------------------------------Variables generales-----------------------------------------------
Dim timer0_1ms As Word  'declaracion de la base de tiempos
Dim timer0_1ms_tiempo As Word  'determina el tiempo en que la base de tiempos estara incrementandose
'------------------------------------asignacion de valores a las variables--------------------------
timer0_1ms = 0  'inicializa la base de tiempos
timer0_1ms_tiempo = 1  'mSeg., tiempo en que el led verde estara cambiando de estado
'------------------------------------Definicion de puertos------------------------------------------
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off, negado
PORTB.0 = 1  'led verde a off, negado
'------------------------------------Inicializacion de Interrupciones por TIMER0-----------------------------
OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.TMR0IE = 1  'habilita las interrupciones del timer0
'------------------------------------rutinas del Programa----------------------
main:  'comienza el programa principal
'_________________Cambia de estado el led verde segun el valor de timer0_1ms_tiempo, en mSeg
If timer0_1ms >= timer0_1ms_tiempo Then  'control
Toggle led_verde  'invierte el estado del pin
timer0_1ms = 0  'inicializa la base de tiempos timer0_1ms
Endif
'_________________
Goto main  'impide que termine el programa principal
End  'es conveniente ponerlo siempre segun el manual
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If timer0_1ms <= timer0_1ms_tiempo Then timer0_1ms = timer0_1ms + 1  'base de tiempos
TMR0 = 130  'recarga el registro del tiemr0 para que desborde cada 1mSeg.
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
'End                                              
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Abril de 2007, 07:24:10
Usando los modulos del simulador:

(http://img138.imageshack.us/img138/3848/tmer0wv8.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 15 de Abril de 2007, 18:39:51
Te sigo COS, no estas solo...excelente trabajo !!! Estos dias quiero, tratar de terminar el entrenador...me parece muy util y didactico...Gracias por compartirlo !!!

______________________________
"Justo a mi, me toco ser YO" QUINO
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Abril de 2007, 10:34:10
Gracias Resistencio, si te refieres como "entrenador" a la EBasic, tengo la ultima version, no tienes mas que pedírmela.

PD. El Timer0 lo utilizo en este caso para controlar una base de tiempos, que me permite cambiar el estado de un pin de salida sin interferir en el flujo normal del programa, es una de las caracteristicas de las bases de tiempos tambien llamadas en otros lenguajes como Timer, por llamarlo de alguna manera, es la "multitarea del pobre".
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 16 de Abril de 2007, 15:15:20
Hola Carlos!

Dice mi ABANDONADISIMO robot hexapodo que el ejemplo del control de los servos le va a venir de perlas. :)

("solo" tengo que multiplicar por 19 el numero de servos a manejar) ;)

Saludos, y felicitaciones por el trabajo que estas realizando!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Abril de 2007, 10:22:15
A ver cuando lo vemos dar el primer paso...   :-)

Esta rutina que controla el servo, es nueva,  estoy experimentando con ella, ya que no es una rutina lineal realizada con contadores, 1 contador por servo, o tambien un unico contador pero muchas comparaciones. programando el timer para que desborde siempre con el mismo valor, el minimo posible que permita que se incrementen contador o contadores, y se comprueben todas las comparaciones, esto hace que la rutina tradicional por contadores no tenga muy buena resolución, sino utilizas una velocidad de reloj muy elevada.

Con esta nueva rutina cuando este terminada, espero conseguir mover 24 servos con una buena resolución y estabilidad, sin necesidad de usar velocidades muy elevadas de reloj, en fin, ya veremos..  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 18 de Abril de 2007, 12:23:23
Mmm.....entonces creo que me conviene esperarte...ja ja ja!

24 servos es un muy buen numero!

Saludetes.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Abril de 2007, 18:55:25
Completando el ejemplo anterior del control del servomotor.
- Ahora se muestra en pantalla el tiempo en mSeg. de la señal de control del servo.
- Fusionado en el programa anterior la rutina division con decimales

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_Servo_11
'Descripcion: Control de un servomotor (Futaba S3003) usando el ADC, Timer1, Interrupciones
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 4/07, By COS
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'uso del timer1 para controlar el PWM, de periodo 20mSeg.
'lectura de entrada analogica y conversion a tiempo
'conversion de tiempo a valores a cargar en el timer1
'Version 1.1
'se fusiona la rutina de divicion con decimales
'para mostrar el tiempo del ducty cycle en pantalla, minimo 0.43mSeg. y maximo 2.26mSeg.
'modificacion del formato de salida de la informacion por el lcd
'************************************************************************************************
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA  'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5  'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'****************************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'--------------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'------------------------------------declaracion de variables---------------------------------------
'-------------------------------Variables del ADC y Rutina division------------------------------
Dim entero As Word  'parte entera
Dim decimal As Word  'los dos decimales
Dim division As Long  'almacenara el numero con los dos decimales
Dim factor_escala As Word  'situa la parte entera del numero
Dim reg_timer1 As Word  'valor maximo que puede contener el registro del TMR1
Dim tiempo_ms As Word  'tiempo a on de la señal de control del servo en mSeg.
Dim aux_adc_4 As Word  'auxiliar
Dim adc_4 As Word  'contiene el valor de la entrada ADC
'----------------------------------------variables calculo y control PWM-----------------------------
Dim pwm As Word  'variable de paso
Dim pwm_nop As Word  'variable de paso
Dim aux_pwm As Long  'calculo del tiempo a ON, de la señal de control
Dim aux_pwm_nop As Long  'calculo del tiempo a OFF, de la señal de cotrol
Dim timer_pwm As Word  'valor del tiempo a on, para ser interpretado
Dim timer_pwm_nop As Word  'valor del tiempo a off, para ser interpretado
Dim flag1_pwm As Byte  'variable que determina si ON o a OFF de la señal de control
Dim flag2_pwm As Byte  'controla la actualizacion de una nueva posicion del servo
'------------------------------------asignacion de valores a las variables--------------------------
pwm = 62535
pwm_nop = 28535
aux_pwm = 62535
flag1_pwm = 1
flag2_pwm = 0
entero = 0
decimal = 0
division = 0
adc_4 = 0
reg_timer1 = 65535  'maximo valor registro de 16 bit del TMR1
factor_escala = 100  'factor de escala para dos decimal
'------------------------------------Definicion de puertos------------------------------------------
Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off, negado
PORTB.0 = 1  'led verde a off, negado
'------------------------------------Inicializacion de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
'PIE1.TMR1IE = 1  'activa las interrupciones del timer1
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
'------------------------------------Inicio-------------------------------------------------------
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "LCD_Tmr1_ADC_PWM"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Servo S3003"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
Lcdcmdout LcdClear  'borra el display
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
'------------------------------------rutinas del Programa----------------------
main:  'comienza el programa principal
If flag2_pwm = 1 Then  'permite una nueva posicion del servo
Gosub lee_adc  'salto con retorno a la rutina de lectura del ADC
aux_pwm = ((adc_4 + 240) * 250) / (1023 + 370)  'tiempo a ON de la señal de control del servo
'240 y 370 fijan los mavolores minimo y valores maximos del ducty cycle
aux_pwm_nop = 2000 - aux_pwm  'calculo del tiempo de la señal de control a OFF
aux_pwm_nop = 65535 - ((aux_pwm_nop * 100) / 5)  'valor a cargar en el timer1, OFF
aux_pwm = 65535 - ((aux_pwm * 100) / 5)  'valor a cargar en el timer1, ON
pwm = aux_pwm  'se cambia de long a word, para acelerar la rutina de interrupciones
pwm_nop = aux_pwm_nop  'se cambia de long a word, apra acelerar la rutina de interrupciones
Gosub print_lcd  'salto con retorno a la rutina que muestra los dato por el display
flag2_pwm = 0  'bloquea la rutina hasta que se procese la nueva posicion
tiempo_ms = ((reg_timer1 - pwm) * 5) / 100  'calculo en mSeg.
division = dvsion_dcmles(tiempo_ms, factor_escala)  'llama a la funcion dvsion_dcmles, que retorna un long
Gosub formato_decimales  'extrae e imprime con formato decimal
Endif

Goto main  'impide que termine el programa principal
End  'es conveniente ponerlo siempre segun el manual
formato_decimales:  '____________________da formato a los decimales y los saca por el lcd
entero = division.HW  'sede el word alto a entero, parte entera
decimal = division.LW  'sede el byte alto del word bajo a decimal_1
Lcdout #entero, "."  'muestra los datos en el lcd
If decimal < 10 Then Lcdout "0"
Lcdout #decimal, "         "  'muestra los datos en el lcd
Return                                           
'--------------------------------------Subrrutina lectura ADC
lee_adc:  '_______________________lee la entrada analogica
Adcin 4, adc_4  'lee el valor de la entrada analogica y lo carga en adc_4
Return                                           
print_lcd:  '____________________muestra los datos por el display
Lcdcmdout LcdLine1Home  'cursor al principio
Lcdout "ADC--TMR1--mSeg."  'magnitudes
Lcdcmdout LcdLine2Home  'selecciona la linea dos del lcd y cursor a inicio
If adc_4 < 1000 Then Lcdout "0"  'para mantener la plantilla
If adc_4 < 100 Then Lcdout "0"  'para mantener la plantilla
If adc_4 < 10 Then Lcdout "0"  'para mantener la plantilla de salida
Lcdout #adc_4, " ", #pwm, " "  'muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'variable local, contendra la parte entera
Dim f_resto As Word  'varable local, contendra el resto
Dim f_decimal As Word  'contendra la parte decimal
f_entera = dvdo / dvsor  'obtengo la division
f_resto = dvdo Mod dvsor  'obtengo el resto
f_decimal = (f_resto * 100) / dvsor  'calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  'almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de 1 o mas digitos siempre
End Function                                     
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
'___________Rutina generadora del PWM, para la entrada de control del servomotor
If flag1_pwm = 1 Then  'controla el tiempo de la señal del servo a OFF
RB4 = 0  'salida del servo a OFF
TMR1H = timer_pwm_nop.HB  'recarga el contador del timer1 para que desborde, tiempo a off
TMR1L = timer_pwm_nop.LB  'recarga el contador del timer1 para que desborde, tiempo a off
flag1_pwm = 0  'permite la alternancia entre señal del servo a ON o a OFF
flag2_pwm = 1  'permiten que entren nuevos valoles del ADC, nueva posicion del servomotor
timer_pwm = pwm  'recarga la rutina con los nuevos valores del potenciometro
timer_pwm_nop = pwm_nop  'recara la rutina con los nuevos valores del potenciometro
Else
RB4 = 1  'salida de la señal de contol del servo a ON
TMR1H = timer_pwm.HB  'recarga el contador del timer1 para que desborde, tiempo a on
TMR1L = timer_pwm.LB  'recarga el contador del timer1 para que desborde, tiempo a on
flag1_pwm = 1  'permite la alternancia entre señal del servo a ON o a OFF
Endif
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
End                                               
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Abril de 2007, 18:57:20
La simulacion:

(http://img408.imageshack.us/img408/7686/pwmsevo11cp3.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Resistencio en 20 de Abril de 2007, 01:36:42
MASTER !!! esto esta muy bueno COS !!! Vengo algo lento pero practicando...

Se podria ensayar sobre la obtencion de una senoide...quizas usando el recurso del PWM y algun pasabajos...???

Estuve viendo algo en el FORO, pero no me anime a preguntar, porque hay opiniones desencontradas, y no quise generar mas polemica...quizas cuando se enfrien un poco los animos pregunte algo por ahi...de hecho el post se interrumpe abruptamente y no se arriba a ninguna solucion...

Algunos piensan que se puede resolver con la utilizacion de un DAC (y eso es verdad) pero nos deja sin la practica perseguida, que es la de experimentar con los MICROS...

En fin, si se puede hacer alguan simulacion de senoide, diente y triangular, me pongo a ensayar algo !!!

SALUDOS y gracias por este "curro" (trabajo - laburo - aqui en Argentina)...Ahora me voy a mirar una vez mas el "golcito" que se hizo este "chaval", que le dicen la "pulga atomica"...lo tenes ??? ejem...creo que jugara para nosotros en el proximo mundial !!!  :-) :-) :-) :-/ :-/ :-/ :-) :-) :-)

______________________________
"Justo a mi, me toco ser Yo" QUINO

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 21 de Abril de 2007, 14:25:47
Pues en principio con los Amp. Operacionales se puede hace de todo, pero en este caso es algo que no me he planteado, es cuestion de investigar un poco a ver que sale.... ire viendo a ver que me encuentro... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Abril de 2007, 18:30:26
Dejo un nuevo ejemplo, en esta ocasión para poder controlar la EBasic mediante el Hyperterminal.
es una forma de llevarse el menu puesto a cualquier sitio, y asi poder configurar la EBasic o cualquier
otro equipo desde cualquier ordenador que tenga algun programa terminal compatible.

Por desgracia el simulador no comprende todos los caracteres de control que uso, asi que el menu no saldra tan lucido.
pero en el Hyperterminal del windows va muy bien.


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Abril de 2007, 18:32:35
El codigo:

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC ***************************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RS232_Menu_10
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 4/07 By COS
'DESCRIPCION: Control de los led de la EBasic por medio de un menu en el Hyperterminal
'programar el hyperterminal del Windows:
'Bits por segundo: 4800
'Bits de datos: 8
'Paridad: Ninguno
'Control de flujo: Ninguno
'LCD a 4 bit, sin bit de RW
'************************************************************************************************
'-------------------------------------PUERTOS DEFINIDOS POR EL SISTEMA----------------------------
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'--------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
'--------------------------------Definicion de caracteres de control del Hyperterminal--------
Const ff = 0x0c  'FF, Avance de pagina
Const bell = 0x07  'BELL, Señal sonora
Const sp = 0x20  'SP, Espacio
Const bksp = 0x08  'BKSP, Retroceso
'--------------------------------------Declaracion DE VARIABLES-------------------------------------
'-------------------------------------Variables sub_rutinas del puerto serie---------------------
Dim assi As Byte  'Contiene el valor de lectura del puerto serie
Dim n_usart As Byte  'Numero de datos del USART y del bufer IMAGEN de control
Dim usart As Byte  'Variable indice que apunta al ultimo dato adquirido por la USART
Dim aux_usart As Byte  'Auxiliar de la variable indice usart del USART
Dim c_serial As Byte  'Como USART pero para la lectura de control del bufer IMAGEN
Dim bufer As Byte  'Indica si hay datos por leer en el bufer USART
Dim n_aux As Byte  'contador para borrar el bufer_soft
'************************************variables de los timer****************************************
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
'------------------------------------Variables tipo array puerto serie----------------------------------
Dim usart_imagen(91) As Byte  'Componen el bufer IMAGEN para control del bufer USART
Dim usart_bufer(91) As Byte  'Componen el bufer de la USART de bajo nivel
'-----------------------------------------------ASIGNACIONES----------------------------------------
'-------------------------------------Asignacion de valores del TIMER1----------------------------
pause = 0  'genera una pausa en MSeg
timer_1ms = 0  'en mSeg
'-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
usart = 0
aux_usart = 0
c_serial = 0
bufer = 0
n_usart = 90
assi = 0
n_aux = 0
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = 0x00  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCIONES------------------
Hseropen 4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
Gosub clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x2f  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
'PIE1.TMR1IE = 1  'activa las interrupciones del timer1
'PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
'--------------------------------------Inicio Programa--------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
pause = 0  '1000  'prepara una pausa de 1Seg
Gosub pause_ms  'espera el tiempo que indica pause
Lcdout "16F88_RS232_MENU"  'imprime en el LCD el literal
Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
Lcdout "4800 Baud.--1.0"  'escribe la cadena de literales en el lcd
Hserout ff, CrLf, CrLf, "VER. 1.0 - TX/RX", CrLf, "TX -> MENU POR RS232", CrLf, "By COS", CrLf, CrLf  'envia presentacion al RS232
Gosub clear_bufer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
pause = 0  '3000  'prepara una pausa de 3Seg
Gosub pause_ms  'hace una pausa de tiempo indicado por pause
'Lcdcmdout LcdClear  'borra el display
'--------------------------------------Main Programa----------------------------------------------------
Gosub print_menu  'envia el menu principal al hyperterminal
main:
Gosub readserial  'lee un caracter del puerto serie, salto con retorno
If assi >= 0x30 And assi <= 0x31 Then  'filtro de caracteres, "0" y el "1"
Hserout bell  'señal sonora
Hserout assi  'envia al hyperterminal
pause = 0  '1000  'carga la base de tiempos
Gosub pause_ms  'espera el tiempo indicado por pause
If assi = "0" Then Gosub control_led_amarillo  'salta a la rutina de control del led amarillo
If assi = "1" Then Gosub control_led_verde  'salta a la rutina de control del led verde
Endif
Goto main
End                                               
'--------------------------------------FIN DEL MAIN-------------------------------------------
'--------------------------------------Rutinas Programa-----------------------------------------------
print_menu:
Hserout ff  'Paguina en blanco
Hserout "   Menu de Control de los Led de la Pic EBasic  ", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "------------------------------------------------", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "0 - Para menu Led amarillo", CrLf  'implime la cadena literal y salta a la siguiente linea
Hserout "1 - Para menu Led verde", CrLf  'implime la cadena literal y salta siguiente linea
Hserout "------------------------------------------------", CrLf  'implime la cadena literal y salta siguiente linea
Hserout "->"  'cursor
Hserout bell  'señal sonora
Return                                           
control_led_verde:
Hserout ff  'pagina en blanco
Hserout "    Menu control del Led Verde   ", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "---------------------------------", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "0 - Led verde a Off", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "1 - Led verde a On", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "2 - Para Salir", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "---------------------------------", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "->"  'cursor
assi = 0  'borra el ultimo caracter leido del bufer serie
While assi <> "2"  'controla el menu
Gosub readserial  'lee caracter del bufer serial (retorna en assi)
If assi >= 0x30 And assi <= 0x32 Then  'filtro de opciones o teclas
Hserout bell  'señal sonora
Hserout assi  'caracter leido del bufer serie
pause = 0  '1000  'prepara una pausa de 1Seg.
Gosub pause_ms  'pausa indicada por pause
Hserout bell  'señal sonora
Gosub retrocede_caracter  'salto a la rutina de borra caracter
If assi = "0" Then led_verde = 1  'led verde a off
If assi = "1" Then led_verde = 0  'led verde a on
If assi = "2" Then Gosub print_menu  'reimprime el menu principal
Endif
Wend
Return                                           
control_led_amarillo:
Hserout ff  'pantalla en blanco
Hserout "    Menu control del Led Amarillo   ", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "------------------------------------", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "0 - Led Amarillo a Off", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "1 - Led Amarillo a On", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "2 - Para Salir", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "------------------------------------", CrLf  'implime la cadena literal y salta a una nueva linea
Hserout "->"  'cursor
assi = 0  'borra el ultimo caracter leido del bufer serie
While assi <> "2"  'controla el menu
Gosub readserial  'lee caracter del bufer serial (retorna en assi)
If assi >= 0x30 And assi <= 0x32 Then  'filtro de opciones o teclas
Hserout bell  'señal sonora
Hserout assi  'caracter leido del bufer serie
pause = 0  '1000  'prepara una pausa de 1Seg.
Gosub pause_ms  'pausa indicada por pause
Hserout bell  'señal sonora
Gosub retrocede_caracter  'salto a la rutina de borra caracter
If assi = "0" Then led_amarillo = 1  'led amarillo a off
If assi = "1" Then led_amarillo = 0  'led amarillo a on
If assi = "2" Then Gosub print_menu  'reimprime el menu principal
Endif
Wend
Return                                           
retrocede_caracter:  'borra caracter
Hserout bksp, sp, bksp
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de mSeg
While timer_1ms < pause  'tiempo en mSeg maximos a contar
Wend
Return                                           
'------------------------------ rutinas para el control del bufer del puerto serie-------------
readserial:
'RUTINA DE LECTURA DEL BUFFER DEL PUERTO SERIE (ASSI)
If bufer = 1 Then  'si bufer tiene datos
assi = usart_bufer(c_serial)  'se lee el valor del bufer y se asigna assi
usart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
c_serial = c_serial + 1  'se incrementa el indice del bufer
If c_serial >= n_usart Then c_serial = 0  'se verifica si se llego al final del bufer
If usart_imagen(c_serial) = 0 Then bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
Else
assi = 0
Endif
Return                                           
clear_bufer:  'inicializa el bufer imagen y borra error del puerto fisico en modo Rx
'_________________________Borra e inicializa el bufer imagan del puerto serie
c_serial = 0
While c_serial <= n_usart  'se ejecuta tantas veces como variables tiene el bufer
usart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del bufer
usart = 0
bufer = 0
assi = 0
'_________________________Borra el error del puerto serie en Rx
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
Return                                           
'--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
'*****************************base de tiempos********************************************
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion la proboco el timer1
If timer_1ms < pause Then timer_1ms = timer_1ms + 1  'contador para control del timer_1ms
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x2f  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0  'borra el bit de salto del timer1
Endif
'*****************************BUFFER PUERTO SERIE****************************************
If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USAR
If usart < n_usart Then  'comprueba que el bufer de entrada no esta lleno
If usart_imagen(usart) = 0 Then  'comprueba que la posicion esta vacia
aux_usart = usart  'retiene la posicion antigua del bufer
usart = usart + 1  'indica cual sera la posicion siguiente del bufer
usart_imagen(aux_usart) = 1  'indica que hay dato en el bufer de entrada
bufer = 1  'indica que el bufer tine datos
Hserget usart_bufer(aux_usart)  'carga el dato en el bufer
Else
Hserget usart_bufer(n_usart)  'descarga la usart para que no se bloquee porque el bufer de entrada esta lleno
Endif
Else
If usart_imagen(0) = 0 Then  'comprueba que esta vacia la primera posicion del bufer
usart_imagen(0) = 1  'marca que hay dato en esa posicion del bufer
bufer = 1  'marca que el bufer tiene datos
usart = 1  'establece la proxima posicion del bufer
Hserget usart_bufer(0)  'lee la usart y guarda el dato en el bufer
Else
Hserget usart_bufer(n_usart)  'descarga la usart porque el bufer esta lleno
Endif
Endif
PIR1.RCIF = 0  'borra el bit de salto del Rx
Endif
'_________________________Borra el error del puerto serie en Rx
If RCSTA.OERR = 1 Then
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
Endif
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
End                                               


PD. las rutinas de tiempo fueron suprimidas para el Simulador
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Abril de 2007, 18:35:33
Para Ver la Simulacion:

(http://img57.imageshack.us/img57/9778/lcdrs232menu10mb2.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Abril de 2007, 04:52:07
El programa genera un bufer de entrada de 90 caracteres, asi que la EBasic recordara todos los caractes que pulseis (fifo).
Por lo tanto no pulseis muchos rapidamente o tendreis que esperar que los interprete todos...  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Abril de 2007, 18:48:48
Este es un ejemplo mas simple para controlar un servomotor:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_Adcin_ServoOut_01
'Descripcion: Control de un servomotor (Futaba S3003) usando las declaraciones Adcin y ServoOut
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 4/07, By COS, PSI v7.41
'periodo de la señal de control 20mSeg, duty cycle comprendido entre 0.5 y 2.3 mSeg.
'_________________________Ajuste de la declaracion ADCIN________________________
Define ADC_SAMPLEUS = 10  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________________________________________________________________________
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
'------------------------Definicion del funcionamiento de los modulos internos del micro--------------------
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off, negado
PORTB.0 = 1  'led verde a off, negado
'Configura el puerto serie RS232 ---------------------
Hseropen 4800
'--------------------Asignacion de nombres a los pins----------------------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'-----------------------declaracion de variables----------------------------------------------------------
Dim servo_1 As Byte  'valor del ADC y tiempo del duty cycle
Dim tiemp_resta As Word  'tiempo en que la señal de control estara a OFF
'-----------------------Programa principal-------------------------------------
main:
PORTB.4 = 0  'salida de control del servo a estado bajo, pin RB4
Adcin 4, servo_1  'lectura del puerto analogico, pin RA4
Hserout #servo_1, CrLf  'Envia el valor del AN4 al puerto serie
If servo_1 < 50 Then servo_1 = 50  'acota el minimo para que el mecanismo del servo no sufra
If servo_1 > 230 Then servo_1 = 230  'acota el desplazamiento máximo para que el servo no sufra
ServoOut PORTB.4, servo_1  'declaracion para el control de servo motores, resolución de 10uSeg.
'se ajusta de forma automatica a la frecuencia de reloj de trabajo del micro.
tiemp_resta = 20000 - (servo_1 * 10)  'calculo de la señal de control a off en uSeg., periodo - duty = tiempo pendiente
'hasta completar el periodo seleccionado, en este caso 20mSeg.
WaitUs tiemp_resta  'pausa en uSeg. hasta completar el periodo de la señal de control
Goto main



Modulos a utilizar para la simulacion:
- Microcontroller View
- Oscilloscope (Interval 100000)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Abril de 2007, 18:54:47
Este es un programa totalmente lineal, por lo que no tiene, ni se le puede poner como a los otros la simualcion de multitarea.
Con esto me refiero a que Adcin, ServoOut y Waitus, consumen todo el tiempo del micro mientras se estan ejecutando.
Y con la consiguiente perdida de potencia de proceso.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Abril de 2007, 19:00:02
   tiemp_resta = 20000 - (servo_1 * 10)  'calculo de la señal de control a off en uSeg., periodo - duty = tiempo pendiente
                         'hasta completar el periodo seleccionado, en este caso 20mSeg.

Al pasar a uSeg. en la linea anterior, nos evitamos las perdidas por redondeo de la operacion.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Abril de 2007, 06:52:44
Ejemplo para simular:

Código: [Seleccionar]
'PROGRAMA PARA PRACTICAR CON INTERRUPCIONES EXTERIORES DEL PIN RB0
'On Interrupt - Interrupts in BASIC
'Turn LED on.  Interrupt on PORTB.0 (INTE) turns LED off.
'Program waits .5 seconds and turns LED back on.
'-------------------------------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1  'ignora los Waitms
'-------------------------------------------------------------------
Symbol led = PORTB.7  'reasigno nombre al portb.7
ANSEL = %00000000  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISB.7 = 0  'declaro portb.7 como salida
TRISB.0 = 1  'declaro portb.0 como entrada
OPTION_REG = 0x7f  'Enable PORTB pullups
INTCON = 0x90  'Enable INTE interrupt
'-------------------------------------------------------------------
main:
High led  'Turn LED on
Goto main  'Do it forever
End                                               
'Interrupt handler
On Interrupt  'Define interrupt handler, disable interrupt
Low led  'If we get here, turn LED off
WaitMs 500  'Wait 0.5 Seconds
INTCON.1 = 0  'Clear interrupt flag
Resume  'Return to main program, enable interrupt

PD. Programa del amigo forero Eyedol, adaptado para el PSI
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Abril de 2007, 06:54:33
Modulo para la simulacion:

Microcontroller View
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Mayo de 2007, 17:50:58
Programa anterior para las pruebas con el RB0/INT, descargado a la EBasic y funcionado OK.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Mayo de 2007, 11:47:33
Dejo una version mucho mas elaborada de menu por medio del hyperterminal.
En este caso es una rutina de reconocimiento del numero entrado por el teclado del pc, a traves del hyperterminal.
La rutina permite corregir el numero en la pantalla del hyperterminal

El menu no queda muy lucido por causa de que el simulador no reconoce bien todos
Los caracteres de control.. pero funciona.

En este caso el menu pide una clave “1234”, que indicara en lcd y en el hyperterminal si es correcta o no.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC ***************************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RS232_Menu_11
'VERSION: 1.1
'MICRO: PIC16F88
'Fecha/Autor: 4/07, 5/07 By COS, PSI v7.41
'DESCRIPCION: Control de clave de acceso
'Programar el hyperterminal del Windows:
'Bits por segundo: 4800
'Bits de datos: 8
'Paridad: Ninguno
'Control de flujo: Ninguno
'LCD a 4 bit, sin bit de RW
'VERSION: 1.1
'Implementacion de una rutina que lee digitos numericos del teclado del ordenador y los pasa
'a un unico numero, se muestra en el lcd y lo compara con otro de 4 digitos compilado en el
'programa (1234), indicando tanto por el hyperterminal como por el lcd si es correcto, clave.
'Implementacion de poder corregir los digitos tecleados en el PC
'Lectura del puerto serie mediante un buffer en anillo
'************************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'--------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
'--------------------------------Definicion de caracteres de control del Hyperterminal--------
Const ff = 0x0c  'FF, Avance de pagina
Const bell = 0x07  'BELL, Señal sonora
Const sp = 0x20  'SP, Espacio
Const bksp = 0x08  'BKSP, Retroceso
Const cr = 0x0d  'CR, retorno de carro
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = 0x00  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCIONES------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x2f  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarse
'PIE1.TMR1IE = 1  'activa las interrupciones del timer1
'PIE1.RCIE = 1  'Activa la interrupción de la USART en modo rx
INTCON.PEIE = 1  'bit de habilitación de interrupciones de periféricos
'-------------------------------------Variables rutinas del buffer puerto serie----------------------
Dim assi As Byte  'Contiene el valor de lectura del puerto serie
Dim buffer As Byte  'Indica si hay datos por leer en el buffer USART
Dim n_usart As Byte  'Numero de datos del USART y del buffer IMAGEN de control
Dim usart As Byte  'Variable indice que apunta al ultimo dato adquirido por la USART
Dim aux_usart As Byte  'Auxiliar de la variable indice usart del USART
Dim c_serial As Byte  'Como USART pero para la lectura de control del buffer IMAGEN
Dim n_aux As Byte  'contador para borrar el buffer_soft
Dim usart_imagen(10) As Byte  '91 'Componen el buffer IMAGEN para control del buffer USAR
Dim usart_buffer(10) As Byte  '91'Componen el buffer de la USAR de bajo nivel
'-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
usart = 0
aux_usart = 0
c_serial = 0
buffer = 0
n_usart = 9  '90
assi = 0
n_aux = 0
'************************************variables de los timer****************************************
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
'-------------------------------------Asignacion de valores del TIMER1----------------------------
pause = 0  'genera una pausa en MSeg
timer_1ms = 0  'en mSeg
'-----------------------------------Asigna valores a las variables de la rutina lectura teclado--
Dim d_teclas As Byte  'Numero de digitos + 1 de la clave
Dim _digclave(4) As Byte  'Clave
_digclave(0) = "1"
_digclave(1) = "2"
_digclave(2) = "3"
_digclave(3) = "4"
Dim aux_digclave(5) As Byte  'Clave entrada por el teclado
d_teclas = 3  'numero de digitos +1, max. a introducir por el teclado del PC
'-----------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
Hseropen 4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
Gosub clear_buffer  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
Enable  'INTCON.GIE habilita todas las interrupciones globales
pause = 1000  'prepara una pausa de 1Seg
Gosub pause_ms  'espera el tiempo que indica pause
Lcdout "16F88_RS232_MENU"  'imprime en el LCD el literal
Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
Lcdout "4800 Baud.--1.1"  'escribe la cadena de literales en el lcd
Hserout ff, CrLf, CrLf, "VER. 1.1 - TX/RX", CrLf, "TX -> MENU POR RS232", CrLf, "By COS", CrLf, CrLf  'envía presentación al RS232
Gosub clear_buffer  'Borra el BUFFER IMAGEN y por lo tanto también al USART, OBLIGATORIO POR LO MENOS UNA VEZ
pause = 3000  'prepara una pausa de 3Seg
Gosub pause_ms  'hace una pausa de tiempo indicado por pause
'--------------------------------------Main Programa----------------------------------------------------
main:
Gosub print_menu  'envia el menu principal al hyperterminal
Gosub d_read  'rutina de lectura del teclado del pc
Gosub verifica_clave  'verifica la clave y lo indica por el lcd
pause = 1000  'carga la base de tiempos
Gosub pause_ms  'espera el tiempo indicado por pause
Goto main
End                                               
'--------------------------------------Rutinas Programa-----------------------------------------------
d_read:  '___________________Rutina de lectura del teclado del pc, a través del hyperterminal
Dim d_aux As Byte
Dim d_control As Byte
aux_digclave(0) = "-"
aux_digclave(1) = "-"
aux_digclave(2) = "-"
aux_digclave(3) = "-"
d_control = 0  'valor inicial
d_aux = 0  'valor inicial
Gosub hserout_cursor  'salto con retorno escribe cursor en el hyperterminal
While d_control = 0  'lee el teclado del pc, hasta que se valida el numero, enter
If buffer > 0 Then  'controla que hay datos en el buffer serie
Gosub readserial  'lee un dato del buffer serie
Gosub hserout_bell  'señal sonora
Endif
If assi >= 0x30 And assi <= 0x39 And d_aux <= d_teclas Then  'filtro de teclas validas y numero de digitos max.
Gosub hserout_assi  'envia el valor de assi al hyperterminal, tecla numerica pulsada
aux_digclave(d_aux) = assi  'Asigna la tecla a la clave auxiliar
d_aux = d_aux + 1  'incrementa la siguiente posicion del digito a recibir
assi = 0  'se borra el digito recibido
Endif
If assi = bksp Then  '___________borra el ultimo caracter
If d_aux > 0 Then  'Si se introdujo algun digito
d_aux = d_aux - 1  'Selecciona el digito a borrar
aux_digclave(d_aux) = "-"  'Borra el digito
Gosub borra_caracter  'Retrocede y borra una posicion en el hyperterminal
Endif
assi = 0  'se borra el digito recibido
Endif  '________________________
If assi = cr Then  '_______detecta el retorno de carro, o fin de entrada de datos
Gosub hserout_crlf  'envia un avance de linea y principio de linea
assi = 0  'se borra el digito recibido por el puerto serie
Return
Endif  '_____________________
Wend
Return                                           
hserout_cursor:  'cursor en el hyperterminal
Hserout "->"
Return                                           
hserout_ff:  'Pagina en blanco
Hserout ff
Return                                           
hserout_crlf:  'salta una linea y principio de linea
Hserout CrLf
Return                                           
hserout_assi:  'envia el valor al puerto serie
Hserout assi
Return                                           
hserout_bell:  'señal sonora
Hserout bell
Return                                           
borra_caracter:  'borra caracter
Hserout bksp, sp, bksp
Return                                           
print_menu:
'Gosub hserout_ff  'Pagina en blanco
Hserout "-------------------------------", CrLf  'imprime la cadena literal y salta a una nueva linea
Hserout "   Entre la Clave, 4 Digitos  ", CrLf  'imprime la cadena literal y salta a una nueva linea
Hserout "-------------------------------", CrLf  'imprime la cadena literal y salta a una nueva linea
Gosub hserout_bell  'señal sonora
Return                                           
verifica_clave:  '___________________VERIFICA LA CLAVE Y SACA DATOS POR EL LCD Y PUERTO SERIE
Lcdcmdout LcdLine1Home
Lcdout "Numero: ", aux_digclave(0), aux_digclave(1), aux_digclave(2), aux_digclave(3), "       "  'escribe en el lcd y numero reconocido por la EBasic
Lcdcmdout LcdLine2Home  'principio de linea 2 del lcd
If aux_digclave(0) = _digclave(0) And aux_digclave(1) = _digclave(1) And aux_digclave(2) = _digclave(2) And aux_digclave(3) = _digclave(3) Then  'comprueba la clave
Lcdout "Clave Correcta  "  'manada datos al lcd
Hserout CrLf, CrLf, "Clave Correcta", CrLf, CrLf  'manda datos al puerto serie
Gosub hserout_bell  'manda datos la puerto serie, señal sonora
Gosub hserout_bell  'manda datos la puerto serie, señal sonora
pause = 200  'indica la duracion de la pausa
Gosub pause_ms  'hace una pausa
Gosub hserout_bell  'manda datos la puerto serie, señal sonora
Gosub pause_ms  'hace una pausa
Gosub hserout_bell  'manda datos la puerto serie, señal sonora
Else
Lcdout "Clave Incorrecta"  'manda datos al lcd
Hserout CrLf, CrLf, "Clave Incorrecta", CrLf, CrLf  'manda datos al puerto serie
Endif
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establece el tiempo total en mSeg
pause = 0  'deshabilita la rutina pause 0, solo simulación
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de mSeg
While timer_1ms < pause  'tiempo en mSeg máximos a contar
Wend
Return                                           
'------------------------------ rutinas para el control del buffer del puerto serie-------------
readserial:
'RUTINA DE LECTURA DEL BUFFER DEL PUERTO SERIE (ASSI)
If buffer = 1 Then  'si buffer tiene datos
assi = usart_buffer(c_serial)  'se lee el valor del buffer y se asigna assi
usart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
c_serial = c_serial + 1  'se incrementa el indice del buffer
If c_serial >= n_usart Then c_serial = 0  'se verifica si se llego al final del buffer
If usart_imagen(c_serial) = 0 Then buffer = 0  'si no quedan mas datos en el buffer se marca como vacio
Else
assi = 0
Endif
Return                                           
clear_buffer:  'inicializa el buffer imagen y borra error del puerto físico en modo Rx
'_________________________Borra e inicializa el buffer imagen del puerto serie
c_serial = 0
While c_serial <= n_usart  'se ejecuta tantas veces como variables tiene el buffer
usart_imagen(c_serial) = 0  'borra el indicador indice, informa que esa posicion del buffer tiene o no tiene datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del buffer
usart = 0
buffer = 0
assi = 0
'_________________________Borra el error del puerto serie en Rx
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
Return                                           
'--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
'*****************************base de tiempos********************************************
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion la provoco el timer1
If timer_1ms < pause Then timer_1ms = timer_1ms + 1  'contador para control del timer_1ms
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x2f  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0  'borra el bit de salto del timer1
Endif
'*****************************BUFFER PUERTO SERIE****************************************
If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USAR
If usart < n_usart Then  'comprueba que el buffer de entrada no esta lleno
If usart_imagen(usart) = 0 Then  'comprueba que la posicion esta vacia
aux_usart = usart  'retiene la posicion antigua del buffer
usart = usart + 1  'indica cual sera la posicion siguiente del buffer
usart_imagen(aux_usart) = 1  'indica que hay dato en el buffer de entrada
buffer = 1  'indica que el buffer tiene datos
Hserget usart_buffer(aux_usart)  'carga el dato en el buffer
Else
Hserget usart_buffer(n_usart)  'descarga la usart para que no se bloquee porque el buffer de entrada esta lleno
Endif
Else
If usart_imagen(0) = 0 Then  'comprueba que esta vacía la primera posicion del buffer
usart_imagen(0) = 1  'marca que hay dato en esa posicion del buffer
buffer = 1  'marca que el buffer tiene datos
usart = 1  'establece la próxima posición del buffer
Hserget usart_buffer(0)  'lee la usart y guarda el dato en el buffer
Else
Hserget usart_buffer(n_usart)  'descarga la usart porque el buffer esta lleno
Endif
Endif
PIR1.RCIF = 0  'borra el bit de salto del Rx
Endif
'_________________________Borra el error del puerto serie en Rx
If RCSTA.OERR = 1 Then
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
Endif
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto

PD: Solo correccion en las explicaciones
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Mayo de 2007, 13:30:09
Dejo una imagen del simulador con los modulos implicados

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Mayo de 2007, 13:37:56
PD: Para entrar digitos clicar en la opcion “Send String”
Y para indicar aceptación clicar en “Send Byte (hex)”, 0d (CR, retorno de carro), o 08 (BKSP, retroceso) para corregir digitos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Mayo de 2007, 16:20:52
Aqui dejo otro ejemplo, en este caso utilizo el TIMER1 para medir en uSeg. el tiempo en el que se ejecutan las rutinas, comandos, funciones y etc.
Con tal que no tarde mas de 32 mSeg. en completarse la rutina a comprobar. Los valores que salen son exactamente iguales en el simulador que en la EBasic.
Los valores son mostrados tanto por el LCD como por el Hyperterminal, en este caso la declaracion que utilizo no usa la UART del pic, uso la simulacion de la UART por soft.

Estos son los tiempos de algunas que probe:
(solo hay que ir habilitando unas y deshabilitando otras o añadiendo otras nuevas en esta parte del programa)

'-------------------Rutina a medir en uSeg-----------------------------------
'WaitMs 15  'Tarda 15007 uS
Lcdcmdout LcdClear  'Tarda 2020uS
Lcdout "Hola TodoPic"  'Tarda 840uS
'aux = 100  '__________Tarda 4 uSeg
'If aux = 100 Then
'Endif  '______________
'----------------------------------------------------------------------------

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Mayo de 2007, 16:22:24
El programa:

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC ***************************************
'NOMBRE: 16F88_Pic_EBasic_LCD_Timer1_MidiendoTiempo_10
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 5/07 By COS, PSI v7.41
'DESCRIPCION: Midiendo el tiempo que tardan ciertas rutinas en ejecutarse
'Programar el hyperterminal del Windows:
'Bits por segundo: 4800
'Bits de datos: 8
'Paridad: Ninguno
'Control de flujo: Ninguno
'LCD a 4 bit, sin bit de RW
'valor por el display y por el hyperterminal
'************************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg., depende del lcd (este 500)
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg., depende de la respuesta del lcd
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = 0x00  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'------------------------------------PROGRAMACION TIMER1---------------------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
'TMR1H = 0x00  'carga el registro del contador para que desborde cada 32.76 mSeg, byte alto
'TMR1L = 0x00  'carga el registro del contador para que desborde cada 32.76 mSeg, byte bajo
T1CON.TMR1ON = 0  'parado el contador del TMR1
PIE1.TMR1IE = 0  'desactiva las interrupciones del timer1
'INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
'Enable  'INTCON.GIE habilita todas las interrupciones globales
'--------------------------------------Inicio Programa--------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
'-------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
'**********************DECLARACION DE VARIABLES****************************************
Dim timer1 As Long  'contendra el valor de los registros del timer1 y posterior valor a uSeg.
Dim aux As Byte
aux = 0
'WaitMs 1000  'prepara una pausa de 1Seg
Lcdout "16F88_LCD_TIMER1"  'imprime en el LCD el literal
Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
Lcdout "MidiendoTiempo10"  'escribe la cadena de literales en el lcd
'WaitMs 3000  'prepara una pausa de 3Seg
'--------------------------------------Main Programa----------------------------------------------------
main:
TMR1H = 0x00  'borro el registro alto del timer1
TMR1L = 0x00  'borro el registro bajo del timer1
T1CON.TMR1ON = 1  'activa el contador del TMR1
'****************************************************************************
'-------------------Rutina a medir en uSeg-----------------------------------
'WaitMs 15  'Tarda 14998 uS
Lcdcmdout LcdClear  'Tarda 2024uS
'Lcdout "Hola TodoPic"  'Tarda 906uS
'aux = 100  '__________Tarda 3 uSeg
'If aux = 100 Then
'Endif  '______________
'----------------------------------------------------------------------------
'****************************************************************************
T1CON.TMR1ON = 0  'Para el contador del TMR1
timer1 = 0
timer1.HB = TMR1H  'asigna registro de mas peso
timer1.LB = TMR1L  'asigna registro de menos peso
'timer1_aux = timer1  'pasa de long a word
Lcdcmdout LcdClear  'borra el lcd y cursor linea 1
Lcdout "Timer1:", #timer1  'datos por el lcd
Serout PORTB.5, 4800, CrLf, "Timer1: ", #timer1, CrLf  'puerto serie Tx, por soft
timer1 = (timer1 * 5) / 10  'en microsegundos
'timer1_aux = timer1  'paso de long a word, la rutina del display no permite variables tipo Long
Lcdcmdout LcdLine2Home  'cursor al principio de la linea 2 del lcd
Lcdout "Tiemp.:", #timer1, "uS."  'datos por el lcd
Serout PORTB.5, 4800, CrLf, "Tiempo: ", #timer1, " uSeg.", CrLf  'puerto serie Tx, por soft
End

PD. Correccion, no defini bien la longitud de las variables, y fallaba el calculo de los uSeg. a partir de cierto valor elevado del registro del Timer1
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Mayo de 2007, 16:31:22
Los modulos del simulador implicados:

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Mayo de 2007, 19:59:43
Aqui dejo una version mejorada del Reloj Calendario con Temperatura
Ahora tambien muestra los datos por el Hyperterminal

1ª parte:
-------------
Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_11
'MICRO: PIC16F88
'FECHA/AUTOR: 04/07, 05/07 - By COS
'VERSION 1.1
'modificacion de la rutina "pause_ms"
'modificacion de rutina de teclas, porque se veian afectadas al crecer la longitud del programa main
'Se añade salida de la temperatura, hora y fecha por el puerto serie (Soft)
'Pendiente de grafica de temperatura por el hyperterminal
'VERSION 1.0
'DESCRIPCION: Muestra en el display la fecha, hora (24h)mediante el DS1307 y temperatura (LM35)
'S1 y S2 pulsadas al mismo tiempo, entramos en programacion del reloj
'Una vez en programacion con S1 seleccionamos el dato a cambiar, este queda en modo parpadeo
'Una vez en programacion con S2 incrementamos el dato seleccionado dentro de sus cotas
'S1, pulsado al principio salida del RTC a on, 1Hz, y S2 salida a off, led off
'Se muestra la temperatura en el LCD mediante un LM35, temperatura positiva y negativa
'***************************************************************************************************
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 500  '2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'-------------------------------------------------------------------------------------------------------------
Define SEROUT_DELAYUS = 0  'no hay delay entre caracter y caracter enviado al puerto serie
'-----------------------------------asignacion de nombres-----------------------------------------------------
Symbol sda = PORTB.1  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.4  'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
Symbol s1 = RA6  'se asigna nombre a la tecla
Symbol s2 = RA5  'se asigna nombre a la tecla
'***********************************DEFINICION DE VARIABLES**************************************
'-----------------------------------variables de los timer---------------------------------------
Dim aux_pause As Word  'variable auxiiar el PAUSE
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer_1ms_tiempo As Word  'contiene el valor del tiempo de timer_1ms
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'--------------------------------------Variables Programa RTC----------------------------------------
Dim aux_4h As Byte  'contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'variable indice
Dim reg(7) As Byte  'contendra los valores finales de fecha y hora en el sistema decimal
Dim flash_1 As Bit  'controla el parpadeo de los digitos del lcd, activo a 1
Dim dato As Byte  'indica la direccion del RTC a cambiar de valor
Dim flag_1 As Bit  'activa la rutina de ajuste del reloj, activo a 1
Dim s1_on As Bit  'tecla pulsada si s1_on=1
Dim s2_on As Bit  'tecla pulsada si s2_on=1
Dim aux_ajuste As Byte  'variable auxiliar para la rutina de ajuste
'-----------------------------------------------------------------------------------------------
'-------------------------------Variables del ADC y Rutina division (temperatura)------------------------------
Dim entero As Word  'parte entera
Dim decimal As Word  'los dos decimales
Dim division As Long  'almacenara el numero con los dos decimales
Dim adc_4 As Word  'contendra el valor de la entrada del ADC
Dim aux_adc_4 As Word  'auxiliar
'--------------------------------Variables temperatura-------------------------------------------
Dim factor_escala As Word  'contiene el factor de correcion para pasar el valor del ADC a voltios, max. 5V
Dim temperatura As Word  'almacena la temperatura final
Dim temp As Long  'contendra la temperatura completa sin coma
Dim signo As Bit  'indica el signo de la temperatura
'--------------------------------Variables calculo media aritmetica (temperatura)----------------------------
Dim media_temp(20) As Word  'numero de muestras para calcular la media aritmetica
Dim media_indice As Byte  'se utiliza como indice
Dim aux_media As Byte  'variable auxiliar
'------------------------------------------ASIGNACIONES------------------------------------------
'------------------------------------asignacion de valores a las variables (RTC)--------------------------
s1_on = 0
s2_on = 0
dato = 7  'fuera de ajuste o modo normal de trabajo del reloj, de 0 a 6 modo ajuste
flash_1 = 0
flag_1 = 0
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 1  '100  'temporiza 100 mSeg
timer_1ms_tiempo = 1  'temporiza 1mseg
timer1_ms_tiempo = 1  '100  'temporiza 100 mSeg., asignado a la tecla S1
timer2_ms_tiempo = 1  '500  'temporiza 500 mSeg.
timer3_ms_tiempo = 1  '100  'temporiza 100 mSeg., asignado a la tecla S2
timer1_100ms_tiempo = 1  '10  'temporiza 1 Seg.
timer2_100ms_tiempo = 1  '255  'temporiza 25.5 Seg.
timer3_100ms_tiempo = 1  'temporiza 0.1seg.
'-------------------------------------asiganacion de valores a las variables (temperatura)------
entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 10  'factor de escala para un decimal
temperatura = 0
temp = 0
media_indice = 0
aux_media = 0
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'------------------------------------Inicializacion de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
Serout PORTB.5, 4800, 0x0c, "MUESTRA LA TEMPERATURA MEDIA CADA 25.5 Seg.", CrLf  'alpuerto serie
Serout PORTB.5, 4800, "-------------------------------------------", CrLf, CrLf  'alpuerto serie
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
pause = 1000
Gosub pause_ms  'espera el tiempo indicado en pause
Lcdout "16F88LCD_RTC/I2C"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "ADC_LM35_RS232"  'escribe en el lcd
pause = 3000
Gosub pause_ms  'espera el tiempo indicado en pause
Lcdcmdout LcdClear  'borra el display y cursor a casa
'--------------------------------inicializa variable media_temperatura---------------------------
Gosub inicializa_temp
'--------------------------------inicializa los registros del RTC---------------------------------
Gosub inicaliza_rtc
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Mayo de 2007, 20:01:23
2ª Parte
----------
Código: [Seleccionar]
'--------------------------------------Main Programa-----------------------------------------------
main:
If s1 = 1 And s1_on = 1 And s2 = 1 And s2_on = 1 And flag_1 = 0 Then  '________modo ajuste
flag_1 = 1  'activa la rutina de ajustes
dato = 0  'selecciono registro del RTC
pause = 200
Gosub pause_ms  'hace una pausa del valor que tenga pause en ms
s1_on = 0  'desbloquea la tecla S1
s2_on = 0  'desbloquea la tecla s2
Endif  '___________________
If flag_1 = 1 Then Gosub ajuste_reloj  '__________saltamos a la rutina de ajuste
If timer3_100ms >= timer3_100ms_tiempo Then  'actualiza datos en el lcd cada 100ms
Gosub lee_hora  'lee la fecha y hora del reloj
Gosub print_lcd  'actualiza los datos del reloj en el display
timer3_100ms = 0
Endif  '__________________
If timer2_100ms >= timer2_100ms_tiempo Then
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
Gosub media_arit  'salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'llama a la funcion dvsion_dcmles, que retorna un long
Gosub print_rs232_temperatura
Gosub print_rs232_date
timer2_100ms = 0
Endif
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
inicaliza_rtc:  '-------------------------inicializa el reloj----------------------------------------------------
PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, 0, reg(0)  'leo los segundos
reg(0) = reg(0) And %01111111  'habilito bit de control que activa el reloj
I2CWrite sda, scl, 0xd0, 0, reg(0)  'escribo el registro de los segundos
I2CRead sda, scl, 0xd0, 1, reg(0)  'leo el registro de los minutos
reg(0) = reg(0) And %10111111  'habilito bit de control que activa el formato de 24h
I2CWrite sda, scl, 0xd0, 0, reg(0)  'escribo el registro de los minutos
'-------------------------------inicializa la salida del RTC-------------------------------
If s1 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x10  'salida a 1hz, a on
If s2 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x80  'salida a off, led off
PIE1.TMR1IE = 1  'habilita las interrupciones del timer1
pause = 1000
Gosub pause_ms  'espera el tiempo indicado en pause
Return                                           
ajuste_reloj:  'rutina de ajuste del reloj
'________________________Control posicion del dato a variar en el reloj
If s1 = 1 And s1_on = 1 And s2_on = 0 Then  'detecta tecla S1
dato = dato + 1  'seleciona el dato a ser modificado
If dato > 6 Then flag_1 = 0  'indica fin de rutina de ajuste
s1_on = 0  'la tecla queda desbloqueada
Endif  '_____________________________
'____________Lectura de la hora para su modificacion y posterior grabacion, rutina BCD
If s2 = 1 And s2_on = 1 And s1_on = 0 Then  'deteca tecla S2
s2_on = 0  'la tecla queda desbloqueada
If dato < 7 Then  'limita la direcciones de trabajo del reloj
Gosub lee_hora  'lee los datos de los regis. RTC y los pasa a decimal, elimina los bit de control
aux_ajuste = reg(dato)  'hace una imagen del valor del registro a modificar
aux_ajuste = aux_ajuste + 1  'incrementa el dato a modificar que fue seleccionado
If dato = 2 And aux_ajuste > 23 Then aux_ajuste = 0  'acota horas
If dato = 0 Or dato = 1 Then  'acota segundos y minutos
If aux_ajuste > 59 Then aux_ajuste = 0
Endif
If dato = 3 And aux_ajuste > 7 Then aux_ajuste = 1  'acota el dia de la semana
If dato = 4 And aux_ajuste > 31 Then aux_ajuste = 1  'acota el dia del mes
If dato = 5 And aux_ajuste > 12 Then aux_ajuste = 1  'acota el mes
If dato = 6 And aux_ajuste > 30 Then aux_ajuste = 1  'acota el año, año maximo 2030
If aux_ajuste > 49 And aux_ajuste < 60 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 50
aux_ajuste.4 = 1
aux_ajuste.6 = 1
Endif
If aux_ajuste > 39 And aux_ajuste < 50 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 40
aux_ajuste.6 = 1
Endif
If aux_ajuste > 29 And aux_ajuste < 40 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 30
aux_ajuste.4 = 1
aux_ajuste.5 = 1
Endif
If aux_ajuste > 19 And aux_ajuste < 30 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 20
aux_ajuste.5 = 1
Endif
If aux_ajuste > 9 And aux_ajuste < 20 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 10
aux_ajuste.4 = 1
Endif
If aux_ajuste < 10 Then aux_ajuste = aux_ajuste  'Decimal a BCD
If dato = 0 Then aux_ajuste.7 = 0  'restaura el bit de configracion, activa el oscilador del reloj
If dato = 2 Then aux_ajuste.7 = 0  'restaura el bit, no lo utiliza el RTC
If dato = 2 Then aux_ajuste.6 = 0  'restaura el bit de configuracion, reloj 24h
PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
I2CWrite sda, scl, 0xd0, dato, aux_ajuste  'actualiza el dato ya modificado
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
Endif
Endif  '____________
'__________Controla el parpadeo de los digitos cuando el modo selec es activo
If timer2_ms >= timer2_ms_tiempo Then  'tiempo del parpadeo
If flash_1 = 1 Then  'selecciona si el dato a modificar es visible o no
flash_1 = 0  'dato es visible
Else
flash_1 = 1  'dato no es visible
Endif
timer2_ms = 0  'recarga la base de tiempos
Endif  '______________
Return                                           
lee_hora:  'lee la hora del RTC en formato BCD y la pasa a decimal
i = 0  'variable indice, asigna los datos de forma ordenada, leidos del RTC
While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, i, reg(i)  'lectura de la direccion de memoria indicada del RTC, formato BCD
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
aux_4l = reg(i) And %00001111  'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %01110000  'minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %00110000  'horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %00000000  'dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %00110000  'dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %00010000  'mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'fin del bucle y salta a While
Return                                           
print_lcd:  'rutina de escritura en el lcd
Lcdcmdout LcdLine1Home  'cursor del lcd a la izquierda en la linea 1
If dato = 2 And flash_1 = 1 Then  'control final del parpadeo de los digitos de la hora
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(2) < 10 Then Lcdout "0"  'si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2)  'escribe la hora
Endif
Lcdout ":"  'escribe el separador
If dato = 1 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los minutos
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(1) < 10 Then Lcdout "0"  'si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1)  'escribe los minutos
Endif
Lcdout ":"  'escribe el separador
If dato = 0 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los segundos
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(0) < 10 Then Lcdout "0"  'si segundos es inferior a 10 escribe el cero delante
Lcdout #reg(0)  'escribe los segundos
Endif
Gosub print_lcd_temp  'salto con retorno a la rutina de impresion de la temperatura
Lcdcmdout LcdLine2Home  'cursor del lcd a la izquierda en la linea 2
If dato = 3 And flash_1 = 1 Then  'control final del parpadeo de los digitos del dia semana
Lcdout "    "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(3) = 1 Then Lcdout "Dom."  'asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun."
If reg(3) = 3 Then Lcdout "Mar."
If reg(3) = 4 Then Lcdout "Mie."
If reg(3) = 5 Then Lcdout "Jue."
If reg(3) = 6 Then Lcdout "Vie."
If reg(3) = 7 Then Lcdout "Sab."
Endif
Lcdout " "  'escribe separador
If dato = 4 And flash_1 = 1 Then  'control final del parpadeo de los digitos del dia del mes
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(4) < 10 Then Lcdout "0"  'si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4)  'escribe el dia del mes
Endif
Lcdout "/"  'escribe el separador
If dato = 5 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los meses
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(5) < 10 Then Lcdout "0"  'si mes es inferior a 10 escribe cero
Lcdout #reg(5)  'escribe el mes
Endif
Lcdout "/20"  'separador y los dos primeros digitos del año de 4 digitos
If dato = 6 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los años
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(6) < 10 Then Lcdout "0"  'si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'escribe el año
Endif
Return                                           
'--------------------------------------Subrrutina lectura ADC, division y LCD
lee_adc:  '_______________________lee la entrada analogica
Adcin 4, adc_4  'lee el valor de la entrada analogica y lo guarda en adc_4
Return                                           
print_lcd_temp:  '____________________muestra los datos por el display
entero = division.HW  'sede el word alto a entero, parte entera
decimal = division.LW  'sede el byte alto del word bajo a decimal_1
Lcdout " "  'espacio en blanco
If signo = 0 Then Lcdout "+", #entero, "."  'muestra los datos en el lcd
If signo = 1 Then Lcdout "-", #entero, "."  'muestra los datos en el lcd
Lcdout #decimal, "C   "  'muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'variable local, contendra la parte entera
Dim f_resto As Word  'varable local, contendra el resto
Dim f_decimal As Word  'contendra la parte decimal
f_entera = dvdo / dvsor  'obtengo la division
f_resto = dvdo Mod dvsor  'obtengo el resto
f_decimal = (f_resto * 10) / dvsor  'calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  'almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos siempre
End Function                                     
'___________Calculo de la media aritmetica de la temperatura, 20 muestras
media_arit:
media_temp(media_indice) = temperatura  'asigna el valor
temperatura = 0  'se inicaliza a cero
For aux_media = 0 To 19  'blucle for, se ejecuta 20 veces
temperatura = temperatura + media_temp(aux_media)  'se suman los valores
Next aux_media  'cierra for
temperatura = temperatura / 20  'termina el calculo de la media
media_indice = media_indice + 1  'controla la entrada de datos que corresponde a media_temp(x)
If media_indice > 19 Then media_indice = 0  'acota el ultimo valor del indice de media_temp
Return                                           
'___________Calculo de la temperatura
temp_calculo:  'calculo de la temperatura y del signo de la misma
If adc_4 > 112 Then  'determina si la temperatura es superior a 0ºC
aux_adc_4 = adc_4  'asigna el valor del ra4 a la variable auxiliar
aux_adc_4 = aux_adc_4 - 112  'elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'calcuala el valor de la temperatura sin coma decimal
signo = 0  'temperatura positiva
Endif
If adc_4 = 112 Then  'determina si la temperatura es 0ºC
temp = 0  'temperatura 0ºC
signo = 0  'asigna signo positivo
Endif
If adc_4 < 112 Then  'determina si la temperatura es inferior a 0ºC
aux_adc_4 = adc_4  'asigna el valor del RA4 a la variable auxiliar
aux_adc_4 = 112 - aux_adc_4  'elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'calcuala el valor de la temperatura sin coma decimal
signo = 1  'asigna el simbolo menos a la temperatura
Endif
temperatura = temp  'se pasa de Long a Word
Return                                           
inicializa_temp:  '__________inicializa la media aritmetica de la temperatura en el arranque
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
For media_indice = 0 To 19  'indice para rocorrer todas las direcciones de memoria que forman la variable tipo array media_temp
media_temp(media_indice) = temperatura  'se de el valor a media_temp
Next media_indice  'terminacion del bucle For
media_indice = 0  'se inicializa a cero, para un uso posterior
Gosub media_arit  'salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'llama a la funcion dvsion_dcmles, que retorna un long
Return                                           
print_rs232_temperatura:  'Envia la temperatura con decimales al puerto serie
PIE1.TMR1IE = 0  'OFF, interrupciones del timer1
Serout PORTB.5, 4800, "TEMPERATURA: "  'pagina en blanco y literal al purto serie
If signo = 0 Then Serout PORTB.5, 4800, "+"  'muestra el signo de la temperatura
If signo = 1 Then Serout PORTB.5, 4800, "-"  'muestra el signo de la temperatura
Serout PORTB.5, 4800, #entero, ".", #decimal, " "  'temperatura al rs232
PIE1.TMR1IE = 1  'ON, interrupciones del timer1
Return                                           
print_rs232_date:  'rutina de escritura de la hora y fecha por el RS232
PIE1.TMR1IE = 0  'OFF, interrupciones del timer1
If reg(2) < 10 Then Serout PORTB.5, 4800, " 0"  'si horas es inferior a 10 escribe el cero delante
Serout PORTB.5, 4800, #reg(2), ":"  'escribe la hora
If reg(1) < 10 Then Serout PORTB.5, 4800, "0"  'si minutos es inferior a 10 escribe el cero delante
Serout PORTB.5, 4800, #reg(1), ":"  'escribe los minutos
If reg(0) < 10 Then Serout PORTB.5, 4800, "0"  'si segundos es inferior a 10 escribe el cero delante
Serout PORTB.5, 4800, #reg(0), " "  'escribe los segundos
If reg(3) = 1 Then Serout PORTB.5, 4800, "Dom."  'asigna el literal al dia de la semana
If reg(3) = 2 Then Serout PORTB.5, 4800, "Lun."
If reg(3) = 3 Then Serout PORTB.5, 4800, "Mar."
If reg(3) = 4 Then Serout PORTB.5, 4800, "Mie."
If reg(3) = 5 Then Serout PORTB.5, 4800, "Jue."
If reg(3) = 6 Then Serout PORTB.5, 4800, "Vie."
If reg(3) = 7 Then Serout PORTB.5, 4800, "Sab."
If reg(4) < 10 Then Serout PORTB.5, 4800, " 0"  'si dia del mes es inferior a 10 escribe cero
Serout PORTB.5, 4800, #reg(4), "/"  'escribe el dia del mes
If reg(5) < 10 Then Serout PORTB.5, 4800, "0"  'si mes es inferior a 10 escribe cero
Serout PORTB.5, 4800, #reg(5), "/20"  'escribe el mes
If reg(6) < 10 Then Serout PORTB.5, 4800, "0"  'si año es inferior a 10 escribe primero el cero
Serout PORTB.5, 4800, #reg(6), CrLf  'escribe el año
PIE1.TMR1IE = 1  'ON, interrupciones del timer1
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
pause = 1  'ESTA LINEA SOLO SE ACTIVA CUANDO SE UTILIZA EL SIMULADOR
PIE1.TMR1IE = 0  'OFF, interrupciones del timer1
timer_1ms_tiempo = pause  'valor a temporizar por timer_1ms
PIE1.TMR1IE = 1  'ON, interrupciones del timer1
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
While timer_1ms < pause  'tiempo en mSeg maximos a contar
Wend
Return                                           
'***********************************Interrupciones*****************************************************
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion del timer1 es activa
'_________________bases de tiempos
timer_base = timer_base + 1  'contador general
If timer_1ms < timer_1ms_tiempo Then timer_1ms = timer_1ms + 1  'contador para control de la rutina Pause
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'contador
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'contador
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'contador
If timer_base >= timer_base_tiempo Then  'limita el timepo de ejecucion, cada timer_base_tiempo
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'contador
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'condtador
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'contador
timer_base = 0  'reset a la base de tiempos
Endif  '________________fin bases de tiempos
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
Endif
'_________________Detecta tecla pulsada
If s1 = 0 And s1_on = 0 And timer1_ms >= timer1_ms_tiempo Then  'tecla S1
s1_on = 1  'la tecla fue pulsada
s2_on = 0  'la tecla s2 a pff
If s1 = 0 And s2 = 0 Then s2_on = 1  'S2
timer1_ms = 0  'tiempo entre pulsacion y pulsacion
Endif
If s2 = 0 And s2_on = 0 And timer3_ms >= timer3_ms_tiempo Then  'tecla s2
s2_on = 1  'la tecla fue pulsada
s1_on = 0  'la tecla s1 a off
If s1 = 0 And s2 = 0 Then s1_on = 1  'S1
timer3_ms = 0  'tiempo entre pulsacion y pulsacion
Endif
If s1 = 0 Then led_verde = 0  'mestra el estado de S1
If s2 = 0 Then led_amarillo = 0  'muestra el estado de S2
If s1 = 1 Then led_verde = 1  'mestra el estado de S1
If s2 = 1 Then led_amarillo = 1  'muestra el estado de S2
'________Fin detecta tecla pulsada
Resume  'activa las interrupciones y retorna el curso normal del programa, antes del salto

PD: 03/06/08
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Modificado por I2CWrite y I2CRead.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Mayo de 2007, 20:05:22
PD. programa trucado para la simulacion
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Mayo de 2007, 06:54:39
Este programa hace lo mismo que el anterior pero con dos detalles muy importantes que lo diferencian:
- El anterior ocupa 4005 Word y este ocupa 3684 Word de programa.
- El anterior va mucho mas lento que este otro.

Este es un claro ejemplo de por que se deben utilizar los modulos internos del microcontrolador siempre que se pueda.


Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_12
'MICRO: PIC16F88
'FECHA/AUTOR: 04/07, 05/07 - By COS
'VERSION 1.2
'Se habilita el modulo usar como salida de datos serie
'se cambian todos los "Serout PORTB.5, 4800, " por Hserout
'se observa un ahorro de memoria considerable y una aceleracion del programa increible.
'VERSION 1.1
'modificacion de la rutina "pause_ms"
'modificacion de rutina de teclas, porque se veian afectadas al crecer la longitud del programa main
'Se añade salida de la temperatura, hora y fecha por el puerto serie (Soft)
'Pendiente de grafica de temperatura por el hyperterminal
'VERSION 1.0
'DESCRIPCION: Muestra en el display la fecha, hora (24h)mediante el DS1307 y temperatura (LM35)
'S1 y S2 pulsadas al mismo tiempo, entramos en programacion del reloj
'Una vez en programacion con S1 seleccionamos el dato a cambiar, este queda en modo parpadeo
'Una vez en programacion con S2 incrementamos el dato seleccionado dentro de sus cotas
'S1, pulsado al principio salida del RTC a on, 1Hz, y S2 salida a off, led off
'Se muestra la temperatura en el LCD mediante un LM35, temperatura positiva y negativa
'***************************************************************************************************
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 500  '2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'-----------------------------------asignacion de nombres-----------------------------------------------------
Symbol sda = PORTB.1  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.4  'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
Symbol s1 = RA6  'se asigna nombre a la tecla
Symbol s2 = RA5  'se asigna nombre a la tecla
'***********************************DEFINICION DE VARIABLES**************************************
'-----------------------------------variables de los timer---------------------------------------
Dim aux_pause As Word  'variable auxiiar el PAUSE
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer_1ms_tiempo As Word  'contiene el valor del tiempo de timer_1ms
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'--------------------------------------Variables Programa RTC----------------------------------------
Dim aux_4h As Byte  'contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'variable indice
Dim reg(7) As Byte  'contendra los valores finales de fecha y hora en el sistema decimal
Dim flash_1 As Bit  'controla el parpadeo de los digitos del lcd, activo a 1
Dim dato As Byte  'indica la direccion del RTC a cambiar de valor
Dim flag_1 As Bit  'activa la rutina de ajuste del reloj, activo a 1
Dim s1_on As Bit  'tecla pulsada si s1_on=1
Dim s2_on As Bit  'tecla pulsada si s2_on=1
Dim aux_ajuste As Byte  'variable auxiliar para la rutina de ajuste
'-----------------------------------------------------------------------------------------------
'-------------------------------Variables del ADC y Rutina division (temperatura)------------------------------
Dim entero As Word  'parte entera
Dim decimal As Word  'los dos decimales
Dim division As Long  'almacenara el numero con los dos decimales
Dim adc_4 As Word  'contendra el valor de la entrada del ADC
Dim aux_adc_4 As Word  'auxiliar
'--------------------------------Variables temperatura-------------------------------------------
Dim factor_escala As Word  'contiene el factor de correcion para pasar el valor del ADC a voltios, max. 5V
Dim temperatura As Word  'almacena la temperatura final
Dim temp As Long  'contendra la temperatura completa sin coma
Dim signo As Bit  'indica el signo de la temperatura
'--------------------------------Variables calculo media aritmetica (temperatura)----------------------------
Dim media_temp(20) As Word  'numero de muestras para calcular la media aritmetica
Dim media_indice As Byte  'se utiliza como indice
Dim aux_media As Byte  'variable auxiliar
'------------------------------------------ASIGNACIONES------------------------------------------
'------------------------------------asignacion de valores a las variables (RTC)--------------------------
s1_on = 0
s2_on = 0
dato = 7  'fuera de ajuste o modo normal de trabajo del reloj, de 0 a 6 modo ajuste
flash_1 = 0
flag_1 = 0
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 1  '100  'temporiza 100 mSeg
timer_1ms_tiempo = 1  'temporiza 1mseg
timer1_ms_tiempo = 1  '100  'temporiza 100 mSeg., asignado a la tecla S1
timer2_ms_tiempo = 1  '500  'temporiza 500 mSeg.
timer3_ms_tiempo = 1  '100  'temporiza 100 mSeg., asignado a la tecla S2
timer1_100ms_tiempo = 1  '10  'temporiza 1 Seg.
timer2_100ms_tiempo = 1  '255  'temporiza 25.5 Seg.
timer3_100ms_tiempo = 1  'temporiza 0.1seg.
'-------------------------------------asiganacion de valores a las variables (temperatura)------
entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 10  'factor de escala para un decimal
temperatura = 0
temp = 0
media_indice = 0
aux_media = 0
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'------------------------------------Velocidad de la UART-----------------------------------------
Hseropen 4800  'velocidad de trabajo del modulo UART del PIC, RB5 tiene que ser declarado como salida
'------------------------------------Inicializacion de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
Hserout 0x0c, "MUESTRA LA TEMPERATURA MEDIA CADA 25.5 Seg.", CrLf  'alpuerto serie
Hserout "-------------------------------------------", CrLf, CrLf  'alpuerto serie
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
pause = 1000
Gosub pause_ms  'espera el tiempo indicado en pause
Lcdout "16F88LCD_RTC/I2C"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "ADC_LM35_RS232"  'escribe en el lcd
pause = 3000
Gosub pause_ms  'espera el tiempo indicado en pause
Lcdcmdout LcdClear  'borra el display y cursor a casa
'--------------------------------inicializa variable media_temperatura---------------------------
Gosub inicializa_temp
'--------------------------------inicializa los registros del RTC---------------------------------
Gosub inicaliza_rtc
'--------------------------------------Main Programa-----------------------------------------------
main:
If s1 = 1 And s1_on = 1 And s2 = 1 And s2_on = 1 And flag_1 = 0 Then  '________modo ajuste
flag_1 = 1  'activa la rutina de ajustes
dato = 0  'selecciono registro del RTC
pause = 200
Gosub pause_ms  'hace una pausa del valor que tenga pause en ms
s1_on = 0  'desbloquea la tecla S1
s2_on = 0  'desbloquea la tecla s2
Endif  '___________________
If flag_1 = 1 Then Gosub ajuste_reloj  '__________saltamos a la rutina de ajuste
If timer3_100ms >= timer3_100ms_tiempo Then  'actualiza datos en el lcd cada 100ms
Gosub lee_hora  'lee la fecha y hora del reloj
Gosub print_lcd  'actualiza los datos del reloj en el display
timer3_100ms = 0
Endif  '__________________
If timer2_100ms >= timer2_100ms_tiempo Then
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
Gosub media_arit  'salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'llama a la funcion dvsion_dcmles, que retorna un long
Gosub print_rs232_temperatura
Gosub print_rs232_date
timer2_100ms = 0
Endif
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Mayo de 2007, 06:56:39
La segunda parte del programa:
Código: [Seleccionar]
'**************************************Subrrutinas**********************************************
inicaliza_rtc:  '-------------------------inicializa el reloj----------------------------------------------------
PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, 0, reg(0)  'leo los segundos
reg(0) = reg(0) And %01111111  'habilito bit de control que activa el reloj
I2CWrite sda, scl, 0xd0, 0, reg(0)  'escribo el registro de los segundos
I2CRead sda, scl, 0xd0, 1, reg(0)  'leo el registro de los minutos
reg(0) = reg(0) And %10111111  'habilito bit de control que activa el formato de 24h
I2CWrite sda, scl, 0xd0, 0, reg(0)  'escribo el registro de los minutos
'-------------------------------inicializa la salida del RTC-------------------------------
If s1 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x10  'salida a 1hz, a on
If s2 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x80  'salida a off, led off
PIE1.TMR1IE = 1  'habilita las interrupciones del timer1
pause = 1000
Gosub pause_ms  'espera el tiempo indicado en pause
Return                                           
ajuste_reloj:  'rutina de ajuste del reloj
'________________________Control posicion del dato a variar en el reloj
If s1 = 1 And s1_on = 1 And s2_on = 0 Then  'detecta tecla S1
dato = dato + 1  'seleciona el dato a ser modificado
If dato > 6 Then flag_1 = 0  'indica fin de rutina de ajuste
s1_on = 0  'la tecla queda desbloqueada
Endif  '_____________________________
'____________Lectura de la hora para su modificacion y posterior grabacion, rutina BCD
If s2 = 1 And s2_on = 1 And s1_on = 0 Then  'deteca tecla S2
s2_on = 0  'la tecla queda desbloqueada
If dato < 7 Then  'limita la direcciones de trabajo del reloj
Gosub lee_hora  'lee los datos de los regis. RTC y los pasa a decimal, elimina los bit de control
aux_ajuste = reg(dato)  'hace una imagen del valor del registro a modificar
aux_ajuste = aux_ajuste + 1  'incrementa el dato a modificar que fue seleccionado
If dato = 2 And aux_ajuste > 23 Then aux_ajuste = 0  'acota horas
If dato = 0 Or dato = 1 Then  'acota segundos y minutos
If aux_ajuste > 59 Then aux_ajuste = 0
Endif
If dato = 3 And aux_ajuste > 7 Then aux_ajuste = 1  'acota el dia de la semana
If dato = 4 And aux_ajuste > 31 Then aux_ajuste = 1  'acota el dia del mes
If dato = 5 And aux_ajuste > 12 Then aux_ajuste = 1  'acota el mes
If dato = 6 And aux_ajuste > 30 Then aux_ajuste = 1  'acota el año, año maximo 2030
If aux_ajuste > 49 And aux_ajuste < 60 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 50
aux_ajuste.4 = 1
aux_ajuste.6 = 1
Endif
If aux_ajuste > 39 And aux_ajuste < 50 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 40
aux_ajuste.6 = 1
Endif
If aux_ajuste > 29 And aux_ajuste < 40 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 30
aux_ajuste.4 = 1
aux_ajuste.5 = 1
Endif
If aux_ajuste > 19 And aux_ajuste < 30 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 20
aux_ajuste.5 = 1
Endif
If aux_ajuste > 9 And aux_ajuste < 20 Then  'Decimal a BCD
aux_ajuste = aux_ajuste - 10
aux_ajuste.4 = 1
Endif
If aux_ajuste < 10 Then aux_ajuste = aux_ajuste  'Decimal a BCD
If dato = 0 Then aux_ajuste.7 = 0  'restaura el bit de configracion, activa el oscilador del reloj
If dato = 2 Then aux_ajuste.7 = 0  'restaura el bit, no lo utiliza el RTC
If dato = 2 Then aux_ajuste.6 = 0  'restaura el bit de configuracion, reloj 24h
PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
I2CWrite sda, scl, 0xd0, dato, aux_ajuste  'actualiza el dato ya modificado
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
Endif
Endif  '____________
'__________Controla el parpadeo de los digitos cuando el modo selec es activo
If timer2_ms >= timer2_ms_tiempo Then  'tiempo del parpadeo
If flash_1 = 1 Then  'selecciona si el dato a modificar es visible o no
flash_1 = 0  'dato es visible
Else
flash_1 = 1  'dato no es visible
Endif
timer2_ms = 0  'recarga la base de tiempos
Endif  '______________
Return                                           
lee_hora:  'lee la hora del RTC en formato BCD y la pasa a decimal
i = 0  'variable indice, asigna los datos de forma ordenada, leidos del RTC
While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, i, reg(i)  'lectura de la direccion de memoria indicada del RTC, formato BCD
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
aux_4l = reg(i) And %00001111  'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %01110000  'minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %00110000  'horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %00000000  'dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %00110000  'dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %00010000  'mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'fin del bucle y salta a While
Return                                           
print_lcd:  'rutina de escritura en el lcd
Lcdcmdout LcdLine1Home  'cursor del lcd a la izquierda en la linea 1
If dato = 2 And flash_1 = 1 Then  'control final del parpadeo de los digitos de la hora
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(2) < 10 Then Lcdout "0"  'si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2)  'escribe la hora
Endif
Lcdout ":"  'escribe el separador
If dato = 1 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los minutos
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(1) < 10 Then Lcdout "0"  'si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1)  'escribe los minutos
Endif
Lcdout ":"  'escribe el separador
If dato = 0 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los segundos
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(0) < 10 Then Lcdout "0"  'si segundos es inferior a 10 escribe el cero delante
Lcdout #reg(0)  'escribe los segundos
Endif
Gosub print_lcd_temp  'salto con retorno a la rutina de impresion de la temperatura
Lcdcmdout LcdLine2Home  'cursor del lcd a la izquierda en la linea 2
If dato = 3 And flash_1 = 1 Then  'control final del parpadeo de los digitos del dia semana
Lcdout "    "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(3) = 1 Then Lcdout "Dom."  'asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun."
If reg(3) = 3 Then Lcdout "Mar."
If reg(3) = 4 Then Lcdout "Mie."
If reg(3) = 5 Then Lcdout "Jue."
If reg(3) = 6 Then Lcdout "Vie."
If reg(3) = 7 Then Lcdout "Sab."
Endif
Lcdout " "  'escribe separador
If dato = 4 And flash_1 = 1 Then  'control final del parpadeo de los digitos del dia del mes
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(4) < 10 Then Lcdout "0"  'si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4)  'escribe el dia del mes
Endif
Lcdout "/"  'escribe el separador
If dato = 5 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los meses
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(5) < 10 Then Lcdout "0"  'si mes es inferior a 10 escribe cero
Lcdout #reg(5)  'escribe el mes
Endif
Lcdout "/20"  'separador y los dos primeros digitos del año de 4 digitos
If dato = 6 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los años
Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
Else
If reg(6) < 10 Then Lcdout "0"  'si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'escribe el año
Endif
Return                                           
'--------------------------------------Subrrutina lectura ADC, division y LCD
lee_adc:  '_______________________lee la entrada analogica
Adcin 4, adc_4  'lee el valor de la entrada analogica y lo guarda en adc_4
Return                                           
print_lcd_temp:  '____________________muestra los datos por el display
entero = division.HW  'sede el word alto a entero, parte entera
decimal = division.LW  'sede el byte alto del word bajo a decimal_1
Lcdout " "  'espacio en blanco
If signo = 0 Then Lcdout "+", #entero, "."  'muestra los datos en el lcd
If signo = 1 Then Lcdout "-", #entero, "."  'muestra los datos en el lcd
Lcdout #decimal, "C   "  'muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'variable local, contendra la parte entera
Dim f_resto As Word  'varable local, contendra el resto
Dim f_decimal As Word  'contendra la parte decimal
f_entera = dvdo / dvsor  'obtengo la division
f_resto = dvdo Mod dvsor  'obtengo el resto
f_decimal = (f_resto * 10) / dvsor  'calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  'almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos siempre
End Function                                     
'___________Calculo de la media aritmetica de la temperatura, 20 muestras
media_arit:
media_temp(media_indice) = temperatura  'asigna el valor
temperatura = 0  'se inicaliza a cero
For aux_media = 0 To 19  'blucle for, se ejecuta 20 veces
temperatura = temperatura + media_temp(aux_media)  'se suman los valores
Next aux_media  'cierra for
temperatura = temperatura / 20  'termina el calculo de la media
media_indice = media_indice + 1  'controla la entrada de datos que corresponde a media_temp(x)
If media_indice > 19 Then media_indice = 0  'acota el ultimo valor del indice de media_temp
Return                                           
'___________Calculo de la temperatura
temp_calculo:  'calculo de la temperatura y del signo de la misma
If adc_4 > 112 Then  'determina si la temperatura es superior a 0ºC
aux_adc_4 = adc_4  'asigna el valor del ra4 a la variable auxiliar
aux_adc_4 = aux_adc_4 - 112  'elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'calcuala el valor de la temperatura sin coma decimal
signo = 0  'temperatura positiva
Endif
If adc_4 = 112 Then  'determina si la temperatura es 0ºC
temp = 0  'temperatura 0ºC
signo = 0  'asigna signo positivo
Endif
If adc_4 < 112 Then  'determina si la temperatura es inferior a 0ºC
aux_adc_4 = adc_4  'asigna el valor del RA4 a la variable auxiliar
aux_adc_4 = 112 - aux_adc_4  'elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'calcuala el valor de la temperatura sin coma decimal
signo = 1  'asigna el simbolo menos a la temperatura
Endif
temperatura = temp  'se pasa de Long a Word
Return                                           
inicializa_temp:  '__________inicializa la media aritmetica de la temperatura en el arranque
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
For media_indice = 0 To 19  'indice para rocorrer todas las direcciones de memoria que forman la variable tipo array media_temp
media_temp(media_indice) = temperatura  'se de el valor a media_temp
Next media_indice  'terminacion del bucle For
media_indice = 0  'se inicializa a cero, para un uso posterior
Gosub media_arit  'salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'llama a la funcion dvsion_dcmles, que retorna un long
Return                                           
print_rs232_temperatura:  'Envia la temperatura con decimales al puerto serie
PIE1.TMR1IE = 0  'OFF, interrupciones del timer1
Hserout "TEMPERATURA: "  'pagina en blanco y literal al purto serie
If signo = 0 Then Hserout "+"  'muestra el signo de la temperatura
If signo = 1 Then Hserout "-"  'muestra el signo de la temperatura
Hserout #entero, ".", #decimal, " "  'temperatura al rs232
PIE1.TMR1IE = 1  'ON, interrupciones del timer1
Return                                           
print_rs232_date:  'rutina de escritura de la hora y fecha por el RS232
PIE1.TMR1IE = 0  'OFF, interrupciones del timer1
If reg(2) < 10 Then Hserout " 0"  'si horas es inferior a 10 escribe el cero delante
Hserout #reg(2), ":"  'escribe la hora
If reg(1) < 10 Then Hserout "0"  'si minutos es inferior a 10 escribe el cero delante
Hserout #reg(1), ":"  'escribe los minutos
If reg(0) < 10 Then Hserout "0"  'si segundos es inferior a 10 escribe el cero delante
Hserout #reg(0), " "  'escribe los segundos
If reg(3) = 1 Then Hserout "Dom."  'asigna el literal al dia de la semana
If reg(3) = 2 Then Hserout "Lun."
If reg(3) = 3 Then Hserout "Mar."
If reg(3) = 4 Then Hserout "Mie."
If reg(3) = 5 Then Hserout "Jue."
If reg(3) = 6 Then Hserout "Vie."
If reg(3) = 7 Then Hserout "Sab."
If reg(4) < 10 Then Hserout " 0"  'si dia del mes es inferior a 10 escribe cero
Hserout #reg(4), "/"  'escribe el dia del mes
If reg(5) < 10 Then Hserout "0"  'si mes es inferior a 10 escribe cero
Hserout #reg(5), "/20"  'escribe el mes
If reg(6) < 10 Then Hserout "0"  'si año es inferior a 10 escribe primero el cero
Hserout #reg(6), CrLf  'escribe el año
PIE1.TMR1IE = 1  'ON, interrupciones del timer1
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
pause = 1  'ESTA LINEA SOLO SE ACTIVA CUANDO SE UTILIZA EL SIMULADOR
PIE1.TMR1IE = 0  'OFF, interrupciones del timer1
timer_1ms_tiempo = pause  'valor a temporizar por timer_1ms
PIE1.TMR1IE = 1  'ON, interrupciones del timer1
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
While timer_1ms < pause  'tiempo en mSeg maximos a contar
Wend
Return                                           
'***********************************Interrupciones*****************************************************
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion del timer1 es activa
'_________________bases de tiempos
timer_base = timer_base + 1  'contador general
If timer_1ms < timer_1ms_tiempo Then timer_1ms = timer_1ms + 1  'contador para control de la rutina Pause
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'contador
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'contador
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'contador
If timer_base >= timer_base_tiempo Then  'limita el timepo de ejecucion, cada timer_base_tiempo
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'contador
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'condtador
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'contador
timer_base = 0  'reset a la base de tiempos
Endif  '________________fin bases de tiempos
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
Endif
'_________________Detecta tecla pulsada
If s1 = 0 And s1_on = 0 And timer1_ms >= timer1_ms_tiempo Then  'tecla S1
s1_on = 1  'la tecla fue pulsada
s2_on = 0  'la tecla s2 a pff
If s1 = 0 And s2 = 0 Then s2_on = 1  'S2
timer1_ms = 0  'tiempo entre pulsacion y pulsacion
Endif
If s2 = 0 And s2_on = 0 And timer3_ms >= timer3_ms_tiempo Then  'tecla s2
s2_on = 1  'la tecla fue pulsada
s1_on = 0  'la tecla s1 a off
If s1 = 0 And s2 = 0 Then s1_on = 1  'S1
timer3_ms = 0  'tiempo entre pulsacion y pulsacion
Endif
If s1 = 0 Then led_verde = 0  'mestra el estado de S1
If s2 = 0 Then led_amarillo = 0  'muestra el estado de S2
If s1 = 1 Then led_verde = 1  'mestra el estado de S1
If s2 = 1 Then led_amarillo = 1  'muestra el estado de S2
'________Fin detecta tecla pulsada
Resume  'activa las interrupciones y retorna el curso normal del programa, antes del salto
End

PD: 03/06/08
      I2CWrite sda, scl, 0xd0, x, x
      I2CRead sda, scl, 0xd1, x, x
      0xd0 = %11010000 => Seleccion del chip DS1307 y modo escritura
      0xd1 = %11010001 => Seleccion del chip DS1307 y modo lectura
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead, por lo que su valor
      es indiferente, la funcion I2CWrite lo pondra a valor "0" de forma automatica y al ser compilada tambien I2CRead lo colocara a 1.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Mayo de 2007, 07:01:34
El uso de funciones para simular los modulos internos del PIC, facilita la tarea de la programacion pero cuando el programa se hace ya demasiado extenso y vemos como la memoria se agota, una solucion clara es utilizar un modulo interno del pic siempre que dispongamos del mismo.... el ahorro de memoria es considerable y tambien observaremos como nuestro codigo se acelera de una forma tambien considerable.  :wink:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: PalitroqueZ en 26 de Mayo de 2007, 14:48:51
Que grandes avances haces amigo dogflu66  :-/ :-/ :-/

veré si puedo hacer arrancar la lcd con este simulador.

una de las bondades, es que puedes ver las instrucciones línea por línea en asm y cambiar la velocidad de simulación.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Mayo de 2007, 17:38:59
Este es otro ejemplo simple de como controlar un servomotor Futaba S3003.
Utilizo la función Waitus y WaitMs del compilador de Basic para conseguir los tiempos.

El problema que plantean estos tipos de programas es que si crecen en complejidad el periodo de la señal del servo tambien se agranda por lo que una vez salidos de la tolerancia permitida del servo tendremos que hacer mas pequeño el periodo para asi compensar el aumento de tamaño del programa.

Código: [Seleccionar]
'***************** PIC Entrenadora BASIC (PicEBasic)**********************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_14
'MICRO: PIC16F88
'FECHA/AUTOR: 05/07 - By COS, PSI v7.41
'Pprograma para practicar con servos y la declaracion WaitUs
'Periodo para la señal de control del servo 20mSeg. (50Hz)
'Duty Cycle max. 2300uSeg. (extremo derecha) y minimo 450uSeg. (extr. izquierda)
'Control de la posicion del servo mediante RA0 y RA1
'-----------------------------------------------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-------------------------------------------------------------------------------
AllDigital  'Todos los puertos como I/O
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como Entradas
TRISB = 0xff  'Puerto B como Entradas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
TRISB.3 = 0  'Como salida
TRISB.7 = 0  'Como salida
TRISB.0 = 0  'Como salida
TRISB.4 = 0  'Como salida, control servo
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off, negado
PORTB.0 = 1  'Led verde a off, negado
'-------------------------------------------------------------------------------
Dim posicion As Word  'duty cycle, señal de control servo a on
Dim periodo As Word  'frecuencia de trabajo de la señal del servo
Dim resto As Word  'señal de control del servo que tiene que estar a OFF
'-------------------------------------------------------------------------------
periodo = 20000  'Periodo (50Hz) de la señal del servo, en uSeg.
posicion = 1350  'Posicion central, duty cycle, señal de control a ON, uSeg.
'-------------------------------------------------------------------------------
main:
If RA5 = 0 Then  '__________Nueva posicion (izquierda) y sus limites y tecla
If posicion > 450 Then posicion = posicion - 1
Endif  '__________________________________________
If RA6 = 0 Then  '___________Nueva posicion (derecha) y sus limites y tecla
If posicion < 2300 Then posicion = posicion + 1
Endif  '___________________________________________
Gosub pwm_servo  'Salto con retorno a la rutina generadora del PWM
Goto main
End                                               
pwm_servo:  '_____________Genera la señal PWM, para controlar el servo
High RB4  'Control del servo, parte a on
WaitUs posicion  'Duty cycle, señal del servo a ON, pausa absoluta y perdida de tiempo
Low RB4  'Control del servo, parte a off
resto = (periodo - posicion) / 1000  'Tiempo que la señal del servo tiene que estar a OFF
WaitMs resto  'Pausa absoluta y una perdida de tiempo total
Return                                           
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Mayo de 2007, 17:40:51
Que grandes avances haces amigo dogflu66  :-/ :-/ :-/

veré si puedo hacer arrancar la lcd con este simulador.

una de las bondades, es que puedes ver las instrucciones línea por línea en asm y cambiar la velocidad de simulación.



Claro Pedro, con este entorno de trabajo nunca termina uno de abandonar el Assembler... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Junio de 2007, 06:18:22
Para mis amigos dejo una version muy mejorada del bufer serie, ahora ocupa menos memoria y va mas rapido
el que quiera saber de los cambios tendra que investigar un poco comparando las versiones anteriores...  :mrgreen:

Código: [Seleccionar]
   '********************************** PIC Entrenadora BASIC *********************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RS232_13
'VERSION: 1.3
'MICRO: PIC16F88
'Fecha/Autor: 1/07, 4/07, 5/7, 6/7 By COS, PSI v7.41
'VERSION 1.3
'Se simplifica la rutina bufer de lectura del puerto serie fisico
'mejora en la precision en las bases de tiempos
'VERSION: 1.2
'modificacion de la rutina Pause_ms
'se baja el bufer del puerto serie a 80 caracteres, porque se aprecia un fallo esporadico de lectura
'se filtran solo los caracteres de control < 31 y "@", se igualan a "_"
'no se aprecia ninguna perdida esporadica de caracteres (ok)
'Version: 1.1
'Simplificacion y mejora de las rutinas
'eliminacion del tiempo de lectura entre byte y byte, ahora solo se lee si hay datos en el bufer
'VERSION: 1.0
'Descripcion: muestra en el display de 16x2, los caracteres recibidos por rs232 y envia otra cadena fija
'tiempo de lectura entre byte y byte del puerto serie 10mseg maximo si no hay datos
'Baudios 4800, 8n1
'************************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Puertos del LCD -------------------------------------------------------------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'Asignacion de I/O y valores de inicio de las salidas---------------------------------------------------
ANSEL = 0x00  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'Inicio TMER1 -------------------------------------------------------------------------------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x2f  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
'Bit interrupciones
PIE1.TMR1IE = 1  'Permete las interrupciones del timer1
PIE1.RCIE = 1  'Permte la interrupcion de la uart en modo rx
INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
'--------------------------------------------------------------------------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
Hseropen 4800  'Configura puerto serie
'--------------------------------------Reasignacion de nombres-----------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
'--------------------------------------Declaracion DE VARIABLES-------------------------------------
'Variables subrutinas del puerto serie ----------------------------------------------------------------
Dim assi As Byte  'Contiene el valor de lectura del puerto serie
Dim n_uart As Byte  'Numero de datos del uart y del bufer IMAGEN de control
Dim uart As Byte  'Variable indice que apunta al ultimo dato adquirido por la uart
Dim c_serial As Byte  'Como uart pero para la lectura de control del bufer IMAGEN
Dim bufer As Byte  'Indica si hay datos por leer en el bufer uart
'Variables de los timer-------------------------------------------------------------------------------------
Dim aux_pause As Word  'variable auxiiar el PAUSE
Dim pause As Word  'contiene el valor para simular el comando Waitms
Dim timer_1ms As Word  'base de tiempos se incrementa cada 1mSeg, timer del PAUSE
Dim timer_1ms_tiempo As Word  'contiene el valor del tiempo del timer_1ms
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos en ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'--------------------------------------Variables Programa--------------------------------------------------
'Variables rutina muestra datos en el LCD
Dim n As Byte  'se utiliza para posicionar caracter en el lcd
Dim flag As Byte  'controla la alternancia para imprimir en el lcd el caracter "(" o el ")"
Dim flag_1 As Byte  'controla la alternacia entre secuencia 1 y 2, tramas tx
'Variables tipo array puerto serie ------------------------------------------------------------------------
Dim uart_imagen(80) As Byte  'Componen el bufer IMAGEN para control del bufer UART
Dim uart_bufer(80) As Byte  'Componen el bufer de la UART de bajo nivel
'Asigna valores a las bases de tiempos del TIMER1-----------------------------------------------
timer_base = 0
aux_pause = 0
pause = 0
timer_1ms = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100  'cuenta 100mSeg
timer1_ms_tiempo = 5  'cuenta 5mSeg.
timer2_ms_tiempo = 100  'cuenta 0.1Seg
timer3_ms_tiempo = 100  'cuenta 0.1Seg
timer1_100ms_tiempo = 10  'cuenta 1Seg.
timer2_100ms_tiempo = 5  'temporiza 0.5Seg
timer3_100ms_tiempo = 5  'temporiza 0.5seg
'Asigna valores a las variables de la rutina del puerto serie----------------
uart = 0
c_serial = 0
bufer = 0
n_uart = 79
assi = 0
'Asignacion de valores generales ------------------------------------------------
n = 0
flag = 0
flag_1 = 0
'----------------------------------------------------------------------------------------------
Enable  'INTCON.GIE habilita todas las interrupciones globales
Gosub clear_bufer  'Inicializa el Buffer RS232, OBLIGATORIO POR LO MENOS UNA VEZ
pause = 1000  'prepara una pausa de 1Seg
Gosub pause_ms  'espera el tiempo que indica pause
Lcdout "18F88_LCD_RS232"  'imprime en el LCD el literal
Lcdcmdout LcdLine2Home  'selecciona linea y cursor al principio
Lcdout "RS232-4800Baud."  'escribe la cadena de literales en el lcd
Hserout CrLf, CrLf, "VER. 1.0 - TX/RX", CrLf, "TX -> PRUEBAS RS232", CrLf, "By COS", CrLf, CrLf  'envia presentacion al RS232
pause = 3000  'prepara una pausa de 3Seg
Gosub pause_ms  'hace una pausa de tiempo indicado por pause
Lcdcmdout LcdClear  'borra el display
'--------------------------------------Bucle Main ------------------------------------------
main:
If timer2_100ms >= timer2_100ms_tiempo And flag_1 = 0 Then  'determina cuando emitir la secuencia_1
Gosub secuencia_1
timer2_100ms = 0
flag_1 = 1  'activa la alternancia entre secuencia_1 y la 2
Endif
If timer2_100ms >= timer2_100ms_tiempo And flag_1 = 1 Then  'determina cuando emitir la secuencia_2
Gosub secuencia_2
timer2_100ms = 0
flag_1 = 0  'activa la alternancia entre secuencia_1 y la 2
Endif
Gosub lcd_control
Goto main
End                                               
'--------------------------------------Subrutinas Programa-----------------------------------------------
secuencia_1:  'envia la trama por el puerto serie
Hserout "@Hola Amigos de TODOPIC", CrLf
Return                                           
secuencia_2:  'envia la trama por el puerto serie
Hserout "@Ejemplo de Trabajo con RS232", CrLf
Return                                           
pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de mSeg
While timer_1ms < pause  'tiempo en mSeg maximos a contar
Wend
Return                                           
'------------------------------ rutinas para el control del bufer del puerto serie-------------
readserial:
'Rutina de lectura del bufer del puerto serie (assi)
If bufer > 0 Then  'si bufer tiene datos
assi = uart_bufer(c_serial)  'se lee el valor del bufer y se asigna assi
uart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
c_serial = c_serial + 1  'se incrementa el indice del bufer
If c_serial >= n_uart Then c_serial = 0  'se verifica si se llego al final del bufer
If uart_imagen(c_serial) = 0 Then bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
Else
assi = 0
Endif
Return                                           
clear_bufer:  'inicializa el bufer imagen y borra error del puerto fisico en modo Rx
'_________________________Borra e inicializa el bufer imagan del puerto serie
c_serial = 0
While c_serial <= n_uart  'se ejecuta tantas veces como variables tiene el bufer
uart_imagen(c_serial) = 0  'borra el indicador de variable del bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0  'variables de control del bufer
uart = 0
bufer = 0
assi = 0
'_________________________Borra el error del puerto serie fisico en Rx
RCSTA.OERR = 0
RCSTA.CREN = 0
RCSTA.CREN = 1
Return                                           
'Subrutina gestión interrupciones -----------------------------------------------------------------
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
'__Bases de tiempos
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion la proboco el timer1
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x2f  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
timer_base = timer_base + 1  'base patron
timer_1ms = timer_1ms + 1  'contador para control del timer_1ms
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'contador para control del timer1_ms
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'contador para control del timer2_ms
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'contador para control del timer3_ms
If timer_base >= timer_base_tiempo Then  'usa la base patron para retrazar la rutina 100mSeg.
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'contador para control...
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'contador para control...
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'contador para control...
timer_base = 0  'reset a la base timer
Endif
PIR1.TMR1IF = 0  'borra el bit de salto del timer1
Endif
'__Bufffer puerto serie
If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USART
If uart_imagen(uart) = 0 Then  'comprueba que la posicion esta vacia
uart_imagen(uart) = 1  'indica que hay dato en el bufer de entrada
bufer = 1  'indica que el bufer tine datos
Hserget uart_bufer(uart)  'carga el dato en el bufer
uart = uart + 1  'indica cual sera la posicion siguiente del bufer
If uart >= n_uart Then uart = 0  'comprueba el final del bufer y lo inicializa
Else
Hserget uart_bufer(n_uart)  'descarga la uart para que no se bloquee porque el bufer de entrada esta lleno
Endif
PIR1.RCIF = 0  'borra el bit de salto del Rx, esto ya lo hace de forma automatica Hserget
Endif
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
lcd_control:  'rutina que imprime los valores recibidos por el puerto serie en el display
'parte 1 de la rutina, sincroniza e imprime los caracteres recibidos por el puerto serie
If bufer = 1 Then  'la rutina se ejecuta si hay datos en el bufer
timer1_100ms = 0  'hay datos hace reset al timer1_100ms
Gosub readserial  'salta a la rutina de lectura del bufer serie
If assi = "@" Then  'caracter de sincronismo de la trama
n = 0  'possicion del display
Lcdcmdout LcdClear  'borra el display y posiciona el cursor superior izquierda
Endif
n = n + 1  'incrementa la posicion para escribir el siguiente caracter en el display
If assi < 21 Or assi = "@" Then assi = 95  'filtra los caracteres a imprimir
Lcdout assi  'escribe el caracter del bufer en el display
If n = 16 Then  'detecta fin de la linea primera
Lcdcmdout LcdLine2Home  'situa el cursor al principio de la siguiente linea
Endif
If n >= 32 Then  'detecta fin de la segunda linea
n = 0  'inicializa la posicion del proximo caracter a imprimir en el display
Lcdcmdout LcdLine1Home  'a inicio de linea
Endif
Endif
'parte 2 de la rutina, cuando no se reciben datos imprime en el display "(" y ")" de forma alterna
If timer1_100ms >= timer1_100ms_tiempo Then  'produce un retrazo inicial a la ejecucion de la rutina
If bufer = 0 Then  'si no hay datos en el bufer
If timer1_ms >= timer1_ms_tiempo Then  'produce un retrazo cada vez que se intenta imprimir en el lcd
timer1_ms = 0  'resetea el timer1_ms para que cuente de nuevo
If flag = 0 Then  'produce la alternancia para escribir "("
n = n + 1
Lcdout "("
If n = 16 Then
Lcdcmdout LcdLine2Home
Endif
If n >= 32 Then
n = 0
flag = 1
Lcdcmdout LcdLine1Home
Endif
Endif
If flag = 1 Then  'produce la alternancia para escribir ")"
n = n + 1
Lcdout ")"
If n = 16 Then
Lcdcmdout LcdLine2Home
Endif
If n >= 32 Then
n = 0
flag = 0
Lcdcmdout LcdLine1Home
Endif
Endif
Endif
Endif
Endif
Return                                       
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Junio de 2007, 07:57:00
¿Por qué programo de esta manera?... será porque me gusta complicarme la vida....

¿Para qué crear una rutina especial "pause_ms" para las perdidas de tiempo "delay" y no utilizar las que suministra el Basic?
-Pues porque al utilizar las interrupciones en especial las bases de tiempos, "Waitms y Waitus" se ven afectadas, los tiempos asignados se les alargan.

¿Por qué utilizo siempre las interrupciones?
-Pues me permite asegurarme que ciertas rutinas ya sean para control de tiempo, control de periféricos exteriores o módulos internos del pic, estas no se verán afectadas por el crecimiento del programa.

¿Por qué no suelo utilizar la mayoría de las funciones de emulación por software que facilita el lenguaje?
-Pues porque son muy lentas y consumen mucha memoria comparadas con los módulos internos del pic, además se ven afectadas por las interrupciones.
Algunas que usan los módulos por hardware tampoco las utilizo por que son muy lentas ya que son genéricas y no hacen un uso muy optimizado del módulo.

¿Por qué en la mayoría de los casos solo utilizo estructuras simples?
-Porque de esta manera será más fácil migrar el programa a otro lenguaje y también es más fácil de modificar en el futuro.

¿Por qué el uso de las bases de tiempos?
-Permiten controlar las veces que se ejecutara una rutina por segundo. Por ejemplo: para que quiero que se ejecute la función del LCD de continuo con lo lenta que es, si con solo refrescar los datos cada 100mSeg. es suficiente, o con leer un teclado cada 50 o 60mSeg es suficiente.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 02 de Junio de 2007, 08:12:16
Tú te lo guisas y tú te lo comes. ¡Cualquiera se atreve a preguntarte!  :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 02 de Junio de 2007, 11:16:08
Hola Carlos!

Es muy cierto lo que dices del WaitMs yWaitUs. Se "estiran" tanto, que en una ocasion para hacer una demora de 1 milisegundo segundo exacto (bueno....todo lo exacto que lo pude medir) tenia que hacer "WaitUs 945". Los otros 65 us se "perdian" por ahi. el micro era un 16f628a con el oscilador interno, pero seguramente el problema no era el oscilador, que solo debe derivar unos 3 o 4 us por segundo...

Esta excelente este hilo! :-/

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Junio de 2007, 21:40:46
Tú te lo guisas y tú te lo comes. ¡Cualquiera se atreve a preguntarte!  :D

"Killo que panzon de rei me dao", me alegro que tu pequeño accidente no afectara a tu buen humor...  :D :D :D :D

Cierto Ariel, con una buena distribucion del tiempo para controlar las rutinas en nuestros programas podremos conseguir autenticas maravillas con pocos megas de reloj.


PD: Waitms = Waitus = Pause = delay => Perdida de tiempo de CPU = KK
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Junio de 2007, 15:47:53
Este es un antiguo ejemplo para controlar la iluminacion del LCD, empleando las bases de tiempos.
Ahora lo he modificado para que haga la misma funcion pero empleando el modulo CCP.
pasamos de tener 20 puntos de resolucion a tener 1024 puntos, contando el cero, utilizando el modulo interno del pic CCP.
la frecuencia que genera el modulo a 8Mhz de reloj y con la configuracion correspondiente es de 488Hz, que corresponde tambien con la realidad segun me indica mi frecuencimetro.

La puesta en marcha de este modulo desde el Basic es realmente sencilla, tan solo se inicializa el modulo con la declaracion "PWMON 1, 1", el primer parametro es el modulo a controlar, y el segundo nos indica el modo de funcionamiento que lo podemos ver en la tabla del manual. y con la segunda declaracion "PWMDUTY 1, duty" controlamos duty de la salida del modulo.

El programa:
Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_12
'MICRO: PIC16F88/8Mhz reloj interno
'Fecha/Autor: 1/07, 6/07 By COS, PSI v7.41
'Version: 1.2
'se elimina el control del PWM por bases de tiempos y se controla mediante el modulo CCP1
'Version: 1.1
'Se cambian los Lcdcmdout LcdClear por Lcdcmdout LcdLinexHome en la subrutina del display, print_lcd
'este cambio acelera la escritura en el display
'Se convierte en subrutina el calculo del PWM segun el valor leido del ADC, calculo_pwm
'Se cambian el orden de los saltos en las lineas acotadas por el timer3_100ms, en el main, esto hace que el valor
'leido de la entrada analogica se actualice con los valores del PWM en el mismo ciclo
'Version: 1.0
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'Activacion del Timer1 por rebose cada 1mSeg.
'implementacion de timer (bases de tiempos) por soft
'lectura de entrada analogica y conversion a voltaje con dos decimales
'Implementacion de PWM con periodo de 20mseg. para el control de la luz del lcd por medio de la entrada adc
'*********************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'------------------------------------Definicion de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales
Define ADC_SAMPLEUS = 10  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off (RA7), negado
PORTB.0 = 1  'led verde a off (RB0), negado
'------------------------------------Inicializacion del TMR1 ---------------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
'------------------------------------------------------------------------------------------------------
Lcdinit  'inicializa el lcd sin cursor
'Asignación de nombres --------------------------------------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'iluminacion del lcd
'Declaracion de variables-------------------------------------------------------------------
'************************************variables de los timer************************
Dim timer_base As Byte  'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte  'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word  'base de tiempos en ms
Dim timer2_ms As Word  'base de tiempos en ms
Dim timer3_ms As Word  'base de tiempos en ms
Dim timer1_100ms As Byte  'base de tiempos msx100
Dim timer2_100ms As Byte  'base de tiempos msx100
Dim timer3_100ms As Byte  'base de tiempos msx100
Dim timer1_ms_tiempo As Word  'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word  'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word  'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte  'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte  'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte  'contiene el valor del tiempo del timer3_100ms
'-------------------------------Variables del ADC y Rutina division-------------------
Dim adc_4 As Word  'contiene el valor de la entrada ADC
Dim num_1 As Word  'valor del adc y retorna la parte entera
Dim num_2 As Word  'factor de la escala y retorna el primer decimal
Dim num_3 As Word  'segundo decimal
Dim dvdo As Word  'dividendo operacion
Dim dvsor As Word  'divisor operacion
'-------------------------------Variables generales-----------------------------------------
Dim flag_1 As Byte  'determina si la luz del lcd estara a on o a off
Dim duty As Word  'contiene el tiempo a on de la iluminacion del lcd a 10bit
Dim resto_periodo As Word  'contine el tiempo a off de la iluminacion del lcd
'-------------------------------Asignacion de valores a las variables------------------
timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 1  '100  'cuenta 100mSeg
timer1_ms_tiempo = 1  'cuenta 1mSeg.
timer2_ms_tiempo = 19  'cuenta 19mSeg
timer3_ms_tiempo = 5  'cuenta 5mSeg
timer1_100ms_tiempo = 10  'cuenta 1 Seg.
timer2_100ms_tiempo = 20  'temporiza 2Seg
timer3_100ms_tiempo = 1  'temporiza 0.1seg
flag_1 = 0
adc_4 = 0
resto_periodo = 0
duty = 0
'-------------------------------------------------------------------------------------------------------------
Enable  'INTCON.GIE habilita todas las interrupciones globales
WaitMs 1000  'espera 1Seg, las interrupciones alargan este tiempo
Lcdout "LCD_Tmr1_ADC_PWM"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con CCP"  'escribe en el lcd
WaitMs 3000  'espera 3Seg, las iterrupciones hacen este tiempo mas largo
Lcdcmdout LcdClear  'borra el display
PWMon 1, 1  'activa el modulo CCP1, a 10bit, 488Hz y duty cycle 0
'------------------------------------Rutinas Principal----------------------
main:  'comienza el programa principal
If timer1_100ms >= timer1_100ms_tiempo Then  'cambio de estado el pin RA7 cada timer1_100ms_tiempo
Toggle led_amarillo  'invierte el valor del pin
timer1_100ms = 0  'reinicio el timer1_100ms
Endif
If timer2_100ms >= timer2_100ms_tiempo Then  'cambio de estado el pin RB0 cada timer2_100ms_tiempo
Toggle led_verde  'invierte el valor del pin
timer2_100ms = 0  'reinicio el timer2_100ms
Endif
If timer3_100ms >= timer3_100ms_tiempo Then  'permite que se ejecute las rutinas solo una vez cada timer3_100ms_tiempo
Gosub lee_adc  'salto con retorno, rutina de lectura de la entrada ADC
Gosub division_dos_decimales  'salto con retorno, rutina de conversion de valor adc a voltios
Gosub calculo_pwm  'salto con retorno, rutina de calculo de tiempos del PWM
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
timer3_100ms = 0  'reset a la base de tiempos
Endif
PWMduty 1, duty  'mantiene el duty cycle del modulo ccp
Goto main  'impide que termine el programa principal
End  'Fin main                                   
'--------------------------------------Subrutina lectura ADC, division y LCD
lee_adc:  '_______________________lee la entrada analogica
Adcin 4, adc_4  'lee el valor de la entrada analogica y lo carga en adc_4
num_1 = adc_4  'sede el valor del adc para ser procesado
num_2 = 205  'asigna factor de correccion, para 5V
Return                                           
division_dos_decimales:  '________Rutina division con dos decimales y conversion a voltios
dvdo = num_1  'asigna dividendo
dvsor = num_2  'asigna divisor
If dvdo > dvsor Then  'calcula la parte entera
num_1 = dvdo / dvsor
dvdo = dvdo Mod dvsor
Else
num_1 = 0
Endif
dvdo = dvdo * 10
If dvdo > dvsor Then  'extrae el primer decimal
num_2 = dvdo / dvsor
dvdo = dvdo Mod dvsor
Else
num_2 = 0
Endif
dvdo = dvdo * 10
If dvdo > dvsor Then  'extrae el segundo decimal
num_3 = dvdo / dvsor
Else
num_3 = 0
Endif
Return                                           
print_lcd:  '____________________muestra los datos por el display
Lcdcmdout LcdLine1Home  'cursor al principio, de la primera linea
Lcdout "ADC ", #adc_4, " ", #num_1, ".", #num_2, #num_3, "V", "    "  'muestra los datos en el lcd
Lcdcmdout LcdLine2Home  'cursor al principio de la segunda linea
Lcdout "On ", #duty, " Off ", #resto_periodo, "  "  'muestra los datos en el lcd
Return                                           
calculo_pwm:  '__________control de los tiempos del PWM segun el valor de adc_4
duty = adc_4  'controla el tiempo del PWM en estado alto
resto_periodo = 1023 - duty  'nos indica el tiempo del PWM en estado bajo
'___________________________________________________
Return                                           
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then  'comprueba que la interrupcion del timer1 es activa
TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
'___base de tiempos
timer_base = timer_base + 1  'contador general
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'contador
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1  'contador
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1  'contador
If timer_base >= timer_base_tiempo Then  'limita el tiempo de ejecucion, cada timer_base_tiempo
If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1  'contador
If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1  'contador
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1  'contador
timer_base = 0  'reset a la base de tiempos
Endif
'__fin base de tiempos
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
Endif
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Junio de 2007, 15:50:27
El programa esta trucado para funcionar con el PSI
Los modulos a utilizar:
(http://img183.imageshack.us/img183/1168/ccp12bc7.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Junio de 2007, 16:00:55
PD. Proximamente veremos que registros del pic nos modifican estas dos declaraciones
      y de este modo veremos el funcionamiento del modulo CCP.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Junio de 2007, 03:17:33
Esta es la tabla que nos proporciona el manual del Pic Basic.
Para configurar el modulo interno CCP utilizando PWMON
Para trabajar como generador de PWM
Esta calculada para 4Mhz de reloj asi que con una simple regla de tres
Podemos saber a que frecuencias trabajara nuestro modulo CCP
Segun nuestra propia frecuencia de reloj.

TABLA PARA CONFIGURAR EL MODULO CCP CON PWMON CCPx, Mode
----------------------------------------------------------------------------------
mode 1: 10-bit, 244Hz
mode 2: 10-bit, 977Hz
mode 3: 10-bit, 3906Hz
mode 4: 9-bit, 488Hz
mode 5: 9-bit, 1953Hz
mode 6: 9-bit, 7813Hz
mode 7: 8-bit, 977Hz
mode 8: 8-bit, 3906Hz
mode 9: 8-bit, 15625Hz
mode 10: 7-bit, 1953Hz
mode 11: 7-bit, 7813Hz
mode 12: 7-bit, 31250Hz
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Junio de 2007, 07:44:32
Hola de nuevo

Como habeis podido comprobar mi timer favorito es el Timer1, no solo porque es de 16bit, tambien porque hay funciones que utilizan modulos o los simulan, y se reservan el uso del timer0. El modulo CCP utiliza de forma automatica el Timer2.
Por ejemplo el WatchDog utiliza el timer0. Por todas estas cosas hay que leer con detalle el manual del compilador para ver si alguna de las funciones que vamos a utilizar ocupara un timer durante su ejecucion.

PD. Estoy trabajando en un ejemplo para utilizar el WatchDog.
PD. El modulo CCP trabajando en modo PWM no queda olvidado.


Otro PD. Tambien hay que leer el Data del micro que facilita el fabricante del mismo, porque el verdadero funcionamiento del micro y sus modulos lo tenemos en el (esta en ingles  :().
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Junio de 2007, 08:04:21
Ayuda a la Programacion:

Cuando estamos programando y el codigo fuente llega ya a una longitud aceptable y al ejecutarlo no hace lo que debiera, a un que siempre hara lo que escribimos  :mrgreen:, una forma de depurar el codigo es tener un elemento donde poder visualizar ciertos datos claves que nos pueden indicar donde cometimos el error, por ejemplo el valor de una variable o simplemente saber si el programa se queda en un bucle infinito al llegar a una rutina en particular. Todo esto lo podemos ver + o - facil con el simulador pero hay que tener en cuenta que como cualquier otro simulador ya sea mejor o peor, los simuladores fallan, puede que un programa funciones bien en el simulador y en la realidad no funcione y viceversa, asi que los simuladores son una buena herramienta pero hay que fiarse de ellos con cierta prudencia.
Bueno volviendo al tema inicial, es bueno tener alguna forma de ver ciertos datos o señalizadores que nosotros colocaremos en la parte sospechosa del programa para que nos indiquen que es lo que esta pasando, esto se hace si disponemos de un Display o mediante el encendido de una señal luminosa, normalmente led, o si no disponemos de esto y disponemos de un puerto RS232 enviando datos al hyperterminal del Windows o visor compatible.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Junio de 2007, 15:28:48
Un ejemplo para el uso del WatchDog, el WatchDog es puesto a cero mediante el opcode clrwdt:

El modulo WatchDog (WDT), si es activado pone en marcha un contador interno programable que
al terminar de contar provoca un reset al microcontrolador, por lo tanto es un modulo supervisor
para controlar que el micro no está bloqueado, o fuera de la rutina principal del programa.
El programador tiene que asegurarse que coloca el reinicio del WDT en varios lugares
(los menos posibles en la rutina principal fundamentalmente) del programa antes que se
desborde su contador y provoque el reset.
Nunca se coloca la línea de código de reinicio del WDT en el vector de interrupciones.

El Pic16F88 tiene un modulo WatchDog (WDT) mejorado.
Este modulo WDT tiene un único reloj que es interno a 31250Hz.
Tiene un Prescaler y se le puede añadir un poscaler, este poscaler
puede ser asignado al WDT o al TMR0, no a los dos a la vez.
Este modulo WDT puede ser activado o apagado en tiempo de ejecución mediante un bit especial.

El programa de ejemplo hace:
Si se pulsa S1 o S2 se anula la línea que hace reset al WatchDog, esto provoca un reset a los 2048uSeg.
Activación del reset generado por el WatchDog sobre los 2mSeg.
Led con secuencia de parpadeo establecida, para observar el reset.
Se crea un tipo de pause (delay) que permite hacer reset al WDT durante la pausa.

Código: [Seleccionar]
''******************** PIC Entrenadora BASIC (PicEBasic)********************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_16
'MICRO: PIC16F88
'FECHA/AUTOR: 06/07 - By COS, PSI v7.41
'Practicando con el WatchDog (WDT)
'Si se pulsa S1 o S2 se anula la línea que hace reset al WatchDog.
'Activacion del reset generado por el WatchDog sobre los 2mSeg.
'Led con secuencia de parpadeo establecida, para observar el reset.
'Se crea un tipo de pause (delay) que permite hacer reset al WDT.
'Este modulo WDT tiene un único reloj que es interno a 31250Hz.
'Tiene un Prescaler y se le puede añadir un poscaler, este poscaler
'puede ser asignado al WDT o al TMR0, no a los dos a la vez.
'***********************************************************************************
Define CONFIG = 0x2f14  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'---------------------------- Configuración del Clock, Puertos I/O -------------------
AllDigital  'todos los puertos como I/O
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como Entradas
TRISB = 0xff  'puerto B como Entradas
'TRISA.4 = 1  'como entrada (RA4, adc)
'TRISA.6 = 1  'como entrada (RA6, tecla S1)
'TRISA.5 = 1  'como entrada (RA5, tecla S2)
TRISB.3 = 0  'como salida, iluminación lcd
TRISA.7 = 0  'como salida, led amarillo
TRISB.0 = 0  'como salida, led verde
TRISB.4 = 0  'como salida, control servo
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off (RA7), negado
PORTB.0 = 1  'led verde a off (RB0), negado
'--------------------------- Configuración del WatchDog ------------------------------
'Prescaler del Wdt 31250Hz/64
WDTCON.WDTPS0 = 1  'Prescaler Rate Select bits 64 (2048uSeg)
WDTCON.WDTPS1 = 0
WDTCON.WDTPS2 = 0
WDTCON.WDTPS3 = 0
OPTION_REG.PSA = 0  'No asigna poscaler al WDT
'Declaración y Asignación de valores -----------------------------------------------
Dim watchdog_on As Bit  'permite que se haga el reset al contador del watchdog
Dim pause As Word  'asigna el valor de espera en mSeg.
watchdog_on = 1  'inicializa la variable, borrado del registro del watchdog a on
'--------------------------------------------------------------------------------------------------
Gosub clear_watchdog  'borra el contador del watchdog antes que rebose
RA7 = 0  'salida led amarillo
RB0 = 0  'salida led verde
pause = 5000  'carga la rutina de espera con 5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
'Bucle main
main:
RA7 = 1  'salida led amarillo
RB0 = 1  'salida led verde
pause = 500  'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
RB0 = 0  'salida led verde
pause = 500  'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
RA7 = 0  'salida led amarillo
pause = 500  'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
Goto main  'impide que termine la rutina main
End                                               
clear_watchdog:  'borra el contador del WatchDog
If watchdog_on = 0 Then Return  'determina si se hace el reset al WatchDog
ASM:        clrwdt  'reinicializa el WDT, assembler
Return                                           
wait_ms:  'rutina de espera, reset al WatchDog y lectura de las teclas
While pause > 0  'bucle que se repite mientras la condición sea cierta
If RA6 = 0 Or RA5 = 0 Then watchdog_on = 0  'lee las teclas
WaitMs 1  'espera 1 mSeg.
pause = pause - 1  'decrementa el tiempo de espera
Gosub clear_watchdog  'salto con retorno a la rutina
Wend  'acota el bucle While
Return     

PD. Este ejemplo no he logrado que funcione en el Simulador del PSI...  :(
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 17 de Junio de 2007, 17:08:29
Hola amigo!

Todo realmente muy impresionante. Esta quedando un hilo estupendo! :-/
Felicitaciones  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Junio de 2007, 19:22:45
Gracias Ariel, ya tengo un par de ejemplos mas, pero ahora toca ir a dormir.



(http://img117.imageshack.us/img117/4213/happypg7.gif)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 18 de Junio de 2007, 11:02:46
Acaba de llegarme la licencia para el PIC18 y AVR...parecen identicos a este simulador, asi que se terminaron las exusas para no usar esos micros. :)
Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ml_floresta en 19 de Junio de 2007, 02:19:15
!!!hola!!!!
tengo un problema para q se visualice algo en un LCD de 2x20....soy nuevo con todo este tema de los lcd..pero hice con el Pic Simulator IDE una prueba para ver como se veia algo en el lcd y cuando
lo quiero simular en el display no aparece nada y en la pantalla del basic compiler keda trabado en LCDINIT 3 .........las instrucciones se siguen ejecutando pero keda ahi....probe tambien poner LCDINIT asi solo, sin q aparezca el cursor pero no pasa nada....y los puertos del setup del lcd estan bien....

aca les dejo lo q hice...capas es una boludes pero no me doy cuenta q es

Citar
'*----------------------------*
'Display LCD 2x20 LM032L 
'PIC 16F628A                     
'*----------------------------*

Define LCD_BITS = 4  'numeros de bits de datos
Define LCD_DREG = PORTB  'puerto de datos
Define LCD_DBIT = 0  'pines del puertos de datos (0,1,2,3)
Define LCD_RSREG = PORTA  'puerto del RS
Define LCD_RSBIT = 0  'pin del puerto RS
Define LCD_EREG = PORTA  'puerto del E
Define LCD_EBIT = 2  'pin del puerto E
Define LCD_RWREG = PORTA  'puerto del R/W
Define LCD_RWBIT = 1  'pin del puerto R/W

Define LCD_COMMANDUS = 5000  'demora de la escritura de un comando
Define LCD_DATAUS = 100  'demora de la escritura de un dato
Define LCD_INITMS = 100  'demora de la inicializacion del LCD

AllDigital

Lcdinit 3  'inicializo el LCD con cursor subrayado y parpadeando

loop:
Lcdcmdout LcdHome  'Lleva el cursor a la primera posición del primer renglón del LCD
Lcdout "www.todopic.com.ar"
WaitMs 1000  'Espero un segundo
Lcdcmdout LcdClear  'Borro el display
WaitMs 1000  'Espero un segundo
Goto loop

ahi esta...
ahh y quiero agradecerle a Ariel Palazzesi por haber inventado www.ucontrol.com.ar jejejeje ayudo bastante

adios
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 19 de Junio de 2007, 07:49:11
Hola ml_floresta!

Gracias por las flores! :) Supongo que en estos dias le voy a dar una "inyeccion" de contenidos nuevos a la pagina.

Respecto de la simulacion, lleva los tiempos a unos pocos us, por que la simulacion es miles de veces mas lenta que a realdad. Cuando vos haces "Define LCD_INITMS = 100 ", en "la vida real" son 100, pero en el simulador son como un millon....

Cambia esas demoras a algo como "Define LCD_INITMS = 1"y volve a probar....

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Junio de 2007, 10:23:08
Código: Visual Basic
  1. 'ml_floresta_1
  2. 'Display LCD 2x20 LM032L, Programa trucado en los tiempos para el PSI
  3. 'PIC 16F628A
  4. '*----------------------------*
  5.  
  6. Define LCD_BITS = 4  'numeros de bits de datos
  7. Define LCD_DREG = PORTB  'puerto de datos
  8. Define LCD_DBIT = 0  'pines del puertos de datos (0,1,2,3)
  9. Define LCD_RSREG = PORTA  'puerto del RS
  10. Define LCD_RSBIT = 0  'pin del puerto RS
  11. Define LCD_EREG = PORTA  'puerto del E
  12. Define LCD_EBIT = 2  'pin del puerto E
  13. Define LCD_RWREG = PORTA  'puerto del R/W
  14. Define LCD_RWBIT = 1  'pin del puerto R/W
  15.  
  16. Define LCD_COMMANDUS = 2000  'demora de la escritura de un comando
  17. Define LCD_DATAUS = 50  'demora de la escritura de un dato
  18. Define LCD_INITMS = 5 '50 'demora de la inicializacion del LCD
  19.  
  20. AllDigital
  21.  
  22. Lcdinit 3  'inicializo el LCD con cursor subrayado y parpadeando
  23.  
  24. loop:
  25. Lcdcmdout LcdHome  'Lleva el cursor a la primera posición del primer renglón del LCD
  26. Lcdout "www.todopic.com.ar"
  27. WaitMs 1  '1000  'Espero un segundo
  28. Lcdcmdout LcdClear  'Borro el display
  29. WaitMs 1  '1000  'Espero un segundo
  30. Goto loop


Cambiale a estos valores y veras como simula bien.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Junio de 2007, 10:36:00
PD. Elige RATE/ULTIMATE en el menu del PSI
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ml_floresta en 19 de Junio de 2007, 16:49:38
Ahiiiiiiiiiiiiii estaaaaaaaaaaaaa!!!!!!

me anduvoooo   :):):)

muchas gracias muchachos y tm por responder rapido....

tengo una preguntita mas...pero es sobre Proteus....

cuando simulo un proyecto me dice:

[SPICE] Error 106 - TRAN:  Timestep too small; time = 2.50133, timestep = 5.55112e-017: trouble with node "#00017"

y deja de simular

pienso q debe ser por lo mismo q pregunte ayer, pero ahora la simulacion es muy rapida.....capas me equivoco pero bue me hago un quilombo con los tiempos para simular ejejje

adios cuidensee saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Junio de 2007, 03:46:41
Magnifico ml_floresta... :-)

Y sobre el tema de proteus no te puedo responder ya que no lo he utilizado mucho y mas bien en
analogica... asi que te recomiendo que consultes en el foro de simuladores.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Junio de 2007, 17:39:24
Este es un nuevo ejemplo para poder trabajar con la EEPROM interna del micro.

Código: Visual Basic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3.  
  4. ''********************************** PIC Entrenadora BASIC (PicEBasic)**********
  5. 'NOMBRE: 16F88_Pic_EBasic_Ejemplo_17
  6. 'MICRO: PIC16F88
  7. 'FECHA/AUTOR: 06/07 - By COS
  8. 'Practicando Read/Write (EEPROM interna del micro)
  9. 'Se envia por el puerto serie las cinco primeras posiciones de memoria EEPROM
  10. 'las tres primeras como control para saber si es la primera vez que se ejecuta el programa
  11. 'y la 4 y 5 son dos contadores que indican el numero de veces que se ejecuto el programa
  12. 'ya sea por reset o por puesta en marcha de la alimentacion
  13. 'la posicion cinco indica las veces que la posicion 4 desbordo (255).
  14. 'puerto serie a 1200 baudios, por emulacion.
  15. '-----------------------------Declaracion y Asignacion de valores---------------
  16. Dim n As Byte  'variable auxiliar
  17. Dim dato_eeprom(5) As Byte  'variables por los que pasaran los valores de la eeprom
  18. '-----------------------------Configuracion del Clock, Puertos I/O--------------
  19. AllDigital  'todos los puertos como I/O
  20. CMCON = 0x07  'comparador a off
  21. osccon = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  22. TRISA = 0xff  'Puerto A como Entradas
  23. TRISB = 0xff  'puerto B como Entradas
  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. TRISB.3 = 0  'como salida, iluminacion lcd
  28. TRISA.7 = 0  'como salida, led amarillo
  29. TRISB.0 = 0  'como salida, led verde
  30. TRISB.4 = 0  'como salida, control servo
  31. PORTB.3 = 1  'luz lcd a on (RB3)
  32. PORTA.7 = 1  'led amarillo a off (RA7), negado
  33. PORTB.0 = 1  'led verde a off (RB0), negado
  34. '************* Rutina del programa ***************************************
  35. Gosub actualiza_eeprom  'actualiza la eeprom, salto con retorno
  36. RA7 = 0  'salida led amarillo
  37. RB0 = 0  'salida led verde
  38. WaitMs 5000  'espera 5 Seg.
  39. main:  'comienza la rutina principal
  40.         RA7 = 1  'salida led amarillo
  41.         RB0 = 1  'salida led verde
  42.         WaitMs 500  'espera 0,5 Seg.
  43.         RB0 = 0  'salida led verde
  44.         WaitMs 500  'espera 0,5 Seg.
  45.         RA7 = 0  'salida led amarillo
  46.         WaitMs 500  'espera 0,5 Seg.
  47. Goto main  'impide que termine la rutina main
  48. End                                              
  49. actualiza_eeprom:  'comprueba si la eeprom fue escrita, si no la inicializa y comienza el contaje
  50.         For n = 0 To 4  'bucle para recorrer las primeras posiciones de memoria
  51.                 Read n, dato_eeprom(n)  'se asigna de la direccion "n" el dato a la variable dato_eeprom(n)
  52.         Next n  'acota el bucle For
  53.         If dato_eeprom(0) <> 0 Or dato_eeprom(1) <> 1 Or dato_eeprom(2) <> 2 Then  'comprueba si la eeprom
  54.                                                                                                 'fue inicializada y si no fue asi la inicializa
  55.                 For n = 0 To 2  '____Escribe los tres primeros caracteres de control
  56.                         Write n, n  'escribe en la eeprom
  57.                 Next n  '_____________
  58.                 Write 3, 1  'inicializa el primer contador
  59.                 Write 4, 0  'inicializa el segundo contador que nos indica las veces que reboso el primer contador
  60.         Else  'si lo anterior no es cierto entonces esto otro
  61.                 dato_eeprom(3) = dato_eeprom(3) + 1  'incrementa el primer contador
  62.                 Write 3, dato_eeprom(3)  'escribe el nuevo valor para el primer contador
  63.                 If dato_eeprom(3) = 255 Then  'si reboso el primer contador
  64.                         dato_eeprom(4) = dato_eeprom(4) + 1  'se incrementa el segundo contador
  65.                         Write 4, dato_eeprom(4)  'se escribe el valor del segundo contador
  66.                 Endif
  67.         Endif
  68.         Serout PORTB.5, 1200, #dato_eeprom(0), #dato_eeprom(1), #dato_eeprom(2)  'envia las tres
  69.                                                                                         'primeras posiciones al puerto serie
  70.         Serout PORTB.5, 1200, " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf  'envia las 2 ultimas
  71.                                                                                                 'posiciones al puerto serie
  72. Return                                            
  73. End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Junio de 2007, 17:49:15
El programa anterior lo que hace es llevarnos la cuenta de cuantas veces reiniciamos la placa
EBasic ya sea por reset del micro o por power on de la misma.
El problema esta al inicializar la placa por primera vez, asi que lo que hacemos es comprobar
que las tres posiciones primeras de la memoria tienen o no tienen un valor determinado,
si lo tienen lo que hacemos es leer el valor de la 3 y 4 posicion e incrementar según corresponda
en uno la posición 3 o la 4 si se detecto que desbordo la 3. y actualizar los valores de las respectivas
posiciones. Y en el caso que no lo tenga pues grabamos estas tres primeras posiciones con los valores
1, 2, y 3 respectivamente e inicializamos la dirección 3 = 1 y la dirección 4 = 0.

PD. Las direcciones que usamos son las cinco primeras siendo la primera la 00.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ml_floresta en 22 de Junio de 2007, 13:28:32
Muchas gracais dogflu66

alguien sabe si se puede hacer q por ejemplo en una linea del LCD aparezca esto:

< A B C D E F G >

al apretar un supuesto boton aparecería algo asi:

< A B C D E F G >

como destacando la posicion en la q uno se encuentra...
o sería mas facil hacer algo asi??:

<              A             >

y al apretar el boton:

<              B             >

capas estoy pidiendo algo q no existe jejeje pero queria saber
muchas gracias adios
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 22 de Junio de 2007, 13:56:32
Hola!

Hasta donde yo se, no podes usar "negritas" en los LCd, ya que no tiene mas que el juego de caracteres normal...

Lo que si podrias hacer es que tengas < a b c d e f > y al pulsar te aparezca < a B c d e f > ....eso seria muy sencillo.

Si tenes a mano la ayuda del PIC BASIC del PSI, vas a ver en la seccion de LCD un par de ejemplos de como escribir en una posicion determinada de cada fila. (Esa ayuda tambien esta en la web del fabricante).

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ml_floresta en 22 de Junio de 2007, 14:24:21
ahhhhhh, lo pregunte por las dudas porq para mi q no se podia...

si eso de poner minusculas y mayusculas lo pense gracias igual...me fijo como kedaria mejor
muchas graciass
adiosss saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 22 de Junio de 2007, 14:37:44
Otra idea:

< A B C D E F >
 y luego

< A(B)C D E F >

 :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2007, 19:55:39
En las practicas pasadas con el reloj de tiempo real, tuve el mismo problema con el menu de configuracion,
al final lo que hice fue aplicar una base de tiempo y hacer los datos seleccionados intermitentes o parpadeo.


PD. El efecto queda magnifico... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 22 de Junio de 2007, 20:12:48
Hola DogFlu66!

Es una muy buena idea. Para tener en cuenta. :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Junio de 2007, 19:04:31
La utilización de funciones y procedimientos es una de las ultimas opciones que se le añadió a este lenguaje, tienen una cualidad muy interesante para nosotros y es la posibilidad de utilizar variables locales con lo que nos abren una puerta a una nueva forma de programar, nos permiten que construyamos una serie de rutinas que insertaremos en nuestro programa sin tener que preocuparnos de las variables existentes en el, ya que este tipo de estructuras utilizan sus propias variables a efectos locales, no importando que coincidan los nombres de estas con las del resto del programa.

En este caso he creado una función que nos permite dividir dos números enteros entre si, generando otro de salida en formato long con 4 decimales y permitiendo la activación en la rutina de mostrar este numero directamente por el display con el formato elegido.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Junio de 2007, 19:07:52
Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_19
'Descripcion: Usando Funciones
'Micro: PIC16F88 a 8mhz reloj interno, By COS, PSI v7.41
'Rutina de division hasta 4 decimales (Funcion) ________________
'Argumentos de entrada 2 variables tipo Word: dividendo, divisor,
'Numero decimales (1 Byte), una tipo Bit que permite que la funcion muestre (ON/OFF) el valor por display
'y como argumento de salida una variable tipo Long
'Muestra datos en el LCD hasta 4 decimales _________
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'*****************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'------------------------------Definicion de puertos--------------------------------------
ANSEL = 0x00  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como Entradas
TRISB = 0xff  'puerto B como Entradas
TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off, negado
PORTB.0 = 1  'led verde a off, negado
'------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
WaitMs 1000  'Espera 1Seg
'Reasignacion de nombres----------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'Variables---------------------------------------------
Dim division As Long  'Almacenara el numero con los dos decimales
Dim numero_1 As Word  'Dividendo
Dim numero_2 As Word  'Divisor
'Asignacion de valores a las variables-----------------
numero_1 = 255
'Rutina principal--------------------------------------
main:
'Bucle que se repite hasta que numero_2 tome todos los valores comprendidos entre 1 y 5000 inclusive
For numero_2 = 1 To 5000
Lcdcmdout LcdLine1Home  'Cursor principio de linea 1
Lcdout #numero_1, "/", #numero_2, "=       "  'Muestra los datos en el lcd
Lcdcmdout LcdLine2Home  'Cursor principio de linea 2
division = dvsion_dcmles(numero_1, numero_2, 3, 1)  'Llama a la funcion
Lcdout "    "  'Borra caracteres sobrantes
WaitMs 1000  'Hace una pausa de 1 Seg.
Next numero_2  'Limita el bucle for
'Goto main  'Genera un bucle infinito
End                                               
'______Rutina funcion division con decimales
'______Argumentos de entrada: 2 variables tipo word, dividendo, divisor,
'______numero de decimales (1 Byte) y display ON/OFF (1 Bit), argumento de salida una variable tipo Long
Function dvsion_dcmles(dvd As Word, dvsor As Word, n_dec As Byte, lcd_on As Bit) As Long
dvsion_dcmles.HW = 0  'inicializo el word alto
dvsion_dcmles.LW = dvd Mod dvsor  'obtengo el resto
'Multiplicar 1xx seguido de tantos ceros como decimales
dvsion_dcmles = (dvsion_dcmles * 10000) / dvsor
dvsion_dcmles.HW = dvd / dvsor  'obtengo la parte entera
'la parte decimal tiene que ser mostrada con plantilla si se usa mas de 1 decimal
'ahorro memoria al utilizar el menor numero de veces operaciones con Long
'___________________________________________________________________________________
'____________da formato a los decimales y los saca por el lcd
If n_dec < 1 Then n_dec = 1  'acota el numero de decimales
If n_dec > 4 Then n_dec = 4  'acota el numero de decimales
If n_dec = 1 Then dvsion_dcmles.LW = dvsion_dcmles.LW / 1000  'elimina decimales
If n_dec = 2 Then dvsion_dcmles.LW = dvsion_dcmles.LW / 100  'elimina decimales
If n_dec = 3 Then dvsion_dcmles.LW = dvsion_dcmles.LW / 10  'elimina decimales
If lcd_on = 1 Then  'habilita la opcion imprimir en el display
Lcdout #dvsion_dcmles.HW, "."  'muestra los datos en el lcd, parte entera
'mantiene la plantilla de los decimales, eliminar para 1 decimal
If dvsion_dcmles.LW < 10 And n_dec > 1 Then Lcdout "0"
'mantiene la plantilla de los decimales, eliminar para 1 y 2 decimales
If dvsion_dcmles.LW < 100 And n_dec > 2 Then Lcdout "0"
'mantiene la plantilla de los decimales, eliminar para 2 y 3 decimales
If dvsion_dcmles.LW < 1000 And n_dec > 3 Then Lcdout "0"
Lcdout #dvsion_dcmles.LW,  'muestra los datos en el lcd, decimales
Endif
End Function

PD. Solo modificados algunos comentarios
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ml_floresta en 25 de Junio de 2007, 04:48:27
jajajajaa muchas gracias por esa idea para el lcd....

una pregunta.....en un lcd es necesario tener conectado el pin R/W, sabiendo q yo quiero q aparesca noma una frase en el lcd?

para q sirve el pin E?

muchas graciass
adios
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 25 de Junio de 2007, 07:18:23
Hola amigo!

R/W (READ/WRITE) es para seleccionar si vas a escribir en el LCD (0) o si vas a leer la RAM del mismo (1).
E es "ENABLE", sirve por si tenes varios dispositivos en el mismo bus de datos, y queres seleccionar solo uno de ellos.

R/W puede ponerse a masa, y usar solo 6 pines para manejar el LCD: D4..D7, RS y E.

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ml_floresta en 25 de Junio de 2007, 13:16:29
ahhhhhhhhh
muchas gracias aitopes...ahi lo entendi

disculpen si pregunto mucho pero ya q tengo la oportunidad los exprimo a ustedes dos para informarme jajaaa
saludos
adiossss
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Junio de 2007, 20:11:31
La base donde podeis experimentar con el parpadeo de caracteres en el LCD
El efecto se ve incluso en el Simulador
Con la opcion ULTIMATE habilitada y deshabilitando BASIC PROGRAM TRACKING
Y para ver una aplicacion ver la parte del RTC con menu.


Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) *************************************
'NOMBRE: 16F88_Ejemplo 20
'MICRO: PIC16F88/8Mhz reloj interno
'Fecha/Autor: 06/07, By COS, PSI v7.41
'Parpadeo de un caracter en la pantalla del lcd
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'********************************************************************************
'********************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'*************************************************************************************
'Definicion de puertos------------------------------------------
AllDigital  'Los pin de los puertos como I/O
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como entradas
TRISB = 0xff  'Puerto B como entradas
'Inicializacion de Interrupciones-----------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x2f  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1  'habilitacion del TMR1, comienza a incrementarce
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Lcdinit  'Inicializa el display
'Declaracion de variables---------------------------------------
Dim n As Byte  'Variable auxiliar
Dim flash As Bit  'Control parpadeo
Dim timer1_ms As Word  'Base de tiempos en ms
Dim timer1_ms_tiempo As Word  'Contiene el valor del tiempo del timer1_ms
'Asignacion de valores a las variables--------------------------
n = 0
timer1_ms = 0
timer1_ms_tiempo = 500  'Tiempo del parpadeo del caracter en mSeg.
WaitMs 500  'Pausa de medio segundo
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1, despues del inicio del LCD
Enable  'INTCON.GIE habilita todas las interrupciones globales
'de este modo no tenemos que esperar tanto en el Simulador (PSI)
'Rutina Principal----------------------
main:  'Comienza el programa principal
Lcdcmdout LcdLine1Home  'Cursor del lcd al principio
If timer1_ms >= timer1_ms_tiempo Then  'Control base tiempos
Toggle flash  'Control parpadeo
timer1_ms = 0  'Reinicia la base de tiempos
Endif
If flash = 0 Then  'Rutina lcd y parpadeo
Lcdout "N"  'Muestra en el lcd
Else
Lcdout " "  'Muestra en el lcd, borra
Endif
Lcdout "=", #n, "  "  'Muestra en el lcd
n = n + 1  'Contador
Goto main  'Impide que termine el programa principal
End                                               
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System  'Guarda los valores del sistema
If PIR1.TMR1IF = 1 Then  'Comprueba que la interrupcion del timer1 es activa
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x2f  'Carga el registro del contador para que desborde cada 1mSeg, byte bajo
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'Base tiempos
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
Endif
Resume  'Activa las interrupciones y retorna al curso normal del programa antes del salto


PD. Solo modificacion en algunos comentario (Copy/Paste)

PD. no teman, solo le cambie el nombre.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Junio de 2007, 20:21:48
El efecto es que coexiste el parpadeo junto con el incremento constante del contador.
La sensación del que ve el display es que se trabaja en multitarea.
Cuando pueda pondré un video del lcd de la EBasic para poder apreciar bien el efecto.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Julio de 2007, 17:09:14
Volviendo hacia atras:

Código: [Seleccionar]
'*******************PIC Entrenadora BASIC (PicEBasic)************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_18
'MICRO: PIC16F88
'FECHA/AUTOR: 06/07 - By COS, PSI v7.41
'Practicando con la funcion Read/Write (EEPROM interna del micro) y WatchDog
'Hereda todas las funciones del ejemplo 17______
'Practicando con la funcion Read/Write (EEPROM interna del micro)
'Se envia por el puerto serie las cinco primeras posiciones de memoria EEPROM
'las tres primeras como control para saber si es la primera vez que se ejecuta el programa
'y la 4 y 5 son dos contadores que indican el numero de veces que se ejecuto el programa
'ya sea por reset o por puesta en marcha de la alimentacion
'la posicion cinco indica las veces que la posicion 4 desbordo (255).
'puerto serie a 1200 baudios, por emulacion.
'Hereda todas las funciones del ejemplo 16_______
'Practicando con el WatchDog
'Si se pulsa S1 o S2 se anula la linea que hace reset al WatchDog
'Activacion del reset generado por el WatchDog sobre los 262,144mSeg.
'**********************************************************************
Define CONFIG = 0x2f54  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-----------------------------Configuracion del Clock, Puertos I/O--------------
AllDigital  'todos los puertos como I/O
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como Entradas
TRISB = 0xff  'puerto B como Entradas
'TRISA.4 = 1  'como entrada (RA4, adc)
'TRISA.6 = 1  'como entrada (RA6, tecla S1)
'TRISA.5 = 1  'como entrada (RA5, tecla S2)
TRISB.3 = 0  'como salida, iluminacion lcd
TRISA.7 = 0  'como salida, led amarillo
TRISB.0 = 0  'como salida, led verde
TRISB.4 = 0  'como salida, control servo
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off (RA7), negado
PORTB.0 = 1  'led verde a off (RB0), negado
'---------------------------Configuracion del WatchDog--------------------------
OPTION_REG.T0CS = 0  'selecciona reloj interno para el WDT
'Prescaler del Wdt
'_wdt_div8192 = 8  '262,144mSeg.
WDTCON.WDTPS0 = 0  'Prescaler Rate Select bits
WDTCON.WDTPS1 = 0
WDTCON.WDTPS2 = 0
WDTCON.WDTPS3 = 1
OPTION_REG.PSA = 0  'No prescales2
'-----------------------------Declaracion y Asignacion de valores---------------
Dim n As Byte  'variable auxiliar
Dim dato_eeprom(5) As Byte  'variables por los que pasaran los valores de la eeprom
Dim watchdog_on As Bit  'permite que se haga el reset al contador del watchdog
Dim pause As Word  'asigna el valor de espera en mSeg.
watchdog_on = 1  'inicializa la variable, borrado del registro del watchdog a on
'---------------------------------------------------------------------------------
Gosub clear_watchdog  'borra el contador del watchdog antes que rebose
Gosub actualiza_eeprom
RA7 = 0  'salida led amarillo
RB0 = 0  'salida led verde
pause = 5000  'carga la rutina de espera con 5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
main:  'comienza la rutina principal
Gosub clear_watchdog  'salto con retorno a la rutina
RA7 = 1  'salida led amarillo
RB0 = 1  'salida led verde
pause = 500  'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
RB0 = 0  'salida led verde
pause = 500  'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms  'salto con retorno a la rutina de espera
RA7 = 0  'salida led amarillo
pause = 500  'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms  'Borra pone a cero el registro contador del WDT
Goto main  'impide que termine la rutina main
End                                               
clear_watchdog:  'borra el contador del WatchDog
If watchdog_on = 0 Then Return  'determina si se hace el reset al WatchDog
ASM:        clrwdt  'reinicializa el WDT, assembler
Return                                           
wait_ms:  'rutina de espera, reset al WatchDog y lectura de las teclas
While pause > 0  'bucle que se repite mientras la condiccion sea cierta
If RA6 = 0 Or RA5 = 0 Then watchdog_on = 0  'lee las teclas
WaitMs 1  'espera 1 mSeg.
pause = pause - 1  'decrementa el tiempo de espera
Gosub clear_watchdog  'salto con retorno a la rutina
Wend  'acota el bucle While
Return                                           
actualiza_eeprom:  'comprueba si la eeprom fue escrita, si no la inicializa y comienza el contaje
For n = 0 To 4  'bucle para recorrer las primeras posiciones de memoria
Read n, dato_eeprom(n)  'se asigna el contenido de la direc. "n" el dato a la varia. dato_eeprom(n)
Next n  'acota el bucle For
If dato_eeprom(0) <> 0 Or dato_eeprom(1) <> 1 Or dato_eeprom(2) <> 2 Then  'verifica eeprom inicializada
For n = 0 To 2  '____Escribe los tres primeros caracteres de control
Write n, n  'escribe en la eeprom
Next n  '_____________
Write 3, 1  'inicializa el primer contador
Write 4, 0  'inicializa el segundo contador que nos indica las veces que reboso el primer contador
Else  'si lo anterior no es cierto entonces esto otro
If dato_eeprom(3) = 255 Then
dato_eeprom(4) = dato_eeprom(4) + 1  'se incrementa el segundo contador
Write 4, dato_eeprom(4)  'se escribe el valor del segundo contador
Endif
dato_eeprom(3) = dato_eeprom(3) + 1  'incrementa el primer contador
Write 3, dato_eeprom(3)  'escribe el nuevo valor para el primer contador
Endif
Serout PORTB.5, 1200, #dato_eeprom(0), #dato_eeprom(1), #dato_eeprom(2)  'envia las tres
'primeras posiciones al puerto serie
Serout PORTB.5, 1200, " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf  'envia las 2 ultimas
'posiciones al puerto serie
Return   
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Julio de 2007, 18:00:43
El efecto es que coexiste el parpadeo junto con el incremento constante del contador.
La sensación del que ve el display es que se trabaja en multitarea.
Cuando pueda pondré un video del lcd de la EBasic para poder apreciar bien el efecto.





PD: Waitms = Waitus = Pause = delay => Perdida de tiempo de CPU = KK
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Goofymza en 08 de Julio de 2007, 06:29:23
hola gente soy nuevo en este foro y este hilo me ah parecido genial
la verdad hace muy poco comence con el pic simulator ide
y leer este hilo me a ayudado muchisimo
lo unico que no eh podido abrir del hilo tal ves por que lleva demaciado tiempo son los esquemas de los pcb
si alguien seria tan ambla de mandarme los al correo le agracere mucho
ya que lo que eh podido serguir de este proyecto es solo con el programa y la verdad me gustaria tambien poder hacerlo con la placa ya que es una exlente heramienta

nuevamente los felicito por el proyecto
saludos :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Julio de 2007, 08:45:20
Aqui esta la ultima version de la Placa PicEBasic_1.3



http://rapidshare.com/files/41707089/PicEBasic_13.pdf.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Julio de 2007, 10:14:10
PD. Lo mismo pero con el esquema  :mrgreen:

http://rapidshare.com/files/41721804/PicEBasic_13_Esquema_y_PCB.pdf.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Julio de 2007, 10:17:36
PD. Recordar que a la hora de imprimir hay que indicar que no haga ningún tipo de adaptación a pagina.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 08 de Julio de 2007, 15:46:39
Muy buen trabajo. Cada vez que paso por el hilo me dan ganas de date una "palmadita en la espalda" :)

Te debo la promesa de "colgar" el contenido en mi web. Pero pronto lo voy a solucionar.

Saludos! :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Goofymza en 08 de Julio de 2007, 19:28:39
dogflu66 muchas gracias
la verdad es super compata
esta muy buena
nuevamente gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Goofymza en 08 de Julio de 2007, 22:56:16
hola de nuevo tengo una consulta alguien sabe como utilizar las entradas analogas del 16f628a por que la verdad no la he podido hacer andar a una sola me muetra todaslas entradas del puerto a analagas(ra0, ra1, ra2, ra3) y no me deja hacer comparaciones
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Julio de 2007, 17:20:29
No he utilizado el modulo comparador, habra que mirar el
data del pic para configurarlo, cuando tenga un rato
echare un vistazo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Julio de 2007, 19:01:31
Este es un ejemplo extraido de la pagina del PSI, usando el modulo comparador.
Es el Example 6 (http://www.oshonsoft.com/picgetstarted.html#6)


Código: vb.net
  1. '***************************************************************
  2. '****************Analog Comparator Module***********************
  3. '***************************************************************
  4. Define CONF_WORD = 0x3f10
  5. Define CLOCK_FREQUENCY = 4
  6.  
  7. Symbol comp_change = PIR1.CMIF  'comparator interrupt flag
  8.  
  9. CMCON = 0x06  'set comparator mode to two common reference comparators with outputs
  10. TRISA = 0x07  'set RA0, RA1 and RA2 as inputs, other PORTA pins as outputs
  11. VRCON = 0xec  'turn on, configure voltage reference module for 2.5V and connect it to RA2
  12. TRISB = 0x00  'set PORTB pins as outputs
  13.  
  14. loop1:
  15.         While Not comp_change  'wait for comparator output change
  16.         Wend
  17.         PORTB = CMCON  'display CMCON register on PORTB pins, RB6 and RB7 are comparator outputs
  18.         comp_change = 0  'reset comparator interrupt flag
  19. Goto loop1  'repeat forever
  20. End                                              
  21. 'http://www.oshonsoft.com/picgetstarted.html#6
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Julio de 2007, 19:05:51
El ejemplo viene explicado paso a paso para poder ser simulado... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Goofymza en 15 de Julio de 2007, 23:49:33
hola nuevamente gente gracias dogflu66 por el material la verdad ni lo vi en la pagina
bueno les cuento qual es el problema en la septima linea del ejemplo esta el comando pir1 y a continuacion CMIF quien es el que dice que se debe activar y a que voltage
lo que nesecito saber es si hay alguna forma de configurar CMIF o PIR1 para decirle a que valor de comparacion ejecute las acciones de los pines
desde ya muchas gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Julio de 2007, 18:27:12
Nunca he utilizado el modulo comparador.
Pere ya puestos cuando termine un par de cosas
lo mirare mas afondo...  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Julio de 2007, 18:49:35
Os dejo la solución a un problema muy puntual que me encontré hace
poco en un pequeño proyecto que estoy terminando, tan solo indicar
que genera una trama a 1200baudios mediante la función Serout,
estando el hard basado en un Pic12F675. El pic funciona mediante
su reloj interno a 4Mhz, y el problema estaba en que enviaba siembre
la trama corrompida, estando por otro lado el Soft y el Hard bien,
al final pude encontrar el problema. El data de este micro nos indica
que puede tener hasta +-200Khz de error en la frecuencia del reloj,
asi que la solución fue calibrar el oscilador mediante el registro “osccal”,
el fabricante en este micro nos indica el valor a calibrar. Este valor
esta escrito en la ultima posición de memoria flash del pic, pero el por si
mismo no lo utiliza. Una vez calibrado el sistema funciono correctamente.

El Pic16F88 es distinto del anterior porque su reloj interno esta
calibrado en fabrica. No hay problema en jugar con el registro
porque siempre vuelve al calibrado original si se omite nuestro ajuste.
Aquí dejo el programa para calibrar la rutina generadora de 1000hz.
Como es natural al ejecutar código este tarda un tiempo y genera retrasos,
con este método podemos recalibrar el sistema.

En este caso el registro tiene nombre diferente “osctune” para el
PIC16F88. Con un factor de corrección de 63 corrige todos los retrasos que se generan
al procesar código y queda justo exactamente a la frecuencia deseada.
Después del ajuste del oscilador del 16F88 mediante OSCTUNE pasamos de
generar una frecuencia de 1009hz por el retardo que se tarda en ejecutar el código
a 1000hz  después de la calibración, como se puede observar el calibrado del oscilador
interno de este pic realizado por el fabricante es muy preciso.
Todo esto medido en el pin RB4 mediante un frecuencimetro.

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) *****************
'NOMBRE: 16F88_Ejemplo 22
'MICRO: PIC16F88, 8Mhz reloj interno
'Fecha/Autor: 07/07, By COS, PSI v7.41
'Metodo para el calibrado del reloj interno del pic
'******************************************************************
'******************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Definicion de puertos y modulos ---------
AllDigital  'Los pin de los puertos como I/O
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
'OSCTUNE = 63  'Factor de correcion del reloj
TRISA = 0xff  'Puerto A como entradas
TRISB = 0xff  'puerto B como entradas
TRISB.4 = 0  'RB4 como salida
'Rutina Principal ----------------------
main:  'Bucle infinito
RB4 = 1  '_______Genera una frecuencia de 1Khz
WaitUs 500
RB4 = 0
WaitUs 500  '____
Goto main  'Impide que termine la subrutina principal
End 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Julio de 2007, 19:03:41
PD. con el ejemplo pasado "'NOMBRE: 16F88_Pic_EBasic_LCD_Timer1_MidiendoTiempo_10"
se podria medir el tiempo exacto de la rutina para generar 1Khz y tal vez podriamos hacer
un ajuste mas fino.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Julio de 2007, 13:50:31
Generando numeros aleatorios (Dado Electronico):

Como este basic no tiene implementado el comando o la función Random.
Vamos a generar nuestra propia rutina para generar números aleatorios.
Se trata de utilizar un timer para generar nuestros números aleatorios.
Programaremos un timer, en este caso el Timer0, para que este continuamente
incrementándose, no activaremos las interrupciones del timer, porque no nos
hace falta en este caso. El Timer0 es utilizado por algunos módulos y funciones,
asi que si utilizamos estos módulos o funciones tendremos que cambiar de timer
como base para obtener estos números..

Activamos el timer y filtramos su resultado para obtener el margen deseado,
en este caso cada vez que pulsemos una tecla obtendremos un numero comprendido entre 1 y 6.

Nota: Este sistema se basa en un contador (TMR0) que se incrementa y reinicia constantemente a una gran velocidad, tarda en realizar un ciclo completo unas pocas decenas o centenares de uSeg.
Un contador por si solo no basta para conseguir el numero aleatorio, si nos basamos solamente en extraer el valor del registro contador del timer utilizado mediante el programa tendríamos siempre la tendencia a repetir la misma lista de resultados, porque el microcontrolador es un entorno finito y ordenado y, esto lo hace predecible; pero si se realiza la lectura del contador solamente cuando se pulsa una tecla (evento humano exterior) se añade el elemento de aleatoriedad que falta. La velocidad con la que varia el contador del timer es tal que por mucho que nos esmeremos resultará realmente dificil predecir el numero que saldrá al pulsar la tecla.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Julio de 2007, 13:52:02
El programa:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_23
'Descripcion: Generando numeros aleatorios con el Timer0, Dado Electronico
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 22/7/07, By COS, PSI v7.41
'**********************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'Definicion de puertos------------------------------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como entradas
TRISB = 0xff  'Puerto B como entradas
'TRISA.4 = 1  'Como entrada (RA4, adc)
'TRISA.6 = 1  'Como entrada (RA6, tecla S1)
'TRISA.5 = 1  'Como entrada (RA5, tecla S2)
TRISB.3 = 0  'Como salida RB3
TRISA.7 = 0  'Como salida RA7
TRISB.0 = 0  'Como salida RB0
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'Inicialización TIMER0-----------------------------
OPTION_REG.T0CS = 0  'Selecciona reloj interno
OPTION_REG.PSA = 0  'Asigna el prescaler al timer0
'---------------------------------------------------
Lcdinit  'Inicializa el LCD sin cursor.
'Reasignacion de nombres-------------------------
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
Symbol luz_lcd = PORTB.3  'Iluminacion del lcd
Symbol s1 = RA6  'Tecla S1
Symbol s2 = RA5  'Tecla S2
'Variables generales--------------------------------
Dim random As Byte  'Contendra el numero deseado
'---------------------------------------------------
WaitMs 500  'Espera medio segundo
Lcdout "Pulse una Tecla"  'Imprime en el lcd
'Rutinas Principal ---------------------------------
main:  'Comienza el programa principal
If s1 = 0 Or s2 = 0 Then  'Detecta las teclas
While s1 = 0 Or s2 = 0  'Espera que se suelte la tecla
Wend
random = (TMR0 Mod 6) + 1  'Siendo 6 el numero maximo y +1 porque no queremos que salga el cero.
Lcdcmdout LcdLine2Home  'Cursor del lcd al principio linea 2
Lcdout "El Numero: ", #random, "  "  'Imprime la plantilla y el resultado en el lcd
WaitMs 300  'Espera 0.3 segundo
Endif
Goto main  'Impide que termine el programa principal
End                                               


PD. donde decia "TRISB = 0xf  'puerto B como entradas", ahora dice "TRISB = 0xff  'puerto B como entradas"
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Julio de 2007, 16:29:25
Esta es una version mas elaborada del programa anterior
Ahora el codigo es mas transportable porque uso la generacion
del numero aleatorio mediante una funcion.

Y recomiendo mirar la forma que uso en esta version para
controlar los led mediante la estructura PROC.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Julio de 2007, 16:32:25
El programa:
Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_23_1
'Descripcion: Generando numeros aleatorios con el Timer0, Dado Electronico
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 22-25/7/07, By COS, PSI v7.41
'Version: 1.1
'Usando Function y Proc
'Se calcula el numero mediante una Funcion.
'El primer numero de entrada de la funcion es el numero maximo y
'el segundo numero de la funcion es el numero minimo.
'nueva rutina para el control de los led mediante Proc.
'Version: 1.0
'Calcula numero aleatorio
'**************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'Definicion de puertos------------------------------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como entradas
TRISB = 0xff  'Puerto B como entradas
'TRISA.4 = 1  'Como entrada (RA4, adc)
'TRISA.6 = 1  'Como entrada (RA6, tecla S1)
'TRISA.5 = 1  'Como entrada (RA5, tecla S2)
TRISB.3 = 0  'Como salida RB3
TRISA.7 = 0  'Como salida RA7
TRISB.0 = 0  'Como salida RB0
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'-----------------------------------------------------------------
Lcdinit  'Inicializa el LCD sin cursor.
'Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
Symbol s1 = RA6  'tecla S1
Symbol s2 = RA5  'tecla S2
'Variables generales-----------------------------------------------
Dim n_random As Byte  'contendra el numero deseado
'------------------------------------------------------------------
WaitMs 500  'Espera medio segundo
Lcdout "Pulse una Tecla"  'Imprime en el lcd
Call led(_off, _off)  'Inicializa los led a off
n_random = random(0, 0)  'Inicializa random (timer0)
'Rutinas principal ------------------------------------------------
main:  'Comienza el programa principal
If s1 = 0 Then  'Si la tecla es pulsada
While s1 = 0  'Espera mientras esta pulsada la tecla
Wend
Call led(_on, _nc)  'Ilumina led_amarillo, no modifica led verde
n_random = random(6, 1)  'Funcion que genera numero aleatorio
Lcdcmdout LcdLine2Home  'Cursor del lcd al principio linea 2
Lcdout "El Numero: ", #n_random, "  "  'Imprime la plantilla y el resultado en el lcd
WaitMs 300  'Espera 0.3 segundos
Call led(_off, _nc)  'Apaga led_amarillo, no modifica led verde
Endif
Goto main  'Impide que termine la rutina principal
End                                               
'Calcula numeros aleatoriios, n_max = numero maximo y n_min = numero minimo
Const _on = 0  'Led encendido
Const _off = 1  'Led apagado
Const _nc = 2  'No cambia
Function random(n_max As Byte, n_min As Byte) As Byte
OPTION_REG.T0CS = 0  'Selecciona reloj interno
n_max = (n_max + 1) - n_min  'Arregla el numero maximo
random = (TMR0 Mod n_max) + n_min  'Siendo n_max el numero maximo y + n_min valor minimo
End Function                                     
'Controla el estado de los led, call (x,x)
Proc led(amarillo As Byte, verde As Byte)
If amarillo = 0 Then RA7 = 0  'Led amarillo a on
If amarillo = 1 Then RA7 = 1  'Led amarillo a off
If verde = 0 Then RB0 = 0  'Led verde a on
If verde = 1 Then RB0 = 1  'Led verde a off
End Proc
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 28 de Julio de 2007, 07:26:26
hola

lo primero, felicitaros por el trabajo que estáis realizando, que no es poco. es curioso porque desde siempre asocié el psi al amigo Ariel y llegué a creer que fuera el quien iniciara el tema. mis disculpas dogflu.

lo segundo, soy de los que -citando a maunix- lee, lee, lee y luego pregunta, así que antes de nada uno se lee los manuales y cualquier cosa que pueda y después que si encendemos un led, que si encendemos cuatro, y cuando nos atascamos y no entendemos porque, entonces se pregunta.

y así llegamos a la tercera parte, con un código de lo más tonto y asignando variables al tuntún me responde con errores de compilación en ciertas líneas cuyas variables observo que además ahora están en mayúsculas. Supongo que se trata de palabras reservadas pero no encuentro información en ningún lado que me lo confirme... os dejo un listado de las variables que dan errores por si podéis decirme algo al respecto. la versión que tengo es v6.65

Código: [Seleccionar]
'***********************************************
'Asignación de variables
'***********************************************
Dim a As Byte
Dim b As Byte
'Dim C As Byte --- Error: Incorrect variable name
'Dim D As Byte --- Error: Incorrect variable name
Dim e As Byte
'Dim F As Byte --- Error: Incorrect variable name
Dim g As Byte
Dim h As Byte
Dim i As Byte
Dim j As Byte
Dim k As Byte
Dim l As Byte
Dim m As Byte
Dim n As Byte
Dim o As Byte
'Dim P As Byte --- Error: Incorrect variable name
Dim q As Byte
'Dim R As Byte --- Error: Incorrect variable name
'Dim S As Byte --- Error: Incorrect variable name
Dim t As Byte
Dim u As Byte
Dim v As Byte
'Dim W As Byte --- Error: Incorrect variable name
Dim x As Byte
Dim y As Byte
'Dim Z As Byte --- Error: Incorrect variable name

'***********************************************
'Aparentan ser palabras reservadas pero no
'encuentro la documentación que me lo confirme
'***********************************************

un saludo y gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 28 de Julio de 2007, 08:08:09
Hola Xocas!

Es curioso lo de las variables. En general, salvo "i" para algun bucle, casi siempre uso nombres mas largos,tipo "cuenta", "suma", etc, por lo que no me habia pasado lo que mencionas.

Acabo de probar copiando y pegando tu trozo de codigo, y solo me da errores tipo "Incorrect Variable Name" en las siguientes cuatro: C, F, W,Z

En la ayuda ( http://www.oshonsoft.com/picbasiccompiler.html ) no se mencionan para nada, pero es cierto: al escribirlas, el editor automaticamente las pasa a mayusculas, asi que "algo hay". Lo extrano es que a mi me marca solo 4. Yo uso la version 6.65....¿cual tienes tu?

Por ultimo, probe hacer algo como

Symbol C = porta.1

y tambien dice que es un nombre de variable incorrecto. ¿Seran constantes? ¿O palabras reservadas?

Creo que constantes no son, por que al hacer

a = C

dice que "C no es una variable tipo xxx" para cualquier tipo de "a": bit, byte, word o Long.

Un misterio! :)

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 10:50:56
No se hace referencia en el manual, pero son todo registros reservados.
unos son registros, flag o tambien el nombre de un bit determinado de un registro.
Y todos tienen el mismo nombre que en el datasheet del pic en cuestion, por eso
segun el pic, si tiene estos registros o no el PSI nos dara error o no.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 10:54:51
PD. Quien maneja normalmente el assembler esta mas familiarizado con estos registros, flag... etc.
otro PD. no los he utilizado nunca y no tengo ni idea de como se usan.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 28 de Julio de 2007, 11:10:35
gracias dogflu, suponía que algo de eso era porque con la primera variable que me pasó fue con la S -que asocié al stack- y lo mismo con C de carry o Z de zero pero como probé con un par de pics y me sucedía lo mismo, al final ya no estaba seguro...

y también sucede Ariel que no suelo usar variables de este estilo porque al final se pierden en el código y no nos dicen nada... si te digo que usé una 's' para no escribir 'salida' .... :lol: :lol:  bueno, al menos sirvió para descubrir algo

un saludo

edito: vaya, este hace mi post 500, ya voy siendo mayor de edad
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 11:25:38
Me pico la curiosidad, asi que le voy a enviar el programa con los errores a ver si me envia documentacion sobre el tema.
y lo mismo no puedo compilarlas de ninguna forma asi que tienen que ser solo palabras reservadas...  :?
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 11:38:17
Aqui dejo un excelente estudio realizado con el Basic del PSI, lastima que no este en Castellano.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 11:40:25
La direccion (se me olvido ponerla antes  :lol:):

http://www.smilen.net/mex/SD_report_med9.pdf (http://www.smilen.net/mex/SD_report_med9.pdf)

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 22:58:43
Un nuevo ejemplo para trabajar con una E2Prom externa y Temperatura I2C en la EBasic.

La imagen de la plaquita:

(http://img247.imageshack.us/img247/1726/ebasici2caf6.jpg)

La placa tiene un Led, una E2Prom (24LC04B) y un DS1624

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Julio de 2007, 23:05:02
El programa de Test para el Led y la E2Prom es un contador
que nos muestra en pantalla tanto la direccion de escritura
como el dato a escribir, en el caso de error de lectura el led
de la plaquita queda iluminado durante 5Seg. al mismo tiempo
que se muestran los datos erroneos en pantalla.
En este caso el RB4 (led) nos funciona como flag de error del puerto I2C.

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBasic) **************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_24
'Descripción: TEST DE LA PLACA EBasic_I2C (Led y 24LC04B)
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 29/7/07, By COS, PSI v7.41
'Versión: 1.0
'Programa de Test para el Led y la E2Prom
'Muestra en pantalla tanto la dirección de escritura
'Como el dato a escribir. En el caso de error lo
'indica tanto luminosamente como en pantalla.
'*********************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd será de 4bit
Define LCD_DREG = PORTA  'Bus de datos será el puerto A
Define LCD_DBIT = 0  'Bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS será del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E será del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera después de inicializar el Display.
'*********************************************************************************
'------------------------------------Definición de puertos--------------------------------------------------
AllDigital  'los pin I/O digitales
'ANSEL = %00010000  'los pin I/O digitales y RA4 analógico
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como entradas
TRISB = 0xff  'puerto B como entradas
'TRISA.4 = 1  'como entrada (RA4, adc)
'TRISA.6 = 1  'como entrada (RA6, tecla S1)
'TRISA.5 = 1  'como entrada (RA5, tecla S2)
TRISB.3 = 0  'como salida RB3
TRISA.7 = 0  'como salida RA7
TRISB.0 = 0  'como salida RB0
TRISA.4 = 0  'como salida RA4
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off (RA7), negado
PORTB.0 = 1  'led verde a off (RB0), negado
PORTA.4 = 0  'led EB_I2C a off (RA4)
'------------------------------------Inicio-----------------------------------------------
'--------------------------------variables generales--------------------------------------
Dim addr As Byte  'dirección i2c
Dim data As Byte  'dato i2c
Dim n_random As Byte  'contendrá el numero deseado
'------------------------------------asignación de valores a las variables------------------
'--------------------------------------Reasignación de nombres--------------------------
Symbol sda = RB1  'asignamos nombre al pin que hará de SDA del puerto I2C
Symbol scl = RB4  'asignamos nombre al pin que hará de SCL del puerto I2C
Symbol led_amarillo = RA7  'led amarillo
Symbol led_verde = RB0  'led verde
Symbol luz_lcd = RB3  'iluminación del lcd
Symbol s1 = RA6  'tecla S1
Symbol s2 = RA5  'tecla S2
Const p_off = 0  'apaga el led
Const p_on = 1  'enciende el led
Const p_st = 2  'no cambia estado el led
Const w_on = 1  'se escribe y lee en la E2Prom
Const w_off = 0  'Solo se lee la E2Prom
'---------------------------------------------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
WaitMs 100  'pausa de 100 mSeg.
Lcdout "Test P. EB_I2C"  'Imprime el texto en el LCD
WaitMs 3000  'pausa de 3Seg.
Call led(p_off, p_off, p_off)  'led a off
n_random = random(0, 0)  'inicializa random (timer0)
'--------------------------------Rutina Programa---------------------------------------
main:
Lcdcmdout LcdClear  'borra lcd
For addr = 0 To 255  'addr tomara los valores desde 0 hasta 255,bucle
Lcdcmdout LcdLine1Home  'cursor línea 1 y principio
Lcdout "Escribiendo: ", #addr  'se escribe en el lcd
data = d_e2prom(addr, addr, 1)  'se llama a la función RW del I2C
Lcdcmdout LcdLine2Home  'cursor línea 2 y principio
Lcdout "leyendo: ", #data, " "  'se escribe en el lcd
WaitMs 100  'se espera 100mSeg.
If _error = 1 Then  'bit de error si esta a 1
Lcdcmdout LcdClear  'borra el lcd
Lcdout "Error: "  'imprime en el display
Lcdcmdout LcdLine2Home  'cursor al principio de la línea 2
Lcdout #addr, "  ", #data, "      "  'imprime en el display
WaitMs 5000  'se hace una pausa de 5Seg.
Endif  'cierra el if
Next addr  'cierra el bule for
End                                               
'------------------------------Rutinas-----------------------------------------------
'Escribe y lee en la E2Prom, dirección, dato, E2P_RW = 1 escribe y lee
Dim _error As Bit  'Flag indicador de error
Function d_e2prom(e2p_addr As Byte, e2p_data As Byte, e2p_rw As Byte) As Byte
RA4 = 1  'activa el led de la placa EB_E2Prom
_error = 1  'Marca error
If e2p_rw = 1 Then I2CWrite RB1, RB4, 0xa0, e2p_addr, e2p_data  'escribe en el I2C
WaitMs 5  'pausa para que el chip termine la escritura
I2CRead RB1, RB4, 0xa1, e2p_addr, d_e2prom  'lee en el puerto I2C
If d_e2prom = e2p_data Then
_error = 0  'Borra error
RA4 = 0  'Apaga el led placa EBasic_I2C
Endif
End Function                                     
'calcula números aleatorios, n_max = numero máximo y n_ini = numero mínimo
Function random(n_max As Byte, n_ini As Byte) As Byte
OPTION_REG.T0CS = 0  'selecciona reloj interno
n_max = (n_max + 1) - n_ini  'arregla el numero máximo
random = (TMR0 Mod n_max) + n_ini  'siendo n_max el numero máximo y +n_ini valor mínimo
End Function                                     
'controla el estado de los led, call (x,x)
Proc led(amarillo As Byte, verde As Byte, eb_i2c As Byte)
If amarillo = 1 Then RA7 = 0  'led amarillo a on
If amarillo = 0 Then RA7 = 1  'led amarillo a off
If verde = 1 Then RB0 = 0  'led verde a on
If verde = 0 Then RB0 = 1  'led verde a off
If eb_i2c = 1 Then RA4 = 1  'led EB_I2C a on
If eb_i2c = 0 Then RA4 = 0  'led EB_I2C a off
End Proc                                     
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Julio de 2007, 07:46:52
Ahora si la placa Real:

(http://img249.imageshack.us/img249/6482/picebasici2cty3.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Julio de 2007, 07:53:49
El esquema de la EBasic_I2C:

(http://img812.imageshack.us/img812/8728/mdyh.jpg) (http://imageshack.us/photo/my-images/812/mdyh.jpg/)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: allado en 01 de Agosto de 2007, 10:59:01
CONSULTA...........Hola... por favor necesito confirmar si esta placa soporta ISCP .. (programación en circuito)... y si no lo soporta si seria factible añadirlo.

Gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 01 de Agosto de 2007, 11:11:07
hola allado, bienvenido al foro

si soporta icsp, concretamente tiene un conector -sl3- para su programación en circuito

un saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Agosto de 2007, 18:46:15
El programa para el Test del DS1624 midiendo temperaturas positivas con dos decimales.

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_25
'Descripcion: TEST DE LA PLACA EBasic_I2C (Led y DS1624), Temperatura positiva)
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 29/7/07, 2/08/07, By COS, PSI v7.41
'Version: 1.1
'Se añade TEST para el DS1624 (temperatura)
'*****************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'------------------------------------Definicion de puertos-----------------------------------
AllDigital  'los pin I/O digitales
'ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como salidas
TRISB = 0xff  'puerto B como salidas
'TRISA.4 = 1  'como entrada (RA4, adc)
'TRISA.6 = 1  'como entrada (RA6, tecla S1)
'TRISA.5 = 1  'como entrada (RA5, tecla S2)
TRISB.3 = 0  'como salida RB3
TRISA.7 = 0  'como salida RA7
TRISB.0 = 0  'como salida RB0
TRISA.4 = 0  'como salida RA4
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off (RA7), negado
PORTB.0 = 1  'led verde a off (RB0), negado
PORTA.4 = 0  'led EBbasic_I2C a off (RA4)
'------------------------------------Inicio--------------------------------------------
'Reasignacion de nombres------------------------------
Symbol sda = RB1  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = RB4  'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = RA7  'led amarillo
Symbol led_verde = RB0  'led verde
Symbol luz_lcd = RB3  'iluminacion del lcd
Symbol s1 = RA6  'tecla S1
Symbol s2 = RA5  'tecla S2
'Variables generales---------------------------------------
Dim temperatura As Word  'temperatura entero .HB, decimales .LB
Dim temperatura_aux As Long  'calculo de los decimales
'--------------------------------------------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
WaitMs 100  'pausa de 100 mSeg.
Lcdout "Test P. EB_I2C"  'Imprime el texto en el LCD
WaitMs 3000  'pausa de 3Seg.
'--------------------------------Rutina Principal---------------------------------------
main:
temperatura = 0
temperatura_aux = 0
temperatura = d_ds1624(0, 0, 0)  'genera una lectura en el chip ds
WaitMs 1000  'pausa de 1Seg, tiempo maximo de conversion del chip ds
temperatura = d_ds1624(0, 0, 1)  'lee la lectura en dos bytes (13bit)
temperatura.LB = ShiftRight(temperatura.LB, 3)  'elimina bit que no se usan (decimales)
temperatura_aux = (temperatura.LB * 3125) / 1000  'calcula la parte decimal
temperatura.LB = temperatura_aux.LB  'Inserta los decimales
Lcdcmdout LcdLine2Home  'cursor al principio de la linea 2
Lcdout "Temp. +", #temperatura.HB, "."  'imprime en el lcd
If temperatura.LB < 10 Then Lcdout "0"  'mantiene el formato dos decimales
Lcdout #temperatura.LB, "     "  'imprime en el lcd
WaitMs 1000  '0  'hace una pausa de 10Seg.
Goto main
End                                               
'------------------------------ Subrutinas y Funciones ----------------------------------
'Funcion de lectura/escritura del DS1624
'ds1624_rw=0 el chip prepara un lectura, ds1624_rw=1 el chip entrega una lectura
'ds1624_rw=2 se hace una lectura del registro de control.
Function d_ds1624(ds1624_h As Byte, ds1624_l As Byte, ds1624_rw As Byte) As Word
'I2CPrepare sda, scl
RA4 = 1  'led placa I2c a On
If ds1624_rw = 0 Then  'solicita una lectura de temperatura
I2CWrite sda, scl, %10010010, 0xac, 0x00  'incializa el registro de control
WaitMs 10  'pausa para que termine la escritura
I2CWrite1 sda, scl, %10010010, 0xee  'comienza una conversion
Endif
If ds1624_rw = 1 Then  'hace la lectura de la temperatura
I2CWrite1 sda, scl, %10010010, 0xaa  'prepara el chip para lectura de temperatura
I2CRead1 sda, scl, %10010011, ds1624_h, ds1624_l  'lee la temperatura
Endif
If ds1624_rw = 2 Then  'hace una lectura del registro de control
I2CRead sda, scl, %10010011, 0xac, ds1624_l  'lee registro de control
ds1624_h = 0  'borra byte alto de antiguos valores
Endif
d_ds1624.HB = ds1624_h  'actualiza la temperatura
d_ds1624.LB = ds1624_l  'actualiza decimales temperatura o indica datos registro control
RA4 = 0  'led placa i2c a Off
End Function



PD. 22/01/09, Inserte esta línea en el código "temperatura.LB = temperatura_aux.LB  'Inserta los decimales".
Sin la línea no interviene el acondicionado y calculo de los decimales. Por algún motivo desconocido la omití al pegar el programa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Agosto de 2007, 18:50:21
PD. y el que quiera terminar (http://img170.imageshack.us/img170/7985/locokd7.gif), le recomiendo
que se lea el Datasheet del DS1624, con solo ver el data se le quitan a uno las ganas de hacer algo con este chip.

otro PD. he sudado tinta china para poderlo poner en marcha.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 03 de Agosto de 2007, 02:10:25
Pues tengo uno por aquí al que cualquier día le meto mano. Menos mal que la tinta ya la has sudado tú  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 04 de Agosto de 2007, 16:20:24
hola

bueno, voy poco a poco metiéndole en mano al psi y he decidido hacerlo desde lo más básico y procurando no dejarme nada atrás, pero no contaba con encontrarme tan pronto con cosas que no entiendo. en el ejemplo de conversión analógico-digital de los primeros post ( http://www.todopic.com.ar/foros/index.php?topic=14917.msg95256#msg95256 ) me encuentro con esto:

Código: [Seleccionar]
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicion de las salidas---------------------
ANSEL = %00000000  'los pin I/O digitales
Define ADC_SAMPLEUS = 0  'el minimo, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
'ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
'ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
'ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1

bien, revisando el data veo que tal configuración de ADCON0, ADCON1 y ANSEL consiguen lo que necesito para la lectura. así mismo ADCIN se asigna más adelante a RA4 y con OSCCON determinamos el uso de oscilador interno a 8Mhz.

lo que no entiendo es que las líneas de configuración de ANSEL y ADCON son meros comentarios... entonces... ¿de dónde toma la asignación? ¿de ADC_CLOCK y ADCIN? ¿cómo?

el manual dice que ADC_CLOCK puede tomar valores de 0..3 o 0..7 según el pic. en la página 118 del datasheet debe estar la solución pero no consigo verla y ese valor ADC_CLOCK = 5 me tiene completamente desorientado.

¿hace referencia en el datasheet al valor de 205 para num_2 o lo sabes por experiencia?

un saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Agosto de 2007, 21:31:38
Bueno, lo primero es decir que nunca fue mi intencion la de realizar programas
del estilo declarar un variable o encender (prender) un led, por lo que
son mas que simples ejercicios son verdaderos programas de cierto nivel
avanzado. Por todo esto me alegro de tu pregunta ya que el programa hizo
que tuvieras que referenciarte en el datasheet del micro para poder entenderlo
ya que esa fue mi intencion y tambien te digo que ahora no me acuerdo de
la extrapolacion entre el data y la tabla de configuracion del manual del PSI.
pero te lo miro en brevedad y asi refresco mi memoria y afianzo mis bases.
Asi que gracias por la pregunta... pana.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mario en 05 de Agosto de 2007, 03:01:25

Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC

el manual dice que ADC_CLOCK puede tomar valores de 0..3 o 0..7 según el pic. en la página 118 del datasheet debe estar la solución pero no consigo verla y ese valor ADC_CLOCK = 5 me tiene completamente desorientado.

REGISTER 12-2: ADCON0: A/D CONTROL REGISTER (ADDRESS 1Fh) PIC16F88 DEVICES ONLY

R/W-0    R/W-0   R/W-0  R/W-0  R/W-0    R/W-0      U-0  R/W-0
ADCS1  ADCS0   CHS2   CHS1   CHS0   GO/DONE    —   ADON
bit 7                                                                             bit 0

bit 7-6 ADCS<1:0>: A/D Conversion Clock Select bits
           If ADCS2 = 0:
               00 = FOSC/2
               01 = FOSC/8
               10 = FOSC/32
               11 = FRC (clock derived from the internal A/D module RC oscillator)
              
            If ADCS2 = 1:
               00 = FOSC/4
               01 = FOSC/16
               10 = FOSC/64
               11 = FRC (clock derived from the internal A/D module RC oscillator)


Sobre esa pregunta puedes ver en el registro que si ADCS2 = 1  quiere decir que estas escogiendo dividir entre dos el reloj cuando escoges alguna otra opción que no es el RC interno; escoges la opción 01 = FOSC/16, entonces:

 ADCON1.6     ADCON0.7    ADCON0.6
   ADCS2          ADCS1         ADCS0
      1                  0                    1               -------------------->   5


Sobre lo del 205..... es no lo he visto aún, dame tiempo.


Lo del reloj ya lo había experimentado pero en PBP "ADC_CLOCK = 3". Siempre 3, ¿por qué? porque siempre agarran el tiempo del RC interno, la última combinación [11 = FRC (clock derived from the internal A/D module RC oscillator)]


Edición:
Tratando de saber el por qué de ese num2=205, después de ver el código original me surgen dudas:

1.- Se declara num1 como palabra, supongo para tener los 10 bits del AD, ¿o para realizar las divisiones?
2.- Se comenta  'ADCON1=01000000 el cual indicaría una justificación a la izquierda y por ende la utilizacion de los diez bits en forma inverza, como para utilizar solo 8 bits, los del ADRESH y descartar los del ADRESL(izquierda el de menor peso y derecha el de mayor). Habría que ver cuál registro toma, o si toma los dos y los guarda en num1.
3.- Si utiliza solo 8 bits para el cálculo, quizá eso influya en que num2=205.


Tengo la cabeza algo confusa, vengo llegando de manejar de con mi novia (45 minutos) y son las 11:12 PM xD



Edición#2:

Acaba de venirme algo a la mente pero no se cómo explicarlo asi que lo pondré tal y como vino:

1024/5 = 204.8

¿Tendrá algo que ver?

¿Corrección del menor?

No se pero creo que va por ahí


Edición#3:
Ahora estoy peor, siempre que busco la relación voltaje/bit realizo lo siguiente  5v/10bits = 5v/1024 = 4.88 mV/incremento.

Perdido perdido perdido....



Edición#4:
Dogflu, ¿qué programa utiliza para los PCBs?
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Agosto de 2007, 08:11:37
Es el Eagle (Igel) Mario, y jeje cuando me recupere de la fiesta de ayer refresco la memoria sobre el modulo ADC, jeje...  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 05 de Agosto de 2007, 10:30:16
hola y muchísimas gracias. todo aclarado en lo que respecta a la conversión ad del programa.

he programado -algo- en pbp y difiere a la hora de hacer las cosas. un ejemplo sencillo de algo que en su día realicé es esto:

Código: [Seleccionar]
DEFINE OSCCAL_1K 1
define OSC 4

@ DEVICE pic12F675, 0x1fc4 ' palabra de configuración: oscilador interno IO. PWRT y BOREN enables

DEFINE ADC_BITS 8       ' numero de bits
DEFINE ADC_SAMPLEUS 50  ' tiempo de muestreo en microsegundos

TRISIO = %001101    ' GP0 y GP2 son entradas; GP1 y GP4 son salidas
CMCON = %00000111   ' deshabilita comparadores
ADCON0 = %10000001  ' GP0 es la entrada del conversor A/D
ANSEL = %00110001   ' oscilador interno(FRC). GP0 analógica,
                    ' las demás son digitales
...
...
ADCIN 0, variable

la solución tal como creía estaba en la tabla 12-1 (página 118): 16 TOSC - 1 - 01 - 10Mhz que establece los valores de bit en los registros ADCON0 y ADCON1 y ese valor 5 del ADC_CLOCK lo tenía delante mio en esa tabla: 1-01

decía en un post anterior amigo dogflu que soy de los que leen, leen, leen y luego preguntan (citando a maunix una vez más) y me gusta aprender y para ello tengo que entender lo que está pasando... copiar un listado de un programa no me lleva a lado ninguno si no entiendo lo que hace..  :shock:

muchas gracias de nuevo a ambos y un saludo

pd: nos queda el valor de 205 para num_2 pero antes recupérate de la juerga  8) 8)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 05 de Agosto de 2007, 11:11:57
Mario el bit ADFM del registro ADCON1 está a 0 lo cual nos indica que trabajaremos con 10 bits y justificado a la izquierda. ahora bien, tal como dice dogflu:

num_2 = 205 ' asigna factor de corrección para 5v

entonces 10 bits = 1024 y 1024/205 = 4,995 ¿estoy en lo correcto?

un saludo

EDITO: o, tal como tu apuntabas, 1024/5 = 204,8
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Agosto de 2007, 12:51:50
Como veo que todo esta aclarado tan solo dejo mi traduccion de lo que Vladimir
nos expone en el manual del PSI, la que al no ser muy extensa nos oblica a buscar
en el datasheet del micro en particular para poder obtener un mayor rendimiento del
modulo, pero si nos deja lo suficiente como para poder trabajar con el ADCIN por primera vez.

Usando el modulo interno A/D.
La declaracion ADCIN esta disponible como un apoyo para el uso del modulo interno, convertidor A/D.
Su primer argumento es:
Es el numero de canal ADC o la entrada desde donde convertir y el segundo argumento es un variable que se usará para
almacenar el resultado de la conversión. La declaracion ADCIN usa dos parámetros para su mejor configuracion
segun la necesidad de nuestro programa ADC_CLOCK y ADC_SAMPLEUS que toman valores por defecto  3 y 20.
Estos valores pueden ser cambiados, para nuestro beneficio,  usando la directiva DEFINE. ADC_CLOCK determina
la elección de la fuente de reloj del ADC (la gama permitida va desde 0-3 o 0-7 dependiendo del dispositivo usado,
son los tiempos de conversion y estos los da el ADC y un multiplo de la velocidad del cristal usado ya que puede darse
la paradoja que a menor velocidad de reloj puede que nos coincida un valor mas aproximado a la velocidad mas rapida
de conversion del modulo interno ADC).
El parametro ADC_SAMPLEUS indica el tiempo deseado  de adquisición en microsegundos (0-255).
La declaracion ADCIN presupone que el pin correspondiente se configura como entrada analógica
(los registros afectados por ADCIN son TRIS, ADCON1 y en algunos micros tambien el registro ANSEL).

y despues viene un ejemplo escueto pero que es suficiente para poder usar el ADCIN.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Agosto de 2007, 13:10:02
num_2 como tal indicais se puede obtener de varias formas
lo importante es saber que es una constante que nos permite
simplificar los calculo, y se obtiene de los valores 1024 (10bit)
y 5V como tension de referencia. y una vez obtenido el numero
se incrementa o decrementa en algunas unidades a tanteo para
corregir la desviación del 7805 que no suele entregar casi nunca
los 5V, esto tambien se puede corregir midiendo el voltaje de
alimentacion del micro con el voltimetro. y de esta forma cambiando
el voltaje de 5V por el real en la ecuación.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 05 de Agosto de 2007, 13:16:20
gracias dogflu, estaba completamente atascado al principio y lo tenía tal como sospechaba ante mis ojos.

ahora trato de aprender algo sobre lo que no tengo la menor experiencia que es la comunicación i2c y la comunicación spi. he visto que en el datasheet hay bastantes cosas al respecto pero ¿conocerás por acaso algún documento o web del tipo spi (o i2c) para torpes?.

comenzaré buscando en el foro antes de nada

un saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Agosto de 2007, 13:20:36
PD. tambien nos permite incluir los decimales como parte entera en todos los
calculos y asi mejoramos la precision.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Agosto de 2007, 13:36:33
Pues no tengo nada sobre I2C, pero puedes leer el data
de la memoria del ejemplo, en el obtendras muchas respuestas
y el del DS1624 dejalo para lo ultimo..jeje
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mario en 05 de Agosto de 2007, 23:43:00
¿conocerás por acaso algún documento o web del tipo spi (o i2c) para torpes?.


http://www.robot-electronics.co.uk/htm/using_the_i2c_bus.htm

No es para torpes pero tiene lo escencial.


Mario el bit ADFM del registro ADCON1 está a 0 lo cual nos indica que trabajaremos con 10 bits y justificado a la izquierda.


Ya lo había señalado. La pregunta era sobre cómo trabajará, explico:
Si en PBP le dices ADC_BITS = 8, el compilador toma el valor del ADRESH y justifica a la izquierda para tomar los 8 bits de mayor peso y descartar los 2 de menor que son ADRESL<7,6>.

En ese sentido va la pregunta, pareciera que utilizaría los 8 bits del ADRESH pero habrá que ver si alguien cof**dogflu**cof  pudiera decirnos cuáles registros se utilizan al aplicar esa instrucción en este programa.

Estoy viendo el ambiente de programación y pinta bien (IDE) y no está tan caro, a diferencia del PBP y sus 250 dólares, bueno, sus 15 dólares de actualización (espero que salga la 2.48 y tenga algo nuevo  :?).

Estoy viendo si consigo el nuevo de CCS (aunque no se C) pero es de 575 dólares, y al parecer no es muy estable. Quizá me decida por el SWORDFISH (150 dólares).

Dogflu, muy buen tema... muy didáctico.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 06 de Agosto de 2007, 07:02:28
gracias Mario por el link.

te comento como yo lo veo y a modo de pensamiento en voz alta (que no basado en la experiencia...)

el resultado de ADCIN es un valor de 10 bits, que se almacena en los registros ADRESH:ADRESL. el valor de ADFM determina si este resultado estará justificado a la izquierda o a la derecha y en cualquier caso 'despreciará' los 6 bits más/menos significativos.

en el ejemplo del programa, ADCIN le asigna el valor obtenido a la variable num_1 que es una variable del tipo Word y por tanto (entiendo yo) está haciendo uso de los 10 bits de la lectura. si quisiera quedarme solamente con los 8 bits más significativos despreciando los demás crearía una variable del tipo Byte que tomase el valor de la parte alta de num_1 :

Dim num_1 As Word
Dim mivar As Byte
mivar = num_1.HB

yo estoy con el paso del pbp al psi y por ahora estoy contento con el cambio. si hecho algo en verdad de menos es que en pbp ya tengo el winpic800 y gtp-usb+ configurados para realizar en un solo click la programación del pic vía icsp, ver el resultado y volver al programa...

un saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Agosto de 2007, 19:27:40
Bueno, estuve repasando la configuración del modulo ADC según el uso que hace la función ADCIN.
Y este comandito es cabezón, según el simulador solo nos deja trabajar en 10bit, reconfigura los registros
cada vez que entra en acción, por ejemplo el ADCON1.ADFM lo ignora por mas que lo cambiemos a mano.

Aquí dejo un programita para que juguéis con los registros y podáis comprobar vosotros mismos.
Si va muy lento podéis suprimir los literales de la información que sale por el puerto serie.
y si tenéis alguna duda para configurar el simulador para ver los datos serial... pues no tenéis mas que preguntar.

Mientras sigo con la experimentación pero ya descargando el programa en la EBasic a ver que pasa.

PD: [28/10/08] Verificado que en la ultima  versión del compilador, si la variable de salida de datos de ADCIN es un Byte en vez de Word, ADCIN se configura de forma automática a 8Bit. No verificado en versiones anteriores.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Agosto de 2007, 19:35:27
El programita:

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)***************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_26
'MICRO: PIC16f88
'FECHA/AUTOR: 08/07 - By COS, PSI v7.41
'Version: 1.0
'Estudio del modulo ADC y relacion con ADCIN
'Envia al puerto serie por emulación un registro predeterminado de 8bit en formato binario.
'**********************************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'***********************************************************************************************************
'_____Asignacion de I/O y valores de inicio de las salidas
ANSEL = %00000000  'Los pin I/O digitales
Define ADC_SAMPLEUS = 10  'El minimo posible, configuracion del ADC
Define ADC_CLOCK = 5  '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion ADC
'_____Registros afectados por Define ADC_CLOCK y ADCIN________________________
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'Voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'________________________________________________________________________
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'_____Main Programa
Dim adc_4 As Word  'Contendra el valor de la entrada del ADC
main:
While RA6 = 0  'Pausa, mientras este pulsada la tecla S1
Wend
ADCON1 = %11000000
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo guarda en adc_4
Serout PORTB.5, 2400, "adc_4 ", #adc_4, " adc_4.HB ", #adc_4.HB, " adc_4.LB ", #adc_4.LB, CrLf  'escribe la lectura del ADC
Serout RB.5, 2400, "ADCON0 "
Call lcd_bit(ADCON0)
Serout RB.5, 2400, " ADCON1 "
Call lcd_bit(ADCON1)
Serout RB.5, 2400, " ANSEL "
Call lcd_bit(ANSEL)
Serout RB.5, 2400, CrLf
'Añadir los registro que querais....
WaitMs 500
Goto main
End                                               
'Envia por el puerto serie el valor de "registro" en formato binario
Proc lcd_bit(registro As Byte)
Dim n As Byte
Dim var As Byte
var = 0
For n = 7 To 0 Step -1  'Numero de bit de la variable
var.0 = registro.n
Serout RB5, 2400, #var  'Envia el bit al puerto serie
Next n
End Proc   
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Agosto de 2007, 19:45:24
Los registro afectados y bit principales ya los indique en el programa al que os referís.
Lo que ocurre es que como no se comento en su día ya no me acordaba...  :mrgreen:
y claro si me dan a elegir entre 8 o 10bit me quedo con los 10...  :mrgreen:

'_____Registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1

De todas formas seria fácil crearnos una función en la que pudiéramos elegir la resolución del ADC.
Incluso si os apetece podeis crearla vosotros mismos y luego la comentamos...   :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Agosto de 2007, 19:58:07
Bien, la EBasic hace lo mismo que el simulador.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Agosto de 2007, 20:07:15
en el ejemplo del programa, ADCIN le asigna el valor obtenido a la variable num_1 que es una variable del tipo Word y por tanto (entiendo yo) está haciendo uso de los 10 bits de la lectura. si quisiera quedarme solamente con los 8 bits más significativos despreciando los demás crearía una variable del tipo Byte que tomase el valor de la parte alta de num_1 :

Dim num_1 As Word
Dim mivar As Byte
mivar = num_1.HB

Todo correcto, pero el corrimiento en la variable antes de asignarla, ya que como son 10bit, estos son los 2 menos significativos del num_1.HB
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: chapka58 en 08 de Agosto de 2007, 09:00:27
Estimados, en primer lugar me presento, Gustavo, desde Argentina. Segundo, los felicito por tanto conocimiento y dedicación desinteresada. Tercero... soy novato en esto y trato de aprender usando lo que aca presentan; por lo tanto ya me encuentro con algunos inconvenientes.
Quizas sean muy tontos pero para mi al amomento son escollos importantes. Bueno, basta de charla.
Me dedici probar el ejemplo de la pagina2, "'Uso del LCD con bus de datos a 4Bit y sin pin de RW", y ni bien lo cargo el el PIC Simulator IDE... cuando lo compilo me aparecen errores en las líneas...
1- Define simulation_waitms_value = 1  ....
2- ansel = 0x00  'los pin I/O digitales (no analogicos)
3- osccon = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
 en la 1-, no se que puede ser, en la 2- y 3- vi que no se habían definido mas arriba, lo hice como Word (no se si es correcto, pero anduvo).

esta bien esto así o que pasa?

Gracias... no será la última vez que pregunte!!.. :lol:

Saludos...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 08 de Agosto de 2007, 11:38:58
Hola amigo!

Bienvenido al foro/hilo.

El problema 1) puede deberse a que usas una version "vieja" del PSI....puede ser?

El 2 puede ser por que en 0x00 todos sean ceros....

Y el 3, idem al dos.

Saludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: navaismo en 08 de Agosto de 2007, 11:47:22
O tambien algo mas, quizas estes usando un PIC diferente al del ejemplo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Agosto de 2007, 12:15:02
Hola y Bienvenido

He copiado el programa desde el foro con el conocido copy/paste en el editor
Basic del PSI y no da ningún error al compilar.

Asi que:
Define SIMULATION_WAITMS_VALUE = 1, es relativamente nuevo puede
dar error en versiones un poco mas antiguas.

y con respecto a lo de mas es posible que no hallas seleccionado el pic correcto
en el PSI ya que doy como buena la copia que hiciste del foro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Agosto de 2007, 18:38:37
Un ejemplo basico para experimentar con el modulo ADC con salida de datos a 8bit.

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_27
'MICRO: PIC16f88A
'FECHA/AUTOR: 08/07 - By COS, PSI v7.41
'Version: 1.0
'Estudio del modulo ADC
'Usando el modulo ADC directamente.
'*********************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Suprime los tiempos de espera Waitms, solo para el simulador
'*********************************************************************************************
'_____Asignacion de I/O y valores de inicio de las salidas, configracion adc
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.5uSeg), channel RA4, Power on ADC (ADON)
ADCON1 = %01000000  'V. Ref. (AVdd/AVss) y seleccion escala division clock/2 (ADCS2) y 8Bit ADC (ADFM)
'---------------------------------------
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
WaitMs 25
'_____Variables
Dim adc_4 As Word  'Contendra el valor de la entrada del ADC
main:
ADCON0.GO = 1  'A/D conversion en progreso
While ADCON0.GO = 1  'Pausa hasta terminar la conversion
Wend
adc_4.HB = ADRESH  'Asignacion de valores, tiene la conversion a 8Bit
adc_4.LB = ADRESL  'Asignacion de valores
'Adc_4 y adc_4.LB no tendran valores utilies, solo el byte alto de adc_4
Serout PORTB.5, 2400, "adc_4 ", #adc_4, " adc_4.HB ", #adc_4.HB, " adc_4.LB ", #adc_4.LB, CrLf  'Escribe la lectura del ADC
Goto main
End 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Agosto de 2007, 18:55:51
Observaciones:

ADCIN En contra:
  Es una función un poco lenta.
  Poco flexible.
  No permite 8Bit.

ADCIN A favor:
  No tiene complicaciones.
  Funciona siempre.
  Salida con formato a 10 y 8Bits
  También nos economiza la energía del pic.

Y para el uso del modulo ADC de forma directa por nosotros, tenemos que tener en cuenta
que al darle Power On con el bit ADON del registro ADCON0, este tarda un pequeño tiempo
en estabilizarse para poder estar operativo, así que hay que respetar este tiempo.

PD: [28/10/08] Verificado que en la ultima  versión del compilador, si la variable de salida de datos de ADCIN es un Byte en vez de Word, ADCIN se configura de forma automática a 8Bit. No verificado en versiones anteriores.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Agosto de 2007, 20:04:48
Aclaracion:

'_____Registros afectados por Define ADC_CLOCK y ADCIN________________
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.5uSeg), channel RA4
ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1


Estos registros son los afectados pero no todos son modificados '_____Registros afectados por Define ADC_CLOCK y ADCIN________________
ya sabeis mano al editor del assembler, ADC_CLOCK Y ADCIN modifican registros como es la resolucion,
el inicio de conversion, el canal de entrada, power on del modulo y que al terminar (ADON) lo deja como
estaba, el ADFM lo modifica y lo deja a 1.

Registros modificados directamente:
ADCON0 (CANALES, GO/DONE, ADON, CHS, ADCS), ADCON1 (ADFM, ADCS2)

Aqui la resolucion esta a 8Bit -> ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
pero al terminar ADCIN, queda cambiado a 10BIT -> ADCON1 = %11000000

Por ejemplo los voltajes de referencia no son afectados por lo que podremos programarlos a gusto y como el registro ANSEL NO se ve
modificado lo tenemos que programar a mano las entradas analogicas a usar asi como AN3 y AN2 en este mismo registro en el caso de
usarlas como entradas de tension de referencia.

Espero que con esto quede completo el estudio del ADC relativo al ADCIN... y para cualquier duda, aclaracion o correccion... por aqui estare.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 08 de Agosto de 2007, 20:32:41
amigo dogflu, has ido mucho más allá de lo que esperaba y te lo agradezco enormemente

no me suelo atascar con los registros pero en esta ocasión el adc_clock me desorientó por completo. y eso que el datasheet siempre está a mano y no sería la primera vez que los copio a una hoja en blanco y comienzo a pintar 0's y 1's.

en este último ejemplo las líneas han dejado de ser comentarios y así es como acostumbraba a hacerlo en pbp y así es como mi cerebro lo asimila a la primera.

voy a aprovechar que todavía lo tengo todo en protoboard para experimentar un poco con un par de sensores de temperatura que tengo por aquí. estoy actualmente trabajando con tres semi-entrenadores diferentes que fueron creados en un principio para trabajar con un basic stamp, después se adaptaron para pics de 18 pines, luego para poder programar vía icsp... ahora lo adapto de nuevo para probar tus ejemplos... uf!! será mejor construir el que tu has creado jeje

tengo que resolver un par de temas que tengo en el tintero y me pongo de nuevo a la tarea.

vayan mis gracias de nuevo, dogflu
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: chapka58 en 09 de Agosto de 2007, 00:07:47
JA... efectivamente tenía una versión anterior... ahora ya estoy actualizado y todo bien!.
Gracias... vamos a ver como sigue.

Saludos   :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: chapka58 en 09 de Agosto de 2007, 00:11:40
JA... efectivamente tenía una versión anterior... ahora ya estoy actualizado y todo bien!.
Gracias... vamos a ver como sigue.

Saludos   :)

Ahh... me olvidé... una gran torpeza... efectivamente tenia el micro equivocado también... pequeñas grandes lecciones aprendidas... seré menos arrebatado e íre lentamente.
Gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mario en 09 de Agosto de 2007, 04:01:03
Aclaracion:
Aqui la resolucion esta a 8Bit -> ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
pero al terminar ADCIN, queda cambiado a 10BIT -> ADCON1 = %11000000

Eso es lo que quería saber.

Raro que no te deje trabajar con 8 bits, PBP si te permite. A eso me refería cuando en PBP colocas ADC_BITS=8, solo toma el ADRESH justificado a la izquierda (para tener los 8 bits de mayor peso).


Espero que con esto quede completo el estudio del ADC relativo al ADCIN...
Claro que si, completísimo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Agosto de 2007, 16:33:58
Aclaracion:
Aqui la resolucion esta a 8Bit -> ADCON1 = %01000000  'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
pero al terminar ADCIN, queda cambiado a 10BIT -> ADCON1 = %11000000

Eso es lo que quería saber.

Raro que no te deje trabajar con 8 bits, PBP si te permite. A eso me refería cuando en PBP colocas ADC_BITS=8, solo toma el ADRESH justificado a la izquierda (para tener los 8 bits de mayor peso).
e si, completísimo.

En realidad hay una forma de justificar los 10Bit de la función y para poder hacer esto hay que remontarse
a la historia de este entorno, en un principio estaba pensado para la educación, por lo que tenia
estructuras muy simples del tipo IF/THEN/ENDIF, FOR/TO/NEXT y algunas mas básicas típicas del Basic y realmente
funciones complejas no tenia prácticamente ninguna, la del DISPLAY 2x16char, ADCIN y algunas pocas mas.
Por lo que había mayormente que programar todos los registros de los módulos del PIC a mano.
El lenguaje no tenia fallos gracias a su simplicidad, imaginas excusándote frente a un alumno por la perdida de tiempo
en un bug del entorno?... o editando una lista con todos los bug del sistema... y en fin yo no lo veo lógico para algo
que pagaste... y volviendo al tema lo importante era que funcionara sin fallos y que pudieras programar los módulos
del PIC sin problemas y directamente como se hace en el assembler. Con el tiempo igual que en el assembler cada uno
se genera sus propias rutinas de control para insertar en los programas. Rutinas que si no funcionan no le puedes echar
la culpa a un tercero. Y volviendo al principio de nuestro tema este compilador de basic fue completado muy lentamente
con funciones mas complejas de las que carecía. Pero amigo, la ADCIN es una función muy antigua, y simplemente
nadie le dijo que le añadiera los 8bit seleccionables... :mrgreen: y para entender un poco mas el por que diré que el autor
de este entorno tiene una relación especial con nosotros sus usuarios registrados, es un entorno que tiene muchos ojo
vigilándolo de una forma que yo definiria casi paternal... :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 09 de Agosto de 2007, 16:42:39
Citar
y para entender un poco mas el por que diré que el autor
de este entorno tiene una relación especial con nosotros sus usuarios registrados, es un entorno que tiene muchos ojo
vigilándolo de una forma que yo definiria casi paternal....

Muy cierto. El trato con el autor es muy cordial, nada que ver con lo que puede ser el trato con una gran empresa.

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Agosto de 2007, 19:51:55
Enlace actualizado para descargar la PIC EBasic:

http://rapidshare.com/files/48017705/PicEBasic_131_Esquema_y_PCB.pdf.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Agosto de 2007, 11:18:55
Aqui se puede ver mi nueva y flamante entrenadora Pic EBasic Ver. 1.3.1 (a la izquierda de la imagen) junto a mi antigua
y modificada compañera de fatigas 1.0... con las que amenazo con una nueva tanda
de ejemplos en los que hará falta dos placas...  :mrgreen:


http://img524.imageshack.us/img524/7569/picebasic131nx6.jpg
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno en 11 de Agosto de 2007, 12:13:33
Jeje, esto se está poniendo interesante, eh...

Y ese integrado llenos de hilos de wrapping de colores  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Agosto de 2007, 17:00:28
jeje, no es mas que un zocalo adaptador para micros de 18pin a mi
placa "CHIQUITINA", basada en un 16F877.

Tambien la dejo para el que quiera ojearla... :mrgreen:

http://img249.imageshack.us/img249/8224/placachiquitina11adap14jg1.jpg
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Agosto de 2007, 11:21:58
Dejo la una nueva version de la Pic EBasic, la Ver. 1.4
que tan solo añade la union de RB3 (Pin 9 del PIc) con el 11 del max232, previamente
quitandole la conexion a masa de este pin 11.

http://rapidshare.com/files/48536419/PicEBasic_Esquemas_Montaje_14.pdf.html

Con esta pequeña modificacion ya puede trabajar la EBasic con RS485...  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Agosto de 2007, 16:59:35
Trabajando con el RS485:

Esquema adaptador RS485 para la EBasic

(http://img406.imageshack.us/img406/2351/picebasicrs485ty9.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Agosto de 2007, 17:12:01
Imagen de la placa adaptadora intalada en la Pic_EBasic:

(http://img162.imageshack.us/img162/1782/picebasicrs485vistagn6.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Agosto de 2007, 17:44:44
Un poco de funcionamiento:

La comunicación es Half-Duplex multipunto diferencial sobre dos hilos preferentemente de par entrelazado (trenzado y ninguna de las dos líneas es masa).
Permite transmitir datos a grandes distancias, hasta 1200mtrs de 300 a 19200 bps.
Y se pueden utilizar hasta 32 driver en esta configuración, puestos en paralelo con la línea RS485.

De todo esto deducimos que podremos tener comunicación bi-direccional a tiempos separados, cuando un equipo transmite (TX) todos los de mas reciben (RX) y en esta configuración todos los equipos podrán ser RX o TX, esta claro que si colocamos mas de dos en la línea esta la llamaremos bus y tendremos que crear un protocolo que ponga orden en las transmisiones de los datos, y sobretodo para evitar las colisiones, no puede haber nunca mas de un driver configurado como TX al mismo tiempo.

La línea necesita una resistencia que llamaremos de carga o fin de línea, como en este caso usaremos muy pocos driver y una distancia muy corta solo usaremos una la cual incorporaremos en paralelo con los dos hilos mediante el puente del esquema anterior.
En el caso que nos atañe he utilizado un valor de la R relativamente alto 120 oh.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Agosto de 2007, 17:55:59
Y para terminar esta parte:

Para colocar nuestro driver en modo Tx utilizamos el RB3 puesto en estado alto y por logica de Perogrullo cuando es puesto a cero estamos en modo Rx.
Y por lo de mas que respecta, seguimos utilizando las lineas de Tx y Rx del modulo Uart.



PD. Recordar que RB3 tambien nos controla la iluminacion del display.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Agosto de 2007, 18:41:06
Y como estamos deseosos de probar nuestra plaquita adaptadora RS485 y solo tenemos una, lo primero que haremos es asegurarnos que nuestro PC no tenga la masa común con nuestra Pic_Ebasic, ya que usaremos este como instrumento para probar el correcto funcionamiento de nuestro flamante driver 485. Si la masa del instrumento de comprobación (en este caso el pc) es común a la Ebasic le haremos cortocircuito al bus y no nos funcionara (no tiene porque romperse nada).
Lo siguiente que haremos es ponerle nombre a los hilos que componen nuestra línea de datos serie, el nombre inicial es “A” y “B”, pero como esos nombres no me dicen nada los voy a rebautizar...

El pin B lo llamaremos “Datos Negativos” -> -Datos
El pin A lo llamaremos “Datos Positivos” -> +Datos

Bien dejamos esto un momento y pasamos a configurar el hyperterminal del windows como sigue.

Configuración del hyperterminal:

Bits por segundo: 4800, Bits de datos: 8, Paridad: Ninguno, Bits de parada: 1, Control de flujo: Ninguno.

Y terminado esto volcamos en la Ebasic el programa del RTC, pero no antes de compilar la siguiente modificación “timer2_100ms_tiempo = 10  '255  'temporiza 25.5 Seg.”, esto lo único que hace es refrescar la hora por la uart cada seg.
De todas formas dejo el código adjunto en el siguiente enlace:

http://rapidshare.com/files/52123289/16F88_Pic_EBasic_LCD_RTC_ADC_121.bas.html


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Agosto de 2007, 18:52:42
Bien, llegados hasta aquí y como todos sabemos que el RS485 es compatible con el RS232 invirtiendo los hilos, pues tan solo conectar el +Datos al pin 5 o gnd del puerto serie del ordenador y el –Datos a la línea Rx (pin 2) del puerto serie del pc, y de forma instantánea si todo esta correcto veremos la hora, fecha y temperatura en la pantalla de nuestro querido hyperterminal.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 30 de Agosto de 2007, 13:17:25
Felicitaciones dogflu66!!

Te a quedado muy bien y la explicación esta muy completa!

Yo al final hace tiempo que estoy dando vuelta para armar un entrenador, había dicho que iba a armar este, y al final nunca arme nada, a ver cuando me hago un poco de tiempo y me lo armo jejeje

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: allado en 16 de Octubre de 2007, 20:05:50
Hola Dogflu66

Queria agradecerte por estos super tutoriales para PCI, me ha servido de gran ayuda,...  muchas gracias  :-/ :-/ :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Octubre de 2007, 16:59:33
Felicitaciones dogflu66!!

Te a quedado muy bien y la explicación esta muy completa!

Yo al final hace tiempo que estoy dando vuelta para armar un entrenador, había dicho que iba a armar este, y al final nunca arme nada, a ver cuando me hago un poco de tiempo y me lo armo jejeje

Saludos


Ultimamente tambien estoy con falta de tiempo, a ver si termino un par de cositas y vuelvo por aqui... :mrgreen:

Hola Dogflu66

Queria agradecerte por estos super tutoriales para PCI, me ha servido de gran ayuda,...  muchas gracias  :-/ :-/ :-/

Para eso esta allado, reconozco que hasta yo uso el hilo como consulta rapida y para hacer copy paste de rutinas... :oops:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mario en 08 de Noviembre de 2007, 04:03:10
En el caso que nos atañe he utilizado un valor de la R relativamente alto 120 oh.

¿En realidad necesita la resistencia de terminación?

Tengo entendido que para el 485, la resistencia de terminación se coloca en los extremos de los datos + y - si tendremos una longitud considerable y a una taza de transferencia alta.


Muy bueno el trabajo por cierto  :o
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Noviembre de 2007, 11:12:11
Hola Mario, en el data del 485 indica que hay que colocarla, tambien es cierto que
he visto algun circuito que internamente usan 485 para comunicacion entre placas
y no lautilizan, estamos hablando de 20 0 30 cm.


PD. Si te fijas en la plaquita o en el esquema, se puede observar que hay un puente que permite
activar o desactivar la R.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Noviembre de 2007, 11:35:56
En el ultimo cursillo el claval que hacia de profe, cuando se referia al RS232 indicaba que la distancia era hasta 15 mtrs porque trabajaba por tension.
Y cuando hacia referencia al RS485, hacia hincapie que permitia mas de 1km porque trabajaba por lazo de corriente (los que trabajan o han estudiado
el lazo de corriente saben que esto es asi) y todo lazo de corriente suele terminar en una R de fin de linea.

Aparte de todo esto yo soy partidario de colocarla... :mrgreen:




PD. Para no llevar a equivocos, como se indica al principio de iniciar el tema del 485, este no trabaja por lazo de corriente.
Esta citacion solo se debe de tomar como anecdota, el error fue mio por no dejarlo claro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jansuini en 08 de Noviembre de 2007, 18:53:58
Hola:
Un par de correcciónes :el 485 no trabaja por lazo de corriente sino por tensión diferencial ,lo que hace que sea más inmune al ruido .-
La otra aclaración es que la resistencia terminadora realmente es para adaptar las impedancias de los cables ,pero en distancia cortas no es necesario (inclusohe conectado muchos equiposen dstancias largas como 100 mts. y no han tenido problemas.-
Saludos
Jorge
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Noviembre de 2007, 20:49:24
Un poco de funcionamiento:

La comunicación es Half-Duplex multipunto diferencial sobre dos hilos preferentemente de par entrelazado (trenzado y ninguna de las dos líneas es masa).
Permite transmitir datos a grandes distancias, hasta 1200mtrs de 300 a 19200 bps.
Y se pueden utilizar hasta 32 driver en esta configuración, puestos en paralelo con la línea RS485.

De todo esto deducimos que podremos tener comunicación bi-direccional a tiempos separados, cuando un equipo transmite (TX) todos los de mas reciben (RX) y en esta configuración todos los equipos podrán ser RX o TX, esta claro que si colocamos mas de dos en la línea esta la llamaremos bus y tendremos que crear un protocolo que ponga orden en las transmisiones de los datos, y sobretodo para evitar las colisiones, no puede haber nunca mas de un driver configurado como TX al mismo tiempo.

La línea necesita una resistencia que llamaremos de carga o fin de línea, como en este caso usaremos muy pocos driver y una distancia muy corta solo usaremos una la cual incorporaremos en paralelo con los dos hilos mediante el puente del esquema anterior.
En el caso que nos atañe he utilizado un valor de la R relativamente alto 120 oh.


Gracias Jorge por la aclaración, como puedes ver en la autocita digo como realmente trabaja.

Y la referencia que hice al cursillo solo fue como mera anécdota, es la forma que tenia este
hombre de explicar con mayor o menor acierto el por que el 485 puede desarrollar tanta distancia.
por eso hice hincapié en que los lazos de corriente permiten distancias grandes.

De todas formas solo me he encontrado en muy cortas distancia la ausencia de la resistencia y por
lo tanto mi siguiente pregunta es: con esas distancias tan grandes  (hasta 100mtrs como indicas) en
entornos industriales sin la R, ¿puede haber una mayor sensibilidad a las interferencias?.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mario en 09 de Noviembre de 2007, 20:19:13
De todas formas solo me he encontrado en muy cortas distancia la ausencia de la resistencia y por
lo tanto mi siguiente pregunta es: con esas distancias tan grandes  (hasta 100mtrs como indicas) en
entornos industriales sin la R, ¿puede haber una mayor sensibilidad a las interferencias?.


Depende en gran medida de la tasa de transferencia de datos.
Si no recuerdo mal, a mayor frecuencia, mayor atenuación y más propenso a ser afectado por las interferencias.

Por ahí tengo información, solo que no estoy en casa; cuando llegue, busco la información y le comento.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jansuini en 10 de Noviembre de 2007, 09:33:55
Hola:

Realmente la resistencia se coloca en distancias grandes por un tema de acoplamiento de impedancias de los cables y el valor típico es 120 ó 150 ohms .Por el costo de ellas no está de mas poner una en cada extremo del cable .-
Cuidado con el cableado, ya que 485 no sugiere que se hagan derivaciones en Y . Recuerden :si ponen varios equipos en la linea de comunicaciones  solo va una R en cada extremo.-
Saludos
Jorge
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Noviembre de 2007, 20:28:48
Código: [Seleccionar]
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8

'NOMBRE:16F88_PicEBasic_LCD
'MICRO: PIC16F88/8Mhz reloj interno
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'************************************************************************************************
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'------------------------------------------------------------------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
'------------------------------------Definicion de puertos------------------------------------------
ANSEL = 0x00 'los pin I/O digitales (no analogicos)
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07 'comparador a off
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Lcdinit 'inicializa el lcd sin cursor
WaitMs 500  'pausa para estabilizar
main: 'comienza el programa principal
   Lcdcmdout LcdClear 'borra el display
   WaitMs 1000 'hace una pausa de 1Seg.
   Lcdout "A" 'escribe el caracter "A" en el display
   WaitMs 1000 'hace una pausa de 1Seg.
Goto main 'impide que termine el programa principal
End 'es conveniente ponerlo siempre segun el manual

Ahi dejo el programita para simular el LCD, a mi me funciona correctamente
a la hora de activar el modulo LCD del simulador indicarle que coja la configuracion
de pin segun le indicamos en el programa.
Lo proximo seria simular el LCD y la entrada analogica a ver si da alguna incompatibilidad.

PD. Los tiempos estan trucados para no tener que esperar tanto en el Simulador, los tiempos
reales son los que estan indicados entre parentesis.

PD. Corregido ya que este ejemplo se realizo antes de tener la Placa EBasic construida, asi que lo modifique para que funcione sobre ella.

PD. 22/07/07, solo correccion en la descripcion de los pin del LCD.

PD. 15/11/07, añado la configuracion de bit (fuses) del micro y la velocidad del clock en el programa, las 3 primeras lineas.


Este fue el primer ejercicio del hilo, tengo que decir que funciona correctamente tanto en el simulador
como en la Placa EBasic.
El error común en este ejemplo esta en olvidarse que hay que configurar los fuses.
Hay que definirlos a mano en el entorno (PSI). Lo hice así para obligar a tener que familiarizarse con
la configuración de bit, que obliga a comportarse al micro y algunos de sus módulos de una forma
determinada durante el arranque.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Noviembre de 2007, 20:58:25
La configuración de este registro también esta al principio del hilo
pero la dejo aquí también.

Imagen: Configuracion_Pic_Simulator_Ide_Old.jpg

Todos los programas tienen la misma configuración, excepto los que usan el Watchdog.

Este registro es muy importante, porque con el se hacen una serie de configuraciones
al microcontrolador, como son la protección de los datos de la flash contra lectura, también
de la Eeprom, si se va a usar el Watchdog, el modo de trabajo del oscilador, retardo al arranque
durante la puesta en marcha, monitor de alimentación, etc.
la configuración en este  entorno es muy fácil ya que muestra todas los bit de configuración
en una ventana y de esta forma por solo intuición se programan la mayoría, el resto hay que
investigar en el datasheet del micro en cuestión.

Algunas combinaciones de estos bit hacen que el programa funcione bien en los simuladores y por
otro lado no funcione en la realidad, o viceversa.

Una vez terminada la configuracion de los bit, tan solo hay que cliclar en "Generate Basic Code" y
esta configuracion se añade de forma automatica en las dos primeras lineas de nuestro
editor del codigo fuente. Ya solo resta añadir una tercera indicando la velocidad a la que trabajara
nuestro micro "Define Clock_Frequency = 8".

Actualización del hilo para nuevas versiones del PSI: 06/2016
Esta configuracion se carga de forma automatica en nuestro entorno de trabajo cada vez que compilamos
el programa. Y si cargamos directamente el archivo .hex en el simulador la configuracion de bit
se actualiza cada vez que seguimos trabajando en nuestro programa (en versiones muy antiguas es conveniente revisar estor parámetros antes de comenzar a trabajar).

Si se va a usar el simulador integrado es conveniente incorporar la siguiente línea en nuestro código:
Define SIMULATION_WAITMS_VALUE = 1  'Activar solo para simulación
La línea indica al compilador que trunque todos los comandos WaitMs para que la simulación sea más rápida (recordar que actualmente no se puede simular un Pic con un ordenador de casa en tiempo real, se necesitan maquinas muy potentes).
WaitMs = Pause = Delay: equivalencia para otros lenguajes y realiza una pausa, normalmente no es utilizado por los desarrolladores profesionales porque para
el natural flujo del programa.

Todo esto se resume en las siguientes líneas que hay que incorporar en la cabecera de nuestro código en las actuales versiones del Editor del Pic Simulator (PSI):
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación

Estas dos líneas equivalen a la siguiente imagen:
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)

Imagen: Configuración Bits (Pic16F88).jpg

Además en las nuevas versiones se necesita realizar la siguiente configuración desde el editor del compilador:

Imagen: Configura Editor del Compilador (Pic16F88).jpg


PD. Especialmente dedicado a mi paisano Javier.

Nota: Actualizado 06/2016
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jvbf82 en 15 de Noviembre de 2007, 18:06:45
Hola Carlos sin duda agradezco enormemente tus aclaraciones sobre el tema. He montado la Placa Ebasic con el 16f88 y tenia ciertos problemas a la hora de hacerlo funcionar, he añadido estas tres lineas a mi programa y aparte he corregido varios errores derivados de trucar los tiempos a la hora de simular .:D Ahora si funciona todo perfectamente. Un saludo y gracias  :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Diciembre de 2007, 18:29:53
Comence el Indice del hilo http://www.todopic.com.ar/foros/index.php?topic=14917.msg92082#msg92082
Cualquier ayuda o sugerencia/correccion sera bienvenida.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Diciembre de 2007, 20:46:19
Ya le di un empujoncito al Índice del hilo.... A ver si lo puedo terminar antes de que llegue el año nuevo.
Cuando termine de hacer mención a los ejemplos principales del foro, iré ordenándolo, simplificando y
comentando de una forma más adecuada... :mrgreen:

No recordaba que el hilo fuera tan extenso... :8}
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: navaismo en 10 de Diciembre de 2007, 21:02:52
Ya le di un empujoncito al Índice del hilo.... A ver si lo puedo terminar antes de que llegue el año nuevo.
Cuando termine de hacer mención a los ejemplos principales del foro, iré ordenándolo, simplificando y
comentando de una forma más adecuada... :mrgreen:

No recordaba que el hilo fuera tan extenso... :8}


Si de hecho podria ser considerado el tema como una buena biblia del PSI, sumandole la excelente entrenadora.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2007, 17:40:41
Gracias Max, se agradece el comentario... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2007, 18:46:58
Con el estiron de hoy ya recorri el 50% del hilo, ya falta menos... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: allado en 12 de Diciembre de 2007, 23:30:04
Hola Dog..

Muy Bueno el Indice... comentario aparte y ... no se si corresponde el comentario en este foro, si no es asi pido disculpas, en estos días estube haciendo varias pruebas con algunos programitas ... las hice con el "PSI" y las modifique para "mikrobasic"... y realmente me quede muy sorprendido.... y a la ves fuertemente desepcionado. La compilacion que arroja el PSI es mucho menor que el tamaño que da el mismo programa con mickrobasic, en una prueba que hice con lcd´s el tamaño final del programa hecho en PSI resultó un 30% menor que su contraparte en mikrobasic. Si bien mikrobasic tiene un basic mas sofisticado que PSI, creo que se cae estrepitosamente en rendimiento para micros de la gama media..... Entonces Aguante nuestro amado "PSI"  :-/ :-/ :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 13 de Diciembre de 2007, 07:43:05
Hola allado!

Esa diferencia puede estar en las librerias "extra" que tiene Mikrobasic. Cuando usas alguna de estas funciones, mete un monton de codigo que quizas no uses por completo. Pero lo mismo le pasa a PSI. Por ejemplo, si vas a leer un sensor de temperatura DS1820 (1-wire), es mas "economico" desde el punto de vista del espacio ocupado hacerlo tu mismo que emplear las funciones propias del lenguaje.

Como siempre, se trata de encontrar un equilibrio entre tamaño/tiempo: si tienes memoria suficiente, quizas no importe que el codigo sea un 30% mas grande si puedes realizar tu programa en la mitad de tiempo. :)

Saludos!

PD: Aguante PSI! :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2007, 18:05:58
Hola Alejandro y Ariel

Hace ya algun tiempo que estuve analizando el Mikrobasic y los programas realmente ocupan mas memoria
con el.
Con el PSI igual que con otros lenguajes, se pueden conseguir muy buenos resultados empleando funciones y
trabajando con micros de menos de 1k.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2007, 18:36:19
Por fin termine la primera aproximacion de lo que sera el indice.
Falta todavia depurarlo y tambien añadir algunos ejemplos de los amigos
que hay que ubicar ya que algunos estan fuera de tema.
Pienso que lo mas importante esta hecho, ya es mucho mas facil
hacer consultas en el hilo sobre temas determinados... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ESTECA55 en 16 de Diciembre de 2007, 19:31:25
Excelente trabajo dogflu66!!!

A quedado muy bueno, y sobre todo Cómodo!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Diciembre de 2007, 00:12:54
Bien, estuve haciendo unas pequeñas modificaciones en los comentarios de algunos programas
ya que me di cuenta al confeccionar el indice que en la descripción de algunos programas
en la parte del display, se usa el puerto B del Pic, pero en la descripción hace mención al puerto A.

Esto es un error que creía corregido en todo los ejemplos y que fue debido a que al principio del hilo
hice algún ejemplo de simulación sin tener totalmente definida la distribución de los pin de la
EBasic, ya que decidí cambiar esta distribución de pin que afectaron directamente al display y de esta
forma obtener mayor rendimiento del micro. La configuración de los pin del Pic en la EBasic fueron
distribuidos de una forma especial para poder sacar un mejor partido a la placa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Diciembre de 2007, 08:14:58
Excelente trabajo dogflu66!!!

A quedado muy bueno, y sobre todo Cómodo!


Gracias, a ver si podemos echar un dia de estos un rato de tecleo. :P :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Diciembre de 2007, 20:50:22
No quiero despedir el año sin antes haber escrito alguna cosita en el hilo así
que dejo un nuevo ejemplo que completa al anterior para poder trabajar con
la memoria  24C04 y todas aquellas otras cuya estructura interna sea compatible
con esta aunque su capacidad sea distinta.

Función para el control de una E2Prom 24C04 y compatibles:

La función devuelve un numero tipo Word, en el que el Byte menos significativo
es el dato leído y el Byte mas significativo indica si hubo error en la escritura, error=1.
Esta nueva función lee o escribe en todos los bloques de la memoria I2C.
La memora no tiene un único bloque en el que esta ubicada sino que esta dividida
en dos bloques y cada uno de ellos tiene una longitud de 256 posiciones de 1 Byte
cada una. Cada bloque tiene como primera dirección la “0” terminado en la “255”.
La función los maneja como si de un único bloque de 512 Bytes se tratara.
Multiplicando la longitud de 1 bloque por el numero de bloques es igual a la capacidad
máxima de la memoria, contemplada como si de su estructura interna estuviera
compuesta de uno único, (256x2)=512 Bytes de capacidad y 511 es la dirección
máxima ya que la primera dirección comienza en la 0.

Básicamente la función envía a la memoria:

1º Un Byte y los BIT indican a la memoria lo siguiente:
 
   Bit del 15...12, selecciona el dispositivo en el bus I2C

   Bit 11...09, selecciona la pagina o bloque de la memoria

   Bit 8, selecciona si la operación será de lectura o escritura.
   El BIT 8 lo gestiona directamente la función del lenguaje por
   lo que no es necesario su control.

2º Seguido de un Byte que contiene la dirección dentro del bloque a escribir o leer.

3º Y por ultimo el dato a escribir en la memoria o en el caso de una lectura
   una variable donde guardar el dato de 8bit.

Es importante tener en cuenta que la escritura en la memoria es una operación que
requiere un tiempo determinado y por lo tanto hay que esperar que la memoria
escriba el dato indicado por la función, este tiempo de espera viene indicado en su datasheet.

PD. Les deseo que tengan un Feliz y prospero año nuevo.
      BYE, hasta el año que viene.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Diciembre de 2007, 20:50:45
El codigo:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_28
'Descripción: TEST DE LA PLACA EBasic_I2C (Led y 24LC04B)
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 30/12/07, 29/7/07, By COS, PSI v7.41
'Versión: 1.1
'Se completa la función para que lea o escriba en todos los bloques de la memoria I2C
'Esta memoria solo tiene dos bloques y cada uno de ellos tiene 256 posiciones de 1 byte
'La funcion los maneja como si de un único bloque de 512 bytes se tratara.
'Multiplicando la longuitud de 1 bloque por el numero de bloques es igual
'a la capasidad maxima de la memoria, contemplada como si de su estructura interna
'estuviera compuesta de un unico bloque (256x2)=512 y direccion maxima 511 bytes
'ya que la direccion primera comienza en 0.
'Version: 1.0
'Solo escribe o lee en el bloque "0" de la memoria
'*****************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'*********************************************************************************
'------------------------------------Definicion de puertos------------------------------------------
AllDigital  'los pin I/O digitales
'ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff  'Puerto A como entradas
TRISB = 0xff  'puerto B como entradas
'TRISA.4 = 1  'como entrada (RA4, adc)
'TRISA.6 = 1  'como entrada (RA6, tecla S1)
'TRISA.5 = 1  'como entrada (RA5, tecla S2)
TRISB.3 = 0  'como salida RB3
TRISA.7 = 0  'como salida RA7
TRISB.0 = 0  'como salida RB0
TRISA.4 = 0  'como salida RA4
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off (RA7), negado
PORTB.0 = 1  'led verde a off (RB0), negado
PORTA.4 = 0  'led EBbasic_I2C a off (RA4)
'------------------------------------Inicio--------------------------------------------
'------------------------------Reasignacion de nombres----------------------
Symbol sda = RB1  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = RB4  'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = RA7  'led amarillo
Symbol led_verde = RB0  'led verde
Symbol luz_lcd = RB3  'iluminacion del lcd
Symbol s1 = RA6  'tecla S1
Symbol s2 = RA5  'tecla S2
'--------------------------------variables generales-----------------------------------------------
Dim addr As Word  'direccion I2C
Dim dato As Byte  'valor a escribir en el I2C
Dim data As Word  'lectura dato I2C, data.HB = 1 = error de escritura, data.LB = dato i2c
'------------------------------------asignacion de valores a las variables--------------------------
dato = 0  'inicializa dato
'--------------------------------------------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
WaitMs 100  'pausa de 0.1Seg.
Lcdout "Test P. EB_I2C"  'Imprime el texto en el LCD
Lcdcmdout LcdLine2Home
Lcdout "Version 1.1"
WaitMs 5000  'pausa de 5Seg.
'--------------------------------Rutina Programa---------------------------------------
main:
Lcdcmdout LcdClear  'borra lcd
For addr = 0 To 511  'addr tomara los valores desde 0 hasta 511, bucle
Lcdcmdout LcdLine1Home  'cursor linea 1 y principio
Lcdout "Wr: ad.", #addr, " d.", #dato, "    "  '#addr  'se escribe en el lcd
data = d_e2prom(addr, dato, 0)  'llama a la funcion R/W del I2C en modo escritura
Lcdcmdout LcdLine2Home  'cursor linea 2 y principio
Lcdout "Read: ", #data.LB, "  "  'se escribe en el lcd
WaitMs 100  'se espera 100mSeg.
If data.HB = 1 Then  'bit de error si esta a 1
Lcdcmdout LcdClear  'borra el lcd
Lcdout "Error: "  'imprime en el display
Lcdcmdout LcdLine2Home  'cursor al principio de la linea 2
Lcdout "Wr: ", #dato, " Rd:", #data.LB, "      "  'imprime en el display
WaitMs 500  'se hace una pausa de 500mSeg.
Endif  'cierra el if
dato = dato + 1  'incrementa dato, se tiene en cuenta que cuando desborda comienza en 0.
Next addr  'cierra el bucle for
End                                               
'------------------------------Subrutinas y funciones ----------------------------------------
'Funcion para el manejo de la E2Prom y Led indicador R/W
'La funcion devuelve un numero tipo Word, en el que el byte menos significativo es
'el dato leido y el byte mas significativo indica si hubo error en la escritura, error=1
'e2p_addr.15...12, selecciona el dispositivo en el bus I2C
'e2p_addr.11...09, selecciona la pagina o bloque de la memoria
'e2p_addr.8, selecciona si la operacion sera de lectura o escritura
'e2p_addr.LB, selecciona la posicion a escribir dentro del bloque de momoria seleccionado
'e2p_data, dato a escribir en la posicion indicada por e2p_addr
'e2p_rw, indica a la funcion si la operacion sera de lectura (=1) o escritura (=0)
Function d_e2prom(e2p_addr As Word, e2p_data As Byte, e2p_rw As Byte) As Word
'0xa0 (1010b) direccion de la memoria I2C, todos los pin de configuracion a cero
e2p_addr.15 = 1  'direccion o nombre del dispositivo en el bus I2C, bit mas significativo
e2p_addr.14 = 0  '...
e2p_addr.13 = 1  '...
e2p_addr.12 = 0  '..., bit menos significativo
e2p_addr.11 = e2p_addr.10  'selecciona la pagina de la memoria I2C, bit mas significativo
e2p_addr.10 = e2p_addr.9  '...
e2p_addr.9 = e2p_addr.8  '..., bit menos significativo
e2p_addr.8 = 0  'modo escritura, indiferente ya que lo controla directamente I2CWrite
RA4 = 1  'activa el led de la placa EBasic_I2C, actividad
If e2p_rw = 0 Then  'permite el modo escritura
I2CWrite RB1, RB4, e2p_addr.HB, e2p_addr.LB, e2p_data  'escribe en el I2C
d_e2prom.HB = 1  'registra posible error si no se borra posteriormente
WaitMs 5  'pausa para que el chip termine la escritura, tiempo indicado en el datasheet
Endif
e2p_addr.8 = 1  'modo lectura, indiferente ya que lo controla directamente I2CRead
I2CRead RB1, RB4, e2p_addr.HB, e2p_addr.LB, d_e2prom.LB  'lee en el puerto I2C
If d_e2prom.LB = e2p_data And e2p_rw = 0 Then  'solo se ejecuta si hubo ciclo de escritura
d_e2prom.HB = 0  'borra el flag de error
Endif
RA4 = 0  'apaga led placa EB_I2C, actividad
End Function                                     

PD:

Donde decia "55. TRISA = 0xff  'Puerto A como salidas"
Ahora dice "55. TRISA = 0xff  'Puerto A como entradas"

Donde decia "56. TRISB = 0xff  'Puerto B como salidas"
Ahora dice "56. TRISB = 0xff  'Puerto B como entradas"
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Febrero de 2008, 12:06:33
El amigo Pedro Pan amplio el tutorial de Aitopes sobre el PSI.
Lo dejo aquí hasta que le encuentre una ubicación definitiva.

http://rapidshare.com/files/91608213/Manual_Pic_Simulator.pdf.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Febrero de 2008, 12:16:35
jeje, se me olvidaba el tutorial de Aitopes esta siendo publicado
en la revista sobre electronica uControl, que es de distribución gratuita.

http://www.ucontrol.com.ar/wiki/index.php?title=Revista_Numero_0001
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: facundo_10 en 27 de Marzo de 2008, 22:49:26
Hola veo que sabes mucho sobre SPI, me gustaria saber si me podrian ayudar, lo que quiero hacer es escribir un dato en una memoria RAM, y luego esa dato mostrarlo en un LCD para empezar, ademas si alguien posee documentos para interpretar sonido con el ADC..

La memoria que quiero grabar y leer es una HM62256A ...

Si alguien me puede ayudar !1
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 31 de Marzo de 2008, 04:50:45
Tengo la linea de telefono estropeada en casa, a ver cuando me la reparan¡¡¡.
La musica con micro es algo que no he visto, pero se puede intentar
hacer una configuracion basica para que puedas desarrollar el tema.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: facundo_10 en 31 de Marzo de 2008, 19:41:40
Si mira dogflu66 aca hize una rutina para leer y escribir en la ram y luego ese valor lo mando a la eeprom interna del pic para luego leerlo con un programador tipo winpic 800..


Citar
'****************************************************************
'**                    RUTINAS PARA LEER                       **
'**                           UNA                              **
'**                       MEMORIA RAM                          **
'**                   HM 62256 o Compatible                    **
'****************************************************************
'PIC 16f877
'xtal = 20mhz
'--------------
'RA0 LED ESCRITURA
'RA1 - LED LECTURA
'RA2 - LED ESCRITURA EEPROM
'RA3 - LED ENCENDIDO CIRCUITO
'RA4 - LED STAND-BY
'- -- -- -- -- -- --
'- -- -- -- -- -- --
'RB0-7 -> i/o0-7 hm62256alp-10
'RC0-7 -> a0-7
'RD0-6 -> a8-14
'RE0 -> #cs
'RE1 -> #we
'RE2 - > #oe
'-------------------------------------------------------------
AllDigital  'Todo digital
'Pongo los puertos B, C, y D en salida
TRISB = 0
TRISC = 0
TRISD = 0
'Asigno las Variables
Dim direccion_h As Byte
Dim direccion_l As Byte
Dim dato_ram As Byte
Dim respuesta_ram As Byte
Dim b0 As Byte
'Rutina Principal
main:
High PORTA.3
Gosub escritura  'voy a turina de escritura
Gosub lectura  'voy a rutina de lectura
Gosub escritura_pic  'escribo en la eeprom interna del pic
Low PORTA.3
Goto led_standby
End                                               
'Rutina de escritura
escritura:
High PORTA.0  'enciendo led para ver que se empieza la rutina
direccion_h = 0  'asigno posicion
direccion_l = 5  'asigno posicon
dato_ram = 24  'asigno el dato que voy a grabar
High PORTE.2  'TIMMING
Low PORTE.0  'TIMMING
Low PORTE.1  'Preparado para grabar
PORTC = direccion_l  'pongo al puerto C en la posicion L
PORTD = direccion_h  'Pongo al puerto D en la posicion H
PORTB = dato_ram  'dato a grabar
High PORTE.0  'Cierro el TIMMIMG
High PORTE.1  'Cierro el timming
Low PORTE.2  'Cierro el timming
Low PORTA.0  'Apago el LED para ver que termino de escribir la RAM.
Return                                           
'Rutina para leer la posicion que yo desee en la ram
lectura:
High PORTA.1  'enciendo led que indica lectura
direccion_h = 0  'direccion que voy a leer
direccion_l = 5  'direccion l que voy a leer
PORTC = direccion_l  'PASO LA DIRECCION A PUERTO C
PORTD = direccion_h  'PASO LA DIRECCION A PUERTO D
High PORTE.1  'RUTINA PARA LEER (ABRE TIMMING)
Low PORTE.0  'abro el timming para leer
Low PORTE.2  'timming
TRISB = 1  'PONGO EL BUS DE DATOS EN ENTRADA PORQUE LA RAM ME VA A ENVIAR EL DATO
PORTB = respuesta_ram  'lo que la ram me entrega por el puerto B lo grabo en la variable respuesta ram
TRISB = 0  'Pongo en salida el puerto b
High PORTE.1  'Cierro el timming el WE lo dejo alto para que no halla una escritura inesperada
High PORTE.0  'cierro timming
High PORTE.2  'cierro timming
Low PORTA.1  'apago led que indica lectura
Return                                           
'RUTINA PARA ESCRIBIR EL DATO OBTENIDO EN LA MEMORIA EEPROM DEL PIC
'PARA LUEGO SER LEIDO CON WINPIC 800 Y UTRO PROGRAMADOR
'Listo ya tengo almacenado el dato de la ram en la variable RESPUESTA_RAM
escritura_pic:
High PORTA.2  'Enciendo led de escritura de eeprom
b0 = 0
Write b0, respuesta_ram  'escribo el dato obtenido de la ram en la posicion 0 de la eeprom interna del pic
WaitMs 100  'le doy una pausa de 100 ms
Low PORTA.2  'Apago led de lectura
Return                                           
led_standby:
High PORTA.4
WaitMs 100
Low PORTA.4
WaitMs 100
Goto led_standby
End                                               

La memoria es la 62256 de 32kbytes, proximamente quisiera poder mostrar los datos a traves de la interfaz serial y Hyperterminal...

Todavia no lo probe, si alguien encuentra un error.. Bienvenido sea!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Abril de 2008, 18:48:46
Parece que la secuencia esta correcta, pero esto es mejor probar.... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Abril de 2008, 19:19:37
Hoy toca dejar un ejemplo sobre el modulo CCP1 del PIC16F88 trabajando en modo comparador,
para ser más exactos en el modo especial. En este modo el modulo CCP1 acapara el Timer1, el timer
uno lo programo como ya hice en los anteriores ejemplos, este timer1, el modulo CCP solo lo utiliza
como contador por lo que las interrupciones del timer1 no las activaremos, será el CCP el que nos
genera la interrupción cuando el valor del registro de 16bit del timer1 sea igual al programado en el
registro de 16bit del modulo, al mismo tiempo al estar configurado el modulo CCP en modo especial
obligara al ADC a realizar una lectura siempre y cuando este ultimo este habilitado. El ADC esta
configurado igual que anteriores ejemplos y particularmente, para que muestre la lectura en formato de 8bit de resolución.

Lo interesante de todo esto es que el modulo se configura una sola vez y ya todo lo de mas es automático,
de esta forma se consigue una mayor precisión en las rutinas, en este caso en las bases de tiempos que he creado.

Dejo el programa comentado y un pequeño video donde se ve de una forma clara para que se pueden usar las bases
de tiempos (por lo menos eso creo... jeje).

Estos son los bit de configuración del modo de trabajo del modulo CCP1:

CCP1CON.CCP1M3 = 1  'Compare mode, trigger special event (CCP1M3...0).
CCP1CON.CCP1M2 = 0
CCP1CON.CCP1M1 = 1
CCP1CON.CCP1M0 = 1

PD. No utilizo funciones en este ejemplo... solo los modulos de forma directa... bueeeeno, exectuando la funcion del lcd,
pero no es un modulo interno del PIC que conste... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Abril de 2008, 19:28:22
El programa:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_LCD_CCP1_Timer1_ADC_01
'MICRO: PIC16F88/8Mhz reloj interno
'Fecha/Autor: 3/08, By COS, PSI v7.41
'Version: 1.0
'Uso del modulo CCP1 configurado en especial mode.
'Se crean bases de tiempos usando el modulo CCP1 configurado en modo comparador
'y generando el mismo modulo una lectura del ADC cada 1mSeg.
'*********************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'------------------------------------Definicion de puertos y modulos--------------------------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
ADCON0 = %01100000  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000  '8Bit, voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'ADCON1.ADFM = 1  'ADC con 10Bit de resolucion.
ADCON0.ADON = 1  'Modulo ADC a ON
'_______________________________________________________________________________
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'--------------Inicializacion de Interrupciones y configuracion del CCP1 en modo comparador----------
T1CON.TMR1CS = 0  'Asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor del preescaler del timer1, 0
T1CON.T1CKPS1 = 0  'Factor del preescaler del timer1, 0
T1CON.TMR1ON = 1  'Habilitación del TMR1, comienza a incrementarse
CCPR1H = 0x07  'Registro mas significativo del comparador CCP1, 1mSeg.
CCPR1L = 0xd0  'Registro menos significativo del comparador CCP1, 1mSeg.
CCP1CON.CCP1M3 = 1  'Compare mode, trigger special event (CCP1M3...0).
CCP1CON.CCP1M2 = 0
CCP1CON.CCP1M1 = 1
CCP1CON.CCP1M0 = 1
PIE1.CCP1IE = 1  'Habilita las interrupciones del modulo ccp1
INTCON.PEIE = 1  'Bit de habilitacion de interrupciones de perifericos
'Reasignacion de nombres--------------------------------
Symbol led_amarillo = PORTA.7  'Led amarillo
Symbol led_verde = PORTB.0  'Led verde
Symbol luz_lcd = PORTB.3  'Iluminacion del lcd
'Declaracion de variables---------------------------------
'Variables de los timer -----------------------------------
Dim timer_base As Byte  'Tiempo referencia para los timer_100ms por soft del programa
Dim timer_base_tiempo As Byte  'Contiene el valor del tiempo del timer_base
Dim timer1_ms As Byte  'Base de tiempos en ms
Dim timer1_10ms As Byte  'Base de tiempos msx10
Dim timer2_10ms As Byte  'Base de tiempos msx10
Dim timer3_10ms As Byte  'Base de tiempos en msx10
Dim timer4_10ms As Byte  'Base de tiempos en msx10
Dim timer1_ms_tiempo As Byte  'Contiene el valor del tiempo del timer1_ms
Dim timer1_10ms_tiempo As Byte  'Contiene el valor del tiempo del timer1_10ms
Dim timer2_10ms_tiempo As Byte  'Contiene el valor del tiempo del timer2_10ms
Dim timer3_10ms_tiempo As Byte  'Contiene el valor del tiempo del timer3_10ms
Dim timer4_10ms_tiempo As Byte  'Contiene el valor del tiempo del timer4_10ms
'Variables generales------------------------------------
Dim adc_4 As Byte  'Contendra el valor de la entrada ADC trabajando a 8bit
Dim flag As Bit  'Controla parpadeo display
Dim flag_1 As Bit  'Controla parpadeo display
'Asignacion de valores a las variables------------------
timer_base = 0
timer1_ms = 0
timer1_10ms = 0
timer2_10ms = 0
timer3_10ms = 0
timer4_10ms = 0
timer_base_tiempo = 10  'Divide entre 10, solo afecta a los timerX_10ms.
timer1_ms_tiempo = 100  'Temporiza 100mSeg.
timer1_10ms_tiempo = 100  'Temporiza 1 Seg.
timer2_10ms_tiempo = 200  'Temporiza 2Seg
timer3_10ms_tiempo = 60  'Temporiza 0.6Seg
timer4_10ms_tiempo = 200  'Temporiza 2Seg
adc_4 = 0
flag = 1
flag_1 = 1
'-------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
WaitMs 1000  'Espera 1Seg, las interrupciones alargan este tiempo
Lcdout "COMPARE MODE"  'Escribe en el lcd
Lcdcmdout LcdLine2Home  'Seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con CCP1"  'Escribe en el lcd
WaitMs 3000  'Espera 3Seg, las iterrupciones hacen este tiempo mas largo
Lcdcmdout LcdLine1Clear  'Borra el display,linea 1
Enable  'INTCON.GIE habilita todas las interrupciones globales
'------------------------------------rutinas del Programa----------------------------------------
main:  'comienza el programa principal
If timer1_10ms >= timer1_10ms_tiempo Then  'cambio de estado el pin RA7 cada timer1_100ms_tiempo
Toggle led_amarillo  'invierte el valor del pin
timer1_10ms = 0  'reinicio el timer1_100ms
Endif
If timer2_10ms >= timer2_10ms_tiempo Then  'cambio de estado el pin RB0 cada timer2_100ms_tiempo
Toggle led_verde  'invierte el valor del pin
timer2_10ms = 0  'reinicio el timer2_100ms
Endif
If timer1_ms >= timer1_ms_tiempo Then  'permite que se ejecute las rutinas solo una vez cada timer1_ms_tiempo
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
timer1_ms = 0  'reset a la base de tiempos
Endif
Goto main  'impide que termine el programa principal
End                                               
'--------------------------------------Subrutinas------------------------------------------------
print_lcd:  '_______________________Imprime la entrada analogica
Lcdcmdout LcdLine1Home  'Cursor al principio de linea
If timer3_10ms >= timer3_10ms_tiempo Then  'Control parpadeo, condicionado por timer3_10ms
timer3_10ms = 0  'Reinicializa el timer3_10ms
Toggle flag  'Invierte el valor contenido en flag
Endif
If timer4_10ms >= timer4_10ms_tiempo Then  'Control parpadeo, condicionado por timer4_10ms
timer4_10ms = 0  'Reinicializa el timer4_10ms
Toggle flag_1  'Invierte el valor contenido en flag_1
Endif
If flag = 1 Then Lcdout "    ADC: "  'Imprime en el LCD, condicionado por el valor de flag
If flag = 0 Then Lcdout "         "  'Imprime en el LCD, condicionado por el valor de flag
Lcdout #adc_4, "  "  'Imprime en el LCD
Lcdcmdout LcdLine2Home  'Cursor al principio de linea
If flag_1 = 1 Then Lcdout "Pruebas con CCP1"  'Imprime en el LCD, condicionado por el valor de flag_1
If flag_1 = 0 Then Lcdout "en Especial Modo"  'Imprime en el LCD, condicionado por el valor de flag_1
Return                                           
'--------------------------------Interrupciones---------------------------------------------------
On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
'Save System  'Guarda valores del sistema y valores intermedios.
adc_4 = ADRESH  'Valor mas significativo de la lectura del ADC
'___Base de tiempos
timer_base = timer_base + 1  'Contador general
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1  'Contador
If timer_base >= timer_base_tiempo Then  'Limita el tiempo de ejecucion, cada timer_base_tiempo
If timer1_10ms < timer1_10ms_tiempo Then timer1_10ms = timer1_10ms + 1  'Contador
If timer2_10ms < timer2_10ms_tiempo Then timer2_10ms = timer2_10ms + 1  'Contador
If timer3_10ms < timer3_10ms_tiempo Then timer3_10ms = timer3_10ms + 1  'Contador
If timer4_10ms < timer4_10ms_tiempo Then timer4_10ms = timer4_10ms + 1  'Contador
timer_base = 0  'Reset a la base de tiempos
Endif
'__Fin base de tiempos
PIR1.CCP1IF = 0  'borra el flag de salto del CCP1
Resume  'Activa las interrupciones y retorna al curso normal del programa antes del salto
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Abril de 2008, 20:25:21
Y aqui queda el video del ejemplo anterior:

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 02 de Abril de 2008, 21:24:09
Excelente aplicacion del modulo ccp1 para el pic16f88.
Solo una observacion  :mrgreen: el modo de disparo especial que activa el adc es el ccp2 en la serie p16F8xxx.
Bonita la tarjeta me tendre que hacer una tambien  :mrgreen:
Saludos

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Abril de 2008, 07:20:47
Hola pana, el PIC16F88 solo tiene un modulo CCP, que se llama CCP1.
Al tener solo un modulo con nombrarlo como CCP seria lo correcto
pero el datasheet del micro lo nombra siempre como CCP1.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Oso57 en 03 de Abril de 2008, 13:28:42

Hola todos... soy muy novato por acá y no se si es el lugar donde hacer esta pregunta.
Instalé el Pic Simulator IDE v6.65 como para hacer algunas pruebas... pues todo bien, pero... ¿donde está la herramienta "Analog input slider"? no la encuentro por ningún lado.

Les agradeceré enoermemente su respuesta.

Saludos del Oso.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Abril de 2008, 13:44:07
Hola!

Creo que te referis al cuadro que aparece cuando en "Tools" seleccionas "microcontroller view" y estas usando un micro con ADC. Al hacer click sobre el boton "A" de los pines ADC aparece un slider para indicar el valor analogico....puede ser?

Saludos! :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Oso57 en 03 de Abril de 2008, 13:52:57
Gracias aitopes... efectivamente así es... el que sabe, sabe... :D

Saludos... sigo aprendiendo  :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 03 de Abril de 2008, 20:54:48
Que tal amigos!
Dogflux lo que coloque arriba es porque los pic16f877, por ejemplo, utilizan el modulo ccp2 para el disparo especial que activa el adc  :mrgreen:

Por supuesto que el p16f88 solo tiene un solo modulo ccp  :shock:

Lo que coloque solo fue para hacer referencia a otro modelo de pic!

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Abril de 2008, 10:46:03
Hola pana Ralf

La observación no iba para ti pana Ralf, pero como lo escribí sin tiempo desde el trabajo me salió mal expresado el post. :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 04 de Abril de 2008, 17:40:30
No hay problema mi estimado amigo!   :mrgreen:

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: alejhandr0 en 07 de Abril de 2008, 01:28:28
Hola amigos, soy un NOVATO con los pic pero entiendo de electronica, tengo una inquietud..
 Experimentando mucho con lo que he leido aqui y alla, modifique varios programas  para realizar uno propio de un VOLTIMETRO simple para el automovil utilizando  un pic y tres display de 7 segmentos (13,8), con la entrada en RA0 analogico (0 a 5V) donde con un divisor de tension redusco los 13.8V a 1.38V para aplicarlo a la entrada RA0.
El problema es que para el 16F88 me corre el programa, simula perfecto con el IDE v6.40 y me funciona, pero para adaptarlo a otro similar como el 16F628A al compilar me produce un ERROR en la linea:
 ANSEL = %00000001 'RA0 analogico..
Para este pic como seria la linea¿? Veo que aqui la mayoria utiliza el 12F88 pero quiero experimentar con varios PIC para aprender.. He procurado leer todo lo relacionado con el comado pero estoy perdido..   Gracias de antemano..
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2008, 10:46:46
Lo siento pero el 16F628 no tiene ADC, solo tiene comparador.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2008, 10:55:44
PD. Ansel da error porque no es utilizado por el 16F628
puedes probar con el "CMCON = 0x07  'Todas las entradas digitales"
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2008, 11:01:26
Parte de un ejemplo para el PIC16F628:

Código: QBasic/QuickBASIC
  1. '--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
  2. '--------------------------------ASIGNACION DE I/O y valores de inicion de las salidas----------------------
  3. CMCON = 0x07  'Desactivo el modulo comparador del PORTA PARA LA SERIE 16F62x
  4. TRISB.7 = 0  'Ptt
  5. TRISB.6 = 0  'Rx
  6. TRISB.5 = 0  'Ok/Temporizador
  7. TRISB.4 = 0  'RL4
  8. TRISB.3 = 0  'RL3
  9. TRISA.4 = 0  'RL2
  10. TRISB.0 = 0  'RL1
  11. TRISA.0 = 1  'E1
  12. TRISA.1 = 1  'E2
  13. TRISA.2 = 1  'E3
  14. TRISA.3 = 1  'E4
  15. PORTA.5 = 1  'Selecciona M/S
  16. PORTB.7 = 0  'Estado de las salidas al inicio
  17. PORTB.6 = 0
  18. PORTB.5 = 0
  19. PORTB.4 = 1
  20. PORTB.3 = 1
  21. PORTA.4 = 1
  22. PORTB.0 = 1
  23. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
  24. Hseropen 1200  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
  25. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos(USART), para que funcione la implementacio P. SERIE
  26. PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  27. T1CON.TMR1ON = 1  'Configuracion y habilitacion del TMR1
  28. T1CON.TMR1CS = 0
  29. T1CON.T1CKPS0 = 0
  30. T1CON.T1CKPS1 = 0
  31. TMR1H = 0xec
  32. TMR1L = 0x78
  33. PIE1.TMR1IE = 1
  34.  
  35. OPTION_REG.T0CS = 0  'selecciona reloj interno
  36. OPTION_REG.PSA = 1  'asigna el prescales al WDT
  37. OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division
  38. OPTION_REG.PS1 = 1
  39. OPTION_REG.PS2 = 1
  40. INTCON.T0IE = 0  'deshabilito interrupcion por el trm0
  41. Enable  'INTCON.GIE habilita todas las interrupciones globales
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: alejhandr0 en 07 de Abril de 2008, 11:42:36
Ahora estoy mas perdido, porque segun el Microcontroller View  del  16F628A aperece con 4 puertos analogicos (RA0, RA1, RA2, RA3) en el PIC SIMULATOR IDE..  pero no acepta el ANSEL, sera error del programa...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Abril de 2008, 18:27:26
Imagen de los protagonistas:

(http://img525.imageshack.us/img525/7883/pict0778zs7.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Nocturno 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.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 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
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.

(http://img247.imageshack.us/img247/4814/picebasiccontroltressercj0.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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:

(http://img389.imageshack.us/img389/6523/pict0845th8.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Mayo de 2008, 09:07:37
La foto en conjunto:

(http://img525.imageshack.us/img525/4930/pict0848qv5.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 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.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 03 de Mayo de 2008, 09:59:04
Simplemente magnifico. Da gusto ver tus trabajos.

Estoy aprendiendo mucho gracias a ellos. 8)

Un abrazo, y a seguir dando cátedra! :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Mayo de 2008, 19:00:26
Gracias Ariel.

1 Abrazo tambien de mi parte.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Mayo de 2008, 19:32:10
El esquema de la placa adaptadora del modulo de Tx:

(http://img59.imageshack.us/img59/6164/picebasicmodulorftxzv5.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Mayo de 2008, 17:02:18
Esquema de la placa adaptadora para el modulo de Rx:

(http://img99.imageshack.us/img99/2294/picebasicmodulorfrxzi0.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: LordLafebre en 06 de Mayo de 2008, 19:18:33
Hola:

Me puede la curiosidad y la ignorancia, que es el LSP1 y LSP2 en la antena?
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 06 de Mayo de 2008, 19:53:24
Que tal amigos!
dogflu66 por lo que veo en el programa que posteaste a esos modulos rf no les colocaste decoder y encoder y por lo que se ve son faciles de sincronizar  :shock:

Me recuerdan mis pruebas con los laipac toda una odisea para sincronizarlos  :D
El unico detalle a tomar en cuenta, muy pequeño por cierto, es que si los modulos estan cerca de algun equipo que genere mucha interferencia se podrian perder los datos, esto lo observe en mi imnumerables pruebas que hice con los modulos de laipac me funcionban bien en mi casa, pero,  cuando los probaba en la casa de un amigo que tiene un router y varios switch para internet se volvia loco  :D

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Mayo de 2008, 17:31:00
Hola:

Me puede la curiosidad y la ignorancia, que es el LSP1 y LSP2 en la antena?

Son terminales metalicos para soldar en circuito impreso, los mas comunes tienen forma de espadita y llevan un agujero en la parte superior para sujetar el cable y posteriormente soldarlo, tambien los hay redondos. A ver si encuentro una foto y la dejo por aqui.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Mayo de 2008, 17:42:30
Que tal amigos!
dogflu66 por lo que veo en el programa que posteaste a esos modulos rf no les colocaste decoder y encoder y por lo que se ve son faciles de sincronizar  :shock:

Me recuerdan mis pruebas con los laipac toda una odisea para sincronizarlos  :D
El unico detalle a tomar en cuenta, muy pequeño por cierto, es que si los modulos estan cerca de algun equipo que genere mucha interferencia se podrian perder los datos, esto lo observe en mi imnumerables pruebas que hice con los modulos de laipac me funcionban bien en mi casa, pero,  cuando los probaba en la casa de un amigo que tiene un router y varios switch para internet se volvia loco  :D

Saludos

Hola RALF2, la verdad es que no he tenido problemas de ruido todavía, eso no quiere decir que no los pueda tener ya que hay que tener en cuenta que solo es un transmisor de 2mW, es muy poca potencia. Tengo por casa una pareja de módulos de Laipac, a ver si tengo un rato y los coloco en unas plaquitas adaptadoras y los pruebo. De todas formas deberían funcionar ya que tu sabes que estos programitas que uso vienen de antiguo y están probados también con estos últimos módulos, tan solo tener en cuenta que los que tengo de Laipac, el transmisor no me permite velocidad mayor a 1200 baudios.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Mayo de 2008, 18:32:23
En esta pagina se pueden ver los tipos de espadines que hay para circuito impreso con sus respectivas hembritas.

http://www.digital-sa.com/tienda/index.php?cPath=150
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 07 de Mayo de 2008, 18:35:05
Que tal dogflu66!
Mira hace bastante tiempo que hicimos unas pruebas con esos modulos, te recuerdas?  :shock: :D
Cuando estabamos en miarroba  :mrgreen:
Esos laipac dan bastante lata para sincronizarlos me recuerdo que habia que enviar una trama de puras "A" para sincronizarlo luego se enviaban los datos pues funcionaba algunas veces y otras no por lo que no eran muy confiables, despues pedi otros modelos de laipac pero no me gustaron tampoco, luego probe con otros modulos hasta que consegui los que para mi son los mejores  :mrgreen:
Los XBEE pro sin lugar a dudas!

Pero si tienes chance puedes hacer unas pruebas con los modulos de laipac! segun el fabricante una vez me dijo que para que funcionen correctamente hay que utilizar los decodificadores y codificadores de ellos pero como se comunican en forma paralelo no me gustaron mucho y esos que los compre tambien  :D :D


Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Mayo de 2008, 19:11:22
Si que me acuerdo... :D

Ya veo que has recorrido hasta encontrar los tuyos.
Desde luego para no tener problema los mejores son los que tienen puerto RS232 u otro tipo que sea estandar... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Mayo de 2008, 19:59:43
Se dice que el que guarda halla

En contre los módulos de Laipac, el modulo de Tx miniatura que esta funcionado en un minimando que comanda receptores realizados con módulos de Aurel (se puede ver el receptor en el video) y por otro lado el modulo de RX que estaba medio perdido.

(http://img390.imageshack.us/img390/7908/laipactxrxsv1.jpg)

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 07 de Mayo de 2008, 22:40:46
Tengo esos mismos modulos!! ;)
Los usaba con unos....HT12, creo. Los voy a buscar.

Que caracteristicas tiene ese pila???  12V? 23....Amper!?!?!?!  :lol: (obviamente, es imposible....pero ..)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 08 de Mayo de 2008, 16:16:07
Que tal amigos!
Si eson son los modulos que te vendieron, en ese entonces a mi por error me enviaron unos que supuestamente son y que la version mejorada  :mrgreen:

Pero los veo iguales a los tuyos con excepcion de la velocidad de transmision que creo es mayor y el alcance.

Pero habia algo que no me gustaba creo que era que la entrada del receptor oscilaba cuando el transmisor se apagaba o no transmitia o algo asi en los tuyos sino mal recuerdo no hacia eso :mrgreen:

Aitopes los modulos HT12 son los que hacia referencia mas arriba eso es lo que recomienda el fabricante  :D

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Mayo de 2008, 16:59:23
Tengo esos mismos modulos!! ;)
Los usaba con unos....HT12, creo. Los voy a buscar.

Que caracteristicas tiene ese pila???  12V? 23....Amper!?!?!?!  :lol: (obviamente, es imposible....pero ..)

Pues no se las características reales de la pila, es una pila alkalina de 12v, que se emplea mucho en los minimandos.
De esta pila creo que hay varias por debajo de menor grueso pero mismo voltaje, también hay algunas por encima
de mismo voltaje y mayor grueso. Y si no me equivoco 23A=L1028 que se refiere al tipo y tamaño del encapsulado.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Mayo de 2008, 17:00:50
Que tal amigos!
Si eson son los modulos que te vendieron, en ese entonces a mi por error me enviaron unos que supuestamente son y que la version mejorada  :mrgreen:

Pero los veo iguales a los tuyos con excepcion de la velocidad de transmision que creo es mayor y el alcance.

Pero habia algo que no me gustaba creo que era que la entrada del receptor oscilaba cuando el transmisor se apagaba o no transmitia o algo asi en los tuyos sino mal recuerdo no hacia eso :mrgreen:

Aitopes los modulos HT12 son los que hacia referencia mas arriba eso es lo que recomienda el fabricante  :D

Saludos

Voy a probar los modulos a ver que sale... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 08 de Mayo de 2008, 17:12:07
Ok gracias dogflu66!
Yo no recuerdo bien porque en ese entonces se me hacia dificil probar por falta de oscloscopio!

De todas formas cuando pruebes vemos como te trabajan y las señales como se comportan.
Yo probare los mios tamben a penas tenga tiempo  :mrgreen:  y posteo los resultados y de ser posible con fotos o videos incluidos  :mrgreen:

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Mayo de 2008, 17:19:20
 Pues esperando el trabajo y mejor si hay videos... :D

Experimento 1:

Tx = Aurel
Rx = Laipac
Mismo programa
No se observa que el modulo capte ruido
RESULTADO OK
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 08 de Mayo de 2008, 18:18:40
dogflu66!
Reviza en la salida del receptor que ocurre cuando el tx no transmite o esta apagado  :mrgreen:
Que estado tiene la salida cero, uno, ruido... de ser posible con un osciloscopio  :mrgreen:

Dejame chance y monto el mio y lo pruebo lo que si te digo es que mi camara no me ayuda para nada yo creo que la del celular es mejor  :D :-)

Tendre que conseguirme una o comprarla  :mrgreen:

Saludos

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Mayo de 2008, 21:52:47
Con otro modelo de modulo de Rx de Laipac:

(http://img146.imageshack.us/img146/6162/laipactxrx2do8.jpg)

Experimento 2:

Tx = Aurel
Rx = Laipac
Mismo programa
Resultado:
Se observa que el modulo capta ruido.
16 tramas recibidas suele fallar 1 o 2 a un nivel de ruido indeterminado.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Mayo de 2008, 21:24:24
Experimento 3:

Tx = Aurel
Rx = Aurel
Mismo programa
No se observa que el modulo capte ruido
RESULTADO OK

PD: Referido a los modulos originales del hilo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: joebar en 11 de Mayo de 2008, 18:56:46
Hola a todo@s, buenisimo el trabajo de este hilo, pero no he encontrado la manera de contar pulsos en un pin de entrada, similar al COUNT en PBP, ¿alguien me puede decir si hay alguna forma especifica de hacerlo?.

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Mayo de 2008, 18:00:29
Desconozco como se hace con PBP y no soy muy amigo de usar funciones predefinidas.
Según estuve repasando el manual del Basic del PSI hay un comando que lo hace.
Realmente no tengo ni idea de su eficacia.

Texto extraído del manual del Basic del PSI:
If it is necessary to count the number of pulses that come to one of the micrcontroller's
pins during a certain period of time, there is COUNT statement available for that purpose.
It has three arguments. The first one is the pin that is connected to the source of pulses. It
should previously be setup as digital input pin. The second argument defines the duration
of the observation expressed in milliseconds and it must be a numeric constant in the
range 1-10000. The last argument of this statement is a Byte or Word variable where the
counted number of pulses will be stored after its execution. COUNT statement uses
internal Timer0 peripheral module. There is COUNT_MODE parameter available that can
be setup with DEFINE directive. If it is set to value 1 (default value) COUNT statement will
count the number of rising pulse edges. If COUNT_MODE = 2, the number of falling edges
will be counted.
DEFINE COUNT_MODE = 1
DIM num_of_pulses AS WORD
COUNT PORTB.0, 1000, num_of_pulses
Título: parallax
Publicado por: electro85 en 16 de Mayo de 2008, 21:00:08
Perdon alguien sabe si el basic que usamos para pic es igual al basic para programar parallax?
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: aitopes en 16 de Mayo de 2008, 22:17:07
El del PIC SIMULATOR IDE no...solo hay uno igual para AVR: el AVR SIMULATOR IDE

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 26 de Mayo de 2008, 09:31:55
Gracias Dogflu66!
Ese es el problema de los laipac captan mucho ruido el Rx cuando el Tx no envia datos y eso puede afectar la integridad de los datos que llegan al pic  :shock: :mrgreen:
Es un problema que tienen  :( los aurel por lo que se ve no tienen ese problemita  :D

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Mayo de 2008, 13:43:13
Con otro modelo de modulo de Rx de Laipac:

(http://img146.imageshack.us/img146/6162/laipactxrx2do8.jpg)

Experimento 2:

Tx = Aurel
Rx = Laipac
Mismo programa
Resultado:
Se observa que el modulo capta ruido.
16 tramas recibidas suele fallar 1 o 2 a un nivel de ruido indeterminado.



Solo es este modelo el que capta el ruido, porque el otro de Laipac se comporta como los de Aurel.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 26 de Mayo de 2008, 14:31:15
ok amigo los mios se comportan como el que capta ruido  :?  y supuestamente son y que los mejorados  :shock: si como no  :D

Bueno abra que usar los aurel o los laipac que no dan problemas!  :mrgreen:

Apenas tenga chance pruebos los mios y los posteo con video incluido  :mrgreen:

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 26 de Mayo de 2008, 14:43:19
hola amigo,

Puedes echarme una mano con el programa tuyo, desde hace un tiempo llevo ojeando unos cuantos por la red, y el tuyo me a convencido.
querria usar el pic 16f877A, me lo han recomendado, mejor que el 16f84A dicen que este ultimo esta desfasado. Queria hacer un pequeño proyecto, consitiria en poner el pic16f877A con un DS1307 y un lcd lm016 y otras cosas, el de proteus VSM, utilizaria la comunicacion del bus i2c queria tener un reloj de tiempo real que lo pudiese poner en hora, con dia de la semana, fecha, hora que se pudidera poner con un boton formato 24h o 12h  y ponerle varias alarmas, despertador,  cumpleaños y fechas recordatorio. 

Por lo que he leido por el foro tu eres un crack con el pic simulator ide, yo estos usandolo en su version 6.65, el pic es un 16f877A.
Muchos me han recomendado el asm pero prefiero el basic creo que es mas sencillo e intuitivo.

Lei tu programa pero hay lineas que no se que hacen, el famoso "ansel" (puede ser selector analogico) y "oscon1" (oscilador de algo), yo lo simule con mi vesion me saca la hora todo con ceros  y año 2000, seguro que se me esta pasando algo por alto.

mi pic simulator ide lo tengo con el pic16f877A a 4MHz, oscilador xt, wdog timer disable, low voltage disable, data eeprom OFF, flash program OFF, si  quieres te puedo enviar una foto de la configuracion.


Si querias darme algun otro consejo toy abierto a posibilidades.Cambio de PIC o de reloj tiempo real.

gracias,


 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Mayo de 2008, 19:19:25
Esos registros no funcionan con el 16F877, el PSI dará error al compilar.
Todos los micros no tienen los mismos registros internos.
He compilado el ejemplo del reloj para el PIC16F877, en principio
debería funcionar, tan solo el ADC no lo he optimizado pero también debería
funcionar correctamente.

PD. 05/06/08, Al pasar el programa que se puede descargar seguido a este texto, del 16F88 al 16F877, este programa arrastra los BIT RA6 y RA7 del programa original, estos pin del puerto A no existen en el 16F877, por lo que hay que cambiarlos en el código indicado de abajo por otros pin de otro puerto. El compilador por motivos desconocidos no ha mostrado error al compilar el programa para el 16F877 usando unos pin no existentes en este PIC.

Programa:

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 30 de Mayo de 2008, 12:55:47
hola amigo dogfluu66,

modifique algo tu programa, para que funcionase con pic16F877A, puse como comentario la parte de la temperatura y cambie algunas entradas, pero hay partes que no comprendo, por el lcd no me muestra nada, simule mediante el modulo de led los puertos que interviene, a modo de chivato, SDA=RB.1;SCL=RB4; tambien cambie los led amarillo vede: Led amarillo RB.4;led verde RB.5; S1=RA.4; S2=RA.5.

para el chip
En bloque de definicion de puertos "ADCON1 = 0x07 " tiene que ver con el registro del converson analogico digital del oscilador interno en el canal AN7 es cierto eso.

Hseropen que hace esto
Hserout que hace esto

puedes ayudarme o darme un consejo



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Mayo de 2008, 20:38:13
ADCON1 = 0x07 es un registro que obedece a una tabla que hay en el datasheet del Pic. Con el, según lo que permite la tabla, se configura el modo de trabajo de los pines del puerto "A" y "E". Estos pin se pueden configurar como pin digitales o pin analógicos. Si se configuran como pin digitales estos podrán ser entradas o salidas digitales (I/O) y si se configura como analógicos solo podrán funcionar como entradas analógicas, para ser asignadas al modulo comparador y tambien al modulo ADC.

ADCON1 = 0x07, indica al micro que todo el puerto "A" y "E" trabajará como digital, por lo tanto solo tomara dos valores posibles 0 o 5 voltios.
TRISA.4=1, configuramos el pin RA4 como entrada, y más adelante lo configuraremos analógico.

ADCON1 = 0x00 , indica que todo el puerto "A" y "E" trabajará como entradas analógicas antes de hacer una lectura analógica.

ADCIN 4, adc_4  'Lee el valor de la entrada analógica (RA4) y lo guarda en la variable adc_4 (una variable no es más que una posición o varias posiciones consecutivas según el número de bytes que ocupa en la memoria de datos), ADCIN es una funciona y ya se encarga de programar la mayoría de los registros del modulo ADC con una configuración básica estándar para que nos funcione sin problemas.

ADCON1 = 0x07  'Los pin PORTA y PORTE como I/O, después de una lectura volvemos a configurar los pin del puerto "A" y "E" como digitales.

(http://img165.imageshack.us/img165/6668/pic16f87xqw7.jpg)

Como puede verse en la imagen no es posible configurara los pin del puerto "A" y "E" de una forma arbitraria. Creo que la forma mas sencilla es la que te indico.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Mayo de 2008, 20:45:21
HSEROPEN 4800, configura el modulo USART para que trabaje a una velocidad de 4800Baudios, en realidad esto será el puerto RS232.

HSEROUT, con este comando enviamos los datos al modulo USART para que los codifique en forma de BIT serie, que son a su vez convertidos por el driver RS232 a tensiones precisamente tipo RS232 (+12V y -12V).

Y si no recuerdo mal, hay un pin del puerto A (RA4) que como salida solo suministra valor 0, ya que como solo trabaja como colector abierto, por lo que no se puede utilizar para controlar el LCD, si antes no se le coloca una resistencia de pull-up.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Mayo de 2008, 20:53:35
Y para terminar de resolver las dudas descárgate el esquema siguiente que es especial para el 16F877, el cual esta totalmente probado.
Si utilizas la configuración del esquema seguro que te funcionara el display y el puerto I2C.

http://www.freewebs.com/glafebre/miguelito.htm
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Mayo de 2008, 20:56:55
o aquí más rápido:

http://www.4shared.com/file/1694958/a5c96550/bot_miguelito_robot_siguelineas.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 31 de Mayo de 2008, 09:06:01
o aquí más rápido:

http://www.4shared.com/file/1694958/a5c96550/bot_miguelito_robot_siguelineas.html

Hola dogflu66,
he mirado el enlace, es un proyecto muy trabajado y de muchas horas metidas, ademas esta muy bien documentado. Porcierto con que software fueron hechos los esquematicos electricos, en la revista elektor muchos estan echos con este tipo de dibujos, imagino que sera el mismo software.

Ayer noche revise de nuevo el otro programa, el que muestra la fecha y la hora en en display y pulsando S1 trasfiere la hora al reloj, esta fechado 12/6 by Cos.Ese programa si que mostraba la hora lo que no funcinaba era la modificacion del reloj, el otro que me pasaste, el de la temperatura y reloj le seguire quitando cosas, el RS232 no lo usare.

Tan solo dejare el PIC16f877A con el DS1307 conectado por I2C, que me muestre la hora, la fecha, el dia de la semana, el mes por display y tambien lo del reprogramado del reloj. eso de pulsar los dos a la vez es una buena idea, pero como evitas los rebotes.

Despues quiero añadirle una rutina, para que el reloj se reprograme solito en los cambios de horario de sosticios, no se si lo hara el propio SD1307, y por ultimo quiero poder ponerle varias alarmas programables, recordatorios, cumpleaños, creo que necesitare ponerle una memoria.

Respecto a la memoria, tu la pondrias por I2C tambien.


un saludete,
 si tienes algun consejo, te lo agradeceria.




Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 31 de Mayo de 2008, 12:10:13

Respecto a la memoria, tu la pondrias por I2C tambien.


No es necesario utilizar la memoria E2prom, el PIC16F877 ya tiene una interna.

Con respecto a lo de más echare un vistazo al programa para refrescar la memoria y te cuento.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 01 de Junio de 2008, 09:14:12
Hola,

tengo 2 pregunta como hace para que dectecte una tecla pulsada?
 y el tiempo que ha sido pulsada?.

En el programa "2" define una variable S1_on como bit pero no comprendo, imagino que s1_on=1 activo y s1_on=0 desactivo pero como se activa esa variables y quien la activa o que proceso la actica

"If s1 = 1 And s1_on = 1 And s2_on = 0 Then  'detecta tecla S1"

pulsamos s1 nosotros, pero quien activa la variable S1_on


Pudes sacarme de dudas.

un saludo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Junio de 2008, 15:12:40
Para entenderlo habría que plantearse como si el programa funcionara por eventos (que no lo es pero intento simularlo). Al pulsar una tecla se supone que no debe de estar pulsada la otra, por lo menos dentro de la rutina de ajuste. Cuando una tecla se pulsa dentro de las condiciones adecuadas la rutina marca esa tecla como pulsada, para que se active la rutina timer de esa tecla impidiendo que se repita esa rutina hasta pasado cierto tiempo, a un que se mantenga pulsada la tecla o se produzca el efecto rebote. Hay muchas formas de lograr esto y esta es una, en la siguiente versión de programa que te dejo que no esta publicada esta mas optimizado el sistema. Pero lo mejor para tener un buen tacto en las teclas es hacer la lectura de las mismas en el vector de interrupciones. Al utilizar timer para el control de las teclas se consigue un buen tacto y un nivel de fallo muy bajo también, pero mediante interrupciones es el mejor sistema. Lo principal es que según valla el programa creciendo en longitud se mantenga un “tacto” adecuado.
“tacto” podríamos traducirlo como agradable al ser pulsada, ósea que responda sin demoras, si pulsas rápido responde rápido y si pulsas lento responde lento.

Resumiendo, s1_on, la activa la misma rutina que se debe de ejecutar cuando se pulsa esa tecla, pero siempre que el timer1_ms (contador o demora) asociado a esa tecla lo permita.

Otra aclaración, timer1_ms es una base de tiempos o contador que se incrementa cada 1ms. Si sustituyéramos el timer1_ms por un WaitMs provocaremos una parada del programa, mientras que las demoras por bases de tiempos solo bloquean una rutina en concreto del programa permitiendo que el resto de rutinas se ejecuten normalmente. Arriesgando mucho podríamos decir que es una simulación muy tosca de multitarea pero que nos da unos resultados magníficos. A la vista queda cuando estamos haciendo los ajustes los segundos se siguen incrementando a su tiempo, el parpadeo del digito seleccionado para ajustar también sigue parpadeando sin hacer cosas raras, he incluso incrementamos su valor, se enciende el led de la tecla pulsada, y todo parece que se haga al mismo tiempo.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 01 de Junio de 2008, 15:27:41
Hola dogflu66,

Revisando el programa en la parte del rtc cuando llegas a la parte de leer y escribir dato creo que esta erroneo se escribe con 0xD0 y se lee con 0xD1

i2cwrite sda, scl, 0xD0, Addr, Data
i2clead sda, scl, 0xD1, Addr, Data

estan cambiados.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Junio de 2008, 15:32:49
Pues lo miro, seria un error grave. El programa lo tengo funcionando ahora mismo y no observo fallos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Junio de 2008, 15:38:33
Hola dogflu66,

Revisando el programa en la parte del rtc cuando llegas a la parte de leer y escribir dato creo que esta erroneo se escribe con 0xD0 y se lee con 0xD1

i2cwrite sda, scl, 0xD0, Addr, Data
i2clead sda, scl, 0xD1, Addr, Data

estan cambiados.

Todo lo tengo con 0xD0, y no observo fallos. Tendría que repasar el datasheet.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 01 de Junio de 2008, 16:56:26
Pues lo miro, seria un error grave. El programa lo tengo funcionando ahora mismo y no observo fallos.

Hola dogflu66,

mira en la linea 165 y 168 del txt anterior
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Junio de 2008, 18:34:05
Ya hice memoria, hace tanto tiempo que no me acordaba el por qué da lo mismo utilizar 0xD1 o 0xD0, es que el BIT menos significativo la función I2CWrite lo pone de forma automáticamente a 0 y la función I2CREAD lo pone a 1. Da lo mismo el valor de este ultimo BIT, el compilador lo rescribe según el caso. Ya tuvimos una polémica parecida con la función del ADC, puedes programar los registros del modulo ADC para hacer lecturas de 8Bit, pero deforma automática al usar la función ADCIN lo reprograma para trabajar a 10bit, por eso hay por el índice una función especial para trabajar a 8bit con el ADC.

De todas formas buen detalle, me has obligado a repasar el datasheet del RTC... :wink:


Nota: Actualmente la selección de 8bit o 10bit del adc es de forma automática. Si se usa una variable de lectura del ADC de 8bit el ADC se confiugra a 8Bit y si se usa una variable doble el ADC se configura a 10bit, se entiende que siempre que se usen las funciones integradas en el sistema del ADC.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 01 de Junio de 2008, 23:42:18
Hola dogflu66.

tengo una pregunta, de la rutina del programa 2.

lee_hora:     'lee la hora del RTC en formato BCD y la pasa a decimal
   i = 0         'variable indice, asigna los datos de forma ordenada, leidos del RTC
   While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
   PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
   I2CRead sda, scl, 0xd0, i, reg(i)  'lectura de la direccion de memoria indicada del RTC, formato BCD
   PIE1.TMR1IE = 1  'activa las interrupciones del timer1
   aux_4l = reg(i) And %00001111  'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
                If i = 0 Then aux_4h = reg(i) And %01110000  'segundos, borrado de bit configuracion y almacena nibble alto
   If i = 1 Then aux_4h = reg(i) And %01110000  'minutos, almacena nibble alto
   If i = 2 Then aux_4h = reg(i) And %00110000  'horas, borrado de bit configuracion y almacena nibble alto
   If i = 3 Then aux_4h = reg(i) And %00000000  'dia_semana, almacena nibble alto
   If i = 4 Then aux_4h = reg(i) And %00110000  'dia_mes, almacena nibble alto
   If i = 5 Then aux_4h = reg(i) And %00010000  'mes, almacena el nibble alto
   If i = 6 Then aux_4h = reg(i) And %11110000  'año, almacena el nibble alto
   aux_4h = ShiftRight(aux_4h, 4)  'convierte el nibble alto en bajo
   reg(i) = (aux_4h * 10) + aux_4l  'fusiona los nibbles alto y bajo en una sola variable en formato decimal
   i = i + 1  'incrementa la variable indice con cada repeticion del bucle While/Wend
   Wend  'fin del bucle y salta a While
Return 
------------------------------
PIE1.TMR1IE = 1     para que lo volvemos a encender?para que lo apagamos antes? no comprendo, perdona mi ignorancia.


otra cosita:

aux_4l = reg(i) And %00001111
la variable que guarda el nible bajo es igual al resultado de hacer una and logica del  registro numero "i" es decir "reg(i)" y el numero binario 0111 0000,

¿por que ese numero binario? en algunos otros tambien? cambia, tiene que ver con el registro del DS1307


 si la variable "i" toma valores desde 0 hasta 6, la parte baja del nible lo comprendo, pero la baja
 la parte alta nos va ha dar siempre 0. Tomamos por ejemplo i=1 seria:

0000 0001 --> reg(1)
0111 0000  -->%01110000
------------
000000000 --> aux_4h=0000

aux_4h = ShiftRight(aux_4h, 4)
con esto lo desplamos el nible alto a derecha, 4 posiciones a la derecha, si fuera 0111 0000 seria 0000 0111, pero como da todo ceros  seguira siendo cero.

La conversion del nible alto a bajo no se deberia de hacer antes?
antes de la and logica asi se evitaria que fuera cero


otra cosilla

reg(i) = (aux_4h * 10) + aux_4l 

con esto haces: el registro numero "i" le igualamos el valor del nible alto multiplicado por 10 y le sumamos el nible bajo.

yo creo que el nible alto estaba en binario, salio como resultado de una and logica del registro numero "i" con el numero
 binario 0000 1111.
 no entiendo como multiplicas un numero binario por un numero decimal, a no ser que el aux_4h sea decimal.


ejemplo i=1

aux_4h = reg(i) And %01110000  parte del nible alto

aux_4H= 0000 0001 and 0111 0000 se queda con la parte alta

0000 0001
0111 0000
--------------
0000 0000 --> aux_4h   si se queda con la parte alta simpre sera cero ya que
                                    "i" toma valores de 0 a 6 situandose simpre en el nible bajo



aux_4l = reg(i) And %00001111

aux_4l= 0000 0001 and 0000 1111 = 0000 0001   solo almacena los 4 primeros seria 0001 aux_4l =0001


aplicamos:

reg(i) = (aux_4h * 10) + aux_4l   siendo aux_4l simpre binario

reg (i)=(0*10)+dato binario

reg (i)= aux_4l en binario

para poner un dato BCD "0101" a binario seria (0*23)+(1*22)+(0*21)+(1*20)

esto sera (0*8 )+(1*4)+(0*2)+1*1)  => 0+4+0+1 => 4+1 => 5 en decimal


I2CRead sda, scl, 0xd0, i, reg(i) yo prefiero poner para "I2CRead" 0xD1 pero bueno


estamos leyendo las direciones correlativas del 0 al 6 con el valor de"i" ademas estamos leyendo correlativamente los registros del 0 al 6 del nible bajo.

amigo dogflus66 podrias corregirme, y aclarme   esta dudas.


 gracias

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Junio de 2008, 07:01:15
Hola dogflu66.

tengo una pregunta, de la rutina del programa 2.

lee_hora:     'lee la hora del RTC en formato BCD y la pasa a decimal
   i = 0         'variable indice, asigna los datos de forma ordenada, leidos del RTC
   While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
   PIE1.TMR1IE = 0  'deshabilita las interrupciones del timer1
   I2CRead sda, scl, 0xd0, i, reg(i)  'lectura de la direccion de memoria indicada del RTC, formato BCD
   PIE1.TMR1IE = 1  'activa las interrupciones del timer1
   aux_4l = reg(i) And %00001111  'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
                If i = 0 Then aux_4h = reg(i) And %01110000  'segundos, borrado de bit configuracion y almacena nibble alto
   If i = 1 Then aux_4h = reg(i) And %01110000  'minutos, almacena nibble alto
   If i = 2 Then aux_4h = reg(i) And %00110000  'horas, borrado de bit configuracion y almacena nibble alto
   If i = 3 Then aux_4h = reg(i) And %00000000  'dia_semana, almacena nibble alto
   If i = 4 Then aux_4h = reg(i) And %00110000  'dia_mes, almacena nibble alto
   If i = 5 Then aux_4h = reg(i) And %00010000  'mes, almacena el nibble alto
   If i = 6 Then aux_4h = reg(i) And %11110000  'año, almacena el nibble alto
   aux_4h = ShiftRight(aux_4h, 4)  'convierte el nibble alto en bajo
   reg(i) = (aux_4h * 10) + aux_4l  'fusiona los nibbles alto y bajo en una sola variable en formato decimal
   i = i + 1  'incrementa la variable indice con cada repeticion del bucle While/Wend
   Wend  'fin del bucle y salta a While
Return 
------------------------------
PIE1.TMR1IE = 1     para que lo volvemos a encender?para que lo apagamos antes? no comprendo, perdona mi ignorancia.


La función I2C es una emulación por Soft, no utiliza el modulo, por lo tanto tiene que medir tiempos muy exactos, si no deshabilitamos las interrupciones estos tiempos se ven truncados, y por lo tanto fallara esta función.

PD. Esta en el manual. Siempre que se utilicen funciones que necesitan medir tiempo hay que deshabilitar las interrupciones, unas funciones sencillamente no funcionaran y otras por ejemplo waitms o waitus se ven aumentados sus tiempos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Junio de 2008, 17:50:53
otra cosita:

aux_4l = reg(i) And %00001111
la variable que guarda el nible bajo es igual al resultado de hacer una and logica del  registro numero "i" es decir "reg(i)" y el numero binario 0111 0000,

¿por que ese numero binario? en algunos otros tambien? cambia, tiene que ver con el registro del DS1307


 si la variable "i" toma valores desde 0 hasta 6, la parte baja del nible lo comprendo, pero la baja
 la parte alta nos va ha dar siempre 0. Tomamos por ejemplo i=1 seria:

0000 0001 --> reg(1)
0111 0000  -->%01110000
------------
000000000 --> aux_4h=0000

aux_4h = ShiftRight(aux_4h, 4)
con esto lo desplamos el nible alto a derecha, 4 posiciones a la derecha, si fuera 0111 0000 seria 0000 0111, pero como da todo ceros  seguira siendo cero.

La conversion del nible alto a bajo no se deberia de hacer antes?
antes de la and logica asi se evitaria que fuera cero

Como te dije hace tiempo de esto.
Al leer los registros, todos tienen una longitud fija si no recuerdo mal, y al tener estos los BIT de configuración en la parte más significativa del dato leído, hay que eliminar el valor de configuración del registro antes de poder operar con él. Puede que con alguno de ellos en concreto no sea necesario hacer esta operación, pero supongo que cuando lo puse fue por no dejar el hueco en la rutina. Puede que con alguno de ellos se produzca una operación redundante, pero eso se puede tomar como capricho del programador. De todas formas siempre puedes hacer la prueba cambiando la línea de sitio y así experimentas que es lo que pasa. Pero también tienes que tener en cuenta que actualmente funciona el programa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 02 de Junio de 2008, 18:07:03
otra cosilla

reg(i) = (aux_4h * 10) + aux_4l 

con esto haces: el registro numero "i" le igualamos el valor del nible alto multiplicado por 10 y le sumamos el nible bajo.

yo creo que el nible alto estaba en binario, salio como resultado de una and logica del registro numero "i" con el numero
 binario 0000 1111.
 no entiendo como multiplicas un numero binario por un numero decimal, a no ser que el aux_4h sea decimal.


ejemplo i=1

aux_4h = reg(i) And %01110000  parte del nible alto

aux_4H= 0000 0001 and 0111 0000 se queda con la parte alta

0000 0001
0111 0000
--------------
0000 0000 --> aux_4h   si se queda con la parte alta simpre sera cero ya que
                                    "i" toma valores de 0 a 6 situandose simpre en el nible bajo



aux_4l = reg(i) And %00001111

aux_4l= 0000 0001 and 0000 1111 = 0000 0001   solo almacena los 4 primeros seria 0001 aux_4l =0001


aplicamos:

reg(i) = (aux_4h * 10) + aux_4l   siendo aux_4l simpre binario

reg (i)=(0*10)+dato binario

reg (i)= aux_4l en binario

para poner un dato BCD "0101" a binario seria (0*23)+(1*22)+(0*21)+(1*20)

esto sera (0*8 )+(1*4)+(0*2)+1*1)  => 0+4+0+1 => 4+1 => 5 en decimal


I2CRead sda, scl, 0xd0, i, reg(i) yo prefiero poner para "I2CRead" 0xD1 pero bueno


estamos leyendo las direciones correlativas del 0 al 6 con el valor de"i" ademas estamos leyendo correlativamente los registros del 0 al 6 del nible bajo.

amigo dogflus66 podrias corregirme, y aclarme   esta dudas.


 gracias

Bueno con respecto a mezclar números binarios con decimales, pues no es correcto lo que piensas. Que algunos números aparezcan en el programa como nomenclatura binaria solo es por ser mas gráficos o si quieres es una forma de remarcar que hay BIT que tienen un significado concreto. En realidad todos los números, ya sean en el sistema que elija el programador, son traducidos por el compilador a binario. El uso de un sistema u otro de representación en el programa fuente no es mas que por hacer más comprensible el código "aux_4l = reg(i) And %00001111" esto para mí tiene significado, pero esto otro no "aux_4l = reg(i) And 15" (este ejemplo es muy simple ya que 1111 = F = 15) y sin embargo el resultado será el mismo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 04 de Junio de 2008, 12:07:35
hola dogflu,

El programa adaptado del 16f88 al 16f877A, se deberian de cambiar los pines: el porta.7 y el porta.6 correspondientes del led amarillo, y el pulsador S1, a mi no me da ningun error ni nigun warnig, pero lo debemos cambiar para poder pulsar boton y ver el led amarillo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 04 de Junio de 2008, 12:12:37
hola, dogflu66

Crees que seria posible simular el programa 2, el adaptado al 16f87A, en proteus 7?
La simulación por software no le sera impedimento verdad, para proteus?
 
un cordial saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Junio de 2008, 18:39:52
hola dogflu,

El programa adaptado del 16f88 al 16f877A, se deberian de cambiar los pines: el porta.7 y el porta.6 correspondientes del led amarillo, y el pulsador S1, a mi no me da ningun error ni nigun warnig, pero lo debemos cambiar para poder pulsar boton y ver el led amarillo.

Tienes razón, el compilador ahí debería dar error,  :?
Tienes que cambiar esos pin por otros.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Junio de 2008, 18:44:14
hola, dogflu66

Crees que seria posible simular el programa 2, el adaptado al 16f87A, en proteus 7?
La simulación por software no le sera impedimento verdad, para proteus?
 
un cordial saludo

Hasta ahora no he usado proteus para simular los PIC, pero si he enviado programas compilados con el compilador Basic del PSI a algunos amigos que me los pidieron ya que con otros lenguajes Basic no lograron hacerlos andar en proteus, y sin embargo todos los compilados con este lenguaje si funcionaron correctamente... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pajaro en 18 de Junio de 2008, 08:45:56
hola,
 Dogflu66 , podrias decirme si es posible utilizar un pic por ejemplo el 16F877A con el protocolo i2c y el protocolo spi, a la vez es decir, con un ds1307 y una mmc. los pines del sda cinciden con el sdi y el scl con el sck.

es posible utilizar ambos protocolos?

confio que me puedas ayudar.

un cordial saludo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 18 de Junio de 2008, 13:36:56
yo diría, leyendo su hoja de datos, que no es posible:

9.0 MASTER SYNCHRONOUS SERIAL PORT (MSSP) MODULE
The Master Synchronous Serial Port (MSSP) module is a serial interface, useful for communicating with other peripheral or microcontroller devices. These peripheral devices may be serial EEPROMs, shift registers, display drivers, A/D converters, etc. The MSSP module can operate in one of two modes:
• Serial Peripheral Interface (SPI)
• Inter-Integrated Circuit (I2C)
Figure 9-1 shows a block diagram for the SPI mode, while Figure 9-5 and Figure 9-9 show the block diagrams for the two different I2C modes of operation. (página 65).

no sé si mediante programación se pueden simultanear a la velocidad suficiente a tus necesidades...

un saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Junio de 2008, 19:12:20
Pues como te dice xocas06 usando el modulo directamente no, puedes programar el modulo por ejemplo para spi y el i2c lo puedes simular por soft. De todas formas este tipo de simulaciones requieren tiempos muy exactos por lo que se desconectan las interrupciones dejando cualquier otra cosa fuera de juego, es decir, solo uno de los dos a la vez. Posiblemente se pueda conseguir usar el modulo con los dos protocolos en la misma placa utilizando algún circuito que los conmute, pero estaríamos en las mismas, no podrías usar los dos al mismo tiempo. De todas formas si no necesitas usarlos al mismo tiempo la emulación por soft da buenos resultados.

Tengo pendiente la construcción de unas rutinas que usen el modulo en modo spi y i2c pero por el momento para esto falta tiempo todavía.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:25:50
MODULO CCP1 EN MODO PWM:

El modulo CCP1 del PIC16F88 como ya hemos visto puede trabajar en distintos modos, en esta ocasión practicaremos utilizándolo en el modo PWM, en este modo puede generar una serie de frecuencias a las que si procede podremos variar el duty cycle, esto quiere decir que podremos elegir el tiempo en el que la señal se mantendrá a nivel alto con respecto al estado bajo. Si el duty cycle lo mantenemos al 50% obtendremos una señal de onda cuadrada de una frecuencia elegida previamente. Y por supuesto el margen de frecuencias al que podremos trabajar una vez conocida las limitaciones del modulo queda  sujeto a la frecuencia de trabajo del Pic.

El modulo se puede utilizar como generador de frecuencias dentro de un margen determinado, pero en este caso lo voy a utilizar como control de potencia por modulación del ancho de pulso, y para esto lo programare con una frecuencia fija que no variara de valor durante todo el proceso, he iré variando el duty cycle de la señal (duty cycle  es igual al tiempo en el que está la señal a estado alto) y, como consecuencia de esta variación conseguiremos distinta luminosidad en el LCD.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:26:18
El modulo trabajando en modo pwm acapara el timer2 del PIC, de este timer se utiliza el prescaler y su registro interno como contador. En PR2 (8Bit) establecemos el periodo de la frecuencia de trabajo elegida, cuando el valor del registro del timer2 es igual al del PR2 el pin de salida del modulo CCP pasa a valor 1 y se reinicia el contador del timer2. Al mismo tiempo el PIC hace una copia del registro de 10Bit CCPR1L+CCP1CON5:4 al registro CCPR1H+2Bit, y en este mismo momento, el contador del timer2 es concatenado con dos BIT internos para pasar a tener una longitud de 10Bit. Cuando este contador contiene el mismo valor del registro CCP1H+2Bit, el pin del modulo pasa a estado bajo y se borra el registro del timer2 otra vez, iniciándose de nuevo todo el ciclo completo indefinidamente. En el registro CCP1L+CCP1CON5:4 previamente se ha cargado el valor del duty cycle.

El modulo una vez programado y como ultimo paso activado el Timer2 queda indefinidamente trabajando, ya que los valores de sus registros de configuración no son modificados en el proceso. Y por supuesto se puede apagar o volver a activar al igual que cambiar su configuración, todo en tiempo de ejecución.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:26:45
Como hemos visto el registro que controla el duty cycle tiene una longitud de 10Bit, por lo que podemos decir que tendremos una resolución máxima de 10Bit. En realidad esta resolución solo se dará siempre que trabajemos en un estrecho margen de frecuencias, este margen está determinada por el Clock del oscilador del Pic, el prescaler del timer2 y la frecuencia elegida para ser generada. El valor del duty cycle no podrá ser mayor al 100% (expresado en %), en el caso de ser superior el modulo no funcionara correctamente quedando su salida siempre a nivel alto. Por esto es necesario calcular el valor máximo (100%) a cargar en el registro de control del duty cycle para de esta forma no sobrepasar nunca ese valor y, que en el mejor de los casos nunca será superior a 1023.

La salida del modulo CCP1 del PIC16F88 es configurable, esto quiere decir que se puede elegir entre dos posibles pin, RB0 y RB3, se elige uno u otro a través del registro de configuración de BIT (fuses) del micro.   
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:36:05
IMAGEN 1:

(http://img48.imageshack.us/img48/5521/registrosasociadosalpwmrs2.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:38:02
IMAGEN 2:

(http://img517.imageshack.us/img517/7194/graficodesalidapwmoutpugw2.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:42:42
Resumiendo:

Valor máximo del registro PR2 = 255 (periodo de la frecuencia elegida).
Valor máximo del registro CCPR1L+CCP1X:CCP1Y = 1023 (duty cycle elegido).
Prescaler del Timer2 = 1, 4 o 16.

PROGRAMA:

Código: Visual Basic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '********************** Placa Entrenadora (PIC EBadic) ***************************************
  5. 'NOMBRE:16F88_Pic_EBasic_LCD_CCP1_PWM_ADC
  6. 'MICRO: PIC16F88/8Mhz reloj interno
  7. 'Fecha/Autor: 6/08, By COS
  8. 'Version: 1.0
  9. 'Uso del modulo CCP1 trabajando en el modo PWM.
  10. '*********************************************************************************************
  11. '-------------------------------------Puertos del LCD-----------------------------------------
  12. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  13. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  14. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  15. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  16. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  17. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  18. Define LCD_EBIT = 6  'se usara el RB6 como E
  19. Define LCD_COMMANDUS = 1000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
  20. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  21. Define LCD_INITMS = 50  '[Tiempo de espera despues de inicializar el Display,
  22.                                                                                         'solo se ejecuta una vez en mseg.]
  23. '*********************************************************************************************
  24. Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms, solo simulacion
  25. '--------------------------------------Reasignacion de nombres--------------------------------
  26. Symbol led_amarillo = PORTA.7  'led amarillo
  27. Symbol led_verde = PORTB.0  'led verde
  28. Symbol luz_lcd = PORTB.3  'iluminacion del lcd
  29. '------------------------------------declaracion de variables---------------------------------
  30. Dim adc As Word  'contendra el valor de la entrada ADC trabajando a 10bit
  31. Dim duty_cycle As Word  'tiempo a On de la señal
  32. Dim calculo As Long  'variable auxiliar para calculos con 32bit
  33. '------------------------------------Definicion de puertos--------------------------------
  34. ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
  35. CMCON = 0x07  'comparador a off
  36. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Puerto A como salidas
  38. TRISB = 0x00  'puerto B como salidas
  39. TRISA.4 = 1  'como entrada (RA4, adc)
  40. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  41. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  42. PORTB.3 = 1  'luz lcd a on (RB3) y PWM (CCP1)
  43. PORTA.7 = 1  'led amarillo a off (RA7), negado
  44. PORTB.0 = 1  'led verde a off (RB0), negado
  45. '----------------------Inicializa el Timer2 y el modulo CCP1 en modo PWM-------------------------
  46. PR2 = %11111001  'periodo de la señal para 500Hz
  47. CCPR1L = %00000000  'comienza con valor 0 (RB3=0), maximo duty cycle 1111100111 = 999
  48. CCP1CON.CCP1X = 0
  49. CCP1CON.CCP1Y = 0
  50. CCP1CON.CCP1M3 = 1  'modo pwm
  51. CCP1CON.CCP1M2 = 1  'modo pwm
  52. T2CON.T2CKPS0 = 1  'prescaler, 1x = 1:16
  53. T2CON.T2CKPS1 = 1
  54. T2CON.TMR2ON = 1  'activa el Timer2
  55. '------------------------------------Inicio----------------------------------------------------
  56. Lcdinit  'inicializa el lcd sin cursor
  57. WaitMs 1000  'espera 1Seg
  58. Lcdout "Pruebas con CCP1"  'escribe en el lcd
  59. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  60. Lcdout "PWM MODE (CCP1)"  'escribe en el lcd
  61. WaitMs 3000  'espera 3Seg
  62. Lcdcmdout LcdLine1Clear  'borra el display,linea 1
  63. '------------------------------------rutina del Programa--------------------------------------
  64. main:  'comienza el programa principal
  65.         Adcin 4, adc  'lee la entrada analogica RA4 y guarda el valor en la variable adc
  66.         calculo = (adc * 999) / 1023  'calcula el valor del duty segun el valor leido en el adc
  67.         duty_cycle = calculo  'cambia de long a word
  68.         CCP1CON.CCP1X = duty_cycle.1  'carga bits menos significativos del duty
  69.         CCP1CON.CCP1Y = duty_cycle.0  'carga bits menos significativos del duty
  70.         duty_cycle = ShiftRight(duty_cycle, 2)  'desplaza la variable duty_cycle dos bit a la derecha
  71.         CCPR1L = duty_cycle  'carga los bit mas significativos del duty
  72.         calculo = (adc * 100) / 1023  'calcula el duty cycle en %
  73.         duty_cycle = calculo  'pasa de long a word
  74.         Lcdcmdout LcdLine1Home  'pone cursor del LCD al principio de linea
  75.         Lcdout "ADC ", #adc, " ", "DT %", #duty_cycle, "      "  'Inprime datos en el display
  76. Goto main  'impide que termine el programa principal
  77. End  'es conveniente ponerlo siempre segun el manual

PD. Donde decia '--------Inicializa las iterrupciones y el modulo CCP1 en modo comparador ---------
      ahora dice '-----------------Inicializa el Timer2 y el modulo CCP1 en modo PWM--------------------
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Junio de 2008, 19:43:44
Pendiente las formulas y el video... :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Julio de 2008, 21:19:47
Calculo de la frecuencia a generar por el modulo:

PR2 = ((1/Fr) / (4/Fosc * Prs)) -1
PR2 = ((1/500Hz) / (4/8000000Hz * 16)) –1
PR2 = 249 = 11111001Bin

Siendo:

Fr = Frecuencia deseada en Hz, en este caso 500Hz
Fosc = Frecuencia del Reloj del Pic en Hz, en este caso 8Mhz
4/Fosc = Tiempo de ejecución maquina
Prs = Prescaler del Timer2, puede tomar valores entre 1, 4 y 16, en este caso 16
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Julio de 2008, 07:06:42
Calculo del duty cycle máximo (100%):

PWM Duty Cycle = (1/Fr) / ((1/Fosc) * Prs)
(CCPR1L:CCP1CON<5:4>) = (1/Fr) / ((1/Fosc) * Prs)
(CCPR1L:CCP1CON<5:4>) = (1/500) / ((1/8000000Hz) * 16)
(CCPR1L:CCP1CON<5:4>) = 1000 = 1111101000Bin
Asignando el valor anterior:
CCPR1L = 11111010Bin
CCP1CON.CCP1X = 0Bin
CCP1CON.CCP1Y = 0Bin

Siendo:

Fr = Frecuencia deseada en Hz, en este caso 500Hz
Fosc = Frecuencia del Reloj del Pic en Hz, en este caso 8Mhz
4/Fosc = Tiempo de ejecución maquina
Prs = Prescaler del Timer2, puede tomar valores entre 1, 4 y 16, en este caso 16
(CCPR1L:CCP1CON<5:4>) = PWM Duty Cycle = Tiempo en estado alto de la señal
CCP1CON.5 = CCP1CON.CCP1X
CCP1CON.4 = CCP1CON.CCP1Y
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Julio de 2008, 07:29:27
Recordar:

Duty Cycle =0, Entonces la salida del modulo siempre estará a estado bajo

Duty Cycle >= 100%, en este caso 1000, Entonces la salida del modulo estará siempre a estado alto

Esto implica que a los valores máximo y mínimo no hay oscilación.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Julio de 2008, 15:14:16
Aqui dejo el video del ejemplo anterior:

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Julio de 2008, 15:30:13
Y aqui dejo el video de la simulacion, en este caso la simualcion y el hard estan de acuerdo:


Como no se ve muy bien en Youtube, para el que este realmente interesado lo puede descargar de aquí.

http://rapidshare.com/files/127929679/Pic_EBasic_CCP1.avi.html

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: fede1592 en 17 de Julio de 2008, 23:35:41
hola, miren yo tengo un problema con el pic simulator. miren yo hago el codigo en el pic basic todo re bien para manejar un lcd, y lo compilo y todo bien, pero cuando hago la simulacion siempre en el codigo se traba en la linea "lcdinit 1" :? y no se como arreglarlo. por favor si me pueden ayudar. gracias :lol:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Julio de 2008, 19:00:17
Publica tu codigo y te lo adapto para que puedas simularlo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: fede1592 en 19 de Julio de 2008, 13:55:48
mi codigo es:

Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 2
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

Lcdinit 1
loop:
Lcdcmdout LcdHome
Lcdout "hola"
Lcdcmdout LcdClear
Lcdcmdout LcdLine2Home
Lcdout "hola"
Lcdcmdout LcdClear
Goto loop
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: xocas en 19 de Julio de 2008, 14:08:12
a continuación de las líneas 'Define' que ya tienes, inserta estas:

Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.

en el menú Rate del Simulador selecciona al menos la opción 'Extremetely Fast' o 'Ultimate' si quieres que la simulación vaya más rápido y, claro está, asegúrate de que la configuración del lcd  del simulador se corresponde con la tuya. esto te lo permite 'autoconfigurar'. simplemente cuando abres el lcd te pregunta si quieres usar la definición del programa... le dices ok y listo

un saludo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Julio de 2008, 15:50:04
Código: FreeBasic
  1. 'EJEMPLO SOLO SIMULADOR
  2. 'PIC...?
  3.  
  4. Define CLOCK_FREQUENCY = 4
  5.  
  6. Define LCD_BITS = 4
  7. Define LCD_DREG = PORTB
  8. Define LCD_DBIT = 4
  9. Define LCD_RSREG = PORTB
  10. Define LCD_RSBIT = 3
  11. Define LCD_EREG = PORTB
  12. Define LCD_EBIT = 2
  13. 'Define LCD_RWREG = 0
  14. 'Define LCD_RWBIT = 0
  15.  
  16. Define LCD_COMMANDUS = 100  '2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
  17. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  18. Define LCD_INITMS = 2  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  19.  
  20. AllDigital
  21.  
  22. Lcdinit 1
  23.  
  24. loop:
  25.         Lcdcmdout LcdHome
  26.         Lcdout "hola MUNDO"
  27.         Lcdcmdout LcdClear
  28.         Lcdcmdout LcdLine2Home
  29.         Lcdout "hola MUNDO"
  30.         Lcdcmdout LcdClear
  31. Goto loop

Configurar:

Option/Change Ultimate Rate Refresh Interval = 2000 y habilitar Rate/Ultimate
y para hacelerar mas aun deshabilitar Basic Program Tracking
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: facundo_10 en 06 de Agosto de 2008, 01:32:45
Amigo tengo una pregunta, tengo algunos prolemas con a interfaz RS232..

Yo abro el puerto
Hseropen 9600

y me dedico a enviar..
El tema es que cuando recibo, recibo mal..
Mira yo hago esto:

dim dato as byte
dato = 7

hserout #dato, crlf

ahora en la pc, recibo con un programa llamado texter rs232... Ahora este programa tiene la capacidad de recibir en formato Ascii, Hex y Decimal.

Por lo tanto si yo le pongo que reciba en decimal, me tendria que mostrar un 7 , en hexadecimal un 7 y en ascii, el codigo ascii correspondiente..

Pero no es asi,, de la unica manera que muestra el 7 es en ascii..

En codigo Decimal me muestra:

055 010

Y en Hexadecimal me muestra:

37 0A

Que debo hacer ? Que debe estar pasando ?

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Agosto de 2008, 16:13:01
hserout #dato, crlf

El símbolo # hace que dato sea enviado en códigos ASCII.
por ejemplo si:
dato = 255
hserout #dato, enviaría tres códigos ASCII, cada uno correspondiente a cada digito del 255.

para conseguir lo que quieres solo tienes que suprimir el símbolo #
hserout dato, crlf, de esta forma se enviara el valor real de dato y así podrás configurar el terminal para que lo interprete como más te convenga.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: facundo_10 en 11 de Agosto de 2008, 21:17:48
Gracias por la pronta respuesta, y aqui traigo otra duda, con respecto a configurar la velocidad del spi..

Se puede esto ??

Es decir lo que necesito es configurar una frecuencia para el clock del modulo spi.
La frecuencia que necesito obtener mas oe menos es de aproximadamente 312Khz.

Sabe alguien si esto es posible en PSI, y sino de que manera se puede hacer?


Necesito usar instrucciones como esta, estas instrucciones son de Mikrobasic.. Son 100% necesarias para llevar a cabo un proyecto que implica el uso de Multimedia Cards (MMC).. Estos comandos se utilizan para configurar el SPI..

MASTER_OSC_DIV16          'Master Clock=Fosc/16

Creo que esta funcion lo que hace es dividir la frecuencia del cristal en 16... Es decir si se tiene un cristal de 8 mhz, nos dara 500khz...

DATA_SAMPLE_MIDDLE       ' Input data sampled in middle of the interval.

Esta funcion no se que hace.

CLK_IDLE_HIGH                 'Asume el reloj en estado alto..

Esta funcion si mal no recuerdo en PSI, se llama SPICLOCK_INVERT, ya que por defecto esta en estado bajo, para ponerlo en estado alto se necesita hacer:

DEFINE SPICLOCK_INVERT = 1

y como ultimo necesito esta funcion:

 LOW_2_HIGH  'Data transmit on low to high edge.

SI alguien sabe como introducir estas funciones en PSI, ya que me lei el manual, y no hay nada al respecto y creo que sin ellas, me es imposible continuar con el proyecto..

Un saludo!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Agosto de 2008, 17:27:48
La verdad es que no tengo ni idea sobre el tema... :shock:, voy a ver si puedo encontrar un rato e intento iluminarme... :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 13 de Agosto de 2008, 17:58:02
Que tal amigos!
Facundo me parece que si se puede pero debes utilizar el sspcon del mssp del pic que utilices y configuar el tmr2 para optener la frecuencia que deseas o lo mas cercana a ella, yo en este sub foro coloque algunos ejemplos del spi  :mrgreen:
Leete el data sheet respecto al modulo mssp en modo spi alli esta la informacion  :mrgreen:

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: facundo_10 en 13 de Agosto de 2008, 18:23:13
Hola si sabes que justamente iba a postear eso estuve leyendo y es necesario utilizar el sspcon del mssp del pic.

Al parecer este tiene varias configuraciones ....,

SSPCON = X

1- Fosc/64 \\\ 2-Fosc/16 \\\ 3-Fosc/4 \\\ 4- Fosc=timer2/2

Ahora lo de configurar el Tmr2, no lo tenia en cuenta quiza por eso este fallando.

Ademas para activar el modulo mssp debo utilizar el comando:

SSPEN = 1

Me podrias facilitar el link donde dejaste la informacion ? seria de mucha ayuda, te comento que intento inicializar una MMC. Por lo cual necesito el SPI a una frecuencia de no mas de 400 khz y no menos de 200. Lo recomendado es de 312 Khz, por lo cual con un cristal de 20mhz dividiendolo por 64, me quedaria justo..

Si te queres sumar al proyecto tambien estaria muy bueno, te dejo el link...

http://www.todopic.com.ar/foros/index.php?topic=22729.0

Un saludo!!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 13 de Agosto de 2008, 18:46:59
No pueder ser mi pana no has visto el material que me tomo 4 años llevar a cabo, para compartirlo con todos ustedes  :8} :8} :8} :8} :8} :5]

jajajaja es broma  :mrgreen:

Aqui lo tienes
http://www.todopic.com.ar/foros/index.php?topic=22611.0

Voy a poner dos ejemplos mas y cierro el tema  :mrgreen:

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: facundo_10 en 13 de Agosto de 2008, 20:28:11
Ralf2 siento no haberlos visto antes  :D, no te enojes jejje  :lol:...

Yo tengo algun que otro ejemplito para usar SPI con un pote digital MCP41010, creados por mi, si los quieres para subir te los podria pasar. Como tu desees amigo..

Ahora mismo estoy viendo los ejemplos haber que tal van..

Un saludo!!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RALF2 en 13 de Agosto de 2008, 20:46:12
 :D :D
No pana no me moleste para nada  :mrgreen:

Reviza los ejemplos voy a colocar unos mas!

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Agosto de 2008, 16:33:52
Encender un led distinto por cada pulsación de tecla que ingrese en un mismo pin.
Con la primera pulsación de tecla se activa un temporizador no redisparable que nos permitirá ir sumando pulsaciones hasta terminar su tiempo preestablecido. Terminado este temporizador se encenderá el led que tenga asignadas el numero de pulsaciones contabilizadas, el led permanecerá encendido durante 0.5Seg. El tiempo que tendremos para pulsar repetidas veces la tecla será de 5Seg.

Se tiene que cumplir que:

Si se pulsa una vez la tecla, se encenderá el led rojo a la terminación del temporizador no redisperable.

Si se pulsa dos veces la tecla, se encenderá el led amarillo a la terminación del temporizador no redisparable.

Si se pula tres veces la tecla, se encenderá el led verde a la terminación del mismo temporizador anterior.

Terminado el tiempo de activación del led vuelve a empezar la rutina, queda a la espera de que se vuelva a ingresar por el mismo pin la secuencia de pulsos deseada.

Si se deja la tecla pulsada todo el tiempo se entiende como una sola pulsación.

Cada vez que se pulse la tecla se encenderá un led azul indicando el estado de la misma.

Como tarea adicional se tendrá un led parpadeando con una cadencia de 0.5Seg, ambos estados iguales. El led será de color rojo y su cadencia de parpadeo no puede verse afectada por el resto del programa.

Se definió en el programa lo siguiente para conseguir el objetivo:

Se creo una base de tiempo de 10mSeg. en ella se basaran todos los timer => Waitms 10.
Si la base de tiempos se hace muy elevada en tiempo se entorpecerá a cualquier tarea adicional que queramos posteriormente asignarle al microcontrolador.

Se creó un contador para contabilizar el numero de pulsaciones => contador_1.

Se creó un timer para establecer un tiempo entre pulsación y pulsación de tecla (validación de la pulsación) => contador_2.

Se creó un timer para establecer el tiempo del temporizador no redisparable => contador_3.

Se creó un timer para establecer el tiempo del temporizador que mantiene el led seleccionado a on => contador_4.

Se creó un timer para establecer el tiempo que la tarea adicional del led intermitente determina su estado => contador_5.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Agosto de 2008, 16:38:49
Mi solucion:

Código: [Seleccionar]
'***********Solo para simulación ********************************
'Nombre: Ejemplo 30
'VERSION: 1.0
'MICRO: PIC16f88
'FECHA/AUTOR: 08/08 - By COS, PSI v7.41
'Encender un led distinto por cada pulsación de tecla que ingrese en un mismo pin.
'Programación tradicional (subrutinas).
'Uso de bases de tiempos sin uso de interrupciones.
'***********************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Modo simulación, acelera los WaitMs
'Definicion de puertos
'Asignacion de I/O y valores de inicio de las salidas
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.0 = 1  'Como entrada tecla_1 = 0 pulsada
PORTB.0 = 0  'Luz lcd Rojo a off
PORTB.1 = 0  'Led amarillo a off
PORTB.2 = 0  'Led verde a off
PORTB.3 = 0  'Led azul estado tecla, led off tecla abierta y led on tecla cerrada
PORTB.4 = 0  'Led rojo_2 a off
'Asignacion de nombres a pin
Symbol tecla_1 = PORTA.0
Symbol led_rojo = PORTB.0
Symbol led_amarillo = PORTB.1
Symbol led_verde = PORTB.2
Symbol sw = PORTB.3
Symbol led_rojo_2 = PORTB.4
'Variables generales (globales)
Dim t_1 As Byte  'Guarda el estado de la tecla, 0 libre, 1 pulsada
Dim contador_1 As Byte  'Contador para control de pulsaciones
Dim contador_2 As Byte  'Controla la repetición de la tecla
Dim contador_3 As Word  'Contador para el control del tiempo
Dim contador_4 As Word  'Contador para el control del tiempo
Dim contador_5 As Word  'Contador para control del tiempo
Dim tiempo_contador_2 As Byte  'Limite del contador
Dim tiempo_contador_3 As Word  'Limite del contador
Dim tiempo_contador_4 As Word  'Limite del contador
Dim tiempo_contador_5 As Word  'Limite del contador
Dim n_led_rojo As Byte  'Numero de pulsaciones para led rojo
Dim n_led_amarillo As Byte  'Numero de pulsaciones para led amarillo
Dim n_led_verde As Byte  'Numero de pulsaciones para activar led verde
Dim on_contador_2 As Bit  'Activa contador =1
Dim on_contador_3 As Bit  'Activa contador =1
Dim on_contador_4 As Bit  'Activa contador =1
Dim flag_t_1 As Bit  'Se utiliza para saber que la tecla no sigue pulsada
'Asignaciones
t_1 = 0
contador_1 = 0
contador_2 = 0
contador_3 = 0
tiempo_contador_2 = 200  '(20 valor real = 200mSeg.), pasos de 10mSeg.
tiempo_contador_3 = 500  '(500 valor real = 5 Seg.), pasos de 10mSeg.
tiempo_contador_4 = 50  '(50 valor real = 0.5 Seg.), pasos de 10mSeg.
tiempo_contador_5 = 50  '(50 valor real = 0.5 Seg.), pasos de 10mSeg.
n_led_rojo = 1
n_led_amarillo = 2
n_led_verde = 3
on_contador_2 = 0
on_contador_3 = 0
on_contador_4 = 0
flag_t_1 = 0
WaitMs 1000  'Espera 1Seg
'------Main Programa----------------------------------------
main:
WaitMs 10  'Parada absoluta de 10mSeg., base de tiempos del sistema
Gosub estado_led_tecla  'Control led tecla
Gosub bases_tiempos  'Control de los temporizadores y contadores
'*********Aqui podemos insertarle otra tarea al micro *******************
'____Control de un led rojo intermitente, 0.5Seg. a On y 0.5 a Off
If contador_5 >= tiempo_contador_5 Then  'Control led intermitente
Toggle led_rojo_2  'Invierte el estado del pin
contador_5 = 0  'Inicializa la base de tiempos
Endif
'____
'***********************************************************************
Gosub control_tecla  'Conjunto de rutinas de control de pulsacion
Gosub control_led  'Conjunto de rutinas que activan el led seleccionado durante un tiempo
Goto main  'Impide que termine el main
End                                               
'*********************** SUBRRUTINAS **********************************
control_tecla:
If on_contador_4 = 0 Then  'Si se cumple queda bloqueado hasta la nueva secuencia
Gosub lee_tecla  'Estado de la tecla
If t_1 = 1 Then Gosub evento_tecla  'Validación de la pulsación y activa evento tecla
Endif
Return                                           
lee_tecla:  'Detecta tecla pulsada
If tecla_1 = 0 And t_1 = 0 And flag_t_1 = 0 Then  'Si se pulsa la tecla:
t_1 = 1  'Activa evento tecla
on_contador_2 = 1  'Inicializa el contador anti-rebotes de la tecla
on_contador_3 = 1  'Inicializa el contador del tiempo general de la rutina
Endif
Return                                           
evento_tecla:  'Reaccion al pulsar la tecla
If t_1 = 1 And contador_2 >= tiempo_contador_2 Then  '_Si se solto la tecla
'_______________________________________ y si se pulso la tecla anteriormente
'_______________________________________ y pulsacion valida a los 200mseg
contador_1 = contador_1 + 1  'Incrementa el numero de pulsaciones validas
t_1 = 0  'Termino el evento pulsar tecla
flag_t_1 = 1  'Indica si la tecla se mantiene pulsada
contador_2 = 0  'Inicializa contador anti-rebotes
on_contador_2 = 0  'Stop contador
Endif
Return                                           
control_led:  'Controla el tiempo en el que el led seleccionado estara activo
If on_contador_4 = 0 Then Gosub control_leds_on  'Control led a on
If on_contador_4 = 1 Then Gosub control_leds_off  'Control led a off
Return                                           
control_leds_on:  'Control led a on
If on_contador_3 = 1 And contador_3 >= tiempo_contador_3 Then
If contador_1 = n_led_rojo Then led_rojo = 1  'Si se cumple activa led rojo
If contador_1 = n_led_amarillo Then led_amarillo = 1  'Si se cumple activa led amarillo
If contador_1 = n_led_verde Then led_verde = 1  'Si se cumple activa led verde
on_contador_4 = 1  'Activa contador
contador_4 = 0  'Inicializa contador
on_contador_2 = 0  'Stop contador
contador_2 = 0  'Inicializa contador
on_contador_3 = 0  'Stop contador
contador_3 = 0  'Inicializa contador
Endif
Return                                           
control_leds_off:  'Control led a off
If on_contador_4 = 1 And contador_4 >= tiempo_contador_4 Then
led_rojo = 0  'Apaga led rojo
led_amarillo = 0  'Apaga led amarillo
led_verde = 0  'Apaga led verde
on_contador_4 = 0  'Stop contador
contador_1 = 0  'Reset contador
contador_2 = 0  'Reset contador
on_contador_2 = 0  'Stop contador
t_1 = 0  'Se liveraliza, desactiva evento_tecla
flag_t_1 = 0  'Se permite repetir tecla si sigue pulsada
Endif
Return                                           
estado_led_tecla:  'Indicacion luminosa del estado de la tecla
If tecla_1 = 1 Then  'Si la tecla no esta pulsada
sw = 0  'Tecla no pulsada, led azul a off
flag_t_1 = 0  'Se dejo de pulsar la tecla
Endif
If tecla_1 = 0 Then sw = 1  'Tecla pulsada, led azul a on
Return                                           
bases_tiempos:  'Contadores y bases de tiempos
If on_contador_2 = 1 Then contador_2 = contador_2 + 1  'Contador del retardo de la tecla, pasos de 10mSeg.
If on_contador_3 = 1 Then contador_3 = contador_3 + 1  'Contador que se puede repetir la tecla, pasos de 10mSeg.
If on_contador_4 = 1 Then contador_4 = contador_4 + 1  'Contador que controla los leds, pasos de 10mSEg.
If contador_5 < tiempo_contador_5 Then contador_5 = contador_5 + 1  'Contador que controla led intermitente
Return                                         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Agosto de 2008, 16:49:22
El video de la simulación pulsando dos veces la tecla,  hay que tener encuenta que en el arranque de la simulacion la tecla sale pulsada.

http://rapidshare.com/files/138307688/Ejemplo_Seleccion_Led.avi.html

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Septiembre de 2008, 22:26:23
Quedó actualizado el índice hasta la fecha de hoy
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Septiembre de 2008, 12:06:03
-Dudas:

Se me queda bloqueada un hard con comunicación UAR y el WDT no me lo inicializa y, cuando hago un reset mediante el pin MCLR la placa reinicia bien.
¿El WDT genera un reset incluso si el micro salto al vector de interrupciones?

-Hay dos posibilidades que pueden provocar ese tipo de bloqueo:

1ª El WDT genera un reset no importando lo que este haciendo el micro en ese momento.
Para comprobar que el WDT está operativo solo se tiene que activar el modulo sin refrescarlo en el programa, por lo que tendremos reset de forma continua y se vera si esta funcionando. A la hora de refrescar el WDT en el programa, este reinicio de WDT no se puede colocar nunca en el vector de interrupciones, y colocar el reinicio el numero menor de veces posible. Algo que puede estar sucediendo es que el programa queda bloqueado en una rutina y esa rutina también tiene la instrucción de reset a WDT por lo que este nunca llega a su rebose, esto implica que el micro no tiene un bloqueo técnico o absoluto tan solo se queda en algún bucle infinito del programa.

2ª Otra posibilidad es que se bloquea el puerto USART de la placa en modo Rx y por lo tanto no recibe ningún tipo de dato más. Esto sucede si la UAR recibe los datos más rápido de lo que se extraen, entonces activa el flag de error y queda bloqueada la UAR en modo Rx hasta que se desbloquee mediante una rutina especial que tenemos que implementar en nuestro programa que es activada al verificar el flag de error UAR.

PD. En el índice hay varios ejemplos relacionados con WDT y USART con su control de errores más comunes.
      WDT = Watchdog
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Octubre de 2008, 17:17:27
¿Que efecto causa el MCLR sobre el PIC y el módulo USART del PIC?

El MCLR es un pin que genera un borrado y reinicio en caliente de todos los registro de los módulos de los que está compuesto el micro incluyendo el contador de programa, de esto se deduce que la USART quedara operativa de nuevo. Viene a ser parecido a quitar y volver a dar la alimentación a nuestro circuito. Y no tiene nada que ver con la gestión de errores de los módulos del PIC en tiempo de ejecución. El MCLR no afecta a periféricos exteriores o dispositivos también exteriores al PIC, tampoco afecta a los datos almacenados en la memoria FLASH o EEPROM internas del  PIC ni Ram usuario. De todo esto se deduce que la mayoría de los valores de las variables que por lo general usan la memoria RAM del micro no se perderán después de ejecutar un MCLR, pero como se genera un reinicio estos valores pueden ser borrados si el programador lo tuvo en cuenta o también si el compilador usado da esta posibilidad, suele ser una opción.

Esta sencilla rutina es la que utilizo para controlar el modulo USART del PIC en modo RX.

'_Borra el error del puerto serie en Rx
   If RCSTA.OERR = 1 Then
      RCSTA.OERR = 0
      RCSTA.CREN = 0
      RCSTA.CREN = 1
                ENDIF
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 08 de Octubre de 2008, 04:53:06
Hola a todos os paso este programa y os explico, este programa, de momento "pretende" controlar un mando de slot.

Mi idea es que el mando genere una señal de pulsos segun una lectura del ADC1, esta señal de pulsos tiene la posibilidad de ser ser modificada segun unas curvas preestablecidas, y a la vez estas curvas pueden ser modificadas por el ADC0 que permite variar el centro de la curva, y ADC5 que permite variar los valores iniciales.

Rb2, RB3, RB4,Y RB5 corresponden a la entrada de un selector hexadecimal

Deciros que es la primera vez que hago un programa para pic, y aunque inicialmente mi idea hacer un mando mucho mas completo( con un LCD para mostrar la informacion, y comunicacion con el PC), primero me decidi por hacerlo mas sencillo e ir por pasos.

Desde que lo inicie hasta ahora he reducido casi una tercera parte el codigo del programa, pero estoy seguro que hay muchas cosas a mejorar.

Entre ellas no consigo que en la posicion de "Gatillo" < 16 el pwm quede a 0 realmente y queda algo de señal
PWM 1, 12  ¿a que frecuencia trabaja realmente?, me interesa trabajar a una frecuencia alta, pues la respuesta en bajos de los motores dicen que es mejor.
Seria posible revisar los ADC0 y ADC5 por algun sistema de interrupciones ?


Os rogaria que me comenteseis cualquier cosa que pueda mejorar

Código: [Seleccionar]
'********************************** *********************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 1.0
''*****************************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
Define ADC_SAMPLEUS = 10
Define ADC_CLOCK = 5





Dim duty(16) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Byte  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte


ANSEL = %00100011
TRISB = %11110111
TRISA = %11111111

'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque


PWMon 1, 12
PWMduty 1, 0

'****************************************************************************
'Rutina principal
loop:

Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
'* Leer gatillo
Gosub salidapwm

Adcin 0, mcn  'lee el valor de p5

If mcn <> mca Then Gosub modificarcurva

'* Leer gatillo
Gosub salidapwm

Adcin 5, asn  'lee el valor de p4

If asn <> asa Then Gosub modificararranque

'* Leer gatillo
Gosub salidapwm

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.5 = 1 Then cn = cn + 8

ai = cn * 16  'Posicion inicial de memoria donde leer
af = ai + 14  'Posicion final de memoria donde leer

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           

'********************************************************************************************
'Rutina deteccion posicion del gatillo y entrega de potencia
salidapwm:
For a = 1 To 8

Adcin 1, vg  'lee el valor del gatillo

Select Case vg
Case < 16
PWMduty 1, 0  'Freno
Case < 32
PWMduty 1, duty(0)
Case < 48
PWMduty 1, duty(1)
Case < 64
PWMduty 1, duty(2)
Case < 80
PWMduty 1, duty(3)
Case < 96
PWMduty 1, duty(4)
Case < 112
PWMduty 1, duty(5)
Case < 128
PWMduty 1, duty(6)
Case < 144
PWMduty 1, duty(7)
Case < 160
PWMduty 1, duty(8)
Case < 176
PWMduty 1, duty(9)
Case < 192
PWMduty 1, duty(10)
Case < 208
PWMduty 1, duty(11)
Case < 224
PWMduty 1, duty(12)
Case < 240
PWMduty 1, duty(13)
Case <= 255
PWMduty 1, duty(14)
EndSelect

Next a

Return                                           

'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)

mca = mcn
Return

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

EndSelect

Return                                           


'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return

EndSelect

Return                                           


PD:Por cierto como hay que insertar el codigo para que aparezcan las lineas
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Octubre de 2008, 17:10:16
Para insertar el código con números de línea y en colores varios solo tienes que cambiar GeSHi por otro cualquiera de la lista, suelo utilizar últimamente el Visual Basic.NET

Sobre el programa veo que utilizas la función “ADCIN”, esta función devuelve un valor de hasta 10bit, por lo que tienes que declarar sus variables de salida como Word. Cambialas en el programa y observa que es lo que sucede. Mientras sigo revisándolo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Octubre de 2008, 19:06:09
Aqui dejo un ejemplo del uso del modulo ADC a 8 Bit utilizando las interrupciones:

Código: vb.net
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '******************* Probado solo en Simulacion ***************************************************
  5. '********************************** PIC Entrenadora BASIC (PicEBasic)******************************
  6. 'NOMBRE: 16F88_Pic_EBasic_Ejemplo_27.1
  7. 'MICRO: PIC16f88A
  8. 'FECHA/AUTOR: 08/07 - By COS
  9. 'Version: 1.0
  10. 'Estudio del modulo ADC
  11. '*****************************************************************************************************
  12. '-------------------------------------Puertos del LCD---------------------------------------------
  13. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  14. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  15. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  16. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  17. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  18. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  19. Define LCD_EBIT = 6  'se usara el RB6 como E
  20. Define LCD_COMMANDUS = 500  '2000 Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 5  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  23. '------------------------------------------------------------------------------------------------------
  24. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  25. '******************************************************************************************************
  26. '_____Variables
  27. Dim adc_4 As Byte  'contendra el valor de la entrada del ADC
  28. '_____ASIGNACION DE I/O y valores de inicio de las salidas, configracion ADC
  29.  
  30. ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
  31. CMCON = 0x07  'comparador a off
  32. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  33. TRISA = 0x00  'Puerto A como salidas
  34. TRISB = 0x00  'puerto B como salidas
  35. TRISA.4 = 1  'como entrada (RA4, adc)
  36. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  37. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  38. PORTB.3 = 1  'luz lcd a on (RB3)
  39. PORTA.7 = 1  'led amarillo a off
  40. PORTB.0 = 1  'led verde a off
  41.  
  42. 'Configura modo de trabajo del adc
  43. ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.5uSeg), channel RA4, Power on ADC (ADON)
  44. ADCON1 = %01000000  'V. Ref. (AVdd/AVss) y seleccion escala division clock/2 ADCON1.ADCS2=1 y 8Bit ADC (ADFM)
  45. PIR1.ADIF = 0  'Borrado bit de salto adc
  46. PIE1.ADIE = 1  'Activa interrupciones adc
  47.  
  48. 'Activa las interrupciones
  49. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  50. Enable  'INTCON.GIE habilita todas las interrupciones globales
  51.  
  52. '_____ Inicio
  53. Lcdinit  'inicializa el lcd sin cursor
  54. WaitMs 500  'espera para que inicialice el lcd
  55.  
  56. main:  'Rutina principal ------------------------------------------
  57.  
  58.         ADCON0.GO = 1  'A/D conversion en progreso
  59.         WaitMs 100  'hace una pausa
  60.         Lcdcmdout LcdLine1Home  'cursor del lcd alprincipio de linea 1
  61.         Lcdout "ADC ", #adc_4, "   "  'muestra los valores en el lcd
  62.  
  63. Goto main
  64. End                                              
  65.  
  66. 'Rutina de interrupciones
  67. On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
  68.         Save System  'Guarda valores intermedios del sistema
  69.         adc_4 = ADRESH  'valor mas significativo de la lectura del ADC (8 bit)
  70.         PIR1.ADIF = 0  'Borrado bit de salto adc
  71. Resume  'retorna despues de la interrupcion, activa las interrupciones
  72. 'FIN

PD. El caso de modificar la configuración del modulo ADC en tiempo de ejecución, hay que dejar unos uSeg. de tiempo de estabilizacion antes de activar una nueva lectura, entre 5 a 10uSeg.
Si no se respeta este tiempo la lectura puede ser erronea.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 09 de Octubre de 2008, 19:36:19
Usando el ADC del gatillo como word se me reduce el tiempo de ejecucion, durante un proceso de 13 ciclos (pongo un bucle dentro de la rutina loop: para realizar trece ciclos), se reduce en 600 us.

¿Es que funciona mejor usando los 10 bits ?
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: huesonardo en 11 de Octubre de 2008, 22:58:16
Hola tengo el siguiete problema:
quiero generar un cambio de estado en un pin cada 244µs por lo que configuré el TMR2 con el prescale en 1:1 y el postcale en 1:5. Tengo un PIC16F877A con un cristal de 20Mhz por lo que el calculo me dio

Periodo = (1/20Mhz)x4x244x1x5 =244µs

pero al implementarlo o simularlo en el Pic Simulator IDE la interrupción ocurre solo una vez

¿alguna idea?

Saludos cordiales y agradecimientos a dogflu66 por contestar todas mis dudas...

Código: [Seleccionar]
Define CONF_WORD = 0x3f72

AllDigital
TRISA = 0x00 'PORTA Outputs
INTCON.GIE = 1 'Int General
INTCON.PEIE = 1 'Int Perifericos
PIE1.TMR2IE = 1 'Int TMR2
T2CON.T2CKPS0 = 0 'TMR2 Prescale
T2CON.T2CKPS1 = 0 'TMR2 Prescale
T2CON.TOUTPS0 = 0 'TMR2 Postcale
T2CON.TOUTPS1 = 0 'TMR2 Postcale
T2CON.TOUTPS2 = 1 'TMR2 Postcale
T2CON.TOUTPS3 = 0 'TMR2 Postcale
PR2 = 244 'Overload TMR2
T2CON.TMR2ON = 1 'TMR2 ON
End                                               

On Interrupt

PORTA.0 = Not PORTA.0

PIE1.TMR2IF = 0

Resume 
 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Octubre de 2008, 12:39:16
Usando el ADC del gatillo como word se me reduce el tiempo de ejecucion, durante un proceso de 13 ciclos (pongo un bucle dentro de la rutina loop: para realizar trece ciclos), se reduce en 600 us.

¿Es que funciona mejor usando los 10 bits ?

Por desgracia no tengo el suficiente tiempo como para analizar de forma completa todos los programas de una forma minuciosa. Pero si te puedo decir lo siguiente:

Cuanto mayor es el numero de BIT de la conversión más pequeños son los pasos, por lo tanto se obtienen movimientos o ajustes mas finos. Que el programa funcione seria maravilloso, pero no puedes seguir trabajando en un programa mientras que las bases contengan errores. Mira lo siguiente:


ADCIN es una función que genera un valor de 10bit, ósea 2 Byte que en este lenguaje equivale a una variable tipo Word.

Por lo tanto no se puede asignar a ADCIN una variable de distinto tipo en este caso una variable de 8bit, ósea 1byte que en este lenguaje se define como Byte.

Si sigues asignado el valor que retorna ADCIN a una variable de 1byte, estas perdiendo los 2 BIT mas significativos de la conversión del ADC, por lo tanto ADCIN el valor máximo que puede suministrar es de 1023, ósea 10bit, solo tienes que hacer unos pequeños cálculos y veras que si suprimes los 2 primeros BIT de esos 10bit veras que estas perdiendo y truncando la mayor parte de los valores de la conversión ADC.

Una vez que tienes la conversión en una variable adecuada tienes que ver en la tabla del manual la resolución del pwm para ver cual es la que esta utilizando. Si la resolución es también de 10bit no hay problema los tipos de datos coinciden tan solo tendrás que modificar tu programa para que trabaje correctamente con los nuevos valores. Y si la resolución no es la adecuada según la tabla tendrás que cambiar de tipo el valor obtenido del adc hasta que coincida con la resolución del pmw.

Cambio de tipo a 8 BIT:

Por lo tanto necesitas hacer un calculo intermedio para pasar de 10bit, que es una mayor resolución, a 8 BIT que es menor. El calculo es muy simple y seria el siguiente:
Dim mcn_1 as word
Dim mcn as byte
Dim variable_aux as long ‘Variable auxiliar par a realizar cálculos largos
Adcin 0, mcn_1
Variable_aux = (255*mcn_1) /1023
Mcn = variable_aux
El problema de este calculo es que necesita variables de tipo Long ya que durante la operación salen valores intermedios superiores a 16bit.

Puedes simplificar la formula de la siguiente forma:

Dim mcn_1 as word
Dim mcn as byte
Adcin 0, mcn_1
Mcn_1 =(10*mcn_1)/1023
Mcn =  mcn_1
El problema en este caso esta en que nunca lograras el valor máximo de la escala que a 8 BIT es de 255, llegara a un valor máximo de 249.5 aproximadamente.

Y otra solución es la de perder los 2 BIT menos significativos de los 10bit de la conversión ADC:

Dim mcn_1 as word
Dim mcn as byte
Adcin 0, mcn_1
Mcn_1 = shiftright(mcn_1,2) ‘Desplaza los BIT de una variable 2 lugares a la derecha y estos se pierden al estar en el extremo.
Mcn= mcn_1

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 12 de Octubre de 2008, 15:20:56
Gracias por tu tiempo y comentarios. Como ya te he dico soy novato en el tema y cualquier aportacion es de agradecer.

Decirte que tal como esta el programa el mando me funciona "creo que bastante bien", no obstante queria reducir el tiempo de ejecucion para que fuera mas fiable.

Por tanto tomo nota del ejemplo que me has enviado y de los comentarios que me has pasado

Gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Octubre de 2008, 15:40:37
ADCIN  es una función muy lenta, puedes acelerar notablemente la lectura de ADC utilizando la rutina que te deje anteriormente.
La deje para trabajar a 8bit directamente, solo tienes que cambar 1bit para que trabaje a 10bit si lo prefieres. Y realmente conseguirás acelerar mucho.

Aqui tienes lo necesario para hacerlos:
http://www.todopic.com.ar/foros/index.php?topic=14917.msg126721#msg126721
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Octubre de 2008, 21:03:01
Hola tengo el siguiete problema:
quiero generar un cambio de estado en un pin cada 244µs por lo que configuré el TMR2 con el prescale en 1:1 y el postcale en 1:5. Tengo un PIC16F877A con un cristal de 20Mhz por lo que el calculo me dio

Periodo = (1/20Mhz)x4x244x1x5 =244µs

pero al implementarlo o simularlo en el Pic Simulator IDE la interrupción ocurre solo una vez

¿alguna idea?

Saludos cordiales y agradecimientos a dogflu66 por contestar todas mis dudas...

Código: [Seleccionar]
Define CONF_WORD = 0x3f72

AllDigital
TRISA = 0x00 'PORTA Outputs
INTCON.GIE = 1 'Int General
INTCON.PEIE = 1 'Int Perifericos
PIE1.TMR2IE = 1 'Int TMR2
T2CON.T2CKPS0 = 0 'TMR2 Prescale
T2CON.T2CKPS1 = 0 'TMR2 Prescale
T2CON.TOUTPS0 = 0 'TMR2 Postcale
T2CON.TOUTPS1 = 0 'TMR2 Postcale
T2CON.TOUTPS2 = 1 'TMR2 Postcale
T2CON.TOUTPS3 = 0 'TMR2 Postcale
PR2 = 244 'Overload TMR2
T2CON.TMR2ON = 1 'TMR2 ON
End                                               

On Interrupt

PORTA.0 = Not PORTA.0

PIE1.TMR2IF = 0

Resume 
 


Cambia "PIE1.TMR2IF = 0" por "PIR1.TMR2IF = 0", y nos cuentas.

PD. Recuerda añadir el MAIN al programa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Octubre de 2008, 21:05:56
Programa basico de configuracion del TMR2 probado en la EBasic:

Cuando se iguala el contador interno del TIMER2 con el valor del registro almacenado en PR2 se produce la interrupción.
TMR2 = PR2 => Interrupción TIMER2. Recordar que TIMER2 no tiene interrupción típica por desbordamiento de su contador.
Como podemos deducir de lo expuesto, la que tiene es por comparación.

T2CON.TMR2ON podríamos decir que hace la función de interruptor sobre el modulo TIMER2, de esta forma si lo apagamos
"T2CON.TMR2ON = 0", cuando nuestro programa no lo está utilizando, disminuimos el consumo del micro. Este BIT no afecta a la
configuración del TIMER2, por lo que no hay que reconfigurar el timer si no es necesario.

El contador del TMR2 es de 8bit y tiene un prescaler y poscaler, ambos dividen por un máximo de 16 pero con distinto numero de bit para su configuración.
La formula para calcular el tiempo en que el módulo genera la interrupción es la siguiente, valor a cargar en el registro PR2:

   PR2 = 256 - (((Tiempo Deseado en uSeg. / (4/8Mhz)) / (Prescaler * Poscaler)) -1)
   Se entiende que 8Mhz es el valor del reloj utilizado.
   Si ((Tiempo Deseado en uSeg. / (4/8Mhz)) / (Prescaler * Poscaler)) -1 es mayor al valor superior del registro del timer + 1, hay que volver a realizar la operación subiendo el valor de  (Prescaler * Poscaler).

Observación: Si se utiliza el modulo CCP trabajando en modo "PWM" hay que usar otro TMR, porque el modulo CCP (PWM) necesita del TMR2 para poder funcionar,
y cuando trabaja el modulo CCP en modo "captura" o en modo "comparador" utiliza el TMR1.

Código: [Seleccionar]
'**********************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación, acelera los comandos WaitMs
'Definicion de puertos-----------------
ANSEL = 0x00  'Los pin I/O digitales (no analogicos)
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'Comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'Config TMR2
'No prescaler :1
T2CON.T2CKPS0 = 0  'TMR2 Prescaler
T2CON.T2CKPS1 = 0  'TMR2 Prescaler
'Postscaler :16
T2CON.TOUTPS0 = 1  'TMR2 Postcaler
T2CON.TOUTPS1 = 1  'TMR2 Postcaler
T2CON.TOUTPS2 = 1  'TMR2 Postcaler
T2CON.TOUTPS3 = 1  'TMR2 Postcaler
PIE1.TMR2IE = 1  'Int TMR2
INTCON.PEIE = 1  'Int Perifericos
'PR2 = ((1000uSeg. / (4/8Mhz)) / (1 x 16) -1 = 124
PR2 = 124  'Overload TMR2, 1mSeg.
T2CON.TMR2ON = 1  'TMR2 ON
Enable  'INTCON.GIE = 1  'Interrupción General
'-----------------------------------------------
'Bucle rutina principal
main:
'Cambia de estado el led cada 500mSeg.
Toggle RA7
WaitMs 500
Goto main
End                                               
'------------------------------------------------
'Subrutina de control Interrupciones
On Interrupt
Save System
'Cambia de estado el led cada 500mSeg.
Dim _contador As Word
_contador = _contador + 1
If _contador >= 500 Then
Toggle RB0
_contador = 0
Endif
PIR1.TMR2IF = 0
Resume                   

Se puede observar que el parpadeo de ambos leds al principio esta sincronizado, pero pronto dejan de estarlo. El motivo de esto es porque
la rutina de interrupciones le roba tiempo a la rutina principal, y todo el código que está en ella se ralentiza algunos centenares de uSeg., justamente
el mismo tiempo que tarda en ejecutarse el código que hay dentro de la rutina de interrupción y algunos uSeg. más de gestión y control para llegar
a la rutina de interrupción y volver.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: huesonardo en 13 de Octubre de 2008, 00:21:06
Hola tengo el siguiete problema:
quiero generar un cambio de estado en un pin cada 244µs por lo que configuré el TMR2 con el prescale en 1:1 y el postcale en 1:5. Tengo un PIC16F877A con un cristal de 20Mhz por lo que el calculo me dio

Periodo = (1/20Mhz)x4x244x1x5 =244µs

pero al implementarlo o simularlo en el Pic Simulator IDE la interrupción ocurre solo una vez

¿alguna idea?

Saludos cordiales y agradecimientos a dogflu66 por contestar todas mis dudas...

Código: [Seleccionar]
Define CONF_WORD = 0x3f72

AllDigital
TRISA = 0x00 'PORTA Outputs
INTCON.GIE = 1 'Int General
INTCON.PEIE = 1 'Int Perifericos
PIE1.TMR2IE = 1 'Int TMR2
T2CON.T2CKPS0 = 0 'TMR2 Prescale
T2CON.T2CKPS1 = 0 'TMR2 Prescale
T2CON.TOUTPS0 = 0 'TMR2 Postcale
T2CON.TOUTPS1 = 0 'TMR2 Postcale
T2CON.TOUTPS2 = 1 'TMR2 Postcale
T2CON.TOUTPS3 = 0 'TMR2 Postcale
PR2 = 244 'Overload TMR2
T2CON.TMR2ON = 1 'TMR2 ON
End                                               

On Interrupt

PORTA.0 = Not PORTA.0

PIE1.TMR2IF = 0

Resume 
 


Cambia "PIE1.TMR2IF = 0" por "PIR1.TMR2IF = 0", y nos cuentas.

PD. Recuerda añadir el MAIN al programa.

cambié el "PIE1.TMR2IF = 0" por "PIR1.TMR2IF = 0" y todo funcionó un millón de gracias.... =)  :-/

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Octubre de 2008, 10:01:54
Me alegro mucho que funcionara...  :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Octubre de 2008, 10:10:14
Gracias por tu tiempo y comentarios. Como ya te he dico soy novato en el tema y cualquier aportacion es de agradecer.

Decirte que tal como esta el programa el mando me funciona "creo que bastante bien", no obstante queria reducir el tiempo de ejecucion para que fuera mas fiable.

Por tanto tomo nota del ejemplo que me has enviado y de los comentarios que me has pasado

Gracias

La configuracin del ADCIN que utilizas tarda aprox. 51uSeg. en darte la lectura.

Esta que te dejo tarda entre 30 a 31 uSeg. aprox. en hacer la lectura, dependiendo de si se elige obtener el formato de la lectura en 8 o 10bit (observad que digo obtener el formato de la lectura en 8 0 10bits, porque el modulo ADC internamente siempre trabaja a 10bits, lo único que se puede cambiar es el formato de salida de los datos.).

Código: [Seleccionar]
'********************************** Para Simular *********************************************
'NOMBRE: 16F88_ADC 8 y 10 Bit
'VERSION: 1.0
'MICRO: PIC16F88
'Fecha/Autor: 10/08 By COS, PSI v7.41
'Descripción: usando el modulo adc directamente.
'************************************************************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación, acelera los comandos WaitMs
'Asignacion de I/O y valores de inicio de las salidas --------------------------------------------
ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %11000000  'Volt. ref.(avdd/avss), selec. de escala division clock/16 ADCON1.ADCS2=1, adc a On
'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC

TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
'Declaracion de variables --------------------------------------------------------------------------------
Dim adc_4 As Word
adc_4 = 0
'Bucle principal ------------------------------------------------------------------------------------------
WaitMs 500  'Pausa 500mSeg.
main:
ADCON0.GO = 1  'Activa una conversión ADC
While ADCON0.GO = 1  'Espera hasta terminar la conversión ADC
Wend
'Pasa la lectura con formato de 10Bits a una variable tipo Word
adc_4.HB = ADRESH
adc_4.LB = ADRESL
'adc_4.LB = ADRESH  'ADC a 8 bit, se puede utilizar una variable tipo Byte
Goto main
End

Creo que haces tres lecturas durante el programa por lo que pierdes 153 uSeg.:
Este tiempo se puede reducir a tan solo unos microsegundos si se utilizan las interrupciones del ADC, mientras que se está realizando una lectura puedes estar actualizando otros registros o cálculos que sean necesarios, hasta que el modulo ADC avise de que tiene la nueva lectura.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 13 de Octubre de 2008, 10:40:45
De nuevo gracias, vas tu mas rapido en aportar explicaciones, que yo en poderlas aplicar.

No obstante tengo una duda. Aunque no se nota en el funcionamiento del cotxe, no se como hacer para que en la salida del pwm, la señal sea realmente 0, pues siempre queda algo de señal aunque ponga "pwmduty 1,0", a la salida del pic tengo un led y siempre queda algo encendido.

Adcin 1, vg  'lee el valor del gatillo

   Select Case vg
      Case < 16
         PWMduty 1, 0  'Freno

Otra pregunta que se me ocurre, las interrupciones (y disculpa mi ignorancia) ¿actuarian cuando se modifica elvalor del ADC ?, si es asi, ¿lo puedo utilizar en los tres ADC que utilizo?

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Octubre de 2008, 15:02:15
Así que yendo por partes tenemos:

Estuve analizando tu código en el simulador y no logre que diera un solo pulso. :shock:

Así que estuve probando PWM 1, 0 con tu configuración en la EBasic y a mí si me da en el pin RB3 todo el tiempo cero voltios. Sin embargo en el osciloscopio del simulador, sí configuramos una resolución muy elevada las líneas salen como puntos.

También vi que para valores de vg>=128 la salida de RB3 siempre queda a estado alto. Por lo tanto la resolución en tu caso quedo a 7Bit.

Y el modulo ADC no permite detectar cuando su entrada cambio de valor. En todo caso puedes programar una lectura del ADC cada cierto tiempo creando una base de tiempos.

Otra cosa muy importante que puede verificar gracias a tu programa, es que la función ADCIN cuando se asigna a una variable tipo BYTE, de forma automática entrega las lecturas a 8Bit, por lo que no es necesario hacer cambios de tipo en tu programa. Esto ultimo no esta en el manual. :shock:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Octubre de 2008, 16:55:08
Bueno si, puedes adaptar la lectura del ADCIN para aprovechar todo el rango dinámico de trabajo del ADC.

128 es a 1023, PWM siempre a 1
y esto queda vg=(128 * V. adcin)/1023
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 15 de Octubre de 2008, 04:26:42
Paso de nuevo el codigo que he probado, he modificado vg a word y en la lecturadel adc1 he puesto el siguiente codigo

CMCON = 0x07
ADCON0 = %01001001 '
ADCON1 = %11000000


Pero a la que hago la lectura  adcon.go=1 se me queda el programa colgado en el while pero despues de 8 lecturas

ADCON0.GO = 1
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend

vg.HB = ADRESH  'ADC a 10bit
vg.LB = ADRESL  'ADC a 10bit


Y despues de esto se me ocurren varias preguntas

¿se puede definir los bits 5-3  del ADCON0 para efectuar la lectura de tres entradas a la vez. ?

Si es asi, ¿ como se pasan los valores a diferentes  variables ?





Código: [Seleccionar]
'********************************** *********************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 1.0
''*****************************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
Define ADC_SAMPLEUS = 10
Define ADC_CLOCK = 5

CMCON = 0x07
ADCON0 = %01001001
ADCON1 = %11000000



Dim duty(16) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Word  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte
Dim i As Byte


ANSEL = %00100011
TRISB = %11110111
TRISA = %11111111

'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque


PWMon 1, 12
PWMduty 1, 0

'****************************************************************************
'Rutina principal
loop:
For i = 1 To 13
Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
'* Leer gatillo
Gosub salidapwm

Adcin 0, mcn  'lee el valor de p5

If mcn <> mca Then Gosub modificarcurva

'* Leer gatillo
Gosub salidapwm

Adcin 5, asn  'lee el valor de p4

If asn <> asa Then Gosub modificararranque

'* Leer gatillo
Gosub salidapwm
Next i

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.5 = 1 Then cn = cn + 8

ai = cn * 16  'Posicion inicial de memoria donde leer
af = ai + 14  'Posicion final de memoria donde leer

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           

'********************************************************************************************
'Rutina deteccion posicion del gatillo y entrega de potencia
salidapwm:
For a = 1 To 8

'Adcin 1, vg  'lee el valor del gatillo

ADCON0.GO = 1
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend

vg.HB = ADRESH  'ADC a 10bit
vg.LB = ADRESL  'ADC a 10bit


Select Case vg
Case < 64
PWMduty 1, 0  'Freno
Case < 128
PWMduty 1, duty(0)
Case < 192
PWMduty 1, duty(1)
Case < 256
PWMduty 1, duty(2)
Case < 320
PWMduty 1, duty(3)
Case < 384
PWMduty 1, duty(4)
Case < 448
PWMduty 1, duty(5)
Case < 512
PWMduty 1, duty(6)
Case < 576
PWMduty 1, duty(7)
Case < 640
PWMduty 1, duty(8)
Case < 704
PWMduty 1, duty(9)
Case < 768
PWMduty 1, duty(10)
Case < 832
PWMduty 1, duty(11)
Case < 896
PWMduty 1, duty(12)
Case < 960
PWMduty 1, duty(13)
Case <= 1023
PWMduty 1, duty(14)
EndSelect

Next a

Return                                           

'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)

mca = mcn
Return

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

EndSelect

Return                                           

'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return

EndSelect

Return                                         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Octubre de 2008, 04:58:08
Este PIC solo tiene un convertidor analógico digital, por lo que solo permite asignarlo a una sola entrada al mismo tiempo.
Esto implica que solo se puede hacer una única lectura de un pin a la vez.

Define ADC_SAMPLEUS = 10, Define ADC_CLOCK = 5 y ADCIN modifican con prioridad estos registros ADCON0 y ADCON1, por lo que desconozco la interacción que puedan provocar. De todas formas la rutina tendría que funcionar pero seguramente con menos eficacia ya que la configuración de los Define's suele tener prioridad. Recuerda que las funciones y definiciones cuando utilizan un modulo del PIC tienen que configurarlo cambiando sus registros (esto es lo único bueno que tienen según el prisma con el que se mire. No tenemos que configurar los registros a mano ni saber de funcionamiento interno), tan solo que en general las funciones predefinidas del lenguaje suelen tener menor rendimiento que nuestras propias rutinas.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 16 de Octubre de 2008, 05:54:39
Entonces esto significa que al tener que hacer la lectura de los tres ADC sera mejor utilizar el programa con los ADCIN, pues si interactuan los define con adcon0 y adcon1 siempre tendre los problemas que te indicaba.

Por otro lado la seleccion de la frecuencia del PWMon1,12, segun el manual a 4 mhz de reloj es de 31250 hz, el calculo si trabajo a 8 mhz ¿es proporcional? osea, ¿es el doble? o hay alguna forma de calcularlo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Octubre de 2008, 09:00:09
Los cálculos a 4Mhz de la tabla del manual son proporcionales para 8Mhz.
No se como hacer los calculo utilizando la función ya que pasa como con ADCIN, configura el modulo de una manera no transparente. Y vuleve a pasar lo mismo que con ADCIN si quieres un mejor control del modulo CCP1 tienes que programarlo de forma directa, de esta forma si puedes hacer todos los cálculos necesarios, en el índice del hilo se indica como hacerlo para el modulo CCP1 trabajando en modo PWM.

Y volviendo a lo anterior tan solo tienes que indicar antes de activar una lectura del ADC que pin es el de entrada. La función ADCIN parece que va más rápida en la simulación porque el  simulador la reconoce y la truca, pero al hacer la lectura directamente con el modulo ADC con nuestro programita el PSI se ve obligado a realizar todos los paso y esperar los tiempos programados pero en la realidad es mucho más rápida que la función.

En fin, no veo el problema de sustituir todos los ADCIN por la rutina anterior de lectura, pero si te es más cómodo y te funciona bien para lo que estas usando, pues sigue can ADCIN. De todas formas cuando tenga tiempo acoplare la rutina a tu programa con su correspondiente selección de pin es tan solo añadir una linea más antes de acitvar la lectura.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Octubre de 2008, 18:48:05
Lo he probado en el simulador y me da todo correcto:

Código: vb.net
  1. '************* ADAPTADO PARA TRABAJAR CON EL MODULO ADC SIN INTERRUPCIONES**************
  2. '***************************************************************************************
  3. 'NOMBRE: 16F88_MandoJEVO_01
  4. 'MICRO: PIC16f88
  5. 'Version: 1.0
  6. ''**************************************************************************************
  7.  
  8. Define CONF_WORD = 0x2f50
  9. Define CONF_WORD_2 = 0x3ffc
  10. Define CLOCK_FREQUENCY = 8
  11. 'Define ADC_SAMPLEUS = 10
  12. 'Define ADC_CLOCK = 5
  13.  
  14. Dim duty(16) As Byte  'Duty Cicle
  15. Dim curva(15) As Byte  'Curva grabada
  16. Dim vg As Word  'Valor gatillo
  17. Dim ca As Byte  'Curva actual
  18. Dim cn As Byte  'Curva nueva
  19. Dim mca As Byte  'Modificacion curva actual P5
  20. Dim mcn As Byte  'Modificacion curva nueva  P5
  21. Dim asa As Byte  'Antispin Actual P4
  22. Dim asn As Byte  'Antispin nuevo P4
  23. Dim ai As Byte  'Contador inicio
  24. Dim af As Byte  'Contador fin
  25. Dim a As Byte  'contador
  26. Dim b As Byte
  27. Dim va(4) As Byte
  28. Dim mc(3) As Byte
  29. Dim i As Byte
  30.  
  31. ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
  32. TRISB = %11110111  'Configuración input/output
  33. TRISA = %11111111  'Configuración input/output
  34. CMCON = 0x07  'Comparador a off
  35. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  36. ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
  37. ADCON1 = %11000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  38. 'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  39. '___________________
  40.  
  41. 'Ver curva actual
  42. Gosub vercurva
  43. Gosub leermemoria
  44. Gosub modificarcurva
  45. Gosub modificararranque
  46.  
  47. PWMon 1, 12
  48. PWMduty 1, 0
  49.  
  50. '****************************************************************************
  51. 'Rutina principal
  52. loop:
  53.         For i = 1 To 13
  54.                 Gosub vercurva  'Comprueba que no se haya cambiado la curva
  55.                 If cn <> ca Then Gosub leermemoria
  56. '* Leer gatillo
  57.                 Gosub salidapwm
  58.        
  59. 'Adcin 0, mcn  'lee el valor de p5
  60.                 ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
  61.                 ADCON0.CHS1 = 0
  62.                 ADCON0.CHS2 = 0
  63.                 ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  64.                 ADCON0.GO = 1  'Activo una lectura
  65.                 While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
  66.                 Wend
  67.                 mcn = ADRESH  'ADC a 8bit
  68.        
  69.                 If mcn <> mca Then Gosub modificarcurva
  70.                        
  71. '* Leer gatillo
  72.                 Gosub salidapwm
  73.  
  74. 'Adcin 5, asn  'lee el valor de p4
  75.                 ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
  76.                 ADCON0.CHS1 = 0
  77.                 ADCON0.CHS2 = 1
  78.                 ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  79.                 ADCON0.GO = 1  'Activo una lectura
  80.                 While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
  81.                 Wend
  82.                 asn = ADRESH  'ADC a 8bit
  83.  
  84.                 If asn <> asa Then Gosub modificararranque
  85.                
  86. '* Leer gatillo
  87.                         Gosub salidapwm
  88. Next i
  89.  
  90. Goto loop
  91. End                                              
  92.  
  93.  
  94. '********************************************************
  95. 'Deteccion de la curva a leer
  96. vercurva:
  97. 'Ver curva nueva
  98.  
  99. cn = 0
  100. If PORTA.2 = 1 Then cn = cn + 4
  101. If PORTA.3 = 1 Then cn = cn + 2
  102. If PORTA.4 = 1 Then cn = cn + 1
  103. If PORTA.5 = 1 Then cn = cn + 8
  104.  
  105. ai = cn * 16  'Posicion inicial de memoria donde leer
  106. af = ai + 14  'Posicion final de memoria donde leer
  107.  
  108. Return                                            
  109. leermemoria:
  110.  
  111. 'Leer valores Guardados segun la curva a leer
  112. For a = ai To af
  113.         b = a - ai
  114.         Read a, duty(b)
  115.         curva(b) = duty(b)
  116. Next a
  117.  
  118. 'Genera los valores para las modificaciones de curvas
  119.  
  120. va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
  121. va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
  122. va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
  123. va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
  124. ca = cn
  125.  
  126.  
  127. Return                                            
  128.  
  129. '********************************************************************************************
  130. 'Rutina deteccion posicion del gatillo y entrega de potencia
  131. salidapwm:
  132.         For a = 1 To 8
  133.  
  134. 'Adcin 1, vg  'lee el valor del gatillo
  135.                 ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
  136.                 ADCON0.CHS1 = 0
  137.                 ADCON0.CHS2 = 0
  138.                 ADCON1.ADFM = 1  'Activa lectura 10bit del ADC
  139.                 ADCON0.GO = 1  'Activo una lectura
  140.                 While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
  141.                 Wend
  142.                 vg.HB = ADRESH  'ADC a 10bit
  143.                 vg.LB = ADRESL  'ADC a 10bit
  144.  
  145.                 Select Case vg
  146.                         Case < 64
  147.                                 PWMduty 1, 0  'Freno
  148.                         Case < 128
  149.                                 PWMduty 1, duty(0)
  150.                         Case < 192
  151.                                 PWMduty 1, duty(1)
  152.                         Case < 256
  153.                                 PWMduty 1, duty(2)
  154.                         Case < 320
  155.                                 PWMduty 1, duty(3)
  156.                         Case < 384
  157.                                 PWMduty 1, duty(4)
  158.                         Case < 448
  159.                                 PWMduty 1, duty(5)
  160.                         Case < 512
  161.                                 PWMduty 1, duty(6)
  162.                         Case < 576
  163.                                 PWMduty 1, duty(7)
  164.                         Case < 640
  165.                                 PWMduty 1, duty(8)
  166.                         Case < 704
  167.                                 PWMduty 1, duty(9)
  168.                         Case < 768
  169.                                 PWMduty 1, duty(10)
  170.                         Case < 832
  171.                                 PWMduty 1, duty(11)
  172.                         Case < 896
  173.                                 PWMduty 1, duty(12)
  174.                         Case < 960
  175.                                 PWMduty 1, duty(13)
  176.                         Case <= 1023
  177.                                 PWMduty 1, duty(14)
  178.                 EndSelect
  179.  
  180.         Next a
  181. Return                                            
  182.  
  183. '*************************************************************
  184. 'Ajuste fino de la curva grabada
  185. 'Rutina para modificar el centro de la curva
  186. modificarcurva:
  187.  
  188.         Select Case mcn
  189.                 Case < 22  'P -5
  190.                         mc(0) = ((va(3) * 5) / 10)
  191.                         mc(1) = ((va(1) * 5) / 10)
  192.  
  193.                         duty(5) = curva(5) - mc(0)
  194.                         duty(6) = curva(6) - mc(1)
  195.                         duty(7) = curva(7) - mc(1)
  196.                         duty(8) = curva(8) - mc(1)
  197.                         duty(9) = curva(9) - mc(0)
  198.  
  199.                         mca = mcn
  200.                         Return
  201.  
  202.                 Case < 44  'P -4
  203.                         mc(0) = ((va(3) * 4) / 10)
  204.                         mc(1) = ((va(1) * 4) / 10)
  205.  
  206.                         duty(5) = curva(5) - mc(0)
  207.                         duty(6) = curva(6) - mc(1)
  208.                         duty(7) = curva(7) - mc(1)
  209.                         duty(8) = curva(8) - mc(1)
  210.                         duty(9) = curva(9) - mc(0)
  211.                        
  212.                         mca = mcn
  213.                         Return
  214.                 Case < 66  'P -3
  215.                         mc(0) = ((va(3) * 3) / 10)
  216.                         mc(1) = ((va(1) * 3) / 10)
  217.  
  218.                         duty(5) = curva(5) - mc(0)
  219.                         duty(6) = curva(6) - mc(1)
  220.                         duty(7) = curva(7) - mc(1)
  221.                         duty(8) = curva(8) - mc(1)
  222.                         duty(9) = curva(9) - mc(0)
  223.  
  224.                         mca = mcn
  225.                         Return
  226.  
  227.                 Case < 88  'P -2
  228.                         mc(0) = ((va(3) * 2) / 10)
  229.                         mc(1) = ((va(1) * 2) / 10)
  230.  
  231.                         duty(5) = curva(5) - mc(0)
  232.                         duty(6) = curva(6) - mc(1)
  233.                         duty(7) = curva(7) - mc(1)
  234.                         duty(8) = curva(8) - mc(1)
  235.                         duty(9) = curva(9) - mc(0)
  236.  
  237.                         mca = mcn
  238.                         Return
  239.  
  240.                 Case < 110  'P -1
  241.                         mc(0) = va(3) / 10
  242.                         mc(1) = va(1) / 10
  243.  
  244.                         duty(5) = curva(5) - mc(0)
  245.                         duty(6) = curva(6) - mc(1)
  246.                         duty(7) = curva(7) - mc(1)
  247.                         duty(8) = curva(8) - mc(1)
  248.                         duty(9) = curva(9) - mc(0)
  249.                        
  250.                         mca = mcn
  251.                         Return
  252.                 Case < 145  'P 0
  253.                         duty(5) = curva(5)
  254.                         duty(6) = curva(6)
  255.                         duty(7) = curva(7)
  256.                         duty(8) = curva(8)
  257.                         duty(9) = curva(9)
  258.  
  259.                         mca = mcn
  260.                         Return
  261.  
  262.                 Case < 165  'P +1
  263.  
  264.                         mc(0) = va(3) / 10
  265.                         mc(1) = va(2) / 10
  266.                         mc(2) = va(1) / 10
  267.  
  268.                         duty(5) = curva(5) + mc(0)
  269.                         duty(6) = curva(6) + mc(1)
  270.                         duty(7) = curva(7) + mc(2)
  271.                         duty(8) = curva(8) + mc(1)
  272.                         duty(9) = curva(9) + mc(0)
  273.  
  274.                         mca = mcn
  275.                         Return
  276.                
  277.                 Case < 185  'P +2
  278.  
  279.                         mc(0) = ((va(3) * 2) / 10)
  280.                         mc(1) = ((va(2) * 2) / 10)
  281.                         mc(2) = ((va(1) * 2) / 10)
  282.  
  283.                         duty(5) = curva(5) + mc(0)
  284.                         duty(6) = curva(6) + mc(1)
  285.                         duty(7) = curva(7) + mc(2)
  286.                         duty(8) = curva(8) + mc(1)
  287.                         duty(9) = curva(9) + mc(0)
  288.  
  289.                         mca = mcn
  290.                         Return
  291.  
  292.                 Case < 205  'P +3
  293.                         mc(0) = ((va(3) * 3) / 10)
  294.                         mc(1) = ((va(2) * 3) / 10)
  295.                         mc(2) = ((va(1) * 3) / 10)
  296.  
  297.                         duty(5) = curva(5) + mc(0)
  298.                         duty(6) = curva(6) + mc(1)
  299.                         duty(7) = curva(7) + mc(2)
  300.                         duty(8) = curva(8) + mc(1)
  301.                         duty(9) = curva(9) + mc(0)
  302.  
  303.                         mca = mcn
  304.                         Return
  305.  
  306.                 Case < 230  'P +4
  307.                         mc(0) = ((va(3) * 4) / 10)
  308.                         mc(1) = ((va(2) * 4) / 10)
  309.                         mc(2) = ((va(1) * 4) / 10)
  310.  
  311.                         duty(5) = curva(5) + mc(0)
  312.                         duty(6) = curva(6) + mc(1)
  313.                         duty(7) = curva(7) + mc(2)
  314.                         duty(8) = curva(8) + mc(1)
  315.                         duty(9) = curva(9) + mc(0)
  316.  
  317.                         mca = mcn
  318.                         Return
  319.  
  320.                 Case <= 255  'P +5
  321.                         mc(0) = ((va(3) * 5) / 10)
  322.                         mc(1) = ((va(2) * 5) / 10)
  323.                         mc(2) = ((va(1) * 5) / 10)
  324.  
  325.                         duty(5) = curva(5) + mc(0)
  326.                         duty(6) = curva(6) + mc(1)
  327.                         duty(7) = curva(7) + mc(2)
  328.                         duty(8) = curva(8) + mc(1)
  329.                         duty(9) = curva(9) + mc(0)
  330.                        
  331.                         mca = mcn
  332.                         Return
  333.  
  334.         EndSelect
  335. Return                                            
  336.  
  337. '*****************************************************************
  338. 'Ajuste del control de arrancada
  339. modificararranque:
  340. Select Case asn
  341.                 Case < 25  'P 1
  342.                         duty(0) = curva(0)
  343.                         duty(1) = curva(1)
  344.                         duty(2) = curva(2)
  345.                         duty(3) = curva(3)
  346.                         duty(4) = curva(4)
  347.                         asa = asn
  348.                         Return
  349.  
  350.                 Case < 50  'P 2
  351.                         duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
  352.                         duty(1) = curva(1)
  353.                         duty(2) = curva(2)
  354.                         duty(3) = curva(3)
  355.                         duty(4) = curva(4)
  356.                         asa = asn
  357.                         Return
  358.  
  359.                 Case < 75  'P 3
  360.                         duty(0) = curva(1)
  361.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  362.                         duty(2) = curva(2)
  363.                         duty(3) = curva(3)
  364.                         duty(4) = curva(4)
  365.                         asa = asn
  366.                         Return
  367.  
  368.                 Case < 100  'P 4
  369.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  370.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  371.                         duty(2) = curva(2)
  372.                         duty(3) = curva(3)
  373.                         duty(4) = curva(4)
  374.                         asa = asn
  375.                         Return
  376.  
  377.                 Case < 125  'P 5
  378.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  379.                         duty(1) = curva(2)
  380.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  381.                         duty(3) = curva(3)
  382.                         duty(4) = curva(4)
  383.                         asa = asn
  384.                         Return
  385.  
  386.                 Case < 150  'P 6
  387.                         duty(0) = curva(2)
  388.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  389.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  390.                         duty(3) = curva(3)
  391.                         duty(4) = curva(4)
  392.                         asa = asn
  393.                         Return
  394.  
  395.                 Case < 175  'P 7
  396.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  397.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  398.                         duty(2) = curva(3)
  399.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  400.                         duty(4) = curva(4)
  401.                         asa = asn
  402.                         Return
  403.                
  404.                 Case < 200  'p 8
  405.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  406.                         duty(1) = curva(3)
  407.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  408.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  409.                         duty(4) = curva(4)
  410.                         asa = asn
  411.                         Return
  412.  
  413.                 Case < 225  'P 9
  414.                         duty(0) = curva(3)
  415.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  416.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  417.                         duty(3) = curva(4)
  418.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  419.                         asa = asn
  420.                         Return
  421.        
  422.                 Case <= 255  'P 10
  423.                         duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  424.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  425.                         duty(2) = curva(4)
  426.                         duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  427.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
  428.                         asa = asn
  429.                         Return
  430.  
  431.         EndSelect
  432. Return

PD. La rutina de control del modulo ADC tarda 35uSeg. en la version de 10bit y 33uSeg. en la version de 8Bit.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 17 de Octubre de 2008, 04:50:39
Bueno, pues genial, lo he probado y con los trece ciclos que lo pruebo, me ha reducido el tiempo en 6 ms,esto supone una fiabilidad mucho mayor en la respuesta del mando. (Edito) 10 ms con todos los ADC a 8 bits

Ahora ya solo te pido un favor mas, y tan solo te pido que me marques el camino para ir aprendiendo.

En la memoria grabo los mapas de la curva de potencia que son con los que consigo un funcionamiento u otro del coche

Actualmente y como no se como hacerlo de otra manera escribo los datos con el editor de la memoria del Pic simulator ide y luego lo grabo con el Pickit de microchip.

-Hay algun metodo mas rapido para editar los datos que el editor del Pic Simulator Ide

Aunque mi idea es hacerlo finalmente a traves del USB, veo que me queda muchisimo por aprender.Por cierto si tienes algun enlace que explique como hacer la conexion y como programar el pic (en basic) te lo agradeceria.

Y repito gracias por todo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Octubre de 2008, 12:24:49
He seguido haciendo pruebas y con esta configuracion me tarda la rutina de 10Bit 13uSeg. corrienso sobre la EBasic.

ADCON0 = %00100001  'Fosc/2, channel RA4
ADCON1 = %10000000  'volt. ref.AVdd/AVss, ADC a ON
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Octubre de 2008, 17:56:30
Para transferir datos desde un dispositivo exterior al pic tienes ejemplos en el indice del foro.

Pero para asignar valores por ejemplo de una lista a un vector se utiliza lo siguiente:

Código: vb.net
  1. Dim dato As Byte
  2. Dim indice As Byte
  3. Dim curva_1(10) As Byte
  4. '...........
  5. main:
  6. '.
  7. '.
  8. '.
  9.         For indice = 0 To 9
  10.                 dato = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), indice 'Valores a transferir
  11.                 curva_1(indice) = dato
  12.         Next indice
  13. '.
  14. '.
  15. '.
  16. Goto main
  17. End

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 30 de Octubre de 2008, 09:47:11
Gostei muito dos temas abordados neste forum, espero fazer grandes amigos aqui e
poder compartilhar informações!! 8)Sou brasileiro e utilizo a eletrônica com hobby.
At.
_Lince_

Minha contribuição inicial!!
Fontes!!
http://rapidshare.com/files/158984877/Automa__o.zip.html

Simulação no Proteus!!
http://rapidshare.com/files/158977020/Automa__o.DSN.html

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Octubre de 2008, 19:21:30
Bienvenido Lince;
Interesante proyecto por lo que puedo ver son tres 16F84 conectados por un bus común, tipo RS485. Si puedes comentar un poco lo que deben de hacer los programas y su interacción estaría genial.

Lastima, no me funciona la simulación del proteus me da 4 errores.

Interesante el uso de la función Pointer “Pointer(index_buffer) = ponteiro”, esa función pertenece a la programación avanzada. Me agradaría mucho añadir algún ejemplo de su uso en el índice. :wink:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 31 de Octubre de 2008, 07:45:42
dogflu, yo lo he probado y si que me funciona, pero he tenido que compilar los pdf para convertirlos a hex, y entonces cargar cada pic con su correspondiente hex ya de mi ordenador.

No obstante debido a mi inexperiencia con proteus, me quedo igual y sin una explicacion tal y como comentas, no entiendo lo que hace el esquema.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 31 de Octubre de 2008, 08:40:36
Ok dogflu66!!
Na realidade este projeto possui um master que dei o nome de polvo e outros dois periféricos que chamei de cobra e camaleão.Todos
estão em um barramento RS485.O master tem a função de verificar entradas de sensores e encaminhar o comando para um dos pe-
riféricos que acionará uma saída correspondente.O protocolo que criei foi baseado em redes de pc, porém simplificado,mas cada periférico
possui seu grupo e endereço podendo ser chamados também com broadcast de grupo (executa comando mas não responde ao master),
foi implementado também um checksum 16bits para checar a integridade de cada pacote.Todo o projeto foi concebido com o intuito de testar esta
brilhante IDE Oshon e demonstrar sua capacidade, pois se bem utilizada gera códigos extremamente rápidos e pequenos.Programo em assembly
a um bom tempo por isso posso afirmar que esta IDE possui o melhor compilador basic do mercado.Muitos poderão dizer...não há tantas funções
prontas como Proton ou Picbasic Pro ou até mesmo o Mikrobasic,mas eu mesmo testei seus códigos e verifiquei na prática as diferenças.
Todo programa bem elaborado faz uso de interrupções não é?,pois bem! No compilador basic Oshon o tempo de latência nas interrupção é o mesmo do
assembly 8)nos demais :?Picbasic pro e demais que digam...
Aqui esta os hex dos arquivos já compilados para utilizar no proteus!(A versão do proteus é a 7.2 sp2)
http://rapidshare.com/files/159284394/Automa__o.zip.html

'******************Carga de parametros na inícialização**************
index_eeprom = 0    'aponto para a posição zero da eeprom.
index_buffer = 0x032 'aponto para a posição 0x032 da ram.
le_meus_dados_eeprom:
       If index_eeprom < 8 Then
          Read index_eeprom, ponteiro
          Pointer(index_buffer) = ponteiro     'poneiro aqui é apenas uma variável que guardo os valores previamente gravados na eeprom e os transfiro para
          index_buffer = index_buffer + 1     'um buffer de ram que se inicia na posição 0x032 utilizando a função pronta pointer().Ao final desta rotina meus
          index_eeprom = index_eeprom + 1'parametros estaram guardados no buffer de ram chamado parametros().
          Goto le_meus_dados_eeprom
Endif

At.
_Lince_
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Noviembre de 2008, 22:10:09
Las interrupciones son imprescindibles para realizar cualquier programa y, este compilador genera un código bastante rápido y reducido. Incluso se pueden realizar muy buenas aplicaciones con micros “enanos” que tan solo tienen una memoria de 512Word. También es cierto que hay lenguajes que tienen un mayor numero de funciones, pero en realidad estas funciones suelen ser lentas y muy incompletas en general. En la realidad el programador suele construir sus propias funciones las que son más rápidas y suelen ocupar menos código.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 10 de Diciembre de 2008, 08:59:44
Software feito por quem não tem oque fazer. :mrgreen:
Descrição: Este software funciona como um mini hardlock, que pode ser ligado em qualquer aplicação que possua serial RS232.
A aplicação deve enviar a seguencia "1234" e o hardlock irá responder "34".Não disse que não tinha nada para fazer!! :mrgreen:

Citar
'Este software servirá como base para um sistema de checagem de senha tipo (Hardlock) via se-
'rial .
'MCU utilizada (10F200) rodando a 4MHZ em operação normal(RC interno).
'Autor: _Lince_
'Data: 21/10/2008
'Nome do aplicativo (Checa senha r0.1)
'*********************************Configuração dos fusiveis**********************************
Define CONF_WORD = 0x000
Define SEROUT_REG = GPIO
Define SEROUT_BIT = 0
Define SERIN_BIT = 3
Define SEROUT_BAUD = 9600
'Define SIMULATION_WAITMS_VALUE = 1 'Retirar esta linha para gravação em hardware.
'*********************************Definição dos I/Os*****************************************
'GPIO.GP0 saída led de validação.
'GPIO.GP1 entrada RX RS232 a 9600 bps..
'*********************************Variaveis do sistema***************************************
Dim buffer_rx_0 As Byte @ 0x18
Dim buffer_rx_1 As Byte @ 0x19
Dim buffer_rx_2 As Byte @ 0x1a
Dim buffer_rx_3 As Byte @ 0x1b
Dim contador As Byte @ 0x1c
Dim dado As Byte @ 0x1d
Dim contra_senha_0 As Byte @ 0x1e
Dim contra_senha_1 As Byte @ 0x1f
'***********************************Constantes do systema************************************
'*************************************Atribuições de I/Os entre outros***********************
Symbol led_ok = GPIO.1
Symbol rx = GPIO.3
'************************************Direção dos I/Os****************************************
TRISGPIO.0 = 0 ' Saída.(tx).
TRISGPIO.1 = 0 ' Saída.(led_ok).
TRISGPIO.3 = 1 ' Entrada.(rx).
'***************************************Main*************************************************
contador = 0
ASM:   movlw  0x18 'Ponteiro do buffer de senha.
ASM:   movwf  fsr
led_ok = 0
buffer_rx_0 = 0
buffer_rx_1 = 0
buffer_rx_2 = 0
buffer_rx_3 = 0
contra_senha_0 = 0x33
contra_senha_1 = 0x34
main:
     If led_ok = 1 Then
        Serout contra_senha_0,contra_senha_1
        led_ok = 0
     Endif
     If contador = 4 Then Goto checa_senha     
     If rx = 0 Then
        If contador < 4 Then Goto le_rx
checa_senha:         
              contador = 0
              ASM:  movlw  0x18      'Aponto para início do buffer novamente.
              ASM:  movwf  fsr
              ASM:  movlw  0x31         'senha_0
              ASM:  xorwf  buffer_rx_0,w
              ASM:  btfss  status,z
              ASM:  goto   $+ 0x0e           
              ASM:  movlw  0x32         'senha_1
              ASM:  xorwf  buffer_rx_1,w
              ASM:  btfss  status,z
              ASM:  goto   $+ 0x0a             
              ASM:  movlw  0x33         'senha_2                       
              ASM:  xorwf  buffer_rx_2,w
              ASM:  btfss  status,z
              ASM:  goto   $+ 0x06
              ASM:  movlw  0x34         'senha_3
              ASM:  xorwf  buffer_rx_3,w
              ASM:  btfss  status,z
              ASM:  goto   $+ 0x02
              ASM:  bsf    led_ok       'uso uma saída como flag para poder verificar e                   
              ASM:  nop                 'transmitir a contra senha.
        Endif
Goto main
le_rx:
Serin dado
contador = contador + 1
ASM:   movf   dado,w
ASM:   movwf  indf
ASM:   incf   fsr,f
Goto main
'******************************************Fim************************************************   
End

Link simulação Proteus:http://rapidshare.com/files/172023453/Hardlook.zip.html

At.
_Lince_
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2008, 22:18:28
Software feito por quem não tem oque fazer. :mrgreen:

 :D, pues esta muy bien... un poco escueto en comentarios  :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: MiCrOtRoNiC en 16 de Diciembre de 2008, 20:54:31
alguien ah probado la version 6.70...trae mejoras con respecto al compilador....?en la pagina oficial no aclaran muy bien

Código: [Seleccionar]
News in version 6.70
- Improved timing issues for LCD routines in basic compiler
- Improved timing issues for GLCD routines in basic compiler
- Software version, microcontroller model and clock frequency saved in ASM files generated by basic compiler
- Improved Alternative SFR Viewer
- Changed order of items in Tools and Options menus
- Several small and/or invisible improvements
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:19:48
Aparte que los programas son ahora 2 Bytes más largos, no observo ningún fallo, siguen funcionando igual de bien.

Según parece que a quitado algún tiempo muerto en las funciones de los lcd’s. Ahora en el editor del Basic se puede leer en la cabecera el PIC y frecuencia que estas utilizando. Algún problema a la hora de mostrar los SFR, problema que yo no  he visto jamás.
Y ha ordenado las herramientas y configuraciones en los menús de una forma más cómoda.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: allado en 24 de Diciembre de 2008, 09:16:56
Bienvenido amigo lince... Es lo que comentamos en algún momento--- La compilación de PSI arroja un hex mucho mas pequeño y compacto que otros compiladores basic. .. Desde ya una saludo para todos  y que tengan un muy buen año 2009.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: MiCrOtRoNiC en 24 de Diciembre de 2008, 11:09:09
bueno amigos ya es 24 feliz navidad a todos :mrgreen: :mrgreen:
nuevos cambios y nuevos micros en el psi

News in version 6.71
- Support for 7 new devices: 16F631, 16F677, 16F882, 16F883, 16F884, 16F886, 16F887
- Several small and/or invisible improvements ...

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Diciembre de 2008, 13:31:02
FELIZ NAVIDAD Y PROSPERO AÑO NUEVO PARA TODOS.

PD. Dejo un regalito para los que tienen puerto paralelo en su ordenador.
Esto es una version de programador paralelo free que hay en la pagina de oshonsoft.
El sofware para manejarlo lo bajais de la misma pagina.

Download Programador para puerto paralelo (http://rapidshare.com/files/271461030/Programador_PIC_EBasic_11.rar.html)

Y aqui queda la configuracion:

(http://img36.imageshack.us/img36/8387/configuraciondelprogram.jpg)

PD: Corregida la configuración del programador.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 27 de Diciembre de 2008, 20:22:07
'Função da aplicação:Semear amor aos corações.
'Autor: _Lince_.
'Data: 27/12/2008.
'Versão : Única e sem bugs.
'*****************Variaveis***********************
dim amigos_todo_pic as bit
dim amor as bit
dim felicidades as bit
dim armonia as bit
dim trabalho as bit
'******************Constantes********************
const  legais = 1
const  muito = 1
'******************Principal**********************
amigos_todo_pic = 1
main:
        if amigos_todo_pic = legais then
todos_usuarios_do_forum:
           amor = muito
           felicidades = muito
           armonia = muito
           trabalho = muito
           goto main
       else
          goto todos_usuarios_do_forum 'Embora o uso de goto em programas seja questionado eu gosto de usa-los :D
       endif
'******************Fim**************************

Desejo a todos um feliz ano novo repleto de realizações !!!! :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Diciembre de 2008, 20:23:12
Dejo una función que me ha parecido interesante. Devuelve el estado del BIT deseado de los que se compone una variable. No es muy complejo así que no lo voy a explicar a no ser que alguien pregunte. Solo diré que arg1 y arg2 son dos variables locales a la función (entrada de datos del programa a la función) y v_bit es el registro de transferencia (salida de datos de la función al programa). Lo bueno que tiene este tipo de código es que se pude añadir a cualquier programa y funciona sin más.


Código: [Seleccionar]
    '*************************************************
'Ejemplo 32
'PIC16F88, 12/08, By COS, PSI v7.41
'Solo para simulación
'Devuelve el valor de un bit determinado
'de una varia de hasta 32Bits.
'El valor del los bits son enviados al puerto serie que son
'visualizados en el modulo Hardware UART Simulation Interface
'*************************************************
Define CLOCK_FREQUENCY = 4
Define SIMULATION_WAITMS_VALUE = 1  'Solo simulación, se aceleran los WaitMs
AllDigital
Hseropen 4800  'Configura puerto RS232 por hardware
Dim entrada As Long  'word  'byte
Dim dato As Byte
Dim n As Byte
entrada = %01000001000000001000000010001001
dato = 0
For n = 31 To 0 Step -1
dato.0 = v_bit(entrada, n)  'Selecciona el bit n
Hserout #dato, " "
WaitMs 1000
Next n
End                                               
'Subrutinas y funciones
'--------------------------------------------------------------
'Devuelve valor: Bit
'V_BIT es una funcion que nos devuelve el estado
'de un bit de una variable determinada.
'ARG1 es la variable de entrada, hasta 32bit.
'ARG2 es el numero de orden del bit deseado de 0 a 31.
'Mediante V_BIT se transfiere el valor del bit deseado
Function v_bit(arg1 As Long, arg2 As Byte) As Bit
arg1 = ShiftRight(arg1, arg2) 'Desplazamiento de bit a la derecha
v_bit = arg1.0
End Function         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Diciembre de 2008, 20:26:14
Y para ti tambien _Lince_.  :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 18 de Enero de 2009, 20:40:21
Una pregunta.

 He intentado bajar los ultimos esquemas de la entrenadora e-basic y no los encuentro todos los enlaces me dan error, Dogflu66 o alguien me los podriais facilitar

Gracias de antemano

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Enero de 2009, 22:39:11
Hola, hace unos días que comprobé los enlaces para descarga y estaban operativos todavía, pero de todas formas pongo uno nuevo.

http://rapidshare.de/files/42392088/Pic_EBasic_1.4.rar.html

PD. Por un casual encontré tu proyecto en la red y estaba quedando genial, espero que lo termineis... :-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 19 de Enero de 2009, 07:56:12
Gracias por tu pronta respuesta.

Y aprovecho para preguntarte una cosa, en los pins 15 y 16, ¿ seria posible conectar mediante una seleccion con jumpers, la placa tal y como esta, o como opcion cristales externos para ir provando con diferentes frecuencias de cristal?


Sobre el tema de mi proyecto

¿ De que proyecto me hablas, del mando o del banco de pruebas?, el mando que hay en la red no consegui acabarlo de hacer funcionar pues soy novato en pic y tan solo soy "electronico de copiar y pegar" esto hace que cualquier pequeño problema  que me encuentro se haga en algunas ocasiones insalvable.

Si el que viste es el mando, desistí por el momento de aquel esquema, aunque te puedo decir que funcionaba la parte de potencia que en un principio era el principal escollo, pero la parte de control no, pues el 16f88 solo tiene una salida para el PWM y no consegui gestionar el freno correctamente.

El programa en el que me ayudaste era para otro modelo de mando mas sencillo que hice mejorando el esquema de un mando comercial y que me permite mejorar el control sobre las curvas de potencia, (y me va bastante bien)

No obstante no descarto mas adelante hacer el otro mando con un pic mas potente y con la posibilidad de un USB para conectarlo al PC, pero, uff, se me hace muy cuesta arriba...

Ahora ando metido en un banco de pruebas para motores.

Y repito gracias por tu pronta respuesta
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Enero de 2009, 10:51:59
Se puede colocar cristales exteriores, lo que se hace normalmente si no se quiere modificar la placa es un zócalo adaptador para el PIC, y en este zócalo se colocan los puentes, condensadores y el cristal. Operando con cristal externo solo pierdes la tecla S1 y el LED1 amarillo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Enero de 2009, 21:53:31
Para el que quiera experimentar con el sensor de temperatura de precisión DS1624 dejo el antiguo ejemplo 25 para trabajar con temperaturas positivas y negativas, he simplificado la función y añadí otra función que modifica la salida del LCD con distintos formatos de representación de la temperatura, signo, 3 dígitos para la parte entera, y selección de 0, 1 o 2 decimales y también la selección de imprimir o no imprimir "C" al final de la temperatura. Recordar que este sensor tiene un rango de trabajo de temperatura entre -55 a +125 ºC en pasos de 0.0625ºC. También pude comprobar que llega a -50ºC sin problemas, es la mínima temperatura que pude conseguir con mis medios. A la lectura de temperatura negativa hay que hacer un proceso de complemento a 2 para poder pasarla a decimal.

PD. El DS1624 tiene una E2prom interna independiente del sensor de temperatura que no usaremos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Enero de 2009, 21:54:42
El programa:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE: 16F88_Pic_EBasic_EJEMPLO_33
'Descripcion: TEST DE LA PLACA EBasic_I2C (Led y DS1624), Temperatura positiva y negativa)
'Micro: PIC16F88 / 8mhz reloj interno
'Fecha/Autor: 23/01/09, 15/01/09, 2/08/07, 29/7/07 By COS, PSI v7.41
'Version: 1.3
'Se añaden temperaturas negativas
'Se crea la función lcdsig_ds1624, que permite seleccionar 0,1 o 2 decimales
'Version: 1.2
'Se eliminan elementos redundantes en la funcion
'Version: 1.1
'Se añade TEST para el DS1624 (temperatura)
'*****************************************************************************************
Define CONF_WORD = 0x2f50  'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc  'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'-------------------------------------Puertos del LCD-------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display.
'Definicion de puertos--------------------------------
AllDigital  'los pin I/O digitales
'ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'TRISA.4 = 1  'como entrada (RA4, adc)
TRISA.6 = 1  'como entrada (RA6, tecla S1)
TRISA.5 = 1  'como entrada (RA5, tecla S2)
'Declaracion de constantes-----------------------------
Const p_off = 0  'apaga el led
Const p_on = 1  'enciende el led
Const p_nc = 2  'no cambia estado el led
'Reasignacion de nombres------------------------------
Symbol sda = RB1  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = RB4  'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol led_amarillo = RA7  'led amarillo
Symbol led_verde = RB0  'led verde
Symbol luz_lcd = RB3  'iluminación del lcd
Symbol s1 = RA6  'tecla S1
Symbol s2 = RA5  'tecla S2
'Variables generales---------------------------------------
Dim temperatura As Word  'temperatura entero .HB, decimales .LB
'Inicio------------------------------------------------
Lcdinit  'inicializa el LCD sin cursor
WaitMs 100  'pausa de 100 mSeg.
Lcdout "Test P. EB_I2C"  'Imprime el texto en el LCD
WaitMs 3000  'pausa de 3Seg.
Call led(p_off, p_off, p_on, p_off)  'led a off
'Rutina Programa---------------------------------------
main:
Call led(p_nc, p_nc, p_nc, p_on)  'Control luces
temperatura = d_ds1624(0)  'genera una lectura en el chip ds
Call led(p_nc, p_nc, p_nc, p_off)  'Control luces
WaitMs 1000  'pausa de 1Seg, tiempo maximo de conversion del chip ds
Call led(p_nc, p_nc, p_nc, p_on)  'Control luces
temperatura = d_ds1624(1)  'almacena la lectura en dos bytes
Call led(p_nc, p_nc, p_nc, p_off)  'Control luces
Lcdcmdout LcdLine2Home  'cursor al principio de la linea 2
Lcdout "Temp. "  'Imprime en el LCD
Call lcdsig_ds1624(temperatura, 1, 1)  'Llama a imprimir temperatura con formato
WaitMs 1000  'hace una pausa de 1Seg.
Goto main
End                                               
'Rutinas-----------------------------------------------
'Detecta signo e imprime con 0, 1 o 2 decimales
'Parte entera con formato de 3 digitos
'arg1 = Valor de entrada de temperatura
'arg2 = 0 no hay decimales, arg2 = 1 un decimal, arg2 = 2 con dos decimales
'arg3 = 0 no imprime "C" despues de los decimales, arg3 = 1 si la imprime
Proc lcdsig_ds1624(arg1 As Word, arg2 As Byte, arg3 As Bit)  'Declara el tipo y argumentos de la funcion
If arg1.15 = 0 Then  'Selecciona +/-
If arg1 > 0 Then Lcdout "+"  'Imprime en el lcd
If arg1 = 0 Then Lcdout " "  'Imprime en el lcd
Else
arg1.15 = 0  'Deja la parte entera
If arg1 > 0 Then Lcdout "-"  'Imprime en el lcd
If arg1 = 0 Then Lcdout " "  'Imprime en el lcd
Endif
If arg1.HB < 100 Then Lcdout "0"
If arg1.HB < 10 Then Lcdout "0"
Lcdout #arg1.HB  'Escribe parte entera
If arg2 = 1 Or arg2 = 2 Then Lcdout "."  'Escribe lcd
If arg2 = 1 Then arg1.LB = arg1.LB / 10  'Suprime el segundo decimal
If arg2 = 2 And arg1.LB < 10 Then Lcdout "0"  'Mantiene el formato dos decimales
If arg2 = 1 Or arg2 = 2 Then Lcdout #arg1.LB  'Escribe los decimales
If arg3 = 1 Then Lcdout "C"  'Imprime en el lcd
End Proc                                         
'Funcion de lectura/escritura del DS1624
'ds_rw=0 el chip prepara un lectura
'ds_rw=1 el chip entrega una lectura
'ds_rw=2 se hace una lectura del registro de control.
'd_ds1624, byte mas significativo parte entera, menos significativo 2 decimales
'Hay que recordar declarar SDA y SCL
Function d_ds1624(ds_rw As Byte) As Word  ', d_aux As Long) As Word
Dim d_aux As Long
RA4 = 1  'Led placa I2c a On
If ds_rw = 0 Then  'Solicita una lectura de temperatura
I2CWrite sda, scl, %10010010, 0xac, 0x00  'Inicializa el registro de control
WaitMs 10  'Pausa para que termine la escritura
I2CWrite1 sda, scl, %10010010, 0xee  'Comienza una conversión
Endif
If ds_rw = 1 Then  'Hace la lectura de la temperatura
I2CWrite1 sda, scl, %10010010, 0xaa  'Prepara el chip para lectura de temperatura
I2CRead1 sda, scl, %10010011, d_ds1624.HB, d_ds1624.LB  'Lee la temperatura
If d_ds1624.15 = 1 Then  'Detecta signo de la temperatura
d_ds1624 = Not d_ds1624  'Pasa a complemento a 1
d_ds1624 = d_ds1624 + 1 'Pasa a complemento a 2
d_ds1624.15 = 1  'Activa bit de signo negativo que se pierde en la operación
Endif
d_ds1624.LB = ShiftRight(d_ds1624.LB, 3)  'Elimina bit que no se usan
d_aux = (d_ds1624.LB * 625) / 1000  'Calcula la parte decimal, 2 digitos
'd_aux = (d_ds1624.LB * 9) / 15  'Calcula la parte decimal, 2 digitos, operación simplificada
d_ds1624.LB = d_aux.LB  'Pasa los decimales a la variable de transferencia
Endif
If ds_rw = 2 Then  'Hace una lectura del registro de control
d_ds1624 = 0  'Inicializa variable
I2CRead sda, scl, %10010011, 0xac, d_ds1624.LB  'lee registro de control
Endif
RA4 = 0  'led placa i2c a Off
End Function                                     
'Controla el estado de los led, Call(x1, x2, x3, x4)
'x=0 led apagado, x=1 led encendido, x=2 no hay cambio
Proc led(led_amarillo As Byte, led_verde As Byte, luz_lcd As Byte, led_ebi2c As Byte)
If led_amarillo = 1 Then RA7 = 0  'led amarillo a on
If led_amarillo = 0 Then RA7 = 1  'led amarillo a off
If led_verde = 1 Then RB0 = 0  'led verde a on
If led_verde = 0 Then RB0 = 1  'led verde a off
If luz_lcd = 1 Then RB3 = 1  'LCD iluminado
If luz_lcd = 0 Then RB3 = 0  'LCD apagado
If led_ebi2c = 1 Then RA4 = 1  'led EB_I2C a on
If led_ebi2c = 0 Then RA4 = 0  'led EB_I2C a off
End Proc
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: cymons en 11 de Febrero de 2009, 00:47:08
Buenas Noches Ariel soy nuevo en el foro, me llamó mucho la atencion tu programa del reloj aunque no pude correrlo xq no se como van conectados los pines de la pantalla LCD  :( .....

X casualidad en el foro ya no han publicado como trabajar con un teclado matricial y que al pulsar cada tecla se vaya mostrando en cuatro displays 7segmentos?

es que estoy tratando de realizar esa asignacion pero tengo dudas a la hora de guardar por ejemplo el primer valor a mostrar en el display "Posicion menos significativa" xq cada vez que pulse otra tecla deben desplazarse hacia la izquierda los valores ya mostrados anteriormente en los displays....el teclado es de 4x4 y el display multiplexado 7x4....x favor seria de gran ayuda si me echan una hand....  :)

avisenme si debo ser mas explícito en mi duda x favor...

Otra duda, en PROTON el comando POT se que permite leer cualquier tipo de resistencia variable: potenciometros, termistores, etc...pero la sintaxis como tal que arroja la ayuda de PROTON dice lo siguiente:
Variable = POT Pin, scale
no entiendo como explicar que significa ese operador  "scale" ¿?....espero su pronta respuesta GRACIAS....
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Febrero de 2009, 23:07:55
Buenas Noches Ariel soy nuevo en el foro, me llamó mucho la atencion tu programa del reloj aunque no pude correrlo xq no se como van conectados los pines de la pantalla LCD  :( .....

X casualidad en el foro ya no han publicado como trabajar con un teclado matricial y que al pulsar cada tecla se vaya mostrando en cuatro displays 7segmentos?

es que estoy tratando de realizar esa asignacion pero tengo dudas a la hora de guardar por ejemplo el primer valor a mostrar en el display "Posicion menos significativa" xq cada vez que pulse otra tecla deben desplazarse hacia la izquierda los valores ya mostrados anteriormente en los displays....el teclado es de 4x4 y el display multiplexado 7x4....x favor seria de gran ayuda si me echan una hand....  :)

avisenme si debo ser mas explícito en mi duda x favor...

Otra duda, en PROTON el comando POT se que permite leer cualquier tipo de resistencia variable: potenciometros, termistores, etc...pero la sintaxis como tal que arroja la ayuda de PROTON dice lo siguiente:
Variable = POT Pin, scale
no entiendo como explicar que significa ese operador  "scale" ¿?....espero su pronta respuesta GRACIAS....


Como Ariel no te contesta todavia, a ver si te puedo orientar:

No sé a que programa te refieres del Reloj. En el caso que estés haciendo referencia al Relojito de Ariel tienes toda la info en su pagina.
En este hilo no se ha trabajado con el tipo de teclado que indicas, ni con display de 7 Segmentos. Pero en el foro si que se ha tratado este tema muchas veces, puedes hacer uso del buscador del foro para encontrarlos, o esperar a ver si algún amigo recuerda en que parte del foro puedes mirar.
Y para terminar, este hilo es del Basic del Pic Simulator IDE, así que es posible que nadie té conteste sobre el Basic Proton. Hay hilos sobre Proton puedes consultar en ellos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 15 de Febrero de 2009, 20:59:07
Hola a todos, he estado mirando las caracteristicas del PIC 16f88 y veo que la salida pwm se puede generar tanto en RB0 como en el  RB3 configurandolo en el bit 12 del WORD 1, viendo esto mi pregunta son:

¿ Como se configura este bit en el Pic simulator Ide ?

¿ Durante la ejecucion de un programa es posible alternar la salida PWM de un pin al otro ?

Sal u2 y gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Febrero de 2009, 20:37:49
Lo tienes en el menu Options/Configuration Bit

(http://img10.imageshack.us/img10/1598/menuoptionsconfiguraciojq8.jpg)

Que yo sepa no se puede.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: firewarrior en 22 de Febrero de 2009, 17:15:38
Hola, ¿existe alguna instruccion para poner el pic en modo sleep en este lenguaje?, me estoy volviendo loco y no encuentro nada.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Febrero de 2009, 21:59:10
No la hay, hasta ahora no he tenido que usar el modo sleep del PIC, pero eso se consigue modificando el  registro adecuado y para eso lo mejor es echarle un vistazo al datasheet del micro.


PD: Se inserta la linea ASM SLEEP en nuestro código y el micro pasa a estado de bajo consumo. Sleep es una instrucción maquina que es insertada en nuestro código mediante la directiva ASM.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 04 de Marzo de 2009, 09:16:20
A unica forma é  usar (ASM:   Sleep) , se ao menos pudesse fazer (symbol  dorme = asm: sleep),mas não é
possivel.Creio que deva haver como faze-lo em próximas versões!! :) vamos aguardar!!!!
At.
_Lince_
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 06 de Marzo de 2009, 07:23:46
Hola a todos

Una pregunta, para determinar el tiempo que tarda una rutina determinada en el PSI, ¿ como se hace ? Hay algún modo de parar la ejecucion del programa para ver el tiempo que ha tardado hasta esa instruccion, o entre instrucciones.

Según las indicaciones de Dogflu66, etoy intentando adaptar el programa que tenia hecho y publicado aqui en el foro utilizando interrupciones, pero necesito saber como saber el tiempo que empleo para ver si mejoro el rendimiento del programa. Ahora no se como hacerlo y cuando el programa llega a la instruccion end el tiempo sigue contando y las instrucciones tambien.

Alguna sugerencia

Sal U2 y gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 06 de Marzo de 2009, 15:15:19
Basta usar  a instrução break antes da rotina e depois da mesma, guando o programa ali parar, clic com o botão
esquerdo do rato sobre o contador de ciclos na janela principal da IDE, após isso é só rodar o programa passo á passo
ou outro modo qualquer.Na próxima parada você terá o tempo da sua rotina. :)
At.
_Lince_
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 06 de Marzo de 2009, 20:49:01
Graciasssss, ya he aprendido  algo mas

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: sanpic en 07 de Marzo de 2009, 17:47:43
Hola amigos.
Alguien podria tener el archivo subido por Lince ? , ya ha caducado el mismo.


Minha contribuição inicial!!
Fontes!!
http://rapidshare.com/files/158984877/Automa__o.zip.html


Saludos a todos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 09 de Marzo de 2009, 09:37:42
Ai vai!!!

http://rapidshare.com/files/207118345/Automa__o.zip.html
MD5: 2FF8AC41070C994462CEF80C96B5DD59

At.
_Lince_
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: sanpic en 09 de Marzo de 2009, 23:35:08
Gracias   :)



Saludos a todos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 10 de Marzo de 2009, 08:51:39
Otra pregunta mas

En el pic simulator ide hay una opcion que es guardar la memoria, y no se si es que lo entiendo mal o que, pero me interesa cargar los datos de la memoria de un programa a otro y no se como hacerlo pues cuando cargo el programa nuevo me borra la memoria y cuando cargo el archivo de la memoria borro el programa.

Alguien me puede echar un cable ?

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 10 de Marzo de 2009, 12:51:20
Se compreendi bem a pergunta... .Está opção é para carregar somente o arquivo .hex de algum
programa para simular e etc...É utilizada para engenharia reversa,após carregado o .hex é possivel desassembla-lo
e modifica-lo, voltando a salva-lo na memória como .hex novamente.
At.
_Lince_
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Marzo de 2009, 21:45:45
Pues la verdad es que no se me planteo el tema, yo he tenido que guardar algún dato en la EEProm interna y lo introduje a través del programador y posteriormente salvando el .hex, pero claro al compilar de nuevo se pierden los valores de la EEProm en el código fuente y abría que añadirlos de nuevo cada vez.

Pues si te resulta mas fácil que como indica lince, puedes crear una lista en el código fuente y antes de ejecutar el main pasar todos estos valores a la EEProm hasta que el código este depurado. Una vez añadidos de nuevo a través del programador y salvados ya te quedan en el archivo .Hex para siguientes volcados en PIC. El problema de esta solución es que consume memoria flash ya que tienes que guardar los datos en un principio en ella para poder transferirlos.

También puedes crear un archivo de texto y tansferir con el hyperterminal al pic utilizando una pequeña rutina de entrada de datos serie que irá guardando estos en la EEProm hasta que el código este terminado.

Otra opción es la de hacerse de un programador o quemador que tenga esta opción por separado, es decir que integre los dos archivos, a programar en la flash y el archivo a programar en la EEProm interna.

PD: Imagino que cuando dices memoria te refieres a la memoria interna EEProm del pic.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 11 de Marzo de 2009, 08:20:17
Si me refiero a la EEPROM, y precisamente hoy he encontrado la solucion que me comentas del grabador. tengo un pickit 2 y permite esa opción, gracias a los dos.

He modificado el programa añadiendo interupciones para gestionar mejor las lecturas de los ADC, que permiten modificar los valores de la entrega de potencia (es un mando de slot) y ahora me enfrento a un nuevo problema, resulta que mediante la simulacion en el PIC, parece funcionar todo bien , pongo el oscilador y veo la frecuencia de salida del PWM y regula bien, y en cambio pongo el PIC en el mando y a partir que incremento la entrada del ADC1 ya me entrega toda la potencia en el mando.

En cambio si reinstalo el programa tal como estaba anteriormente sin usar interrupciones funciona bien, ¿alguna idea de que hago mal o de que puede ser ?

Por cierto que el uso de la memoria EEPROM es porque me planteo hacer un nuevo mando que use un USB y poder grabar solo los datos de la memoria desde el PC (Casi na!!, y mas si ya me atasco ahora)



Sal U2




Código: [Seleccionar]
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 2.0
'Utilización de interrupciones
''**************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5

Dim duty(15) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Byte  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte
Dim i As Byte

'---------------Variables el timer-------------------
Dim t1_ms As Byte  'Base de tiempos del timer 1
Dim t1_ms_t As Byte  'Contiene el valor de t1_ms
Dim t2_ms As Byte  'Base de tiempos del timer 2
Dim t2_ms_t As Byte  'Contiene el valor de t2_ms
Dim t3_ms As Byte  'Base de tiempos del timer 3
Dim t3_ms_t As Byte  'Contiene el valor de t3_ms

'--------------Definición de puertos
ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111  'Configuración input/output
TRISA = %11111111  'Configuración input/output
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
'--------------Configuracion Interrupciones -----------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48

'-------------Carga los valores iniciales del timer ------------------------

t1_ms = 0
t2_ms = 0
t3_ms = 0
t1_ms_t = 3  'Valor para el  timer del P4  Arranque
t2_ms_t = 5  'Valor para el timer del P5 Curva
t3_ms_t = 200  'Valor para el timer del selector de curva

'---------------------Habilita las interrupciones --------------------------------------
T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
PIE1.TMR1IE = 1  'Activa la interrupcion del timer
INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales

'****************************************************************************


'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque

'Activo el PWM
PWMon 1, 9
PWMduty 1, 0

'Rutina principal
loop:
'For i = 1 To 240  'Bucle solo para pruebas de tiempos

'Leo el valor del gatillo
ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
'ADCON1.ADFM = 1  'Activaria lectura 10bit del ADC
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
'vg.HB = ADRESH  'ADC a 10bit
'vg.LB = ADRESL  'ADC a 10bit
vg = ADRESH  'ADC a 8 bit

Select Case vg
Case < 16
PWMduty 1, 0  'Freno
Case < 32
PWMduty 1, duty(0)
Case < 48
PWMduty 1, duty(1)
Case < 64
PWMduty 1, duty(2)
Case < 80
PWMduty 1, duty(3)
Case < 96
PWMduty 1, duty(4)
Case < 112
PWMduty 1, duty(5)
Case < 128
PWMduty 1, duty(6)
Case < 144
PWMduty 1, duty(7)
Case < 160
PWMduty 1, duty(8)
Case < 176
PWMduty 1, duty(9)
Case < 192
PWMduty 1, duty(10)
Case < 208
PWMduty 1, duty(11)
Case < 224
PWMduty 1, duty(12)
Case < 240
PWMduty 1, duty(13)
Case <= 255
PWMduty 1, duty(14)
EndSelect

If t1_ms >= t1_ms_t Then

'Leo el valor de p4 ADC 5
ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 1
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend

asn = ADRESH  'ADC a 8bit
If asn <> asa Then Gosub modificararranque
t1_ms = 0
Endif


If t2_ms >= t2_ms_t Then
'Leo el valor de p5 ADC 0
ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
mcn = ADRESH  'ADC a 8bit
If mcn <> mca Then Gosub modificarcurva
t2_ms = 0
t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
Endif

If t3_ms >= t3_ms_t Then

Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
t3_ms = 0

Endif

'next i  'Bucle para pruebas

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.5 = 1 Then cn = cn + 8

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
ai = LookUp(0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240), cn  'Posicion inicial de memoria donde leer
af = LookUp(14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254), cn  'Posicion final de memoria donde leer

For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           



'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn

Return                                           
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return                                           

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)


mca = mcn
Return                                           

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

EndSelect
Return                                           

'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return                                           

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return                                           

EndSelect
Return                                           

'----------------------- Interrupciones ------------------------------------------
On Interrupt
Save System
If PIR1.TMR1IF = 1 Then
If t1_ms < t1_ms_t Then t1_ms = t1_ms + 1
If t2_ms < t2_ms_t Then t2_ms = t2_ms + 1
If t3_ms < t3_ms_t Then t3_ms = t3_ms + 1

Endif

TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
Resume                                           
                                     

Pd: He actualizado el codigo según las indicaciones de Lince
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: _Lince_ en 11 de Marzo de 2009, 09:13:39
Caro 21CURIOSOS!!Analizando o código postado verifico algumas coisas que na prática não se deve
usar.
1- Na rotina de interrupção apenas verifique quem a gerou e transfira o dado do hardware gerador para sua variavel e retorne da mesma.
(Nunca trate suas variaveis dentro da rotina de interrupção,isso não fará seu programa ficar mais rapido,pois quanto mais tempo ficar dentro
da mesma, mais tempo o flag de interrupção geral vai ficar desligado).
2- Nunca chame subrotinas de dentro da rotina de interrupção, isso vai fazer o programa se perder se você não gerenciar a pilha(Stack) corretamente.

Resumindo:
Na boa prática, crie subrotinas sendo chamadas de dentro da rotina principal (main), e use a rotina de interrupção apenas para checar quem
a gerou, transferir o dado do hardware para sua variavel, zerar o flag correspondente e retornar a rotina principal.Dessa forma seu programa
vai ficar rápido e sem riscos de estourar a pilha(Stack). 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 11 de Marzo de 2009, 20:35:47
Gracias Lince, estos errores demuestran lo poco que se todavia,  tomo nota y me pongo a modificarlo

Sal U2

Edito para no alargar el tema.

Ya he cambiado las rutinas que tenia en las interrupciones al main, ahora lo que detecto es como si el pwm me diese una resolucion mucho mas baja, me explico:

Lo tengo establecido a PWM 1,9 que es a resolucion de 8 bits (hasta 256) pero en cambio cuando introduzco un valor en el PWM superior a 21 o 22 ya me entrega toda la potencia como si estuviese a 255 segun la resolucion establecida.

Sabeis alguno porque se produce este problema ( si cambio el Pic que tengo grabado con el anterior programa funciona bien)

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 13 de Marzo de 2009, 21:27:33
Bien ya he encontrado el problema, aunque sigo sin entenderlo.

El programilla solo funciona bien si quito la linea
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz

Agradeceria que alguien me pueda explicar porque.

Tambien tengo otra duda y es que el en el timer_3 cuento 200 ms para ejecutar una accion, pero esta me tarda varios segundos en realizarla. Y tampoco se cual es el motivo

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Marzo de 2009, 21:48:58
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz

La linea la utilizo en todos mis programas y nunca tuve problema, de echo ya se comento este registro y no se le saco ningun fallo.... :shock:
y si no recuerdo mal si no se coloca el micro anda por defecto a 4Mhz. De todas formas a ver si mañana puedo echar un vistazo mas detallado el programa.

Tambien te lo he compilado con mi version del psi que es la ultima a ver que te hace.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 14 de Marzo de 2009, 09:17:23
No si lo mas curioso es que , me hice la Ebasic, y los programas que tienes colgados en este hilo me funcionan bien y siempre con el registro osccon , por eso no lo entiendo.

Y en el PSI no me da ningun fallo a mi, solo al hacerlo servir en el mando.

Descargo tu version y lo probaré.

Por cierto una pregunta ¿es posible generar un programa con el PSI (aunque no se pueda simular) para un micro que no este en la lista?. Quiero utilizar un PIC18f14k50 y no lo he encontrado en la lista de pic que admite el PSI.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Marzo de 2009, 10:45:04
.
.
.
Por cierto una pregunta ¿es posible generar un programa con el PSI (aunque no se pueda simular) para un micro que no este en la lista?. Quiero utilizar un PIC18f14k50 y no lo he encontrado en la lista de pic que admite el PSI.

En realidad no se me ha plateado, en teoría se podría trabajar con otro micro que comparta las mismas direcciones de registro, pero de seguro la estructura interna no será exactamente igual a la del otro modelo ya que no tiene sentido tener dos modelos diferentes si son iguales. No lo veo nada claro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Marzo de 2009, 15:51:44
Pues lo he estado probando y me da lo mismo en el PSI que en la Pic EBasic.
Obtengo solo dos valores uno muy bajo y otro alto.

Para RA5=1, AN1 entre 0 y 5V, AN0=0, AN5=0

He tenido que hacer unas ligueras modificaciones, como cargar la EEProm con valores y anular la lectura de los RA2, RA3 y RA4 para no tener que polarizarlos. La EEProm la he cargado con valores ascendente no se como afectara esto.

Una vez cargados los valores de la EEProm el soft del programador del PSI los reconoce y los carga de forma automática, por lo que la operación solo hay que hacerla una sola vez y no se pierden aunque se compile.

El t3_ms a mi me funciona correctamente.
 
Código: QBasic/QuickBASIC
  1. '***************************************************************************************
  2. 'NOMBRE: 16F88_MandoJEVO_01
  3. 'MICRO: PIC16f88
  4. 'Version: 2.0
  5. 'Utilización de interrupciones
  6. ''**************************************************************************************
  7. Define CONF_WORD = 0x2f50
  8. Define CONF_WORD_2 = 0x3ffc
  9. Define CLOCK_FREQUENCY = 8
  10. 'Define ADC_SAMPLEUS = 10
  11. 'Define ADC_CLOCK = 5
  12.  
  13. DIM duty(15) AS Byte  'Duty Cicle
  14. DIM curva(15) AS Byte  'Curva grabada
  15. DIM vg AS Byte  'Valor gatillo
  16. DIM ca AS Byte  'Curva actual
  17. DIM cn AS Byte  'Curva nueva
  18. DIM mca AS Byte  'Modificacion curva actual P5
  19. DIM mcn AS Byte  'Modificacion curva nueva  P5
  20. DIM asa AS Byte  'Antispin Actual P4
  21. DIM asn AS Byte  'Antispin nuevo P4
  22. DIM ai AS Byte  'Contador inicio
  23. DIM af AS Byte  'Contador fin
  24. DIM a AS Byte  'contador
  25. DIM b AS Byte
  26. DIM va(4) AS Byte
  27. DIM mc(3) AS Byte
  28. DIM i AS Byte
  29. '---------------Variables el timer-------------------
  30. DIM t1_ms AS Byte  'Base de tiempos del timer 1
  31. DIM t1_ms_t AS Byte  'Contiene el valor de t1_ms
  32. DIM t2_ms AS Byte  'Base de tiempos del timer 2
  33. DIM t2_ms_t AS Byte  'Contiene el valor de t2_ms
  34. DIM t3_ms AS Byte  'Base de tiempos del timer 3
  35. DIM t3_ms_t AS Byte  'Contiene el valor de t3_ms
  36. '--------------Definición de puertos
  37. ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
  38. TRISB = %11110111  'Configuración input/output
  39. TRISA = %01100011  'Configuración input/output'MODIFICADOS PARA QUE QUEDEN POLARIZADOS, ACTIVO LED1 (RA7)
  40. CMCON = 0x07  'Comparador a off
  41. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  42. ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
  43. ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  44. ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  45. '--------------Configuracion Interrupciones -----------------
  46. T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
  47. T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
  48. T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
  49. TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
  50. TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
  51. '-------------Carga los valores iniciales del timer ------------------------
  52. t1_ms = 0
  53. t2_ms = 0
  54. t3_ms = 0
  55. t1_ms_t = 3  'Valor para el  timer del P4  Arranque
  56. t2_ms_t = 5  'Valor para el timer del P5 Curva
  57. t3_ms_t = 200  'Valor para el timer del selector de curva
  58. '---------------------Habilita las interrupciones --------------------------------------
  59. T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
  60. 'PIE1.TMR1IE = 1  'Activa la interrupcion del timer
  61. INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
  62. Enable  'INTCON.GIE habilita todas las interrupciones globales
  63. '****************************************************************************
  64. 'Ver curva actual
  65. 'Gosub write_memoria
  66. GOSUB vercurva
  67. GOSUB leermemoria
  68. GOSUB modificarcurva
  69. GOSUB modificararranque
  70. PIE1.TMR1IE = 1  'Activa la interrupcion del timer
  71. 'Activo el PWM
  72. PWMon 1, 9
  73. PWMduty 1, 0
  74. 'Rutina principal
  75. LOOP:
  76.         'For i = 1 To 240  'Bucle solo para pruebas de tiempos
  77.  
  78.         'Leo el valor del gatillo
  79.         ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
  80.         ADCON0.CHS1 = 0
  81.         ADCON0.CHS2 = 0
  82.         'ADCON1.ADFM = 1  'Activaria lectura 10bit del ADC
  83.         'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  84.         ADCON0.GO = 1  'Activo una lectura
  85.         WHILE ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
  86.         WEND
  87.         'vg.HB = ADRESH  'ADC a 10bit
  88.         'vg.LB = ADRESL  'ADC a 10bit
  89.         vg = ADRESH  'ADC a 8 bit
  90.  
  91.         SELECT CASE vg
  92.                 CASE < 16
  93.                         PWMduty 1, 0  'Freno
  94.                 CASE < 32
  95.                         PWMduty 1, duty(0)
  96.                 CASE < 48
  97.                         PWMduty 1, duty(1)
  98.                 CASE < 64
  99.                         PWMduty 1, duty(2)
  100.                 CASE < 80
  101.                         PWMduty 1, duty(3)
  102.                 CASE < 96
  103.                         PWMduty 1, duty(4)
  104.                 CASE < 112
  105.                         PWMduty 1, duty(5)
  106.                 CASE < 128
  107.                         PWMduty 1, duty(6)
  108.                 CASE < 144
  109.                         PWMduty 1, duty(7)
  110.                 CASE < 160
  111.                         PWMduty 1, duty(8)
  112.                 CASE < 176
  113.                         PWMduty 1, duty(9)
  114.                 CASE < 192
  115.                         PWMduty 1, duty(10)
  116.                 CASE < 208
  117.                         PWMduty 1, duty(11)
  118.                 CASE < 224
  119.                         PWMduty 1, duty(12)
  120.                 CASE < 240
  121.                         PWMduty 1, duty(13)
  122.                 CASE <= 255
  123.                         PWMduty 1, duty(14)
  124.         EndSelect
  125.  
  126.         IF t1_ms >= t1_ms_t THEN
  127.                 'Leo el valor de p4 ADC 5
  128.                 ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
  129.                 ADCON0.CHS1 = 0
  130.                 ADCON0.CHS2 = 1
  131. 'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  132.                 ADCON0.GO = 1  'Activo una lectura
  133.                 WHILE ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
  134.                 WEND
  135.                 asn = ADRESH  'ADC a 8bit
  136.                 IF asn <> asa THEN GOSUB modificararranque
  137.                 t1_ms = 0
  138.         Endif
  139.  
  140.         IF t2_ms >= t2_ms_t THEN
  141.                 'Leo el valor de p5 ADC 0
  142.                 ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
  143.                 ADCON0.CHS1 = 0
  144.                 ADCON0.CHS2 = 0
  145. 'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  146.                 ADCON0.GO = 1  'Activo una lectura
  147.                 WHILE ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
  148.                 WEND
  149.                 mcn = ADRESH  'ADC a 8bit
  150.                 IF mcn <> mca THEN GOSUB modificarcurva
  151.                 t2_ms = 0
  152.                 t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
  153.                 'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
  154.         Endif
  155.  
  156.         IF t3_ms >= t3_ms_t THEN
  157.                 Toggle RA7  'visualiza activacion de la rutina por el led LD1
  158.                 GOSUB vercurva  'Comprueba que no se haya cambiado la curva
  159.                 IF cn <> ca THEN GOSUB leermemoria
  160.                 t3_ms = 0
  161.         Endif
  162.  
  163. 'next i  'Bucle para pruebas
  164. GOTO LOOP
  165. END                                              
  166.  
  167.  
  168. '********************************************************
  169. 'Deteccion de la curva a leer
  170. vercurva:
  171.         'Ver curva nueva
  172.         cn = 0
  173. 'If PORTA.4 = 1 Then cn = cn + 1
  174. 'If PORTA.3 = 1 Then cn = cn + 2
  175. 'If PORTA.2 = 1 Then cn = cn + 4
  176.         IF PORTA.5 = 1 THEN cn = cn + 8  'SOLO UTILIZO LA OPCION A.5 = 1
  177. RETURN                                            
  178. leermemoria:
  179.         'Leer valores Guardados segun la curva a leer
  180.         ai = LookUp(0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240), cn  'Posicion inicial de memoria donde leer
  181.         af = LookUp(14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254), cn  'Posicion final de memoria donde leer
  182.         FOR a = ai TO af
  183.                 b = a - ai
  184.                 READ a, duty(b)
  185.                 curva(b) = duty(b)
  186.         NEXT a
  187.         'Genera los valores para las modificaciones de curvas
  188.         va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
  189.         va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
  190.         va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
  191.         va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
  192.         ca = cn
  193. RETURN                                            
  194. write_memoria:  'ESCRIBO VALORES EN LA EEPROM INTERNA DEL MICRO
  195.         FOR a = 0 TO 255
  196.                 WRITE a, a
  197.         NEXT a
  198. RETURN                                            
  199.  
  200. '*************************************************************
  201. 'Ajuste fino de la curva grabada
  202. 'Rutina para modificar el centro de la curva
  203. modificarcurva:
  204.         SELECT CASE mcn
  205.                 CASE < 22  'P -5
  206.                         mc(0) = ((va(3) * 5) / 10)
  207.                         mc(1) = ((va(1) * 5) / 10)
  208.                         duty(5) = curva(5) - mc(0)
  209.                         duty(6) = curva(6) - mc(1)
  210.                         duty(7) = curva(7) - mc(1)
  211.                         duty(8) = curva(8) - mc(1)
  212.                         duty(9) = curva(9) - mc(0)
  213.                         mca = mcn
  214.                         RETURN
  215.  
  216.                 CASE < 44  'P -4
  217.                         mc(0) = ((va(3) * 4) / 10)
  218.                         mc(1) = ((va(1) * 4) / 10)
  219.                         duty(5) = curva(5) - mc(0)
  220.                         duty(6) = curva(6) - mc(1)
  221.                         duty(7) = curva(7) - mc(1)
  222.                         duty(8) = curva(8) - mc(1)
  223.                         duty(9) = curva(9) - mc(0)
  224.                         mca = mcn
  225.                         RETURN
  226.  
  227.                 CASE < 66  'P -3
  228.                         mc(0) = ((va(3) * 3) / 10)
  229.                         mc(1) = ((va(1) * 3) / 10)
  230.                         duty(5) = curva(5) - mc(0)
  231.                         duty(6) = curva(6) - mc(1)
  232.                         duty(7) = curva(7) - mc(1)
  233.                         duty(8) = curva(8) - mc(1)
  234.                         duty(9) = curva(9) - mc(0)
  235.                         mca = mcn
  236.                         RETURN
  237.  
  238.                 CASE < 88  'P -2
  239.                         mc(0) = ((va(3) * 2) / 10)
  240.                         mc(1) = ((va(1) * 2) / 10)
  241.                         duty(5) = curva(5) - mc(0)
  242.                         duty(6) = curva(6) - mc(1)
  243.                         duty(7) = curva(7) - mc(1)
  244.                         duty(8) = curva(8) - mc(1)
  245.                         duty(9) = curva(9) - mc(0)
  246.                         mca = mcn
  247.                         RETURN
  248.  
  249.                 CASE < 110  'P -1
  250.                         mc(0) = va(3) / 10
  251.                         mc(1) = va(1) / 10
  252.                         duty(5) = curva(5) - mc(0)
  253.                         duty(6) = curva(6) - mc(1)
  254.                         duty(7) = curva(7) - mc(1)
  255.                         duty(8) = curva(8) - mc(1)
  256.                         duty(9) = curva(9) - mc(0)
  257.                         mca = mcn
  258.                         RETURN
  259.  
  260.                 CASE < 145  'P 0
  261.                         duty(5) = curva(5)
  262.                         duty(6) = curva(6)
  263.                         duty(7) = curva(7)
  264.                         duty(8) = curva(8)
  265.                         duty(9) = curva(9)
  266.                         mca = mcn
  267.                         RETURN
  268.  
  269.                 CASE < 165  'P +1
  270.                         mc(0) = va(3) / 10
  271.                         mc(1) = va(2) / 10
  272.                         mc(2) = va(1) / 10
  273.                         duty(5) = curva(5) + mc(0)
  274.                         duty(6) = curva(6) + mc(1)
  275.                         duty(7) = curva(7) + mc(2)
  276.                         duty(8) = curva(8) + mc(1)
  277.                         duty(9) = curva(9) + mc(0)
  278.                         mca = mcn
  279.                         RETURN
  280.  
  281.                 CASE < 185  'P +2
  282.                         mc(0) = ((va(3) * 2) / 10)
  283.                         mc(1) = ((va(2) * 2) / 10)
  284.                         mc(2) = ((va(1) * 2) / 10)
  285.                         duty(5) = curva(5) + mc(0)
  286.                         duty(6) = curva(6) + mc(1)
  287.                         duty(7) = curva(7) + mc(2)
  288.                         duty(8) = curva(8) + mc(1)
  289.                         duty(9) = curva(9) + mc(0)
  290.                         mca = mcn
  291.                         RETURN
  292.  
  293.                 CASE < 205  'P +3
  294.                         mc(0) = ((va(3) * 3) / 10)
  295.                         mc(1) = ((va(2) * 3) / 10)
  296.                         mc(2) = ((va(1) * 3) / 10)
  297.                         duty(5) = curva(5) + mc(0)
  298.                         duty(6) = curva(6) + mc(1)
  299.                         duty(7) = curva(7) + mc(2)
  300.                         duty(8) = curva(8) + mc(1)
  301.                         duty(9) = curva(9) + mc(0)
  302.                         mca = mcn
  303.                         RETURN
  304.  
  305.                 CASE < 230  'P +4
  306.                         mc(0) = ((va(3) * 4) / 10)
  307.                         mc(1) = ((va(2) * 4) / 10)
  308.                         mc(2) = ((va(1) * 4) / 10)
  309.                         duty(5) = curva(5) + mc(0)
  310.                         duty(6) = curva(6) + mc(1)
  311.                         duty(7) = curva(7) + mc(2)
  312.                         duty(8) = curva(8) + mc(1)
  313.                         duty(9) = curva(9) + mc(0)
  314.                         mca = mcn
  315.                         RETURN
  316.        
  317.                 CASE <= 255  'P +5
  318.                         mc(0) = ((va(3) * 5) / 10)
  319.                         mc(1) = ((va(2) * 5) / 10)
  320.                         mc(2) = ((va(1) * 5) / 10)
  321.                         duty(5) = curva(5) + mc(0)
  322.                         duty(6) = curva(6) + mc(1)
  323.                         duty(7) = curva(7) + mc(2)
  324.                         duty(8) = curva(8) + mc(1)
  325.                         duty(9) = curva(9) + mc(0)
  326.                         mca = mcn
  327.                         RETURN
  328.         EndSelect
  329. RETURN                                            
  330. '*****************************************************************
  331. 'Ajuste del control de arrancada
  332. modificararranque:
  333.         SELECT CASE asn
  334.                 CASE < 25  'P 1
  335.                         duty(0) = curva(0)
  336.                         duty(1) = curva(1)
  337.                         duty(2) = curva(2)
  338.                         duty(3) = curva(3)
  339.                         duty(4) = curva(4)
  340.                         asa = asn
  341.                         RETURN
  342.  
  343.                 CASE < 50  'P 2
  344.                         duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
  345.                         duty(1) = curva(1)
  346.                         duty(2) = curva(2)
  347.                         duty(3) = curva(3)
  348.                         duty(4) = curva(4)
  349.                         asa = asn
  350.                         RETURN
  351.  
  352.                 CASE < 75  'P 3
  353.                         duty(0) = curva(1)
  354.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  355.                         duty(2) = curva(2)
  356.                         duty(3) = curva(3)
  357.                         duty(4) = curva(4)
  358.                         asa = asn
  359.                         RETURN
  360.  
  361.                 CASE < 100  'P 4
  362.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  363.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  364.                         duty(2) = curva(2)
  365.                         duty(3) = curva(3)
  366.                         duty(4) = curva(4)
  367.                         asa = asn
  368.                         RETURN
  369.  
  370.                 CASE < 125  'P 5
  371.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  372.                         duty(1) = curva(2)
  373.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  374.                         duty(3) = curva(3)
  375.                         duty(4) = curva(4)
  376.                         asa = asn
  377.                         RETURN
  378.  
  379.                 CASE < 150  'P 6
  380.                         duty(0) = curva(2)
  381.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  382.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  383.                         duty(3) = curva(3)
  384.                         duty(4) = curva(4)
  385.                         asa = asn
  386.                         RETURN
  387.        
  388.                 CASE < 175  'P 7
  389.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  390.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  391.                         duty(2) = curva(3)
  392.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  393.                         duty(4) = curva(4)
  394.                         asa = asn
  395.                         RETURN
  396.  
  397.                 CASE < 200  'p 8
  398.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  399.                         duty(1) = curva(3)
  400.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  401.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  402.                         duty(4) = curva(4)
  403.                         asa = asn
  404.                         RETURN
  405.  
  406.                 CASE < 225  'P 9
  407.                         duty(0) = curva(3)
  408.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  409.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  410.                         duty(3) = curva(4)
  411.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  412.                         asa = asn
  413.                         RETURN
  414.  
  415.                 CASE <= 255  'P 10
  416.                         duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  417.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  418.                         duty(2) = curva(4)
  419.                         duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  420.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
  421.                         asa = asn
  422.                 RETURN
  423.  
  424.         EndSelect
  425. RETURN                                            
  426.  
  427. '----------------------- Interrupciones ------------------------------------------
  428. ON Interrupt
  429. 'Save System
  430.         IF PIR1.TMR1IF = 1 THEN
  431.                 IF t1_ms < t1_ms_t THEN t1_ms = t1_ms + 1
  432.                 IF t2_ms < t2_ms_t THEN t2_ms = t2_ms + 1
  433.                 IF t3_ms < t3_ms_t THEN t3_ms = t3_ms + 1
  434.         Endif
  435.         TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
  436.         TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
  437.         PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
  438. RESUME
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 14 de Marzo de 2009, 19:03:29
Prueba a eliminar la linea osccon y pruebalo, entonces obtienes los valores de salida del PWM segun modifiques el an1

Se supone que la frecuencia del reloj ya la defines en la linea: Define CLOCK_FREQUENCY = 8

Pero sigo sin entender porque no funciona con la linea OSCCON

Yo la version del PSI es la 6.51 me estoy planteando comprar la actual, aunque me frena un poco el tema de que no tengo incluido el pic que comentaba, el 18f14k50 que tiene USB y es "pequeño", 20 patas
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Marzo de 2009, 22:54:42
Bien, cambie los datos en la eeprom y ya funciona, me hace lo mismo en el PSI que en la realidad... :mrgreen:
Dejo los datos que he utilizado para la opcion RA5:



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Marzo de 2009, 23:02:07
No se que problema puedes tener pero a mi me funciona.

Clock_Frequency indica al compilador a que frecuencia trabajaremos pero no afecta al micro, esto quiere decir que el compilador puede hacer todos los cálculos para trabajar a 8Mhz pero el micro puede estar funcionado a otra frecuencia, como puede ser 4Mhz, por lo que todos los cálculos se alargan y puede que algunas funciones no funcionen bien.

Dejo el archivo de nuevo con los valores de la eeprom precargados.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 15 de Marzo de 2009, 19:01:53
Te explico, en tu hex del 14 de marzo 00.48 me pasa lo mismo que cuando lo compilo yo, la respuesta no es segun los valores del PWM duty, simplemente, me va o parado o casi gas a fondo, no me regula segun los parametros que yo le he dado, y los siguientes ejemplos, supongo que son para la Ebasic, pues provado en el mando no da señal ninguna del PWM

En la ebasic, solo me parpadea el led pero al regular con el potenciometro no varia la frecuencia del parpadeo

Prueba a utilizar los valores de la memoria de 30(decimal) para arriba a ver si funciona que es cuando me falla a mi.,

Realmente no se cual puede ser el problema, pues a mi en el PSI tambien me simula bien

Sal u2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Marzo de 2009, 20:33:14
Claro lo he probado en la EBasic, el led que parpadea no tiene que variar de frecuencia tan solo es un chivato que delata cuando se ejecuta una rutina determinada, en este caso t3_ms, este es un método muy común para comprobar algo visualmente.

La EBasic es una placa entrenadora y en realidad no hay porque utilizarla con el display, si se retira el display queda el zócalo libre para poder interactuar como se quiera con esos pin y lo mismo con casi todos los de mas. Y si funciona bajo esta placa también debería funcionar en tu mando.

En fin o yo no te entiendo lo que ocurre.

De todas formas como la curiosidad me gana, puedes hacer me llegar el programa que te funciona, lo pruebo y una vez verificado que me funciona a mi también lo voy modificando sobre la marcha, añadiendo la nueva forma de leer el ADC y añadiendo las bases de tiempos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 16 de Marzo de 2009, 05:59:41
Te envio el programa que me funciona, pero a continuacion tambien te describo las pruebas que hice con lo que descubri lo de la linea osccon.

Este esl el codigo con el que probe, como veras tambien probe a anotar los bits de OSCCON por separado, con este codigo si activo la linea OSCCON, ya me falla. El resultado es que hasta un valor entre 25 o 30 puedo regular el mando y a partir de ahí ya empieza a darme el maximo, se supone que los 255 en el PWM

Será un Poltergeist?



Código: [Seleccionar]
'* * * * * * * * * * * * * adaptado para trabajar con el modulo adc sin interrupciones * * * * * * * * * * * * * *
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 1.0
''**************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5

Dim duty(15) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Word  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte

ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111  'Configuración input/output todo entradas menos el port b 3
TRISA = %11111111  'Configuración input/output todo entradas
CMCON = 0x07  'Comparador a off    "00000111"

'OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz "01111110"

'OSCCON.IRCF2 = 1  '= 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz "01111110"
'OSCCON.IRCF1 = 1
'OSCCON.IRCF0 = 1
ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA1
ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON

PWMon 1, 9
PWMduty 1, 0

'****************************************************************************
'Rutina principal
loop:
'Adcin 1, vg  'lee el valor del gatillo
ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 1  'Activa lectura 10bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
vg.HB = ADRESH  'ADC a 10bit
vg.LB = ADRESL  'ADC a 10bit
'vg = ADRESh  'ADC a 8 bit

Select Case vg
Case < 64
PWMduty 1, 0  'Freno
Case < 128
PWMduty 1, 10
Case < 192
PWMduty 1, 20
Case < 256
PWMduty 1, 30
Case < 320
PWMduty 1, 40
Case < 384
PWMduty 1, 50
Case < 448
PWMduty 1, 70
Case < 512
PWMduty 1, 90
Case < 576
PWMduty 1, 110
Case < 640
PWMduty 1, 130
Case < 704
PWMduty 1, 150
Case < 768
PWMduty 1, 170
Case < 832
PWMduty 1, 190
Case < 896
PWMduty 1, 200
Case < 960
PWMduty 1, 210
Case <= 1024
PWMduty 1, 230
EndSelect


Goto loop
End                                               



Y este es el código que me funciona, pero supongo que por lo que comentas a 4 mhz
Código: [Seleccionar]
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 2.0
'Utilización de interrupciones
''**************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5

Dim duty(15) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Word  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte
Dim i As Byte

'---------------Variables el timer-------------------
Dim t1_ms As Byte  'Base de tiempos del timer 1
Dim t1_ms_t As Byte  'Contiene el valor de t1_ms
Dim t2_ms As Byte  'Base de tiempos del timer 2
Dim t2_ms_t As Byte  'Contiene el valor de t2_ms
Dim t3_ms As Byte  'Base de tiempos del timer 3
Dim t3_ms_t As Byte  'Contiene el valor de t3_ms

'--------------Definición de puertos
ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111  'Configuración input/output
TRISA = %11111111  'Configuración input/output
CMCON = 0x07  'Comparador a off
'OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
'--------------Configuracion Interrupciones -----------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48

'-------------Carga los valores iniciales del timer ------------------------

t1_ms = 0
t2_ms = 0
t3_ms = 0
t1_ms_t = 1  'Valor para el  timer del P4  Arranque
t2_ms_t = 3  'Valor para el timer del P5 Curva
t3_ms_t = 10  'Valor para el timer del selector de curva

'---------------------Habilita las interrupciones --------------------------------------
T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
PIE1.TMR1IE = 1  'Activa la interrupcion del timer
INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales

'****************************************************************************


'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque

'Activo el PWM
PWMon 1, 9
PWMduty 1, 0

'Rutina principal
loop:
'For i = 1 To 240  'Bucle solo para pruebas de tiempos

'Leo el valor del gatillo
ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 1  'Activaria lectura 10bit del ADC
'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
vg.HB = ADRESH  'ADC a 10bit
vg.LB = ADRESL  'ADC a 10bit
'vg = ADRESH  'ADC a 8 bit

Select Case vg
Case < 64
PWMduty 1, 0  'Freno
Case < 128
PWMduty 1, duty(0)
Case < 192
PWMduty 1, duty(1)
Case < 256
PWMduty 1, duty(2)
Case < 320
PWMduty 1, duty(3)
Case < 384
PWMduty 1, duty(4)
Case < 448
PWMduty 1, duty(5)
Case < 512
PWMduty 1, duty(6)
Case < 576
PWMduty 1, duty(7)
Case < 640
PWMduty 1, duty(8)
Case < 704
PWMduty 1, duty(9)
Case < 768
PWMduty 1, duty(10)
Case < 832
PWMduty 1, duty(11)
Case < 896
PWMduty 1, duty(12)
Case < 1024
PWMduty 1, duty(13)
Case <= 255
PWMduty 1, duty(14)
EndSelect

If t1_ms >= t1_ms_t Then

'Leo el valor de p4 ADC 5
ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 1
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend

asn = ADRESH  'ADC a 8bit
If asn <> asa Then Gosub modificararranque
t1_ms = 0
Endif


If t2_ms >= t2_ms_t Then
'Leo el valor de p5 ADC 0
ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
ADCON0.GO = 1  'Activo una lectura
While ADCON0.GO = 1  'Espera hasta terminar la conversion ADC
Wend
mcn = ADRESH  'ADC a 8bit
If mcn <> mca Then Gosub modificarcurva
t2_ms = 0
t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
Endif

If t3_ms >= t3_ms_t Then

Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
t3_ms = 0

Endif

'next i  'Bucle para pruebas

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.5 = 1 Then cn = cn + 8

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
ai = LookUp(0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240), cn  'Posicion inicial de memoria donde leer
af = LookUp(14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254), cn  'Posicion final de memoria donde leer

For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           



'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn

Return                                           
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return                                           

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return                                           
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)


mca = mcn
Return                                           

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return                                           

EndSelect
Return                                           

'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return                                           

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return                                           

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return                                           

EndSelect
Return                                           

'----------------------- Interrupciones ------------------------------------------
On Interrupt
Save System
If PIR1.TMR1IF = 1 Then
If t1_ms < t1_ms_t Then t1_ms = t1_ms + 1
If t2_ms < t2_ms_t Then t2_ms = t2_ms + 1
If t3_ms < t3_ms_t Then t3_ms = t3_ms + 1

Endif

TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
Resume                                           

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Marzo de 2009, 06:08:37
Hasta donde se, si no indicas nada al PSI compilara a 4 Mhz y lo mismo el micro, si no le indicas la velocidad creo que queda configurado para trabajar a 4Mhz.

Yo siempre he utilizado el PSI con los programadores recomendados por el autor, no se si el utilizar programadores diferentes puede afectar en algo, de todas formas en las ultimas versiones creo que realizó algunas modificaciones en el código, puede que ahora sea más compatible..... si es que antes no lo era.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 16 de Marzo de 2009, 06:27:59
Ya pero esto lo entenderia que no fuese compatible si tus ejemplos no me funcionasen en la Ebasic, pero tus ejemplos me funcionan, por eso creo que debe haber algo mas, utilizacion de alguna entrada del pic que no pueda utlizarse, en segun que condiciones, etc... , o algo asi.

Si quito, las dos lineas de configuracion Word y Word2, tampoco funciona.

Sal U2


Edito por si sirve de algo, si codifico OSCCON para 4 mhz, la salida PWM se me dispara al pasar del valor 40 ( en 8 mhz era entre 20 y 25), y a 2 mhz  a partir de 90, lo que casi me hace pensar que la frecuencia que entrega el pwm a 8 mhz es demasiado alta y "por decirlo de alguna forma" se satura, ¿ estoy diciendo alguna tonteria ? o puede ser. Si es asi,  quiza el problema este en el optoacoplador que utilizo, que puede que le llegue una frecuencia demasiado alta.


Reedito, Te confirmo que era la saturacion del optoacoplador, ahora he definido la frecuencia del PWM  a 1,8  (3900 hz segun el manual x 2 ) y el mando funciona a 8Mhz. Ahora tendre que decidir si utilizo una frecuencia mayor, porque me silba el motor,  para aumentarla deberia ser con 9 bits y eso implica modificar gran parte del programa y el uso de la memoria.



Pero sigo sin entender porque me funciona sin poner la linea OSCCON

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Marzo de 2009, 09:32:08
Nunca se ha plateado problemas con el registro OSCCON así que haré un estudio del registro  a ver como se comporta por defecto en el PSI.

Y con respecto al CCP1 creo que lo mejor va a ser utilizar la configuración del modulo directamente, de todas formas lo mejor es hacer los cálculos a mano para hacerse una idea de las frecuencias y el numero de BIT, creo recordar que eso esta en el índice de este hilo, pero de todas formas tengo un enlace a una pagina que suministrando los datos de entrada ya hace los cálculos y da todos los valores para poder trabajar con el registro, a ver si lo encuentro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Marzo de 2009, 11:19:07
Tienes que prestar mucha atención a la resolución del CCP, numero de BIT, ya que si té pasas de esa resolución pasa directamente la salida del CCP a nivel 1.

Enlace calculo CCP:

http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html

por ejemplo si te sale una resolución máxima de 64 puntos, ósea de 0 a 63, a partir de 63 la salida ya queda a estado 1.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 17 de Marzo de 2009, 07:19:34
He estado revisando los parametros de OSCCON y supongo que si no ponia este registro es como ponerlo a 0 y por tanto seguramente trabajaba a 31 khz (quizas por eso algunas funciones me ivan muy lentas).

Ya he enlazado con la pagina web para el cálculo de frecuencias y configuracion, he configurado el CCP1 y el resultado no puede ser mejor, he utilizado un frecuencia de 16 Mhz, el silbido del motor ya no se oye y con todo arreglado los cambios de curva (lectura de la memoria y modificacion de los valores) no observo pausas en el comportamiento del mando.  Ahora ya solo falta mejorar el dedo para el gatillo (cosa que no tiene arreglo).

Bueno bromas a parte gracias por tu ayuda. Si crees que vale la pena cuelgo de nuevo el programa y borro los anteriores para que el hilo no quede tan largo

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Marzo de 2009, 09:37:39
Me alegro que funcione bien el proyecto. Lo de publicarlo eso queda a tu elección, ya que hay información suficiente marcada en el índice para trabajar con el ADC, CCP1 y las bases de tiempos. Y con respecto a modificar otro hilo antiguo pues no soy muy partidario porque se pierde la coherencia de los posteos.

De todas formas hay varias mejoras posibles en el programa actual, utilizas las interrupciones para generar bases de tiempos pero también puedes aprovecharlas para hacer la lectura del ADC, con lo que ganas otra vez tiempo y puede que algún cambio más.

Pero lo importante es que siguas haciendo cosas y te mantengas por aquí para compartir tus nuevos conocimientos y experiencias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 18 de Marzo de 2009, 06:18:39
Citar
De todas formas hay varias mejoras posibles en el programa actual, utilizas las interrupciones para generar bases de tiempos pero también puedes aprovecharlas para hacer la lectura del ADC, con lo que ganas otra vez tiempo y puede que algún cambio más.

Esto, si no entiendo mal, es lo que hice en una de las versiones del programa, (salvo que tambien incluia GOSUB dentro del control de las interrupciones) y lince me aconsejo minimizar el código dentro de las interrupciones.

Ahora tambien me estoy planteando una nueva meta y que creo que no has tocado en este hilo, el otro dia desmonte una impresora HP y extraje los motores pensando que serian PAP como EPSON, pero sorpresa me encontre que eran motores normales y que utilizaban encoders para saber la posicion. Trasladando en lo posible esto a la EBasic, estoy pensando en adaptar un zocalo donde va el PIC y utilizar las entradas de los pulsadores para recibir las señales de los  encoders de un raton y asi poder probar la funcion count ,  el control del sentido de giro y mostrar el resultado en el LCD. (Je, je, seguro que necesito ayuda)

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2009, 20:44:57
No me refiero a los gosub, dejo el ejemplo a ver que te parece, con esto te quitas los bucles de espera While-Wend

Código: QBasic/QuickBASIC
  1. '***************************************************************************************
  2. 'NOMBRE: 16F88_MandoJEVO_01
  3. 'MICRO: PIC16f88
  4. 'Version: 2.0
  5. 'Utilización de interrupciones
  6. ''**************************************************************************************
  7. Define CONF_WORD = 0x2f50
  8. Define CONF_WORD_2 = 0x3ffc
  9. Define CLOCK_FREQUENCY = 8
  10. 'Define ADC_SAMPLEUS = 10
  11. 'Define ADC_CLOCK = 5
  12.  
  13. DIM duty(15) AS Byte  'Duty Cicle
  14. DIM curva(15) AS Byte  'Curva grabada
  15. DIM vg AS Byte  'Valor gatillo
  16. DIM ca AS Byte  'Curva actual
  17. DIM cn AS Byte  'Curva nueva
  18. DIM mca AS Byte  'Modificacion curva actual P5
  19. DIM mcn AS Byte  'Modificacion curva nueva  P5
  20. DIM asa AS Byte  'Antispin Actual P4
  21. DIM asn AS Byte  'Antispin nuevo P4
  22. DIM ai AS Byte  'Contador inicio
  23. DIM af AS Byte  'Contador fin
  24. DIM a AS Byte  'contador
  25. DIM b AS Byte
  26. DIM va(4) AS Byte
  27. DIM mc(3) AS Byte
  28. DIM i AS Byte
  29. DIM e_adc AS Byte  'Selecciona la entrada del ADC
  30. '---------------Variables el timer-------------------
  31. DIM t1_ms AS Byte  'Base de tiempos del timer 1
  32. DIM t1_ms_t AS Byte  'Contiene el valor de t1_ms
  33. DIM t2_ms AS Byte  'Base de tiempos del timer 2
  34. DIM t2_ms_t AS Byte  'Contiene el valor de t2_ms
  35. DIM t3_ms AS Byte  'Base de tiempos del timer 3
  36. DIM t3_ms_t AS Byte  'Contiene el valor de t3_ms
  37. '--------------Definición de puertos
  38. ANSEL = %00100011  'Los pin digitales y NA5, NA1 y NA0 como analogicos
  39. TRISB = %11110111  'Configuración input/output
  40. TRISA = %01100011  'Configuración input/output'MODIFICADOS PARA QUE QUEDEN POLARIZADOS
  41. CMCON = 0x07  'Comparador a off
  42. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  43. ADCON0 = %00100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
  44. ADCON1 = %10000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  45. ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  46. '--------------Configuracion Interrupciones -----------------
  47. T1CON.TMR1CS = 0  'asigna el reloj interno al timer 1, se incrementa cada ciclo de instruccion
  48. T1CON.T1CKPS0 = 0  'Factor de preescaler del timer 1, 0
  49. T1CON.T1CKPS1 = 0  'Factor de preescaler del timer 1, 0
  50. TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
  51. TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
  52. '-------------Carga los valores iniciales del timer ------------------------
  53. t1_ms = 0
  54. t2_ms = 0
  55. t3_ms = 0
  56. t1_ms_t = 3  'Valor para el  timer del P4  Arranque
  57. t2_ms_t = 5  'Valor para el timer del P5 Curva
  58. t3_ms_t = 200  'Valor para el timer del selector de curva
  59. vg = 0
  60. asn = 0
  61. mcn = 0
  62. e_adc = 0
  63. '---------------------Habilita las interrupciones --------------------------------------
  64. T1CON.TMR1ON = 1  'Habilita el timer 1, comienza a incrementar
  65. 'PIE1.TMR1IE = 1  'Activa la interrupcion del timer
  66. INTCON.PEIE = 1  'Bit de habilitación de interrupciones de perifericos
  67. Enable  'INTCON.GIE habilita todas las interrupciones globales
  68. '****************************************************************************
  69. 'Ver curva actual
  70. 'Gosub write_memoria
  71. GOSUB vercurva
  72. GOSUB leermemoria
  73. GOSUB modificarcurva
  74. GOSUB modificararranque
  75. '__Activo lectura gatillo
  76. ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
  77. ADCON0.CHS1 = 0
  78. ADCON0.CHS2 = 0
  79. ADCON0.GO = 1  'Activo una lectura
  80. '__
  81. PIE1.TMR1IE = 1  'Activa la interrupcion del timer
  82. 'Activo el PWM
  83. PWMon 1, 9
  84. PWMduty 1, 0
  85. 'Rutina principal
  86. LOOP:
  87.         'For i = 1 To 240  'Bucle solo para pruebas de tiempos
  88.  
  89.  
  90.         SELECT CASE vg
  91.                 CASE < 16
  92.                         PWMduty 1, 0  'Freno
  93.                 CASE < 32
  94.                         PWMduty 1, duty(0)
  95.                 CASE < 48
  96.                         PWMduty 1, duty(1)
  97.                 CASE < 64
  98.                         PWMduty 1, duty(2)
  99.                 CASE < 80
  100.                         PWMduty 1, duty(3)
  101.                 CASE < 96
  102.                         PWMduty 1, duty(4)
  103.                 CASE < 112
  104.                         PWMduty 1, duty(5)
  105.                 CASE < 128
  106.                         PWMduty 1, duty(6)
  107.                 CASE < 144
  108.                         PWMduty 1, duty(7)
  109.                 CASE < 160
  110.                         PWMduty 1, duty(8)
  111.                 CASE < 176
  112.                         PWMduty 1, duty(9)
  113.                 CASE < 192
  114.                         PWMduty 1, duty(10)
  115.                 CASE < 208
  116.                         PWMduty 1, duty(11)
  117.                 CASE < 224
  118.                         PWMduty 1, duty(12)
  119.                 CASE < 240
  120.                         PWMduty 1, duty(13)
  121.                 CASE <= 255
  122.                         PWMduty 1, duty(14)
  123.         EndSelect
  124.  
  125.         IF t1_ms >= t1_ms_t THEN
  126.  
  127.                 IF asn <> asa THEN GOSUB modificararranque
  128.                 t1_ms = 0
  129.         Endif
  130.  
  131.                 IF t2_ms >= t2_ms_t THEN
  132.  
  133.  
  134.                 IF mcn <> mca THEN GOSUB modificarcurva
  135.                 t2_ms = 0
  136.                 t1_ms = 0  'Esto lo hago para impedir que haga las dos lecturas en la misma interrupcion
  137.                 'lo que convierte t1_ms en 5 tambien pero con un desfase de 2 ms
  138.         Endif
  139.  
  140.         IF t3_ms >= t3_ms_t THEN
  141.                 Toggle RA7
  142.                 GOSUB vercurva  'Comprueba que no se haya cambiado la curva
  143.                 IF cn <> ca THEN GOSUB leermemoria
  144.                 t3_ms = 0
  145.         Endif
  146.  
  147. 'next i  'Bucle para pruebas
  148. GOTO LOOP
  149. END                                              
  150.  
  151.  
  152. '********************************************************
  153. 'Deteccion de la curva a leer
  154. vercurva:
  155.         'Ver curva nueva
  156.         cn = 0
  157. 'If PORTA.4 = 1 Then cn = cn + 1
  158. 'If PORTA.3 = 1 Then cn = cn + 2
  159. 'If PORTA.2 = 1 Then cn = cn + 4
  160.         IF PORTA.5 = 1 THEN cn = cn + 8  'SOLO UTILIZO LA OPCION A.5 = 1
  161. RETURN                                            
  162. leermemoria:
  163.         'Leer valores Guardados segun la curva a leer
  164.         ai = LookUp(0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240), cn  'Posicion inicial de memoria donde leer
  165.         af = LookUp(14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254), cn  'Posicion final de memoria donde leer
  166.         FOR a = ai TO af
  167.                 b = a - ai
  168.                 READ a, duty(b)
  169.                 curva(b) = duty(b)
  170.         NEXT a
  171.         'Genera los valores para las modificaciones de curvas
  172.         va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
  173.         va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
  174.         va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
  175.         va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
  176.         ca = cn
  177. RETURN                                            
  178. write_memoria:  'ESCRIBO VALORES EN LA EEPROM INTERNA DEL MICRO
  179.         FOR a = 0 TO 255
  180.                 WRITE a, a
  181.         NEXT a
  182. RETURN                                            
  183.  
  184. '*************************************************************
  185. 'Ajuste fino de la curva grabada
  186. 'Rutina para modificar el centro de la curva
  187. modificarcurva:
  188.         SELECT CASE mcn
  189.                 CASE < 22  'P -5
  190.                         mc(0) = ((va(3) * 5) / 10)
  191.                         mc(1) = ((va(1) * 5) / 10)
  192.                         duty(5) = curva(5) - mc(0)
  193.                         duty(6) = curva(6) - mc(1)
  194.                         duty(7) = curva(7) - mc(1)
  195.                         duty(8) = curva(8) - mc(1)
  196.                         duty(9) = curva(9) - mc(0)
  197.                         mca = mcn
  198.                         RETURN
  199.  
  200.                 CASE < 44  'P -4
  201.                         mc(0) = ((va(3) * 4) / 10)
  202.                         mc(1) = ((va(1) * 4) / 10)
  203.                         duty(5) = curva(5) - mc(0)
  204.                         duty(6) = curva(6) - mc(1)
  205.                         duty(7) = curva(7) - mc(1)
  206.                         duty(8) = curva(8) - mc(1)
  207.                         duty(9) = curva(9) - mc(0)
  208.                         mca = mcn
  209.                         RETURN
  210.  
  211.                 CASE < 66  'P -3
  212.                         mc(0) = ((va(3) * 3) / 10)
  213.                         mc(1) = ((va(1) * 3) / 10)
  214.                         duty(5) = curva(5) - mc(0)
  215.                         duty(6) = curva(6) - mc(1)
  216.                         duty(7) = curva(7) - mc(1)
  217.                         duty(8) = curva(8) - mc(1)
  218.                         duty(9) = curva(9) - mc(0)
  219.                         mca = mcn
  220.                         RETURN
  221.  
  222.                 CASE < 88  'P -2
  223.                         mc(0) = ((va(3) * 2) / 10)
  224.                         mc(1) = ((va(1) * 2) / 10)
  225.                         duty(5) = curva(5) - mc(0)
  226.                         duty(6) = curva(6) - mc(1)
  227.                         duty(7) = curva(7) - mc(1)
  228.                         duty(8) = curva(8) - mc(1)
  229.                         duty(9) = curva(9) - mc(0)
  230.                         mca = mcn
  231.                         RETURN
  232.  
  233.                 CASE < 110  'P -1
  234.                         mc(0) = va(3) / 10
  235.                         mc(1) = va(1) / 10
  236.                         duty(5) = curva(5) - mc(0)
  237.                         duty(6) = curva(6) - mc(1)
  238.                         duty(7) = curva(7) - mc(1)
  239.                         duty(8) = curva(8) - mc(1)
  240.                         duty(9) = curva(9) - mc(0)
  241.                         mca = mcn
  242.                         RETURN
  243.  
  244.                 CASE < 145  'P 0
  245.                         duty(5) = curva(5)
  246.                         duty(6) = curva(6)
  247.                         duty(7) = curva(7)
  248.                         duty(8) = curva(8)
  249.                         duty(9) = curva(9)
  250.                         mca = mcn
  251.                         RETURN
  252.  
  253.                 CASE < 165  'P +1
  254.                         mc(0) = va(3) / 10
  255.                         mc(1) = va(2) / 10
  256.                         mc(2) = va(1) / 10
  257.                         duty(5) = curva(5) + mc(0)
  258.                         duty(6) = curva(6) + mc(1)
  259.                         duty(7) = curva(7) + mc(2)
  260.                         duty(8) = curva(8) + mc(1)
  261.                         duty(9) = curva(9) + mc(0)
  262.                         mca = mcn
  263.                         RETURN
  264.  
  265.                 CASE < 185  'P +2
  266.                         mc(0) = ((va(3) * 2) / 10)
  267.                         mc(1) = ((va(2) * 2) / 10)
  268.                         mc(2) = ((va(1) * 2) / 10)
  269.                         duty(5) = curva(5) + mc(0)
  270.                         duty(6) = curva(6) + mc(1)
  271.                         duty(7) = curva(7) + mc(2)
  272.                         duty(8) = curva(8) + mc(1)
  273.                         duty(9) = curva(9) + mc(0)
  274.                         mca = mcn
  275.                         RETURN
  276.  
  277.                 CASE < 205  'P +3
  278.                         mc(0) = ((va(3) * 3) / 10)
  279.                         mc(1) = ((va(2) * 3) / 10)
  280.                         mc(2) = ((va(1) * 3) / 10)
  281.                         duty(5) = curva(5) + mc(0)
  282.                         duty(6) = curva(6) + mc(1)
  283.                         duty(7) = curva(7) + mc(2)
  284.                         duty(8) = curva(8) + mc(1)
  285.                         duty(9) = curva(9) + mc(0)
  286.                         mca = mcn
  287.                         RETURN
  288.  
  289.                 CASE < 230  'P +4
  290.                         mc(0) = ((va(3) * 4) / 10)
  291.                         mc(1) = ((va(2) * 4) / 10)
  292.                         mc(2) = ((va(1) * 4) / 10)
  293.                         duty(5) = curva(5) + mc(0)
  294.                         duty(6) = curva(6) + mc(1)
  295.                         duty(7) = curva(7) + mc(2)
  296.                         duty(8) = curva(8) + mc(1)
  297.                         duty(9) = curva(9) + mc(0)
  298.                         mca = mcn
  299.                         RETURN
  300.        
  301.                 CASE <= 255  'P +5
  302.                         mc(0) = ((va(3) * 5) / 10)
  303.                         mc(1) = ((va(2) * 5) / 10)
  304.                         mc(2) = ((va(1) * 5) / 10)
  305.                         duty(5) = curva(5) + mc(0)
  306.                         duty(6) = curva(6) + mc(1)
  307.                         duty(7) = curva(7) + mc(2)
  308.                         duty(8) = curva(8) + mc(1)
  309.                         duty(9) = curva(9) + mc(0)
  310.                         mca = mcn
  311.                         RETURN
  312.         EndSelect
  313. RETURN                                            
  314. '*****************************************************************
  315. 'Ajuste del control de arrancada
  316. modificararranque:
  317.         SELECT CASE asn
  318.                 CASE < 25  'P 1
  319.                         duty(0) = curva(0)
  320.                         duty(1) = curva(1)
  321.                         duty(2) = curva(2)
  322.                         duty(3) = curva(3)
  323.                         duty(4) = curva(4)
  324.                         asa = asn
  325.                         RETURN
  326.  
  327.                 CASE < 50  'P 2
  328.                         duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
  329.                         duty(1) = curva(1)
  330.                         duty(2) = curva(2)
  331.                         duty(3) = curva(3)
  332.                         duty(4) = curva(4)
  333.                         asa = asn
  334.                         RETURN
  335.  
  336.                 CASE < 75  'P 3
  337.                         duty(0) = curva(1)
  338.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  339.                         duty(2) = curva(2)
  340.                         duty(3) = curva(3)
  341.                         duty(4) = curva(4)
  342.                         asa = asn
  343.                         RETURN
  344.  
  345.                 CASE < 100  'P 4
  346.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
  347.                         duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  348.                         duty(2) = curva(2)
  349.                         duty(3) = curva(3)
  350.                         duty(4) = curva(4)
  351.                         asa = asn
  352.                         RETURN
  353.  
  354.                 CASE < 125  'P 5
  355.                         duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
  356.                         duty(1) = curva(2)
  357.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  358.                         duty(3) = curva(3)
  359.                         duty(4) = curva(4)
  360.                         asa = asn
  361.                         RETURN
  362.  
  363.                 CASE < 150  'P 6
  364.                         duty(0) = curva(2)
  365.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  366.                         duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  367.                         duty(3) = curva(3)
  368.                         duty(4) = curva(4)
  369.                         asa = asn
  370.                         RETURN
  371.        
  372.                 CASE < 175  'P 7
  373.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
  374.                         duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  375.                         duty(2) = curva(3)
  376.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  377.                         duty(4) = curva(4)
  378.                         asa = asn
  379.                         RETURN
  380.  
  381.                 CASE < 200  'p 8
  382.                         duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
  383.                         duty(1) = curva(3)
  384.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  385.                         duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  386.                         duty(4) = curva(4)
  387.                         asa = asn
  388.                         RETURN
  389.  
  390.                 CASE < 225  'P 9
  391.                         duty(0) = curva(3)
  392.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  393.                         duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  394.                         duty(3) = curva(4)
  395.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  396.                         asa = asn
  397.                         RETURN
  398.  
  399.                 CASE <= 255  'P 10
  400.                         duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
  401.                         duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
  402.                         duty(2) = curva(4)
  403.                         duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
  404.                         duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
  405.                         asa = asn
  406.                 RETURN
  407.  
  408.         EndSelect
  409. RETURN                                            
  410.  
  411. '----------------------- Interrupciones ------------------------------------------
  412. ON Interrupt
  413.         IF e_adc = 0 AND ADCON0.GO = 0 THEN
  414.                 vg = ADRESH  'Paso valor gatillo
  415.                 'Activo lectura valor de p4 ADC 5
  416.                 ADCON0.CHS0 = 1  'Selecciono canal AN5 para el modulo ADC
  417.                 ADCON0.CHS1 = 0
  418.                 ADCON0.CHS2 = 1
  419.                 ADCON0.GO = 1  'Activo una lectura
  420.                 e_adc = 1
  421.         Endif
  422.         IF e_adc = 1 AND ADCON0.GO = 0 THEN
  423.                 asn = ADRESH  'paso valor p4
  424.                 'Activo lectura valor de p5 ADC 0
  425.                 ADCON0.CHS0 = 0  'Selecciono canal AN0 para el modulo ADC
  426.                 ADCON0.CHS1 = 0
  427.                 ADCON0.CHS2 = 0
  428.                 ADCON0.GO = 1  'Activo una lectura
  429.                 e_adc = 2
  430.         Endif
  431.         IF e_adc = 2 AND ADCON0.GO = 0 THEN
  432.                 mcn = ADRESH  'Paso valor p5
  433.                 'Activo lectura gatillo
  434.                 ADCON0.CHS0 = 1  'Selecciono canal NA1 para el modulo ADC
  435.                 ADCON0.CHS1 = 0
  436.                 ADCON0.CHS2 = 0
  437.                 ADCON0.GO = 1  'Activo una lectura
  438.                 e_adc = 0
  439.         Endif
  440.  
  441.         IF PIR1.TMR1IF = 1 THEN
  442.                 IF t1_ms < t1_ms_t THEN t1_ms = t1_ms + 1
  443.                 IF t2_ms < t2_ms_t THEN t2_ms = t2_ms + 1
  444.                 IF t3_ms < t3_ms_t THEN t3_ms = t3_ms + 1
  445.         Endif
  446.         TMR1H = 0xf8  'Carga el registro del contador para que desborde cada 1 msg. byte alto 248 x 256
  447.         TMR1L = 0x30  'Carga el registro del contador para que desborde cada 1 msg. byte bajo  + 48
  448.         PIR1.TMR1IF = 0  'Borra el flag del salto del tmr1
  449. RESUME

Save Systen se utiliza cuando se producen valores intermedios en operaciones matematicas tipo word y long o se utilizan funciones complejas.
Pero este no es el caso, pienso que el programa funcionara igual de bien si lo suprimes e incluso aceleras la rutina porque Save Systen es muy larga
ya que tiene que guardar una serie de registros comuenes a operaciones con variables, funciones, retorno y de mas registros de bajo nivel.

Y cuanto al otro tema, ¡¡¡ADELANTE!!!...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 07 de Julio de 2009, 07:24:35
Bueno, finalmente me he puesto a analizar la utilizacion de un encoder para presentar en un display  menus o valores de los parametros ( a modo de las radios de los coches, etc), hace poco encontre una pagina donde hay un codigo para la utilizacion de un encoder, Aplicacion con PICs para posicionamiento con encoder (http://www.scmstore.com/scm-hacker/num21/project/posicion.htm) analizando la direccion de giro, pero esta en un pic basic diferente al de PSI y lgunas lineas se me escapan o no las entiendo.

He intentado hacer la adaptacion al PSI pero siguiendo el programa hay datos que ya veo que me daria error.
La adaptacion que yo he hecho es la siguiente:
Código: [Seleccionar]
'VERSION: 1.0
'MICRO: PIC16f88A
'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR

'***************************************************************************************************
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'***********************************DEFINICION DE VARIABLES**************************************
'--------------------------------------Variables Programa----------------------------------------
Dim pos As Long  'guarda el estado de la tecla hasta terminar la maniobra
Dim a As Bit  'guarda el estado del canal A
Dim b As Bit  'guarda el estado del canal B
Dim av As Bit  'guarda el estado anterior del canal A
Dim bv As Bit  'guarda el estado anterior del canal B
Dim dpos As Long  'Dato de presentacion de Pos

'------------------------------------------ASIGNACIONES------------------------------------------
pos = 0
a = 0
b = 0
av = 0
bv = 0

'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
ANSEL = %00000000  'los pin I/O digitales
CMCON = 0x07  'comparador a off
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTA.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "16f88_LCD_I/O"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas Encoder"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
'--------------------------------------Main Programa-----------------------------------------------
main:
av = a
bv = b

a = PORTA.5
b = PORTA.6
WaitMs 1

If a = av Then Goto chequearb
If a = 1 And av = 0 Then Goto chequearb1

decremento:
If pos = 0 Then Goto lcd
pos = pos - 1
Goto lcd

chequearb1:
b = PORTA.6
If b = 1 Then Goto incremento
Goto decremento

chequearb:
b = PORTA.6
If b = bv Then Goto lcd
If b = 1 And bv = 0 Then Goto chequeara
If a = 1 Then Goto incremento
Goto decremento

chequeara:
a = PORTA.5
If a = 1 Then Goto incremento
Goto decremento

incremento:
If pos = 255 Then Goto lcd
pos = pos + 1
Goto lcd

lcd:
Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
print_lcd:  '____________________muestra los datos por el display

Lcdcmdout LcdLine1Clear  'borra la primera linea y cursor al principio
If pos >= 128 Then
dpos = pos - 128
Lcdout "  Valor= ", #dpos  'imprime  los valores positivos en el lcd
End If                                           
If pos < 128 Then
dpos = 128 - pos
Lcdout "  Valor= -", #dpos  'imprime  los valores negativos en el lcd
End If                                           
Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
Lcdout "----------------"  'muestra los datos en el lcd
Return 

Alguien me podria decir si la adaptacion del programa es correcta.

Saludos

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Julio de 2009, 19:41:37
Código: FreeBasic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4.  
  5. 'VERSION: 1.0
  6. 'MICRO: PIC16f88A
  7. 'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR
  8.  
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. 'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
  19. 'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '***********************************DEFINICION DE VARIABLES**************************************
  24. '--------------------------------------Variables Programa----------------------------------------
  25. Dim pos As Long  'guarda el estado de la tecla hasta terminar la maniobra
  26. Dim a As Bit  'guarda el estado del canal A
  27. Dim b As Bit  'guarda el estado del canal B
  28. Dim av As Bit  'guarda el estado anterior del canal A
  29. Dim bv As Bit  'guarda el estado anterior del canal B
  30. Dim dpos As Long  'Dato de presentacion de Pos
  31. '------------------------------------------ASIGNACIONES------------------------------------------
  32. pos = 0
  33. a = 0
  34. b = 0
  35. av = 0
  36. bv = 0
  37. '**************************************DEFINICION DE PUERTOS*************************************
  38. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  39. ANSEL = %00000000  'los pin I/O digitales
  40. CMCON = 0x07  'comparador a off
  41. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  42. TRISA = 0x00  'Puerto A como salidas
  43. TRISB = 0x00  'puerto B como salidas
  44. TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
  45. TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
  46. PORTB.3 = 1  'luz lcd a on (RB3)
  47. PORTA.7 = 1  'led amarillo a off
  48. PORTB.0 = 1  'led verde a off
  49. '**************************************Inicio Programa*********************************************
  50. Lcdinit  'inicializa el lcd sin cursor
  51. WaitMs 1000  'espera 1Seg
  52. Lcdout "16f88_LCD_I/O"  'escribe en el lcd
  53. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  54. Lcdout "Pruebas Encoder"  'escribe en el lcd
  55. WaitMs 3000  'espera 3Seg
  56. '--------------------------------------Main Programa-----------------------------------------------
  57.  
  58. main:
  59.                 a = av
  60.                 b = bv
  61.         a = PORTA.5
  62.         b = PORTA.6
  63.         WaitMs 1
  64.         If a = av Then Goto chequearb
  65.         If a = 1 And av = 0 Then Goto chequearb1
  66.  
  67.         decremento:
  68.         If pos = 0 Then Goto lcd
  69.                 pos = pos - 1
  70.                 Goto lcd
  71.  
  72.         chequearb1:
  73.                 b = PORTA.6
  74.                 If b = 1 Then Goto incremento
  75.                 Goto decremento
  76.  
  77.         chequearb:
  78.                 b = PORTA.6
  79.                 If b = bv Then Goto lcd
  80.                 If b = 1 And bv = 0 Then Goto chequeara
  81.                 If a = 1 Then Goto incremento
  82.                 Goto decremento
  83.  
  84.         chequeara:
  85.                 a = PORTA.5
  86.                 If a = 1 Then Goto incremento
  87.                 Goto decremento
  88.  
  89.         incremento:
  90.                 If pos = 255 Then Goto lcd
  91.                 pos = pos + 1
  92.                 Goto lcd
  93.  
  94.         lcd:
  95.                 Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
  96.                 WaitMs 100
  97. Goto main
  98. End                                              
  99. '--------------------------------------FIN DEL MAIN---------------------------------------------
  100. '**************************************Subrrutinas**********************************************
  101. print_lcd:  '____________________muestra los datos por el display
  102.         Lcdcmdout LcdLine1Clear  'borra la primera linea y cursor al principio
  103.         If pos >= 128 Then
  104.                 dpos = pos - 128
  105.                 Lcdout "  Valor= ", #dpos.HB, #dpos.LB  'imprime  los valores positivos en el lcd
  106.         Endif
  107.         If pos < 128 Then
  108.                 dpos = 128 - pos
  109.                 Lcdout "  Valor= -", #dpos.HB, #dpos.LB  'imprime  los valores negativos en el lcd
  110.         Endif
  111.         Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
  112.         Lcdout "----------------"  'muestra los datos en el lcd
  113. Return                                            
  114. End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 08 de Julio de 2009, 18:41:01
Creo que las lineas 58 y 59 de tu codigo

a = av
b = bv
main:

deberia ir a continuacion de main: pues si no es asi la funcion de av y bv se pierde ( es el estado anterior de A y B) y las comparaciones serian siempre sobre los mismos valores

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Julio de 2009, 20:35:16
OK, ya lo he cambiado.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 13 de Julio de 2009, 07:08:48
Bueno, he cambiado el codigo porque no me funcionaba en la ebasic, y despues de hacer funcionar este codigo me encuentro con los siguientes problemas:

si muevo el encoder lentamente, si que me funciona bien, pero si lo muevo a una velocidad normal de uso ,es como si me saltase del estado 00 (canales a y b) al estado 00 y ni se inmuta.

Para probar a reducir los tiempos quito los tiempos de espera  y entonces es la presentacion en el LCD que se ve mal (normal)

Despues tambien me encuentro con el problema que el encoder (es con mesetas) y siempre se queda en 00 con lo cual me salta los 4 pasos

Alguna idea  de por donde debo encaminarme???

Sal U2

Código: Visual Basic
  1. 'VERSION: 1.0
  2. 'MICRO: PIC16f88A
  3. 'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR
  4.  
  5.  
  6. Define CONF_WORD = 0x2f10
  7. Define CONF_WORD_2 = 0x3ffc
  8. Define CLOCK_FREQUENCY = 8
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. 'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
  19. 'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '***********************************DEFINICION DE VARIABLES**************************************
  24. '--------------------------------------Variables Programa----------------------------------------
  25. Dim pos As Long  'guarda la posicion
  26. Dim a As Bit  'guarda el estado del canal A
  27. Dim b As Bit  'guarda el estado del canal B
  28. Dim av As Bit  'guarda el estado anterior del canal A
  29. Dim bv As Bit  'guarda el estado anterior del canal B
  30. Dim dpos As Long  'Dato de presentacion de Pos
  31.  
  32. '------------------------------------------ASIGNACIONES------------------------------------------
  33. pos = 0
  34. a = 0
  35. b = 0
  36. av = 0
  37. bv = 0
  38.  
  39. '**************************************DEFINICION DE PUERTOS*************************************
  40. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  41. ANSEL = %00000000  'los pin I/O digitales
  42. CMCON = 0x07  'comparador a off
  43. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  44. TRISA = 0x00  'Puerto A como salidas
  45. TRISB = 0x00  'puerto B como salidas
  46. TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
  47. TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
  48. PORTB.3 = 1  'luz lcd a on (RB3)
  49. PORTA.7 = 1  'led amarillo a off
  50. PORTB.0 = 1  'led verde a off
  51. '**************************************Inicio Programa*********************************************
  52. Lcdinit  'inicializa el lcd sin cursor
  53. WaitMs 1000  'espera 1Seg
  54. Lcdout "16f88_LCD_I/O"  'escribe en el lcd
  55. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  56. Lcdout "Pruebas Encoder"  'escribe en el lcd
  57. WaitMs 3000  'espera 3Seg
  58. '--------------------------------------Main Programa-----------------------------------------------
  59. main:
  60. av = a
  61. bv = b
  62.  
  63. a = PORTA.5
  64. b = PORTA.6
  65. 'WaitMs 1
  66. 'Break
  67. If a = av And b = bv Then Goto lcd
  68.  
  69. If a = 0 And av = 0 Then
  70.         If b = 0 And bv = 1 Then Goto incr
  71.         If b = 1 And bv = 0 Then Goto decr
  72. Endif
  73.  
  74. If a = 1 And av = 0 Then
  75.         If b = 0 And bv = 0 Then Goto incr
  76.         If b = 1 And bv = 0 Then Goto decr
  77.         If b = 1 And bv = 1 Then Goto decr
  78.         If b = 0 And bv = 1 Then Goto decr
  79. Endif
  80.  
  81. If a = 0 And av = 1 Then
  82.         If b = 0 And bv = 0 Then Goto decr
  83.         If b = 1 And bv = 1 Then Goto incr
  84. Endif
  85.  
  86. If a = 1 And av = 1 Then
  87.         If b = 0 And bv = 0 Then Goto decr
  88.         If b = 1 And bv = 0 Then Goto incr
  89.         If b = 0 And bv = 1 Then Goto decr
  90. Endif
  91.  
  92. Goto lcd
  93.  
  94. incr:
  95. If pos = 255 Then Goto lcd
  96. pos = pos + 1
  97. Goto lcd
  98.  
  99. decr:
  100. If pos = 0 Then Goto lcd
  101. pos = pos - 1
  102.  
  103. lcd:
  104. Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
  105. 'WaitMs 100
  106. Goto main
  107. End                                              
  108. '--------------------------------------FIN DEL MAIN---------------------------------------------
  109. '**************************************Subrrutinas**********************************************
  110. print_lcd:  '____________________muestra los datos por el display
  111.  
  112. Lcdcmdout LcdLine1Clear  'borra la primera linea y cursor al principio
  113. If pos >= 128 Then
  114.         dpos = pos - 128
  115.         Lcdout "  Valor= ", #dpos.HB, #dpos.LB  'imprime  los valores positivos en el lcd
  116. Endif
  117. If pos < 128 Then
  118.         dpos = 128 - pos
  119.         Lcdout "  Valor= -", #dpos.HB, #dpos.LB  'imprime  los valores negativos en el lcd
  120. Endif
  121. Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
  122. Lcdout "----------------"  'muestra los datos en el lcd
  123. Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Julio de 2009, 09:36:36
Es normal lo que te  pasa, para poder leer con exactitud tienes que dar una resolución de lectura superior al pulso de menor duración que puede generar el encoder. Una vez que se detecta el inicio del pulso hay que esperar un tiempo de estabilización porque se suelen generar rebotes. En este caso lo ideal es utilizar interrupciones. Creo recordar que tengo por ahí un software en PSI que realice hace tiempo que utiliza encoder, lo buscare a ver donde para.

Lo que te ocurre con el LCD es normal ya que la forma que se dispone en este ejemplo, no permite estabilizar los datos el suficiente tiempo para que se vean estables. Habría que cambiar a la siguiente forma de utilizar el LCD. Te hago parte de las correcciones para que lo termines de adaptar:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Julio de 2009, 09:42:46
Código: FreeBasic
  1. '**************************************Sub-rutinas**********************************************
  2. print_lcd:  '____________________muestra los datos por el display
  3.  
  4. Lcdcmdout LcdLine1Home  'Primera linea y cursor al principio
  5. If pos >= 128 Then
  6.         dpos = pos - 128
  7.         Lcdout "Valor= ", #dpos.HB, #dpos.LB, "      "  'Imprime  los valores positivos en el lcd
  8. Endif
  9. If pos < 128 Then
  10.         dpos = 128 - pos
  11.         Lcdout "Valor= -", #dpos.HB, #dpos.LB, "     "  'Imprime  los valores negativos en el lcd
  12. Endif
  13. Lcdcmdout LcdLine2Home  'Linea 2 y cursor al principio
  14. Lcdout "----------------"  'muestra los datos en el lcd
  15. Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 14 de Julio de 2009, 19:16:34
Bueno, a falta de probarlo en la ebasic , con tus datos y un post que he encontrado de nocturno he rehecho el codigo. 
En el simulador parece que funciona, y aunque tengo claro que tiene que funcionar mediante interrupciones este ya es un primer paso

Nota, una pregunta, ¿porque si no pongo los espacios en blanco en la linea
         Lcdout "  Valor= ", #dpos.HB, #dpos.LB, "      "  'imprime  los valores positivos en el lcd
me presentalos datos  en el LCD   "Valor= 00/0" ?


Sal U2

Código: FreeBasic
  1. 'VERSION: 1.3
  2. 'MICRO: PIC16f88A
  3. 'DESCRIPCION: MUESTRA EN EL DISPLAY EL SENTIDO DE GIRO DE UN ENCODER INCREMENTANDO O DISMINUYENDO EL VALOR
  4.  
  5.  
  6. Define CONF_WORD = 0x2f10
  7. Define CONF_WORD_2 = 0x3ffc
  8. Define CLOCK_FREQUENCY = 8
  9. '***************************************************************************************************
  10. '-------------------------------------Puertos del LCD-----------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. 'Define LCD_RWREG = PORTx  'el bit de control RW sera del puerto x(no se usa)
  19. 'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
  20. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  23. '***********************************DEFINICION DE VARIABLES**************************************
  24. '--------------------------------------Variables Programa----------------------------------------
  25. Dim pos As Long  'guarda la posicion
  26. Dim dpos As Long  'Dato de presentacion de Pos
  27.  
  28. Symbol a = PORTA.5  'estado del canal A
  29. Symbol b = PORTA.6  'estado del canal B
  30. '------------------------------------------ASIGNACIONES------------------------------------------
  31. pos = 128
  32. '**************************************DEFINICION DE PUERTOS*************************************
  33. '----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
  34. ANSEL = %00000000  'los pin I/O digitales
  35. CMCON = 0x07  'comparador a off
  36. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Puerto A como salidas
  38. TRISB = 0x00  'puerto B como salidas
  39. TRISA.6 = 1  'como entrada (RA6, Canal B Encoder)
  40. TRISA.5 = 1  'como entrada (RA5, Canal A Encoder)
  41. PORTB.3 = 1  'luz lcd a on (RB3)
  42. PORTA.7 = 1  'led amarillo a off
  43. PORTB.0 = 1  'led verde a off
  44. '**************************************Inicio Programa*********************************************
  45. Lcdinit  'inicializa el lcd sin cursor
  46. 'WaitMs 1000  'espera 1Seg
  47. Lcdout "16f88_LCD_I/O"  'escribe en el lcd
  48. Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
  49. Lcdout "Pruebas Encoder"  'escribe en el lcd
  50. 'WaitMs 3000  'espera 3Seg
  51. '--------------------------------------Main Programa-----------------------------------------------
  52. main:
  53. If a = 1 Then
  54.         If b = 1 Then
  55.                 If pos < 255 Then pos = pos + 1
  56.         Else
  57.                 If pos > 0 Then pos = pos - 1
  58.         Endif
  59.         While a = 1
  60.         Wend
  61. Endif
  62.  
  63.  
  64. Gosub print_lcd  'salto con retorno, rutina que imprime los valores en el lcd
  65. 'WaitMs 100
  66. Goto main
  67. End                                              
  68. '--------------------------------------FIN DEL MAIN---------------------------------------------
  69. '**************************************Subrrutinas**********************************************
  70. print_lcd:  '____________________muestra los datos por el display
  71.  
  72. Lcdcmdout LcdLine1Home  'borra la primera linea y cursor al principio
  73. If pos >= 128 Then
  74.         dpos = pos - 128
  75.         Lcdout "  Valor= ", #dpos.HB, #dpos.LB, "      "  'imprime  los valores positivos en el lcd
  76. Endif
  77. If pos < 128 Then
  78.         dpos = 128 - pos
  79.         Lcdout "  Valor= -", #dpos.HB, #dpos.LB, "      "  'imprime  los valores negativos en el lcd
  80. Endif
  81. Lcdcmdout LcdLine2Home  'Linea 2 y cursor al principio
  82. Lcdout "----------------"  'muestra los datos en el lcd
  83. Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Julio de 2009, 18:18:02
Claro, porque no borramos la pantalla, lo que hacemos es sobre escribir en ella, y como las variables no tienen longitud fija pues quedan caracteres impresos de la vez anterior. Para que esto no pase rellenamos el final de la línea con caracteres en blanco, que al sobre escribirlos sobre los caracteres anteriores nos hacen el proceso de borrado.

Lcdcmdout lcdlineXhome, no borra las líneas tan solo se limita a llevar el cursor a principio de línea, por eso es uno de los comandos mas rápidos que tiene el LCD. Por ejemplo: el comando Lcdcmdout Lcdclear para borrar las dos líneas tiene que sobre escribir 16 espacios, este comando tarda unos 2mSeg. en realizar el proceso mientras el Lceline1home pueda tardar menos de 500uSg.

Para dar tiempo a que el LCD procese los comandos de finimos un tiempo de espera después de enviar la orden al LCD, con Define LCD_COMMANDUS = 2000 establecemos este tiempo en uSeg.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Julio de 2009, 18:23:44
Mira aqui a ver si hay algo que puedas aprovechar sobre la rutina de los encoder.

http://www.freewebs.com/glafebre/miguelito.htm
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 16 de Julio de 2009, 19:02:43
Desde luego que si, gracias por la informacion

Sal U2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hugo777 en 07 de Agosto de 2009, 11:37:15
Hola Amigos, les escribo pq tengo la siguiente problematica

construí un circuito que es para saber que valores
se obtienen con la instrucción servoIn, al leer los pulsos desde un
radioreceptor AM de 2 canales (RX), el micro usado es un 16F628A


(http://img197.imageshack.us/img197/9949/circuitoprobadordepulso.jpg)


mi problema es que al encender el RX,  el micro lee solo valores basura glich,
presentando cualquier valor en los leds de salida.
También me percate que al momento de alimentar el circuito con una fuente de
poder independiente de la alimentacion del RX, el servo que esta conectado al
otro canal del RX tiene movimientos producto del glich.


los fuses del micro los tengo configurados así
(http://img39.imageshack.us/img39/5736/configurationbits.jpg)

El codigo del micro es el siguiente:

Código: vb.net
  1. AllDigital
  2.  
  3. Config PORTA = Output
  4. Config PORTB = Output
  5. Config PORTB.3 = Input
  6.  
  7. Dim length As Byte
  8.  
  9. length = 0
  10.  
  11. loop:
  12.         ServoIn PORTB.3, length
  13.        
  14.         PORTA.1 = length.0
  15.         PORTA.0 = length.1
  16.         PORTA.7 = length.2
  17.         PORTA.6 = length.3
  18.         PORTB.7 = length.4
  19.         PORTB.6 = length.5
  20.         PORTB.5 = length.6
  21.         PORTB.4 = length.7
  22.  
  23.         WaitMs 1000
  24.        
  25.         Goto loop
  26.        
  27. End

preguntas:
 ¿al estar alimentando el circuito, con una fuente independiente
 (vieja fuente de computador "ATX") puede que esta este produciendo el glitch?
 
 ¿debo alimentar el circuito desde el RX para evitar el glitch?
 
 ¿pq lee basura desde B3?, ¿puede deberse a que es un pin pensado para PWM?
 
 ¿necesito de algun 4093 o 74LS14 para filtrar los pulsos y asi solucionar el problema de la lectura?
 
¿alguien posee algun ejemplo, en el cual se lean pulsos desde un RX?

Slds Hugo


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hugo777 en 10 de Agosto de 2009, 10:04:07
Jaja ya lo solucione, resultaba que el condensador de 10uf, estaba mal conectado y no hacia el trabajo de evitar interferencias,
lo ajuste y todo resulto ok

(http://img197.imageshack.us/img197/9949/circuitoprobadordepulso.jpg)

sldos hugo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hugo777 en 27 de Agosto de 2009, 15:26:18
Hola les escribo, para postear obviamente un codigo que desarrolle pensando
en un circuito failsafe para un submarino que estoy construyendo.

bueno y esta es una manera de agradecer la gran cantidad de ejemplos que aquí
se pueden encontrar  de PSI, los cuales en la documentación oficial son muy escuetos.

y que gracias a esos ejemplos pude desarrollar esto.


FE DE ERRATAS
Pd1:modifique el código eliminando las fallas que encontre, del que había posteado.
Pd2:Este código ya esta operativo.

Nuevamente Slds Hugo

Código: Visual Basic
  1. '||===============================================================================||
  2. '||* Nombre Rutina: FAILSAFE_HUGO.BAS                                            *||
  3. '||* Entradas     : GPIO.5 switch indicador de lectura de posicion de falla      *||
  4. '||*                GPIO.4 potenciometro 10kohm indicador de posicion            *||
  5. '||*                GPIO.3 RXin                                                  *||
  6. '||*                                                                             *||
  7. '||* Salidas      : GPIO.0 POT INDICADOR DE LECTURA POSICION DE FALLA.           *||
  8. '||*                GPIO.1 LED INDICADOR DE FALLA(GLITCH).                       *||
  9. '||*                GPIO.2 RXout                                                 *||
  10. '||*                                 PIC12F675                                   *||
  11. '||* .                                ________                                   *||
  12. '||*                 5v             =|Vdd  Vss|= GND                             *||
  13. '||*                 switch         =|gp5  gp0|= led indicador de lectura.       *||
  14. '||*                 POT 10Kohm.    =|gp4  gp1|= led indicador de falla          *||
  15. '||*                 RXin           =|gp3  gp2|= RXout                           *||
  16. '||* .                                --------                                   *||
  17. '||*                                                                             *||
  18. '||* Objetivo     : procesar y determinar cuales señales estan fuera de los      *||
  19. '||*                parametros y tomar acciones correctivas para evitar un       *||
  20. '||*                fallo catastrofico.                                          *||
  21. '||*                                                                             *||
  22. '||* Autor        : Hugo Sagardía Aguilera.                                      *||
  23. '||* Proyecto     : FAILSAFE                                                     *||
  24. '||*                                                                             *||
  25. '||* Micro        : 12F675                                                       *||
  26. '||* Oscilador    : IntOSC GP4                                                   *||
  27. '||* Velocidad    : 4Mhz                                                         *||
  28. '||* Flags        : WDT     OFF                                                  *||
  29. '||*                PWRT    OFF                                                  *||
  30. '||*                MCLR    OFF                                                  *||
  31. '||*                BODEN   OFF                                                  *||
  32. '||*                CP      OFF                                                  *||
  33. '||*                CPD     OFF                                                  *||
  34. '||*                                                                             *||
  35. '||* ----------- ------- ------------------------------------------------------- *||
  36. '||* Fecha       Versión Descripción Cambio                                      *||
  37. '||* ----------- ------- ------------------------------------------------------- *||
  38. '||* 26/Ago/2009   1.0.0 (Version Original)                                      *||
  39. '||* 27/Ago/2009   1.0.1 (Manejo de interrupcion por desbordamiento              *||
  40. '||*                      de timer a los 20.2ms)                                 *||
  41. '||* 28/Ago/2009   1.0.2 1.-Se Eliminaron los pasos 1 y 2 por producir           *||
  42. '||*                      comportamientos erraticos al tener el stick en el      *||
  43. '||*                      centro y el trim no en centro, este comportamiento     *||
  44. '||*                      erratico es debido a que cada vez que inicia el micro, *||
  45. '||*                      este calcula la posicion central del stick y sus       *||
  46. '||*                      maximos y minimos posibles)                            *||
  47. '||*                     2.- Se agrego un potenciometro para indicar la posicion *||
  48. '||*                      de falla que poseera en servo                          *||
  49. '||* 02/Sep/2009   1.0.3 (Lectura y Uso de la calibracion de fábrica.)           *||
  50. '||* 25/Sep/2009   1.0.4 (Ajuste del voltaje de 2.3V a 5V.)                      *||
  51. '||* 28/Sep/2009   1.0.5 (Ajuste del voltaje de 2.2V a 5V. y correciones menores)*||
  52. '||* 06/Oct/2009   1.0.6 (Se corrigio lectura del potenciometro y lectura del    *||
  53. '||*                      switch.)                                               *||
  54. '||* 07/Oct/2009   1.0.7 (se elimino la vibracion del servo al producirse la     *||
  55. '||*                      interrupcion que alargaba la frecuencia de 50hz.)       *||
  56. '||===============================================================================||
  57. 'CONFIGURO PUERTOS Y ADC
  58. TRISIO = 1
  59.  
  60. Define ADC_CLOCK = 3
  61. Define ADC_SAMPLEUS = 50
  62.  
  63. 'COMPARATOR OFF
  64. CMCON = 0x07
  65.  
  66. 'VREF OFF
  67. VRCON = 0x00
  68.  
  69. 'GPIO.4 A/D
  70. ANSEL = %00001000
  71.  
  72. Config GPIO.5 = Input
  73. Config GPIO.4 = Input
  74. Config GPIO.3 = Input
  75. Config GPIO.2 = Output
  76. Config GPIO.1 = Output
  77. Config GPIO.0 = Output
  78.  
  79. 'ACTIVA EL CONVERSOR ANALOGO DIGITAL
  80. ADCON0 = 0
  81.  
  82. 'PINES USADOS DEL MICRO
  83. Symbol pin_debe_leer_valor = GPIO.5
  84. Symbol pin_posicion_falla = GPIO.4
  85. Symbol pin_entrada = GPIO.3
  86. Symbol pin_salida = GPIO.2
  87. Symbol pin_led_falla = GPIO.1
  88. Symbol pin_led_lectura = GPIO.0
  89.  
  90. 'CONSTANTES USADAS EN EL PROGRAMA
  91. Const k_cero = 0
  92. Const k_uno = 1
  93. Const k_tres = 3
  94. Const k_cinco = 5
  95. Const k_nueve = 9
  96. Const k_diez = 10
  97. Const k_cien = 100
  98. Const k_periodo_ms = 20000
  99. Const k_voltaje_cero = 429
  100. Const k_divisor = 4
  101.  
  102.  
  103. 'INTERVALOS MAXIMOS Y MINIMOS
  104. Const k_pulso_min = 86  '96
  105. Const k_pulso_max = 212  '202
  106. Const k_pulso_mid = 149  '202
  107. Const k_nro_max_pulsos_erroneos = 25
  108.  
  109. 'PARA DETERMINAR EL PULSO PARA FAIL SAFE
  110. Dim pulso As Byte
  111. Dim pulso_off As Word
  112. Dim pulso_de_falla As Byte
  113.  
  114. 'PARA CONTAR EL NUMERO DE GLITCHS
  115. Dim contador_glitch As Byte
  116.  
  117. 'CONTIENE EL VALOR DEL ADC
  118. Dim valor_pot As Word
  119.  
  120. 'VARIABLE PARA CICLO USO GENERAL
  121. Dim i As Byte
  122.  
  123. 'ALMACENA EL RESULTADO DE LA CALIBRACION
  124. Dim resultado_calibracion As Bit
  125.  
  126. 'PARA 20MS DE PAUSA
  127. 'NOTA: PARA 20.1 DEBE USAR 45435
  128. Dim v20ms_normal As Word
  129. v20ms_normal = 44535  '-->21000     '20000-->45535    '20050-->45485     '20700-->44835
  130.  
  131.  
  132.  
  133. '---------------------------------
  134. 'PARA DEPURACION SOLAMENTE
  135. 'Define SIMULATION_WAITMS_VALUE = 1
  136. 'Define SEROUT_DELAYUS = 0
  137. '---------------------------------
  138. inicio:
  139.  
  140.         resultado_calibracion = carga_calibracion()
  141.  
  142.         'APAGA LOS LED
  143.         pin_led_falla = k_cero
  144.         pin_led_lectura = k_cero
  145.  
  146.         If resultado_calibracion = True Then
  147.                
  148.                 '-----------------------------------------------------------------------
  149.                 '----------------------------- P A S O   1 -----------------------------
  150.                 '-----------------------------------------------------------------------
  151.                 '--AQUI AL PRENDER EL RECEPTOR TIENE PRESIONADO EL SWITCH, TOMA EL    --
  152.                 '--VOLTAJE QUE ESTA DEJANDO PASAR EL POTENCIOMETRO DE 10Kohm Y ESTE LO--
  153.                 '--INTERPRETA COMO PULSO Y LO TRADUCE EN EL SERVO COMO POSICION,      --
  154.                 '--SINO ESTA PRESIONADO EL SWITCH VE LA POSICION QUE TIENE EL         --
  155.                 '--POTENCIOMETRO Y CALCULA EL PULSO SOLAMENTE                         --
  156.                 '-----------------------------------------------------------------------
  157.                 If pin_debe_leer_valor = k_uno Then
  158.                         pin_led_lectura = k_uno
  159.                         While pin_debe_leer_valor = k_uno
  160.                                 Adcin k_tres, valor_pot
  161.                                
  162.                                 'pulso_de_falla = (valor_pot / k_diez) + k_cien
  163.                                 pulso_de_falla = ((valor_pot - k_voltaje_cero) / k_divisor) + k_pulso_min
  164.                                
  165.                                 If pulso_de_falla > k_pulso_max Then
  166.                                         pulso_de_falla = k_pulso_max
  167.                                 Endif
  168.                                
  169.                                 If pulso_de_falla < k_pulso_min Then
  170.                                         pulso_de_falla = k_pulso_min
  171.                                 Endif
  172.                                
  173.                                 pulso_off = k_periodo_ms - (pulso_de_falla * k_diez)
  174.                                                
  175.                                 ServoOut pin_salida, pulso_de_falla
  176.                                 WaitUs pulso_off
  177.                         Wend
  178.                         'pin_led_lectura = k_cero
  179.                 Else
  180.                         'SI NO ESTA PRESIONADO EL BOTON SOLO LEO EL POTENCIOMETRO Y CALCULO LA POSICION DE FALLA
  181.                         Adcin k_tres, valor_pot
  182.  
  183.                         'pulso_de_falla = (valor_pot / k_diez) + k_cien
  184.                         pulso_de_falla = ((valor_pot - k_voltaje_cero) / k_divisor) + k_pulso_min
  185.  
  186.  
  187.                 Endif
  188.  
  189.                 '-----------------------------------------------------------------------
  190.                 '----------------------------- P A S O   2 -----------------------------
  191.                 '-----------------------------------------------------------------------
  192.                 '--MARCA CON EL PARPADEO DE LUCES EL FIN DE LA CONFIGURACION DE FALLO --
  193.                 '--Y CENTRA EL SERVO ANTES DE PROCESAR LAS SEÑALES DE ENTRADA         --
  194.                 '-----------------------------------------------------------------------
  195.                 For i = k_uno To k_cinco
  196.                         pin_led_lectura = k_uno
  197.                         WaitMs k_cien
  198.                         pin_led_lectura = k_cero
  199.                         WaitMs k_cien
  200.                 Next i
  201.  
  202.  
  203.                 'CENTRA EL SERVO
  204.                 pulso_off = k_periodo_ms - (k_pulso_mid * k_diez)
  205.                 For i = k_uno To k_cinco
  206.                         ServoOut pin_salida, k_pulso_mid
  207.                         WaitUs pulso_off
  208.                 Next i
  209.  
  210.  
  211.                 '-----------------------------------------------------------------------
  212.                 '----------------------------- P A S O   3 -----------------------------
  213.                 '-----------------------------------------------------------------------
  214.                 '--CONFIGURA EL TIMER1 PARA DETECTAR LA FALTA DE PULSOS               --
  215.                 '--PASADO LOS 20ms                                                    --
  216.                 '--hex     =  dec                                                     --
  217.                 '--0xaf23  =  44835                                                   --
  218.                 '--DONDE 44835 ES EL RESULTADO DE 65535 - 20700, DONDE 65535          --
  219.                 '--EL MAXIMO VALOR PARA EL TIMER1 DE 16 BITS, PARA QUE EJECUTE        --
  220.                 '--LA INTERRUPCION                                                    --
  221.                 '-----------------------------------------------------------------------
  222.                 T1CON.TMR1CS = k_cero
  223.                 T1CON.T1CKPS0 = k_cero
  224.                 T1CON.T1CKPS1 = k_cero
  225.                
  226.                 'CARGA EL TIMER1 CON UN VALOR TAL QUE DESBORDE A LOS 20ms
  227.                 TMR1H = v20ms_normal.HB
  228.                 TMR1L = v20ms_normal.LB
  229.                
  230.                 T1CON.TMR1ON = k_uno
  231.                 PIE1.TMR1IE = k_uno
  232.                 INTCON.PEIE = k_uno
  233.                
  234.                
  235.                 '-----------------------------------------------------------------------
  236.                 '----------------------------- P A S O   4 -----------------------------
  237.                 '-----------------------------------------------------------------------
  238.                 '--PROCESA LOS PULSOS Y DETERMINA CUAL ES ERRONEO                     --
  239.                 '-----------------------------------------------------------------------
  240.                 While pulso = pulso
  241.                
  242.                         pulso = k_cero
  243.                        
  244.                         Enable
  245.                         ServoIn pin_entrada, pulso
  246.                         Disable
  247.  
  248.                         'SI EL PULSO ES VALIDO LO COPIA EN EL PIN DE SALIDA
  249.                         If pulso > k_pulso_min And pulso < k_pulso_max Then
  250.                                 pin_led_falla = k_cero
  251.                                 contador_glitch = k_cero
  252.                                 ServoOut pin_salida, pulso
  253.                         Else
  254.                                 pin_led_falla = k_uno
  255.                                 contador_glitch = contador_glitch + k_uno
  256.                                
  257.                                 If contador_glitch > k_nro_max_pulsos_erroneos Then
  258.                                         'ESTO ES PARA EVITAR UN DESBORDAMIENTO Y PARA QUE NO SE REINICIE contador_glitch EN 0
  259.                                         contador_glitch = k_nro_max_pulsos_erroneos
  260.                                         ServoOut pin_salida, pulso_de_falla
  261.                                 Endif
  262.                                                
  263.                                 pin_led_falla = k_cero
  264.                         Endif
  265.                 Wend
  266.         Else
  267.                 'SI HUBO FALLA EN LA CALIBRACION CAE ACA Y HACE PARPADEAR EL LED ROJO
  268.                 For i = k_uno To k_cinco
  269.                         pin_led_falla = k_uno
  270.                         WaitMs k_cien
  271.                         pin_led_falla = k_cero
  272.                         WaitMs k_cien
  273.                 Next i
  274.         Endif
  275.  
  276. End                                              
  277.  
  278.  
  279. '-----------------------------------------------------------------------
  280. '----------------------------- P A S O   5 -----------------------------
  281. '-----------------------------------------------------------------------
  282. '--LEE LA CALIBRACION DEL CHIP                                        --
  283. '-----------------------------------------------------------------------
  284. Function carga_calibracion() As Bit
  285.         ASM:        bsf status,rp0 ;bank 1
  286.         ASM:        call 3ffh ;get the cal value
  287.        
  288.         'SOLAMENTE PARA DEPURACION
  289.         'ASM:        movlw 0x3c
  290.         ASM:        movwf osccal ;calibrate
  291.         ASM:        bcf status,rp0 ;bank 0
  292.         carga_calibracion = True
  293.         WaitMs k_diez
  294. End Function                                      
  295.  
  296.  
  297. '-----------------------------------------------------------------------
  298. '----------------------------- P A S O   6 -----------------------------
  299. '-----------------------------------------------------------------------
  300. '--INTERRUPCION POR TIMER1 QUE VERIFICA QUE HAYAN PASADO MAS DE 20MS  --
  301. '--SI DESPUES DE 20MS pulso ESTA EN CERO QUIERE DECIR QUE NO HA LEIDO --
  302. '--NADA Y EJECUTA EL PASO SIGUIENTE                                   --
  303. '-----------------------------------------------------------------------
  304. On Interrupt
  305. Save System
  306.         'CARGA EL TIMER1 CON UN VALOR TAL QUE DESBORDE A LOS 20ms
  307.         TMR1H = v20ms_normal.HB
  308.         TMR1L = v20ms_normal.LB
  309.        
  310.         'LIMPIA EL FLAG QUE SEÑALA QUE SE EJECUTO LA INTERRUPCION
  311.         PIR1.TMR1IF = k_cero
  312.        
  313.         'SI NO HA HABIDO UN PULSO DURANTE 20.2ms LO CONSIDERA GLITCH E INCREMENTA EL CONTADOR DE ESTOS
  314.         If pulso = k_cero And pin_entrada = k_cero And pin_salida = k_cero Then
  315.                 contador_glitch = contador_glitch + k_uno
  316.                
  317.                 'SI EL NUMERO DE PULSOS ERRONEOS O AUSENCIAS DE ESTOS ES
  318.                 'MAYOR AL NRO PERMITODO ASUME LA POSICION DE FALLA A LA SALIDA
  319.                 If contador_glitch > k_nro_max_pulsos_erroneos Then
  320.                         pin_led_falla = k_uno
  321.                         'ESTO ES PARA EVITAR UN DESBORDAMIENTO Y PARA QUE NO SE REINICIE contador_glitch EN 0
  322.                         contador_glitch = k_nro_max_pulsos_erroneos
  323.                         pulso_off = v20ms_normal + (pulso_de_falla * k_diez)
  324.                         ServoOut pin_salida, pulso_de_falla
  325.                         TMR1H = pulso_off.HB
  326.                         TMR1L = pulso_off.LB
  327.                 Endif
  328.         Endif
  329.  
  330. Resume

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: valentin en 29 de Agosto de 2009, 20:25:55
Buenas tardes a todos, quisiera por favor me informaran si existe alguna funcion en el micro mediante la cual el microprocesador mantenga el estado de las salidas luego de un corte de energia o de alimentacion del mismo. me explico mejor, tengo en proyecto hacer un sistema para proteccion de mi vehiculo con el cual active la salida del pic para activar un relay que me corte la corriente del vehiculo y por consiguiente se apague, el detalle esta en que si el ladron desconecta la bateria del vehiculo y la conecta nuevamente se desactivara la salida del pic y a su vez el relay de cortacorriente.

Gracias de antemano
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Agosto de 2009, 08:56:22
Para restablecer valores después de un corte de alimentación se utiliza la EEProm interna del PIC, también se puede utilizar una externa. Mediante un simple divisor de tensión se monitoriza la alimentación de la batería y, antes que el propio PIC se quede sin alimentación se guardan los valores del estado de los pin en la EEProm. Cuando vuelva la alimentación lo primero que se hará es buscar esos valores en la EEProm interna y, restaurarlos en el puerto de salida que controla los pin. Normalmente los condensadores del circuito de la fuente de alimentación del PIC son suficientes para mantener la alimentación durante el tiempo necesario, hasta que el micro realice esta operación que solo ocupará unos pocos mSeg. Este tiempo en el que el micro sigue operando aun que la alimentación principal este cortada, se puede incrementar aumentando las capacidades de los condensadores de la fuente del micro. Incluso se puede incorporar un diodo en serie con la entrada de nuestro circuito, después del divisor de tensión de muestreo de la alimentación, esto incrementa el efecto tanque de los condensadores.

Hay varios ejemplos en el índice del hilo para restablecer valores anteriores al apagado de circuito, busca en el índice “USO DE LA EEPROM INTERNA DEL PIC”

Desde aquí puedes descargar un articulo con esquema para que te sea más grafico.
http://www.todopic.com.ar/foros/index.php?topic=24123.msg195217#msg195217
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 28 de Septiembre de 2009, 06:33:47
Hola de nuevo


Una pregunta: ¿se puede hacer un reset por software para borrar todas las variables y volver a empezar?, ¿o es mejor poner un pulsador externo y cortar la alimentacion para hacer el reset?. Pues si yo desconecto el mando y lo vuelvo a conectar si que me acepta los cambios del potenciometro


Sal U2

NOTA: He editado el mesaje y eliminado el programa, pues he encontrado bastantes errores y cuando los tenga arreglados lo volvere a colgar, pues con los errores solucionados sigue dando los mimos errores que comentaba

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hugo777 en 14 de Octubre de 2009, 12:37:09
Hola nuevamente,

acá les posteo el esquema del circuito correspondiente al post #558.

Los materiales que use fueron
R1,R2,R3,R4   1KOhm
R5                  6.8KOhm
POT                10KOhm
C1                  100uF
C2                  0.01uF
CI                   SOCALO DIP 8

(http://img444.imageshack.us/img444/5558/fspcb.th.png) (http://img444.imageshack.us/i/fspcb.png/)

Descarga PCB (http://rapidshare.com/files/292930027/FS_PCB.pdf.html)


slds Hugo

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Octubre de 2009, 17:01:42
Hola de nuevo


Una pregunta: ¿se puede hacer un reset por software para borrar todas las variables y volver a empezar?, ¿o es mejor poner un pulsador externo y cortar la alimentacion para hacer el reset?. Pues si yo desconecto el mando y lo vuelvo a conectar si que me acepta los cambios del potenciometro


Sal U2

NOTA: He editado el mesaje y eliminado el programa, pues he encontrado bastantes errores y cuando los tenga arreglados lo volvere a colgar, pues con los errores solucionados sigue dando los mimos errores que comentaba



Bueno, borrar unas variables no es hacer un reset, un reset es algo más profundo y complicado. Cuando al micro se le da alimentación o se le provoca un reset por los medios que dispone se genera un forzamiento a una serie de registros internos a tomar unos valores predeterminados que harán que el micro comience a trabajar desde un modo preestablecido que llamaremos “inicio”, es decir desde unos valores programados en fabrica que permiten que toda la circuitería interna se sincronice y el núcleo del pic pueda tomar el mando. De todas formas el reset no borra las variables, recordamos que son posiciones de memoria, las deja igual, tan solo el apagado del micro garantiza un relativo borrado, en realidad tomaran valores aleatorios. La única forma de borrar las variables es igualándolas a un valor determinado por nosotros, normalmente se establece como estándar = 0 para la mayoría de tipos de variables.

¿Cómo hacer un reset en tiempo de ejecución?, pues la verdad nunca me lo he planteado me imagino que en el datasheet tiene que estar explicado algún sistema especial para hacerlo, seguramente escribiendo algún valor determinado en algún registro determinado. De todas formas se puede hacer de una manera u otra, por ejemplo si se activa el Watchdog del micro y este se deja de actualizar a consecuencia de general un evento externo como pulsar tal tecla o interno por ejemplo cuando una variable llega a un valor determinado, pues esta acción provoca un reset generado por nuestra programación, en fin, nuestro código.

Y volviendo al tema directo del reset, desde luego lo mejor es quitar la alimentación o generar una reinicio mediante el pin establecido para ello.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Octubre de 2009, 17:03:56
Hola nuevamente,

acá les posteo el esquema del circuito correspondiente al post #558.

Los materiales que use fueron
R1,R2,R3,R4   1KOhm
R5                  6.8KOhm
POT                10KOhm
C1                  100uF
C2                  0.01uF
CI                   SOCALO DIP 8

(http://img444.imageshack.us/img444/5558/fspcb.th.png) (http://img444.imageshack.us/i/fspcb.png/)

Descarga PCB (http://rapidshare.com/files/292930027/FS_PCB.pdf.html)


slds Hugo



Permiteme que te felicite por tu trabajo, llevo unas semanas ocupado, pero cuando pueda lo añadire al idice del hilo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hgp_2611 en 17 de Octubre de 2009, 19:01:14
Que tal,exelente tema:D..y comos etrabaja con el PIC SIMULADOR IDE tengo una pregunta al respecto para como programar mi oscilador interno, trabajo con PIC SIMULADOR IDE y en CONFIGURACION DE BITS activo q tabaje con el oscilador interno, y automaticamente me configura los bits (mclr,etc) pero solo activa el oscilador mas no tiene para que yo lo programe a 2,4, u 8 mhz,aunq por default al activarlo este corre a 4mhz. cuando lo cargo con mi programa para programar el pic no me aparece ningun error en la CONFIGURACION DELOS BITS!,. lo que deseo saber escon que comando puedo cambiar el valor paraq ademas de activar mi osciulador interno en CONFIGURE BITS pueda yo cambiar su frecuencia de trabajo...espero algien me pueda ayudar. Gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Octubre de 2009, 22:05:53
Con la configuración de bit lo que se hace en general es indicarle unas pautas de trabajo diferentes al micro, es decir,
se pueden activar módulos que normalmente están deshabilitados. En tu caso particular quieres trabajar con el oscilador
interno del pic. Pero esto solo lo habilita como oscilador por defecto, después hay que programarlo modificando un registro
interno desde el programa, esto hará que trabaje con la frecuencia deseada, dentro de las posibles.

Resumiendo hay dos pasos a seguir:

1º Mediante la opción del PSI “CONFIGURACION DE BITS” activamos por defecto el oscilador interno.
2º Mediante la modificación de un registro especial durante el programa especificamos a que frecuencia oscilara.

Por ejemplo para el PIC16F88 se configura para 8Mhz añadiendo la siguiente línea al principio de nuestro programa:
OSCCON = 0x7e 'Se usara reloj interno a 8Mhz

Tienes que mirar en el datasheet de tu micro como se hace para el micro utilizado.
De todas formas normalmente al activar el oscilador interno, si no se le indica nada suele trabajar a 4Mhz por defecto como bien indicaste.
Título: COnfigurando OScilador Interno
Publicado por: hgp_2611 en 18 de Octubre de 2009, 15:07:30
GRacias pro tu ayuda amigo DogFlu66,ya logre configurar mi oscilador interno, y aca coloco como fue q lo configure por si algien maneja el mismo:


segun la datasheet para el pic 16f887 solo hay q cambiar los bits 4, 5 y 6(contando de derecha a izquerda).

asi:                 

                        bit6          bit5       bit4
Para 1Mhz           1             0           0
Para 2Mhz           1             0           1
Para 4Mhz           1             1           0
Para 8Mhz           1             1           1


Entonces para 1Mhz qda asi:

OSCCON = 0x46  'Se configura reloj interno a 1Mhz %0100-0110

Entonces solo hay q cambiar los bits que corresponden por el valor al que se quiera hacer trabajar al oscilador interno, por cierto se pueden poner en hex como lo puse (OSCCON = 0x46) o en binario como esta en el comentario (%01000110) claro sin el guion que solo puse para poder separar en 4 bits y asi sea mas facil convertirlo y entenderlo del hex.Ademas COmo dijo el amigo Dogflu66 es basico configurar los bits en OpTIOS- COnfigure Bits del Pic simulador ide,y poner q se va a trabajar con el oscilador interno en mi caso es: OSCILLATOR SELECTION: INTOSC (Aclaro,para pic 16F887)

Y por si a algien le interesa para q sirven los otros bits aca esta:

Igual contando de derecha a izquierda:
                                                              bit7                 bit0

                                                                  0 1 0 0 0 1 1 0


Bit 0: SCS: System Clock Select bit
1 = Internal oscillator is used for system clock
0 = Clock source defined by FOSC<2:0> of the CONFIG1 register
 
Como ven yo selecione un "0" ya que por lo que entiendo, con el 0 lo que indico es que no voy a trabajar con el oscilador interno que trae por deafault configurado (q es el de 4mhz) si no que yo lo voy a determinar con los bits que cambio del OSCCON. Aunq tengo la duda de que si sirve asi como yo dije(SI ESTOY MAL ESPERO ME CORRIJAN).

Bit 1 LTS: LFINTOSC Stable bit (Low Frequency – 31 kHz)
1 = LFINTOSC is stable
0 = LFINTOSC is not stable
Aqui yo asigne un "1" ya que le digo que este estable. (aunq en realidad supongo no me sirve en este caso ya que no estoy trabjando con Low Frequency, asiq es lo mismo si pongo un 0)

Bit 2 HTS: HFINTOSC Status bit (High Frequency – 8 MHz to 125 kHz)
1 = HFINTOSC is stable
0 = HFINTOSC is not stable

Seleccione un "1" por que aqui si selecciono una frecuencia estable y como trabajo dentro del rango q indica si debe llevar un 1.


Bit 3 OSTS: Oscillator Start-up Time-out Status bit(1)
1 = Device is running from the external clock defined by FOSC<2:0> of the CONFIG1 register
0 = Device is running from the internal oscillator (HFINTOSC or LFINTOSC)

Creo q aqui selecciono o se configura para trabajar con oscilador externo = 1 o para trabajar con el interno = 0, por eso puse 0

Bit 6-4 IRCF<2:0>: Internal Oscillator Frequency Select bits

ESto ya estaba aclarado al principio.

Bit 7 Unimplemented: Read as ‘0

Como lo indican,debe llevar un 0 siempre,no tiene uso.


BUeno espero mi colaboracion haya servido de algo! AL menos para algien mas que trate de hacer lo mismo q yo. y no haya podido,o no haya entendido como se hace. Colo que un tema en el foro que se llama Comenzando con PIC16F887 http://www.todopic.com.ar/foros/index.php?topic=27913.0 ai tambien coloque la info. SAludos!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hugo777 en 20 de Octubre de 2009, 12:14:09
Gracias dogflu66, no me quedo solamente ahí, como ya termine el failsafe, ahora estoy trabajando en un acelerador electronico con reversa, para eso estoy trabajando con un 16F628A, que es lo que he encontrado por acá(Chile), aunque preferiría un 12F683 porqué el 16F6... es muy delicado cuando lo tenga terminado lo posteare acá.

Mi idea es implementar los diversos sistemas para un submarino RC, usando para esto PSI.

ESC                                (75% AVANCEaprox.)
FAILSAFE                        (Terminado).
GIROSCOPO DE 2 EJES   (0%)
SENSORES DE AGUA       (0%)
SENSORES DE BATERIAS (0%)


Slds Hugo
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hgp_2611 en 02 de Noviembre de 2009, 03:37:13
Q tal:d..como estamos?..pues solo vuelvo por aqui para consultar si podrian explicarme como usar un vector...uso este compilador, o si hay algun ejemplo q incluya uno para ver como usarlo,mas bien ya se como declararlo pero a la hora de seleccionar cada byte del vector es dodne tengo duda..pues en el manual del pic simulador ide no hay mucha info!..:D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: hugo777 en 04 de Noviembre de 2009, 11:20:31
Bueno como lo prometido es deuda, aquí esta el código del ESC que costruí, que posee reversa.


Código: vb.net
  1. '||===============================================================================||
  2. '||* Nombre Rutina: ESC_FINAL.BAS                                                *||
  3. '||* Entradas     : PORTA.2 SEÑAL DEL RX.                                        *||
  4. '||*                                                                             *||
  5. '||* Salidas      : PORTB.0 LED ENCENDIDO                                        *||
  6. '||*                PORTB.2 MARCA AVANCE                                         *||
  7. '||*                PORTB.3 PULSO PWM                                            *||
  8. '||*                PORTB.5 MARCA RETROCESO                                      *||
  9. '||*                                                                             *||
  10. '||* Objetivo     : controlar las señales enviadas por el RX e interpretarlas    *||
  11. '||*                como aceleracion según sea el grado de inclinacion de la     *||
  12. '||*                palanca del canal usado.                                     *||
  13. '||*                                                                             *||
  14. '||* Autor        : Hugo Sagardía Aguilera.                                      *||
  15. '||* Proyecto     : ACELERADOR ELECTRONICO                                       *||
  16. '||*                                                                             *||
  17. '||* Micro        : 16F628A                                                      *||
  18. '||* Oscilador    : IntRC IO                                                     *||
  19. '||* Velocidad    : 4Mhz                                                         *||
  20. '||* Flags        : WDT     OFF                                                  *||
  21. '||*                PWRT    OFF                                                  *||
  22. '||*                MCLR    OFF                                                  *||
  23. '||*                BODEN   OFF                                                  *||
  24. '||*                LVP     OFF                                                  *||
  25. '||*                CPD     OFF                                                  *||
  26. '||*                CP      OFF                                                  *||
  27. '||*                                                                             *||
  28. '||* ----------- ------- ------------------------------------------------------- *||
  29. '||* Fecha       Versión Descripción Cambio                                      *||
  30. '||* ----------- ------- ------------------------------------------------------- *||
  31. '||* 11/Ago/2009   1.0.0 (Version Original)                                      *||
  32. '||*                                                                             *||
  33. '||* 24/Ago/2009   1.0.1 (1.-se cambio BODEN a OFF para evitar reinicios.        *||
  34. '||*                      2.-se ignoran pulsos invalidos o fuera del intervalo   *||
  35. '||*                         [97 - 201].                                         *||
  36. '||*                      3.-se aumentaron de 8 a 40 los pulsos PWM.             *||
  37. '||*                      4.-se agregaron constantes.                            *||
  38. '||*                      5.-se ignoran pulsos invalidos al determinar el centro.*||
  39. '||*                      6.-no se realiza calculo de intervalos, se determina   *||
  40. '||*                         con valores escalares el pwm.                       *||
  41. '||*                      7.-en el 1er ciclo, del bucle principal no se          *||
  42. '||*                         ejecuta PWMduty para evitar accionar el motor al    *||
  43. '||*                         partir el circuito.                                 *||
  44. '||*                      8.-si el numero de pulsos invalidos en el ciclo        *||
  45. '||*                         principal supera los 25 se anula el pwm actual y    *||
  46. '||*                         quedan desctivados los pines de avance y retroceso  *||
  47. '||*                         25 ciclos de 20ms osea 20ms*25=500ms=0.5s,          *||
  48. '||*                         si hay mas de 0.5s sin señal se detiene todo.       *||
  49. '||*                                                                             *||
  50. '||* 25/Ago/2009   1.0.2 (1.-se volvio el centro del servo a un intervalo, por la*||
  51. '||*                         irregularidad que presenta al estar en el centro la *||
  52. '||*                         palanca de mandos.                                  *||
  53. '||*                                                                             *||
  54. '||* 29/Oct/2009   1.0.3 (1.-control del maximo)                                 *||
  55. '||===============================================================================||
  56. AllDigital
  57.  
  58. Config PORTA = Input
  59. Config PORTB = Output
  60. Config PORTB.6 = Input
  61.  
  62. '-------------------------------------------------------------------
  63. 'Define SIMULATION_WAITMS_VALUE = 1  'ignora los Waitms
  64. 'Define SEROUT_DELAYUS = 0
  65. '-------------------------------------------------------------------
  66.  
  67. 'CONSTANTES USADAS EN EL PROGRAMA
  68. Const k_cero = 0
  69. Const k_uno = 1
  70. Const k_dos = 2
  71. Const k_tres = 3
  72. Const k_cuatro = 4
  73. Const k_cinco = 5
  74. Const k_seis = 6
  75. Const k_siete = 7
  76. Const k_ocho = 8
  77. Const k_nueve = 9
  78. Const k_diez = 10
  79. Const k_once = 11
  80. Const k_doce = 12
  81. Const k_trece = 13
  82. Const k_catorce = 14
  83. Const k_quince = 15
  84. Const k_dieciseis = 16
  85. Const k_diecisiete = 17
  86. Const k_dieciocho = 18
  87. Const k_diecinueve = 19
  88. Const k_veinte = 20
  89. Const k_veintiuno = 21
  90. Const k_veintidos = 22
  91. Const k_veintitres = 23
  92. Const k_veinticuatro = 24
  93. Const k_veinticinco = 25
  94. Const k_veintiseis = 26
  95. Const k_veintisiete = 27
  96. Const k_veintiocho = 28
  97. Const k_veintinueve = 29
  98. Const k_treinta = 30
  99. Const k_treintiuno = 31
  100. Const k_treintidos = 32
  101. Const k_treintitres = 33
  102. Const k_treinticuatro = 34
  103. Const k_treinticinco = 35
  104. Const k_treintiseis = 36
  105. Const k_treintisiete = 37
  106. Const k_treintiocho = 38
  107. Const k_treintinueve = 39
  108. Const k_cuarenta = 40
  109. Const k_cincuenta = 50
  110. Const k_cien = 100
  111. Const k_pulso_min = 96
  112. Const k_pulso_max = 202
  113.  
  114. 'VARIABLES USADAS EN EL CICLO PRINCIPAL
  115. Dim pulso_pwm(40) As Byte
  116. Dim duty As Byte  '0..255
  117. Dim pos As Byte  '0..255
  118. Dim largo_pulso As Byte  '0..255
  119.  
  120. 'VARIABLES USADAS PARA DETERMINAR LA POSICION CENTRAL
  121. Dim cuenta_pulsos(10) As Byte
  122. Dim muestra_pulsos(10) As Byte
  123. Dim centro_servo As Byte
  124. Dim i As Byte
  125. Dim j As Byte
  126. Dim inicio As Byte
  127. Dim muestra_estable As Byte
  128. Dim indice_estable As Byte
  129. Dim pulso_tmp As Byte
  130.  
  131. 'VARIABLES USADAS PARA CALCULAR EL INTERVALO CENTRAL
  132. Dim centro_min As Byte
  133. Dim centro_max As Byte
  134.  
  135. 'PARA EVITAR ACCIONAR EL MOTOR AL ENCENDER EL CIRCUITO
  136. Dim inicio_flag As Byte
  137. inicio_flag = 1
  138.  
  139. 'PARA EL GLITCH
  140. Dim pulso_min As Byte
  141. Dim pulso_max As Byte
  142.  
  143. 'AQUI INICIALIZA EL ARREGLO CON LOS PULSOS PWM
  144. pulso_pwm(0) = 177
  145. pulso_pwm(1) = 179
  146. pulso_pwm(2) = 181
  147. pulso_pwm(3) = 183
  148. pulso_pwm(4) = 185
  149. pulso_pwm(5) = 187
  150. pulso_pwm(6) = 189
  151. pulso_pwm(7) = 191
  152. pulso_pwm(8) = 193
  153. pulso_pwm(9) = 195
  154. pulso_pwm(10) = 197
  155. pulso_pwm(11) = 199
  156. pulso_pwm(12) = 201
  157. pulso_pwm(13) = 203
  158. pulso_pwm(14) = 205
  159. pulso_pwm(15) = 207
  160. pulso_pwm(16) = 209
  161. pulso_pwm(17) = 211
  162. pulso_pwm(18) = 213
  163. pulso_pwm(19) = 215
  164. pulso_pwm(20) = 217
  165. pulso_pwm(21) = 219
  166. pulso_pwm(22) = 221
  167. pulso_pwm(23) = 223
  168. pulso_pwm(24) = 225
  169. pulso_pwm(25) = 227
  170. pulso_pwm(26) = 229
  171. pulso_pwm(27) = 231
  172. pulso_pwm(28) = 233
  173. pulso_pwm(29) = 235
  174. pulso_pwm(30) = 237
  175. pulso_pwm(31) = 239
  176. pulso_pwm(32) = 241
  177. pulso_pwm(33) = 243
  178. pulso_pwm(34) = 245
  179. pulso_pwm(35) = 247
  180. pulso_pwm(36) = 249
  181. pulso_pwm(37) = 251
  182. pulso_pwm(38) = 253
  183. pulso_pwm(39) = 255
  184.  
  185. 'DEFINE LOS NOMBRES DE LOS PINES POR FUNCION
  186. Symbol pin_led_verde = PORTB.0
  187. Symbol pin_rx = PORTA.2
  188. Symbol pin_avance = PORTB.2
  189. Symbol pin_retroceso = PORTB.5
  190. Symbol pin_pwm = PORTB.3
  191.  
  192. '-----------------------------------------------------------------------
  193. '----------------------------- P A S O   1 -----------------------------
  194. '-----------------------------------------------------------------------
  195. 'AQUI TOMA MUESTRAS DE LOS PULSOS QUE ESTAN LLEGANDO
  196. 'IGNORA LOS PULSOS INVALIDOS
  197. i = k_cero
  198. 'pulsos_de_muestra:
  199. While i < k_diez
  200.         ServoIn pin_rx, pulso_tmp
  201.        
  202.         If pulso_tmp > k_pulso_min And pulso_tmp < k_pulso_max Then
  203.                 muestra_pulsos(i) = pulso_tmp
  204.                 i = i + k_uno
  205.         Endif
  206. Wend
  207.  
  208. 'AQUI CUENTO LAS VECES QUE APARECE UN MISMO PULSO DENTRO DEL MUESTREO
  209. For j = k_cero To k_nueve
  210.         inicio = j + k_uno
  211.         cuenta_pulsos(j) = k_uno
  212.         For i = inicio To k_nueve
  213.                 If muestra_pulsos(j) = muestra_pulsos(i) Then
  214.                         cuenta_pulsos(j) = cuenta_pulsos(j) + k_uno
  215.                 Endif
  216.         Next i
  217. Next j
  218.  
  219. 'AQUI VE CUAL ES LA MUESTRA QUE MAS SE REPITE
  220. muestra_estable = k_cero
  221. For i = k_cero To k_nueve
  222.         If cuenta_pulsos(i) > muestra_estable Then
  223.                 muestra_estable = cuenta_pulsos(i)
  224.                 indice_estable = i
  225.         Endif
  226. Next i
  227.  
  228. 'AQUI OBTIENE EL VALOR QUE CORRESPONDE A LA POSICION CENTRAL DEL CENTRO DEL STICK
  229. centro_servo = muestra_pulsos(indice_estable)
  230.  
  231. 'PARA ESTE CENTRO DE SERVO DETERMINA EL PULSO MAXIMO Y EL PULSO MINIMO VALIDO
  232. pulso_min = (centro_servo - k_treintisiete) - k_uno
  233. pulso_max = (centro_servo + k_cuarenta) + k_uno
  234.  
  235. 'POSICION CENTRAL DEL INTERVALO CERRADO [ X ]
  236. centro_min = centro_servo - k_uno
  237. centro_max = centro_servo + k_uno
  238.  
  239. 'TODO OK ENCIENDE LED VERDE Y APAGA EL DE FALLO
  240. pin_led_verde = k_uno
  241.  
  242. '-----------------------------------------------------------------------
  243. '----------------------------- P A S O   2 -----------------------------
  244. '-----------------------------------------------------------------------
  245. 'AQUI ESTA EL CICLO PRINCIPAL EN DONDE SE CALCULA LA ACELERACION
  246.  
  247. largo_pulso = k_cero
  248. PWMon k_uno, k_nueve
  249.  
  250. 'AQUI CALCULA LOS INTERVALOS USADOS PARA DETERMINAR LAQ ACELERACION
  251. ''|------R E T R O C E S O------|     |---------A V A N C E---------|
  252. '(00](01](..](..](..](..](38](39][ X ][41)[42)[..)[..)[..)[..)[79)[80)
  253. ''|   |   |   |   |   |   |   |         |   |   |   |   |   |   |   |
  254. ''|   |   |   |   |   |   |   -----------   |   |   |   |   |   |   |
  255. ''|   |   |   |   |   |   -------------------   |   |   |   |   |   |
  256. ''|   |   |   |   |   ---------------------------   |   |   |   |   |
  257. ''|   |   |   |   -----------------------------------   |   |   |   |
  258. ''|   |   |   -------------------------------------------   |   |   |
  259. ''|   |   ---------------------------------------------------   |   |
  260. ''|   -----------------------------------------------------------   |
  261. ''-------------------------------------------------------------------
  262. '-----------------------------------------------------------------------
  263.  
  264. loop:
  265.         largo_pulso = k_cero
  266.        
  267.         ServoIn pin_rx, largo_pulso
  268.  
  269.         'IGNORA LOS PULSOS INVALIDOS
  270.         If largo_pulso > pulso_min And largo_pulso < pulso_max Then
  271.                 'SI RECIBIO UN PULSO VALIDO REINICIA EL CONTADOR DE GLITCH
  272.                 pin_led_verde = k_uno
  273.                
  274.                 'SI EL PULSO ESTA EN EL CENTRO DETIENE TODO
  275.                 If largo_pulso >= centro_min And largo_pulso <= centro_max Then
  276.                         duty = k_cero
  277.                         pin_avance = k_cero
  278.                         pin_retroceso = k_cero
  279.                 Else
  280.                         If largo_pulso < centro_servo Then
  281.                                 'SI ES RETROCESO
  282.                                 pos = (centro_servo - largo_pulso) - k_uno
  283.                                 pin_avance = k_cero
  284.                                 WaitUs k_cinco
  285.                                 pin_retroceso = k_uno
  286.                         Else
  287.                                 'SI ES AVANCE
  288.                                 pos = (largo_pulso - centro_servo) - k_uno
  289.                                 pin_retroceso = k_cero
  290.                                 WaitUs k_cinco
  291.                                 pin_avance = k_uno
  292.                         Endif
  293.                         'SI PASA DEL PWM MAXIMO SE ACOTA A ESTE SOLAMENTE
  294.                         If pos > k_treintinueve Then
  295.                                 pos = k_treintinueve
  296.                         Endif
  297.                         duty = pulso_pwm(pos)
  298.                 Endif
  299.         Endif
  300.  
  301.         'PARA EVITAR MOVER EL MOTOR AL ACCIONAR EL SWITCH
  302.         If inicio_flag = k_cero Then
  303.                 PWMduty k_uno, duty
  304.         Else
  305.                 inicio_flag = k_cero
  306.         Endif
  307.         Goto loop
  308.  
  309. End

el PCB del circuito es el siguiente
(http://img256.imageshack.us/img256/6273/escpcbv307.png) (http://img256.imageshack.us/i/escpcbv307.png/)

OWNLOAD PCB (http://rapidshare.com/files/302331170/ESC_PCB_v307.pdf.html)

Slds Hugo.

pd:en este código se hace uso de arreglos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Diciembre de 2009, 06:49:53
En la ultima versión del Basic del PSI, el compilador, no permite la terminación de los programas con la palabra clave END si ya se uso previamente. Así que tendremos que eliminarla de los ejemplos de este hilo, si queremos compilar correctamente con esta nueva versión.

También se añadió la posibilidad de declarar variables locales en las estructuras creadas con Function y Proc (tambien en las subrutinas que se hace su llamada mediante GOSUB), por lo que la construcción de los programas a partir de ahora cambiará, esto implica que las variables globales se usarán lo menos posible, al igual que toda rutina que se tenga que llamar con GOSUB siendo sustituidas por las funciones (Function y Proc).

Y añadiendo esto a la lista de lo no aconsejable de utilizar en un programa queda como sigue:

Variable Global = Usarlas pero las justas
Saltos con Gosub = al igual que el Gosub/Return sustituyo al Goto hace mas de 30 años ahora si lo deseamos podemos sustituir el Gosub/Return por las funciones.
Saltos con Goto = KK+KK
Waitms o Waitus = KK+KK
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 29 de Diciembre de 2009, 16:02:47
Bueno llevo como 2 tardes leyendo este tema, (quisiera empezar a realizar cosas en serio con basic), decir que estuve realizando algun ejemplito con Proton+, pero el manual se me hace muy pesado(dichoso sekespeae). Por este motivo empezé a leer, leer, ... y seguir leyendo en este tema y dada la cantidad de informacion que hay en cristiano me parece que voy a seguir :mrgreen: :mrgreen: (empezar) con PSI mas a fondo. Y despues de leer varias paginas se surjen algunas dudas:

1º al realizar un programa con PSI ¿no hay que colocar en el programa el tipo de micro que se va a utilizar? algo asi como Device= tipo de micro.
2º en varios ejemplos he visto que se utiliza el PIC 16F88 y que al añadir la configuracion de los fuses está realizado en 2 lineas, algo asi como:
Define CONF_WORD = 0x2f102.
Define CONF_WORD_2 = 0x3ffc

¿esto por que es?

Voy a empezar un nuevo proyecto que le voy a llamar "Control distribuido". Basicamnete constará de varias tarjetas y podra ser ampliable. Entre las tarjetas ademas de la del micro con su(s) osciadores-reset-......., constará de una tarjeta de entradas-salidas digitales, otra de entrada analogicas, otra de frecuencias,........ bueno esa es la intencion ya veremos en que termina todo.
El caso que no queria realizarla ni con ASM, ni con Niple, asi que me he decidido hacerlo con basic y espero que me aguenten las preguntas y dudas que me vayan surjiendo.
Gracias de antemano a todos.
Fermin










Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 29 de Diciembre de 2009, 18:27:45
Respecto a la 2a cuestion me respondo a mi mismo.

He abierto un proyecto con PSI y he configurado los bits de los fuses y he comprobado por que se ponen en 2 lineas separadas junto con el datasheet del micro.

¡Creo que necesito seguir leyendo mucho!
fer.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Diciembre de 2009, 18:35:28
Hola Fer_TACA y bienvenido por aquí.

El tipo de micro se elige de una lista del entorno de trabajo del Pic Simulator IDE, exactamente en el menú Options/Select Microcontroller, quedará memorizado en el IDE, pero nunca en el código fuente (.bas), por esto hay que especificarlo siempre en el archivo .bas en una línea de comentario y, cambiarlo en el IDE cuando sea necesario. Porque el IDE del PSI se queda configurado con el último que utilizamos. Ósea no existe un comando o “Define” para indicar en el código fuente el tipo de microcontrolador que queremos utilizar.

A la frecuencia de trabajo del reloj del micro le pasa lo mismo que a la selección del microcontrolador, se puede configurar en el IDE pero no se memoriza en el fuente, pero en este caso si disponemos de un comando para especificarla en el código fuente (file .bas) de forma permanente. Cuando se compila el IDE reconoce la frecuencia marcada en el código fuente y se configura con ella.
Añadir al código fuente la siguiente línea:
Define CLOCK_FREQUENCY = 8 'Reloj trabajará a 8Mhz.

Con respecto a la configuración de fueses, se pueden configurar directamente en el código fuente, pero es más fácil de configurar desde el IDE. Se realiza desde el entorno Pic Simulator IDE en el menú Options/Configurations Bits. Saldrá la ventanita con todos los fuses posibles e iras marcándolos con todas sus variantes, una vez terminado esto marcas “Generate Basic Code” y serán insertados en el editor en las primeras líneas del programa. El que salgan más o menos líneas depende de la complejidad del micro. Y lo mismo que para el anterior, cuando se compila la primera vez los Bit (fuses) de configuración en el IDE se cambian de forma automática a la configuración especificada en el código.


PD. Ya tenia el texto escrito.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 29 de Diciembre de 2009, 18:43:16
Gracias maestro por la respuesta.
La verdad es que no entendia como guardaba el tipo de micro aunque me figuraba que deberia ser algo asi. Respecto a la linea del tipo de oscilador ya lo tenia claro, sobre todo despues de leer un monton de paginas de este tema.
Aprovechando_
He visto que tanto las funciones o como los procedimeintos no se llaman desde ningun punto de main o subrutinas. Me imagino que son parte del codigo que se estan realizando como si estuvieran en un 2º nivel. La verdad es que no he encontrado en ningun sitio nada escrito al respecto tipo manual o algo asi.

De todas forma, por hoy ya casi que lo voy a dejar que llevo como 4 horas leyendo y la cabeza me echa humo. Es bueno descansar y luego se retoma mas fresca la cosa.
fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Diciembre de 2009, 20:01:37
Dejo este codigo que contiene una funcion que nos permite insertar 3 bases de tiempos para redistribuir el flujo de nuesto programa.

Código: [Seleccionar]
'********************************************************************************
'NOMBRE: 16F88_Function_Timer1_10
'MICRO: PIC16F88, 8Mhz Interno
'DESCRIPCION: Ejemplo Timer por soft.
'FECHA/AUTOR: By COS, 12/09, PSI v7.41
'VERSION: 1.0
'Encendido y apagado de los indicadores luminosos de la EBasic a distina velocidad.
'Se crean 3 bases de tiempos para el control del flujo del progrma.
'Las bases de tiempos se basan en el tmr1.
'********************************************************************************
Define CONF_WORD = 0x2f50  '/*power-up timer = On, brown-out reset = On
Define CONF_WORD_2 = 0x3ffc  '*/
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Asignacion de nombres a pin ----------------------------------------------
Symbol led_vd = RB0  'Pin out, led verde
Symbol led_am = RA7  'Pin out, led amarillo
Symbol lcd_dy = RB3  'Pin out, iluminacion desplay
'Declaracion de variables generales----------------------------------------
'Asignacion de valores a las variables-------------------------------------
'Configuracion modulos generales (E/S)-------------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'Interrupciones a ON-------------------------------------------------------
'INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE = 1, Habilita las interrupciones generales
'Inicializacion Fuction, Proc, Variables I/O Function----------------------
Call timer(5, 30, 1, 0x3cb0, 0)  '/*Inicializa bases de tiempos
'Timer.1 = 0.5 Seg., Timer.2 = 3 Seg., Timer.3 = 100mSeg. */
'Rutina MAIN---------------------------------------------------------------
main:  'Rutina principal (inicio)
If timer.1 = 1 Then  'Control por timer.1
Toggle led_am  'Invierte el valor del Pin
timer.1 = 0  'Activa el TMR01
Endif
If timer.2 = 1 Then  'Control por tiemer.2
Toggle led_vd  'Invierte el valor del Pin
timer.2 = 0  'Activa el TMR02
Endif
If timer.3 = 1 Then  'Control por timer.3
Toggle lcd_dy  'Invierte el valor del Pin
timer.3 = 0  'Activa el TMR03
Endif
Goto main  'Redirecciona el flujo del programa al inicio
End  'Fin del main                               
'Nombre: Function3BasesTiemposTMR1.bas
'Función bases de tiempos.
'Los tiempos en pasos de 100mSeg = 0x3cb0.
'Call timer(x, y, z, 0x3cb0, 0), Inicializa bases de tiempos.
'Call timer(x, y, z, 0x3cb0, 1), Llamada normal a la rutina despues incializacion.
'Los flag de los timer son: timer.1, timer.2 y timer.3
'tmr1hl = tiempo desborde timer1, Init = 0 incializa la rutina.
'Hay que incluir el progra las siguietnes lineas:
'Enable  'INTCON.GIE = 1, Hay que recordar insertarlo en el codigo fuente.
'y rutina interrupciones (On interrupt).
Function timer(tmr01_tm As Byte, tmr02_tm As Byte, tmr03_tm As Byte, tmr1hl As Word, init As Byte) As Byte
Dim tmr01 As Byte  'Declaracion de contadores locales
Dim tmr02 As Byte
Dim tmr03 As Byte
TMR1H = tmr1hl.HB  '0x3c, carga el byte alto del regis. tiemr1 (100mSeg) a 8Mhz
TMR1L = tmr1hl.LB  '0xb0, carga el byte bajo del regis. timer1 (100mSeg) a 8Mhz
If init = 0 Then  'Configuracion del timer1-------------------------------
timer = 0  'Incializa variables
tmr01 = 0
tmr02 = 0
tmr03 = 0
T1CON.TMR1CS = 0  'Bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0  'Bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 1  'Bit de seleccion del prescaler para el reloj del timer1
INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
T1CON.TMR1ON = 1  'Activa el contador del TMR1
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
Endif
If timer.1 = 0 Then  'Control base tiempos timer.1
tmr01 = tmr01 + 1  'Incrementa el contador
If tmr01 >= tmr01_tm Then  'Comprueba el tope del contaje
timer.1 = 1  'Para el contador e indica que termino
tmr01 = 0  'Prepara un nuevo contaje
Endif
Endif
If timer.2 = 0 Then  'Control base tiempos timer.2
tmr02 = tmr02 + 1  'Incrementa el contador
If tmr02 >= tmr02_tm Then  'Comprueba el tope del contaje
timer.2 = 1  'Para el contador e indica que termino
tmr02 = 0  'Prepara un nuevo contaje
Endif
Endif
If timer.3 = 0 Then  'Control base tiempos timer.3
tmr03 = tmr03 + 1  'Incrementa el contador
If tmr03 >= tmr03_tm Then  'Comprueba el tope del contaje
timer.3 = 1  'Para el contador e indica que termino
tmr03 = 0  'Prepara un nuevo contaje
Endif
Endif
PIR1.TMR1IF = 0  'Borra flag de interrupcion
End Function                                     
'Rutina interrupciones----------------------------------------------
On Interrupt  'Para interrupciones
Save System  'Guarda valores de calculos intermedios del sistema
If PIR1.TMR1IF Then Call timer(5, 10, 1, 0x3cb0, 1)  '/*Llama a la funcion de los timer
Resume  'Retorna y activa interrupciones
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 29 de Diciembre de 2009, 20:30:06
Y después de probar nuestro código, si nos es satisfactorio, pues guardamos nuestra rutina de bases de tiempos con el nombre elegido, en este caso function3basestiempostmr1.bas y ya solo queda incluirla en el código de la siguiente forma, que dando este muy simplificado.

Código: [Seleccionar]
'********************************************************************************
'NOMBRE: 16F88_Function_Timer1_10_01
'MICRO: PIC16F88, 8Mhz Interno
'DESCRIPCION: Ejemplo Timer por soft.
'FECHA/AUTOR: By COS, 12/09, PSI v7.41
'VERSION: 1.0
'Encendido y apagado de los indicadores luminosos de la EBasic a distina velocidad.
'Se crean 3 bases de tiempos para el control del flujo del progrma.
'Las bases de tiempos se basan en el tmr1.
'********************************************************************************
Define CONF_WORD = 0x2f50  '/*power-up timer = On, brown-out reset = On
Define CONF_WORD_2 = 0x3ffc  '*/
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
Include "Function3BasesTiemposTMR1.bas"
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Asignacion de nombres a pin ----------------------------------------------
Symbol led_vd = RB0  'Pin out, led verde
Symbol led_am = RA7  'Pin out, led amarillo
Symbol lcd_dy = RB3  'Pin out, iluminacion desplay
'Declaracion de variables generales ---------------------------------------
'Asignacion de valores a las variables -------------------------------------
'Configuracion modulos generales (E/S) ----------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'Interrupciones a ON --------------------------------------------------------------
'INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE = 1, Habilita las interrupciones generales
'Inicializacion Fuction, Proc, Variables I/O Function ---------------------
Call timer(5, 30, 1, 0x3cb0, 0)  '/*Inicializa bases de tiempos
'Timer.1 = 0.5 Seg., Timer.2 = 3 Seg., Timer.3 = 100mSeg. */
'Rutina MAIN -------------------------------------------------------------------------
main:  'Rutina principal (inicio)
If timer.1 = 1 Then  'Control por timer.1
Toggle led_am  'Invierte el valor del Pin
timer.1 = 0  'Activa el TMR01
Endif
If timer.2 = 1 Then  'Control por tiemer.2
Toggle led_vd  'Invierte el valor del Pin
timer.2 = 0  'Activa el TMR02
Endif
If timer.3 = 1 Then  'Control por timer.3
Toggle lcd_dy  'Invierte el valor del Pin
timer.3 = 0  'Activa el TMR03
Endif
Goto main  'Redirecciona el flujo del programa al inicio
End  'Fin del main                               
End Function                                     
'Rutina interrupciones----------------------------------------------
On Interrupt  'Para interrupciones
Save System  'Guarda valores de calculos intermedios del sistema
If PIR1.TMR1IF Then Call timer(5, 10, 1, 0x3cb0, 1)  '/*Llama a la funcion de los timer
Resume  'Retorna y activa interrupciones

Include "function3basestiempostmr1.bas", esta línea la he colocado en distintas partes del código (antes o despues del Main) y el programa ha funcionando igual de bien. Siempre fuera de la rutina principal Main, por cuestiones obvias.

PD. Por si no quedo clara la utilidad de la turina: Los “Toggle led_am” y Toggle led_vd” y por último el “Toggle lcd_dy” tienen que ser sustituidos por códigos que no necesitan ejecutarse de forma continua, por ejemplo, en el refresco de un display, en otro la lectura de un teclado, y en el tercero un parpadeo de un led. De esta manera el micro tiene tiempo para dedicar a otros menesteres.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 30 de Diciembre de 2009, 10:03:10
Gracias por los ejemplos, los he estado revisando y lo seguiré haciendo me han aclarado mucho el funcionamineto de las funciones. Por lo que veo en la linea:
Call timer(5, 30, 1, 0x3cb0, 0)  '/*Inicializa bases de tiempos'Timer.1 = 0.5 Seg., Timer.2 = 3 Seg., Timer.3 = 100mSeg. */

lo que se realiza en el call es que en cada valor 5, 30,1 son multiplos de tiempos de 100msg y por tanto si en alguno, por ejemplo se necesitase 10 segundos, habria que poner el valor igual =  100.
El valor 0x3cb0 es el que se carga en los registros del tmr1 y el "0" final ¿Para que sirve?. Es para indicarle a que nivel se activa el tmr1.

¿para los procediemientos es igual?

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Diciembre de 2009, 12:49:00
Cuando se hace la llamada con ese valor a “0” lo que hacemos es ejecutar la parte de código de la función que inicializa los registros del modulo Timer, además de activar las interrupciones de periféricos. Después de esa llamada inicial siempre llamaremos a la función (desde el vector de interrupciones o rutina de interrupciones) con ese digito a “1” para que toda esa parte que queda almacenada en el micro no se vuelva a ejecutar cada vez, pues seria algo redundante.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Diciembre de 2009, 13:01:34
Para las funciones tipo Proc es igual; la diferencia está en que el nombre de la función (Function) es declarada por el compilador como una variable global, porque tiene que retornar un valor por el tema de transferencia de datos entre función y main (rutina principal). Y en las funciones tipo Proc el nombre tan solo es una etiqueta, porque no necesitan devolver resultados, este tipo de funciones aceptan argumentos de entrada pero no retornan valor.
Para comprender todo esto es necesario imaginarse las funciones como bloques o cajas cerradas de código, a estas se les suministran los datos de entrada y realizan su procesado, unas veces devuelven un valor (Function) y otras veces lo que realizan es tan solo una operación de salida sobre algún modulo (Proc).
Este sistema permite englobarlas en bloques de funciones y luego incorporarlas a nuestros programas de una forma muy fácil, porque son un código muy transportable
para ser reutilizado.

Las funciones permiten ser llamadas de varias formas:
Por ejemplo:
Timer = Timer (5, 30, 1, 0x3cb0, 1)

Variable = Timer(5, 30, 1, 0x3cb0, 1) 'Hay que declarar primero "variable"

Y la forma del ejemplo con el comando Call, esta ultima forma ocupa algo menos de código.
Call timer(5, 30, 1 0x3cb0, 1)

Sin embargo las funciones tipo Proc solo se pueden llamar con el comando Call.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 30 de Diciembre de 2009, 14:33:51
Lo tendré en cuenta, aunque me parece que eso todavia está un poco adelantado para mi :mrgreen:
Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Enero de 2010, 23:03:53
Sigo realizando pruebas con el tipo de estructuras en este caso Function del lenguaje y, me he llevado una grata sorpresa, resulta que estoy llamando a una misma función mientras se sigue ejecutándose de una anterior llamada y el programa no se cuelga, sale correctamente de la función y devuelve los parámetros correctos. La pregunta es ¿cómo se puede ejecutar dos veces el mismo código sin duplicarlo en el programa?, si es posible, mientras se ejecuta dicho código se genera una interrupción que lo vuelve a llamar. Y la siguiente pregunta es ¿por qué antes o la parte anterior del hilo no he utilizado este tipo de estructuras?, pues la respuesta es, porque en las anteriores versiones del Basic del PSI solamente se podían declarar dentro de estas estructuras hasta 5 variables locales y, ahora en la nueva versión del Basic del PSI las variables locales han sido ampliadas, a tantas como permita la cantidad de memoria que posea el pic utilizado. :mrgreen:

PD: Hay que tener cuidado con la recursividad, este lenguaje no la tiene, nos arriesgamos a un cuelgue. Esto no quiere decir que no se pueda utilizar pero seremos nosotros los que tendremos que colocar un código que nos controle esto.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: MiCrOtRoNiC en 04 de Enero de 2010, 01:39:12
interezante amigo :shock:... gracias por tus notas,tips,ejemplos. etc. de seguro a mucha gente nos servira...saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Enero de 2010, 06:54:27
Si, yo también me he quedado así  :shock:, teniendo en cuenta que esto es lenguaje Basic. De todas formas sea el lenguaje que sea este tipo de llamadas recursivas hay que usarlas con prudencia.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 05 de Enero de 2010, 18:22:28
Una pregunta más de quien está empezando:

Por ejemplo si estoy utilizando un pic 16F876 y quiero utlizar el puerto A solo con 3 entradas analogicas y el resto con señales  digitales basta con configutar el registro ADCON1 con el valor= xxxx0100. Doy por descontado que el registro TRIS A lo configuro como entrada.

Entonces si quiero realizar la lectura de esas patillas me imagino que la secuencia sería: primero se realizaria la conversion de una, se guarda el valor de la conversion, se realiza la convesión de la segunda - se guardaria su valor y asi sucesivamente.

Despues de realizar esta operación ¿no es necesario reconfigurar el puerto A como entrada digital si quiero leer una entrada (digital) en el resto de pines configurados como entradas digitales? Lo pregunto por que en algun sitio leí(seguro que lo hice mal pues mi ingles es muy malo) que cuando se realiza la lectura del puerto a como emtrada analogica se configura todo el como analogico.
Es que si miro en el datasheet indica que si se puede.

fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jhozate en 05 de Enero de 2010, 19:23:01
En el ADCON1 configuras cuales seran entradas analogas y y cuales seran E/S digitales, si quieres tener tres analogass cargas el ADCON1 con xxxx0100, aunque deberias indicar para las digitales si seran E/S seteando el TRISA.

saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Enero de 2010, 13:29:14
Hay que tener en cuenta para esta serie, que a la hora de asignar entradas analógicas a los pin para su uso con el modulo ADC, existe una plantilla que nos limita las opciones de configuración de las entradas.

(http://img710.imageshack.us/img710/3209/pic16f87xaadcpn1.jpg) (http://img710.imageshack.us/i/pic16f87xaadcpn1.jpg/)

Esto lo recuerdo para los que siguen este hilo con 16F88, porque este es un micro más moderno que no tiene estas restricciones y, esto puede llevar a error. Con esto quiero indicar que siempre que se utiliza PIC nuevo es muy recomendable echar un vistazo a su datasheet, ya que todos los micros de la familia 16F no son exactamente iguales en su configuración.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 07 de Enero de 2010, 17:54:47
Esto que comentas en la tabla ya lo tuve en cuenta, por eso puse ADCON1xxxx0100, luego entonces la secuencia correcta seria:


Por ejemplo si estoy utilizando un pic 16F876 y quiero utlizar el puerto A solo con 3 entradas analogicas y el resto con señales  digitales basta con configutar el registro ADCON1 con el valor= xxxx0100. Doy por descontado que el registro TRIS A lo configuro como entrada.

Entonces si quiero realizar la lectura de esas patillas me imagino que la secuencia sería: primero se realizaria la conversion de una, se guarda el valor de la conversion, se realiza la convesión de la segunda - se guardaria su valor y asi sucesivamente.

Despues de realizar esta operación ¿no es necesario reconfigurar el puerto A como entrada digital si quiero leer una entrada (digital) en el resto de pines configurados como entradas digitales? Lo pregunto por que en algun sitio leí(seguro que lo hice mal pues mi ingles es muy malo) que cuando se realiza la lectura del puerto a como emtrada analogica se configura todo el como analogico.
Es que si miro en el datasheet indica que si se puede.

Perdón si soy insistente.
fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Enero de 2010, 21:13:41
Si claro, con tu configuración según la tabla anterior los pin AN3, AN1 y AN0 quedan como analógicos y el resto digitales. Mi post anterior solo fue una aclaración para los que siguen el hilo. De todas formas por si sirve también de aclaración, hay que tener en cuenta que estos pin no se pueden leer directamente los tres a la vez, hay que seleccionar primero el pin que se va a conectar al modulo ADC, esperar un tiempo de estabilización y, posteriormente hacer la lectura del pin seleccionado. Por ejemplo con el 16F88 trabajando a 8Mhz cuando se cambia de canal (pin analógico a leer) puede llevar hasta 8 ciclos de reloj, esto es 4uSeg. de espera para que el modulo del ADC cambie su configuración a la nueva, si este tiempo de estabilización no se respeta, es posible que la lectura que obtendremos no sea correcta. Esto hay que tenerlo en cuenta en el caso de querer usar el ADC a la máxima velocidad y, para conseguir esto necesitamos construirnos nuestra propia función de lectura del ADC. En el caso de utilizar la función predefinida en el lenguaje para hacer la lectura del ADC, no tenemos que preocuparnos de todo esto ya que esta función es especialmente lenta, para no tener estos problemas.

PD. Si no cambiamos de pin y siempre leemos el mismo, la lectura es más rápida.

Otro PD. Y por supuesto hay que configurar los pin como In o como Out segun corresponda con TRIS
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 08 de Enero de 2010, 15:33:53
Muchas gracias por la aclaracion, maestro.
Por lo que se ve voy en la buena direccion.

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 09 de Enero de 2010, 15:35:15
Una pregunta quizas tonta:

¿PSI  no admite escribir la siguiente linea:
if porta.0=1 then portb.0=1 else portb.0=0
endif
?
Lo digo por que me da error de sintaxis. En cambio si pongo:
if porta.0=1 then
portb.0=1
else
portb.0=0
endif
Entonces no hay problema.

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Strepto en 09 de Enero de 2010, 16:09:54
Cuando escribes el IF en una unica linea el ENDIF no hace falta escribirlo (Por lo menos en el programa Proton) Prueba con eso

Un saludo!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 09 de Enero de 2010, 16:46:12
Pues parece que así es
Gracias Strepto

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 09 de Enero de 2010, 18:45:28
amigo Dogflu66: estoy siguiendo con mucho detalle todos los ejemplos que has realizado en este tema, para comprender  el funcionamiento de basic y del PSI. En alguno de ellos veo lo siguinete:
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms.
Entiendo que es para que cuando vas a simular en el PSI un programa que tenga WaitMS el simulador los ignore y no se tenga que esperar a que se cumpla todo el tiempo indicado en el wait.
Decirte que tengo un pequeño programa que solo enciende un par de leds, he incluido dicha linea pero cuando lo simulo es como si no estuviera y se están ejecutando los wait.
Estoy utilizando la version 6.65; puede ser que sea por que se haya añadido en una version posterior?

Gracias
Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Enero de 2010, 22:55:55
Pues no sabría decirte, el error que dio en versiones anteriores fue de compilación, porque no existía y el compilador no la entendía. Esa opción aparece por primera vez en la versión 6.41. En el histórico no aparece ninguna mención de algún problema con esa directiva.

http://www.oshonsoft.com/piclog.html
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 10 de Enero de 2010, 14:51:33
No si a mí no me da error ninguno a compilar, solo que no hace caso a esa linea y por tanto al ejecutar el programa siempre se ejecutan las instrucciones Wait.

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Enero de 2010, 16:17:04
No te entendí correctamente, por lo que he podido observar esa directiva no impide que se ejecuten los Wait, lo que hace es que se ejecuten mucho más rápido.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 10 de Enero de 2010, 16:26:06
Pues voy a comprobarlo, pues me parece que ni eso por que lo que entiendo que Simulation_wait_value=1 entiendo que seria solo de 1milisegundo.

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Enero de 2010, 16:33:41
Pues lo acabo de probar y si que funciona, apenas se para en los Waitms.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 10 de Enero de 2010, 16:34:59
Pues yo no aprecio el cambio, solo veo que va muy deprisa con la velocidad de simulacion: ultimate y ultra-fast, pero va igual de rapido con que sin el define.

F
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Enero de 2010, 07:50:20
Imagino que compilaste (con la tercera opción) el código después de cada cambio.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 11 de Enero de 2010, 14:02:00
Efectivamente compile con la tercera opcion

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RURE en 26 de Enero de 2010, 07:26:12
Hola grupo,  es mi primer post (perdonadme si hago algo mal), estoy trapicheando con el basic del pic simulator ide y tengo un problema, necesito escribir una variable Long en el Lcd y el comando Lcdout #, lo máximo que me deja poner es un Word, hay alguna manera de solucionarlo?, he intentado solucionarlo con Lcdout # x.HW, #.LW, pero me da (como es lógico) los valores Word independientes.

Gracias de antemano y Un Saludo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Enero de 2010, 19:52:36
Código: FreeBasic
  1. '***PARA SIMULACION, PIC16F877
  2. 'IMPRIMIR UNA VARIABLE LONG EN EL LCD
  3. Define ADC_CLOCK = 3  'default value is 3
  4. Define ADC_SAMPLEUS = 10  'default value is 20
  5. Define LCD_BITS = 8  'allowed values are 4 and 8 - the number of data interface lines
  6. Define LCD_DREG = PORTB
  7. Define LCD_DBIT = 0  '0 or 4 for 4-bit interface, ignored for 8-bit interface
  8. Define LCD_RSREG = PORTD
  9. Define LCD_RSBIT = 1
  10. Define LCD_EREG = PORTD
  11. Define LCD_EBIT = 3
  12. Define LCD_RWREG = PORTD  'set to 0 if not used, 0 is default
  13. Define LCD_RWBIT = 2  'set to 0 if not used, 0 is default
  14. Define LCD_COMMANDUS = 2000  'delay after LCDCMDOUT, default value is 5000
  15. Define LCD_DATAUS = 50  'delay after LCDOUT, default value is 100
  16. Define LCD_INITMS = 2  'delay used by LCDINIT, default value is 100
  17. 'the last three Define directives set the values suitable for simulation; they should be omitted for a real device
  18.  
  19. Dim a As Long
  20. Dim aux_a As Long
  21. Dim a0 As Word
  22. Dim a1 As Word
  23. Dim a2 As Word
  24. AllDigital
  25. Lcdinit 1  'initialize LCD module; cursor is blinking
  26. Lcdcmdout LcdClear
  27. loop:
  28.         a = 1234567890
  29.         aux_a = a / 1000000
  30.         a2 = aux_a
  31.         aux_a = aux_a * 1000000
  32.         a = a - aux_a
  33.         aux_a = a / 1000
  34.         a1 = aux_a
  35.         aux_a = aux_a * 1000
  36.         a0 = a - aux_a
  37.         Lcdcmdout LcdLine2Home  'set cursor at the beginning of line 2
  38.         Lcdout #a2, #a1, #a0  'formatted text for line 2
  39. End

Este es el único modo que tengo a mano, para algo más simple tendrás que buscar.

"a" contiene el numero para transformar.

Este número se divide en grupos de 4 cifras de derecha a izquierda, de esta forma
el número mayor será 9999.

Se declaran tres variables que contendrán las cifras a imprimir, a2 as Word, a1 as Word y a0 as Word.

Para extraer los dígitos del primer grupo se divide el numero que contiene "a" por una potencia de 10,
con tantos ceros como dígitos tienen los otros dos grupos .

Se pasa el valor a "a2".

Se resta a "a" los digitos extraidos añadiendo los ceros correspondientes y se carga "a" el valor pendiente.

Se repite la operación hasta quedarnos sin dígitos.


PD. Codigo corregido.

Nota: Actualmente se pueden enviar variables tipo Long directamente a los distintos dispositivos de salida.
   Por Ejemplo:
      Dim vlong as Long
      Lcdout #vlong
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RURE en 31 de Enero de 2010, 10:38:00
Gracias dogflu66 acabo de llegar a casa, mañana mismo lo probaré a ver que pasa.
Un saludo desde Albacete.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RURE en 02 de Febrero de 2010, 21:31:47
Hola otra vez, todo solucionado dogflu66, os explico el proyecto. Hay pululando por la red  el proyecto de un receptor basado en un sintonizador philips y un PIC18F4550 realizado por
Mario Sacco, como sólo lo necesito para la banda alta de VHF y en saltos de 50Khz, me propuse meterlo en un PIC16F628A. El código en basic me daba muchos errores y tuve que
remodelarlo al basic del Pic Simulator ide. Aquí os lo dejo, se aceptan criticas y sugerencias.
Un Saludo
Código: FreeBasic
  1. AllDigital  'Todos los puertos digitales
  2. '---------- CONFIGURACION PINES LCD ----------
  3. Define LCD_BITS = 4  'Bus de datos de 4 bits
  4. Define LCD_DREG = PORTB  'Bus de datos puerto B
  5. Define LCD_DBIT = 0  'Bus de datos, los 4 menos significativos
  6. Define LCD_RSREG = PORTB  'Puerto del RS
  7. Define LCD_RSBIT = 4  'Bit del RS
  8. Define LCD_EREG = PORTB  'Puerto del E
  9. Define LCD_EBIT = 5  'Bit del E
  10. Define LCD_RWREG = PORTB  'Puerto del RW
  11. Define LCD_RWBIT = 6  'Bit del RW
  12. Define LCD_COMMANDUS = 100  'Tiempo de espera despues de un comand
  13. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato
  14. Define LCD_INITMS = 10  'Tiempo de espera despues de inicializar
  15.  
  16. '----------CONFIGURACION I2C----------
  17. Symbol sda = PORTA.0  'bit conexien SDA
  18. Symbol scl = PORTA.1  'bit conexien SCL
  19.  
  20. '---------- VARIABLES----------
  21. Dim bb As Byte  'Byte para enviar al sintonizador (VHF en banda alta)
  22. Dim adbw As Byte  'Byte de direccien del sintonizador
  23. Dim cb As Byte  'Byte de control del sintonizador (pasos de 50 Khz)
  24. Symbol mas = PORTA.2  'Bit para subir frecuencia y memorias
  25. Symbol menos = PORTA.3  'Bit para bajar frecuencia y memorias
  26. Symbol mem = PORTA.4  'Bit para memorizar
  27. Symbol conmu = PORTA.5  'Bit para conmutar entre oscilador y memorias
  28. Dim modo As Bit  'Variable para commutar entre oscilador y memoria
  29. Dim divider As Word  'Frecuencia a cargar en el oscilador local del sintonizador
  30. Dim frec As Long  'Frecuencia que se muestra en el LCD
  31. Dim aux_frec As Long  'Variables auxiliares
  32. Dim frec1 As Byte  'para calcular la frecuencia
  33. Dim frec2 As Word  'Gracias a dogflu66, el Lcdout #, no admite un Long
  34. Dim memo As Byte  'Variable para cargar el numero de memoria
  35.  
  36. '----------CONFIGURACION DE INICIO----------
  37. bb = 2  'VHF en banda alta
  38. adbw = 194  'Dirección del sintonizador
  39. cb = 200  'Pasos de 50Khz
  40. Read 126, divider.HB  'He cogido  los dos ultimos bytes de la memoria
  41. Read 127, divider.LB  'del micro para guardar frecuencia
  42. memo = 1  'Comienzo en 1
  43. modo = 0  'Comienzo en oscilador
  44. '----------INICIO DEL PROGRAMA----------
  45. Lcdinit  'inicializa el lcd sin cursor
  46. inicio:
  47. If conmu = 1 Then Toggle modo  'Si se pulsa conmuto entre oscilador y memoria
  48. If modo = 0 Then  'Si esta a cero
  49. Goto oscilador  'Voy a oscilador
  50. Else  'si no
  51. Goto memoria  'voy a memoria
  52. Endif
  53.  
  54. '---------- MODO OSCILADOR ----------
  55. oscilador:
  56. Lcdcmdout LcdLine2Pos(13)
  57. Lcdout " VFO"  'Muestro en LCD que estoy en modo oscilador
  58. If mem = 1 Then Gosub guardar  'Si se pulsa mem guardo en memoria la frecuencia
  59. If mas = 1 Then divider = divider + 1  'Si se pulsa subo frecuencia
  60. If divider > 8248 Then divider = 3580  'Si llego a tope vuelvo al principio
  61. If menos = 1 Then divider = divider - 1  'Si se pulsa bajamos la frecuencia
  62. If divider < 3580 Then divider = 8248  'Si llego al primcipio salto al final
  63. Write 126, divider.HB  'Guardo la frecuencia en los dos
  64. Write 127, divider.LB  'ultimos bytes de la ram
  65. Gosub sintonizador  'Mando la frecuencia frecuencia al sintonizador
  66. Gosub display  'La muestro en el LCD
  67. Goto inicio  'Comienzo de nuevo
  68.  
  69. '---------- MODO MEMORIA ----------
  70. memoria:
  71. Lcdcmdout LcdLine2Pos(13)
  72. Lcdout "M:  "  'Limpio el numero de memoria
  73. Lcdcmdout LcdLine2Pos(13)
  74. Lcdout "M:" #memo  'Y lo muestro
  75. If mas = 1 Then memo = memo + 1  'Si se pulsa subo memoria
  76. If memo > 62 Then memo = 1  'Si  llega a tope vuelvo al principio
  77. If menos = 1 Then memo = memo - 1  'Si se pulsa bajo memoria
  78. If memo < 1 Then memo = 62  'Si llega al principio vuelvo al final
  79. If mem = 0 Then Goto memoria  'Si no se pulsa se queda titilando
  80. memo = memo * 2  'Calculo la posicion
  81. memo = memo - 1  'de la memoria ram
  82. Read memo, divider.HB  'Leo el primer byte
  83. memo = memo + 1  'calculo posicion del segundo byte
  84. Read memo, divider.LB  'Lo leo
  85. memo = memo / 2  'Dejo el numero de memoria como estaba
  86. Lcdcmdout LcdLine2Pos(13)
  87. Lcdout "M:" #memo  'Muestro numero de memoria
  88. Gosub sintonizador  'Mando frecuencia obtenida al sintonizador
  89. Gosub display  'La muestro en el LCD
  90. Goto inicio  'Comienzo de nuevo
  91. End                                              
  92.  
  93. '---------- RUTINA PARA MOSTRAR FREUCENCIA ----------
  94. display:
  95. Lcdcmdout LcdLine1Home
  96. Lcdout "FRECUENCIA"
  97. frec = divider * 50  'Conseguimos la frecuencia multiplicando por el salto
  98. frec = frec - 42500  'en Khz y restando la frecuencia intermedia
  99. aux_frec = frec / 10000  'Aqui es donde interviene dogflu66
  100. frec1 = aux_frec  'muchas gracias, como solo necesitaba 6 digitos
  101. aux_frec = aux_frec * 10000  'he recortado un poco el codigo
  102. frec2 = frec - aux_frec
  103. Lcdcmdout LcdLine2Home
  104. Lcdout #frec1, #frec2, "Khz"  'Muestro la frecuencia en el LCD
  105. Return                                            
  106.  
  107. '---------- RUTINA PARA GUARDAR MEMORIA ----------
  108. guardar:
  109. Lcdcmdout LcdLine2Pos(13)
  110. Lcdout "M:  "  'Limpio el numero de la memoria
  111. Lcdcmdout LcdLine2Pos(13)
  112. Lcdout "M:" #memo  'Lo muestro
  113. If mas = 1 Then memo = memo + 1  'Si pulsamos sube memoria
  114. If memo > 62 Then memo = 1  'Si llego a tope paso a 1
  115. If menos = 1 Then memo = memo - 1  'Si pulsamos bsja memoria
  116. If memo < 1 Then memo = 62  'Si retrocedo paso a la ultima
  117. If mem = 0 Then Goto guardar  'Titila si no pulsamos guardar
  118. memo = memo * 2  'Calculo la posicion
  119. memo = memo - 1  'en la memoria ram
  120. Write memo, divider.HB  'Escribo el primer byte
  121. memo = memo + 1  'Calculo posicion del segundo byte
  122. Write memo, divider.LB  'lo escribo
  123. memo = memo / 2  'Dejo el numero como estaba
  124. Lcdcmdout LcdLine2Pos(13)
  125. Lcdout "M:" #memo  'Muestro numero de memoria en el LCD
  126. Return                                            
  127.  
  128. '---------- RUTINA PARA ENVIAR FRECUENCIA A SINTONIZADOR----------
  129. sintonizador:
  130. I2CPrepare sda, scl  'Preparamos el bus I2C
  131. I2CStart  'Lo abrimos
  132. I2CSend adbw  'Mandamos direccion del sintonizador
  133. I2CSend divider.HB  'Mandamos el primer byte de frecuencia
  134. I2CSend divider.LB  'Mandamos el segundo byte
  135. I2CSend cb  'Mandamos byte de control
  136. I2CSend bb  'Mandamos Banda
  137. I2CStop  'Cerramos bus
  138. Return
Pdta: He quitado todos los waitms para la simulación
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Febrero de 2010, 21:03:58
Hola RURE, me es difícil seguir la secuencia de tu programa ya que no cumple con una estructura tradicional de programación. No veo clara la rutina principal donde se reparten las tareas.
Usas los saltos tipo "goto" que son muy difíciles de seguir. De todas formas es aconsejable partir de un programa simplificado dando órdenes sencillas al integrado hasta estar seguros de que responde bien.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: RURE en 08 de Febrero de 2010, 07:32:59
Hola dogflu66, como ya dije soy un pequeño aficionado a esto, la secuencia del programa es esta:

- Iniciamos chequeando el pulsador de cambio entre modo oscilador y modo memoria.
- Si estamos en modo oscilador, chequeamos los pulsadores de subir, bajar o memorizar, guardamos la frecuencia en los dos últimos bytes de la ram (sólo para cuando conectemos el receptor volver a la última frecuencia que estuvimos), la mandamos al sintonizador, la mostramos y volvemos al inicio.
- Si estamos en modo memoria chequeamos los pulsadores de subir y bajar, recuperamos la frecuencia de la ram (previamente guardada con la rutina guardar), la mandamos al sintonizador, la mostramos y volvemos al inicio.

eso es todo.
Código: [Seleccionar]
AllDigital  'Todos los puertos digitales
'---------- CONFIGURACION PINES LCD ----------
Define LCD_BITS = 4  'Bus de datos de 4 bits
Define LCD_DREG = PORTB  'Bus de datos puerto B
Define LCD_DBIT = 0  'Bus de datos, los 4 menos significativos
Define LCD_RSREG = PORTB  'Puerto del RS
Define LCD_RSBIT = 4  'Bit del RS
Define LCD_EREG = PORTB  'Puerto del E
Define LCD_EBIT = 5  'Bit del E
Define LCD_RWREG = PORTB  'Puerto del RW
Define LCD_RWBIT = 6  'Bit del RW
Define LCD_COMMANDUS = 100  'Tiempo de espera despues de un comand
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato
Define LCD_INITMS = 10  'Tiempo de espera despues de inicializar

'----------CONFIGURACION I2C----------
Symbol sda = PORTA.0  'bit conexien SDA
Symbol scl = PORTA.1  'bit conexien SCL

'---------- VARIABLES----------
Dim bb As Byte  'Byte para enviar al sintonizador (VHF en banda alta)
Dim adbw As Byte  'Byte de direccien del sintonizador
Dim cb As Byte  'Byte de control del sintonizador (pasos de 50 Khz)
Symbol mas = PORTA.2  'Bit para subir frecuencia y memorias
Symbol menos = PORTA.3  'Bit para bajar frecuencia y memorias
Symbol mem = PORTA.4  'Bit para memorizar
Symbol conmu = PORTA.5  'Bit para conmutar entre oscilador y memorias
Dim modo As Bit  'Variable para conmutar entre oscilador y memoria
Dim divider As Word  'Frecuencia a cargar en el oscilador local del sintonizador
Dim frec As Long  'Frecuencia que se muestra en el LCD
Dim aux_frec As Long  'Variables auxiliares
Dim frec1 As Word  'para calcular la frecuencia
Dim frec2 As Word  'Gracias a dogflu66, el Lcdout #, no admite un Long
Dim memo As Byte  'Variable para cargar el numero de memoria

'----------CONFIGURACION DE INICIO----------
bb = 2  'VHF en banda alta
adbw = 194  'Dirección del sintonizador
cb = 200  'Pasos de 50Khz
Read 126, divider.HB  'He cogido  los dos ultimos bytes de la memoria
Read 127, divider.LB  'del micro para guardar frecuencia
memo = 1  'Comienzo en 1
modo = 0  'Comienzo en oscilador
Lcdinit  'inicializa el lcd sin cursor

'----------INICIO DEL PROGRAMA----------
inicio:
If conmu = 1 Then Toggle modo  'Si se pulsa conmuto entre oscilador y memoria
If modo = 0 Then  'Si esta a cero
Goto oscilador  'Voy a oscilador
Else  'si no
Goto memoria  'voy a memoria
Endif

'---------- MODO OSCILADOR ----------
oscilador:
Lcdcmdout LcdLine2Pos(13)
Lcdout " VFO"  'Muestro en LCD que estoy en modo oscilador
If mem = 1 Then Gosub guardar  'Si se pulsa mem guardo en memoria la frecuencia
If mas = 1 Then divider = divider + 1  'Si se pulsa subo frecuencia
If divider > 8248 Then divider = 3580  'Si llego a tope vuelvo al principio
If menos = 1 Then divider = divider - 1  'Si se pulsa bajamos la frecuencia
If divider < 3580 Then divider = 8248  'Si llego al primcipio salto al final
Write 126, divider.HB  'Guardo la frecuencia en los dos
Write 127, divider.LB  'ultimos bytes de la ram
Gosub sintonizador  'Mando la frecuencia al sintonizador
Gosub display  'La muestro en el LCD
Goto inicio  'Comienzo de nuevo

'---------- MODO MEMORIA ----------
memoria:
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:  "  'Muestro en LCD que estoy en modo Memoria
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Y  y el numero de memoria que voy a leer
If mas = 1 Then memo = memo + 1  'Si se pulsa subo memoria
If memo > 62 Then memo = 1  'Si  llega a tope vuelvo al principio
If menos = 1 Then memo = memo - 1  'Si se pulsa bajo memoria
If memo < 1 Then memo = 62  'Si llega al principio vuelvo al final
memo = memo * 2  'Calculo la posicion
memo = memo - 1  'de la memoria ram
Read memo, divider.HB  'Leo el primer byte
memo = memo + 1  'calculo posicion del segundo byte
Read memo, divider.LB  'Lo leo
memo = memo / 2  'Dejo el numero de memoria como estaba
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Muestro numero de memoria
Gosub sintonizador  'Mando frecuencia obtenida al sintonizador
Gosub display  'La muestro en el LCD
Goto inicio  'Comienzo de nuevo
End                                               

'---------- RUTINA PARA ENVIAR FRECUENCIA A SINTONIZADOR----------
sintonizador:
I2CPrepare sda, scl  'Preparamos el bus I2C
I2CStart  'Lo abrimos
I2CSend adbw  'Mandamos direccion del sintonizador
I2CSend divider.HB  'Mandamos el primer byte de frecuencia
I2CSend divider.LB  'Mandamos el segundo byte
I2CSend cb  'Mandamos byte de control
I2CSend bb  'Mandamos Banda
I2CStop  'Cerramos bus
Return                                           
                                           
'---------- RUTINA PARA MOSTRAR FRECUENCIA ----------
display:
Lcdcmdout LcdLine1Home
Lcdout "FRECUENCIA"
frec = divider * 50  'Multiplicamos divider por 50 para obtener la frecuencia
frec = frec - 38900  'Restamos el oscilador local
aux_frec = frec / 1000  'Dividimos frecuencia entre 1000 para obtener
frec1 = aux_frec  'los tres primeros digitos
aux_frec = aux_frec * 1000  'Restamos a frecuencia el valor obtenido
frec2 = frec - aux_frec  'para obtener los siguientes tres digitos
Lcdcmdout LcdLine2Home  'Mostramos el valor obtenido
Select Case frec2  'Esta secuencia es para poner los ceros que faltan
Case < 49  'en los tres ultimos digitos
Lcdout #frec1, "000", "khz"  'Si no lo hago asi, el LCD no muestra nada
Case < 99  'mas que un cero no los tres que se necesitan
Lcdout #frec1, "0", #frec2, "khz"
Case > 99
Lcdout #frec1, #frec2, "Khz"
EndSelect
Return                                           

'---------- RUTINA PARA GUARDAR MEMORIA ----------
guardar:
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:  "  'Limpio el numero de la memoria
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Lo muestro
If mas = 1 Then memo = memo + 1  'Si pulsamos sube memoria
If memo > 62 Then memo = 1  'Si llego a tope paso a 1
If menos = 1 Then memo = memo - 1  'Si pulsamos bsja memoria
If memo < 1 Then memo = 62  'Si retrocedo paso a la ultima
If mem = 0 Then Goto guardar  'Titila si no pulsamos guardar
memo = memo * 2  'Calculo la posicion
memo = memo - 1  'en la memoria ram
Write memo, divider.HB  'Escribo el primer byte
memo = memo + 1  'Calculo posicion del segundo byte
Write memo, divider.LB  'lo escribo
memo = memo / 2  'Dejo el numero como estaba
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Muestro numero de memoria en el LCD
Return                                           
He tenido que retocar la rutina para mostrar en el LCD, he hecho dos grupos de 3 ( sólo necesito 6 digitos ) y al mostrar el segundo grupo se comía los ceros.
Título: PIC BASIC del PIC Simulator IDE
Publicado por: mat_pic en 17 de Febrero de 2010, 12:36:25
Buenos dias... aqui un novato en estos temas. Me puse a estudiar los pics, y me embale con el PIC Simulator IDE.
Pude programar un 16F84, y anduvo todo bien.
Ahora he querido experimentar con un 12F629 y tengo problemas cuando lo quiero grabar. Me dice que hay un problema con el oscilador interno... etc.
Me podran dar una mano. Como debo configurar el Simulator, o el problema lo tengo con el programador??.

Muchas gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: ronsolo777 en 17 de Febrero de 2010, 12:49:16
Hmmmmm.
 al parecer programaste el micro y no registraste cual era el valor de calibracion del clock interno, que viene en los ultimos segmentos de la memoria de este.
por lo general es un valor de la forma 34xx.

antes de programar un micro 12F675/629 hay que leerlo para tener el valor de calibracion del clock interno a 4Mhz y anotarlo en algun lado.

para usar el valor de calibracion debes usar este cdgo que esta en el datasheet.

bsf STATUS, RP0 ;Bank 1
call 3FFh ;Get the cal value
movwf OSCCAL ;Calibrate
bcf STATUS, RP0 ;Bank 0

pd:lee el datasheet

Slds Hugo.



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Febrero de 2010, 14:09:17
Por lo que describes es un aviso del software del programador. Como te indicó ronsolo777, es conveniente leer primero esos micros antes de programarlos para guardar el valor de calibración de casa, que esta en la ultima posición de la memoria de programa o también llamada flash. Te dejo un enlace donde puedes ver todo eso:

http://www.todopic.com.ar/foros/index.php?PHPSESSID=ccfe536794006c3ee590bdb13d6c188f&topic=24123.msg195746#msg195746

http://www.todopic.com.ar/foros/index.php?topic=24123.msg195749#msg195749
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 25 de Febrero de 2010, 11:34:54
Dejo un programita con una función que extrae un bit o varios bits de una variable
o constante. Está comentado, así que lo dejo como está, para el que quiera jugar un rato
con él en el simulador del PSI o en la PIC EBasic.

valor = %1100000000001101
Se motrarán los bits subrayados:
Primero extraemos el bit 1, que es el bit penúltimo y en la pantalla se mostrara el 0.
Seguidamente extraemos los bit 15 y 14, que son los dos primeros 11, y en la pantalla
se mostrará el numero 3 en decimal que es 11 en binario.
Código: [Seleccionar]
'****************************************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_10
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.0, By COS, 2/10.
'Rutina que extrae el bit o bit´s seleccionados y consecutivos de una variable
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'****************************************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Solo para simulación, acelera las pausas WaitMs
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------Definición de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Dim valor As Word
valor = %1100000000001101
Lcdinit  'inicializa el LCD sin cursor
WaitMs 500  'pausa para estabilizar
main:  'Inicio bucle principal
Call getbit(%00001101, 0, 1)  'Extrae el bit 1
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout #getbit, " "  'Imprime en decimal
Call getbit(valor, 15, 14)  'Extrae los bit´s 14 y 15
Lcdcmdout LcdLine2Home  'Principio de línea dos
Lcdout #getbit, " "  'Imprime bit en decimal
'Goto main
End                                               
'Extrae los bit indicados hasta 16bit
'numero = constante o variable a extraer los bits
'inibit = constante o variable que indica el límite del bit más significativo
'endbit = constante o variable que indica el bit menos significativo
'Para extraer un solo bit entonces inibit = endbit o inibit = 0.
Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word
If inibit < endbit Then inibit = endbit  'Se asegura que inibit >= endbit
inibit = 15 - inibit  'Numero de lugares a desplazar hacia la izquierda
endbit = inibit + endbit  'Numero de lugares a desplazar a la derecha
numero = ShiftLeft(numero, inibit)  'Elimina los bit de más peso
getbit = ShiftRight(numero, endbit)  'Elimina los bit de menos peso
End Function                                         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Marzo de 2010, 14:25:09
Para el que quiera seguir experimentando con Bits, le dejo un programita que imprime en el LCD el valor de una variable o constante en binario.
La función para extraer los dígitos binarios es la misma que la del ejemplo anterior.

Código: [Seleccionar]
'**********************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_11
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.1, By COS, 2/10, 3/10, PSI v6.83
'Imprime por el lcd en formato binario
'Rutina que extrae el bit o bits seleccionados y consecutivos de una variable
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'***********************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------------------------------------------------------------------------
'Define SIMULATION_WAITMS_VALUE = 1  'Acelera los Waitms, solo activar esta línea en simulación
'------------------------------------Definición de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Dim valor As Word
Dim n As Byte
valor = %1100000000001101
Lcdinit  'inicializa el LCD sin cursor
WaitMs 500  'pausa para estabilizar
main:  'Inicio bucle principal
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout #valor, " "  'Imprime en decimal
Lcdcmdout LcdLine2Home  'Principio de línea dos, print bit
For n = 15 To 0 Step -1  'Contador para seleccionar bit
Call getbit(valor, 0, n)  'Extrae los bit n
Lcdout #getbit  'Imprime bit
Next n
'Goto main
End                                               
'Extrae los bit indicados hasta 16bit
'numero = constante o variable a extraer los dígitos
'inibit = constante o variable que indica el límite del bit más significativo
'endbit = constante o variable que indica el bit menos significativo
'Para extraer un solo bit entonces inibit = endbit o inibit = 0.
Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word
If inibit < endbit Then inibit = endbit  'Se asegura que inibit >= endbit
inibit = 15 - inibit  'Numero de lugares a desplazar hacia la izquierda
endbit = inibit + endbit  'Numero de lugares a desplazar a la derecha
numero = ShiftLeft(numero, inibit)  'Elimina los bit de más peso
getbit = ShiftRight(numero, endbit)  'Elimina los bit de menos peso
End Function                                 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Marzo de 2010, 09:19:36
CODIGO BCD, decimal codificado en binario:

Ahora dejo una función que nos permite extraer los dígitos de forma individual de un número (tipo Word), ya sea para representarlos en display de 7segmentos o poder programar un dispositivo de temperatura o reloj calendario. Si alguien tiene algún algoritmo más simplificado y quiere postearlo lo cambio en la función.

Código: [Seleccionar]
'************************************************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_12
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.2, By COS, 2/10, 3/10, PSI v6.83
'Codigo BCD decimal codificado en binario
'Extrae un digito determinado de hasta una variable tipo Word
'Los digitos se nombran de derecha a izquierda de 0 a 4.
'************************************************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------------------------------------------------------------------------
'Define SIMULATION_WAITMS_VALUE = 1  'Acelera los Waitms, solo activar esta línea en simulación
'------------------------------------Definición de puertos-------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Dim valor As Word
Dim n As Byte
valor = 65300
Lcdinit  'inicializa el LCD sin cursor
WaitMs 500  'pausa para estabilizar
main:  'Inicio bucle principal
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout #valor, " "  'Imprime en decimal
Lcdcmdout LcdLine2Home  'Principio de línea dos, print digito
For n = 4 To 0 Step -1  'Contador para seleccionar digito
Call getbcd(valor, n)  'Extrae digito n
Lcdout #getbcd, "_"  'Imprime digito
Next n
valor = valor + 1  'Inclementa el numero a descomponer
If valor = 0 Then Lcdcmdout LcdClear  'Borra display
WaitMs 100
Goto main
End                                               
'Codigo BCD, decimal codificado en binario
'Extrae el digito indicado, hasta 5 digitos (Word)
'numero = Cifra a descomponer
'digito = Digito a extraer de 0 a 4
Function getbcd(numero As Word, digito As Byte) As Byte
'Descompone el numero a mostrar en digitos
If digito = 4 Then getbcd = numero / 10000  'Calculo decenas de millar
If digito = 3 Then getbcd = (numero Mod 10000) / 1000  'Calculo unidades de millar
If digito = 2 Then getbcd = (numero Mod 1000) / 100  'Calculo centenas
If digito = 1 Then getbcd = (numero Mod 100) / 10  'Calculo decenas
If digito = 0 Then getbcd = numero Mod 10  'Calculo unidades
End Function
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: chenteb en 08 de Marzo de 2010, 16:24:38
Saludos y felicidades por este hilo en atencion especial a dogflu66 por su apoyo y conocimientos, quiero unirme al aprendizaje de este lenguaje y a usar este simulador pero no he podido bajar la placa entrenadora podrian postear de nuevo el archivo para bajar, las ligas estan vencidas, podrian enviarmelo a mi correo chenteb@gmail.com o publicar el vinculo, gracias y por aqui andaremos

Edito para publicar el archivo que me han compartido, lo hago con la intencion de ayudar a los nuevos estudiantes de este interesante hilo, gracias a todos por sus aportes por aqui nos leeremos, aca les dejo la liga PIC Ebasic V 1.4 (http://rapidshare.com/files/361156813/Pic_EBasic_1.4.rar) gracias dogflu66. :-/ :D :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Marzo de 2010, 21:30:50
Y ahora dejo el programa que hace la función contraria al anterior.

Convierte dígitos individuales a una única cifra en base decimal, hasta 5 digitos:

Código: [Seleccionar]
'****************************************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_13
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.3, By COS, 2/10, 3/10, PSI v6.83
'Codigo BCD a cifra decimal
'****************************************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Para simulación, acelera los WaitMs
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'Bus de datos será el puerto A
Define LCD_DBIT = 0  'Bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS será del puerto B
Define LCD_RSBIT = 7  'Usara el RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E será del puerto B
Define LCD_EBIT = 6  'Usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------Definición de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 500  'Pausa para estabilizar
main:  'Inicio bucle principal
Call getdecimal(4, 3, 2, 1, 0)  'Pasa los numeros a una cifra decimal
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout "4-3-2-1-0= ", #getdecimal  'Imprime en decimal
'Goto main
End                                               
'Include "_FunctionGetDecimal.bas"
'Versión: 1.0, By COS, 3/10, PSI v6.83
'Codigo BCD a cifra decimal
'getdecimal = Cifra decimal
'dig_4 al 0 = Digitos BCD
Function getdecimal(dig_4 As Byte, dig_3 As Byte, dig_2 As Byte, dig_1 As Byte, dig_0 As Byte) As Long
'Compone los digitos en una decimal
getdecimal = dig_4 * 10000  'Calculo decenas de millar
getdecimal = getdecimal + (dig_3 * 1000)  'Calculo unidades de millar
getdecimal = getdecimal + (dig_2 * 100)  'Calculo centenas
getdecimal = getdecimal + (dig_1 * 10)  'Calculo decenas
getdecimal = getdecimal + dig_0  'Calculo unidades
End Function
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Marzo de 2010, 19:40:53
Siguiendo con la línea de funciones básicas, dejo otra para hacer lecturas de ADC de una forma más cómoda en nuestros programas. Se trata de una estructura tipo Function, que tiene que ser inicializada al principio del programa. Mediante una llamada a la misma para que quede configurado el modulo ADC:

'Include "_FunctionGetADC.bas"
'Pic16F88 o compatibles
'Lee entradas analogicas, 8bit y 10bit
'r_pin = Selecciona el canal
's_pin = Selecciona el canal por defecto
'Si r_pin <> s_pin = Fuerza cambio de canales
'init.0 = 1, establece con figuracion basica a 10 bit
'init.0 = 1 & init.1 = 1, establece configurcion basica a 8 bit
'init.2 = 1, selecciona nuevo canal de entrada
'init.3 = 1, habilita nueva lectura al salir
'Si el ADC esta configurado a 8Bit el valor esta en getadc.HB
'Optimizada para 8Mhz.
'En el programa mediante el reg. ANSEL seleccionaremos que pin seran digitales (I/O) y o analogicos
'La función tiene que ser inicializada llamandola una vez antes de usarla

Hay que prestar especial atención al bit de configuración de rutina (ini.3=1), este hace que se genere una nueva lectura casa vez que salimos de la función acelerando notablemente la rutina, esta opción solo es útil si tenemos que leer un pin determinado repetidas veces, si cambiamos de canal o pin de entrada de forma continua se pierde la ventaja, ya que al hacer esto tenemos que cambiar la configuración del modulo tambien de forma continua y, esto hace que el modulo no responda hasta estabilizarse con la nueva configuración entre 5 a 10uSeg. Este efecto se puede observar perfectamente en la simulación.

Código: FreeBasic
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic_FunctionGetADC_14
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Versión: 1.4, By COS, 2/10, 3/10, PSI v6.83
  7. 'Rutina lectura del modulo ADC
  8. '************************************************************************************************
  9. '-------------------------------------Puertos del LCD---------------------------------------------
  10. Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
  11. Define LCD_DREG = PORTA  'el bus de datos será el puerto A
  12. Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
  13. Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
  14. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  15. Define LCD_EREG = PORTB  'el bit de control E será del puerto B
  16. Define LCD_EBIT = 6  'se usara el RB6 como E
  17. Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
  18. Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
  19. Define LCD_INITMS = 5  '(50) 'Tiempo de espera después de inicializar el Display, trucado para simulación
  20. '------------------------------------------------------------------------------------------------------
  21. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
  22. '------------------------------------Definición de puertos------------------------------------------
  23. ANSEL = %00010000  'Selecciona modo de trabajo de los pin, bit=0 digitales y bit=1 analógicos
  24. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  25. CMCON = 0x07  'comparador a off
  26. TRISA = 0xff  'Puerto A como entradas
  27. TRISB = 0xff  'puerto B como entradas
  28. TRISB.3 = 0  'RB3 como salida
  29. TRISA.7 = 0  'RA7 como salida
  30. TRISB.0 = 0  'RB0 como salida
  31. 'TRISA.4 = 1  'como entrada (RA4, adc)
  32. 'TRISA.6 = 1  'como entrada (RA6, tecla S1)
  33. 'TRISA.5 = 1  'como entrada (RA5, tecla S2)
  34. PORTB.3 = 1  'luz lcd a on (RB3)
  35. PORTA.7 = 1  'led amarillo a off
  36. PORTB.0 = 1  'led verde a off
  37. '------------------------------------Inicio------------------------------------------------------------
  38. Lcdinit  'inicializa el LCD sin cursor
  39. WaitMs 500  'pausa para estabilizar
  40. '/* Iniciliza la funcion getadc a 10Bit con el canal 4, que es el
  41. 'del potenciometro de la EBasic y activa un lectura al salir de la funcion*/
  42. Call getadc(4, 4, %1101)
  43. main:  'Inicio bucle principal
  44.         'Hace una lectura del canal por defecto y activa una lectura al salir
  45.         Call getadc(0, 0, %1000)
  46.         Lcdcmdout LcdLine1Home  'Principio de línea 1
  47.         Lcdout "ADC=", #getadc, "       "  'Imprime en decimal
  48. Goto main
  49. End                                              
  50. 'Include "_FunctionGetADC.bas"
  51. 'Pic16F88 o compatibles
  52. 'Lee entradas analogicas, 8bit y 10bit
  53. 'r_pin = Selecciona el canal
  54. 's_pin = Selecciona el canal por defecto
  55. 'Si r_pin <> s_pin = Fuerza cambio de canales
  56. 'init.0 = 1, establece con figuracion basica a 10 bit
  57. 'init.0 = 1 & init.1 = 1, establece configurcion basica a 8 bit
  58. 'init.2 = 1, selecciona nuevo canal de entrada
  59. 'init.3 = 1, habilita nueva lectura al salir
  60. 'Si el ADC esta configurado a 8Bit el valor esta en v_bat.HB
  61. 'Optimizada para 8Mhz.
  62. 'En el programa mediante el reg. ANSEL seleccionaremos que pins seran digitales (I/O) y o analogicos
  63. 'La función tiene que ser inicializada llamandola una vez antes de usarla
  64. Function getadc(r_pin As Byte, s_pin As Byte, ini As Byte) As Word
  65.         If ini.0 = 1 Then
  66.                 ADCON0 = %01000001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (min 1.6uSeg), CH AN0, switching
  67.                 ADCON1 = %11000000  'volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  68.                 If ini.1 = 1 Then ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  69.         Endif
  70.         If r_pin <> s_pin Or ini.2 = 1 Then  'Se establece el nuevo canal de lectura
  71.                 ADCON0 = ADCON0 And %11000111  'Selecciona channel AN0
  72.                 If r_pin = 1 Then ADCON0.3 = 1  'Selecciona channel AN1
  73.                 If r_pin = 2 Then ADCON0.4 = 1  'Selecciona channel AN2
  74.                 If r_pin = 3 Then  'Selecciona channel AN3
  75.                         ADCON0.3 = 1
  76.                         ADCON0.4 = 1
  77.                 Endif
  78.                 If r_pin = 4 Then ADCON0.5 = 1  'Selecciona channel AN4
  79.         Endif
  80.  
  81.         If ini.0 = 1 Or ini.2 = 1 Then WaitUs 10  'Tiempo estabilización despues de configuración
  82.  
  83.         If ini.3 = 0 Or ini.0 = 1 Or ini.2 = 1 Then ADCON0.GO = 1  'Activa una lectura en el ADC
  84.         While ADCON0.GO = 1  'Espera que termine la lectura del módulo ADC
  85.         Wend
  86.  
  87.         getadc.HB = ADRESH  'Carga el valor mas significativo del registro del ADC
  88.         getadc.LB = ADRESL  'Carga el valor menos significativo del registro del ADC
  89.  
  90.         If ini.3 = 1 Then ADCON0.GO = 1  'Genera una lectura al salir
  91.  
  92.         '/* Selecciona el canal por defecto, de esta forma en la proxima lectura
  93.         'nos ahorramos los 10useg. de estabilizacion del modulo * /
  94.         If r_pin <> s_pin Then ADCON0 = ADCON0 And %11000111  'Selecciona channel AN0
  95.         If s_pin = 1 And r_pin <> s_pin Then ADCON0.3 = 1  'Selecciona channel AN1
  96.         If s_pin = 2 And r_pin <> s_pin Then ADCON0.4 = 1  'Selecciona channel AN2
  97.         If s_pin = 3 And r_pin <> s_pin Then  'Selecciona channel AN3
  98.                 ADCON0.3 = 1
  99.                 ADCON0.4 = 1
  100.         Endif
  101.         If s_pin = 4 And r_pin <> s_pin Then ADCON0.5 = 1  'Selecciona channel AN4
  102. End Function
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 16 de Marzo de 2010, 07:01:49
Gracias dogflu por la cantidad de aportesque estas realizando.

Estoy siguiendo muy atento todo lo que publicas para mejorar mi basic.
Permiteme una pregunta
¿Los ultimos codigos están actualizados en el indice del primer post?

fermin

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Marzo de 2010, 09:11:57
Hola Fermín, el trabajo no me lo ha permitido y el poco tiempo libre del que dispongo lo empleo en publicar estas funciones básicas. Desde luego que más adelante actualizare el índice del hilo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 16 de Marzo de 2010, 13:42:04
Bueno como estas? mejor del catarro? ya lo vi en en post anterior que andabas pachucho. Bueno que te mejores.
respecto a la consulta anterior, por mi no te preocupes.

Soy asiduo a este hilo y me estudio todo lo que publicas.

Fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 24 de Marzo de 2010, 20:28:06
Hola de nuevo. Me estoy lanzando a probar el PIC18 Simulator IDE para programar un PIC18f2550. Mi idea es utilizar el micro con un oscilador externo de 20 Mhz, y prepararlo para un posterior utilizacion del USB,pero al ver la configuracion del micro no se como cogerlo ni por donde empezar. ¿Me podeis sugerir alguna idea?

Los datos que he sacado del ejemplo de oshonsoft son

Define CONFIG1L = 0x24
Define CONFIG1H = 0x0c
Define CONFIG2L = 0x3e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

Pero salvo el tema del oscilador, el resto voy bastante perdido


Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Marzo de 2010, 19:55:46
Tengo varios Pic18F... incluso uno adaptado para trabajar con la EBasic, pero todavia no he tenido tiempo de practivar con ellos. Ahora estoy terminado un proyecto para el curro y hasta que no lo termine voy sin tiempo. :(
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 29 de Marzo de 2010, 08:59:14
No te preocupes, hasta incluso con tu comentario, me has dado una opcion, hacer tambien un adaptador e ir probando con la e-basic.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 04 de Abril de 2010, 17:17:08
Una pregunta, estoy ya probando el Pic18f2550 con el cristal a 20 MHz y me encuentro con un problema, los WaitMs, no merspetan los tiempos de paro. Yo pongo p.ej. WaitMs 1000, que seria un segundo, y el tiempo que tarda en ejecutarlo es muchisimo menor.

¿Alguien me puede explicar porque?

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Abril de 2010, 20:12:57
No me gusta postear sobre lo que no he experimentado, pero se me ocurren dos posibilidades:

La más simple seria que no está bien especificada la velocidad del cristal en el PSI.

Y la más compleja, es que tengas activado el multiplicador (PLL) del PIC y, te este multiplicando la frecuencia del cristal internamente.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 05 de Abril de 2010, 07:36:24
La instruccion Define CLOCK_FREQUENCY = 20 la tengo incluida en el programa, sobre el resto investigo.

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Abril de 2010, 13:28:59
Puedes hacer una prueba sencilla, si sabes más o menos la velocidad de más en la que te trabaja, prueba subiendo la velocidad del Clock_Frequency y si te cuadra es seguro que tienes activado el multiplicador.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 05 de Abril de 2010, 14:59:55
en la configuracion de los fuses el PLL lo tengo dividiendo por 5 que es lo que indica el programa para un cristal de 20 Mhz

Ademas en el fuse Define CONFIG1H = 0x0c, esta definido como cristal HS sin PLL
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Abril de 2010, 05:16:02
Creo recordar que tengo un ejemplo para la EBasic trabajando con oscilador interno a 8Mhz para la familia 18F, intentare localizarlo y pegarlo por aquí. Puede que te sirva de base para seguir experimentando.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Abril de 2010, 17:56:41
Este sencillo ejemplo corre en la EBasic con oscilador interno a 8Mhz:

Código: FreeBasic
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. 'NOMBRE:18F1320_PicEBasic_LCD
  17. 'MICRO: PIC18F1320/8Mhz reloj interno
  18. 'Escribe hola en el display con parpadeo.
  19. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  20. '************************************************************************************************
  21. '-------------------------------------Puertos del LCD---------------------------------------------
  22. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  23. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  24. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  25. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  26. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  27. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  28. Define LCD_EBIT = 6  'se usara el RB6 como E
  29. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  30. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  31. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  32. '------------------------------------------------------------------------------------------------------
  33. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  34. '------------------------------------Definicion de puertos------------------------------------------
  35. ADCON1 = 0xff  'Los pin I/O digitales
  36. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Puerto A como salidas
  38. TRISB = 0x00  'Puerto B como salidas
  39. '------------------------------------Inicio------------------------------------------------------------
  40. Lcdinit  'Inicializa el lcd sin cursor
  41. WaitMs 500  'Pausa para estabilizar
  42. main:  'Comienza el programa principal
  43.         Lcdcmdout LcdClear  'Borra el display
  44.         WaitMs 1000  'Hace una pausa de 1Seg.
  45.         Lcdout "HOLA"  'Escribe "HOLA" en el display
  46.         WaitMs 1000  'Hace una pausa de 1Seg.
  47. Goto main  'Impide que termine el programa principal
  48. End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 06 de Abril de 2010, 19:32:52
Arrrrrrggg!!, ya he descubierto el problema, faltaba la comilla  en el    " Define SIMULATION_WAITMS_VALUE = 1  " a la hora de compilar.
Ahora curiosamente me respeta los tiempos.


Bueno, solucionado el tema, paso a la siguiente pregunta

Tengo un "potenciometro" realizado a partir de un sensor magnetico y un iman instalado en un gatillo, al apretar el gatillo, este se acerca al sensor y varia la tension.
Mediante una lectura del ADC, con ADCIN, y un preescalado que he determinado anteriormente, (vgat(n)) determino la "posicion" del gatillo.
Una vez hecha la lectura del gatillo y determinada la posicion muestro los valores de "gat" lectura del ADC, y el valor "dlcd" en el LCD, pues bien me encuentro con que si aprieto mut rapidamente a fondo el gatillo la lectura del valor del ADC (gat) y el valor "dlcd" son incongruentes. El gatillo a tope da como valor en el ADC un valor entre 2 y 4 (el sensor da menos tension a medida que se acerca el gatillo), y en cambio el valor de "dlcd" puede ser 20, o 10 o 40 ( segun los intentos) que corresponderian a valores del ADC de 400, 500 o 300.

Entonces mi pregunta es ante una variacion muy rapida del gatillo ,¿ es posible que el adc de un valor antes de finalizar la lectura y el programa vaya avanzando? y por eso me da datos incongruentes

Os muestro el codigo en cuestion.  Hoy voy a realizar la prueva de hacer la lectura del ADC manualmente  con el bucle while adc0.go=1   wend

Código: [Seleccionar]
dlcd = 0

Adcin 2, gat

Select Case gat

Case > vgat(63)
dlcd = 0

Case > vgat(62)  
dlcd = 1

Case > vgat(61)  
dlcd = 2

Case > vgat(60)
dlcd = 3

Case > vgat(59)  
dlcd = 4

                                ...

        Case > vgat(0)  
dlcd = 63

EndSelect


Lcdinit  'Inicializa el lcd sin cursor
WaitMs 500  'Pausa para estabilizar
Lcdcmdout LcdClear  'borra el display
WaitMs 1000  'hace una pausa de 1Seg.
Lcdout "Adc ", #gat, " ", #dlcd  'escribe el caracter "A" en el display
Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
WaitMs 1000
Lcdout "P1 ", #vgat(63), "  " #vgat(62)  'muestra los dato
WaitMs 1000  'hace una pausa de 1Seg.




Saludos








Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2010, 05:51:54
Precisamente la comilla hay que ponerla o suprimir esa línea si trabajamos sobre la realidad. Y por supuesto, compilar de nuevo para que nos implemente las nuevas modificaciones. :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 07 de Abril de 2010, 06:22:35
No he llegado a tiempo, me has contestado mientras añadia otro tema en el mensaje anterior, pero me contesto a mi mismo con el bucle while adc0.go=1   wend funciona correctamente, con lo cual entiendo que debe dar valores el adc antes de finalizar la lectura.

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Abril de 2010, 08:40:15
La función ADCIN es una función muy lenta, puedes mejorar el rendimiento del modulo ADC programando los registros a mano.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 09 de Abril de 2010, 06:14:14
No se que estoy haciendo mal, pero no me funciona el adc manualmente

si yo pongo (gat es una variable del tipo word)
 
  adcin 2,gat
    While ADCON0.GO = 1
   Wend

me da un resultado correcto

en cambio
        ADCON0.CHS3 = 0
   ADCON0.CHS2 = 0
   ADCON0.CHS1 = 1  'Seleccion canal 2
   ADCON0.CHS0 = 0
   ADCON2.ADFM = 1  'Seleccion 10 bits
   While ADCON0.GO = 1
   Wend
   gat.HB = ADRESH
   gat.LB = ADRESL

no me da ningun resultado.

Alguna idea de donde cometo el error

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Abril de 2010, 18:02:13
A ver si puedes trabajar a partir de aqui:

Código: Visual Basic
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. 'NOMBRE:18F1320_PicEBasic_LCD_ADC
  17. 'MICRO: PIC18F1320/8Mhz reloj interno
  18. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  19. 'Configuracion del modulo ADC
  20. '************************************************************************************************
  21. '-------------------------------------Puertos del LCD---------------------------------------------
  22. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  23. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  24. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  25. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  26. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  27. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  28. Define LCD_EBIT = 6  'se usara el RB6 como E
  29. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  30. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  31. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  32. '------------------------------------------------------------------------------------------------------
  33. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  34. '------------------------------------Definicion de puertos------------------------------------------
  35. ADCON1 = %1101111  'Configuracion pin, 1= digitales, 0 = analogicos (AN4)
  36. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Configuracion puerto A
  38. TRISB = %00000001  'Puerto B como salidas, AN4 input
  39. ADCON0 = %00010001  'Vref = AVdd y AVss, CH4, ADC ON
  40. ADCON2 = %10101101  '10Bit, 11Tad, Fosc/16 (8Mhz=1Tad=2uSeg.)
  41. 'ADCON2 = %10101110  '10Bit, 11Tad, Fosc/64 (20Mhz=1Tad=3.2uSeg.)
  42. 'Variables globales
  43. Dim _getadc As Word
  44. '------------------------------------Inicio------------------------------------------------------------
  45. Lcdinit  'Inicializa el lcd sin cursor
  46. WaitMs 500  'Pausa para estabilizar
  47. main:  'Comienza el programa principal
  48.         ADCON0.GO = 1
  49.         While ADCON0.GO = 1  'Espera que termine la lectura del módulo ADC
  50.         Wend
  51.         _getadc.HB = ADRESH
  52.         _getadc.LB = ADRESL
  53.         Lcdcmdout LcdLine1Home
  54.         Lcdout "ADC AN4: ", #_getadc, "   "
  55. Goto main  'Impide que termine el programa principal
  56. End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Abril de 2010, 18:49:57
Y aquí con tu programa:

Código: Visual Basic
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. 'NOMBRE:18F1320_PicEBasic_LCD
  17. 'MICRO: PIC18F1320/8Mhz reloj interno
  18. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  19. 'Configuracion del modulo ADC
  20. '************************************************************************************************
  21. '-------------------------------------Puertos del LCD---------------------------------------------
  22. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  23. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  24. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  25. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  26. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  27. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  28. Define LCD_EBIT = 6  'se usara el RB6 como E
  29. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  30. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  31. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  32. '------------------------------------------------------------------------------------------------------
  33. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  34. '------------------------------------Definicion de puertos------------------------------------------
  35. ADCON1 = %1101111  'Configuracion pin, 1= digitales, 0 = analogicos (AN4)
  36. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  37. TRISA = 0x00  'Configuracion puerto A
  38. TRISB = %00000001  'Puerto B como salidas, AN4 input
  39. ADCON0 = %00010001  'Vref = AVdd y AVss, CH4, ADC ON
  40. ADCON2 = %10101001  '10Bit, 11Tad, Fosc/8 (8Mhz=1Tad=1.6uSeg.)
  41. 'ADCON2 = %10101010  '10Bit, 11Tad, Fosc/32 (20Mhz=1Tad=1.6uSeg.)
  42. 'Variables
  43. Dim _getadc As Word
  44. Dim gat As Word
  45. '------------------------------------Inicio------------------------------------------------------------
  46. Lcdinit  'Inicializa el lcd sin cursor
  47. WaitMs 500  'Pausa para estabilizar
  48. main:  'Comienza el programa principal
  49.  
  50.         'ADCON0.chs3 = 0 'Este micro no tiene CHS3
  51.         ADCON0.CHS2 = 1
  52.         ADCON0.CHS1 = 0  'Seleccion canal 4
  53.         ADCON0.CHS0 = 0
  54.         ADCON2.ADFM = 1  'Seleccion 10 bits
  55.         'WaitUs 10  'Aquí normalmente, en la serie 16F, hace falta hacer una pausa de unos pocos uSegundos
  56.         'para dar tiempo a que se configure el ADC con los nuevos datos, sin embargo en este micro
  57.         'trabajando a 8Mhz no he observado que fuera necesario
  58.  
  59.         ADCON0.GO = 1
  60.         While ADCON0.GO = 1  'Espera que termine la lectura del módulo ADC
  61.         Wend
  62.         gat.HB = ADRESH
  63.         gat.LB = ADRESL
  64.  
  65.         Lcdcmdout LcdLine1Home
  66.         Lcdout "ADC AN4: ", #gat, "   "
  67.  
  68. Goto main  'Impide que termine el programa principal
  69. End

PD: No me he podido leer con detalle la parte del datasheets que explica el funcionamiento del ADC de este micro. Lo unico que puedeo decir es que sobre la EBasic funcionan los dos ejemplos.
PD: Hay que recordar configurar los pin como entrada (reg. TRISx) y analogico mediante el registro ADCON1.

Nota: Después de un repaso al datasheet del micro de los dos ejemplos, indica que 1Tad=2uSeg. para 10Bit, y el cuadro resuelto para varios cristales que nos da el data el cálculo es para 1.6uSeg.=1Tad para 10Bit. Si tomamos este último dato como correcto la línea de configuración que da de la siguiente manera:
ADCON2 = %10101001  '10Bit, 11Tad, Fosc/8 (8Mhz=1Tad=1.6uSeg.)
ADCON2 = %10101010  '10Bit, 11Tad, Fosc/32 (20Mhz=1Tad=1.6uSeg.)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 12 de Abril de 2010, 19:39:43
Bueno, ya consegui el manual en español.

El ADCON1 se configura, no directamente, sino con una tabla donde ves, segun los ADC a utilizar, el codigo correspondiente.

Pruebo el codigo y lo comento.

Tambien tengo otro problema que no se si sera electronica o forma de trabajar con el soft.
Tengo el ADC principal que va haciendo lecturas continuas, y si activo otro adc a continuacion, o un pulsador, la lectura del adc principal me varia.
¿Por que motivo puede ser ?
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Abril de 2010, 19:55:08
Cuando dices que cambias de ADC: ¿Te refieres que ese micro tiene dos módulos ADC?, o que, ¿cambias de canal de entrada del modulo ADC?. Seguramente lo más fácil de comprobar es el hard, mide los voltajes y comprueba que no varíen. También puede ser una fuente con filtrado pobre.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 13 de Abril de 2010, 18:38:54
El tema de los voltajes fue lo primero que comprobe.
El ADC son cambios de canal, pero tambien me sucede al pulsar un pulsador que tengo en una entrada digital.
Tambien desconecte el LCD por si consumia mucho.
Filtrado, hay me pierdo , tengo puesto lo siguiente y con el siguiente orden.

Condensador 100 nf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
7805
Conden. Elec. 47 uf
Condensador 100 nf

Por otro lado el tema del adc manual ya me funciona. No activaba el ADCON0.ADON
Lo que no acabo de comprender es como configurar ADCS0-2 y ACQT0-2 del registro ADCON2.
Nota: me refiero a los criterios a utilizar en la seleccion de una configuracion u otra

Código: [Seleccionar]
REGISTRO 21-3: ADCON2: REGISTRO DE CONTROL A/D 2
BIT 7     BIT 6   BIT 5    BIT 4     BIT 3    BIT 2    BIT 1    BIT 0
ADFM        -     ACQT2    ACQT1    ACQT0    ADCS2    ADCS1    ADCS0
R/W-0     U-0     R/W-0    R/W-0     R/W-0      R/W-0    R/W-0      R/W-0
BIT 7 ADFM: Bit selecto del formato A/D del resultado
1 = derecho justificado
0 = izquierdo justificado
BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD
(1)
BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión
111= FRC (reloj A/D derivado del oscilador RC)(1)
110= FOSC/64
101= FOSC/16
100= FOSC/4
011= FRC (reloj A/D derivado del oscilador RC)(1)
010= FOSC/32
001= FOSC/8
000= FOSC/2
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 14 de Abril de 2010, 07:15:46
Mas dudas, tengo un encoder instalado en RB0 (canal A) RB1 ( Canal B), y un pulsador en RB3, pues bien intento ejecutar el siguiente control de interrupciones y me en cuentro que en el simulador funciona totalmente, pero no en la placa.

Si pulso el boton, me funciona, pero si muevo el Encoder no, y he comprobado las tensiones de entrada al pic cuando muevo el encoder y llegan correctamente tanto del canal A como del B

La funcion de este Encoder seria moverse a traves de un menu para poder seleccionar y modificar parametros

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


'Configuracion LCD

'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTB  'el bus de datos sera el puerto B
Define LCD_DBIT = 4  'el bus de datos seran los 4 bit mas significativos del puerto B
Define LCD_RSREG = PORTC  'el bit de control RS sera del puerto C
Define LCD_RSBIT = 6  'se usara el RC6 como RS
Define LCD_EREG = PORTC  'el bit de control E sera del puerto C
Define LCD_EBIT = 7  'se usara el RC7 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'------------------------------------------------------------------------------------------------------

Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
'------------------------------------Definicion de puertos------------------------------------------

AllDigital
ADCON1 = %00001010  'Seleccion de AN0 - AN4
CMCON = 0x07  'comparador a off
TRISA = %00101111  'Puerto A como E/S
TRISB = %00000111  'Puerto B como E/S
TRISC = %00000000  'Puerto C como salidas

Define ADC_CLOCK = 3
Define ADC_SAMPLEUS = 30

'--------------------------------------------------------------------------------------------------



'Variables menus
Dim linea1 As Byte
Dim linea2 As Byte
Dim menu1 As Byte  'Gestion de menus 1
Dim menu2 As Byte  'Gestion de menus 2
Dim boton As Bit
Dim encoder As Byte

'Variables para calculos
Dim va As Word
Dim vi As Byte
Dim valor As Word
Dim j As Byte
Dim e As Byte
Dim g As Byte
Dim h As Byte
Dim b As Byte
Dim ai As Byte
Dim af As Byte
Dim mem As Byte
Dim i As Byte

'------------------Interrupciones-----
RCON.IPEN = 1  'interrupciones con prioridad
INTCON.GIE = 1
INTCON.INT0IE = 1  'activo interrupcion INT0
INTCON3.INT1IE = 1  'activo interrupcion INT1
INTCON3.INT1IP = 1  'activo prioridad INT1
INTCON3.INT2IE = 1  'activo interrupcion int2
INTCON3.INT2IP = 1  'activo prioridad INT2


'------------------------------------------------------------------------------------------------------

PORTA = 0x00
PORTC.1 = 0
PORTC.2 = 0
PORTB.0 = 0
PORTB.1 = 0
PORTB.2 = 0


'------------------------------------Inicio------------------------------------------------------------
Break
Lcdinit  'inicializa el lcd sin cursor
WaitMs 500  'pausa para estabilizar

linea1 = 2
linea2 = 2
Gosub lcd
WaitMs 2000
linea1 = 1
linea2 = 1
Gosub lcd



'----------------------------------------- INICIO DEL MAIN
main:



If encoder = 1 Then linea1 = 4
If encoder = 2 Then linea1 = 5
If boton = 1 Then linea1 = 3

Gosub lcd
encoder = 0
boton = 0

Goto main


End                                               

'**************************************Subrrutinas**********************************************
'_
'Control de interrupciones

On High Interrupt
Save System
PWMduty 1, 0
PWMduty 2, 0
INTCON.GIE = 0  'Desactivo interrupciones

If INTCON.INT0IF = 1 Then encoder = 1
If INTCON3.INT1IF = 1 Then encoder = 2
If INTCON3.INT2IF = 1 Then linea1 = 3

INTCON.INT0IF = 0  'Desactivo flag interrupcion INT0
INTCON3.INT1IF = 0  'Desactivo flag interrupcion INT1
INTCON3.INT2IF = 0  'Desactivo flag interrupcion int2
INTCON3.INT1IP = 1  'activo prioridad INT1
INTCON3.INT2IP = 1  'activo prioridad INT2
RCON.IPEN = 1  'interrupciones con prioridad
INTCON.GIE = 1  'activo interrupcions

Resume                                           

'**************************************Subrrutinas**********************************************
menus:  'Rutina de seleciones y modificacion de parametros


Return                                           



lcd:
Lcdcmdout LcdClear  'borra el display
WaitMs 10  'hace una pausa
Select Case linea1
Case 1
Lcdout "Menu 1"
Case 2
Lcdout "Memu 2"
Case 3
Lcdout "Boton pulsado"
Case 4
Lcdout "Encoder A"
Case 5
Lcdout "Encoder B"

Case > 5
Lcdout "No disponible"

EndSelect

Lcdcmdout LcdLine2Clear  'borra la segunda linea y cursor al principio
WaitMs 10
Select Case linea2
Case 1
Lcdout "Linea 2.1"
Case 2
Lcdout "Linea 2.2"
Case > 3
Lcdout "Linea 3.3"

EndSelect

WaitMs 200

Return                                           
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 18 de Abril de 2010, 17:47:08
Me contesto al ultimo post, he puesto dos pulsadores, en vez del encoder, y entonces ya me funcionan las interrupciones.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Mayo de 2010, 19:58:33
El tema de los voltajes fue lo primero que comprobe.
El ADC son cambios de canal, pero tambien me sucede al pulsar un pulsador que tengo en una entrada digital.
Tambien desconecte el LCD por si consumia mucho.
Filtrado, hay me pierdo , tengo puesto lo siguiente y con el siguiente orden.

Condensador 100 nf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
Conden. Elec. 47 uf
7805
Conden. Elec. 47 uf
Condensador 100 nf

Por otro lado el tema del adc manual ya me funciona. No activaba el ADCON0.ADON
Lo que no acabo de comprender es como configurar ADCS0-2 y ACQT0-2 del registro ADCON2.
Nota: me refiero a los criterios a utilizar en la seleccion de una configuracion u otra

Código: [Seleccionar]
REGISTRO 21-3: ADCON2: REGISTRO DE CONTROL A/D 2
BIT 7     BIT 6   BIT 5    BIT 4     BIT 3    BIT 2    BIT 1    BIT 0
ADFM        -     ACQT2    ACQT1    ACQT0    ADCS2    ADCS1    ADCS0
R/W-0     U-0     R/W-0    R/W-0     R/W-0      R/W-0    R/W-0      R/W-0
BIT 7 ADFM: Bit selecto del formato A/D del resultado
1 = derecho justificado
0 = izquierdo justificado
BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD
(1)
BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión
111= FRC (reloj A/D derivado del oscilador RC)(1)
110= FOSC/64
101= FOSC/16
100= FOSC/4
011= FRC (reloj A/D derivado del oscilador RC)(1)
010= FOSC/32
001= FOSC/8
000= FOSC/2

Trabajando el ADC a 10Bit:

BIT 5-3 ACQT2:ACQT0: Bits selectores del tiempo de adquisición:

Con estos bit se selecciona el tiempo de adquisición del modulo ADC, y este dato nos lo da el datasheet del Pic, en mi caso del Pic 18F1320, para el modulo ADC que tiene este micro son 11Tad para 10bit. Sabido esto nos queda configurar estos bits según la tabla, esta tabla no tiene la opción de 11Tad, por lo que según el data del uC elegiremos el inmediato superior (101 = 12 Tad). Se supone que un Tad es igual a un ciclo de reloj cuyo ancho depende de la rapidez del modulo ADC, esto último el datasheet del uC no lo indica.

BIT 2-0 ADCS2:ADCS0: Bits selectores del reloj de conversión:

Para poder configurar estos bit necesitamos un dato de tiempo y este dato nos lo vuelve a dar el data del micro, y es que un Tad=2uSeg. Sabido esto elegimos la fuente del reloj y el divisor a aplicar. Por lo tanto trabajando a 8Mhz elegimos la opción 101 = FOSC/16, porque (8Mhz/16) = 2uSeg. Y en el caso de no obtener el valor exacto el data indica que se seleccione el inmediato superior o coloquemos un cristal con una frecuencia especial, pero esto lleva valorar el perjuicio que puede conllevar a otros módulos como por ejemplo las velocidades del modulo UART.

Nota: 8Mhz/16=0.5Mhz => 1/0.5Mhz = 2uSeg., 11Tad*2uSeg.=22uSeg. Conversión completa 10bit.

Nota: Es posible que configurando otros valores inferiores a los recomendados el modulo funcione correctamente, pero nos arriesgamos que al programar otro micro igual no funcione bien, ya que este ultimo micro puede ser menos tolerante en su configuración (esto último es una mala costumbre que tengo que corregir).

Aquí queda, si hay que corregir o añadir algo, ya sabeis, a postear...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: messi1980 en 06 de Mayo de 2010, 12:09:16


hola amigos estoy programando el pic12f675 para controlar la potencia de un lampara de 230 v 0%      a  100% con un potenciometro que esta conectado a la pata 1 del micro12f675 ...cruce por zero pata2    pata0 conectada al optotriac despues del optotriac tenemos triac entonces jugamos del desparo del traic


Define ADC_CLOCK = 3  'Set clock source (3=rc)
Define ADC_SAMPLEUS = 50  'Set sampling time in uS

TRISIO = %00000110
ADCON0 = 0x0e
TRISIO.1 = 1
TRISIO.2 = 1
TRISIO.0 = 0
Dim t2400 As Word
Const con = 396
Dim adval As Byte
Dim voltatge As Word
Dim angle2 As Word
Dim k As Byte
Symbol triac = GP0
ADCON0.7 = 1
ANSEL = %00000010
CMCON = 7

inici: Adcin 1, adval
voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024

If GP2 = 1 And voltatge = 50 Then
GP0 = 1
Endif

   


            Select Case 32

angle2 = angle2 - 960
If angle2 < 0 Then
angle2 = 0
Endif
   
               Select Case 33

angle2 = angle2 + 960
If angle2 > 9000 Then
angle2 = 9000
Endif



Goto inici

End                                               
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Mayo de 2010, 04:51:34


hola amigos estoy programando el pic12f675 para controlar la potencia de un lampara de 230 v 0%      a  100% con un potenciometro que esta conectado a la pata 1 del micro12f675 ...cruce por zero pata2    pata0 conectada al optotriac despues del optotriac tenemos triac entonces jugamos del desparo del traic


Define ADC_CLOCK = 3  'Set clock source (3=rc)
Define ADC_SAMPLEUS = 50  'Set sampling time in uS

TRISIO = %00000110
ADCON0 = 0x0e
TRISIO.1 = 1
TRISIO.2 = 1
TRISIO.0 = 0
Dim t2400 As Word
Const con = 396
Dim adval As Byte
Dim voltatge As Word
Dim angle2 As Word
Dim k As Byte
Symbol triac = GP0
ADCON0.7 = 1
ANSEL = %00000010
CMCON = 7

inici: Adcin 1, adval
voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024

If GP2 = 1 And voltatge = 50 Then
GP0 = 1
Endif

   


            Select Case 32

angle2 = angle2 - 960
If angle2 < 0 Then
angle2 = 0
Endif
   
               Select Case 33

angle2 = angle2 + 960
If angle2 > 9000 Then
angle2 = 9000
Endif



Goto inici

End                                              

_______________________________________

Hola messi1980, no entiendo la consulta, de todos modos así creo que queda mejor el código.

Código: vb.net
  1. Define ADC_CLOCK = 3  'Set clock source (3=rc)
  2. Define ADC_SAMPLEUS = 50  'Set sampling time in uS
  3.  
  4. ADCON0.7 = 1
  5. ANSEL = %00000010
  6. CMCON = 7
  7. TRISIO = %00000110
  8. ADCON0 = 0x0e
  9. TRISIO.1 = 1
  10. TRISIO.2 = 1
  11. TRISIO.0 = 0
  12.  
  13. Symbol triac = GP0
  14. Const con = 396
  15. Dim t2400 As Word
  16. Dim adval As Byte
  17. Dim voltatge As Word
  18. Dim angle2 As Word
  19. Dim k As Byte
  20.  
  21. inici:
  22.         Adcin 1, adval
  23.         voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024
  24.  
  25.         If GP2 = 1 And voltatge = 50 Then GP0 = 1
  26.  
  27.         Select Case voltatge  '???????????????, variable a comparar
  28.                 Case 32
  29.                         angle2 = angle2 - 960
  30.                         If angle2 < 0 Then angle2 = 0
  31.  
  32.                 Case 33
  33.                         angle2 = angle2 + 960
  34.                         If angle2 > 9000 Then angle2 = 9000
  35.         EndSelect
  36. Goto inici
  37. End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 10 de Mayo de 2010, 17:45:02
Hola dogflu:

Mira estoy intentando ver si puedo incluir unas temporizaciones largas en mi programa y me ´he basasdo un poco en la funcion de 3 bases de tiempos con el timer1 que publicaste en el post 5767.

Al no funcionarme he ido eliminando cosas y al final me he quedado solo con el ejemplo de la funcion publica y su correspondiente ejemplo de llamada a esa funcion en el ejemplo 577. y cual es mi sorpresa que al compilar me da error en la linea del "include" de la llamada a esa funcion.
¿cual crees que puede ser la causa?
No adjunto mi fichero, por que ahora solo tengo tu ejemplo y no lo compila.
Gracias de antemano

fermin
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Mayo de 2010, 05:05:32
Hola, he copiado el ejemplo desde el foro por si me equivoque al pegar el código y, me compila correctamente. Lo único que te puedo decir es que te asegures que tienes una versión del PSI que permita los “Include” y, que te acuerdes de guardar el código de la función que inserta el “Include”, con el mismo nombre que busca este. Y mismo directorio del programa principal para que lo encuentre.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 11 de Mayo de 2010, 06:03:24
Gracias por la pronta respuesta don Carlos

Los ficheros los tengo en el mismo directorio y lo mas probable es que no me permita el include.
Creo que tengo la ultima version demo y quizas sea por eso.

El siguente paso va a ser el comprar la licencia.

F.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 27 de Mayo de 2010, 19:31:37
Dejo un antiguo programita de ejemplo para practicar con la EEProm interna del PIC18F1320.
Para saber más sobre este tema leer en el índice del hilo sobre el Ejemplo 17 para Pic16F88.

Código: vb.net
  1. Define CONFIG1L = 0x00
  2. Define CONFIG1H = 0x08
  3. Define CONFIG2L = 0x0e
  4. Define CONFIG2H = 0x00
  5. Define CONFIG3L = 0x00
  6. Define CONFIG3H = 0x00
  7. Define CONFIG4L = 0x80
  8. Define CONFIG4H = 0x00
  9. Define CONFIG5L = 0x03
  10. Define CONFIG5H = 0xc0
  11. Define CONFIG6L = 0x03
  12. Define CONFIG6H = 0xe0
  13. Define CONFIG7L = 0x03
  14. Define CONFIG7H = 0x40
  15. Define CLOCK_FREQUENCY = 8
  16. '************************************************************************************************
  17. 'NOMBRE:18F1320_PicEBasic_LCD_ADC_EEProm, Ejemplo 17
  18. 'MICRO: PIC18F1320/8Mhz reloj interno
  19. 'By dogflu66, 5/10
  20. 'Uso de la EEProm para llevar la cuenta de veces que Arranca/Reset la placa
  21. 'Configuración del LCD con bus de datos a 4Bit y sin pin de RW
  22. 'Configuracion del módulo ADC
  23. '************************************************************************************************
  24. '-------------------------------------Puertos del LCD---------------------------------------------
  25. Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
  26. Define LCD_DREG = PORTA  'El bus de datos sera el puerto A
  27. Define LCD_DBIT = 0  'El bus de datos seran los 4 bit menos significativos del puerto A
  28. Define LCD_RSREG = PORTB  'El bit de control RS sera del puerto B
  29. Define LCD_RSBIT = 7  'Se usara el RB7 como RS
  30. Define LCD_EREG = PORTB  'El bit de control E sera del puerto B
  31. Define LCD_EBIT = 6  'Se usara el RB6 como E
  32. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  33. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  34. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  35. '------------------------------------------------------------------------------------------------------
  36. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  37. '--Configura el modulo UART--
  38. Hseropen 4800
  39. '------------------------------------Definicion de puertos------------------------------------------
  40. ADCON1 = %1101111  'Configuracion pin, 1= digitales, 0 = analogicos (AN4)
  41. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  42. TRISA = 0x00  'Configuracion puerto A como salidas
  43. TRISB = %00000001  'Puerto B como salidas, AN4 input
  44. ADCON0 = %00010001  'Vref = AVdd y AVss, CH4, ADC ON
  45. ADCON2 = %10101101  '10Bit, 11Tad, Fosc/16 (8Mhz=1Tad=2uSeg.)
  46. 'ADCON2 = %10101110  '10Bit, 11Tad, Fosc/64 (20Mhz=1Tad=3.2uSeg.)
  47. 'Variables globales
  48. Dim _getadc As Word
  49. '------------------------------------Inicio------------------------------------------------------------
  50. Lcdinit  'Inicializa el lcd sin cursor
  51. WaitMs 500  'Pausa para estabilizar
  52. '************* Rutina del programa ***************************************
  53. Gosub actualiza_eeprom  'actualiza la eeprom, salto con retorno
  54. RA7 = 0  'salida led amarillo
  55. RB0 = 0  'salida led verde
  56. WaitMs 5000  'espera 5 Seg.
  57. main:  'comienza la rutina principal
  58.         RA7 = 1  'salida led amarillo
  59.         RB0 = 1  'salida led verde
  60.         WaitMs 500  'espera 0,5 Seg.
  61.         RB0 = 0  'salida led verde
  62.         WaitMs 500  'espera 0,5 Seg.
  63.         RA7 = 0  'salida led amarillo
  64.         WaitMs 500  'espera 0,5 Seg.
  65. Goto main  'impide que termine la rutina main
  66. End                                              
  67. actualiza_eeprom:  'comprueba si la eeprom fue escrita, si no la inicializa y comienza el contaje
  68.         Dim nn As Byte
  69.         Dim dato_eeprom(10) As Byte
  70.         For nn = 0 To 4  'bucle para recorrer las primeras posiciones de memoria
  71.                 Read nn, dato_eeprom(nn)  'se asigna de la direccion "nn" el dato a la variable dato_eeprom(n)
  72.         Next nn  'acota el bucle For
  73.  
  74.         Hserout "Datos Arranque: ", #dato_eeprom(0), " ", #dato_eeprom(1), " ", #dato_eeprom(2)  '*/Envia las tres
  75.                                                                                                                 'primeras posiciones al puerto serie*/
  76.         Hserout " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf  '/*Envia las 2 ultimas
  77.                                                                                    'posiciones al puerto serie*/
  78.         If dato_eeprom(0) <> 0 Or dato_eeprom(1) <> 1 Or dato_eeprom(2) <> 2 Then  '/*Comprueba si la eeprom
  79.                                                                                                         'fue inicializada y si no fue asi la inicializa*/
  80.                 For nn = 0 To 2  'Escribe los tres primeros caracteres de control
  81.                         Write nn, nn  'Escribe en la eeprom
  82.                 Next nn  '_____________
  83.                 Write 3, 1  'Inicializa el primer contador
  84.                 Write 4, 0  'Inicializa el segundo contador que nos indica las veces que reboso el primer contador
  85.         Else  'Si lo anterior no es cierto entonces esto otro
  86.                 dato_eeprom(3) = dato_eeprom(3) + 1  'Incrementa el primer contador
  87.                 Write 3, dato_eeprom(3)  'Escribe el nuevo valor para el primer contador
  88.                 If dato_eeprom(3) = 255 Then  'Si reboso el primer contador
  89.                         dato_eeprom(4) = dato_eeprom(4) + 1  'Se incrementa el segundo contador
  90.                         Write 4, dato_eeprom(4)  'Se escribe el valor del segundo contador
  91.                 Endif
  92.         Endif
  93.  
  94.         For nn = 0 To 4  'Bucle para recorrer las primeras posiciones de memoria
  95.                 Read nn, dato_eeprom(nn)  'se asigna de la direccion "nn" el dato a la variable dato_eeprom(n)
  96.         Next nn  'Acota el bucle For
  97.         Hserout "Nuevos Datos:   ", #dato_eeprom(0), " ", #dato_eeprom(1), " ", #dato_eeprom(2)  '/*Envia las tres
  98.                                                                                                                 'primeras posiciones al puerto serie*/
  99.         Hserout " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf  '/*Envia las 2 ultimas
  100.                                                                                     'posiciones al puerto serie*/
  101. Return                                            
  102. 'End

El que esté trabajando con la serie 18F y su EEProm interna y, le funcione en el simulador pero no en la realidad, puede utilizar la configuración de este programa para lograr que le funcione y luego poco a poco ir modificando la configuración hasta conseguir la que necesita. Esto también se puede aplicar a cualquier otro tipo de práctica. No pongo la configuración con cristal de cuarzo porque no tengo ningún PIC18F trabajando actualmente con este tipo de oscilador.

PD. No es necesario preguntarme sobre temas de electrónica o programación mediante el correo o el privado del foro, por aquí es más rápido y de esta forma también puede contestar más gente, aparte de que el tema no queda solo para dos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 17 de Junio de 2010, 06:51:08
Hola de nuevo, si a alguien le interesa esta es la configuracion que tengo en un PIC18F2550 a 20Mhz con cristal externo

Código: [Seleccionar]
'Programa: JEVO33
'Micro: PIC18f2550, cristal externo 20 MHz
'Version: 04

Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


Una pregunta que seguramente sera basica, si tengo un PWM iniciado en un port, ¿puedo poner el port fijo mediante p.e. PWMduty 2, 0 y PORTC.1=1 ?, ¿o tengo que parar primero el PWM ?

Tambien tengo un problemilla con una variable que me va flotando durante toda la ejecucion del programa, he intentado cambiarla de nombre, añadir una mas para que la cargue en una direccion de memoria diferente (a pasado de 0x43 a 0x45 pero me sigue variando), pero con todo y con ello me sigue variando todo el programa, ¿alguna idea?

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: 21CURIOSOS en 24 de Junio de 2010, 04:33:37
A la primera pregunta ya me respondo yo, no se puede conectar el mismo port del PWM si este esta activado

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Julio de 2010, 19:57:19
El amigo Berroa me ha enviado este código y descripción para que lo comparta en el foro, dejo el mensaje exactamente como me lo envió, exceptuando un pequeño retoque en el código para suprimir el “goto” (no se recomienda su uso en lenguajes de alto nivel).

CITO:
Por Berroa:

A la hora de dar soluciones a problemas técnicos ( ya sean industriales, u otros ) muchas veces nos encontramos con la necesidad de contar con dispositivos electronicos los cuales sean capaces de comunicarse con un host, con el objetivo no solo de obtener información de diferentes parámetros, sino, de intervenir directamente sobre la regulación de esos parámetros. La solución presentada a continuación tiene un valor práctico, porque nos permite localizar y guardar en localidades de memória interna todos los dispositivos 1wire "colgados' en una red de este entorno (1Wire).

Teniendo en cuenta la AN187 de MAXIM, y el método descrito allí, brindo mi solución al problema de busqueda (SEARCH, 0xF0) de dispositivos 1-wire a través del PSI.
Recomiendo leer la aplicación. El flujo del programa descrito es importante para entender lo que sucede en el programa.
Estoy convencido de que el programa se puede optimizar, luego entoces bienvenida será toda sugerencia
Espero que sea de utilidad para todos, saludos Francisco.

El proceso de búsqueda está definida por 3 pasos fundamentales:

1°.  Iniciar el bus
2°.  Leer el bit deceado y su conplemento (Por favor, leer el porqué en la application note)
3°.  Mandar el bit deceado.

Una vez que el ( ó los ) dispositivos que contenga el bit deceado sea reconocido por el dipositivo, el mismo continuará participando en el proceso de búsqueda,  los demás se pondrán en una estado de espera hasta que el BUS lo reiniciemos. Este es un proceso BIT by BIT.

Es importante tener en cuenta, que no solo se puede usar el comando search 0xF0, sino tambien podemos usar el comando de busqueda de dispositivos en alarma 0xEC el cuál nos permitirá agilizar el proceso de busqueda y darle servicio a prioridades.

El calculo de la integridad del valor leído se hace a través del último byte ( CRC ). La idea de este proceso la obtuve del foro del PIC BASIC PRO luego las gracias para ellos y en especial para el senor que brinda solución al problema. Debajo está el link  .

Los comentarios los he tratado de hacer en inglés



Calculo del CRC:

'Adapted from the 1wire CRC8 calculation in the official
'PBP forum, many thanx to them!!!!!
'Adaptado del calculo de CRC8 en dispositivos 1wire del foro
'oficial del PICBasic Pro. Gracias!!!!!

'http://www.picbasic.co.uk/forum/showthread.php?t=1672

Código: Visual Basic
  1. AllDigital
  2.  
  3. Dim testbit As Bit  'CRC8
  4. 'Dim testbyte As Byte  'CRC8AL
  5. Dim crcdata As Byte  'CRC8 & CRC8LU & CRC8AL
  6. Dim crc As Byte  'CRC8 & CRC8LU & CRC8AL
  7. Dim i As Byte  'CRC8 & CRC8AL
  8. Dim j As Byte
  9.  
  10. Dim rom_type As Byte  'Device TYPE 1 Byte
  11.  
  12. Dim rom_1_id As Byte  'Device ID 6 Byte
  13. Dim rom_2_id As Byte
  14. Dim rom_3_id As Byte
  15. Dim rom_4_id As Byte
  16. Dim rom_5_id As Byte
  17. Dim rom_6_id As Byte
  18.  
  19. Dim rom_crc As Byte  'Device CRC 1 Byte
  20.  
  21. Dim test_data(7) As Byte  'holds variable to be tested
  22.  
  23. 'real data from a DS1820+
  24. rom_type = 16
  25. rom_1_id = 254
  26. rom_2_id = 89
  27. rom_3_id = 245
  28. rom_4_id = 1
  29. rom_5_id = 8
  30. rom_6_id = 0
  31. rom_crc = 209
  32.  
  33. test_data(0) = rom_type
  34. test_data(1) = rom_1_id
  35. test_data(2) = rom_2_id
  36. test_data(3) = rom_3_id
  37. test_data(4) = rom_4_id
  38. test_data(5) = rom_5_id
  39. test_data(6) = rom_6_id
  40.  
  41. crc = 0
  42.  
  43. main:
  44.         For j = 0 To 6
  45.                 crcdata = test_data(j)
  46.                 Gosub crc8
  47.         Next j
  48.         'En esta parte si observamos el Watch Variable
  49.         'veremos que el resultado crc = rom_crc
  50.         'otra opcion seria integrar en el calculo el valor rom_crc
  51.         'y el valor de crc en este caso debera ser cero (0)
  52.         Break
  53. End                                              
  54. crc8:
  55.         For i = 0 To 7  'Do for all 8 bits in data byte
  56.                 testbit = crc.0 Xor crcdata.0  'XOR bit0 of data byte and crc
  57.                 crcdata = ShiftRight(crcdata, 1)  'Position data byte for next bit test
  58. 'If testbit = 0 Then Goto shift  'If test bit not set, just shift CRC
  59.                 If testbit <> 0 Then crc = crc Xor 0x18  'If set, account for EXOR feedback
  60. 'shift:  'Shift right the CRC byte
  61.                 crc = ShiftRight(crc, 1)  'CRC bit 0 to bit bucket
  62.                 crc.7 = testbit  'Test bit rotates into CRC bit 7
  63.         Next i
  64. Return

El programa completo:

Modificado:
   Sangrado y eliminadas lineas en blanco.

Código: Visual Basic
  1. AllDigital
  2. Define 1WIRE_REG = PORTD  'define the pin where
  3. Define 1WIRE_BIT = 2  '1wire device is connected
  4. Dim presence As Bit  'precense bit
  5. Dim rom_type As Byte  'Device TYPE 1 Byte
  6. Dim rom_1_id As Byte  'Device ID 6 Byte
  7. Dim rom_2_id As Byte
  8. Dim rom_3_id As Byte
  9. Dim rom_4_id As Byte
  10. Dim rom_5_id As Byte
  11. Dim rom_6_id As Byte
  12. Dim rom_crc As Byte  'Device CRC 1 Byte
  13. Dim id_bit As Bit
  14. Dim cmp_id_bit As Bit
  15. Dim search_temp As Byte
  16. Dim ee_location As Byte
  17. 'Dim i As Byte
  18. Dim bit_write As Bit
  19. 'Dim finish As Bit  'Variables for temp measure and control
  20. 'Dim temp As Byte
  21. 'Dim temp2 As Bit
  22. 'Dim sign As Byte
  23. Dim last_device_flag As Bit  'Flag to indicate previus search was the last device
  24. Dim id_bit_number As Byte  'The ROM bit number (1-64) currently being searched
  25. Dim last_zero As Byte  'bit position of the last zero written where there was a discrepancy
  26. Dim last_discrepancy As Byte  'bit index that identifies from which bit the ( NEXT ) search discrepancy check shoud start
  27. Dim search_direction As Bit  'bit value indicating the direction of the search. All devices with this bit stay in the search and the rest go into a wait statefor a 1-wire reset
  28. Dim last_family_discrepancy As Byte  'bit index that identifies the last_discrepancy within the first 8-bit family code of ROM number
  29. Dim device_count As Byte  'Number of devices
  30. 'Define GLCD_DREG = PORTB  '-defines the port where data lines are connected To(it has To be a full 8 - pins port)
  31. 'Define GLCD_RSREG = PORTD  '- defines the port where RS line is connected To
  32. 'Define GLCD_RSBIT = 4  '- defines the pin where RS line is connected To
  33. 'Define GLCD_EREG = PORTD  '- defines the port where E line is connected To
  34. 'Define GLCD_EBIT = 3  '- defines the pin where E line is connected To
  35. 'Define GLCD_RWREG = PORTD  '- defines the port where R/W line is connected To
  36. 'Define GLCD_RWBIT = 5  '- defines the pin where R/W line is connected To
  37. 'Define GLCD_CS1REG = PORTD  '- defines the port where CS1 line is connected To
  38. 'Define GLCD_CS1BIT = 7  '- defines the pin where CS1 line is connected To
  39. 'Define GLCD_CS2REG = PORTD  '- defines the port where CS2 line is connected To
  40. 'Define GLCD_CS2BIT = 6  '- defines the pin where CS2 line is connected To
  41. 'WaitUs 100
  42. 'GLcdinit
  43. 'WaitMs 500
  44. device_count = 0
  45. last_discrepancy = 0
  46. last_family_discrepancy = 0
  47. last_device_flag = 0
  48. last_zero = 0
  49. '************************************************************************
  50. search_rom:
  51.         1wireInit presence  '1. The bus master begins the initialization sequence
  52.         If presence = 1 Then
  53.                 'GLcdposition 0, 0
  54.                 'GLcdwrite "No device(s)..."
  55.                 Goto search_rom
  56.         Endif
  57. '************************************************************************
  58.         'GLcdclear
  59.         If last_device_flag = 1 Then Goto reset_search  'if this bit is TRUE then goto reset_search
  60.         id_bit_number = 1  'initiate this byte
  61.         last_zero = 0  'initiate this byte, Discrepancy marker
  62. rom_search_procedure:
  63.         1wireSendByte 0xf0  '2. The bus master will then issue the Search ROM
  64.         '1. for 1 -> 64
  65. read_bit_and_complement:
  66.         1wireGetBit id_bit, cmp_id_bit  '3. The bus master reads a bit from the 1–Wire bus.
  67.         'and it's complement
  68.         search_temp.0 = id_bit
  69.         search_temp.1 = cmp_id_bit
  70.         Select Case search_temp
  71.                 Case 0  'binary ( 00 ) There are still devices attached which have conflicting bits in this position. Key to fix the problem is here
  72.                         Gosub conflict
  73.                 Case 1  'binary ( 01 ) All devices still coupled have a 0–bit in this Bit position.
  74.                         search_direction = 1
  75.                 Case 2  'binary ( 10 ) all devices still coupled have A 1–bit in this Bit position.
  76.                         search_direction = 0
  77.                 Case 3  'binary ( 11 ) There are no devices attached to the 1–Wire bus. Atypical situation
  78.                         last_discrepancy = 0
  79.         EndSelect
  80.         'Set id_bit_number bit in ROM_NO to search_direction and send to 1-wire bus
  81.         1wireSendBit search_direction
  82.         bit_write = search_direction
  83.         Gosub write_rom_bit_value
  84.         ASM:        incf id_bit_number,f
  85.         If id_bit_number <= 64 Then Goto read_bit_and_complement
  86.         If id_bit_number > 64 Then last_discrepancy = last_zero
  87.         If last_discrepancy = 0 Then last_device_flag = 1
  88. '3.
  89. check_crc:
  90. 'crc computation
  91. 'if crc computation is diferent then we most solve the problem
  92. 'FUTURE feature......
  93. '***************************search finish****************************
  94. 'Here is stored all devices in 8 byte blocks
  95.         ee_location = device_count * 8
  96.         Write ee_location, rom_type
  97.         ee_location = ee_location + 1
  98.         Write ee_location, rom_1_id
  99.         ee_location = ee_location + 1
  100.         Write ee_location, rom_2_id
  101.         ee_location = ee_location + 1
  102.         Write ee_location, rom_3_id
  103.         ee_location = ee_location + 1
  104.         Write ee_location, rom_4_id
  105.         ee_location = ee_location + 1
  106.         Write ee_location, rom_5_id
  107.         ee_location = ee_location + 1
  108.         Write ee_location, rom_6_id
  109.         ee_location = ee_location + 1
  110.         Write ee_location, rom_crc
  111.         ASM:        incf device_count,f
  112.         If last_device_flag = 0 Then Goto search_rom  '1.
  113.         '2
  114. reset_search:
  115.         Write 256, device_count  'number of devices found, be carefully PIC18F4620 have 1024 bytes of EEPROM
  116.         'so, 32 devices are stored correct ( 256 / 8 = 32 )
  117.         last_discrepancy = 0
  118.         last_family_discrepancy = 0
  119.         last_device_flag = 0
  120. End                                              
  121. '******* This part is esential to solve the conflict problem ********
  122. conflict:
  123.         If id_bit_number = last_discrepancy Then
  124.                 search_direction = 1
  125.                 Return
  126.         Endif
  127.         If id_bit_number > last_discrepancy Then
  128.                 search_direction = 0
  129.                 last_zero = id_bit_number
  130.                 Return
  131.         Endif
  132.         'id_bit_number < last_discrepancy
  133.         Select Case id_bit_number  'last_discrepancy  'last_zero  'id_bit_number
  134.                 Case 1
  135.                         search_direction = rom_type.0
  136.                 Case 2
  137.                         search_direction = rom_type.1
  138.                 Case 3
  139.                         search_direction = rom_type.2
  140.                 Case 4
  141.                         search_direction = rom_type.3
  142.                 Case 5
  143.                         search_direction = rom_type.4
  144.                 Case 6
  145.                         search_direction = rom_type.5
  146.                 Case 7
  147.                         search_direction = rom_type.6
  148.                 Case 8
  149.                         search_direction = rom_type.7
  150. '***************************** Device ID*****************************
  151. '*******************************byte2********************************
  152.                 Case 9
  153.                         search_direction = rom_1_id.0
  154.                 Case 10
  155.                         search_direction = rom_1_id.1
  156.                 Case 11
  157.                         search_direction = rom_1_id.2
  158.                 Case 12
  159.                         search_direction = rom_1_id.3
  160.                 Case 13
  161.                         search_direction = rom_1_id.4
  162.                 Case 14
  163.                         search_direction = rom_1_id.5
  164.                 Case 15
  165.                         search_direction = rom_1_id.6
  166.                 Case 16
  167.                         search_direction = rom_1_id.7
  168. '*******************************byte3********************************
  169.                 Case 17
  170.                         search_direction = rom_2_id.0
  171.                 Case 18
  172.                         search_direction = rom_2_id.1
  173.                 Case 19
  174.                         search_direction = rom_2_id.2
  175.                 Case 20
  176.                         search_direction = rom_2_id.3
  177.                 Case 21
  178.                         search_direction = rom_2_id.4
  179.                 Case 22
  180.                         search_direction = rom_2_id.5
  181.                 Case 23
  182.                         search_direction = rom_2_id.6
  183.                 Case 24
  184.                         search_direction = rom_2_id.7
  185. '*******************************byte4********************************
  186.                 Case 25
  187.                         search_direction = rom_3_id.0
  188.                 Case 26
  189.                         search_direction = rom_3_id.1
  190.                 Case 27
  191.                         search_direction = rom_3_id.2
  192.                 Case 28
  193.                         search_direction = rom_3_id.3
  194.                 Case 29
  195.                         search_direction = rom_3_id.4
  196.                 Case 30
  197.                         search_direction = rom_3_id.5
  198.                 Case 31
  199.                         search_direction = rom_3_id.6
  200.                 Case 32
  201.                         search_direction = rom_3_id.7
  202. '*******************************byte5********************************
  203.                 Case 33
  204.                         search_direction = rom_4_id.0
  205.                 Case 34
  206.                         search_direction = rom_4_id.1
  207.                 Case 35
  208.                         search_direction = rom_4_id.2
  209.                 Case 36
  210.                         search_direction = rom_4_id.3
  211.                 Case 37
  212.                         search_direction = rom_4_id.4
  213.                 Case 38
  214.                         search_direction = rom_4_id.5
  215.                 Case 39
  216.                         search_direction = rom_4_id.6
  217.                 Case 40
  218.                         search_direction = rom_4_id.7
  219. '*******************************byte6********************************
  220.                 Case 41
  221.                         search_direction = rom_5_id.0
  222.                 Case 42
  223.                         search_direction = rom_5_id.1
  224.                 Case 43
  225.                         search_direction = rom_5_id.2
  226.                 Case 44
  227.                         search_direction = rom_5_id.3
  228.                 Case 45
  229.                         search_direction = rom_5_id.4
  230.                 Case 46
  231.                         search_direction = rom_5_id.5
  232.                 Case 47
  233.                         search_direction = rom_5_id.6
  234.                 Case 48
  235.                         search_direction = rom_5_id.7
  236. '*******************************byte7********************************
  237.                 Case 49
  238.                         search_direction = rom_6_id.0
  239.                 Case 50
  240.                         search_direction = rom_6_id.1
  241.                 Case 51
  242.                         search_direction = rom_6_id.2
  243.                 Case 52
  244.                         search_direction = rom_6_id.3
  245.                 Case 53
  246.                         search_direction = rom_6_id.4
  247.                 Case 54
  248.                         search_direction = rom_6_id.5
  249.                 Case 55
  250.                         search_direction = rom_6_id.6
  251.                 Case 56
  252.                         search_direction = rom_6_id.7
  253. '***************************** Device CRC****************************
  254. '*******************************byte8********************************
  255.                 Case 57
  256.                         search_direction = rom_crc.0
  257.                 Case 58
  258.                         search_direction = rom_crc.1
  259.                 Case 59
  260.                         search_direction = rom_crc.2
  261.                 Case 60
  262.                         search_direction = rom_crc.3
  263.                 Case 61
  264.                         search_direction = rom_crc.4
  265.                 Case 62
  266.                         search_direction = rom_crc.5
  267.                 Case 63
  268.                         search_direction = rom_crc.6
  269.                 Case 64
  270.                         search_direction = rom_crc.7
  271.         EndSelect
  272.         If search_direction = 0 Then last_zero = id_bit_number
  273. Return                                            
  274. write_rom_bit_value:
  275.         Select Case id_bit_number
  276. '***************************** Device Type***************************
  277. '*******************************byte1********************************
  278.                 Case 1
  279.                         rom_type.0 = bit_write
  280.                 Case 2
  281.                         rom_type.1 = bit_write
  282.                 Case 3
  283.                         rom_type.2 = bit_write
  284.                 Case 4
  285.                         rom_type.3 = bit_write
  286.                 Case 5
  287.                         rom_type.4 = bit_write
  288.                 Case 6
  289.                         rom_type.5 = bit_write
  290.                 Case 7
  291.                         rom_type.6 = bit_write
  292.                 Case 8
  293.                         rom_type.7 = bit_write
  294. '***************************** Device ID*****************************
  295. '*******************************byte2********************************
  296.                 Case 9
  297.                         rom_1_id.0 = bit_write
  298.                 Case 10
  299.                         rom_1_id.1 = bit_write
  300.                 Case 11
  301.                         rom_1_id.2 = bit_write
  302.                 Case 12
  303.                         rom_1_id.3 = bit_write
  304.                 Case 13
  305.                         rom_1_id.4 = bit_write
  306.                 Case 14
  307.                         rom_1_id.5 = bit_write
  308.                 Case 15
  309.                         rom_1_id.6 = bit_write
  310.                 Case 16
  311.                         rom_1_id.7 = bit_write
  312. '*******************************byte3********************************
  313.                 Case 17
  314.                         rom_2_id.0 = bit_write
  315.                 Case 18
  316.                         rom_2_id.1 = bit_write
  317.                 Case 19
  318.                         rom_2_id.2 = bit_write
  319.                 Case 20
  320.                         rom_2_id.3 = bit_write
  321.                 Case 21
  322.                         rom_2_id.4 = bit_write
  323.                 Case 22
  324.                         rom_2_id.5 = bit_write
  325.                 Case 23
  326.                         rom_2_id.6 = bit_write
  327.                 Case 24
  328.                         rom_2_id.7 = bit_write
  329. '*******************************byte4********************************
  330.                 Case 25
  331.                         rom_3_id.0 = bit_write
  332.                 Case 26
  333.                         rom_3_id.1 = bit_write
  334.                 Case 27
  335.                         rom_3_id.2 = bit_write
  336.                 Case 28
  337.                         rom_3_id.3 = bit_write
  338.                 Case 29
  339.                         rom_3_id.4 = bit_write
  340.                 Case 30
  341.                         rom_3_id.5 = bit_write
  342.                 Case 31
  343.                         rom_3_id.6 = bit_write
  344.                 Case 32
  345.                         rom_3_id.7 = bit_write
  346. '*******************************byte5********************************
  347.                 Case 33
  348.                         rom_4_id.0 = bit_write
  349.                 Case 34
  350.                         rom_4_id.1 = bit_write
  351.                 Case 35
  352.                         rom_4_id.2 = bit_write
  353.                 Case 36
  354.                         rom_4_id.3 = bit_write
  355.                 Case 37
  356.                         rom_4_id.4 = bit_write
  357.                 Case 38
  358.                         rom_4_id.5 = bit_write
  359.                 Case 39
  360.                         rom_4_id.6 = bit_write
  361.                 Case 40
  362.                         rom_4_id.7 = bit_write
  363. '*******************************byte6********************************
  364.                 Case 41
  365.                         rom_5_id.0 = bit_write
  366.                 Case 42
  367.                         rom_5_id.1 = bit_write
  368.                 Case 43
  369.                         rom_5_id.2 = bit_write
  370.                 Case 44
  371.                         rom_5_id.3 = bit_write
  372.                 Case 45
  373.                         rom_5_id.4 = bit_write
  374.                 Case 46
  375.                         rom_5_id.5 = bit_write
  376.                 Case 47
  377.                         rom_5_id.6 = bit_write
  378.                 Case 48
  379.                         rom_5_id.7 = bit_write
  380. '*******************************byte7********************************
  381.                 Case 49
  382.                         rom_6_id.0 = bit_write
  383.                 Case 50
  384.                         rom_6_id.1 = bit_write
  385.                 Case 51
  386.                         rom_6_id.2 = bit_write
  387.                 Case 52
  388.                         rom_6_id.3 = bit_write
  389.                 Case 53
  390.                         rom_6_id.4 = bit_write
  391.                 Case 54
  392.                         rom_6_id.5 = bit_write
  393.                 Case 55
  394.                         rom_6_id.6 = bit_write
  395.                 Case 56
  396.                         rom_6_id.7 = bit_write
  397. '***************************** Device CRC****************************
  398. '*******************************byte8********************************
  399.                 Case 57
  400.                         rom_crc.0 = bit_write
  401.                 Case 58
  402.                         rom_crc.1 = bit_write
  403.                 Case 59
  404.                         rom_crc.2 = bit_write
  405.                 Case 60
  406.                         rom_crc.3 = bit_write
  407.                 Case 61
  408.                         rom_crc.4 = bit_write
  409.                 Case 62
  410.                         rom_crc.5 = bit_write
  411.                 Case 63
  412.                         rom_crc.6 = bit_write
  413.                 Case 64
  414.                         rom_crc.7 = bit_write
  415.         EndSelect
  416. Return

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 31 de Julio de 2010, 07:38:50
Hola de nuevo, si a alguien le interesa esta es la configuracion que tengo en un PIC18F2550 a 20Mhz con cristal externo

Código: [Seleccionar]
'Programa: JEVO33
'Micro: PIC18f2550, cristal externo 20 MHz
'Version: 04

Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


Una pregunta que seguramente sera basica, si tengo un PWM iniciado en un port, ¿puedo poner el port fijo mediante p.e. PWMduty 2, 0 y PORTC.1=1 ?, ¿o tengo que parar primero el PWM ?

Tambien tengo un problemilla con una variable que me va flotando durante toda la ejecucion del programa, he intentado cambiarla de nombre, añadir una mas para que la cargue en una direccion de memoria diferente (a pasado de 0x43 a 0x45 pero me sigue variando), pero con todo y con ello me sigue variando todo el programa, ¿alguna idea?

Saludos

La respuesta a la segunda pregunta es exactamente lo mismo que indicas que has realizado. Otra cosa que puedes hacer, es declarar los arrays de variables después de las variables normales, en el caso que uses arrays (arreglos de variables).

PD. Un poco tarde, pero se me paso.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Septiembre de 2010, 00:25:34
Varias veces me preguntaron si se pueden tener arrays (vectores) de varias dimensiones en el Basic del PSI. Lo que es el lenguaje hasta ahora no lo tiene implementado, pero podemos construirnos una función que nos simule el proceso, no queda tan lucida como una función interna del sistema, ya que necesitamos una variable de paso e indicar si escribiremos o leeremos el array, pero el caso es que la función nos permite trabajar con array de dos dimensiones.

La rutina esta declarada en el ejemplo como array(2,5).

Código: Visual Basic
  1. 'Rutina para trabajar con array de dos dimensiones (Vectores)
  2. 'By dogflu66
  3. '********************************************************************
  4. Dim x As Byte
  5. Dim y As Byte
  6. Dim n As Byte
  7.  
  8. AllDigital
  9. TRISA = 0
  10. TRISB = 0
  11.  
  12. main:
  13.         n = 0
  14.         For x = 0 To 1
  15.                 For y = 0 To 4
  16.                         max = n  'Valor a guardar
  17.                         Call max(x, y, "W")  'Actualiza array
  18.                         n = n + 1  'Valor a guardar
  19.                 Next y
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 0 To 1
  23.                 For y = 0 To 4
  24.                         Call max(x, y, "R")  'Lee array
  25.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  26.                 Next y
  27.         Next x
  28. 'Goto main
  29. End                                              
  30. 'Rutina para trabajar con arrays de dos dimensiones
  31. 'max = variable de paso
  32. 'i1 = Primer indice del array
  33. 'i2 = Segundo indice del array
  34. 'rw = "W" o "w" o 1 => Escribe en array
  35. 'rw = "R" o "r" o 0 => Lee del array
  36. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  37.         Const ind2 = 5  'Valor del indice2
  38.         Dim array(10) As Byte  'Se declara vector de longitud Indice1*indice2
  39.         Dim ind As Byte  'Indice del vector de trabajo
  40.         ind = i1 + i2 + (i1 * (ind2 - 1))  'Calcula indice array
  41.         If rw = "R" Or rw = "r" Or rw = 0 Then max = array(ind)  'Lee array
  42.         If rw = "W" Or rw = "w" Or rw = 1 Then array(ind) = max  'Escribe array
  43. End Function

Dejo la foto de la simulacion:
(http://img820.imageshack.us/img820/6205/arrayenpsi.jpg)

PD. He simplificado la función.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: EA7LN en 30 de Septiembre de 2010, 12:19:06
Se puede operar con decimales con el basic del pic simulator?
Intento hacer una multiplicación con 0,036 y el valor es 0, en cambio por 36 si lo hace el pic.
Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Septiembre de 2010, 19:35:42
No tiene funciones implementadas por el momento para trabajar con  números decimales, ni negativos, pero eso no quiere decir que no puedas, busca "DECIMALES"  en el índice del hilo y veras varios ejemplos.


Nota: Actualmente si permite trabajar con decimales (04/11)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Octubre de 2010, 19:49:12
El índice del hilo ha crecido considerablemente, lo estoy actualizando.......
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 05 de Octubre de 2010, 20:50:47
El índice del hilo ha crecido nuevamente, lo estoy actualizando.......

El índice queda actualizado a dia de hoy.

Queda pendiente añadir los enlaces a consultas y a los ejemplos de los amigos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 12 de Octubre de 2010, 13:34:44
El lenguaje no permite (no permitia) imprimir de forma directa en el LCD las variables tipo Long, así que dejo un par de  funciones que lo hacen posible.

Código: vb.net
  1. Define CONF_WORD = 0x2f50  '/* FUSES
  2. Define CONF_WORD_2 = 0x3ffd  '*/
  3. Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj
  4. '********************************************************
  5. 'FUNCION PARA IMPRIMIR UNA VARIABLE TIPO LONG EN EL LCD *
  6. 'NOMBRE: 16F88_PicEBasic_IMPRIMIR LONG POR EL LCD *******
  7. '*************** 12/10/10 By COS ************************
  8. '********************************************************
  9. '----Puertos del LCD
  10. Define LCD_BITS = 4  'Indicamos que el bus de datos del lcd sera de 4bit
  11. Define LCD_DREG = PORTA  'Bus de datos sera el puerto A
  12. Define LCD_DBIT = 0  'Bus de datos seran los 4 bit menos significativos del puerto A
  13. Define LCD_RSREG = PORTB  'Bit de control RS sera del puerto B
  14. Define LCD_RSBIT = 7  'Se usara el RB7 como RS
  15. Define LCD_EREG = PORTB  'Bit de control E sera del puerto B
  16. Define LCD_EBIT = 6  'Se usara el RB6 como E
  17. Define LCD_COMMANDUS = 2000  'Tmp de espera despues de ejecutar un comand del lcd en uSeg.
  18. Define LCD_DATAUS = 50  'Tmp de espera despues de enviar un dato al LCD en uSeg.
  19. Define LCD_INITMS = 5  '50  'Tmp de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
  20. '----ASIGNACION DE I/O y valores de inicio de las salidas. Configura ADC
  21. ANSEL = %00010000  'Los pin I/O digitales y RA4 analogico
  22. CMCON = 0x07  'Comparador a off
  23. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  24. ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
  25. ADCON1 = %11000000  'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  26. 'ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  27. TRISA = 0x00  'Puerto A como salidas
  28. TRISB = 0x00  'Puerto B como salidas
  29. TRISA.4 = 1  'Como entrada (RA4, adc)
  30. TRISA.6 = 1  'Como entrada (RA6, tecla E1)
  31. TRISA.5 = 1  'Como entrada (RA5, tecla E2)
  32. 'TRISB.5 = 0 'RB5(Tx, RS232)
  33. TRISB.2 = 1  'RB2 (Rx, RS232)
  34. PORTB.3 = 1  'Luz lcd a on (RB3)
  35. PORTA.7 = 1  'Led amarillo a off
  36. PORTB.0 = 1  'Led verde a off
  37. '----VARIABLES GLOBALES
  38. Dim dato As Long
  39. '---INICIO
  40. Lcdinit  'Inicializa el lcd sin cursor
  41. Lcdcmdout LcdClear  'Limpia lcd y cursor principio linea 1
  42. Lcdout "Print Long:"
  43. '----Rutina principal
  44. dato = 995
  45. main:
  46.         Lcdcmdout LcdLine2Home  'Cursor a principio de linea 2
  47.         Call _putlcd32(dato)  'Va a la funcion
  48.         dato = dato + 1
  49. Goto main
  50. End                                              
  51. '***************************************************
  52. 'Retorna valor: Byte
  53. 'Extrae el digito indicado, hasta 10 digitos
  54. 'numero = Cifra a descomponer
  55. 'digito = Digito a extraer de 0 a 9
  56. 'Los digitos se nombras de derecha a izquierda, cero es el primero
  57. '_getdig32, retorna el digito.
  58. Function _getdig32(_numero As Long, _digito As Byte) As Byte
  59.         'Descompone el numero a mostrar en digitos
  60.         Dim _n As Byte
  61.         For _n = 1 To _digito  'Recorre el número hasta digito
  62.                 _numero = _numero / 10  'Selecciona el digito
  63.         Next _n
  64.         _numero = _numero Mod 10  'Extrae el digito
  65.         _getdig32 = _numero  'Asigna y devuelve el digito
  66. End Function                                      
  67. 'No retorna valor
  68. 'Envia una variable al LCD
  69. Proc _putlcd32(_numero As Long)
  70.         Dim i As Byte
  71.         Dim digito As Byte
  72.         Dim flag As Byte
  73.         flag = 0  'Elimina los ceros a la izquierda
  74.         For i = 9 To 0 Step -1  'Recorre el número
  75.                 digito = _getdig32(_numero, i)  'Asigna digito
  76.                 If digito > 0 Then flag = 1  'Permite que se imprima el digito
  77.                 If flag > 0 Then Lcdout #digito  'Imprime el digito
  78.         Next i
  79.         If flag > 0 Then Lcdout "0"
  80. End Proc

Nota: Actualmente si permite imprimir las variables de tipo Long (4 Bytes) y Single (Float de 4 Bytes) directamente en el LCD o GLCD (menos tipo bit) (04/11).
Nota: Programa corregido y actualizado (10/2015).
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: OSS en 13 de Octubre de 2010, 20:11:42
Saludos Amigos presento una incomodidad en el PSI con Respecto a los LCD alfanumericos, he estado intentando guardar valores ASCII en una EEPROM I2C luego leerlos y mostrarlos en la LCD como caracteres y no su valor numerico, espero me puedas ayudar, en el siguiente codigo intente hacero funcionar pero no se si sea la manera adecuada ya que estoy moviendo las posiciones de la linea 2 para ir escribiendo la palabra, la verdad mi proyecto consta en recibir atraves del USART una cadena de caracteres (nombres, items, descripciones, etc..) , guardar sus valores correspondientes ASCII en la eeprom, luego accesar a ellos y mostrarlos en la lcd, ejemplo: -envio por hyperterminal la palabra "camiones" luego la grabo en la eeprom en sus correspondientes valores numericos, despues acceder a los valores guardados en la eeprom y mostrar en el lcd la palabra guardada "camiones" de antemano agradeceria la ayuda de ustedes
Gracias...   :-)  Saludos desde Tachira-Venezuela Felicitaciones! Excelente Foro!!! ;-)


Código: [Seleccionar]
Define SIMULATION_WAITMS_VALUE = 1
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 20
AllDigital

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
'Define LCD_RWREG = PORTE
'Define LCD_RWBIT = 2
Define LCD_EREG = PORTE
Define LCD_EBIT = 1
Define LCD_READ_BUSY_FLAG = 1
Lcdinit 1

Symbol scl = PORTC.3
Symbol sda = PORTC.4

Dim b As Byte
Dim addr As Word
Dim data As Byte
Dim mask As Byte
Dim index As Byte

For addr = 0 To 25
index = addr
Lcdcmdout LcdClear
mask = LookUp("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), index
data = mask
I2CWrite sda, scl, 0xa0, addr, data
Lcdout "Write To EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr
Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
For addr = 0 To 12
I2CRead sda, scl, 0xa0, addr, data
Lcdcmdout LcdLine2Home
b = addr + 1
Lcdcmdout LcdLine2Pos(b)
If data = "A" Then Lcdout "A"
If data = "B" Then Lcdout "B"
If data = "C" Then Lcdout "C"
If data = "D" Then Lcdout "D"
If data = "E" Then Lcdout "E"
If data = "F" Then Lcdout "F"
If data = "G" Then Lcdout "G"
If data = "H" Then Lcdout "H"
If data = "I" Then Lcdout "I"
If data = "J" Then Lcdout "J"
If data = "K" Then Lcdout "K"
If data = "L" Then Lcdout "L"
If data = "M" Then Lcdout "M"
WaitMs 500
Next addr
Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
For addr = 13 To 25
b = addr - 12
I2CRead sda, scl, 0xa0, addr, data
Lcdcmdout LcdLine2Home
Lcdcmdout LcdLine2Pos(b)
If data = "N" Then Lcdout "N"
If data = "O" Then Lcdout "O"
If data = "P" Then Lcdout "P"
If data = "Q" Then Lcdout "Q"
If data = "R" Then Lcdout "R"
If data = "S" Then Lcdout "S"
If data = "T" Then Lcdout "T"
If data = "U" Then Lcdout "U"
If data = "V" Then Lcdout "V"
If data = "W" Then Lcdout "W"
If data = "X" Then Lcdout "X"
If data = "Y" Then Lcdout "Y"
If data = "Z" Then Lcdout "Z"
WaitMs 500
Next addr

End           
                               


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Octubre de 2010, 17:50:11
Te complicaste la vida.
Solo tienes que enviar el código ASCII directamente al LCD y ya lo reemplaza por su equivalente grafico.
Lcdout ascii 'Envia al display la representacion grafica ASCII del numero contenido en la variable ascii

"#" es un modificador que descompone la cifra en digitos BCD y los envia uno a uno en su representación grafica ASCII al LCD u otro dispositivo.
ascii = 50
Lcdout #ascii 'Envia al display dos digitos, la representacion grafica del codigo ASCII del "5" segido de la representacion grafica del codigo ASCII "0"
Lcdout #ascii = Lcdout 53, 48 = Lcdout "5", "0" = Lcdout "50". Para ascii = 50.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Octubre de 2010, 17:53:15
Ejemplo:

Código: vb.net
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  7. '************************************************************************************************
  8. '-------------------------------------Puertos del LCD---------------------------------------------
  9. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  10. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  11. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  12. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  13. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  14. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  15. Define LCD_EBIT = 6  'se usara el RB6 como E
  16. 'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
  17. 'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
  18. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  19. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  20. Define LCD_INITMS = 5  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  21. '------------------------------------------------------------------------------------------------------
  22. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  23. '------------------------------------Definicion de puertos------------------------------------------
  24. ANSEL = 0x00  'los pin I/O digitales (no analogicos)
  25. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  26. CMCON = 0x07  'comparador a off
  27. TRISA = 0x00  'Puerto A como salidas
  28. TRISB = 0x00  'puerto B como salidas
  29. '------------------------------------Inicio------------------------------------------------------------
  30. Lcdinit  'inicializa el lcd sin cursor
  31. Dim ascii As Byte
  32. ascii = 50
  33. WaitMs 500  'pausa para estabilizar
  34. main:  'Rutina principal
  35.     Lcdcmdout LcdClear  'borra el display
  36.     Lcdout "ASCII:"
  37.     Lcdcmdout LcdLine2Home
  38. Lcdout #ascii
  39. Lcdout "="
  40. Lcdout 53, 48
  41. Lcdout "="
  42. Lcdout "5", "0"
  43. Lcdout "="
  44. Lcdout "50"
  45. 'Goto main  'impide que termine el programa principal
  46. End

(http://img245.imageshack.us/img245/6900/lcdr.jpg)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: MiCrOtRoNiC en 22 de Octubre de 2010, 23:51:29
Bienvenido Amigo OSS yo tambien soy Tachira-Venezuela... pensé que casi nadie utilizaba este soft por estos lares saludos. me imagino que con la ayuda de nuestro amigo dogflu66 el cual es la Biblia propia del PSI lograste terminar parte del codigo

saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 05 de Noviembre de 2010, 12:54:13
No se si esta es la forma mas apropiada para publicar, moderadores... a su dispocision!

Este es un codigo para ds1307 basado en un ejemplo que esta colgado en el foro. (genialmente descrito y comprensible) jamas hubiera entendido el funcionamiento i2c 1307 si no fuera por este codigo.
dogflu66 un grosso, estoy aprendiendo mucho de tus aportes. Gracias!!!!!

dogflu66 es el autor y yo me permiti hacer unas reformas optimizando el codigo en las rutinas de "antirebote" de los pines de ajuste de parametros del reloj.

'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
''MICRO: PIC16f88A
'FECHA/AUTOR: 11/10 - By COS (intervencion by GATRUCA)
'Version 2010?¿
'DESCRIPCION: Muestra en el display la fecha y la hora en formato de 24 horas
'***************************************************************************************************
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 0
Define LCD_EREG = PORTD
Define LCD_EBIT = 2
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 1
Define LCD_COMMANDUS = 2000
Define LCD_DATAUS = 50
Define LCD_INITMS = 39
Lcdinit
Symbol sda = PORTC.3  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTC.4  'asignamos nombre al pin que hara de SCL del puerto I2C
Symbol s1 = PORTD.3  'se asigna nombre a el pin que aumenta el valor
Symbol fc = PORTD.5  'tecla funcion ingresa a programa u cambia parametro
Dim aux_4h As Byte  'contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'variable indice
Dim reg(7) As Byte  'contendra los valores finales de fecha y hora en el sistema decimal
Dim flash_1 As Bit  'controla el parpadeo de los digitos del lcd, activo a 1
Dim dato As Byte  'indica la direccion del RTC a cambiar de valor
Dim flag_1 As Bit  'activa la rutina de ajuste del reloj, activo a 1
Dim aux_ajuste As Byte  'variable auxiliar para la rutina de ajuste
dato = 7  'fuera de ajuste o modo normal de trabajo del reloj, de 0 a 6 modo ajuste
flash_1 = 0  'parpadeo off por defecto
flag_1 = 0  'ingreso a programacion reloj off por defecto
WaitMs 500  'espera 0.5
Lcdcmdout LcdClear
main:
If fc = 1 And flag_1 = 0 Then  'modo ajuste
      flag_1 = 1  'activa rutina de ajuste
Endif
If flag_1 = 1 Then Gosub ajuste_reloj  'saltamos a la rutina de ajuste
Gosub lee_hora  'lee la fecha y hora del reloj
Gosub print_lcd  'actualiza los datos del reloj en el display
WaitMs 100
Goto main
End                                               
ajuste_reloj:  'rutina de ajuste del reloj
   If fc = 1 Then  'detecta tecla fc
      While fc = 1  'eliminacion de rebotes (se queda haciendo nada mientras fc = 1
         WaitUs 1
      Wend
      dato = dato + 1  'seleciona el dato a ser modificado
      If dato > 7 Then dato = 0  '8 posiciones de estadio
      If dato > 6 Then flag_1 = 0  'termina programacion reloj
   Endif

While s1 = 1  'deteca tecla S1 y eliminacion de rebotes 
      If dato < 7 Then  'limita la direcciones de trabajo del reloj
         Gosub lee_hora  'lee los datos de los registros del RTC y los pasa a decimal, elimina los bit de control
         aux_ajuste = reg(dato)  'hace una imagen del valor del registro a modificar
         aux_ajuste = aux_ajuste + 1  'incrementa el dato a modificar que fue seleccionado
         If dato = 2 And aux_ajuste > 23 Then aux_ajuste = 0  'acota horas
         If dato = 0 Or dato = 1 Then  'acota segundos y minutos
            If aux_ajuste > 59 Then aux_ajuste = 0
         Endif
         If dato = 3 And aux_ajuste > 7 Then aux_ajuste = 1  'acota el dia de la semana
         If dato = 4 And aux_ajuste > 31 Then aux_ajuste = 1  'acota el dia del mes
         If dato = 5 And aux_ajuste > 12 Then aux_ajuste = 1  'acota el mes
         If dato = 6 And aux_ajuste > 99 Then aux_ajuste = 1  'acota el año, año maximo 2030
         If aux_ajuste > 49 And aux_ajuste < 60 Then  'Decimal a BCD
            aux_ajuste = aux_ajuste - 50
            aux_ajuste.4 = 1
            aux_ajuste.6 = 1
         Endif
         If aux_ajuste > 39 And aux_ajuste < 50 Then  'Decimal a BCD
            aux_ajuste = aux_ajuste - 40
            aux_ajuste.6 = 1
         Endif
         If aux_ajuste > 29 And aux_ajuste < 40 Then  'Decimal a BCD
            aux_ajuste = aux_ajuste - 30
            aux_ajuste.4 = 1
            aux_ajuste.5 = 1
         Endif
         If aux_ajuste > 19 And aux_ajuste < 30 Then  'Decimal a BCD
            aux_ajuste = aux_ajuste - 20
            aux_ajuste.5 = 1
         Endif
         If aux_ajuste > 9 And aux_ajuste < 20 Then  'Decimal a BCD
            aux_ajuste = aux_ajuste - 10
            aux_ajuste.4 = 1
         Endif
         If aux_ajuste < 10 Then aux_ajuste = aux_ajuste  'Decimal a BCD
         If dato = 0 Then aux_ajuste.7 = 0  'restaura el bit de configracion, activa el oscilador del reloj
         If dato = 2 Then aux_ajuste.7 = 0  'restaura el bit, no lo utiliza el RTC
         If dato = 2 Then aux_ajuste.6 = 0  'restaura el bit de configuracion, reloj 24h
         I2CWrite sda, scl, 0xd0, dato, aux_ajuste  'actualiza el dato ya modificado
      Endif
   Gosub print_lcd  'permite ver el valor del parametro cuando estamos dentro del bucle
   Gosub parpadeo  'ver el pametro parpadeando cuando dentro del bucle

   WaitMs 50
'el tiempo de espera puede acelerar o retardar
'la repeticion de incremento de los parametros

Wend
Gosub parpadeo  'ver el pametro parpadeando cuando estamos fuera del bucle
Return                                           
parpadeo:
If dato >= 0 And dato < 7 And flag_1 = 1 Then
      If flash_1 = 1 Then  'selecciona si el dato a modificar es visible o no
         flash_1 = 0  'dato es visible
      Else
         flash_1 = 1  'dato no es visible
      Endif
Endif
Return                                           
lee_hora:  'lee la hora del RTC en formato BCD y la pasa a decimal
   i = 0  'variable indice, asigna los datos de forma ordenada, leidos del RTC
   While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
      I2CRead sda, scl, 0xd0, i, reg(i)  'lectura de la direccion de memoria indicada del RTC, formato BCD
      aux_4l = reg(i) And %00001111  'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
      If i = 0 Then aux_4h = reg(i) And %01110000  'segundos, borrado de bit configuracion y almacena nibble alto
      If i = 1 Then aux_4h = reg(i) And %01110000  'minutos, almacena nibble alto
      If i = 2 Then aux_4h = reg(i) And %00110000  'horas, borrado de bit configuracion y almacena nibble alto
      If i = 3 Then aux_4h = reg(i) And %00000000  'dia_semana, almacena nibble alto
      If i = 4 Then aux_4h = reg(i) And %00110000  'dia_mes, almacena nibble alto
      If i = 5 Then aux_4h = reg(i) And %00010000  'mes, almacena el nibble alto
      If i = 6 Then aux_4h = reg(i) And %11110000  'año, almacena el nibble alto
      aux_4h = ShiftRight(aux_4h, 4)  'convierte el nibble alto en bajo
      reg(i) = (aux_4h * 10) + aux_4l  'fusiona los nibbles alto y bajo en una sola variable en formato decimal
      i = i + 1  'incrementa la variable indice con cada repeticion del bucle While/Wend
   Wend  'fin del bucle y salta a While
Return                                           
print_lcd:  'rutina de escritura en el lcd
   Lcdcmdout LcdLine1Home  'cursor del lcd a la izquierda en la linea 1
Lcdout "    " ' espacios para centrar la hora
   If dato = 2 And flash_1 = 1 Then  'control final del parpadeo de los digitos de la hora
      Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(2) < 10 Then Lcdout "0"  'si horas es inferior a 10 escribe el cero delante
      Lcdout #reg(2)  'escribe la hora
   Endif
   Lcdout ":"  'escribe el separador
   If dato = 1 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los minutos
      Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(1) < 10 Then Lcdout "0"  'si minutos es inferior a 10 escribe el cero delante
      Lcdout #reg(1)  'escribe los minutos
   Endif
   Lcdout ":"  'escribe el separador
   If dato = 0 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los segundos
      Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(0) < 10 Then Lcdout "0"  'si segundos es inferior a 10 escribe el cero delante
      Lcdout #reg(0), "   "  'escribe los segundos
   Endif
   Lcdcmdout LcdLine2Home  'cursor del lcd a la izquierda en la linea 2
   
   If dato = 3 And flash_1 = 1 Then  'control final del parpadeo de los digitos del dia semana
      Lcdout "    "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(3) = 1 Then Lcdout "Dom."  'asigna el literal al dia de la semana
      If reg(3) = 2 Then Lcdout "Lun."
      If reg(3) = 3 Then Lcdout "Mar."
      If reg(3) = 4 Then Lcdout "Mie."
      If reg(3) = 5 Then Lcdout "Jue."
      If reg(3) = 6 Then Lcdout "Vie."
      If reg(3) = 7 Then Lcdout "Sab."
   Endif
   Lcdout "  "  'escribe separador para justificar la fecha
   If dato = 4 And flash_1 = 1 Then  'control final del parpadeo de los digitos del dia del mes
      Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(4) < 10 Then Lcdout "0"  'si dia del mes es inferior a 10 escribe cero
      Lcdout #reg(4)  'escribe el dia del mes
   Endif
   Lcdout "/"  'escribe el separador
   If dato = 5 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los meses
      Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(5) < 10 Then Lcdout "0"  'si mes es inferior a 10 escribe cero
      Lcdout #reg(5)  'escribe el mes
   Endif
   Lcdout "/20"  'separador y los dos primeros digitos del año de 4 digitos
   If dato = 6 And flash_1 = 1 Then  'control final del parpadeo de los digitos de los años
      Lcdout "  "  'borra el dato determinado para dar la sencacion de parpadeo
   Else
      If reg(6) < 10 Then Lcdout "0"  'si año es inferior a 10 escribe primero el cero
      Lcdout #reg(6)  'escribe el año
   Endif
Return                                           





Utilizar while wend como interrupcion es una buena opcion de antirebote para cualquier menu y ajuste de parametros.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 05 de Noviembre de 2010, 13:00:03
aun no lo pruevo, pero que pasaria si dejas presionada la tecla para siempre, supongo que el programa se quedaria estancado,eso creo,si es asi seria bueno que despues de un cierto tiempo salgas de esa condicion usando el timer para calcular cuanto deveria estar esperando a que se suelte la tecla
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 05 de Noviembre de 2010, 13:13:41
Esa es la idea! mientras el boton esta oprimido, el parametro aumenta indefinidamente.
Eso evita por ejemplo que si el reloj esta en  05 minutos y tenes que llegar a 55, tengas que oprimir 50 veces el boton. (es asi como funciona cualquier reloj digital).
si solo oprimis un pulso, (por el tiempo de retardo) no se produce rebote al salir del bucle.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 05 de Noviembre de 2010, 13:53:45
interesante,lo voy a provar al legar a casa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: OSS en 07 de Noviembre de 2010, 16:21:53
Gracias amigo Dogflu66 he estado aprendiendo gracias a tu magnifico y bien elaborado manual del PSI, con tu respuesta pude resolver el problema y otro que ya tenia anteriormente con esto de los lcds alfa-0123 (ya entendido complatemente sobre estos maravillos animalitos) ya  y la verdad si me complique con algo sencillo  :oops: ya he podido realizar el pequeño menu para un rutero que estoy realizando con una matriz de leds, coloco el codigo con la modificacion gracias a la aclaratoria de nuestro amigo dogflu66 he podido eliminar las lineas redundantes jejeje y dejo tambien unas muestras de lo que ya llevo (apenas  :mrgreen:) con este proyecto... todo va caminando como lo esperado  :-/  :-/  :-/ Saludos Amigo y master Dogflu66 gracias  :-) seguire en estos hilos.....
 

aqui la solucion del codigo el antes y el despues...
Código: [Seleccionar]
Define SIMULATION_WAITMS_VALUE = 1
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 20
AllDigital

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
'Define LCD_RWREG = PORTE
'Define LCD_RWBIT = 2
Define LCD_EREG = PORTE
Define LCD_EBIT = 1
Define LCD_READ_BUSY_FLAG = 1
Lcdinit 1

Symbol scl = PORTC.3
Symbol sda = PORTC.4

Dim b As Byte
Dim addr As Word
Dim data As Byte
Dim mask As Byte
Dim index As Byte

For addr = 0 To 25
index = addr
Lcdcmdout LcdClear
mask = LookUp("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), index
data = mask
I2CWrite sda, scl, 0xa0, addr, data
Lcdout "Write To EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr
Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
Lcdcmdout LcdLine2Home
For addr = 0 To 12
I2CRead sda, scl, 0xa0, addr, data

b = addr + 1
'Lcdcmdout LcdLine2Pos(b)
If data = 0x20 Then Lcdout " "
If data = "A" Then Lcdout "A"
If data = "B" Then Lcdout "B"
If data = "C" Then Lcdout "C"
If data = "D" Then Lcdout "D"
If data = "E" Then Lcdout "E"
If data = "F" Then Lcdout "F"
If data = "G" Then Lcdout "G"
If data = "H" Then Lcdout "H"
If data = "I" Then Lcdout "I"
If data = "J" Then Lcdout "J"
If data = "K" Then Lcdout "K"
If data = "L" Then Lcdout "L"
If data = "M" Then Lcdout "M"
WaitMs 500
Next addr
Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
Lcdcmdout LcdLine2Home
For addr = 13 To 25
b = addr - 12
I2CRead sda, scl, 0xa0, addr, data

'Lcdcmdout LcdLine2Pos(b)
If data = "N" Then Lcdout "N"
If data = "O" Then Lcdout "O"
If data = "P" Then Lcdout "P"
If data = "Q" Then Lcdout "Q"
If data = "R" Then Lcdout "R"
If data = "S" Then Lcdout "S"
If data = "T" Then Lcdout "T"
If data = "U" Then Lcdout "U"
If data = "V" Then Lcdout "V"
If data = "W" Then Lcdout "W"
If data = "X" Then Lcdout "X"
If data = "Y" Then Lcdout "Y"
If data = "Z" Then Lcdout "Z"
WaitMs 500
Next addr

End                                              




y el despues;
Código: [Seleccionar]
Define SIMULATION_WAITMS_VALUE = 1
Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 20
AllDigital

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
'Define LCD_RWREG = PORTE
'Define LCD_RWBIT = 2
Define LCD_EREG = PORTE
Define LCD_EBIT = 1
Define LCD_READ_BUSY_FLAG = 1
Lcdinit 1

Symbol scl = PORTC.3
Symbol sda = PORTC.4

Dim b As Byte
Dim addr As Word
Dim data As Byte
Dim mask As Byte
Dim index As Byte

For addr = 0 To 25
index = addr
Lcdcmdout LcdClear
mask = LookUp("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), index
data = mask
I2CWrite sda, scl, 0xa0, addr, data
Lcdout "Write To EEPROM"
Lcdcmdout LcdLine2Home
Lcdout "(", #addr, ") = ", #data
WaitMs 500
Next addr

Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
Lcdcmdout LcdLine2Home

For addr = 0 To 12
I2CRead sda, scl, 0xa0, addr, data
b = addr + 1
'Lcdcmdout LcdLine2Pos(b)
Lcdout data
WaitMs 500
Next addr

Lcdcmdout LcdClear
Lcdout "Read From EEPROM"
Lcdcmdout LcdLine2Home

For addr = 13 To 25
b = addr - 12
I2CRead sda, scl, 0xa0, addr, data
'Lcdcmdout LcdLine2Pos(b)
Lcdout data
WaitMs 500
Next addr

End                                              




aqui unas muestras  disculpen la resolusion (potecito nokia 2MP)  :) :




Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: OSS en 07 de Noviembre de 2010, 16:47:17
Bienvenido Amigo OSS yo tambien soy Tachira-Venezuela... pensé que casi nadie utilizaba este soft por estos lares saludos. me imagino que con la ayuda de nuestro amigo dogflu66 el cual es la Biblia propia del PSI lograste terminar parte del codigo

saludos

Que Bien! Gracias Microtronic saludos tambien y me alegra que hallan paisanos por aca en el foro pues la verdad somos poquitos venezolanos y del tachira menos! jejeje... Dejame decirte que tienes toda la razon gracias a nuestro gran amigo dogflu66 he logrado solucionar, mejorar el codigo y avanzar con este proyecto, todavia hay mucho por hacer y poco a poco atraves de la ayuda que nos ofrecen, iremos desarrollando mas y mas conocimientos en el mundo de los pic's nos estaremos comunicando Saludos desde Tucape (Tariba)  :-/
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 11 de Noviembre de 2010, 11:35:35
Amigo dogflu, una consultita,me he encaminado en un nuevo proyecto,solo por entretenimiento,y quiero hacer una lcd por I2C,entonces debo usar los registros de control del modulo mssp,pero al parecer en psi no lo puedo usar,porque coloco el registro,por ejemplo sspcon1 y no lo reconoce como comando(no lo pone en mayusculas de color azu)
entonces mi pregunta va asi: hay alguna manera de trabajar con registros que el compilador no reconosca? en CCS por ejemplo se puede con #byte <variable>= <direccion de registro> .             pero aqui en spi como seria,si esque hay alguna forma claro está.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Noviembre de 2010, 15:51:49
Pues no he trabajado nunca con esos registros, ¿que micro estas usando?.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 11 de Noviembre de 2010, 15:54:38
Es el pic 16f876a quiero usar la comunicacion i2c por hardware en modo esclavo , tengo que usar tres registros sspcon1 sspcon2 y un  ultimo no lo recuerdo bien
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Noviembre de 2010, 15:59:55
Los registros SSPCON y SSPCON2 si me los reconoce, y compilando no me tira errores.

PD. Con el SSPCON1 si me da error.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 12 de Noviembre de 2010, 16:44:28
Consulta:
Alguno de ustedes hizo alguna experiencia con caracteres fuera de la tabla ascii? o un grafico, (aunque sea sencillo), con psi? he visto que en otros idiomas hay referencias de un soft que crea tablas para generar caracteres, pero creo que no iria bien con psi.
Desde ya gracias por adelantado a quien pueda aportar algun dato.
Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 12 de Noviembre de 2010, 17:56:14
Los registros SSPCON y SSPCON2 si me los reconoce, y compilando no me tira errores.

PD. Con el SSPCON1 si me da error.

Es justo lo que te mencione amigo, aunque me he dado cuenta de que para configurar el modulo SSP en modo I2C esclavo no necesito ese registro.aunque seria bueno lo que mencioné acerca de que se pudiera asignar la direccion del registro a una variable de modo que pudieramos trabajar sin restriccion alguna.
otra cosa mas he estado navegando y me he topado con MIKROBASIC y me ha llamado la atencion, haz trabajado con este compilador??? se ve muy interesante.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Noviembre de 2010, 08:16:00
Consulta:
Alguno de ustedes hizo alguna experiencia con caracteres fuera de la tabla ascii? o un grafico, (aunque sea sencillo), con psi? he visto que en otros idiomas hay referencias de un soft que crea tablas para generar caracteres, pero creo que no iria bien con psi.
Desde ya gracias por adelantado a quien pueda aportar algun dato.
Saludos


La verdad es que no me hizo eso falta para nada, si realmente lo necesitas es cuestión de que los generes para Protón (que es muy similar al PSI) y le cambies al código las pequeñas diferencias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Noviembre de 2010, 08:24:57
Los registros SSPCON y SSPCON2 si me los reconoce, y compilando no me tira errores.

PD. Con el SSPCON1 si me da error.

Es justo lo que te mencione amigo, aunque me he dado cuenta de que para configurar el modulo SSP en modo I2C esclavo no necesito ese registro.aunque seria bueno lo que mencioné acerca de que se pudiera asignar la direccion del registro a una variable de modo que pudieramos trabajar sin restriccion alguna.
otra cosa mas he estado navegando y me he topado con MIKROBASIC y me ha llamado la atencion, haz trabajado con este compilador??? se ve muy interesante.

Creo que si lo hay, pero no he tenido que utilizarlo,  hare unas pruebas a ver si es posible.
Si veis el hilo veréis que jamás he aconsejado utilizar este u otro BASIC, ni siquiera el PSI.
De todas formas el único Basic que actualmente (desde hace poco, menos de un año con la última versión), me podría permitir trabajar aproximadamente como lo hago con PSI seria el Protón.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 13 de Noviembre de 2010, 12:18:59
bueno lo estoy probando y lo que me gusta esque se puede simular lcd en proteus.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 16 de Noviembre de 2010, 11:29:42
A migo dogflu me podrias decir cual es la diferencia entre hserin y hseget, o almenos como puedo ver la libreria del psi para ppoder ver las diferencias yo mismo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Noviembre de 2010, 14:14:09
Hserin es una función del sistema que junto con los comandos Goto, Waitms no son recomendados su uso en la programación. También entran pero en menor medida Gosub/Return y las variables globales.

Hserin supuestamente para la ejecución del programa y se queda esperando que llegue un carácter. No se si se le puede programar un tiempo máximo de espera, por si no llega el carácter para que no quede bloqueado el Pic. No la he probado porque no me interesa, pero posiblemente por su forma de trabajar internamente se vería afectada por las interrupciones, posiblemente falle si las interrupciones están activas.

Hserget lee también un byte al igual que Hserin, pero lo que se hace es que cuando el modulo usart activa el BIT de indicación de que hay datos en su búfer, pues se llama a Hserget para que lo lea y mientras hacemos otra cosa. Y si no hay mas datos en el búfer de la usart Hserget borra el BIT de forma automática. Hserin también debería borrar este BIT porque trabajan sobre los mismos registros internos de la usart.

En realidad hay gente que los utiliza de forma indistinta, porque si no se cometen errores y se llama cuando se debe no se nota la diferencia, pero en realidad es Hserget la que se debe de utilizar porque es más segura.

PD. No se puede ver el código porque son funciones directas al compilador, la única forma es compilando unos ejemplos y luego utilizando las herramientas del PSI para hacer un desensamblado a código nemotécnico, y para esto hay que manejarse si no bien por lo menos con cierta soltura en lenguaje maquina. El Basic del PSI permite crearte una especie de librerías utilizando los Includes y las estructuras tipo funciones y procedimientos, junto con las variables locales, esto es realmente útil y muy parecido a las librerías. Así que la estructura interna para trabajar con librerías esta implementada, por lo que no creo que tarde mucho en implementarlas en el compilador de una forma directa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: meledu en 16 de Noviembre de 2010, 17:43:41
Gracias amigo Dogflu, me ha quedado muy claro.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mr.pelax en 18 de Noviembre de 2010, 01:03:09
Hola necesio que me ayuden con el siguiente codigo ya que al compilarle con el pic sumulator ide me da los siguientes errores

Line 7: Unused declaration. Not compiled: Dim j1 As Byte
Line 8: Unused declaration. Not compiled: Dim j2 As Byte
Line 11: Unused declaration. Not compiled: Dim text(16) As Byte
Line 35: Unused declaration. Not compiled: Dim tempeaux(3) As Byte 'Temperatura auxiliar
Line 39: Unused declaration. Not compiled: Dim minu0 As Word 'minutos que lleva apagado el aire

espero que me puedan ayudar ya que BASIC no me llevo tan bien. :oops:



Código: [Seleccionar]
'Ejemplo de programación del sistema de control electrónico de luz y temperatura.
'Versión con pulsador para seleccionar el programa 1,2 o 3'y Pulsador para resetear Max/Min
'-------------------------------------------
'Declaracion de Variables
Dim i As Byte ' Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word ' Variable tipo Word multiproposito
Dim aux As Word ' Variable tipo Byte multiproposito
Dim text(16) As Byte

Dim tmax As Byte ' Valor de la temperatura Maxima Registrada en el ciclo
Dim tmin As Byte ' Valor de la temperatura Minima Registrada en el ciclo
Dim prog As Byte ' Programa en curso
Dim dias As Byte ' Dias en curso
Dim hora As Byte ' Hora en curso
Dim minu As Byte ' Minuto en curso
Dim segu As Byte ' Minuto en curso
Dim paso As Byte ' Segundos entre lecturas de Temperatura.

Dim pti1(3) As Byte 'Comienzo tiempo 1
Dim pti2(3) As Byte 'comienzo tiempo 2
Dim pte1(3) As Byte 'Temperatura Tiempo 1
Dim pte2(3) As Byte 'Temperatura Tiempo 2
Dim plu1(3) As Byte 'Luces Tiempo 1
Dim plu2(3) As Byte 'Luces Tiempo 2

Dim tiemp As Word 'Tiempo actual: Hora*60+Minutos
Dim aireok As Bit '1 = puedo usar el aire
Dim tiempf0 As Word 'tiempo que hace que prendí el aire

Dim comando As Byte 'Comando a enviar al DS1820
Dim tempe As Word 'Temperatura leida
Dim tempeaux(3) As Byte 'Temperatura auxiliar
Dim tempe1 As Byte 'PArte entera de la temperatura a mostrar
Dim tempe2 As Byte ' Decimales de la tempertatura a mostrar
Dim minua As Word ' minutos que lleva encendido el aire
Dim minu0 As Word ' minutos que lleva apagado el aire

'Valor Inicial de las Variables --------------------------------------------
'tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
'tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
'prog = 1 'Programa en curso
'dias = 0 'Dias en curso
'hora = 0 'Hora en curso
'minu = 0 'Minuto en curso
segu = 0 'Auxiliar, para calcular los minutos
paso = 1 'Segundos entre lecturas de Temperatura.

pti1(1) = 8 'Programa 1, tiempo 1 (Horas)
pti2(1) = 16 'Programa 1, tiempo 2 (Horas)
pte1(1) = 20 'Programa 1, Temperatura Tiempo 1
pte2(1) = 20 'Programa 1, Temperatura Tiempo 2
plu1(1) = 1 'Programa 1, Luces Tiempo 1 (1=ON)
plu2(1) = 0 'Programa 1, Luces Tiempo 2 (1=ON)

pti1(2) = 8 'Programa 2, tiempo 1 (Horas)
pti2(2) = 16 'Programa 2, tiempo 2 (Horas)
pte1(2) = 25 'Programa 2, Temperatura Tiempo 1
pte2(2) = 25 'Programa 2, Temperatura Tiempo 2
plu1(2) = 1 'Programa 2, Luces Tiempo 1 (1=ON)
plu2(2) = 0 'Programa 2, Luces Tiempo 2 (1=ON)

pti1(3) = 8 'Programa 3, tiempo 1 (Horas)
pti2(3) = 16 'Programa 3, tiempo 2 (Horas)
pte1(3) = 20 'Programa 3, Temperatura Tiempo 1
pte2(3) = 30 'Programa 3, Temperatura Tiempo 2
plu1(3) = 1 'Programa 3, Luces Tiempo 1 (1=ON)
plu2(3) = 0 'Programa 3, Luces Tiempo 2 (1=ON)

tiemp = 0 'Tiempo actual: Hora*60+Minutos.
tiempf0 = 0
aireok = 1
minua = 0 'Minutos que lleva encendido el Aire.


'---- Leo los valores de la EEPROM ----
Read 1, prog 'Programa actual
Read 2, dias 'Dias en curso
Read 3, hora 'Hora en curso
Read 4, minu 'Minuto en curso
Read 6, tmax
Read 7, tmin




'Inicializo Puertos
AllDigital

TRISA = %00010000 '0 = salida
TRISB = %11111111 '0 = salida
PORTB = 0 ' PORTB todo en 0

'Declaro los "alias" a usar en el programa:
Symbol ds1820pin = PORTA.4 'Puerto en que se conecta el DS1820
Symbol ds1820rw = TRISA.4 '1=Leer DS1820 / 0=Escribir DS1820
'Estado inicial Reles y Display. -------------------------------------------
Symbol ventilador = PORTA.3
Symbol luz = PORTA.2
Symbol frio = PORTA.0
Symbol calor = PORTA.1
Symbol pprog = PORTB.6
Symbol preset = PORTB.7

ventilador = 0
luz = 0
frio = 0
calor = 0

'Configuro el puerto para el LCD:
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

'Inicializo el LCD
Lcdinit 0 'Cursor apagado
WaitMs 500
Lcdout "Cont. automatico"
Lcdcmdout LcdLine2Home
Lcdout "(www.neoteo.com)"
WaitMs 5000
Lcdcmdout LcdClear

'Veo si es la primera vez que se conecta el aparato, para
'poner la eeprom en cero
If prog = 255 Then
prog = 1
Gosub cambioprog
Endif

'Veo si se pulso la tecla de cambio de programa--------

'Lcdout "P", #prog
For i = 1 To 25
Gosub leopulsadores
WaitMs 40
Next i

'----------------------------------------------------------
'-- CUERPO DEL PROGRAMA
'----------------------------------------------------------
loop:
'Calculo la "hora" actual (cantidad de minutos)--------
tiemp = hora * 60 + minu

'Leo la temperatura del sensor ------------------------
Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820

comando = 0x44 'Comienzo la conversion A/D de la temperatura
Gosub write1820
WaitUs 2000 ' Espero a que termine la conversion

Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820
comando = 0xbe 'Pido que me envie lo que calculo el sensor...
Gosub write1820
WaitMs 750 ' Espero ...
Gosub read1820 'Me lo devuelve en tempe1 y tempe2

'Actualizo y muestro Tempe1, TMax y TMin --------------
If tmax < tempe1 Then
tmax = tempe1
Write 6, tmax
Endif

If tmin > tempe1 Then
tmin = tempe1
Write 7, tmin
Endif



'Actualizo Hora y Minu , y los muestro ----------------
segu = segu + paso
If segu > 59 Then
minu = minu + 1
Write 4, minu
segu = 0
If minu > 59 Then
minu = 0
hora = hora + 1
Write 3, hora
If hora > 23 Then
dias = dias + 1
Write 2, dias
tiempf0 = 0
hora = 0
Endif
Endif
Endif


'Enciendo/Apago la luz, Aire, etc del programa en curso

auxw = pti1(prog) * 60
If tiemp < auxw Then 'Estoy en la primera parte del dia

'Enciendo/Apago la luz-------------------------------------------
If plu1(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte1(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte1(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte1(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte1(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte1(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif



Else 'Estoy en la segunda parte del dia
'Enciendo/Apago la luz-------------------------------------------
If plu2(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte2(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte2(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte2(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte2(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte2(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif


Endif '---Fin analisis Programa -------

'---------------------------------------------------
'Veo si pasaron 5 minutos de la ultima vez que se
'apago el aire

aux = tiempf0 + 4
If tiemp > aux Then
aireok = 1
Endif
If tiemp > 1438 Then 'casi medianoche
aireok = 1
Endif

'---------------------------------------------------
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog, " "

If luz = 1 Then
Lcdcmdout LcdLine1Pos(5)
Lcdout "L"
Endif
If frio = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "F"
Endif
If calor = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "C"
Endif
If ventilador = 1 Then
Lcdcmdout LcdLine1Pos(7)
Lcdout "V"
Endif

Lcdcmdout LcdLine1Pos(9)
Lcdout "00:00:00"
If minu > 9 Then
Lcdcmdout LcdLine1Pos(15)
Else
Lcdcmdout LcdLine1Pos(16)
Endif
Lcdout #minu

If hora > 9 Then
Lcdcmdout LcdLine1Pos(12)
Else
Lcdcmdout LcdLine1Pos(13)
Endif
Lcdout #hora

If dias > 9 Then
Lcdcmdout LcdLine1Pos(9)
Else
Lcdcmdout LcdLine1Pos(10)
Endif
Lcdout #dias

'Veo si se movio la llave de cambio de programa--------
Gosub leopulsadores
Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
WaitMs 180
Goto loop


End
leopulsadores:
'Veo si se pulso la tecla o es un ruido -------
If pprog = 1 Then
WaitMs 50
If pprog = 1 Then
prog = prog + 1
If prog = 4 Then
prog = 1
Endif
Gosub cambioprog
Endif
Endif

'Veo si se resetearon TMax y TMin
If preset = 1 Then
WaitMs 50
If preset = 1 Then
tmax = 0
tmin = 99
Endif

Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
Endif
Return

cambioprog:
'Muestro el programa actual en el display
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog
Write 1, prog
tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
Write 6, tmax
Write 7, tmin
dias = 0 'Dias en curso
hora = 0 'Hora en curso
minu = 0 'Minuto en curso
Write 2, dias
Write 3, hora
Write 4, minu
segu = 0 'Auxiliar, para calcular los minutos
tiempf0 = 1
ventilador = 0
luz = 0 'Rele Luces
frio = 0 'Rele Frio
calor = 0 'Rele Calor
Return
'-------------------------------------------------
'Inicializa el DS1820
'-------------------------------------------------
init1820:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0 'Pongo en cero el pin del DS1820
WaitUs 500 ' Espero mas de 480 us
ds1820rw = 1 ' Pongo el pin como entrada
WaitUs 100 ' Espero mas de 60 us a que "reaccione"
WaitUs 500 ' Espero a que finalice de enviarme el estado
Return

'-------------------------------------------------
'Envia comandos al DS1820
'-------------------------------------------------
write1820:
For aux = 1 To 8 'Recorro los 8 bits de "Comando"
If comando.0 = 0 Then
Gosub write0
Else
Gosub write1
Endif
comando = ShiftRight(comando, 1)
Next aux
Return

'-------------------------------------------------
'Envia un cero al DS1820
'-------------------------------------------------
write0:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 60 'hay que mantener bajo el pin mas 60 us
ds1820rw = 1
Return

'-------------------------------------------------
'Envia un uno al DS1820
'-------------------------------------------------
write1:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1 'hay que mantener bajo el pin menos de 15 60 us
ds1820rw = 1
WaitUs 60 'espero el resto del tiempo...
Return

'-------------------------------------------------
'Lee temperatura del DS1820
'-------------------------------------------------
read1820:
For aux = 1 To 16 ' los 16 bits de temp (word)
tempe = ShiftRight(tempe, 1)
Gosub readbit
Next aux
'Calculo la temperatura(tempe1) y las decimas (tempe2)
tempe1 = ShiftRight(tempe.LB, 1)
tempe1 = 128 - tempe1

If tempe.0 = 1 Then
tempe2 = 0
Else
tempe2 = 5
Endif
Return

'-------------------------------------------------
'Lee un bit del DS1820
'-------------------------------------------------
readbit:
tempe.15 = 1
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1
ds1820rw = 1
If ds1820pin = 1 Then
tempe.15 = 0
Endif
WaitUs 60
Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Noviembre de 2010, 07:19:05
No son errores, son avisos de que declaras unas variables las cuales no usas en el programa y, por lo tanto para ahorrar memoria el compilador ignora el código cuando compilas. Puedes deshabilitar el aviso y que te las compile de todas formas.
A eso se le llama código redundante; que es el código que no hace nada en el programa y si se elimina no afecta, o también aquel que se repite varias veces y simplemente con una sola vez que se declare es suficiente.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Mr.pelax en 18 de Noviembre de 2010, 12:30:13
hola muchas gracias .. ja era una duda tonta a veces me pierdo :mrgreen:pero me surgue la duda no logro hacerlo simular en el pic Simulador IDE. .. si me dan una mano se los agradesco:)

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Noviembre de 2010, 21:10:43
Hola necesio que me ayuden con el siguiente codigo ya que al compilarle con el pic sumulator ide me da los siguientes errores

Line 7: Unused declaration. Not compiled: Dim j1 As Byte
Line 8: Unused declaration. Not compiled: Dim j2 As Byte
Line 11: Unused declaration. Not compiled: Dim text(16) As Byte
Line 35: Unused declaration. Not compiled: Dim tempeaux(3) As Byte 'Temperatura auxiliar
Line 39: Unused declaration. Not compiled: Dim minu0 As Word 'minutos que lleva apagado el aire

espero que me puedan ayudar ya que BASIC no me llevo tan bien. :oops:



Código: [Seleccionar]
'Ejemplo de programación del sistema de control electrónico de luz y temperatura.
'Versión con pulsador para seleccionar el programa 1,2 o 3'y Pulsador para resetear Max/Min
'-------------------------------------------
'Declaracion de Variables
Dim i As Byte ' Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word ' Variable tipo Word multiproposito
Dim aux As Word ' Variable tipo Byte multiproposito
Dim text(16) As Byte

Dim tmax As Byte ' Valor de la temperatura Maxima Registrada en el ciclo
Dim tmin As Byte ' Valor de la temperatura Minima Registrada en el ciclo
Dim prog As Byte ' Programa en curso
Dim dias As Byte ' Dias en curso
Dim hora As Byte ' Hora en curso
Dim minu As Byte ' Minuto en curso
Dim segu As Byte ' Minuto en curso
Dim paso As Byte ' Segundos entre lecturas de Temperatura.

Dim pti1(3) As Byte 'Comienzo tiempo 1
Dim pti2(3) As Byte 'comienzo tiempo 2
Dim pte1(3) As Byte 'Temperatura Tiempo 1
Dim pte2(3) As Byte 'Temperatura Tiempo 2
Dim plu1(3) As Byte 'Luces Tiempo 1
Dim plu2(3) As Byte 'Luces Tiempo 2

Dim tiemp As Word 'Tiempo actual: Hora*60+Minutos
Dim aireok As Bit '1 = puedo usar el aire
Dim tiempf0 As Word 'tiempo que hace que prendí el aire

Dim comando As Byte 'Comando a enviar al DS1820
Dim tempe As Word 'Temperatura leida
Dim tempeaux(3) As Byte 'Temperatura auxiliar
Dim tempe1 As Byte 'PArte entera de la temperatura a mostrar
Dim tempe2 As Byte ' Decimales de la tempertatura a mostrar
Dim minua As Word ' minutos que lleva encendido el aire
Dim minu0 As Word ' minutos que lleva apagado el aire

'Valor Inicial de las Variables --------------------------------------------
'tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
'tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
'prog = 1 'Programa en curso
'dias = 0 'Dias en curso
'hora = 0 'Hora en curso
'minu = 0 'Minuto en curso
segu = 0 'Auxiliar, para calcular los minutos
paso = 1 'Segundos entre lecturas de Temperatura.

pti1(1) = 8 'Programa 1, tiempo 1 (Horas)
pti2(1) = 16 'Programa 1, tiempo 2 (Horas)
pte1(1) = 20 'Programa 1, Temperatura Tiempo 1
pte2(1) = 20 'Programa 1, Temperatura Tiempo 2
plu1(1) = 1 'Programa 1, Luces Tiempo 1 (1=ON)
plu2(1) = 0 'Programa 1, Luces Tiempo 2 (1=ON)

pti1(2) = 8 'Programa 2, tiempo 1 (Horas)
pti2(2) = 16 'Programa 2, tiempo 2 (Horas)
pte1(2) = 25 'Programa 2, Temperatura Tiempo 1
pte2(2) = 25 'Programa 2, Temperatura Tiempo 2
plu1(2) = 1 'Programa 2, Luces Tiempo 1 (1=ON)
plu2(2) = 0 'Programa 2, Luces Tiempo 2 (1=ON)

pti1(3) = 8 'Programa 3, tiempo 1 (Horas)
pti2(3) = 16 'Programa 3, tiempo 2 (Horas)
pte1(3) = 20 'Programa 3, Temperatura Tiempo 1
pte2(3) = 30 'Programa 3, Temperatura Tiempo 2
plu1(3) = 1 'Programa 3, Luces Tiempo 1 (1=ON)
plu2(3) = 0 'Programa 3, Luces Tiempo 2 (1=ON)

tiemp = 0 'Tiempo actual: Hora*60+Minutos.
tiempf0 = 0
aireok = 1
minua = 0 'Minutos que lleva encendido el Aire.


'---- Leo los valores de la EEPROM ----
Read 1, prog 'Programa actual
Read 2, dias 'Dias en curso
Read 3, hora 'Hora en curso
Read 4, minu 'Minuto en curso
Read 6, tmax
Read 7, tmin




'Inicializo Puertos
AllDigital

TRISA = %00010000 '0 = salida
TRISB = %11111111 '0 = salida
PORTB = 0 ' PORTB todo en 0

'Declaro los "alias" a usar en el programa:
Symbol ds1820pin = PORTA.4 'Puerto en que se conecta el DS1820
Symbol ds1820rw = TRISA.4 '1=Leer DS1820 / 0=Escribir DS1820
'Estado inicial Reles y Display. -------------------------------------------
Symbol ventilador = PORTA.3
Symbol luz = PORTA.2
Symbol frio = PORTA.0
Symbol calor = PORTA.1
Symbol pprog = PORTB.6
Symbol preset = PORTB.7

ventilador = 0
luz = 0
frio = 0
calor = 0

'Configuro el puerto para el LCD:
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 5
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Define LCD_RWREG = 0
Define LCD_RWBIT = 0

'Inicializo el LCD
Lcdinit 0 'Cursor apagado
WaitMs 500
Lcdout "Cont. automatico"
Lcdcmdout LcdLine2Home
Lcdout "(www.neoteo.com)"
WaitMs 5000
Lcdcmdout LcdClear

'Veo si es la primera vez que se conecta el aparato, para
'poner la eeprom en cero
If prog = 255 Then
prog = 1
Gosub cambioprog
Endif

'Veo si se pulso la tecla de cambio de programa--------

'Lcdout "P", #prog
For i = 1 To 25
Gosub leopulsadores
WaitMs 40
Next i

'----------------------------------------------------------
'-- CUERPO DEL PROGRAMA
'----------------------------------------------------------
loop:
'Calculo la "hora" actual (cantidad de minutos)--------
tiemp = hora * 60 + minu

'Leo la temperatura del sensor ------------------------
Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820

comando = 0x44 'Comienzo la conversion A/D de la temperatura
Gosub write1820
WaitUs 2000 ' Espero a que termine la conversion

Gosub init1820 'Inicializo el sensor y...
comando = 0xcc '..salteo la ROM.
Gosub write1820
comando = 0xbe 'Pido que me envie lo que calculo el sensor...
Gosub write1820
WaitMs 750 ' Espero ...
Gosub read1820 'Me lo devuelve en tempe1 y tempe2

'Actualizo y muestro Tempe1, TMax y TMin --------------
If tmax < tempe1 Then
tmax = tempe1
Write 6, tmax
Endif

If tmin > tempe1 Then
tmin = tempe1
Write 7, tmin
Endif



'Actualizo Hora y Minu , y los muestro ----------------
segu = segu + paso
If segu > 59 Then
minu = minu + 1
Write 4, minu
segu = 0
If minu > 59 Then
minu = 0
hora = hora + 1
Write 3, hora
If hora > 23 Then
dias = dias + 1
Write 2, dias
tiempf0 = 0
hora = 0
Endif
Endif
Endif


'Enciendo/Apago la luz, Aire, etc del programa en curso

auxw = pti1(prog) * 60
If tiemp < auxw Then 'Estoy en la primera parte del dia

'Enciendo/Apago la luz-------------------------------------------
If plu1(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte1(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte1(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte1(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte1(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte1(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif



Else 'Estoy en la segunda parte del dia
'Enciendo/Apago la luz-------------------------------------------
If plu2(prog) = 1 Then
luz = 1
Else
luz = 0
Endif

'Enciendo/Apago fuente de calor----------------------------------
If tempe1 < pte2(prog) Then
calor = 1
'ventilador = 1
Endif
If tempe1 = pte2(prog) Then
calor = 0
'ventilador = 0
Endif
If tempe1 > pte2(prog) Then
calor = 0
'ventilador = 0
Endif

'Enciendo/apago fuente de FRIO ------------------------------------------
If tempe1 > pte2(prog) And aireok = 1 Then 'si hace calor....
frio = 1 '..lo enciendo y
ventilador = 0
Endif
If tempe1 < pte2(prog) Then
frio = 0
ventilador = 1
tiempf0 = tiemp 'Tomo nota de la hora de apagado
aireok = 0
Endif


Endif '---Fin analisis Programa -------

'---------------------------------------------------
'Veo si pasaron 5 minutos de la ultima vez que se
'apago el aire

aux = tiempf0 + 4
If tiemp > aux Then
aireok = 1
Endif
If tiemp > 1438 Then 'casi medianoche
aireok = 1
Endif

'---------------------------------------------------
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog, " "

If luz = 1 Then
Lcdcmdout LcdLine1Pos(5)
Lcdout "L"
Endif
If frio = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "F"
Endif
If calor = 1 Then
Lcdcmdout LcdLine1Pos(6)
Lcdout "C"
Endif
If ventilador = 1 Then
Lcdcmdout LcdLine1Pos(7)
Lcdout "V"
Endif

Lcdcmdout LcdLine1Pos(9)
Lcdout "00:00:00"
If minu > 9 Then
Lcdcmdout LcdLine1Pos(15)
Else
Lcdcmdout LcdLine1Pos(16)
Endif
Lcdout #minu

If hora > 9 Then
Lcdcmdout LcdLine1Pos(12)
Else
Lcdcmdout LcdLine1Pos(13)
Endif
Lcdout #hora

If dias > 9 Then
Lcdcmdout LcdLine1Pos(9)
Else
Lcdcmdout LcdLine1Pos(10)
Endif
Lcdout #dias

'Veo si se movio la llave de cambio de programa--------
Gosub leopulsadores
Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
WaitMs 180
Goto loop


End
leopulsadores:
'Veo si se pulso la tecla o es un ruido -------
If pprog = 1 Then
WaitMs 50
If pprog = 1 Then
prog = prog + 1
If prog = 4 Then
prog = 1
Endif
Gosub cambioprog
Endif
Endif

'Veo si se resetearon TMax y TMin
If preset = 1 Then
WaitMs 50
If preset = 1 Then
tmax = 0
tmin = 99
Endif

Lcdcmdout LcdLine2Home
Lcdout "T:", #tempe1, " M:", #tmax, " m:", #tmin, " "
Endif
Return

cambioprog:
'Muestro el programa actual en el display
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(1)
Lcdout "P", #prog
Write 1, prog
tmax = 0 'Valor de la temperatura Maxima Registrada en el ciclo
tmin = 99 'Valor de la temperatura Minima Registrada en el ciclo
Write 6, tmax
Write 7, tmin
dias = 0 'Dias en curso
hora = 0 'Hora en curso
minu = 0 'Minuto en curso
Write 2, dias
Write 3, hora
Write 4, minu
segu = 0 'Auxiliar, para calcular los minutos
tiempf0 = 1
ventilador = 0
luz = 0 'Rele Luces
frio = 0 'Rele Frio
calor = 0 'Rele Calor
Return
'-------------------------------------------------
'Inicializa el DS1820
'-------------------------------------------------
init1820:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0 'Pongo en cero el pin del DS1820
WaitUs 500 ' Espero mas de 480 us
ds1820rw = 1 ' Pongo el pin como entrada
WaitUs 100 ' Espero mas de 60 us a que "reaccione"
WaitUs 500 ' Espero a que finalice de enviarme el estado
Return

'-------------------------------------------------
'Envia comandos al DS1820
'-------------------------------------------------
write1820:
For aux = 1 To 8 'Recorro los 8 bits de "Comando"
If comando.0 = 0 Then
Gosub write0
Else
Gosub write1
Endif
comando = ShiftRight(comando, 1)
Next aux
Return

'-------------------------------------------------
'Envia un cero al DS1820
'-------------------------------------------------
write0:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 60 'hay que mantener bajo el pin mas 60 us
ds1820rw = 1
Return

'-------------------------------------------------
'Envia un uno al DS1820
'-------------------------------------------------
write1:
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1 'hay que mantener bajo el pin menos de 15 60 us
ds1820rw = 1
WaitUs 60 'espero el resto del tiempo...
Return

'-------------------------------------------------
'Lee temperatura del DS1820
'-------------------------------------------------
read1820:
For aux = 1 To 16 ' los 16 bits de temp (word)
tempe = ShiftRight(tempe, 1)
Gosub readbit
Next aux
'Calculo la temperatura(tempe1) y las decimas (tempe2)
tempe1 = ShiftRight(tempe.LB, 1)
tempe1 = 128 - tempe1

If tempe.0 = 1 Then
tempe2 = 0
Else
tempe2 = 5
Endif
Return

'-------------------------------------------------
'Lee un bit del DS1820
'-------------------------------------------------
readbit:
tempe.15 = 1
ds1820rw = 0 ' Pongo el pin como salida
ds1820pin = 0
WaitUs 1
ds1820rw = 1
If ds1820pin = 1 Then
tempe.15 = 0
Endif
WaitUs 60
Return

Imagino que no puedes simularlo por culpa de los Waitms. Para que puedas simular un Pic en tiempo real necesitas un súper ordenador. El Basic del PSI  contiene "Simulation_Waitms_Value" que insertado en el codigo acelera los Waitms, permitiendo la simulación.

'Ejemplo de programación del sistema de control electrónico de luz y temperatura.
'Versión con pulsador para seleccionar el programa 1,2 o 3'y Pulsador para resetear Max/Min
'-------------------------------------------
Define SIMULATION_WAITMS_VALUE = 1
'Declaracion de Variables
Dim i As Byte  'Variable tipo Byte multiproposito
Dim j1 As Byte
Dim j2 As Byte
Dim auxw As Word  'Variable tipo Word multiproposito
Dim aux As Word  'Variable tipo Byte multiproposito
Dim text(16) As Byte

.
.
.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 21 de Diciembre de 2010, 19:56:11
Varias veces me preguntaron si se pueden tener arrays (vectores) de varias dimensiones en el Basic del PSI. Lo que es el lenguaje hasta ahora no lo tiene implementado, pero podemos construirnos una función que nos simule el proceso, no queda tan lucida como una función interna del sistema, ya que necesitamos una variable de paso e indicar si escribiremos o leeremos el array, pero el caso es que la función nos permite trabajar con array de dos dimensiones.

La rutina esta declarada en el ejemplo como array(2,5).

Código: Visual Basic
  1. 'Rutina para trabajar con array de dos dimensiones (Vectores)
  2. 'By dogflu66
  3. '********************************************************************
  4. Dim x As Byte
  5. Dim y As Byte
  6. Dim n As Byte
  7.  
  8. AllDigital
  9. TRISA = 0
  10. TRISB = 0
  11.  
  12. main:
  13.         n = 0
  14.         For x = 0 To 1
  15.                 For y = 0 To 4
  16.                         max = n  'Valor a guardar
  17.                         Call max(x, y, "W")  'Actualiza array
  18.                         n = n + 1  'Valor a guardar
  19.                 Next y
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 0 To 1
  23.                 For y = 0 To 4
  24.                         Call max(x, y, "R")  'Lee array
  25.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  26.                 Next y
  27.         Next x
  28. 'Goto main
  29. End                                              
  30. 'Rutina para trabajar con arrays de dos dimensiones
  31. 'max = variable de paso
  32. 'i1 = Primer indice del array
  33. 'i2 = Segundo indice del array
  34. 'rw = "W" o "w" o 1 => Escribe en array
  35. 'rw = "R" o "r" o 0 => Lee del array
  36. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  37.         Const ind2 = 5  'Valor del indice2
  38.         Dim array(10) As Byte  'Se declara vector de longitud Indice1*indice2
  39.         Dim ind As Byte  'Indice del vector de trabajo
  40.         Dim aux As Byte  'Variable auxiliar
  41.         aux = ind2 - 1  'Valor de ajuste
  42.         If i1 > 0 Then aux = i1 * aux  'Ajuste si i1>0
  43.         If i1 = 0 Then aux = 0  'Ajuste si i1=0
  44.         ind = i1 + i2 + aux  'Calcula indice array
  45.         If rw = "R" Or rw = "r" Or rw = 0 Then max = array(ind)  'Lee array
  46.         If rw = "W" Or rw = "w" Or rw = 1 Then array(ind) = max  'Escribe array
  47. End Function

Dejo la foto de la simulacion:
(http://img820.imageshack.us/img820/6205/arrayenpsi.jpg)

Para seguir trabajando con vectores, en este caso, propongo una pequeña modificación a la función anterior. Esta modificación nos permitirá trabajar con la EEProm interna del Pic usando el clásico formato de tabla de 16 columnas por 16 filas o también 16 filas de 16 elementos cada una:


(http://img844.imageshack.us/img844/4954/tablaeeprom1.jpg)

La función:

Código: vb.net
  1. 'Función para trabajar con la EEProm interna del Pic como si fuera
  2. 'la clasica tabla de 16 columnas x 16 filas, o si preferimos
  3. '16 filas de 16 elementos cada una.
  4. 'By dogflu66
  5. '********************************************************************
  6. Dim x As Byte
  7. Dim y As Byte
  8. Dim n As Byte
  9. AllDigital
  10. TRISA = 0
  11. TRISB = 0
  12. main:
  13.         n = 0
  14.         For x = 00h To fh
  15.                 For y = 00h To fh
  16.                         max = n  'Valor a guardar
  17.                         Call max(x, y, "W")  'Actualiza array
  18.                         n = n + 1  'Valor a guardar
  19.                 Next y
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 00h To fh
  23.                 For y = 00h To fh
  24.                         Call max(x, y, "R")  'Lee array
  25.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  26.                 Next y
  27.         Next x
  28. 'Goto main
  29. End                                              
  30. 'Rutina para trabajar con la tipica tabla de memoria de 0xh a Fxh to x0h a xFh
  31. 'Se considera que la memoria EEProm del Pic es un vector de 256 elementos.
  32. 'max = variable de paso
  33. 'i1 = Primer indice del array
  34. 'i2 = Segundo indice del array
  35. 'rw = "W" o "w" o 1 => Escribe en array
  36. 'rw = "R" o "r" o 0 => Lee del array
  37. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  38.         Const ind2 = 16  'Número de columnas o también número de elementos por fila
  39.         Dim ind As Byte  'Indice del vector de trabajo
  40.         ind = i1 + i2 + (i1 * (ind2 - 1))  'Calcula indice array, se considera que la EEProm es un vector de 256 elementos
  41.         If rw = "R" Or rw = "r" Or rw = 0 Then Read ind, max  'Lee array, dirección memoria EEProm
  42.         If rw = "W" Or rw = "w" Or rw = 1 Then Write ind, max  'Escribe array, dirección memoria EEProm
  43. End Function

PD. He simplificado la función.

PD. Se me fue la mano en el numero de elementos del array 01/2011

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Diciembre de 2010, 11:31:56
Otra de vectores:

Como sabéis el Basic del PSI tiene limitado la longitud de los vectores (declaraciones de array de variables con Dim), a la longitud del banco de memoria donde será alojado (128 byte), esto no es así por capricho,  sencillamente se ajusta a la arquitectura del Pic, la memoria ram del PIC esta dividida en paginas o bancos de memoria y, estos a su vez están divididos en zonas donde encontramos los registros reservados que se utilizan para configurar periféricos del PIC entre otras cosas. Que dando los registros de propósito general, los cuales quedan a nuestra disposición salvo algunos que ocupa la estructura interna del Basic del PSI para poder ejecutar nuestro programa sin perderse.

Así que siguiendo con el tipo de funciones anteriores, la he modificado para crear un array unidimensional que utiliza los dos últimos bancos de memoria Ram (Bank 2 y Bank 3), la rutina los ensambla permitiéndonos tener un array de 224 elementos de un Byte cada uno que va desde el 0 al 223.

Para poder realizar la tarea hay que trabajar directamente con direcciones de memoria, he utilizado la función de programación avanzada del Basic PSI que nos lo permite “Pointer”.

El Programa:

Código: vb.net
  1. 'Rutina para trabajar con array de una dimensión (Vectores)
  2. 'Une los bancos de memoria de datos 2 y 3 para usar los registros
  3. 'de proposito general de estos bancos como si fueran un unico vector.
  4. 'By dogflu66
  5. '********************************************************************
  6. Dim x As Byte
  7. Dim n As Byte
  8.  
  9. AllDigital
  10. TRISA = 0
  11. TRISB = 0
  12.  
  13. main:
  14.         n = 0
  15.         For x = 0 To 223
  16.                 max = n  'Valor a guardar
  17.                 Call max(x, "W")  'Actualiza array
  18.                 n = n + 1  'Valor a guardar
  19.                 If n > 15 Then n = 0
  20.         Next x
  21.         Serout RB0, 9600, CrLf  'Linea en blanco
  22.         For x = 0 To 223
  23.                 Call max(x, "R")  'Lee array
  24.                 Serout RB0, 9600, "max(", #x, ")=", #max, CrLf  'Imprime valores
  25.         Next x
  26. 'Goto main
  27. End                                              
  28. 'Rutina para trabajar con arrays de una dimension para Pic16F88
  29. 'Une los registros de proposito general de dos bancos
  30. 'de memoria de datos en un solo vector de 224 elementos (Bank 2 + Bank3)
  31. 'max = variable de paso
  32. 'i1 = Primer indice del array
  33. 'rw = "W" o "w" o 1 => Escribe en array
  34. 'rw = "R" o "r" o 0 => Lee del array
  35. Function max(i1 As Word, rw As Byte) As Byte
  36.         Const ini = 110h  'Principio del primer banco de memoria, en este caso Bank 2
  37.         Const dis = 32  'Numero de elementos discontinuos entre los bancos -1
  38.         Dim ind As Word  'Indice del array
  39.         ind = i1 + ini  'Calcula indice array (0 to 223)
  40.         If ind > 16fh And ind < 190h Then ind = ind + dis  'Une los bancos de memoria
  41.         If rw = "R" Or rw = "r" Or rw = 0 Then max = Pointer(ind)  'Lee dato
  42.         If rw = "W" Or rw = "w" Or rw = 1 Then Pointer(ind) = max  'Escribe dato
  43. End Function
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Diciembre de 2010, 21:11:21
Y aquí dejo el penúltimo programa sobre vectores y vectores de vectores (listas), en este caso la función que complementa el anterior ejemplo con dos dimensiones.
Definido en el ejemplo como array(14, 14):

Código: vb.net
  1. 'Rutina para trabajar con array de dos dimensiones (Vectores)
  2. 'Une los bancos de memoria de datos 2 y 3 para usar los registros
  3. 'de proposito general de estos bancos como si fueran un unico vector.
  4. 'By dogflu66
  5. '********************************************************************
  6. Dim x As Byte
  7. Dim y As Byte
  8. Dim n As Byte
  9.  
  10. AllDigital
  11. TRISA = 0
  12. TRISB = 0
  13.  
  14. main:
  15.         n = 0
  16.         For x = 0 To 13
  17.                 For y = 0 To 13
  18.                         max = n  'Valor a guardar
  19.                         Call max(x, y, "W")  'Actualiza array
  20.                         n = n + 1  'Valor a guardar
  21.                         If n > 13 Then n = 0
  22.                 Next y
  23.         Next x
  24.         Serout RB0, 9600, CrLf  'Linea en blanco
  25.         For x = 0 To 13
  26.                 For y = 0 To 13
  27.                         Call max(x, y, "R")  'Lee array
  28.                         Serout RB0, 9600, "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  29.                 Next y
  30.         Next x
  31. 'Goto main
  32. End                                              
  33. 'Rutina para trabajar con arrays de dos dimensiones para Pic16F88
  34. 'Une los registros de proposito general de dos bancos de
  35. 'memoria de datos en un solo vector de 224 elementos (Bank 2 + Bank3)
  36. 'max = variable de paso
  37. 'i1 = Primer indice del array
  38. 'i2 = Segundo indice del array
  39. 'rw = "W" o "w" o 1 => Escribe en array
  40. 'rw = "R" o "r" o 0 => Lee del array
  41. Function max(i1 As Word, i2 As Byte, rw As Byte) As Byte
  42.         Const ind2 = 14  'Valor del indice2, numero de elementos por fila
  43.         Const ini = 110h  'Principio del primer banco de memoria, en este caso Bank 2
  44.         Const dis = 32  'Numero de elementos discontinuos entre los bancos -1
  45.         Dim ind As Word  'Indice del array
  46.         ind = (i1 + i2 + (i1 * (ind2 - 1))) + ini  'Calcula indice array (0 to 223)
  47.         If ind > 16fh And ind < 190h Then ind = ind + dis  'Une los bancos de memoria
  48.         If rw = "R" Or rw = "r" Or rw = 0 Then max = Pointer(ind)  'Lee dato
  49.         If rw = "W" Or rw = "w" Or rw = 1 Then Pointer(ind) = max  'Escribe dato
  50. End Function

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 07 de Enero de 2011, 09:37:47
Ya se que estoy siendo un poquito pesado, pero esto es lo que tiene por querer aprender.
Asi que aprovechando de su amabilidad, tengo una pregunta mas:

Tengo una señal de entrada por un pin de un puerto (al fin y al cabo es un bit de un puerto) y lo quiero comparar con una constante que es un bit(y por tanto solo toma valores 0 y 1, lo mismo que el la señal de entrada).

El caso es que si hago:If estado_presostato(que es la constante)= presostato_secado(que es la entrada del pin) Then... Entonces el compilador PSI me da le siguiente error: "Argument 'presostato_secado' is not valid bit constant"

Pensé que se podia realizar esa comparación , pero evidentemente "presostato_secado" no es una constante, ya que es un bit que pertenece al byte del puerto entero.

¿Alguna sugerencia, de como comparar esos valores?
Gracias de antemano
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Enero de 2011, 11:31:50
Pues ese error que me indicas creo que seda cuando hay una comparación de registros de tipos distintos.
Los BIT solo se pueden comparar con BIT:

dim n as byte
dim j as bit
If RA0 = 1 Then n = 1
If RA0 = j Then n = 0

PD. De pesado para nada, lo que ocurre es que algunas veces mis repuestas pueden hacerme parecer seco o muy seco,  :x, pero es porque lo mismo estoy con un proceso que me deja 5 o 6 minutos libres en el curro, y contesto rapidamente desde el trabajo. :D
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 07 de Enero de 2011, 14:24:17
De pesado para nada, lo que ocurre es que algunas veces mis repuestas pueden hacerme parecer seco o muy seco,  :x, pero es porque lo mismo estoy con un proceso que me deja 5 o 6 minutos libres en el curro, y contesto rapidamente desde el trabajo. :D
Si decia lo de pesado era por la cantidad de preguntas, no por las repuestas ni por la forma de las mismas, ya que siempre me han ayudado mucho.

Con respecto a tu propuesta, entiendo que lo deberia de realizar es una vez leido el pin del puerto asignar su valor a una variable y despues comparar enrtre si ya los dos valores de las variables ¿Es eso?

Gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 07 de Enero de 2011, 14:32:44
Si y No, se puede de las dos maneras.

Const k1 = 0
Dim bytes As Byte
Dim n As Byte
Dim j As Bit
Symbol k2 = RA0
bytes = 0
If RA0 = 1 Then n = 1
If RA0 = j Then n = 0
If k2 = 1 Then n = 0
If k2 = k1 Then n = 0
bytes.0 = RA0  'Requiere cambio de tipos
bytes = RA0  'ERROR al compilar
If RA0 = bytes.0 Then n = 1
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 07 de Enero de 2011, 16:12:36
Gracias de nuevo por la respuesta y gracias a ellas adjunto el proyecto terminado y probado.
Esta realizado con un PIC16F887 y probado sobre una tarjeta de desarrollo(trainer) realizada por mi. Ahora empezaré a dibujar la tarjeta definitiva a montar en el equipo final. Basicamnete el programa es una máquina de estados.
Adjunto el programa completo. De momento no tiene comunicaciones que se las pondré mas adelante. ¡¡¡ Por estas vacaciones creo que está bien lo realizado!!! ;-).
Esperaré unos dias a que termine la pcb (cuando la temine incluiré las correspondientes fotos)y me pondré con ellas. Espero que me sigan echando una manita. Para un sistema embarcado en ferrocarril, evitando comunicaciones MVB ¿Cual me dirian que serian las mas adecuadas e insensibles a todo tipo de ruidos? ¿Quizás CAN?
Bueno les dejo unas breves caracteristicas del proyecto:
Código: [Seleccionar]
Equipo de control para un motocompresor. Éste motocompresor dispone en la parte del compresor
de unos presostatos(mínima y máxima) para supervisar la generacion de la presión. Tambien dispone
 de un sensor de temperatura para controlar la temperatura del aceite del carter del compresor.
Por otra parte para el control del motor se utiliza el correspondiente contactor trifásico 400V a.c. con
las correspondientes protecciones térmicas.
La tarjeta de control además procesa las señales de puesta en marcha y parada; vigila cuando se produce
 una falta de tensión alterna o está fuera de un valor; y la señal de rearme de averías.
El sistema motocompresor también lleva incorporado un sistema para secar el aire generado por el motocompresor.
Ésta opción se vigila también con la tarjeta de control.
No dispone de comunicaciones que se incluirán más adelante.
Saludos y muchas gracias por las ayudas recibidas.
F.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Enero de 2011, 08:28:17
Felicidades Fermín quedare a la espera de noticias. De todas formas te recuerdo que  para los que nos dedicamos a esto, el terminar el código que realiza la acción deseada solo es una parte. Hay otro código que hay que insertar que es el encargado de proveer de las protecciones contra interferencias por Software, y otro no menos importante, el más importante según mi criterio y al que no se le da en general mucha importancia en los foros, sobretodo por la nueva moda de las simulaciones en las que se reduce el hardware a la mínima expresión, quedando un hard inútil y que engaña totalmente al que comienza en estos temas. No basta con un simple hardware en el que se pueda ubicar nuestro código, también este hard tiene que tener su correspondiente extra de elementos para las protecciones contra interferencias. Si no tenemos en cuenta estas dos opciones corremos el riesgo que nuestro proyecto solo funcione en nuestras casas.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 08 de Enero de 2011, 09:29:54
Efectivamente Carlos, estoy contigo respecto a todo el tema de las protecciones, sobre todo en un ambiente tan hostil como es el ferrocarril.
Para el hardware ten cuenta que para poder embarcar un producto, este debe de cumplir con la norma EN50155. Entre otras cosas como el rango de temperatura(-40ºC.... +85ºC minimo) hay otros requisitos sobre todo de compatibilidad electromagnetica y te aseguro, ya que he tenido que pasar algunas pruebas en laboratorios, que estas son muy duras.
Para ello, a nivel de hardware, entre otras hay que añadir por ejemplo a la fuente de alimentacion los correspondientes filtros y para las señales de I/O tambien protegerlas adecuadamente.

De momento, digamos que el nucleo principal, programa adjuntado, estaría mas o menos listo, falta pulir y proteger como bien dices. Pero a partir del mismo, es desde donde debo seguir con el desarrollo del proyecto, que segun vaya avanzando iré publicando.
¿Crees que la comunicacion por CAN puede ser un modelo adecuado para este tipo de aplicaciones?¿se puede implementar con PSI?.
Aunque no se, quizas para seguir tambien aprendiendo, empiece por una comunicacion sencilla, a base de RS232, aunque se que el alcance no es grande o bien me decante por un RS485. Tengo unos dias para pensar y valorar.
F.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Enero de 2011, 10:18:59
Te recomiendo el dirver RS485 ya que es compatible con la uart del PIC. Tienes que inventar un protocolo que controle el Pin de Tx/Rx del chip (comunicación bidireccional half duplex). De hecho este protocolo es prácticamente el mismo para trabajar posteriormente si fuera necesario con  módulos de RF. Lo que sí tendrás es que utilizar cable apantallado, ya que incluso el drive RS485 puede llegar a tomar interferencias, pero con un protocolo adecuado de petición de tramas de datos erróneas va bien. De todas formas recomiendo que estudies todas las posibilidades.
Revisa el indice del hilo, ya hay algo de info soble problemas que te puedes encontrar, y sobre la conexion del driver a la uart del pic.

Las interferencias en el cable de datos no tienen la importancia sobre el drive RS485, este las suele tolerar muy bien, es más bien, porque pueden entrar en nuestra placa a través de él e interferir en el clock del micro por ejemplo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 08 de Enero de 2011, 14:48:37
Revisaré el hilo y tomaré en cuenta las indicaciones.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Enero de 2011, 18:20:21
El ultimo ejemplo sobre arrays, este ejemplo se implementa en una memoria Ram I2C PCF8570T (I2CRam), la ventaja de este tipo de chip con interfase I2C es que se escribe y se lee a la misma velocidad del bus. Que lo hace interesante para datalogger o simplemente como expansión de memoria de datos del usuario.

Código: vb.net
  1. 'Rutina para trabajar con I2CRam (PCF8570T) como array 2 dimensiones
  2. 'Definido como tabla de 16x16
  3. 'By dogflu66 para EBasic
  4. '********************************************************************
  5. Define CONF_WORD = 0x2f10
  6. Define CONF_WORD_2 = 0x3ffd
  7. Define CLOCK_FREQUENCY = 8
  8. '********************************************************************
  9. Dim x As Byte
  10. Dim y As Byte
  11. Dim n As Byte
  12.  
  13. ANSEL = 0x00  'Los pin I/O digitales
  14. CMCON = 0x07  'Comparador a off
  15. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  16. TRISA = 0xff
  17. TRISB = 0xff
  18.  
  19. Hseropen 9600
  20. main:
  21.         n = 255
  22.         For x = 0 To fh
  23.                 For y = 0 To fh
  24.                         max = n  'Valor decreciente a guardar en la memoria
  25.                         Call max(x, y, "W")  'Actualiza array
  26.                         n = n - 1
  27.                 Next y
  28.         Next x
  29.         Hserout CrLf  'Linea en blanco
  30.         For x = 0 To fh
  31.                 For y = 0 To fh
  32.                         Call max(x, y, "R")  'Lee array
  33.                         Hserout "max(", #x, ",", #y, ")=", #max, CrLf  'Imprime valores
  34.                 Next y
  35.         Next x
  36. 'Goto main
  37. End                                              
  38. 'Rutina para trabajar con I2Cram (PCF8570) como arrays 2 dimension Pic16F88
  39. 'max = variable de paso
  40. 'i1 = Primer indice del array
  41. '21 = Segundo indice del array
  42. 'rw = "W" o "w" o 1 => Escribe en array
  43. 'rw = "R" o "r" o 0 => Lee del array
  44. Function max(i1 As Byte, i2 As Byte, rw As Byte) As Byte
  45.         Const ind2 = 16  'Número de columnas o también número de elementos por fila
  46.         Dim ind As Byte  'Indice del vector de trabajo
  47.         ind = i1 + i2 + (i1 * (ind2 - 1))  'Calcula indice array
  48.         If rw = "R" Or rw = "r" Or rw = 0 Then I2CRead RB1, RB4, 0xa0, ind, max  'Lee en el puerto I2C
  49.         If rw = "W" Or rw = "w" Or rw = 1 Then I2CWrite RB1, RB4, 0xa0, ind, max  'Escribe en el I2C
  50. End Function
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Amaro Pargo en 14 de Febrero de 2011, 16:15:00
Aquí les dejo un ejemplo de comunicación 1-Wire. Se me daba la dificultad de que para envíar al LCD un dato numérico, solo se puede hacer en decimal (anteponiendo # en la variable) por lo que para solucionarlo implementé una subrutina para la conversión a hexadecimal y mostrarlo en código ASCII en el LCD. Espero que les sirva de ayuda.

Código: [Seleccionar]
'****************************************************************
'*  Nombre     : 1-wire.bas                                     *
'*  Autor      : ARM (Tenerife-España)                          *
'*  Fecha      : 14/02/2011                                     *
'*  Version    : 1.0                                            *
'*  Compilador : Básic del Pic Simulator IDE v. 6.83            *
'*  Notas      : Este programa lee un dispositivo tipo 1-wire™  *
'*             : y muestra la familia, su ID y el CRC grabado   *
'*             : en la ROM y la muestra en un display LCD32     *
'****************************************************************
'Definición de la conexión del LCD: tipo 2x16, bus de 8 datos a
'través del puerto B, rs en RA0, e en RA1 y r/W en RA2
'----------------------------------------------------------------
Define LCD_LINES = 2  '2 filas
Define LCD_CHARS = 16  '16 columnas
Define LCD_BITS = 8  '4 bits
Define LCD_DREG = RB  'puerto a conectar los 4 bits
Define LCD_RSREG = RA  'puerto para rs
Define LCD_RSBIT = 1  'rb0 a rs
Define LCD_EREG = RA  'puerto para e
Define LCD_EBIT = 2  'rb1 a e
Define LCD_RWREG = RA  'puerto para r/W
Define LCD_RWBIT = 3  'rb2 a r/W
'Define LCD_READ_BUSY_FLAG = 1
'Definición de la frecuencia de reloj (4 MHz) y de la palabra de
'configuración: XT, CP off, PWRT On y Watchdog Timer off
'----------------------------------------------------------------
Define CONF_WORD = 0x3ff1
Define CLOCK_FREQUENCY = 4  'Se usa un oscilador de 4 MHz
'Definición del puerto y bit de conexión del dispositivo 1-Wire™
'----------------------------------------------------------------
Define 1WIRE_REG = PORTA
Define 1WIRE_BIT = 0
'Asignación de variables
'----------------------------------------------------------------
Dim id(8) As Byte
Dim index As Byte
Dim dig1 As Byte
Dim dig2 As Byte
Dim x As Byte
'Inicialización de dispositivos (LCD)
'----------------------------------------------------------------
Lcdinit  'Inicializa el LCD
WaitMs 500  'Pausa de 1/2 segundo para estabilizar el LCD
'Programa principal
'----------------------------------------------------------------
main:
'Iniciar la comunicación y ordenar la lectura ($33 = Leer ROM):
1wireInit  'Inicializa el bus de comunicación 1-Wire™
1wireSendByte 0x33  'Envía comando $33 al dispositivo esclavo
WaitMs 1  'Pausa de 1 milisegundo
'Obtener la ID:
For x = 0 To 7  'Bucle para la lectura del código ROM completo
1wireGetByte id(x)  'Lee 1 byte y lo almacena en el array
Next x  'repite el bucle hasta completar las 8 lecturas
'Enviar ROM al lcd:
Lcdout "Familia = "  'Mostrar en el LCD
x = 0  'Primer índice del array a visualizar (tipo de familia)
Gosub mostrar_hexadecimal  'Rutina de conversión a hexadecimal
Lcdcmdout LcdLine2Home  'Cursor a la 1ª posición de la 2ª linea
For x = 6 To 1 Step -1  'Los 6 siguientes índices del array (ID)
Gosub mostrar_hexadecimal  'Rutina de conversión a hexadecimal
Next x  'Repite el bucle hasta mostrar los 6 bytes del ID
Lcdout "-"  'Mostrar en el LCD
x = 7  'Último  índice del array a visualizar (CRC)
Gosub mostrar_hexadecimal  'Rutina de conversión a hexadecimal
End  'Fin del programa                           
'Rutina de conversión a hexadecimal y visualizado en LCD
'----------------------------------------------------------------
mostrar_hexadecimal:
index = id(x) / 16  'Cálculo del primer dígito en hexadecimal,
dig1 = LookUp("0123456789ABCDEF"), index  'y su obtención
index = id(x) Mod 16  'Cálculo del segundo dígito en hexadecimal,
dig2 = LookUp("0123456789ABCDEF"), index  'y su obtención
Lcdout dig1, dig2  'Mostrar la conversión en el LCD
Return  'Regresa de la subrutina
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Febrero de 2011, 21:20:28
Hola Amaro Pargo, no puedo compilar el codigo, me tira error. Parece que falta la etiqueta de la subrutina "mostrar_hexadecimal".
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: michelelectro en 16 de Febrero de 2011, 19:26:03
Hola todos bueno tengo un GLCD  controlador k180s  y bueno la cuestión es quiero subirle imágenes y e buscado el dicho generador todopic  pero nada no lo e encontrado pido ayuda aver quien me lo puede sapasar   es pero sus respuestas .... :)gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 17 de Febrero de 2011, 06:35:08
¿Pero que programa?

Si no indicas que ¡¡ ¡no podremos echar una mano!!! ;-)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Amaro Pargo en 22 de Febrero de 2011, 20:03:15
Hola Amaro Pargo, no puedo compilar el codigo, me tira error. Parece que falta la etiqueta de la subrutina "mostrar_hexadecimal".

Uy!, es verdad. Se me quedó atrás la etiqueta de la subrutina al hacer copy-paste. Disculpa dogflu66. Pongo de nuevo el código:

Código: [Seleccionar]
Define LCD_Lines = 2  '2 filas
Define LCD_CHARS = 16  '16 columnas
Define LCD_BITS = 8  '4 bits
Define LCD_DREG = RB  'puerto a conectar los 4 bits
Define LCD_RSREG = RA  'puerto para rs
Define LCD_RSBIT = 1  'rb0 a rs
Define LCD_EREG = RA  'puerto para e
Define LCD_EBIT = 2  'rb1 a e
Define LCD_RWREG = RA  'puerto para r/W
Define LCD_RWBIT = 3  'rb2 a r/W
'Define LCD_READ_BUSY_FLAG = 1

Define CONF_WORD = 0x3ff1
Define CLOCK_FREQUENCY = 4  'Se usa un oscilador de 4 MHz

Define 1WIRE_REG = PORTA
Define 1WIRE_BIT = 0

Dim id(8) As Byte
Dim index As Byte
Dim dig1 As Byte
Dim dig2 As Byte
Dim x As Byte

Lcdinit
WaitMs 500  'Pausa de 1/2 segundo para estabilizar el LCD

iniciar_conversion:
1wireInit
1wireSendByte 0x33
WaitMs 1

obtener_id:
For x = 0 To 7
1wireGetByte id(x)
Next x

enviar_lcd:
Lcdout "Familia = "
x = 0
GoSub mostrar_hexadecimal
Lcdcmdout LcdLine2Home
For x = 6 To 1 Step -1
GoSub mostrar_hexadecimal
Next x
Lcdout "-"
x = 7
GoSub mostrar_hexadecimal

End  'Fin del programa                           

mostrar_hexadecimal:
index = id(x) / 16
dig1 = LookUp("0123456789ABCDEF"), index
index = id(x) Mod 16
dig2 = LookUp("0123456789ABCDEF"), index
Lcdout dig1, dig2
Return

Espero que ahora si puedas compilarlo. Dime que tal te fue.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Febrero de 2011, 22:43:07
Ahora si que compila, cuando tenga un rato libre le dedico un tiempo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: michelelectro en 05 de Abril de 2011, 20:34:32
Hola todos bueno tengo un GLCD  controlador k180s  y bueno la cuestión es quiero subirle imágenes y e buscado el dicho generador todopic  pero nada no lo e encontrado pido ayuda aver quien me lo puede sapasar   es pero sus respuestas .... :)gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 06 de Abril de 2011, 15:01:48
Hola; no te puedo ayudar en eso pero estoy interesado en saber si el modulo glcd que usas, es el de 128x64 y si lo estas manejando con el basic del PSI.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: michelelectro en 09 de Abril de 2011, 12:20:51
que tal..... claro que el glcd que estoy usando es de 128x64  y estoy QUE lo programa  con editor PROTON EDITOR (PBP_EDITOR)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: man3s en 21 de Julio de 2011, 21:24:49
Hola amigos del foro, soy nuevo en todopic, pues les cuento que hace 2 dias que he estado trabajando con el PIC SIMULATOR IDE, y me ha parecido estupendo, poco a poco le he agarrado a los detallitos pero hay uno que ya me trae loco  :5] y es el siguiente detalle:

Al momento de generar mas de dos subrutinas no se muestran, al parecer mi programa esta bn escrito, espero puedan checarlo y darme una ayudadita, lo que intento hacer es una condicion, que si un pulsador ( PORTA.0 ) esta presionado entonces se realize la subrutina "parpadeo" que utilizo pues para encender y apagar un led (parpadeando  :D) , el problema viene cuando intento condicionar que si PORTA.1 = 0 entonces se realize la subrutina "red" que solo enciende el LED y ya.

He probado solo con el parpadeo y me funciona muy bien, al poner otra subrutina viene el problema. El codigo es el siguiente:


Citar
AllDigital
TRISA = %00000111
TRISB = %00000000

'USO DE SUBRUTINAS
'"PARPADEO DE UN LED"

'MENU

main:
If PORTA.0 = 1 Then Gosub parpadeo
If PORTA.1 = 1 Then Gosub red
Goto main
End                                               

'SUBRUTINAS

parpadeo:
PORTB.4 = 1
WaitMs 500  'RETRASO DE APAGADO
PORTB.4 = 0
If PORTA.2 = 1 Then Return  'RESETEO
Goto parpadeo

red:
PORTB.4 = 1
If PORTA.2 = 1 Then Return  'RESETEO
Goto red

Como ven, pues no es la gran cosa, pero por algo se empieza  :D, bueno de antemano muchas gracias, espero su ayuda.

Una captura:

(http://img833.imageshack.us/img833/1425/errorvm.png)

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Fer_TACA en 22 de Julio de 2011, 02:03:04
Cre o que en la rutina main, te falta un "end" me parece que para cada if tienes que poner el respestivo end.

Y me parece que en las subrutinas tambien. No domino bien el basic pero creo que es asi.

F.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Julio de 2011, 04:53:10
Prueba de esta otra manera, de todos modos el empleo de gotos no es muy aconsejable.

Código: [Seleccionar]
AllDigital
TRISA = %00000111
TRISB = %00000000

'USO DE SUBRUTINAS
'"PARPADEO DE UN LED"

'MENU

main:

If PORTA.0 = 1 Then Gosub parpadeo
If PORTA.1 = 1 Then Gosub red

Goto main
End                                               

'SUBRUTINAS

parpadeo:
PORTB.4 = 1
WaitMs 500  'RETRASO DE APAGADO
PORTB.4 = 0
If PORTA.2 = 1 Then Return  'RESETEO
Goto parpadeo
Return                                           

red:
PORTB.4 = 1
If PORTA.2 = 1 Then Return  'RESETEO
Goto red
Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: man3s en 22 de Julio de 2011, 11:02:50

Agradezco mucho la ayuda "dogflu66" , este si se ha compilado de manera correcta y ha funcionado como se debe  :), esta rutina ya la habia hecho sin el gosub pero quiero aprender a usar el PIC SIMULATOR IDE completo (o casi) y por eso estar batallando y resulta ser solo dos return  :D.
Una pregunta, ¿no es recomendable usar el goto?  :shock: o se referia al gosub  :? , ¿porque no es recomendable?, si mi base son los llamados de rutina :S , puedo trabajar sin subrutinas pero no sin llamado de rutinas  :shock:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Julio de 2011, 18:25:33
El los lenguajes de alto nivel que heredan el Goto se coincide en no recomendar su uso. En este programa con rutinas tan cortas no se aprecia el problema que da. El Goto genera un código ilegible sobre todo en  programas de mayor extensión. Con el uso de bucles tipo While/Wend, el código se clarifica porque se sabe que la subrutina por muy extensa que sea comienza en el While y termina en el Wend. El uso de saltos tipo Gosub/Etiqueta/Return, generan un codigo más comprensible porque se sabe que una vez terminada la rutina que llamó el Gosub, el código se sigue ejecutando después de este, por lo que se genera un programa fuente mucho más fácil de seguir incluso después de muchos meses sin modificarlo.
El principal problema de utilizar subrutinas ya se llamen con Goto o Gosub se presenta con las subrutinas en si, que necesitan datos de entrada para poder actuar y también pueden que devuelven datos. La comunicación de rutinas, intercambio de datos, se realiza mediante variables globales y esto genera un código muy poco transportable. La solución para todo esto se realiza mediante funciones, las funciones son  códigos completos que solo necesitan que se les faciliten los datos de entrada para poder operar prácticamente de una forma autónoma. Las funciones suelen ir acompañadas de una cabecera de comentarios que indica como realizar la transferencia de datos entre ella y la rutina principal. Estos  programas se copian y se pegan en el programa principal sin  más preocupación, lo único que hay que tener en cuenta es que no se permite tener varias funciones con el mismo nombre al igual que no se permiten varias etiquetas de subrutina con el mismo nombre.

Las funciones en este lenguaje están clasificadas en dos tipos y tienen nombre distinto, están las que devuelven valores a la rutina Main y las que no. Y las palabras clave para su definición son Function/EndFuction y Proc/EndProc respectivamente. Para llamarlas se emplea el prefijo Call seguido del nombre de la función, aunque se puede omitir en algunos casos.

En este ejemplo se emplean subrutinas a las que se les ha eleminado el Goto y utilizan variables locales para el control del bucle While/Wend.

Código: [Seleccionar]
Define SIMULATION_WAITMS_VALUE = 1
AllDigital
TRISA = %00000111
TRISB = %00000000

'USO DE SUBRUTINAS
'"PARPADEO DE UN LED"

'MENU

main:

If PORTA.0 = 1 Then Gosub parpadeo
If PORTA.1 = 1 Then Gosub red

Goto main
End                                               

'SUBRUTINAS

parpadeo:
Dim bucle As Bit  'Variable control bucle
bucle = True

While bucle = True  'Bucle infinito
PORTB.4 = 1
WaitMs 500  'RETRASO DE APAGADO
PORTB.4 = 0
If PORTA.2 = 1 Then bucle = False  'RESETEO
Wend
Return                                           

red:
Dim bucle As Bit  'Variable control bucle
bucle = True

While bucle = True  'Bucle infinito
PORTB.4 = 1
If PORTA.2 = 1 Then Return  'bucle = False  'RESETEO
Wend
Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Julio de 2011, 18:45:00
Este tosco programa ayuda a entender lo que es la distribución del tiempo en las subrutinas, es previo al paso de utilización de las interrupciones.

Código: [Seleccionar]
AllDigital
TRISA = %00000111
TRISB = %00000000

'USO DE SUBRUTINAS
'"PARPADEO DE UN LED"

Dim tmrbase0 As Bit
Dim tmrbase1 As Bit
Dim tmrbase2 As Bit
Dim flagparpadeo As Byte

flagparpadeo = 0

'MENU

main:

If RA.0 = 1 Then flagparpadeo = 1
If RA.1 = 1 Then
flagparpadeo = 0
Gosub red
Endif
If RA.2 = 1 Then
flagparpadeo = 0  'RESETEO
RB4 = 0
Endif

If flagparpadeo = 1 Then Gosub parpadeo
Gosub basetimer

Goto main
End                                               

'SUBRUTINAS
parpadeo:  'Parpadeo al 50%
If tmrbase0 = 1 Then
Toggle RB.4
tmrbase0 = 0
Endif
Return                                           

parpadeo1:  'Parpadeo led programable tiempo a on y a off independiente
Dim flag As Bit
If tmrbase0 = 1 And flag = 0 Then
RB.4 = 1
tmrbase1 = 0
flag = 1
Endif
If tmrbase1 = 1 And flag = 1 Then
RB.4 = 0
tmrbase0 = 0
flag = 0
Endif
Return                                           

red:
RB.4 = 1
Return                                           

basetimer:  'Saltos aproximados de 10mSeg.
Dim basecont0 As Word
Dim basecont1 As Word
Dim basecont2 As Word
Dim base0_tm As Word
Dim base1_tm As Word
Dim base2_tm As Word

base0_tm = 30  'Carga base0 con 300mSeg.
base1_tm = 60  'Carga base0 con 600mSeg.
base2_tm = 100  'Carga base0 con 1Seg.

If tmrbase0 = 0 Then  'Base timer 0
basecont0 = basecont0 + 1
If basecont0 > base0_tm Then
tmrbase0 = 1
basecont0 = 0
Endif
Endif
If tmrbase1 = 0 Then  'Base timer 1
basecont1 = basecont1 + 1
If basecont1 > base1_tm Then
tmrbase1 = 1
basecont1 = 0
Endif
Endif
If tmrbase2 = 0 Then  'Base timer 2
basecont2 = basecont2 + 1
If basecont2 > base2_tm Then
tmrbase2 = 1
basecont2 = 0
Endif
Endif
WaitUs 9500
Return               
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 24 de Julio de 2011, 07:22:48
Aqui dejo el mismo programa pero con la subrutina base de tiempos pasada a función.

Código: [Seleccionar]
AllDigital
TRISA = %00000111
TRISB = %00000000

'USO DE SUBRUTINAS
'"PARPADEO DE UN LED"

Dim flagparpadeo As Byte  'Activa el parpadeo del Led

flagparpadeo = 0  'Parpadeo del Led a Off

'MENU

Call tmrbase(1, 1, 0)  'Incializa base de tiempos 1
Call tmrbase(2, 1, 0)  'Incializa base de tiempos 2
Call tmrbase(3, 1, 0)  'Incializa base de tiempos 3

main:  'Rutina principal

If RA.0 = 1 Then flagparpadeo = 1  'Activa el parpadeo del Led
If RA.1 = 1 Then  'Para parpadeo y Led a On fijo
flagparpadeo = 0  'Parpadeo a Off
Gosub red  'Salto rutina control led a On
Endif
If RA.2 = 1 Then  'Reset al estado del Led
flagparpadeo = 0  'Para el parpadeo del Led
RB4 = 0  'Apaga el Led
Endif

If flagparpadeo = 1 Then Gosub parpadeo  'Salta a la rutina de control parpadeo Led
Call tmrbase(0, 0, 0)  'Actualiza las bases de tiempos

Goto main
End                                              

'SUBRUTINAS
parpadeo:  'Parpadeo al 50%
If tmrbase.1 = 1 Then  'Control led a On
Toggle RB.4  'Led a On
Call tmrbase(1, 0, 5)  'Recarga la base de tiempos 1
Endif
Return                                            

parpadeo1:  'Parpadeo led programable tiempo a On y Off independiente
Dim flag As Bit  'Marca el ciclo
If tmrbase.1 = 1 And flag = 0 Then  'Control led a On
RB.4 = 1  'Led a ON
Call tmrbase(1, 0, 3)  'Recarga base de tiempos 1
flag = 1  'Cambia de ciclo
Endif
If tmrbase.2 = 1 And flag = 1 Then  'Control led a Off
RB.4 = 0  'Led a Off
Call tmrbase(2, 0, 6)  'Recarga base de tiempos 2
flag = 0  'Cambia de ciclo
Endif
Return                                            

red:  'Control Led a On fijo
RB.4 = 1  'Led a On
Return                                            

'FUNCIONES
'Función que controla hasta 7 bases de tiempos
'Datos de entrada son los encerrados entre paréntesis
'Datos de salida los bit de la variable que da nombre a la función
'Se ponen antes del Main
'Call tmrbase(1, 1, 0)  'Incializa base de tiempos 1
'Call tmrbase(2, 1, 0)  'Incializa base de tiempos 2
'Call tmrbase(3, 1, 0)  'Incializa base de tiempos 3
'Actualiza las bases de tiempos, se tiene que repetir cada 10mSeg.
'Call tmrbase(0, 0, 0)  'Actualiza las bases de tiempos, deberia de ir en la rutina de interrupciones.
'Configuración general de las bases de tiempos
'Call tmrbase(x,y,z)
'x toma valores comprendidos entre 1 y 7, indica el numero de base que se quiere configurar
'y = 1 base parada, y = 0 base contando
'z tiempo que cuenta la base en mSeg x 10.
'Control del flujo de las rutinas del programa mediante los bit que componen la variable que da
'nombre a la función:
'tmrbase.x, x = al bit de control de la base de tiempos referida.
'If tmrbase.1 =1 then ----------------
'x=0 no se como base de tiempos, se usa para la actualización de los registros de las bases de tiempos creadas.
Function tmrbase(nbase As Byte, _onoff As Bit, base_tm As Word) As Byte  'Saltos aproximados de 10mSeg.
Dim basecont1 As Word  'Contadores
Dim basecont2 As Word
Dim basecont3 As Word
Dim base1_tm As Word  'Tiempo a contar
Dim base2_tm As Word
Dim base3_tm As Word

If nbase = 1 Then  'Configuración base tiempos 1
base1_tm = base_tm  'Carga base1 con el tiempo a contar
tmrbase.1 = _onoff  'Inicia=0, para=1
Endif
If nbase = 2 Then  'Configuración base tiempos 2
base2_tm = base_tm  'Carga base2 con el tiempo a contar
tmrbase.2 = _onoff  'Inicia=0, para=1
Endif
If nbase = 3 Then  'Configuración base tiempos 3
base3_tm = base_tm  'Carga base3 con el tiempo a contar
tmrbase.3 = _onoff  'Inicia=0, para=1
Endif

If tmrbase.1 = 0 Then  'Base timer 1
basecont1 = basecont1 + 1  'Incrementa contador base 1
If basecont1 > base1_tm Then  'Determina el estado de la base
tmrbase.1 = 1  'Base parada o termino de contar
basecont1 = 0  'Inicializa el contador de la base
Endif
Endif
If tmrbase.2 = 0 Then  'Base timer 2
basecont2 = basecont2 + 1  'Incrementa contador base 2
If basecont2 > base2_tm Then  'Determina el estado de la base
tmrbase.2 = 1  'Base parada o termino de contar
basecont2 = 0  'Inicializa el contador de la base
Endif
Endif
If tmrbase.3 = 0 Then  'Base timer 3
basecont3 = basecont3 + 1  'Incrementa contador base 3
If basecont3 > base3_tm Then  'Determina el estado de la base
tmrbase.3 = 1  'Base parada o termino de contar
basecont3 = 0  'Inicializa el contador de la base
Endif
Endif
WaitUs 9500  'Patron de la base de tiempos
Return                                            
Título: Coma flotante en la version 6,91
Publicado por: EA7LN en 07 de Agosto de 2011, 19:12:38
He instalado la ultima version y la coma flotante no me funciona.
Intento ver la tensión que entra en el AD y visualizo en un display solo las unidades.
En la ayuda, veo que la coma flotante esta activada. Hace falta algun comando para activarla?
Os dejo el programa para que veais lo que prento hacer, saludos.

'Leo el AD y se visualiza en el display. Calculo la tension de entrada del AD. (Voltimetro)




'16F876A
'''''''''''''''''''''''''''LOS VALORES DEL LCD HAY QUE CAMBIARLOS PARA MI PLACA'''''''''''''''''''''''''''''


Define CLOCK_FREQUENCY = 8
Define ADC_CLOCK = 3  'default value is 3
Define ADC_SAMPLEUS = 20  'default value is 20
Define LCD_BITS = 4  'allowed values are 4 and 8 - the number of data interface lines
Define LCD_DREG = PORTB
Define LCD_DBIT = 0  '0 or 4 for 4-bit interface, ignored for 8-bit interface
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 4
Define LCD_EREG = PORTB
Define LCD_EBIT = 5
Define LCD_RWREG = 0  'set to 0 if not used, 0 is default
Define LCD_RWBIT = 0  'set to 0 if not used, 0 is default
Define LCD_COMMANDUS = 5000  'delay after LCDCMDOUT, default value is 5000
Define LCD_DATAUS = 50  'delay after LCDOUT, default value is 50
Define LCD_INITMS = 100 'delay used by LCDINIT, default value is 100
'the last three Define directives set the values suitable for simulation; they should be omitted for a real device
Lcdinit


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
AllDigital
TRISA.0 = 1  'configuro RA0 como entrada
TRISC.5 = 0  'RC5 como salida
'Define COUNT_MODE = 1
Dim entrada As Word
Dim voltaje As Word
'Dim decima As Word  'variable para displayar las decimas de voltios
ADCON1 = 0  'conversor AD de an0 on
loop:
Adcin 0, entrada
voltaje = (entrada * 5) / 1023
Lcdcmdout LcdLine1Clear
Lcdcmdout LcdLine1Home  'set cursor at the beginning of line 2
Lcdout "entrada: ", #voltaje, "v"
WaitMs 100
Goto loop
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Agosto de 2011, 05:44:43
La coma flotante es un módulo que hay que comprar a parte, te tiene que salir en el IDE los siguiente para que esté activado.

(http://img3.imageshack.us/img3/28/picsimulatoride.jpg)

No he trabajado con coma flotante porque los micros que estoy utilizando últimamente tienen 1Kword de flash y la coma flotante es nueva y ocupa mucha memoria flash, por lo que no se si funciona bien, creo que debe de ir bien porque no ha salido ninguna otra versión para corregir errores. En general en el caso de errores en el PSI sale una nueva versión de un dia para otro y los usuarios registrados recibimos un aviso.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 08 de Agosto de 2011, 06:06:32
He probado el código que dejo a continuación en el simulador y funciona correcto. De todas formas hace mucho que no utilizo ese micro y no sabría decir si necesita alguna configuración adicional para que funcione en la realidad.

Código: [Seleccionar]
'He instalado la ultima version y la coma flotante no me funciona.
'Intento ver la tensión que entra en el AD y visualizo en un display solo las unidades.
'En la ayuda, veo que la coma flotante esta activada. Hace falta algun comando para activarla?
'Os dejo el programa para que veais lo que prento hacer, saludos.
'Leo el AD y se visualiza en el display. Calculo la tension de entrada del AD. (Voltimetro)
'16F876A
'''''''''''''''''''''''''''LOS VALORES DEL LCD HAY QUE CAMBIARLOS PARA MI PLACA'''''''''''''''''''''''''''''
Define CLOCK_FREQUENCY = 8
Define ADC_CLOCK = 3  'default value is 3
Define ADC_SAMPLEUS = 20  'default value is 20
Define LCD_BITS = 4  'allowed values are 4 and 8 - the number of data interface lines
Define LCD_DREG = PORTB
Define LCD_DBIT = 0  '0 or 4 for 4-bit interface, ignored for 8-bit interface
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 4
Define LCD_EREG = PORTB
Define LCD_EBIT = 5
Define LCD_RWREG = 0  'set to 0 if not used, 0 is default
Define LCD_RWBIT = 0  'set to 0 if not used, 0 is default
Define LCD_COMMANDUS = 5000  'delay after LCDCMDOUT, default value is 5000
Define LCD_DATAUS = 50  'delay after LCDOUT, default value is 50
Define LCD_INITMS = 100  'delay used by LCDINIT, default value is 100
'the last three Define directives set the values suitable for simulation; they should be omitted for a real device
Lcdinit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
AllDigital
TRISA.0 = 1  'configuro RA0 como entrada
TRISC.5 = 0  'RC5 como salida
'Define COUNT_MODE = 1
Dim entrada As Word
Dim voltaje As Single  'word
'Dim decima As Word  'variable para displayar las decimas de voltios
ADCON1 = 0  'conversor AD de an0 on
Lcdcmdout LcdLine1Clear
main:
Adcin 0, entrada
voltaje = (entrada * 5) / 1023
Lcdcmdout LcdLine1Home  'set cursor at the beginning of line 2
Lcdout "entrada: ", #voltaje, "v      "
'WaitMs 100
Goto main
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: EA7LN en 08 de Agosto de 2011, 11:51:51
La coma flotante es un módulo que hay que comprar a parte, te tiene que salir en el IDE los siguiente para que esté activado.

(http://img3.imageshack.us/img3/28/picsimulatoride.jpg)

No he trabajado con coma flotante porque los micros que estoy utilizando últimamente tienen 1Kword de flash y la coma flotante es nueva y ocupa mucha memoria flash, por lo que no se si funciona bien, creo que debe de ir bien porque no ha salido ninguna otra versión para corregir errores. En general en el caso de errores en el PSI sale una nueva versión de un dia para otro y los usuarios registrados recibimos un aviso.


Gracias por tu respuesta dogflu66, ya me funciona.
El problema es que solo funciona con una variable tipo single y yo la dimensionaba como word.
Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jrody en 11 de Agosto de 2011, 01:09:03
hola amigos de TODOPIC.
Solicito su ayuda por favor, tengo el siguiente problema.

Tengo una variable tipo WORD. Es un registro de eventos que necesito almacenar y no perder por cortes de energia. Asi que lo guardo en memoria EEPROM. El problema esta en que solo me guarda hasta 255 y reinicia el conteo de 0.
Como puedo hacer para guardar datos mayores a 255 por ejempo 23456 y poder leerlo cuando quiera..
Anexo una parte de rutina de mi programa: Saludos y gracias



tventas var word    ;Variable que cuenta el total recibidos en monedas
credito var byte    ;Varibale credito
read 10, tventas    ;lee de la EEPROM a una variable tventas (total de ventas)
read 12
read 14

printvtotal:                           
  lcdout $fe, 1                             ;limpia display
  lcdout $fe, $80, "TOTAL VENTAS"           ;escribe en display 1ra fila
  lcdout $fe, $c0, "$", dec tventas, ".00"  ;muestra en display signo $ y total de pesos recibidos

grabatventas:                        ;para incrementar evento
  tventas = tventas + credito        ;sumar a total de ventas la cantidas de credito pesos recibidos
  write 10, tventas                  ;grabar total de ventas en memoria EEPROM direccion 10
  write 12
  write 14
end         

 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 13 de Agosto de 2011, 10:10:14
Desconozco como se realiza la operación en la versión de lenguaje Basic que indicas. Puede realizarse mediante un comando que permita trabajar directamente con Word, o en el peor de los casos, dividiendo el Word en dos partes, esto es byte alto y byte bajo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jrody en 21 de Agosto de 2011, 21:15:55
hola amigos de TODOPIC.
Solicito su ayuda por favor, tengo el siguiente problema.

Tengo una variable tipo WORD. Es un registro de eventos que necesito almacenar y no perder por cortes de energia. Asi que lo guardo en memoria EEPROM. El problema esta en que solo me guarda hasta 255 y reinicia el conteo de 0.
Como puedo hacer para guardar datos mayores a 255 por ejempo 23456 y poder leerlo cuando quiera..
Anexo una parte de rutina de mi programa: Saludos y gracias



tventas var word    ;Variable que cuenta el total recibidos en monedas
credito var byte    ;Varibale credito
read 10, tventas    ;lee de la EEPROM a una variable tventas (total de ventas)
read 12
read 14

printvtotal:                           
  lcdout $fe, 1                             ;limpia display
  lcdout $fe, $80, "TOTAL VENTAS"           ;escribe en display 1ra fila
  lcdout $fe, $c0, "$", dec tventas, ".00"  ;muestra en display signo $ y total de pesos recibidos

grabatventas:                        ;para incrementar evento
  tventas = tventas + credito        ;sumar a total de ventas la cantidas de credito pesos recibidos
  write 10, tventas                  ;grabar total de ventas en memoria EEPROM direccion 10
  write 12
  write 14
end         

 



.

Hala amigos de TODOPIC aqui les deja la solución de este problema que tenia, con esto ya pude guardar datos hasta 65025

tventas var word                            ;Variable que cuenta el total recibidos en monedas
tventas_l var tventas.lowbyte          ;variable para byte bajo
tventas_h var tventas.highbyte        ;variable para byte alto
.
read 10, tventas_l  ;lee de la EEPROM el total de ventas byte bajo
read 11, tventas_h    ;lee de la EEPROM el total de ventas byte alto
.
.
write 10, tventas_l                ;grabar total de ventas en memoria byte bajo
write 11, tventas_h               ;grabar total de ventas en memoria byte alto



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: jrody en 21 de Agosto de 2011, 21:19:46


hola amigos estoy programando el pic12f675 para controlar la potencia de un lampara de 230 v 0%      a  100% con un potenciometro que esta conectado a la pata 1 del micro12f675 ...cruce por zero pata2    pata0 conectada al optotriac despues del optotriac tenemos triac entonces jugamos del desparo del traic


Define ADC_CLOCK = 3  'Set clock source (3=rc)
Define ADC_SAMPLEUS = 50  'Set sampling time in uS

TRISIO = %00000110
ADCON0 = 0x0e
TRISIO.1 = 1
TRISIO.2 = 1
TRISIO.0 = 0
Dim t2400 As Word
Const con = 396
Dim adval As Byte
Dim voltatge As Word
Dim angle2 As Word
Dim k As Byte
Symbol triac = GP0
ADCON0.7 = 1
ANSEL = %00000010
CMCON = 7

inici: Adcin 1, adval
voltatge = (adval * 500) / 1023  'Equates to: (adval * 500)/1024

If GP2 = 1 And voltatge = 50 Then
GP0 = 1
Endif

   


            Select Case 32

angle2 = angle2 - 960
If angle2 < 0 Then
angle2 = 0
Endif
   
               Select Case 33

angle2 = angle2 + 960
If angle2 > 9000 Then
angle2 = 9000
Endif



Goto inici

End                                               




Hola Amigo sera que puedas mandar el diagrama de coneccion del Opto y el Triac.
Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Agosto de 2011, 09:28:58
Si el lenguaje que estáis tratando es estándar, entonces Word se refiere a un numero entero sin signo de longitud 2Bytes=16Bits, por lo tanto, puede tomar números comprendidos entre 0 y 65535, por lo que se deduce que puede contener 65536 números diferentes.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: rafael.luc en 13 de Octubre de 2011, 01:39:37
Ola

Estou com seguinte problema, preciso enviar através da porta serial uma variável, mas em hexadecimal
Seria como neste exemplo

Hserout 0x01, #variavel, #variavel

Para o primeiro valor fixo tenho o hexadecimal que é exibido corretamente, enquanto que para as variáveis somente é exibido em valores numéricos ( enviado em numeração ascii para rs232).

Como eu poderia resolver?

Gracias
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Octubre de 2011, 06:29:28
Si no quieres que te divida el número contenido en la variable en dígitos y, envíe cada dígito como caracteres ASCII, elimina el modificador #.

Hserout 0x01, variavel, variavel
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dr cerebro en 24 de Octubre de 2011, 02:19:55
Hola a todos.

Hasta ahora esto iniciando en el mundo de los pics. y deseo crear un pequeño dispositivo, que resetee el modem/router, cuando no exista conexión a Internet. El primer proyecto lo hice cambiando los leds de estado por optoacopladores. Cuando vinieron a cambiarlo por uno mas moderno, fue un problema regresarlo a su estado anterior :oops:. Casi no me lo cambian. Es siguiente esta sellado y si le quito los sellos tendré problemas. Pensé en poner unas fotoresistencias, fototransistores, etc, frente a las luces de estado, pero no me gusta la idea. Me gustaría emplear un pic que pueda conectarse con Internet y que haga un ping cada cierto tiempo. En el momento que no reciba respuesta del servidor, accione un relé que desconecte y re conecte el router.

Podrían ayudarme?
Título: Asignar cadena
Publicado por: dr cerebro en 28 de Octubre de 2011, 19:55:35
Hola a todos.

¿Se puede en el basic de PIC BASIC IDE asignar cadenas?

ej

Código: [Seleccionar]
dim nom1(10) as byte
dim nom2(10) as byte
dim nom3(20) as byte

nom1 = "Pepito"
nom2 = "Perez"
nom3 = nom1 + " " + nom2

lcdout "Hola " + nom3 + "!"

o

Código: [Seleccionar]
nom3 = strcat(nom1, nom2)
¿Se puede enviar una cadena a una funcion o procedimiento?

ej.

Código: [Seleccionar]
call Saludar ("Carlos")
call Saludar ("Juan")
call Saludar ("Ana")
end
Proc Saludar (nom(10) As byte)
Lcdcmdout LcdLine1Clear 
Lcdout "Hola ", #nom
WaitMs 900
End Proc   

De paso hay algun tutorial de manejo de cadenas en PIC BASIC IDE?

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Octubre de 2011, 09:31:22
Por el momento no tiene funciones del sistema que permitan asignar una cadena a una variable. Si quieres trabajar con cadenas de una forma cómoda te tienes que crear la función. Tampoco permite por el momento pasar una variable tipo vector a una función, se tiene que declarar como global para trabajar con ella en las funciones u otro modo seria pasarle la dirección de inicio de la variable para trabajar como punteros, pero el problema que también hay es que aunque tiene una tabla que indica la dirección de cada variable aun no tienen un modificador o símbolo en el código que permita hacer esta operación de forma automática, habría que pasar la dirección de forma manual. He tenido que trabajar pocas veces con cadenas, pero memorizar tramas de datos de entrada por un puerto y después buscar coincidencias con otros textos prememorizados realmente no me ha sido difícil.

Te tienes que crear la función que asigna una cadena de datos a una variable, ya entren por un puerto o se asignen de forma directa de la forma tradicional tipo “Hola mundo” y después una función más para comparar la cadena o buscar coincidencias que son las más utilizadas. Recuerda que todas las cadenas de texto tienen un caracter que indica fin de cadena.

Si estas muy interesado cuando tenga un rato te preparo una función que asigne una cadena a una variable tipo vector. Cuando veas el código observaras que es muy simple desarrollar las funciones para trabajar con cadenas.

Nota: Desde hace algun tiempo el lenguaje ya puede trabajar con cadenas o string de forma directa (10/01/2016).
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dr cerebro en 31 de Octubre de 2011, 15:13:19
Por el momento no tiene funciones del sistema que permitan asignar una cadena a una variable. Si quieres trabajar con cadenas de una forma cómoda te tienes que crear la función. Tampoco permite por el momento pasar una variable tipo vector a una función, se tiene que declarar como global para trabajar con ella en las funciones u otro modo seria pasarle la dirección de inicio de la variable para trabajar como punteros, pero el problema que también hay es que aunque tiene una tabla que indica la dirección de cada variable aun no tienen un modificador o símbolo en el código que permita hacer esta operación de forma automática, habría que pasar la dirección de forma manual. He tenido que trabajar pocas veces con cadenas, pero memorizar tramas de datos de entrada por un puerto y después buscar coincidencias con otros textos prememorizados realmente no me ha sido difícil.

Te tienes que crear la función que asigna una cadena de datos a una variable, ya entren por un puerto o se asignen de forma directa de la forma tradicional tipo “Hola mundo” y después una función más para comparar la cadena o buscar coincidencias que son las más utilizadas. Recuerda que todas las cadenas de texto tienen un caracter que indica fin de cadena.

Si estas muy interesado cuando tenga un rato te preparo una función que asigne una cadena a una variable tipo vector. Cuando veas el código observaras que es muy simple desarrollar las funciones para trabajar con cadenas.

Hola dogflu66.

Le agradecería la función.

De antemano, muchas gracias por la respuesta y por la función.

Saludos

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Noviembre de 2011, 09:20:41
Dejo las funciones más significativas para operar con cadenas, he optado por trabajar con direcciones de memoria porque el código sale más reducido.
Si hay alguna duda sobre algo, pues por aquí estaré.

Los vectores se definen en las ultimas posiciones de memoria para que no sean ocupados por las declaraciones normales de variables que tienden a ocupar las primeras posiciones, y tienen que ser direcciones consecutivas. El código de control ASII 0 indica fin de cadena, pues para declarar una variable tipo vector de una longitud de 10 elementos se necesitan 11 bytes para que pueda ser gestionada por las funciones. En realidad todo esto se hace mas o menos de esta forma para cualquier lenguaje lo que ocurre es que el compilador nos lo oculta.

Los elementos de los vectores se nombran de la forma tradicional comenzando con el 0, 1, ..., hasta el final = (strlen-1). Es decir que el 0 cuenta.

Código: [Seleccionar]
'******************************************************************************
'Funciones para operar con cadenas cadenas
'By Dogflu66, 11/11.
'Basic del Pic Simulator IDE (PSI).
'******************************************************************************
'Puertos del LCD para simulador************************************************
Define LCD_BITS = 4  'Bus de datos del lcd a 4bit
Define LCD_DREG = PORTA  'Bus de datos el puerto A
Define LCD_DBIT = 0  'Bus datos los 4 bit menos significativos, puerto A
Define LCD_RSREG = PORTB  'Bit de control RS a puerto B
Define LCD_RSBIT = 7  'Se usa RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E del puerto B
Define LCD_EBIT = 6  'Se usa RB6 como E
Define LCD_COMMANDUS = 100  '2000  'Espera despues de ejecutar comando lcd, uSeg.
Define LCD_DATAUS = 50  'Espera despues de enviar un dato al LCD, uSeg.
Define LCD_INITMS = 5  '50  'Espera despues de inicializar el Display
'******************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'*****************************************************************
Dim clave As Byte @ 0x12f  'Se declara variable en la dirección establecida
Dim nombre As Byte @ 0x13a  'Se declara variable en la dirección establecida
Dim apellido As Byte @ 0x145  'Se declara variable en la dirección establecida

Dim p_clave As Word  'Variable que apunta a otra variable
Dim p_nombre As Word  'Variable que apunta a otra variable
Dim p_apellido As Word  'Variable que apunta a otra variable

p_clave = 0x12f  'p_clave apunta a clave
p_nombre = 0x13a  'p_nombre apunta a nombre
p_apellido = 0x145  'p_apellido apunta a apellido

Lcdinit  'Incializa el LCD

main:
Call strclr(p_clave)  'Inicializa/Borra la variable
Call strcdn(p_clave, 0)  'Asigna la cadena 0 a la variable
Call strcdn(p_nombre, 1)  'Asigna la cadena 1 a la variable
Call strcdn(p_apellido, 2)  'Asigna la cadena 2 a la variable
Call strchr(p_nombre, 0)  'Devuelve el caracter indicado en strchr
Call strlen(p_apellido)  'Devuelve en strlen la longitud de la cadena
Call strcpy(p_nombre, p_clave)  'Convierte la primera en la segunda
Call strcmp(p_nombre, p_clave)  'Compara dos cadenas, strcmp = 0 (diferentes), = 1 (iguales)
Lcdout "Clave:"  'Imprime en el LCD
Call strlen(p_nombre)  'Extrae la longitud de la cadena
Call strlcd(p_nombre, 0, strlen)  'Imprime en el LCD la cadena
'Goto main
End                                              
'Asigna la cadena a la variable elegida
Proc strcdn(direccion As Word, valor As Byte)
Dim indice As Byte  'Indica el elemento de la lista
Dim paso As Byte  'Contendrá el elemento de la lista segun el indice
Dim x As Bit  'Variable auxiliar
x = 1
indice = 0
While x = 1  'Bucle de asignación
If valor = 0 Then paso = LookUp("123456", 0), indice
If valor = 1 Then paso = LookUp("Todopic", 0), indice
If valor = 2 Then paso = LookUp("Basic", 0), indice
Pointer(direccion) = paso  'Asigna el valor de paso a la dirección que hace referencia variable
If paso = 0 Then Exit  'Fin del Proc
indice = indice + 1  'Incrementa indice
direccion = direccion + 1  'Apunta a la siguiente dirección del vector seleccionado
Wend
End Proc                                          
'Devuelve el caracter especificado, de izquierda a derecha
'El numero de orden para el primer caracter es el cero
Function strchr(direccion As Word, valor As Byte) As Byte
strchr = 0
direccion = direccion + valor  'Calcula la posición del caracter
strchr = Pointer(direccion)  'Extra el caracter de la posición
End Function                                      
'Devuelve en strlen la longitud de la cadena,
'no incluye el caracter fin de cadena
Function strlen(direccion As Word) As Byte
Dim paso As Byte
Dim x As Bit
x = 1
strlen = 0
While x = 1
paso = Pointer(direccion)  'Lee valor
If paso = 0 Then Exit  'Sale de la Function
strlen = strlen + 1  'Incrementa longuitud
direccion = direccion + 1  'Incrementa posición
Wend
End Function                                      
'Copia la segunda variable en la primera
Proc strcpy(direccion As Word, direccion1 As Word)
Dim paso As Byte
Dim x As Bit
x = 1
While x = 1
paso = Pointer(direccion1)
Pointer(direccion) = paso
If paso = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Proc                                          
'Compara las dos variables, devuelve strcmp = 0 si no son iguales
'devuelve strcmp = 1 si son iguales.
Function strcmp(direccion As Word, direccion1 As Word) As Byte
Dim paso As Byte
Dim paso1 As Byte
Dim x As Bit
strcmp = 0
x = 1
While x = 1
paso = Pointer(direccion)
paso1 = Pointer(direccion1)
If paso = paso1 Then strcmp = 1
If paso <> paso1 Then
strcmp = 0
Exit
Endif
If paso = 0 Or paso1 = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Function                                      
'Borra o inicializa la variable
Proc strclr(direccion As Word)
Pointer(direccion) = 0  'Asigna a la primera posición fin de cadena
End Proc                                          
'Envia la cadena al LCD, apartir de inicio y tantos caracteres como marque numero
'Si numero = 0 es lo mismo = 1.
Proc strlcd(direccion As Word, inicio As Byte, numero As Word)
Dim paso As Byte
Dim x As Bit
x = 1
direccion = direccion + inicio  'Dirección del primer elemento de la variable
While x = 1
paso = Pointer(direccion)  'Lee valor
Lcdout paso
If paso = 0 Then Exit  'Sale de la Function
If numero > 0 Then numero = numero - 1  'Decrementa caracteres pendientes
If numero = 0 Then Exit  'Sale de la Función
direccion = direccion + 1  'Incrementa posición
Wend
End Proc

(http://img683.imageshack.us/img683/846/funcionesconcadenas.th.jpg) (http://imageshack.us/photo/my-images/683/funcionesconcadenas.jpg/)

PD. También se pueden declarar los vectores de la forma tradicional, ejemplo: Dim clave(10) as byte, y con una rutina al inicio los rastrea hasta que les encuentra su ubicación en la memoria y, les extrae sus direcciones de memoria de inicio asignandolas posteriormente de forma automatica. Pero el problema que tiene esta rutina es que es muy larga y consume mucha memoria de código, es muy simple pero usa mucho código redundante para cada variable, eso si, solo habría que ejecutarla una solo vez al principio.


Nota: (10/12/2011) De aquí se puede descargar la última versión:
http://www.todopic.com.ar/foros/index.php?topic=14917.msg307598#msg307598
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dr cerebro en 04 de Noviembre de 2011, 19:52:43
Dejo las funciones más significativas para operar con cadenas, he optado por trabajar con direcciones de memoria porque el código sale más reducido.
Si hay alguna duda sobre algo, pues por aquí estaré.

Los vectores se definen en las ultimas posiciones de memoria para que no sean ocupados por las declaraciones normales de variables que tienden a ocupar las primeras posiciones, y tienen que ser direcciones consecutivas. El código de control ASII 0 indica fin de cadena, pues para declarar una variable tipo vector de una longitud de 10 elementos se necesitan 11 bytes para que pueda ser gestionada por las funciones. En realidad todo esto se hace mas o menos de esta forma para cualquier lenguaje lo que ocurre es que el compilador nos lo oculta.

Los elementos de los vectores se nombran de la forma tradicional comenzando con el 0, 1, ..., hasta el final = (strlen-1). Es decir que el 0 cuenta.

Código: [Seleccionar]
'******************************************************************************
'Funciones para operar con cadenas cadenas
'By Dogflu66, 11/11.
'Basic del Pic Simulator IDE (PSI).
'******************************************************************************
'Puertos del LCD para simulador************************************************
Define LCD_BITS = 4  'Bus de datos del lcd a 4bit
Define LCD_DREG = PORTA  'Bus de datos el puerto A
Define LCD_DBIT = 0  'Bus datos los 4 bit menos significativos, puerto A
Define LCD_RSREG = PORTB  'Bit de control RS a puerto B
Define LCD_RSBIT = 7  'Se usa RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E del puerto B
Define LCD_EBIT = 6  'Se usa RB6 como E
Define LCD_COMMANDUS = 100  '2000  'Espera despues de ejecutar comando lcd, uSeg.
Define LCD_DATAUS = 50  'Espera despues de enviar un dato al LCD, uSeg.
Define LCD_INITMS = 5  '50  'Espera despues de inicializar el Display
'******************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'*****************************************************************
Dim clave As Byte @ 0x12f  'Se declara variable en la dirección establecida
Dim nombre As Byte @ 0x13a  'Se declara variable en la dirección establecida
Dim apellido As Byte @ 0x145  'Se declara variable en la dirección establecida

Dim p_clave As Word  'Variable que apunta a otra variable
Dim p_nombre As Word  'Variable que apunta a otra variable
Dim p_apellido As Word  'Variable que apunta a otra variable

p_clave = 0x12f  'p_clave apunta a clave
p_nombre = 0x13a  'p_nombre apunta a nombre
p_apellido = 0x145  'p_apellido apunta a apellido

Lcdinit  'Incializa el LCD

main:
Call strclr(p_clave)  'Inicializa/Borra la variable
Call strcdn(p_clave, 0)  'Asigna la cadena 0 a la variable
Call strcdn(p_nombre, 1)  'Asigna la cadena 1 a la variable
Call strcdn(p_apellido, 2)  'Asigna la cadena 2 a la variable
Call strchr(p_nombre, 0)  'Devuelve el caracter indicado en strchr
Call strlen(p_apellido)  'Devuelve en strlen la longitud de la cadena
Call strcpy(p_nombre, p_clave)  'Convierte la primera en la segunda
Call strcmp(p_nombre, p_clave)  'Compara dos cadenas, strcmp = 0 (diferentes), = 1 (iguales)
Lcdout "Clave:"  'Imprime en el LCD
Call strlen(p_nombre)  'Extrae la longitud de la cadena
Call strlcd(p_nombre, 0, strlen)  'Imprime en el LCD la cadena
'Goto main
End                                               
'Asigna la cadena a la variable elegida
Proc strcdn(direccion As Word, valor As Byte)
Dim indice As Byte  'Indica el elemento de la lista
Dim paso As Byte  'Contendrá el elemento de la lista segun el indice
Dim x As Bit  'Variable auxiliar
x = 1
indice = 0
While x = 1  'Bucle de asignación
If valor = 0 Then paso = LookUp("123456", 0), indice
If valor = 1 Then paso = LookUp("Todopic", 0), indice
If valor = 2 Then paso = LookUp("Basic", 0), indice
Pointer(direccion) = paso  'Asigna el valor de paso a la dirección que hace referencia variable
If paso = 0 Then Exit  'Fin del Proc
indice = indice + 1  'Incrementa indice
direccion = direccion + 1  'Apunta a la siguiente dirección del vector seleccionado
Wend
End Proc                                         
'Devuelve el caracter especificado, de izquierda a derecha
'El numero de orden para el primer caracter es el cero
Function strchr(direccion As Word, valor As Byte) As Byte
strchr = 0
direccion = direccion + valor  'Calcula la posición del caracter
strchr = Pointer(direccion)  'Extra el caracter de la posición
End Function                                     
'Devuelve en strlen la longitud de la cadena,
'no incluye el caracter fin de cadena
Function strlen(direccion As Word) As Byte
Dim paso As Byte
Dim x As Bit
x = 1
strlen = 0
While x = 1
paso = Pointer(direccion)  'Lee valor
If paso = 0 Then Exit  'Sale de la Function
strlen = strlen + 1  'Incrementa longuitud
direccion = direccion + 1  'Incrementa posición
Wend
End Function                                     
'Copia la segunda variable en la primera
Proc strcpy(direccion As Word, direccion1 As Word)
Dim paso As Byte
Dim x As Bit
x = 1
While x = 1
paso = Pointer(direccion1)
Pointer(direccion) = paso
If paso = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Proc                                         
'Compara las dos variables, devuelve strcmp = 0 si no son iguales
'devuelve strcmp = 1 si son iguales.
Function strcmp(direccion As Word, direccion1 As Word) As Byte
Dim paso As Byte
Dim paso1 As Byte
Dim x As Bit
strcmp = 0
x = 1
While x = 1
paso = Pointer(direccion)
paso1 = Pointer(direccion1)
If paso = paso1 Then strcmp = 1
If paso <> paso1 Then
strcmp = 0
Exit
Endif
If paso = 0 Or paso1 = 0 Then Exit
direccion = direccion + 1
direccion1 = direccion1 + 1
Wend
End Function                                     
'Borra o inicializa la variable
Proc strclr(direccion As Word)
Pointer(direccion) = 0  'Asigna a la primera posición fin de cadena
End Proc                                         
'Envia la cadena al LCD, apartir de inicio y tantos caracteres como marque numero
'Si numero = 0 es lo mismo = 1.
Proc strlcd(direccion As Word, inicio As Byte, numero As Word)
Dim paso As Byte
Dim x As Bit
x = 1
direccion = direccion + inicio  'Dirección del primer elemento de la variable
While x = 1
paso = Pointer(direccion)  'Lee valor
Lcdout paso
If paso = 0 Then Exit  'Sale de la Function
If numero > 0 Then numero = numero - 1  'Decrementa caracteres pendientes
If numero = 0 Then Exit  'Sale de la Función
direccion = direccion + 1  'Incrementa posición
Wend
End Proc

(http://img683.imageshack.us/img683/846/funcionesconcadenas.th.jpg) (http://imageshack.us/photo/my-images/683/funcionesconcadenas.jpg/)

PD. También se pueden declarar los vectores de la forma tradicional, ejemplo: Dim clave(10) as byte, y con una rutina al inicio los rastrea hasta que les encuentra su ubicación en la memoria y, les extrae sus direcciones de memoria de inicio asignandolas posteriormente de forma automatica. Pero el problema que tiene esta rutina es que es muy larga y consume mucha memoria de código, es muy simple pero usa mucho código redundante para cada variable, eso si, solo habría que ejecutarla una solo vez al principio.

Muchas gracias dogflu66

Voy a probarlas.

Saludos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Diciembre de 2011, 12:09:22
Dejo adjuntado la última versión de funciones para trabajar con cadenas de caracteres y números (string and numbers) en el Basic del Pic Simulator IDE (PSI).
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Diciembre de 2011, 12:18:07
(Ejemplo_2 de números grandes sin funciones: http://www.todopic.com.ar/foros/index.php?topic=14917.msg384712#msg384712)

Ejemplo_1 números grandes con funciones:
Dejo un ejemplo para el que quiera trabajar con números grandes en un LCD alfanumerico.
Recordar que para que funcione necesita las funciones para trabajar con cadenas y numeros.

Lo que hago es aprovechar las funciones para trabajar con cadenas (string), que escribí hace poco, y convierto el número a cadena, de esta manera la función de números grandes permite trabajar con cualquier longitud de linea de display sin necesidad de configuración. La rutina necesita que se le indique  posición a imprimir en el LDC y, también si el cursor quedará listo para imprimir a continuación de la parte superior o inferior de los números grandes. La función devuelve un valor que indica la próxima posición a imprimir en el LCD.

Código: [Seleccionar]
'******************************************************************
'Escribiendo números grandes en LCD de dos líneas
'Para placa PicEBasic, By dogflu66, 12/11
'Basic Pic Simulator IDE (PSI), v6.91, Pic16F88
'******************************************************************
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Puerto del LCD----------------------------------------------------
Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
Define LCD_DREG = PORTA  'Bus de datos, puerto A
Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E, puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Espera despues inicializar Display
'*******************************************************************
'Configuración Placa EBasic ----------------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
'TRISB.5 = 0 'RB5(Tx, RS232)
TRISB.2 = 1  'RB2 (Rx, RS232)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off
PORTB.0 = 1  'Led verde a off
'*********************************************************************
Lcdinit  'Inicializa el LCD sin cursor
'*********************************************************************
Call p_word01()  'Inicializa cadena y puntero para trabajar con caractes
Call _intstrngrandes()  'Incializa caracteres CGRam del LCD, números grandes
'Variables------------------------------------------------------------
Dim numero As Long
Dim linea As Bit
numero = 0
'********************************************************************
Lcdout "Patrones:"
Lcdcmdout LcdLine2Home
Lcdout 0, 1, 2, 3, 4, 5, 6, 7  'Se imprimen los nuevos chr
WaitMs 5000  'Pausa de 3Seg
Lcdcmdout LcdClear  'Borrar el LCD
'********************************************************************
'Ejemplo: agranda el número contenido en la variable "numero"
'********************************************************************
main:
Call _nmrstr(numero, p_word01)  'Convierte un número a cadena
Call _strngrandes(p_word01, 4, linea)  'Escribe números grandes
Lcdout #numero
numero = numero + 1
Toggle linea
WaitMs 400
Lcdcmdout LcdClear
Goto main
End                                               
Include "_FuncionesCadenasNumeros.bas"
'*********************************************************************
'****************Función Numeros Grandes******************************
'Guarda los patrones de bits en laCG Ram
'Call _intstrngrandes() 'Poner al principio
Proc _intstrngrandes()
Lcddefchar 0, 16, 24, 24, 24, 24, 24, 24, 16  'Media barra lateral derecha.
Lcddefchar 1, 1, 3, 3, 3, 3, 3, 3, 1  'Media barra lateral izquierda.
Lcddefchar 2, 31, 31, 0, 0, 0, 0, 0, 0  'Barra superior sola.
Lcddefchar 3, 0, 0, 0, 0, 0, 0, 31, 31  'Barra inferior sola
Lcddefchar 4, 31, 31, 0, 0, 0, 0, 31, 31  'Barra superior e inferior.
Lcddefchar 5, 2, 6, 14, 30, 14, 6, 2, 0  'Flecha Izquierda.
Lcddefchar 6, 8, 12, 14, 15, 14, 12, 8, 0  'Flecha Derecha.
Lcddefchar 7, 0, 0, 0, 0, 0, 0, 0, 0  'Todo vacio.
Lcdcmdout LcdClear  'Se borra el LCD despues de guardar los chr
End Proc                                         
'**********************************************************************
'Función que agranda los caracteres numéricos de una cadena
'No está limitada en longitud, escrita para lcd de 2 líneas
'Parámetro de entrada: cadena tipo numérica
'Parámetro de entrada: posición en el LCD
'dirección: dirección en memoria de comienzo de la cadena
'xpos: posición de comienzo a imprimir en el LCD
'linea: indica la linea activa despues de escribir los números grandes
'linea = 0: linea activa inferior, linea=1: linea activa superior
'_strngrandes: devuelve la proxima posición a imprimir
'Call _strngrandes(dirección Ram cadena, posición a imprimir)
'*********************************************************************
Function _strngrandes(direccion As Word, xpos As Byte, linea As Bit) As Byte
Dim data As Byte  'Mascara
Dim index As Byte  'Indice mascara
Dim line As Bit  'Linea
Dim xx As Byte  'Contador caracteres de la cadena
Dim fin0 As Bit  'Control exit bucle linea
Dim fin As Bit  'Control bucle mascaras
Dim wline As Bit  'Se puede escribir mascara inferior
Dim strlen As Byte  'Longitud cadena
Dim strchr As Byte  'Exrae digito tipo cadena o ASCII
Dim cnt0 As Byte  'Indica la posición siguiente a imprimir
cnt0 = 0
line = False  'Se comienza con las mascaras superiores
wline = False  'No se puede imprimir mascaras inferiores
fin0 = False  'Bucle control lineas
fin = False  'Bucle imprime mascaras
xx = 0  'Contador digitos
strlen = _strlen(direccion)  'Asigna la longitud de la cadena
Lcdcmdout LcdLine1Pos(xpos)  'Establece posición en la linea 1
While fin0 = 0  'Bucle control líneas
strchr = _strchr(direccion, xx)  'Extrae caracter a agrandar de la cadena
index = 0  'Indica mascara a imprimir
wline = False  'No permite escribir mascara inferior, la mascara es superior
fin = 0  'Fin línea superior o inferior
While fin = False  'Bucle control de ipresión mascaras superior e inferior
If strchr = "0" Then data = LookUp(1, 2, 0, ".", 1, 3, 0, "*"), index  'Mascaras del 0
If strchr = "1" Then data = LookUp(0, ".", 0, "*"), index  'Mascaras del chr 1
If strchr = "2" Then data = LookUp(" ", 4, 0, ".", 1, 3, " ", "*"), index  'M. chr 2
If strchr = "3" Then data = LookUp(2, 0, ".", 4, 0, "*"), index  'M. chr 3
If strchr = "4" Then data = LookUp(1, 3, 0, ".", " ", " ", 0, "*"), index  'M. chr 4
If strchr = "5" Then data = LookUp(1, 4, " ", ".", " ", 3, 0, "*"), index  'M. chr 5
If strchr = "6" Then data = LookUp(1, 2, " ", ".", 1, 4, 0, "*"), index  'M. chr 6
If strchr = "7" Then data = LookUp(2, 0, ".", " ", 0, "*"), index  'M. chr 7
If strchr = "8" Then data = LookUp(1, 2, 0, ".", 1, 4, 0, "*"), index  'M. chr 8
If strchr = "9" Then data = LookUp(1, 4, 0, ".", " ", " ", 0, "*"), index  'M. chr 9
If data <> "." Or data <> "*" Then index = index + 1  'Selecciona mascara del mismo número
If line = False Then  'Mascaras línea superior
If data <> "." Then Lcdout data  'Imprime mascara actual
If data <> "." Then cnt0 = cnt0 + 1
If data = "." Then fin = True  'Fin mascaras superior del número seleccionado
Endif
If line = True Then  'Mascaras línea inferior
If data <> "*" And wline = True Then Lcdout data  'Imprime mascara actual
If data = "." Then wline = True  'Permite escribir mascara inf., mascara es inferior
If data = "*" Then fin = True  'Fin mascaras inferior del número seleccionado
Endif
Wend
xx = xx + 1  'Indica el proximo caracter a imprimir
If xx >= strlen And line = True Then fin0 = True  'Fin, todos impresos
If xx >= strlen And line = False Then Lcdcmdout LcdLine2Pos(xpos)  'Cambia a línea inferior
If xx >= strlen Then line = True  'Selecciona linea inferior
If xx >= strlen Then xx = 0  'Principio de línea
Wend
_strngrandes = cnt0 + xpos  'Siguiente posición a imprimir en el lcd
If linea = 0 Then Lcdcmdout LcdLine2Pos(_strngrandes)  'Establece línea inferior
If linea = 1 Then Lcdcmdout LcdLine1Pos(_strngrandes)  'Establece línea superior
End Function                                     
'**************************************************************************

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pcr314 en 11 de Diciembre de 2011, 02:33:36
Hola gente, soy nuevo aquí, estoy trabajando bastante con los usart pero bajo PSI no me ubico bien para emprender una comunicación via rs485, si alguien sabe algo les estare agradecido. saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: pcr314 en 11 de Diciembre de 2011, 03:48:27
Por que programo de esta manera?... sera porque me gusta complicarme la vida....

Por que crear una rutina especial "pause_ms" para las perdidas de tiempo "delay" y no utilizar las que suministra el Basic?
-pues porque al utilizar las interrupciones en especial las bases de tiempos, "Waitms y Waitus" se ven afectados los tiempos indicados se les alargan.

Por que utilizo siempre las interrupciones?
-pues me permite asegurarme que ciertas rutinas ya sean para control de tiempo, control de periféricos exteriores o modulos internos del pic, no se veran afectados por el crecimiento del programa.

Por que no suelo utilizar las funciones que facilita el lenguaje?
-pues porque son muy lentas y consumen mucha memoria comparadas con los modulos internos del pic, a de mas se ven afectadas por las interrupciones.

Por que en la mayoria de los casos solo utilizo estructuras simples?
-porque de esta manera sera mas facil migrar el programa a otro lenguaje.

Por que el uso de las bases de tiempos?
-primero, como este lenguaje no las tiene tengo que crearlas
-segundo, me permite controlar las veces que se ejecutara una rutina por segundo,
por ejemplo, para que quiero que se ejecute la funcion del LCD de continuo con lo lenta que es, si con solo refrescar los datos cada 100mSeg. es suficiente.
   



Gracias dogflu66, yo aprendí a programar en qbasic y sin conocer el asembler pase a PSI, La verdad notaba pérdidas de tiempo y colisiones con los timer pero no podía darme cuenta en que fallaba, se me hizo complicado en la lectura de encoder incrementales y comunicaciones a velocidades altas teniendo que migrar hasta incluso controladores de gama alta. con relojes de 40 MHZ pero tu forma de programar me ha dado un nuevo hilo de estudio, de nuevo muchas gracias.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Diciembre de 2011, 17:55:50
Hola pcr314;

Me alegro que sirva para algo el hilo. Con unas buenas maneras, costumbres o llámese método de programación se obtienen unos resultados asombros con microcontroladores trabajando a pocos Mhz, esto quien realmente lo sabe son los que trabajan con código maquina.

Para trabajar con datos serie por medio de la usart, en el índice del hilo puedes encontrar información. Lo que siempre aconsejo para trabajar con datos serie es la incorporación de un buffer de entrada en anillo (ring buffer), este está controlado por interrupciones y permite trabajar de una forma muy cómoda los datos serie junto con la ultima versión de funciones que escribí para procesar cadenas.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: sn4k32k6 en 21 de Abril de 2012, 14:50:50
hola dog! llevo mucho tiempo leyendo tus hilos, la verdad es que son muy buenos y me van aclarando muchas dudas ya que esta muy comprensible.

Intento siempre buscar todas las alternativas, antes de molestar con preguntas a los que saben, pero no doy pie con bola, no se si es por el pic, o por el codigo (en la pc me lo simula bien, no creo que sea el codigo ya que es bastante sencillo)
es el dado electronico, pero para correrlo en un 16F84A

'-----CONFIGURAMOS PUERTOS----------
AllDigital  'Todos los pines del PORTA como E/S
TRISA = 0xff  'Configuro el PORTA completo como entrada.
TRISB = 0x00  'Configuro el PORTB completo como salida.
PORTB.7 = 1
'------DECLARO VARIABLES -----------
Dim i As Byte  'i contendrá el valor del dado en cada momento.

loop:  'bucle principal

PORTB = %10000000  'Apago todos los leds menos el de Standby
   
   If PORTA.0 = 1 Then  'Si el pulsador esta en alto...
      Gosub lanzo_dado
   Endif
Goto loop

End  'Fin del programa principal                 

'--------------------------------------------------
'Esta rutina lanza el dado y muestra el resultado
'--------------------------------------------------
lanzo_dado:
PORTB.7 = 0 ' apago el standby
   i = 0  'Valor inicial de i
   While PORTA.0 = 1  'bucle principal
      i = i + 1  'Sumo 1 a i

      If i = 7 Then  'si pasa de 6...
         i = 1  '..empiezo de 1 otra vez.
      Endif
   Wend

   'Ahora, muestro el valor de "i" en los leds:
   PORTB = LookUp(0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0e), i
   WaitMs 5000  'espero 5 segundos, y vuelvo al programa ppal.
   PORTB.7 = 1 ' prendo StandBy
Return                                       



PD: aclaro, en la simulacion funciona, pero montado en el protoboard, cuando presiono el boton, al soltarlo, destella el numero y no espera los 5 segundos, no se si me explico. gracias de antemano :)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 22 de Abril de 2012, 20:16:15
Hola; el 16F84 tiene dos variantes el "16F84" y el "16F84A", ambos tienen que ser correctamente seleccionados. También hay que polarizar correctamente el pin 4 (MCLR) y por supuesto seleccionar el tipo de oscilador, en este caso dejo el programa para un cristal de 4Mhz. De todas formas seria conveniente que pegaras el esquema en el hilo para echar le un vistazo.

Código: [Seleccionar]
Define CONF_WORD = 0x3ff1
Define CLOCK_FREQUENCY = 4
'-----CONFIGURAMOS PUERTOS----------
'AllDigital  'Todos los pines del PORTA como E/S
TRISA = 0xff  'Configuro el PORTA completo como entrada.
TRISB = 0x00  'Configuro el PORTB completo como salida.
PORTB.7 = 1
'------DECLARO VARIABLES -----------
Dim i As Byte  'i contendrá el valor del dado en cada momento.
loop:  'bucle principal
PORTB = %10000000  'Apago todos los leds menos el de Standby
If PORTA.0 = 1 Then  'Si el pulsador esta en alto...
Gosub lanzo_dado
Endif
Goto loop
End  'Fin del programa principal                 
'--------------------------------------------------
'Esta rutina lanza el dado y muestra el resultado
'--------------------------------------------------
lanzo_dado:
PORTB.7 = 0  'apago el standby
i = 0  'Valor inicial de i
While PORTA.0 = 1  'bucle principal
i = i + 1  'Sumo 1 a i
If i = 7 Then  'si pasa de 6...
i = 1  '..empiezo de 1 otra vez.
Endif
Wend
'Ahora, muestro el valor de "i" en los leds:
PORTB = LookUp(0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0e), i
WaitMs 5000  'espero 5 segundos, y vuelvo al programa ppal.
PORTB.7 = 1  'prendo StandBy
Return
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: sn4k32k6 en 29 de Abril de 2012, 04:58:05
Gracias dogflu! Era la polarizacion del MCLR, el otro dia lo saque leyendo el datasheet, porque programe otro pic(16f873) y me hacia exactamente lo mismo xD
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 03 de Mayo de 2012, 05:55:50
Enhorabuena, me alegro de que solucionaras el problema.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 09 de Agosto de 2012, 19:44:19
He ampliado el indice del hilo con las funciones para manejar Cadenas y Números.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 15 de Marzo de 2013, 18:08:09
Hola A todos Especialmente a la mente de este sub-topico Doggflu... Bueno he estado leyendo harto de este programa para configurar pic y es bastante entendible, eso si gracias a los ejemplos y muchos hilos que tiene han ayudado en esta travesía.

Sin embargo me llama la atención que el amigo al cual estoy citando de JEVO23 no entiendo la finalidad de la programación y para que sirve, si no fuera la molestia, valorando su tiempo y su paciencia me podrían explicar que es lo que logro con ello.
Y por ultimo mi consulta, con el adcon0 que elige el canal analogico a activar, es posible activar a mas de uno a la vez, es decir que ambos trabajen en paralelo o no es posible....


De antemano me despido y gracias por su cooperación...
Hola de nuevo, si a alguien le interesa esta es la configuración que tengo en un PIC18F2550 a 20Mhz con cristal externo

Código: [Seleccionar]
'Programa: JEVO33
'Micro: PIC18f2550, cristal externo 20 MHz
'Version: 04

Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


Una pregunta que seguramente sera basica, si tengo un PWM iniciado en un port, ¿puedo poner el port fijo mediante p.e. PWMduty 2, 0 y PORTC.1=1 ?, ¿o tengo que parar primero el PWM ?

Tambien tengo un problemilla con una variable que me va flotando durante toda la ejecucion del programa, he intentado cambiarla de nombre, añadir una mas para que la cargue en una direccion de memoria diferente (a pasado de 0x43 a 0x45 pero me sigue variando), pero con todo y con ello me sigue variando todo el programa, ¿alguna idea?

Saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Marzo de 2013, 09:35:43
Con respecto a lo segundo:
Todos los pic con los que he trabajado las entradas analógicas van multiplexadas porque solo tienen un único convertidor analógico digital, ósea solo la lectura de un pin a la vez. Puedes preguntar en el foro técnico a ver si alguien conoce de un pic con más de un modulo ADC incorporado.

Con respecto a lo primero no te entiendo...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 17 de Marzo de 2013, 00:01:07
Código: [Seleccionar]
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

En este código sitiado, no entiendo que me permite hacer, que significa cada uno, por que haber leído lo que dice el help de oshon. No me ayudo si no mas bien me desayudo...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Marzo de 2013, 09:47:31
Ok, eso es la configuración básica del modo de funcionamiento del Pic y algunos módulos principales, se les suele llamar fusibles o bit de configuración, pueden ser nombrados como palabra de configuración o también se les puede hacer referencia simple como “fuses”. No son exactamente iguales entre los distintos Pic. Y la información de la utilidad solo viene en el datasheet del pic en cuestión. Esta configuración es la que trae de cabeza a los que suelen hacer abuso de los simuladores, porque la mayoría de estos bit no afectan al funcionamiento del simulador, pero al pasar el circuito a la realidad no suele funcionar hasta que se configuran correctamente.

Entre otras cosas se especifica los Tad del ADC, tipo de oscilador del Pic, voltaje bajo de alimentación al que hay que resetear el pic, divisor del PLL, si se protege la memoria de programa contra lecturas y un largo etc. Por suerte cuando solo se hace un uso muy superficial del pic la configuración por defecto suele hacer que funcione nuestro circuito, pero cuando se entran en mayores hay que configurarlos por fuerza.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 19 de Marzo de 2013, 13:01:30
Dogflu66, nuevamente abusare de tu sabiduria con una consulta. bueno estoy utilizando un pic18f4550, bueno revisando el ejemplo que deja huesonardo en la configuracion para el 16f877A para las interrupciones de tmr2 lo he tratado de llevar a utilizarlo en el pic de la familia 18, pero antes que todo he revisado el datasheet a ver si cambia alguna configuracion o palabra que esta tenga como referencia para configurar y mi sorpresa es que no suceder. Sin embargo cuando llego a programar en el simulator ide me llevo la no grata sorpresa de que  estos siguientes codigos no los reconoce

T2CON.TOUTPS0 = 0   'TMR2 Postcale
T2CON.TOUTPS1 = 0   'TMR2 Postcale
T2CON.TOUTPS2 = 1   'TMR2 Postcale
T2CON.TOUTPS3 = 0   'TMR2 Postcale

Por lo cual me tiene confundido pues tanto el datasheet como la programacion hecha por huesaldo son las mismas, pero pic18 no lo reconoce, tu sabes el porque, que me podrias sugerir ante esta situacion.

PD: lo que planeo hacer con esto es hacer un conteo para que ha cada 60 seg tome un muestra del ADC y almacenarlo en 5 muestras para poder tomar un promedio de ellas, y asi llevar un control exacto del tiempo sin tener que recurrir a los waitms.
Saludos. y gracias por toda la ayuda!

Hola tengo el siguiete problema:
quiero generar un cambio de estado en un pin cada 244µs por lo que configuré el TMR2 con el prescale en 1:1 y el postcale en 1:5. Tengo un PIC16F877A con un cristal de 20Mhz por lo que el calculo me dio


Código: [Seleccionar]
Define CONF_WORD = 0x3f72

AllDigital
TRISA = 0x00 'PORTA Outputs
INTCON.GIE = 1 'Int General
INTCON.PEIE = 1 'Int Perifericos
PIE1.TMR2IE = 1 'Int TMR2
T2CON.T2CKPS0 = 0 'TMR2 Prescale
T2CON.T2CKPS1 = 0 'TMR2 Prescale
T2CON.TOUTPS0 = 0 'TMR2 Postcale
T2CON.TOUTPS1 = 0 'TMR2 Postcale
T2CON.TOUTPS2 = 1 'TMR2 Postcale
T2CON.TOUTPS3 = 0 'TMR2 Postcale
PR2 = 244 'Overload TMR2
T2CON.TMR2ON = 1 'TMR2 ON
End                                               

On Interrupt

PORTA.0 = Not PORTA.0

PIE1.TMR2IF = 0

Resume 
 

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Marzo de 2013, 20:59:56
De la serie 18F he tenido que usar casi todos los modulos, pero el Tmr2 es uno de los que no he necesitado y la mayoria ha sido en lenguaje C, tengo que verlo con tiempo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Marzo de 2013, 14:15:51
Si los escribes como viene en el datasheet del micro si los reconoce.

T2CON.T2OUTPS0 = 0  'TMR2 Postcale
T2CON.T2OUTPS1 = 0  'TMR2 Postcale
T2CON.T2OUTPS2 = 1  'TMR2 Postcale
T2CON.T2OUTPS3 = 0  'TMR2 Postcale
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 20 de Marzo de 2013, 19:57:42
Ante todo debo agradecer lo que este foro y, sobre todo este hilo, me ha enseñado, dogflu, es un genio.
apelo a la generosa voluntad que alguno pueda dedicar a este tema.

estoy experimentando el protocolo wiegand en su estandard de 26 bits, utilizado en RFID. Lo que encontre en la red me fue de bastante ayuda para los primeros pasos, hay quien aconsejo hacer la lectura de los bits que llegan al pic sin utilizar las interrupciones, cuando se trabaja a 4Mhz, y asi lo hice

lo cierto es que el codigo, si bien no funciona perfectamente, (da señales de vida), y puede hacer lecturas de diferentes tags sin problemas, me resulta engorroso el manejo de los bit  que el puerto recibe, sospecho que el codigo que ensaye es perfectible.




Define CLOCK_FREQUENCY = 4
AllDigital
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTA
Define LCD_RWBIT = 1
Define LCD_EREG = PORTA
Define LCD_EBIT = 0
Define LCD_COMMANDUS = 1000
Define LCD_DATAUS = 50
Define LCD_INITMS = 39
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
TRISB = %00000000
TRISB.0 = 1
TRISB.1 = 1
TRISA = %00000000
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Dim valor As Long
Dim x As Byte
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
valor = 0
x = 0
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Lcdinit
WaitMs 100
main:
Gosub leetag 
If x = 25 Then
      Gosub cargavariables
Endif
Goto main
End                                               
leetag:

If PORTB.0 = 0 Then
While PORTB.0 = 0
Wend
Gosub cambiabituno
x = x + 1
Endif

If PORTB.1 = 0 Then
While PORTB.1 = 0
Wend
Gosub cambiabitcero
x = x + 1
Endif

Lcdout #valor, "        "
Lcdcmdout LcdLine1Home
WaitMs 1000

Return                                           
cambiabitcero:

'*************************************
'Pic simulator ide no permite el uso de
'for x = 0  to 23'
'valor.x = 0
'next x
'pero debe haber otra alternativa  que esta!
'**************
If x = 1 Then valor.0 = 0
If x = 2 Then valor.1 = 0
If x = 3 Then valor.2 = 0
If x = 4 Then valor.3 = 0
If x = 5 Then valor.4 = 0
If x = 6 Then valor.5 = 0
If x = 7 Then valor.6 = 0
If x = 8 Then valor.7 = 0
If x = 9 Then valor.8 = 0
If x = 10 Then valor.9 = 0
If x = 11 Then valor.10 = 0
If x = 12 Then valor.11 = 0
If x = 13 Then valor.12 = 0
If x = 14 Then valor.13 = 0
If x = 15 Then valor.14 = 0
If x = 16 Then valor.15 = 0
If x = 17 Then valor.16 = 0
If x = 18 Then valor.17 = 0
If x = 19 Then valor.18 = 0
If x = 20 Then valor.19 = 0
If x = 21 Then valor.20 = 0
If x = 22 Then valor.21 = 0
If x = 23 Then valor.22 = 0
If x = 24 Then valor.23 = 0

Return                                           
cambiabituno:
If x = 1 Then valor.0 = 1
If x = 2 Then valor.1 = 1
If x = 3 Then valor.2 = 1
If x = 4 Then valor.3 = 1
If x = 5 Then valor.4 = 1
If x = 6 Then valor.5 = 1
If x = 7 Then valor.6 = 1
If x = 8 Then valor.7 = 1
If x = 9 Then valor.8 = 1
If x = 10 Then valor.9 = 1
If x = 11 Then valor.10 = 1
If x = 12 Then valor.11 = 1
If x = 13 Then valor.12 = 1
If x = 14 Then valor.13 = 1
If x = 15 Then valor.14 = 1
If x = 16 Then valor.15 = 1
If x = 17 Then valor.16 = 1
If x = 18 Then valor.17 = 1
If x = 19 Then valor.18 = 1
If x = 20 Then valor.19 = 1
If x = 21 Then valor.20 = 1
If x = 22 Then valor.21 = 1
If x = 23 Then valor.22 = 1
If x = 24 Then valor.23 = 1

El punto es el siguiente una vez leida la trama completa
como guardar los datos recogidos en la eprom y como recuperarlos? (quiza para muchos sea sencillo) pero no se como resolver este entuerto con este idioma.

como manejar los bits que recibo por el puerto en variables que pasen de 24 bits a 3 byte y de 3 byte a long?

La finalidad del proyecto es manejar unos diez tags, ( es decir 10 * 3 bytes) guardados en la eprom y gestionarlos  (altas bajas permisos etc). y por supuesto activar dispositivos cuando lee un tag registrado en el pic
Espero haber sido claro en mis dudas y desde ya agradezco por adelantado cualquier ayuda que puedan darme.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Marzo de 2013, 22:47:52
Por lo pronto dejo tres funciones que permiten trabajar con bit de las variables o registros:

Código: [Seleccionar]
'******************************************
'Funciones para modificar o leer el Bit ***
'de una variable o registro hasta tipo Long
'By dogflu66, 03/2013 *********************
'Para simulación **************************
'******************************************
Hseropen 4600
Dim variable As Byte
Dim aux As Byte
Dim n As Byte
variable = %10011000
aux = 0

main:
aux = 0
TRISA = 0
TRISA = _bittrue(TRISA, 0)
aux.0 = TRISA.0
Hserout "TRISA.0=", #aux, CrLf

aux = 0
TRISA = _bitfalse(TRISA, 1)
aux.0 = TRISA.1
Hserout "TRISA.1=", #aux, CrLf

Hserout "-------------------", CrLf

aux = 0
variable = _bittrue(variable, 0)
variable = _bitfalse(variable, 3)
For n = 0 To 7
aux.0 = _getbit(variable, n)
Hserout "VARIABLE.", #n, "=", #aux, CrLf
Next n

Halt

End                                               
'Cambia a 1 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bittrue se transfiere el valor del bit modificado
Function _bittrue(_reg As Long, _bit As Byte) As Long
Dim _byte As Long
_byte = 1
_byte = ShiftLeft(_byte, _bit)
_reg = _reg Or _byte
_bittrue = _reg
End Function                                     
'Cambia a 0 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado
Function _bitfalse(_reg As Long, _bit As Byte) As Long
Dim _byte As Long
_byte = 1
_byte = ShiftLeft(_byte, _bit)
_byte = _byte Nand 0xffff
_reg = _reg And _byte
_bitfalse = _reg
End Function                                     
'_getbit es una funcion que nos devuelve el estado
'de un bit de una variable determinada hasta Long.
'_reg es la variable de entrada
'_bit es el numero de orden del bit deseado, de 0 a ...
'Mediante _getbit transfiere el valor del bit deseado
Function _getbit(_reg As Long, _bit As Byte) As Bit
_reg = ShiftRight(_reg, _bit)
_getbit = _reg.0
End Function   
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 21 de Marzo de 2013, 10:38:49
La verdad es que estoy sorprendido por la celeridad de tu aporte dogflu66, ademas de presicion de tu respuesta, (a veces pienso que eres un ordenador!!! jajajaja). Habia visto una funcion publicada por vos hace tiempo (getbit), pero no me daba idea como para hacer las otras dos funciones que agregaste en este ejemplo.

Infinitas gracias por ayudarme a salir de este embrollo en el que me meti!!!!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 21 de Marzo de 2013, 15:46:26
Gracias otra vez dogflu66!!!!!!!!

'**************************************************************************************************
'Solo Para simular!!!!!!! (solo es una parte del codigo en el que estoy trabajando, asi que, lo
'estoy publicando solo para simular y ver lo que sucede con las variables.
'si la simulacion se hace en el modo "Extremely fast" puede verse como los bits de la variable
'"valor_a", pasan uno a uno, a tres variables tipo byte y cuando se oprime el portc.3, pasan de los
'bytes uno a uno a una segunda variable, "valor_b"
'ojala les sirva como de manejo de una trama de 26 bits que entrega el protocolo wiegan (aplicado a la lectura
'de tags rfid),
'
'hecho gracias al INVALORABLE APORTE DE DOGFLU66, aclarando un poco el tema de las
'funciones que permiten migrar los bit de una variable hacia otra aunque estas no sean del mismo tipo
'
'**************************************************************************************************
Define CLOCK_FREQUENCY = 4
AllDigital
TRISB.0 = 1
TRISB.1 = 1
TRISC.3 = 1
'**************************************************************************************
Dim valor_a As Long
Dim valor_b As Long
Dim x As Byte
Dim n As Byte
Dim y As Byte
Dim a As Byte
Dim auxbyte(3) As Byte
'************************************************************************************
x = 25
n = 0
y = 0 'esta variable puede set tipo bit, pero es mas comodo tenerla tipo byte e imprimirla por hserout o en el lcd
a = 0
valor_a = %10101010101110101011101011  'trama de 26 bits, el primero y ultimo son start y stop
'************************************************************************************
main:

If x = 25 Then Gosub guardabytes  'a modo de llave para que solo se ejecute una vez

If PORTC.3 = 1 Then
   While PORTC.3 = 1
      Wend
   Gosub leebytes
Endif
Goto main
End                                               
guardabytes:
'************************************************************************************
'sub rutina que guarda el valor de una variable long,(utilizando los primeros 24 bits
'en tres bytes diferentes para poder guardarlos en la eeprom.
'************************************************************************************
a = 0
n = 0
For x = 1 To 24  '..............excluye la lectura del primero y ultimo bits de la trama
If x = 8 Then n = 1  'una vez que x supera los 8 primeros bits pasa al byte siguiente
If x = 16 Then n = 2  '" "....................16 ".................................
y.0 = _getbit(valor_a, x)  'toma el bit 'x' y lo guarda en el auxiliar 'y.0'
If y.0 = 1 Then auxbyte(n) = _bittrue(auxbyte(n), a)  'escribe 1 en el byte(n) en la posicion 'a'
If y.0 = 0 Then auxbyte(n) = _bitfalse(auxbyte(n), a)  'escribe 0 en el byte(n) en la posicion 'a'
a = a + 1  'amuenta el contador 'a'
If a = 8 Then a = 0  'resetea la cuenta de 'a'
Next x
x = 0

Return                                           
'************************************************************************************
'sub rutina que guarda el valor de una tres variables byte, en una unica variable
'long
'************************************************************************************
leebytes:
valor_b = _bittrue(valor_b, 0)  '.escribe 1 en el primer bit
valor_b = _bittrue(valor_b, 25)  'escribe 1 en el ultimo bit
a = 0
n = 0
For x = 1 To 24  'BUCLE QUE VUELCA LOS BITS DE 3 BYTES EN UNA VARIABLE LONG
If x = 8 Then n = 1  'UNA VEZ QUE X SUPERA 7 CAMBIA DE BYTE EN EL QUE GUARDAR LOS BITS DE LA TRAMA
If x = 16 Then n = 2  'CAMBIA DE BYTE EN EL QUE GUARDAR LOS BITS DE LA TRAMA
y.0 = _getbit(auxbyte(n), a)  'TOMA EL VALOR DEL BIT X DE LA VARIABLE AUXBYTE(N)
If y = 1 Then valor_b = _bittrue(valor_b, x)  '.ESCRIBE 1 EN EL BYTE(n) POSICION a
If y = 0 Then valor_b = _bitfalse(valor_b, x)  'ESCRIBE 0 EN EL BYTE n POSICION a
a = a + 1  'AUMENTA EL CONTADOR DE 0 A 7
If a = 8 Then a = 0  'RESETEA LA CUENTA
Next x
x = 0

Return                                           

Function _bittrue(_reg As Long, _bit As Byte) As Long

'Cambia a 1 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado

   Dim _byte As Long
   _byte = 1
   _byte = ShiftLeft(_byte, _bit)
   _reg = _reg Or _byte
   _bittrue = _reg
End Function                                     

Function _bitfalse(_reg As Long, _bit As Byte) As Long

'Cambia a 0 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado

   Dim _byte As Long
   _byte = 1
   _byte = ShiftLeft(_byte, _bit)
   _byte = _byte Nand 0xffff
   _reg = _reg And _byte
   _bitfalse = _reg
End Function                                     

'_getbit es una funcion que nos devuelve el estado
'de un bit de una variable determinada hasta Long.
'_reg es la variable de entrada
'_bit es el numero de orden del bit deseado, de 0 a ...
'Mediante _getbit transfiere el valor del bit deseado
Function _getbit(_reg As Long, _bit As Byte) As Bit
   _reg = ShiftRight(_reg, _bit)
   _getbit = _reg.0
End Function
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 21 de Marzo de 2013, 21:17:49
Gracias dogflu66, Probe y funciono, Correccion realizada!

Saludos   :-)
Si los escribes como viene en el datasheet del micro si los reconoce.

T2CON.T2OUTPS0 = 0  'TMR2 Postcale
T2CON.T2OUTPS1 = 0  'TMR2 Postcale
T2CON.T2OUTPS2 = 1  'TMR2 Postcale
T2CON.T2OUTPS3 = 0  'TMR2 Postcale
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 21 de Marzo de 2013, 23:37:12
Ok, veo que os manejais bien.

Para gatruca:

Ya he visto que llevas bien tu codigo, pero de todas formas dejo lo siguiente que tenia escrito pero no puede adjuntarlo con el anterior mensaje.

Bueno hay que ir por partes:

Como las variables de tipo Long trabajan con 32 bit puedes trabar directamente con este tipo de variable porque tiene más resolución de la que necesitas.

La conversión de tipos de variables de datos en este lenguaje es automática, entre tipos Long, Word y Byte, exceptuado la de tipo Bit que hay que realizarla mediante código del usuario.

Al igual que se puede trabajar con los bit de un variable también se pueden dividir en grupos de word y grupos de byte de forma directa. En este caso te interesa trabajar con una variable de paso tipo Long para componer la trama de bit y luego dividirla en Bytes para enviarlos uno a uno a la Eeprom interna. Si solo necesitas 3 bytes el cuarto más significativo de la variable de paso tipo Long lo ignoras. De todas formas es conveniente que lo mantengas limpio simplemente igualando este byte directamente a cero o en toda la variable poniéndola a cero antes de usarla. Esto es:
Dim vpaso as Long
Vpaso = 0 ‘Todos los bit de la variable a cero.
vpaso.4B = 0 'Byte más significativo a cero.

Y para manejarla:
vpaso.LB = ... ‘Byte 0, menos significativo del Long
vpaso.HB = ... ‘Byte 1
vpaso.3B = ... ‘Byte 2
vpaso.4B = ... ‘Byte 3, más significativo

Y para almacenar en la Eeprom:
Write dirección, vpaso.LB
Write dirección + 1, vpaso.HB
Write dirección + 2, vpaso.3B
Write dirección + 3, vpaso.4B

Y para recuperarlos pues el opuesto:
Read dirección, vpaso.LB
Read dirección + 1, vpaso.HB
Read dirección + 2, vpaso.3B
Read dirección + 3, vpaso.4B

Puedes crear unas funciones para  escritura y lectura propias que lo haga todo de una sola vez.

Ejemplo:
Código: [Seleccionar]
'***********************************************
'Funciones para W/R un Long en la Eeprom del pic
'By Dogflu66
'Para simulación
'***********************************************
End                                              
'Escribe una variable tipo Long en la Eeprom del Pic
'_reg = variable tipo Long a guardar en la Eeprom
'_direccion = direccion del Byte menos significativo de _reg
'Ejemplo (WriteLongEeprom):
'Call _wlongeeprom(vpaso, 200)
Proc _wlongeeprom(_reg As Long, _direccion As Word)
Write _direccion, _reg.LB
_direccion = _direccion + 1
Write _direccion, _reg.HB
_direccion = _direccion + 1
Write _direccion, _reg.3B
_direccion = _direccion + 1
Write _direccion, _reg.4B
End Proc
'Lee una variable tipo Long almacenada en la Eeprom del Pic
'_direccion = direccion del Byte menos significativo de la variable
'Ejemplo (ReadLongEeprom):
'vpaso = _rlongeeprom(200)
Function _rlongeeprom(_direccion As Word) As Long
Dim _reg As Long
_reg = 0
Read _direccion, _reg.LB
_direccion = _direccion + 1
Read _direccion, _reg.HB
_direccion = _direccion + 1
Read _direccion, _reg.3B
_direccion = _direccion + 1
Read _direccion, _reg.4B
_rlongeeprom = _reg
End Function           

Para terminar; puedes eliminar todas las funciones del codigo simplemente metiendolas todas en un archivo y luego añadiendolo al programa mediante un "Include" como si fuera una libreria para trabajar con los Bits de los registros. Esto reduce la longitud del programa facilitando su manejo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: gatruca en 23 de Marzo de 2013, 00:00:02
'codigo para leer el protocolo wiegand en 4mhz con la imprescindible ayuda de dogflu66
'autor: yo
'vresion:22/3/2013 23:38 hs
'...
' solo para simular, pero con algunas correcciones se puede grabar en el pic y esta probado, funciona!
' el codigo no tiene waitms ni otro tipo de esperas para la simulacion

Define CLOCK_FREQUENCY = 4
AllDigital
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTA
Define LCD_RWBIT = 1
Define LCD_EREG = PORTA
Define LCD_EBIT = 0
Define LCD_COMMANDUS = 1000
Define LCD_DATAUS = 50
Define LCD_INITMS = 39
TRISB = %00000000
TRISB.0 = 1
TRISB.1 = 1
Dim lectura_rfid As Long
Dim existe_eeprom As Bit
Dim x As Byte
'..............'estos valores son solo para simular.............................
x = 25  'la variable una vez grabado el pic debe estar a '0'
write 0, 1 ' el banco 0 indica que hay un registro en la memoria
Write 253, 93  'escribe en la eeprom los valores de la variable
Write 254, 85  'long de lectura, (solo los bytes que nos interesan
Write 255, 245  'de la trama wiegand)
lectura_rfid = %11111010101010101010111011  'valor que simula la lectura de la trama
'.......................................................................
Lcdinit
main:
Gosub lee_tag
If x = 25 Then  'si completo la lectura de la trama de bits
lectura_rfid = ShiftRight(lectura_rfid, 1)  'agrega un bit a la variable para eliminar el primer bit del protocolo
lectura_rfid.4B = 0  'pone el byte mas significativo a 0
existe_eeprom = busca_eeprom(lectura_rfid)  'busca si en la eeprom existe este registro leido.
Gosub printlcd  'imprime en la pantalla el resultado de la busqueda
x = 0  'se resetea la variable que pone al programa en espera de una nueva lectura de datos
Endif
Goto main
End                                               

lee_tag:  'rutina que ingresa los datos por el puerto b en protocolo wiegand
If PORTB.0 = 1 Then  'solo para simular, el real valor de este condicional es "if portb.0 = 0 then
While PORTB.0 = 1  'espera forzada para que la lectura no produzca fallos de interpretacion
Wend
lectura_rfid = _bittrue(lectura_rfid, x)  'va a la funcion que pone el bit "x" a 1
x = x + 1  'aumenta el contador x
Endif
If PORTB.1 = 1 Then  'solo para simular, el real valor de este condicional es "if portb.1 = 0 then
While PORTB.1 = 1  'espera forzada para que la lectura no produzca fallos de interpretacion
Wend
lectura_rfid = _bitfalse(lectura_rfid, x)  'va a la funcion que pone el bit "x" a 0
x = x + 1  'aumenta el contador x
Endif
Return                                           

printlcd: ' sin comentarios...................................................................
Lcdcmdout LcdLine1Home
Lcdout "Id: ", #lectura_rfid
If existe_eeprom = 1 Then
   Lcdcmdout LcdLine2Home
   Lcdout "ACTIVADO    "
Else
   Lcdcmdout LcdLine2Home
   Lcdout "DESACTIVADO    "
Endif
Return                                           

'funcion de busqueda en la eeprom. los saltos de a 3 bytes permiten guardar la trama de 24 bits obtenida en la lectura
'del protocolo. el primer banco de memoria se deja libre para utilizarlo como indice y poder agregar registros en la
'direccion adecuada a medida que aumenta el numero de tags que leera el sistema.

Function busca_eeprom(valor_r As Long) As Bit  'la funcion carga en un bit, true o false segun encuentre o no el tag leido

Dim x As Byte,  'variable de la funcion que indexa la direccion de busqueda
Dim busca As Long  'alojara el resultado byte a byte de lo almacenado en la eeprom

x = 1  'se asigna este valor para saltear el banco de memoria '0'

busca.4B = 0  'se pone a '0' el byte mas significativo de la variable

While x < 254  'si x supera este numero, sale del bucle, esto puede producirse por dos motivos: 1 encontro un registro
'......................que coincide el tag leido, o 2 llego al fin de la eprom sin encontrar ninguno coincidente

Read x, busca.LB  'aloja en un byte de la variable el byte que lee de la eeprom
x = x + 1  '.........aumenta el contador para cambiar la direccion de memoria
Read x, busca.HB  'aloja en un byte de la variable el byte que lee de la eeprom
x = x + 1  '.........aumenta el contador para cambiar la direccion de memoria
Read x, busca.3B  'aloja en un byte de la variable el byte que lee de la eeprom

If valor_r = busca Then  'si encuentra el registro arroja 1
busca_eeprom = 1 ' pone a true la variable
x = 252  'pone la variable a 252, para que a continuacion, cuando se ejecute x = x + 3 supere el tope de 254 y salga del bucle
Else  'si no encuentra, arroja 0
busca_eeprom = 0 ' pone a false la variable
Endif
x = x + 3  'aumenta el contador de la variable que lee la direccion de la memoria de tres en tres, (bytes)
Wend

End Function
                                     
'funcion, exelentemente explicada por dogflu66, (nada que agregar)
Function _bittrue(_reg As Long, _bit As Byte) As Long
   Dim _byte As Long
   _byte = 1
   _byte = ShiftLeft(_byte, _bit)
   _reg = _reg Or _byte
   _bittrue = _reg
End Function
                                     
'funcion, exelentemente explicada por dogflu66, (nada que agregar)
Function _bitfalse(_reg As Long, _bit As Byte) As Long
   Dim _byte As Long
   _byte = 1
      _byte = ShiftLeft(_byte, _bit)
   _byte = _byte Nand 0xffff
   _reg = _reg And _byte
   _bitfalse = _reg
End Function                                     




bueh, solo me falta hacer la rutina que graba en la eeprom los tags que van a estar registrados, cuando la termine, la publicare completa y quiza con alguna mejora.

Gracias dogflu66 el codigo, y sobre todo la velocidadde procesamiento aumento infinitamente con tus aportes y consejos! gracias por todo! sobre todo, por el tiempo que has dedicado a explicar las funciones, el manejo de bits con tanta claridad.

la ultima duda que me queda, (si esto ya no es un abuso), es saber si una funcion puede arrojar dos o mas variables como resultado.

Por ejemplo si pudiera saber, (cuando encuentra un registro en la eeprom),  en que posicion de la memoria lo encontro, esto permitiria que un tag especifico tenga acceso a gestionar la base de datos del sistema, altas, bajas etc..... ya seria un lujo.....
Se me ocurrio hacer una variable word en lugar de bit y utilizar un byte para saber si encontro o no, y el otro byte para saber en que banco lo encontro....(hasta ahi llega mi conocimiento).
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Marzo de 2013, 16:03:49
Cierto de esa forma se puede hacer, pero utilizando un Pic18 hay otras opciones más intuitivas para el programador. Estas opciones requieren mayores recursos de pila del pic, por lo que la familia 18 con su pila ampliada la permite perfectamente. Básicamente se traba de funciones que llaman a otra función que es la principal, la función auxiliar entra dentro de la principal y activa un mecanismo de selección del dato a extraer, la ventaja de todo esto es que al dato extraído se le puede llamar con el nombre de una función que se asemeja a lo que se desea.

Lo mejor es un ejemplo para entenderlo:

Esta función nos devuelve el cuadrado de un numero pero además queremos saber cuantas veces hemos llamado a la función. Esto se podría intentar realizar como indicas, pero no sabemos si el cuadrado del número será muy grande, esdecir, no sabemos cuantos bytes ocupa, así que no podriamos ubicar el número de veces que se ejecutó la función en el registro de salida.



Código: [Seleccionar]
'Para simulación
Hseropen 4600
Call _intcuadrado()  'Inicializa la función cuadrado de un número

main:
Dim numero As Long
Dim contador As Long
Dim x As Byte

For x = 0 To 50
numero = _cuadrado(x)  'Calcula el cuadrado de x
contador = _nvcuadrado()  'Retorna el número de veces que se ejecutó la función cuadrado
Hserout #x, "*", #x, "=", #numero, " Veces ejecutó la función =", #contador, CrLf
Next x

Halt
Goto main
End                                              
'Inicializa la función cuadrado de un número
'Esta función no retorna valor
Proc _intcuadrado()
Call _pcuadrado(0, 1)
End Proc                                          
'Retorna el numero de veces que se ejecutó la función cuadrado
'Retorna un numero tipo Long
Function _nvcuadrado() As Long
_nvcuadrado = _pcuadrado(0, 2)
End Function                                      
'Calcula el cuadrado de un número dado
'Se le suministra un número
'Retorna un numero tipo Long
Function _cuadrado(_numero As Long) As Long
_cuadrado = _pcuadrado(_numero, 0)
End Function                                      
'Función principal cuadrado
'Se le suministran dos numero:
'_numero = a calcular el cuadrado
'_ctrl = para el control de la función
'Retorna un número tipo Long
Function _pcuadrado(_numero As Long, _ctrl As Byte) As Long
Dim _contador As Long

If _ctrl = 1 Then
_contador = 0
Exit
Endif

If _ctrl = 2 Then
_pcuadrado = _contador
Exit
Endif
_numero = _numero * _numero
_pcuadrado = _numero
_contador = _contador + 1
End Function  

PD: El ejemplo creo que es más ilustrativo que interesante.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 27 de Marzo de 2013, 17:37:26
Código: [Seleccionar]
OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS


Hola denuevo Dogflu66, una vez mas estoy aquí para realizarte una nueva consulta el cual es relacionado al timer0,
primero que todo, como calculas el tiempo en que se ejecutara el tmr0, es decir si en el codigo anterior que he anexado tu colocas que funcione cada 1ms, es posible que pueda yo hacer que este funcione cada 60 segundos, existe una formula para hacer  este calculo.

La segunda y ultima consulta, como llegaste al valor de 130 para tmr0. Eso me tiene confundido :P... Bueno sin mas animos de molestarte me despido..
Saludos a todos.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 28 de Marzo de 2013, 16:59:57
Sale de aquí:

Tseg = 1mSeg = 0.001Seg.
Fosc = 8000000hz
Vreg. = 256 – ((Tseg / (1 / (Fosc / 4))) / prescaler )
Vreg. = 256 – ((0.001 / (1 / 2000000)) / 16)
Vreg. = 256 – (2000 / 16)
Vreg. = 131

Formula para los Timer:

Para los de 8Bits:
Vreg. = 256 – ((Tseg / (1 / (Fosc / 4))) / prescaler )

Para los de 16Bits:
Vreg. = 65536 – ((Tseg / (1 / (Fosc / 4))) / prescaler)

Aplicando el máximo preescaler (256) y la frecuencia del reloj a 4Mhz, me sale que no se puede conseguir los 60Seg., es un tiempo demasiado grande.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 28 de Mayo de 2013, 12:33:29
Saludos dogflu66,

tengo una duda y espero que puedas extenderme una mano si no es mucha la molestia, es posible indicar un valor de variable que tenga signo negativo por ejemplo:
Dim mb as long, pero el valor de esta es negativa..

la razon de esta consulta es que debo de hacer funcionar un sensor bmp085 que es de presión y temperatura, sin embargo hay variables que este sensor deben de ser consultadas antes de hacerla partir, debido a que vienen calibradas desde fabrica, pero como no se como nombrar las variables con valor negativo "pues me tiene confundido"  :shock: , necesito de tu consejo de como hacerlo si no es mucha la molestia.


saludos....
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 30 de Mayo de 2013, 20:54:42
No tiene signo este lenguaje, no se me ha planteado trabajar con signo, tengo que pensarlo...

Si no recuerdo mal las variables con signo llevan este en el bit más significativo del registro, si es 1 la variable es negativa y por lógica de Perogrullo si no lo lleva es positiva. Como se deduce las variables con signo tienen que contener números de menor longitud al quedar reservado el bit de signo. Habría que realizar unas funciones matemáticas para poder trabajar con signo, si es que se necesita realizar cálculos con signo. En el caso que no hagan falta y solo se requiere representarlo, sería mucho más sencillo realizar una función que controle el signo de los registros requeridos, esto último si que es más habitual.

Lectura de temperatura negativa y positiva con LM35:
http://www.pickey.es/uso-practico-del-pic12f675--v-.html

Nota: Actualmente si se puede trabajar con números negativos.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 10 de Junio de 2013, 20:05:38
Siguiendo con el signo, he escrito unas funciones para trabajar con números enteros con signo de 8bit y 16bit. Las dejo para el que quiera jugar con ellas.

Código: [Seleccionar]
'***************************************************************
'Funciones para trabajar con números con signo tipo Byte y Word.
'By dogflu66
'***************************************************************
Hseropen 4800
Dim sig_word As Word
Dim sig_word1 As Word
Dim sig_byte As Byte
Dim sig_aux As Word
'--------------------------
sig_word = _sigset16("-", 1)
sig_word1 = _sigset16("+", 0)
sig_byte = _sigset8("-", 50)

main:

Call _sigsprint16(sig_word)
Call _sprintcrlf()
Call _sigsprint16(sig_word1)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Suma: "
sig_aux = _sigadd16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Resta: "
sig_aux = _sigsub16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "División: "
sig_aux = _sigdiv16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Multiplicación: "
sig_aux = _sigmul16(sig_word, sig_word1)
Call _sigsprint16(sig_aux)
Call _sprintcrlf()

Call _sprintcrlf()
Hserout "Comparación: "
sig_aux = _sigcmp16(sig_word, sig_word1)
Call _sigsprint16(sig_word)
If sig_aux = 0 Then Hserout " < "
If sig_aux = 1 Then Hserout " > "
If sig_aux = 2 Then Hserout " = "
Call _sigsprint16(sig_word1)
Call _sprintcrlf()

End                                              
'División con signo 16Bit, entera.
Function _sigdiv16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
Dim _sigop2 As Bit
Dim _sigaux As Word

_sigop1 = _sigget16(_op1)
_sigop2 = _sigget16(_op2)
_op2 = _sigmod16(_op2)
_op1 = _sigmod16(_op1)

If _op1 > 0 Then
_sigaux = _op2 / _op1

If _sigop2 = 1 And _sigop1 = 0 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif
Endif
If _op1 = 0 Then _sigaux = 32768  'E = -0
_sigdiv16 = _sigaux
End Function                                      
'Multiplicación con signo 16Bit, entera.
Function _sigmul16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
Dim _sigop2 As Bit
Dim _sigaux As Word

_sigop1 = _sigget16(_op1)
_sigop2 = _sigget16(_op2)
_op2 = _sigmod16(_op2)
_op1 = _sigmod16(_op1)

_sigaux = _op2 * _op1

If _sigop2 = 1 And _sigop1 = 0 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif

_sigmul16 = _sigaux

End Function                                      
'Resta con signo 16Bit,entera.
Function _sigsub16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
_op1 = _sigcpl16(_op1)
_sigsub16 = _sigadd16(_op2, _op1)
End Function                                      
'Suma con signo 16Bit, entera.
Function _sigadd16(_op2 As Word, _op1 As Word) As Word
Dim _sigop1 As Bit
Dim _sigop2 As Bit
Dim _sigaux As Word

_sigop1 = _sigget16(_op1)
_sigop2 = _sigget16(_op2)
_op2 = _sigmod16(_op2)
_op1 = _sigmod16(_op1)

If _sigop2 = 0 And _sigop1 = 0 Then _sigaux = _op1 + _op2

If _sigop2 = 1 And _sigop1 = 0 Then
If _op2 > _op1 Then
_sigaux = _op2 - _op1
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif
If _op2 < _op1 Then _sigaux = _op1 - _op2
If _op2 = _op1 Then _sigaux = 0
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
If _op2 > _op1 Then
_sigaux = _op2 - _op1
Endif
If _op2 < _op1 Then
_sigaux = _op1 - _op2
If _sigaux > 0 Then _sigaux = _sigcpl16(_sigaux)
Endif
If _op2 = _op1 Then _sigaux = 0
Endif

If _sigop2 = 1 And _sigop1 = 1 Then
_sigaux = _op2 + _op1
_sigaux = _sigcpl16(_sigaux)
Endif

_sigadd16 = _sigaux
End Function                                      
'Compara dos números con signo de 16bit
'0 = op2 < op1
'1 = op2 > op1
'2 = op2 = op1
Function _sigcmp16(_op2 As Word, _op1 As Word) As Byte

Dim _sigop2 As Bit
Dim _sigop1 As Bit

_sigop2 = _sigget16(_op2)
_sigop1 = _sigget16(_op1)
_op1 = _sigmod16(_op1)
_op2 = _sigmod16(_op2)

If _sigop2 = 0 And _sigop1 = 0 Then
If _op2 < _op1 Then _sigcmp16 = 0
If _op2 > _op1 Then _sigcmp16 = 1
If _op2 = _op1 Then _sigcmp16 = 2
Endif

If _sigop2 = 0 And _sigop1 = 1 Then
_sigcmp16 = 1
Endif

If _sigop2 = 1 And _sigop1 = 0 Then
_sigcmp16 = 0
Endif

If _sigop2 = 1 And _sigop1 = 1 Then
If _op2 > _op1 Then _sigcmp16 = 0
If _op2 < _op1 Then _sigcmp16 = 1
If _op2 = _op1 Then _sigcmp16 = 2
Endif

End Function                                      
'Devuelve el signo variables 16bit, 1 = -, 0 = +
Function _sigget16(_op As Word) As Bit
_sigget16 = _op.15
End Function                                      
'Devuelve el signo variables 8bit, 1 = -, 0 = +
Function _sigget8(_op As Byte) As Bit
_sigget8 = _op.7
End Function                                      
'Invierte el signo de una variable 16Bit
Function _sigcpl16(_op As Word) As Word
Toggle _op.15
_sigcpl16 = _op
End Function                                      
'Invierte el signo de una variable 8Bit
Function _sigcpl8(_op As Byte) As Byte
Toggle _op.7
_sigcpl8 = _op
End Function                                      
'Devuelve el modulo de una variable con signo 16Bit
Function _sigmod16(_op As Word) As Word
_op.15 = 0
_sigmod16 = _op
End Function                                      
'Devuelve el modulo de una variable con signo 8Bit
Function _sigmod8(_op As Byte) As Byte
_op.7 = 0
_sigmod8 = _op
End Function                                      
'Asigna signo a las variables 16Bit
Function _sigset16(sig As Byte, _op As Word) As Word
If _op = 0 Then sig = "+"
If sig = "+" Then _sigset16 = _op
If sig = "-" Then
_op.15 = 1
_sigset16 = _op
Endif
End Function                                      
'Asigna signo a las variables 8Bit
Function _sigset8(sig As Byte, _op As Byte) As Byte
If _op = 0 Then sig = "+"
If sig = "+" Then _sigset8 = _op
If sig = "-" Then
_op.7 = 1
_sigset8 = _op
Endif
End Function                                      
'Extender signo tipo 8bit a tipo 16bit
Function _sigextw16(op As Byte) As Word
Dim sig_op As Bit
sig_op = op.7
op.7 = 0
_sigextw16 = op
_sigextw16.15 = sig_op
End Function                                      
'Funciones de salida de datos por el puerto serie UART.
'--------------------------------------------------
'Envia al puerto serie una variable con signo 16Bit
Proc _sigsprint16(_op As Word)
Dim _sigop As Bit
_sigop = _op.15
_op.15 = 0
If _sigop = 1 And _op = 0 Then
Hserout "E"
Exit
Endif
If _sigop = 1 Then Hserout "-"
Hserout #_op
End Proc                                          
'Envia al puerto serie una variable con signo 8Bit
Proc _sigsprint8(op As Byte)
If op.7 = 1 Then Hserout "-"
op.7 = 0
Hserout #op
End Proc                                          
'Linea nueva al puerto serie
Proc _sprintcrlf()
Hserout CrLf
End Proc

Salida de datos del ejemplo:
(http://img853.imageshack.us/img853/7163/funcionesconsigno.jpg)

PD: Con un poco más de tiempo iré ampliando los comentarios del código.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 20 de Junio de 2013, 00:54:16
Saludos dogflu66, un crack por tus respuestas. Mira recurro tu sabiduria, otra vezzz, pero con mi programación, que incluyo mas adelante, a ver si me puedes aconsejar para poder optimizarlo y bueno obtener el resultado esperado. Vamos al grano, estoy configurando un dht22 para leer humedad y temperatura, actualmente en la red no existe nada  de programaciones ejemplos o de apoyo excepto en c o arduino, los cuales entiendo poco. entonces aqui esta la novedad yo intente hacer algo, pero adivina me arroja inconsistencias, entonces aqui es donde pido tu sabia experiencia y apoyo para este pequeño. Te adjunto una imagen de cuales son los valores que me arroja en el display, ademas del datasheet o el enlace donde se encuentra y lo mas importante la programacion.


Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
'configuracion de display

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTB
Define LCD_RWBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Lcdinit

'configuracion de entradas
AllDigital  'todas las entradas como digital
TRISA = %00000000  'entrasdas puerto a como salidas
TRISB = %00000000  'entradas puerto b como salidas

Symbol dht_11 = PORTA.1  'puerto a0 se conportara bidireccionalmente, es decir enviara pulso para pedir datos y recibir informacion

Dim colector(31) As Byte
Dim humedad As Byte
Dim humedad1 As Byte
Dim temperatura As Byte
Dim temperatura1 As Byte
Dim temp As Byte
Dim temp1 As Byte
Dim hume As Byte
Dim hume1 As Byte
inicio:

'leer DHT11
Config dht_11 = Output
High dht_11  'enviamos un 1 al sensor
WaitUs 1  '10
Low dht_11  'enviamos un 0 para indicarle al sensor
WaitMs 18
High dht_11  'enviamos un 1 para completar la peticon de comunicacion
WaitUs 30  '30
Config dht_11 = Input
WaitUs 180
Dim i As Byte
For i = 31 To 0 Step -1
'dht_11 = colector(1)
'WaitUs 2.5
'Next i
Define COUNT_MODE = 2
Count dht_11, 1, colector(i)
WaitUs 3
Next i
'transofrmacion humedad parte entera
If colector(31) > 3 Then
humedad.7 = 1
Else
humedad.7 = 0
Endif
If colector(30) > 3 Then
humedad.6 = 1
Else
humedad.6 = 0
Endif
If colector(29) > 3 Then
humedad.5 = 1
Else
humedad.5 = 0
Endif
If colector(28) > 3 Then
humedad.4 = 1
Else
humedad.4 = 0
Endif
If colector(27) > 3 Then
humedad.3 = 1
Else
humedad.3 = 0
Endif
If colector(26) > 3 Then
humedad.2 = 1
Else
humedad.2 = 0
Endif
If colector(25) > 3 Then
humedad.1 = 1
Else
humedad.1 = 0
Endif
If colector(24) > 3 Then
humedad.0 = 1
Else
humedad.0 = 0
Endif

'transformacion humedad parte decimal
If colector(23) > 3 Then
humedad1.7 = 1
Else
humedad1.7 = 0
Endif
If colector(22) > 3 Then
humedad1.6 = 1
Else
humedad1.6 = 0
Endif
If colector(21) > 3 Then
humedad1.5 = 1
Else
humedad1.5 = 0
Endif
If colector(20) > 3 Then
humedad1.4 = 1
Else
humedad1.4 = 0
Endif
If colector(19) > 3 Then
humedad1.3 = 1
Else
humedad1.3 = 0
Endif
If colector(18) > 3 Then
humedad1.2 = 1
Else
humedad1.2 = 0
Endif
If colector(17) > 3 Then
humedad1.1 = 1
Else
humedad1.1 = 0
Endif
If colector(16) > 3 Then
humedad1.0 = 1
Else
humedad1.0 = 0
Endif

'transformacion temperatura parte entera
If colector(15) > 3 Then
temperatura.7 = 1
Else
temperatura.7 = 0
Endif
If colector(14) > 3 Then
temperatura.6 = 1
Else
temperatura.6 = 0
Endif
If colector(13) > 3 Then
temperatura.5 = 1
Else
temperatura.5 = 0
Endif
If colector(12) > 3 Then
temperatura.4 = 1
Else
temperatura.4 = 0
Endif
If colector(11) > 3 Then
temperatura.3 = 1
Else
temperatura.3 = 0
Endif
If colector(10) > 3 Then
temperatura.2 = 1
Else
temperatura.2 = 0
Endif
If colector(9) > 3 Then
temperatura.1 = 1
Else
temperatura.1 = 0
Endif
If colector(8) > 3 Then
temperatura.0 = 1
Else
temperatura.0 = 0
Endif

'temperatura parte decimal
If colector(7) > 3 Then
temperatura1.7 = 1
Else
temperatura1.7 = 0
Endif
If colector(6) > 3 Then
temperatura1.6 = 1
Else
temperatura1.6 = 0
Endif
If colector(5) > 3 Then
temperatura1.5 = 1
Else
temperatura1.5 = 0
Endif
If colector(4) > 3 Then
temperatura1.4 = 1
Else
temperatura1.4 = 0
Endif
If colector(3) > 3 Then
temperatura1.3 = 1
Else
temperatura1.3 = 0
Endif
If colector(2) > 3 Then
temperatura1.2 = 1
Else
temperatura1.2 = 0
Endif
If colector(1) > 3 Then
temperatura1.1 = 1
Else
temperatura1.1 = 0
Endif
If colector(0) > 3 Then
temperatura1.0 = 1
Else
temperatura1.0 = 0
Endif

Gosub calculo

Gosub lcd

Goto inicio
End                                               

calculo:

temp = temperatura + temperatura1
temp1 = temp / 10

hume = humedad + humedad1
hume1 = hume / 10

Return                                           
lcd:
Lcdcmdout LcdClear
Lcdout "hum:", #hume, "/", #humedad, "/", #humedad1
Lcdcmdout LcdLine2Home
Lcdout "temp:", #temp, "/", #temperatura, "/", #temperatura1
WaitMs 5000
Return

Datasheet dht22 (http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Weather/RHT03.pdf)

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Junio de 2013, 19:57:56
No he utilizado el componente, mirare el código a ver si veo algo raro.
--------------------------------------
¿Que micro es el que estas utilizando?.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 20 de Junio de 2013, 22:24:52

Gracias por revisar estimado, Utilizo el pic 18f4550 y para programarlo uso el pic18simulator ide.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 23 de Junio de 2013, 21:35:57
Dejo el siguiente código que no he podido probar pero creo que va mejor encaminado.
Lo ideal para este menester es emplear un timer pero por el momento no dispongo de tiempo, más adelante, con más tiempo realizaré una función para el sensor.

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
'Define SIMULATION_WAITMS_VALUE = 1
'configuracion de display
Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTB
Define LCD_RWBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Lcdinit
'Configuracion de puertos
AllDigital  'Los pin I/O como digitales
TRISA = %00000000  'Puerto A como salidas
TRISB = %00000000  'Puerto B como salidas

Dim rh As Word  'Humedad relativa
Dim tmp As Word  'Temperatura
Dim _bit As Bit  'Auxiliar
Dim n As Byte  'Auxiliar
Dim x As Byte  'Auxiliar

main:
'Puesta a cero
rh = 0
tmp = 0

'Demanda de lectura al sensor
RA0 = 0
WaitUs 2000

'MCU se prepara para recibir datos
TRISA.0 = 1  'Bus como Read
WaitUs 5  'Estabilización
While RA0 = 1  'Esperando respuesta
Wend
While RA0 = 0  'Esperando respuesta
Wend
While RA0 = 1  'Esperando respuesta
Wend

'Read data transmission RH
For n = 0 To 15
x = 0
While RA0 = 0
Wend
While RA0 = 1
WaitUs 1
x = x + 1
Wend
If x < 40 Then rh.0 = 0
If x > 40 Then rh.0 = 1
If n < 15 Then rh = ShiftLeft(rh, 1)
Next n

'Read data transmission TMP
For n = 0 To 15
x = 0
While RA0 = 0
Wend
While RA0 = 1
WaitUs 1
x = x + 1
Wend
If x < 40 Then tmp.0 = 0
If x > 40 Then tmp.0 = 1
If n < 15 Then tmp = ShiftLeft(tmp, 1)
Next n

fin:  'Bucle infinito
Goto fin
Goto main
End


Correción:
   Donde decia If n < 15 Then rh = ShiftRight(rh, 1) ahora dice If n < 15 Then rh = ShiftLeft(rh, 1)

   Donde decia If n < 15 Then tmp = ShiftRight(tmp, 1) ahora dice If n < 15 Then tmp = ShiftLeft(tmp, 1)

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 23 de Junio de 2013, 21:48:50
Graias dogflu... Probare y comentare que tal...
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 26 de Junio de 2013, 12:47:49
Lleve a cabo la prueba con la programación que has facilitado efectuando la correccion, a excepción de agregar unas lineas de código que me permitieran observar cual es el resultado que otorga el dht22.

los resultados fueron los siguientes, al iniciarlo se observa que la respuesta del sensor tiene un retardo significando, después de transcurrido unos minutos que pueden ser variables desde 3, 5 o hasta 10 min. muestra los resultados.
Mi observación a que este fenómeno suceda es debido a la utilización del ciclo while, pero es solamente una suposición, pues no puedo darme una explicación basado en conocimientos sólidos de programación.
Seguiré haciendo pruebas a ver si se puede mejorar o encontrar una manera de que demore menos...

Saludos y nuevamente te agradezco tu ayuda dogflu..
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 26 de Junio de 2013, 17:25:58
Al no tener el sensor solo puedo especular con la rutina. De todas formas imagino que probaste con las ultimas correcciones que hice.

Dejo otra versión que tiene tiempo maximo en los Whiles.

Código: [Seleccionar]
Define CLOCK_FREQUENCY = 20
Define SIMULATION_WAITMS_VALUE = 1
'configuracion de display
Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTB
Define LCD_RWBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Lcdinit
'Configuracion de puertos
AllDigital  'Los pin I/O como digitales
TRISA = %00000000  'Puerto A como salidas
TRISB = %00000000  'Puerto B como salidas

Dim rh As Word  'Humedad relativa
Dim tmp As Word  'Temperatura
Dim n As Byte  'Auxiliar
Dim x As Byte  'Auxiliar

main:
'Puesta a cero
rh = 0
tmp = 0

'Demanda de lectura al sensor
RA0 = 0
WaitUs 2000

'MCU se prepara para recibir datos
TRISA.0 = 1  'Bus como Read
WaitUs 5  'Estabilización
x = 0
While RA0 = 1 And x < 200  'Esperando respuesta
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 0 And x < 200  'Esperando respuesta
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 1 And x < 200  'Esperando respuesta
WaitUs 1
x = x + 1
Wend

'Read data transmission RH
For n = 0 To 15
x = 0
While RA0 = 0 And x < 200
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 1 And x < 200
WaitUs 1
x = x + 1
Wend
If x < 40 Then rh.0 = 0
If x > 40 Then rh.0 = 1
If n < 15 Then rh = ShiftLeft(rh, 1)
Next n

'Read data transmission TMP
For n = 0 To 15
x = 0
While RA0 = 0 And x < 200
WaitUs 1
x = x + 1
Wend
x = 0
While RA0 = 1 And x < 200
WaitUs 1
x = x + 1
Wend
If x < 40 Then tmp.0 = 0
If x > 40 Then tmp.0 = 1
If n < 15 Then tmp = ShiftLeft(tmp, 1)
Next n

fin:  'Bucle infinito
Goto fin
Goto main
End
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 26 de Junio de 2013, 19:51:33
Saludos Dogflu,

Bueno exactamente como tu dices si hice las correcciones pertinentes y nuevamente te agradezco tu ayuda   :-/..

Con respecto a la nueva recomendación probare y comentare nuevamente que es lo que sucede.



Saludos.. 
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Julio de 2013, 09:00:04
Dejo las funciones necesarias para la lectura del sensor de humedad relativa y temperatura RHT03 o DHT22 usando el Timer1:

Código: [Seleccionar]
'**********************************************************************************
'Función de lectura de humedad relativa y temperatura para el sensor RHT03 0 DHT22 con TMR1
'Placa PicEBasic, By dogflu66, 07/2013
'Basic Pic Simulator IDE (PSI), v6.92, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Puerto del LCD ----------------------------------------------------------
Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
Define LCD_DREG = PORTA  'Bus de datos, puerto A
Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
Define LCD_RSBIT = 7  'RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E, puerto B
Define LCD_EBIT = 6  'RB6 como E
Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Espera inicialización del Display
'Configuración Placa Pic EBasic -----------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
TRISB.5 = 0  'Como salida(RB5,Tx RS232)
TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
TRISB.4 = 1  'Como entrada (RHT03 inicio)
PORTB.3 = 1  'Luz lcd a ON (RB3)
PORTA.7 = 1  'Led amarillo a OFF
PORTB.0 = 1  'Led verde a OFF
PORTB.1 = 0  'LED RHT03 a OFF
'-----------------------------------------
Hseropen 4800  'Inicializa puerto RS232 por hardware a 4800Baudios
Lcdinit  'Inicializa el LCD sin cursor
'Constantes y variables ------------------
Dim hr As Word  'Humedad relativa
Dim tmp As Word  'Temperatura
Dim chk As Byte  'Checksum suministrado por el sensor
'-----------------------------------------
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Test P. RHT03"  'Imprime el texto en el LCD
Call _rht03ini(8)  'Se comunica a la función del RHT03 la velocidad del reloj en Mhz
WaitMs 2000  'Pausa de 2 Seg.
main:
'Muestra lecturas
Call _rht03read()  'Lee sensor, 500mSeg. minimo entre lectura y lectura
hr = _ped1(_rht03read.HW)  'Asigna humedad relativa, parte entera hr.HB y decimal hr.LB
tmp = _ped1(_rht03read.LW)  'Asigna temperatura, parte entera tmp.HB y decimal tmp.LB
chk = _rht03chk()  'Asigna lectura valida o erronea
Lcdcmdout LcdLine1Home  'Cursor del lcd al principio linea 1
Lcdout "HR:", #hr.HB, ".", #hr.LB, " T:", #tmp.HB, ".", #tmp.LB, "C "  'Salida de datos
Lcdcmdout LcdLine2Home  'Cursor del Lcd al principio linea 2
Lcdout "Checksum: "  'Salida de datos
If chk = 0 Then Lcdout "OK.    "
If chk = 1 Then Lcdout "ERROR. "
WaitMs 500  'Deja que el sensor se prepare para la siguiente lectura, tiempo recomendado 2Seg.
Call _flashled(50)  'Parpadeo led en mSeg.
Goto main
End                                              
Include "Trabajando con bit.bas"
'-------------------------------------------------
'Cambia de formato una variable Word, retorna valor
'Cambia de formato un Word que contiene un decimal
'integrado en la parte entera (151 = 15.1 * 10)
'variable = _ped1(151) o call _ped1(151)
'para _numero = 151, _ped1.HB = 15 y _ped1.LB = 1
Function _ped1(_numero As Word) As Word
_ped1.HB = _numero / 10  'Extrae parte entera
_ped1.LB = _numero - (_ped1.HB * 10)  'Extra parte decimal
End Function                                      
'Inicaliza la función de lectura del RHT03, no retorna valor
'Argumento de entrada _clk = a Mhz del reloj del sistema
'Call _rht03ini(8)  'se trabaja a 8 Mhz
Proc _rht03ini(_clk As Byte)
Call _rht03(0, _clk)
End Proc                                          
'Devuelve el checksum de la ultima lectura, retorna valor
'para _rht03chk = 0 lectura correcta, = 1 fallo en lectura
'checksum = _rht03chk() o Call _rht03chk()
Function _rht03chk() As Byte
_rht03chk = _rht03(1, 0)
End Function                                      
'Pide una lectura de temperatura a la función principal, retorna valor
'_rht03read.HW = tiene la lectura de la humedad relativa con un decimal integrado en la parte entera
'_rht03read.LW = tiene la lectura de la temperatura con un decimal integrado en la parte entera
'hr = _rht03read.HW  'Humedad relativa de la última lectura
'tmp = _rht03read.LW  'Temperatura de la última lectura
Function _rht03read() As Long
_rht03read = _rht03(2, 0)
End Function                                      
'Funcion de lectura y control del sensor RHT03, devuelve valor
'_clk = velocidad del oscilador en Mhz
'para _ctrl = 0, devuelve _rht03 = 0, pone checksum en error, se incializa la función
'para _ctrl = 1, devuelve False o True de la última lectura, True = lectura erronea
'para _ctrl resto valores, devuelve en _rht03 la humedad relativa (_rht03.HW) y la temperatura (_rht03.LW)
Function _rht03(_ctrl As Byte, _clk As Byte) As Long
Symbol t1db = PIR1.TMR1IF  'Se renombra el flag de desbordamiento del Timer
Dim rh As Word
Dim tmp As Word
Dim chk As Byte
Dim chk_aux As Byte
Dim clock As Byte
Dim n As Byte
Dim x As Byte
Dim v_aux(40) As Byte
'Inicializa la función
If _ctrl = 0 Then
'Configuración del TIMER1---------------------------------------------------
T1CON.TMR1CS = 0  'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
T1CON.TMR1ON = 0  'parado el contador del TMR1
PIE1.TMR1IE = 0  'desactiva las interrupciones del timer1
'Inicializa las variables de la función
chk_aux = 1  'Se activa el checkum de la función como error
chk = 0
clock = _clk * 10  'Calcula y asigna el tiempo que dura el ancho de pulso correspondiente al cero
_rht03 = 0  'Variable de salida de la función a cero
Exit  'Fuerza la salida de la función
Endif
'Devuelve el checksum, 0 = OK, 1 = error de lectura ---------------------
If _ctrl = 1 Then
If chk_aux = chk Then _rht03 = 0  'Dato válido
If chk_aux <> chk Then _rht03 = 1  'Dato no válido
Exit  'Fuerza la salida de la función
Endif
'Puesta a cero --'---------------------------------------------------------
rh = 0
tmp = 0
chk_aux = 1  'Se activa error de checksum por defecto
chk = 0
_rht03 = 0
'Espera que el puerto de comunicaciones del sensor quede libre ----------
Call _initmer()  'Puesta a cero del Timer
While RB4 = 0 And t1db = 0  'Espera cambio de estado del puerto o desborde Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo
'Solicitud de una lectura al sensor -------------------------------------
TRISB.4 = 0
RB4 = 0
WaitMs 2
'MCU se prepara para recibir datos --------------------------------------
Call _initmer()  'Puesta a cero del Timer
TRISB.4 = 1  'Bus como Read
While RB4 = 1 And t1db = False  'Esperando respuesta o desborde del Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo

Call _initmer()  'Puesta a cero del Timer
While RB4 = 0 And t1db = 0  'Esperando respuesta o desborde del Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo

Call _initmer()  'Puesta a cero del Timer
While RB4 = 1 And t1db = False  'Esperando respuesta o desborde del Timer
Wend
If t1db = True Then Exit  'Termina la función si Timer se desbordo
'Read data, recepción RH, TMP y Checksum ---------------------------------
n = 0
While n < 40
Call _initmer()  'Puesta a cero del Timer
While RB4 = 0 And t1db = False  'Esperando que termine sincronismo del dato o desborde Timer
Wend
If t1db = True Then Exit  'Termina la función si tmr se desbordo

Call _initmer()  'Puesta a cero del Timer
While RB4 = 1 And t1db = False  'Midiendo el ancho del pulso de la parte del dato significativa
Wend
v_aux(n) = _tmer()  'Va asignando los tiempos medidos a los elementos del vector contenedor
n = n + 1  'Incrementa el indice del vector contenedor
If t1db = True Then Exit  'Termina la función si tmr se desbordo
Wend
'Transfiere los tiempos capturados a datos -------------------------------
'Humedad relativa
n = 0
x = 15
While n < 16
If v_aux(n) < clock Then rh = _bitfalse(rh, x)
If v_aux(n) > clock Then rh = _bittrue(rh, x)
n = n + 1
x = x - 1
Wend
'Temperatura
n = 16
x = 15
While n < 32
If v_aux(n) < clock Then tmp = _bitfalse(tmp, x)
If v_aux(n) > clock Then tmp = _bittrue(tmp, x)
n = n + 1
x = x - 1
Wend
'Checksum del sensor
n = 32
x = 7
While n < 40
If v_aux(n) < clock Then chk = _bitfalse(chk, x)
If v_aux(n) > clock Then chk = _bittrue(chk, x)
n = n + 1
x = x - 1
Wend
'Comprueba que los checksum son iguales y asigna valores a la variable de salida ----
chk_aux = rh.HB + rh.LB + tmp.HB + tmp.LB  'Checksum calculado
If chk_aux = chk Then  'Si los checksum son iguales...
_rht03.HW = rh  'Asigna la humedad realativa al Word superior
_rht03.LW = tmp  'Asigna la temperatura al Word inferior
Endif
End Function                                      
'Flash led en mSeg., no retorna valor
'Call _flashled(50)  'Flash led de 50 mSeg.
Proc _flashled(_timeflash As Byte)
_timeflash = _timeflash / 2
RB1 = 1
WaitMs _timeflash
RB1 = 0
WaitMs _timeflash
End Proc                                          
'Reinicia y pone a contar al TMR1, no retorna valor
'Call _initmer()
Proc _initmer()
TMR1H = 0x00  'Borra el registro alto del timer1
TMR1L = 0x00  'Borra el registro bajo del timer1
PIR1.TMR1IF = 0  'Flash dosborde a cero
T1CON.TMR1ON = 1  'Activa el contador del TMR1
End Proc                                          
'Devuelve la lectura del TMR1, retorna valor
'Retorna en _tmer el contador del Timer
'valor_contador = _tmer() o Call _tmer()
Function _tmer() As Word
T1CON.TMR1ON = 0  'Para el contador del TMR1
_tmer.HB = TMR1H  'Asigna registro de más peso
_tmer.LB = TMR1L  'Asigna registro de menos peso
End Function                                      
'**************************************************************************
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 15 de Julio de 2013, 15:01:14
Saludos,

he estado un poco alejado de esto, de hecho estaba realizando otras pruebas que han llegado a buen puerto con uno que otro detalle.
Retomando el asunto del DHT22 o RH03. me encuentro con la nueva solución que has brindado la cual se agradece enormemente, sin embargo leyendo las rutinas me he fijado en unas cosas y las cuales comprendo poco, estas son:


1_ en una parte de la programación hay una sentencia que dice include "trabajando con bit.bas"; corrígeme si estoy equivocado pero esta sentencia incluye una programación ya antes realizada por ti.

2_ cuando utilizas un oscilador interno con el timer1 el de 8 mhz, no se ve afectado al utilizar un crystal de 20 Mhz externo.

3_ Hseropen 4800  'Inicializa puerto RS232 por hardware a 4800Baudios; cuando utilizas esta linea de programacion cual es el objetivo.


Gracias por todo nuevamente.   :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Julio de 2013, 15:14:06
1)
Trabajando con bit son funciones anteriores en concreto uso estas dos:

Código: [Seleccionar]
'Cambia a 1 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bittrue se transfiere el valor del bit modificado
Function _bittrue(_reg As Long, _bit As Byte) As Long
Dim _byte As Long
_byte = 1
_byte = ShiftLeft(_byte, _bit)
_reg = _reg Or _byte
_bittrue = _reg
End Function                                      
'Cambia a 0 el valor de un bit especifico de un registro hasta Long
'_reg es la variable o registro de entrada
'_bit es el numero de orden del bit a modificar, de 0 a ...
'Mediante _bitfalse transfiere el valor del bit modificado
Function _bitfalse(_reg As Long, _bit As Byte) As Long
Dim _byte As Long
_byte = 1
_byte = ShiftLeft(_byte, _bit)
_byte = _byte Nand 0xffff
_reg = _reg And _byte
_bitfalse = _reg
End Function                                

2)
Da lo mismo si el reloj es interno o externo, tan solo indicar los Mhz, si mis cálculos son correcto debería funcionar también a 20Mhz.
Solo he podido probar la función a 8Mhz, pero en teoría tendría que funcionar porque es proporcional y el Timer1 es de 16Bit y no debe de quedarse corto.

3)
Es la configuración básica de la placa, la utilizo mucho sobretodo para depuración ya que puedo sacar gran cantidad de datos sin limitación.
En este caso no se utiliza, lo mismo que no se utilzan los led, adc, I2c ni teclas de la placa.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 15 de Julio de 2013, 15:43:41
Dejo una imagen:

(http://img16.imageshack.us/img16/1320/zlts.jpg) (http://imageshack.us/photo/my-images/16/zlts.jpg/)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 15 de Julio de 2013, 17:36:12
Dogflu.

Se agradece tu ayuda funciona de maravillas, no puedo dejar una imagen inserta para que puedas ver pero funciona 100% ((:-))



Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 03 de Septiembre de 2013, 14:25:54
Dogflu,

Te saludo nuevamente, mira espero no incomodarte pero necesito otra vez de tus sabiduría y asistencia si no es mucho pedir.

Te explico, estoy tratando de hacer correr un dispositivo de medición barométrica y temperatura, este dispositivo es el bmp 085, este trabaja con comunicación i2c hasta ahi no tengo problemas, entiendo como trabaja este tipo de comunicaicon, pues ya hecho trabajar algunos dispositivos con este protocolo, Sin embargo me ha estado arrojando problemas este ultimo.

principalmente para poder hacerlo funcionar, se debe de leer la memoria eprom del bmp, el cual tiene en su interior los valores de calibración tanto para la presión como la temperatura, ahi no tengo problema "creo" pues me arroja valores que estimo coherentes. sin embargo cuando deseo leer el registro de valores censados para la presión, UP, me arroja valores incoherentes o nulos. Te adjunto la programacion que he realizado y tambien te adjunto un pdf que explica le funcionamiento del sensor.


http://tienda.tdrobotica.co/download/BST-BMP085-DS000-06.pdf (http://tienda.tdrobotica.co/download/BST-BMP085-DS000-06.pdf)

https://www.sparkfun.com/tutorials/253 (https://www.sparkfun.com/tutorials/253)



Te agradesco tu tiempo y pasiencia Saludos.




Código: [Seleccionar]
AllDigital
Define CLOCK_FREQUENCY = 20

'configuracion de display
Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTB
Define LCD_RWBIT = 3
Define LCD_EREG = PORTB
Define LCD_EBIT = 4
Lcdinit

'configuracion puerto I2C

Symbol sda = PORTB.0
Symbol scl = PORTB.1

'configuracion de variables

'Dim var_tabla(22) As Byte
Dim ac1 As Word
Dim ac2 As Word
Dim ac3 As Word
Dim ac4 As Word
Dim ac5 As Word
Dim ac6 As Word
Dim b1 As Word
Dim b2 As Word
Dim mb As Word
Dim mc As Word
Dim md As Word
Dim lsb As Byte
Dim xlsb As Byte
Dim msb As Byte
Dim up As Word
Dim up2 As Word
Dim oss As Long
oss = 0
Dim t As Byte
t = 8 - oss
'Gosub leer_memo
Gosub leer_memo
WaitMs 25
Gosub mostrar

inicio:
Gosub presion
'Gosub cal_press

Goto inicio
End                                               

leer_memo:
I2CRead sda, scl, 0x77, 0xaa, ac1.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xac, ac2.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xae, ac3.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb0, ac4.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb2, ac5.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb4, ac6.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb6, b1.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xb8, b2.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xba, mb.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xbc, mc.LB
WaitMs 20
I2CRead sda, scl, 0x77, 0xbe, md.LB
WaitMs 20
Return                                           

mostrar:
Lcdcmdout LcdClear
Lcdout "ac1:", #ac1, "/", "ac2:", #ac2
Lcdcmdout LcdLine2Home
Lcdout "ac3:", #ac3, "/", "ac4:", #ac4
WaitMs 5000
Lcdcmdout LcdClear
Lcdout "ac5:", #ac5, "/", "ac6:", #ac6
Lcdcmdout LcdLine2Home
Lcdout "b1:", #b1, "/", "b2:", #b2
WaitMs 5000
Lcdcmdout LcdClear
Lcdout "mb:", #mb, "/", "mc:", #mc
Lcdcmdout LcdLine2Home
Lcdout "md:", #md
WaitMs 5000
Return                                           

presion:

I2CWrite sda, scl, 0x77, 0x34, 0xf4
WaitMs 5
I2CRead sda, scl, 0x77, 0xf6, msb
I2CRead sda, scl, 0x77, 0xf7, lsb
I2CRead sda, scl, 0x77, 0xf8, xlsb

msb = ShiftRight(msb, 16)
lsb = ShiftRight(lsb, 8)
up = msb + lsb + xlsb
up2 = ShiftLeft(up, t)
WaitMs 5000
Gosub lcd
Return                                           

lcd:
lcd:
Lcdcmdout LcdClear
Lcdout "msb:", #msb, "/", "LSB:", #lsb
Lcdcmdout LcdLine2Home
Lcdout "xlsb:", #xlsb, "/"
WaitMs 5000
Lcdcmdout LcdClear
Lcdout "up:", #up
Lcdcmdout LcdLine2Home
Lcdout "up2:", #up
WaitMs 5000
Return         
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 04 de Septiembre de 2013, 10:55:36
No he podido ver el datasheet ni ver con detalle el código, pero si hay dos líneas que me llamaron la atención:

msb = ShiftRight(msb, 16)
lsb = ShiftRight(lsb, 8 )

ShiftRight es una función de desplazamiento de bits, cada vez que hace un desplazamiento rellena el lado contrario con un cero.
Así que ShiftRight o ShiftLeft no pueden tener un índice superior al número de bits del registro o variable indicada -1. En este caso msb y lsb están declaradas como variables tipo Byte, que esto es una longitud para cada una de 8bit, por lo tanto el índice de la función es como máximo 8-1=7. Si se coloca un índice tan solo superior en una unidad la variable siempre valdrá cero.

msb = ShiftRight(msb, 16) = 0.
lsb = ShiftRight(lsb, 8 ) = 0.

Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: zgouki en 17 de Octubre de 2013, 14:21:47
Estimado dogflu66. Primero ante todo debo agradecerte por tus aportes desinteresados a este foro, la verdad que desde que comencé con los pics siempre me resulto de mucha ayuda esta guía de PSI. No poseo conocimientos de assembler, pero si de basic por lo tanto ya hace bastante que me manejo con este lenguaje del PSI para programar microcontroladores.

En este momento tengo en mente un programa para comunicar 2 microcontroladores iguales (16f628a) por medio de la USART que poseen. Me he manejado con los ejemplos que da la misma guía que viene con el programa y me han funcionado dentro de todo. El problema se presenta recién ahora en donde el microcontrolador receptor (hay uno que envia TX y otro que recibe RX, NO viceversa) ademas de recibir datos también debe atender un timer interno (0,1 o 2, nose cual seria mas adecuado en este caso) para realizar una acción cada un intervalo de tiempo determinado (unos 300 microsegundos aproximadamente). Pero es aquí en donde deja de funcionar la recepción de datos o recibe datos erróneos. Es posible implementar un codigo que realice esto? Ya he probado el timer1 y timer2 con exito sin habilitar la USART, pero se cuelga cuando le agrego dicha parte del código.

Un saludo cordial y espero tu respuesta.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 18 de Octubre de 2013, 06:03:35
Si, eso lo tienes en el ejemplo "EJEMPLO 6, RS232 (Respuesta 196)" del indice.
Lo que quieres hacer se realiza fucionando las "Bases de tiempos" con el "Ring bufer" del hilo, y si añades las funciones para trabajar con cadenas puedes comparar tramas de datos completas. :mrgreen:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: zgouki en 18 de Octubre de 2013, 20:54:36
Muchas gracias por tu rápida respuesta. Efectivamente gracias a ese ejemplo donde estan habilitadas las 2 interrupciones el timer1 y la usart por lo menos ahora puedo recibir 1 byte perfectamente. Pero se me complica cuando el micro transmisor envía mas de 1 byte... lee con error, la verdad que nose como manejarlos, he probado enviar cada byte con una pausa de 3ms entre ellos y la cosa mejora un poco, pero no me conforma ya que se me el tiempo es critico en esta aplicacion. Seguramente la solución este en lo que vos llamas ¨ring buffer¨. Buscare mas informacion al respecto. Un saludo cordial.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Octubre de 2013, 08:29:24
No te preocupes, ese es un ejemplo muy antiguo cuando el lenguaje solo permitía trabajar con Sub-rutinas, preparo el que utilizo en la actualidad con funciones que es mucho más entendible y lo pego por aquí.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 19 de Octubre de 2013, 15:09:57
Versión actualizada del RingBuffer y las Bases de tiempos junto con un ejemplo de uso.
Recordar quitar la extensión .TXT a los archivos.

El programa realiza la siguientes tareas (Ejemplo de RingBuffer + Bases de Tiempos.bas):

Se actualiza el display cada 50mSeg. mediante la base de tiempos _btimer.0

Cambia de estado el Led amarillo cada 500mSeg. mediante la base de tiempos _btimer.1

Ledverde encendido durante 50mSeg. cada vez que se lee un byte del buffer mediante _btimer.2

Modo eco, el byte que se extrae del buffer es enviado de inmediato al puerto serie.

Código: [Seleccionar]
'******************************************************************************
'Ejemplo de RingBuffer + Bases de Tiempos *************************************
'Eco al puerto serie 38400 Baudios, control LCD, parpadeo Led *****************
'By COS, 11/2013, Pic Simulator IDE v6.94 *************************************
'Pic EBasic con 16F88 *********************************************************
'******************************************************************************
Define CONFIG = 0x2f50  'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
Lcdinit  'Activa el LCD
Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
Call _setuprbf()  'Inicializa el Ring Buffer
Call _setupbt(0xf830)  'Incializa el TMR1 (1mSeg. a 8Mhz) y bases de tiempos
INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
Lcdout "Test RingBuffer"  'Datos al Lcd
Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
Call _pause(1000)  'Pausa de 1Seg.
'Rutina principal
main:
If _btimer.0 = True Then  'Se refresca el display cada 50mSeg.
Call _rldbt(0, 50)  'Recarga base de tiempos 0 con 50mSeg.
Lcdcmdout LcdLine2Home  'Se imprimira al principio de la linea dos
Lcdout "Buffer:", #_buffer, " "  'Muestra los carracteres que tiene Buffer
Endif
Call error_buffer()  'Controla el posible bloqueo del módulo Usart en modo Rx

If _btimer.2 = 1 Then ledv = 1  'Led amarillo apagado
If _buffer > 0 Then  'Si hay datos en el buffer se lee
Call _rldbt(2, 50)  'Recarga la base de tiempos 2 con 50mSeg.
ledv = 0  'Led amarillo encendido, actividad en el buffer
Call _receive()  'Lee un caracter del buffer
If _receive = 13 Then Hserout CrLf  'Línea nueva en el hyperterminal
Hserout _receive  'Envia el dato recibido al hyperterminal
Endif

'Parpadea led amarillo
If _btimer.1 Then  'Si la base de tiempos 1 termino de contar
Call _rldbt(1, 500)  'Recarga base de tiempos 0 con 500mSeg.
Toggle leda  'Invierte el estado del led amarillo
Endif
Goto main
End                                              
'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesUartRingBuffer.bas"
Include "_FuncionesBasesTimer8_Pic16.bas"
'*******************************************************************************
'Gestión de interrupciones
On Interrupt
Save System
Call _ringbuffer(0)  'Llama a la función ringbuffer, desde las interrupciones
Call _basestiempos()  'Actualiza las bases de tiempos
Resume
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Octubre de 2013, 06:13:35
Nueva versión del programa, realiza la siguientes tareas (Ejemplo RingBuffer + Bases de Tiempo_01.bas):

Se actualiza el display cada 50mSeg. mediante la base de tiempos _btimer.0

Cambia de estado el Led amarillo cada 500mSeg. mediante la base de tiempos _btimer.1

Led verde encendido durante 50mSeg. cada vez que se lee un byte del buffer mediante _btimer.2

La siguiente versión captura los datos del buffer en un vector de 25 elementos, el fin de la cadena recibida se marca como 0 (fin de cadena estándar). Cuando deja de haber actividad en el buffer durante 3Seg la cadena se envía al puerto serie. El control se realiza mediante la base de tiempos _btimer.3

Código: [Seleccionar]
'******************************************************************************
'Ejemplo de RingBuffer + Bases de Tiempos_01 **********************************
'Eco al puerto serie 38400 Baudios, control LCD, parpadeo Led *****************
'By COS, 11/2013, Pic Simulator IDE v6.94 *************************************
'Pic EBasic con 16F88 *********************************************************
'******************************************************************************
Define CONFIG = 0x2f50  'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
Lcdinit  'Activa el LCD
Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
Call _setuprbf()  'Inicializa el Ring Buffer
Call _setupbt(0xf830)  'Incializa el TMR1 (1mSeg. a 8Mhz) y bases de tiempos
INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
Lcdout "Test RingBuffer"  'Datos al Lcd
Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
Call _pause(1000)  'Pausa de 1Seg.
'Rutina principal
Dim string(26) As Byte
Dim indice As Byte
Dim vdatos As Word  'Tiempo de validación de los datos recibidos.
indice = 0
vdatos = 3000  'Validación de los datos a los 3Seg. de no haber actividad en el puerto serie.
main:
If _btimer.0 = True Then  'Se refresca el display cada 50mSeg.
Call _rldbt(0, 50)  'Recarga base de tiempos 0 con 50mSeg.
Lcdcmdout LcdLine2Home  'Se imprimira al principio de la linea dos
Lcdout "Buffer:", #_buffer, " "  'Muestra los carracteres que tiene Buffer
Endif
Call error_buffer()  'Controla el posible bloqueo del módulo Usart en modo Rx

If _btimer.2 = True Then ledv = 1  'Led amarillo apagado
If _buffer > 0 Then  'Si hay datos en el buffer se lee
Call _rldbt(2, 50)  'Recarga la base de tiempos 2 con 50mSeg.
ledv = 0  'Led amarillo encendido, actividad en el buffer
Call _receive()  'Lee un caracter del buffer
If _receive = 13 Then Hserout CrLf  'Línea nueva en el hyperterminal
Hserout _receive  'Envia el dato recibido al hyperterminal (modo eco)
string(indice) = _receive  'Añade el byte del buffer al vector
If indice < 25 Then indice = indice + 1  'Incrementa el indice del vector
string(indice) = 0  'Marca fin de cadena
Call _rldbt(3, vdatos)  'Reset al contador de actividad del puerto serie, tiempo validación
Endif

'Envia al puerto serie la cadena almacenada si no se recibieron datos por más de 1Seg.
If _btimer.3 = True Then  'Flag base de tiempos 3
indice = 0  'Reset al indice
Hserout CrLf  'Nueva línea al pureto serie
While string(indice) > 0  'Bucle que recorre la cadena
Hserout string(indice)  'Envia un elemento de la cadena al puerto serie
indice = indice + 1  'Incrementa el indice
Wend
Hserout CrLf  'Nueva al puerto serie
indice = 0  'Reset al indice
_btimer.3 = False  'Impide que se repita esta rutina
Endif

'Parpadea led amarillo
If _btimer.1 Then  'Si la base de tiempos 1 termino de contar
Call _rldbt(1, 500)  'Recarga base de tiempos 0 con 500mSeg.
Toggle leda  'Invierte el estado del led amarillo
Endif
Goto main
End                                              
'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesUartRingBuffer.bas"
Include "_FuncionesBasesTimer8_Pic16.bas"
'*******************************************************************************
'Gestión de interrupciones
On Interrupt
Save System
Call _ringbuffer(0)  'Llama a la función ringbuffer, desde las interrupciones
Call _basestiempos()  'Actualiza las bases de tiempos
Resume
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Octubre de 2013, 07:42:11
Dejo una versión simplificada del buffer.
Esta versión va almacenado los bytes recibidos por el puerto serie en un vector, el ultimo valor del vector será 0 (fin de cadena estándar).

Monitoria el puerto serie hasta recibir el primer byte, después espera 3Seg para que termine de entrar la trama de datos, al mismo tiempo los almacena en un string y terminados los 3Seg lo envía al puerto serie.

_string(81): Es el vector donde se almacena los datos recibidos (buffer).
_Buffer es una variable que contiene el número de caracteres.
_Error_Buffer(): Supervisa el módulo Usar por si se bloquea.
_SetUpBf(): Inicializa el buffer para poder recibir datos.
_RsBuffer(): Es la función principal que crea el buffer.

Código: [Seleccionar]
'******************************************************************************
'Ejemplo de Buffer Serie ******************************************************
'Puerto serie 38400 Baudios, almacena en una cadena los bytes recibidos *******
'By COS, 11/2013, Pic Simulator IDE v6.94 *************************************
'Pic EBasic con 16F88 *********************************************************
'******************************************************************************
Define CONFIG = 0x2f50  'Definición de fuses
Define CONFIG2 = 0x0000
Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
Call _setupebasic()  'Iniciliza la placa entrenadora Pic EBasic
Lcdinit  'Activa el LCD
Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
Call _setupbf()  'Inicializa el Buffer
INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
Enable  'INTCON.GIE habilita las interrupciones globales
Lcdout "Test Buffer"  'Datos al Lcd
Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
WaitMs 100
'Rutina principal
Dim indice As Byte
indice = 0
main:
Call _error_buffer()  'Controla el posible bloqueo del módulo Usart en modo Rx

'Envia los datos recibidos dureante 3Seg al puerto serie.
If _buffer > 0 Then  'Hay datos en el buffer, numero de bytes.
WaitMs 3000  'Pausa de 3Seg. más demoras interrupciones
indice = 0  'Reset al indice
Hserout CrLf  'Nueva línea al puerto serie
While _string(indice) > 0  'Bucle que recorre la cadena
Hserout _string(indice)  'Envia un elemento de la cadena al puerto serie
indice = indice + 1  'Incrementa el indice
Wend
Hserout CrLf  'Nueva línea al puerto serie
Call _setupbf()  'Inicializa el buffer, permite recibir una nueva trama de datos
Endif

Goto main
End                                              
'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
'*******************************************************************************
'Funciones para la implementación de un buffer serie
Dim _string(81) As Byte  'Vector del buffer
Dim _buffer As Byte  'Numero de bytes recibidos
Function _rsbuffer(_ctrol As Byte) As Byte
Dim _lenbuffer As Byte
Dim _indice As Byte
'Incializa el buffer
If _ctrol = 1 Then  'Inicializa la función ringbuffer
_buffer = 0
_lenbuffer = 80  'Numero de elementos -1
RCSTA.CREN = 0  'Disable, continua recepción
Hserget _indice  'Vacia registros usart
Hserget _indice
Hserget _indice
RCSTA.CREN = 1  'Enable, Continuous Receive Enable bit*/
_indice = 0
Endif
'Buffer y control
If _ctrol = 0 Then
If PIR1.RCIF = 1 Then  'Si la interrupción de la Usart está activa
Hserget _string(_indice)  'Extrae el byte de la Usart y lo almacena
If _indice < _lenbuffer Then _indice = _indice + 1  'Incrementa el indice del buffer
_string(_indice) = 0  'Marca final de la cadena recibida
Endif
Endif
_buffer = _indice  'Numero de caracteres recibidos
End Function                                      
'Incializa el buffer
Proc _setupbf()
PIE1.RCIE = 0  'Disable la interrupcion de la usart en modo rx*/
Call _rsbuffer(1)
PIE1.RCIE = 1  'Activa la interrupcion de la usart en modo rx*/
End Proc                                          
'Comprueba si hay error de recepción en la Usart y la desbloquea.
Proc _error_buffer()
If RCSTA.OERR = True Then
Disable
Call _rsbuffer(1)
PIE1.RCIE = 1  'Activa la interrupcion de la usart en modo rx*/
Enable
Endif
End Proc                                          
'*******************************************************************************
'Gestión de interrupciones
On Interrupt
Save System
Call _rsbuffer(0)  'Llama a la función _rsbuffer, desde las interrupciones
Resume
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 21 de Octubre de 2013, 21:54:47
Recordé que hay algunos lenguajes que tienen una función que captura x bytes del puerto serie durante un tiempo máximo especificado (no se usa mucho), pero la he construido para el que quiera pasar el rato realizando algunas practicas con ella y así, de este modo, iniciarse en el tema de las tramas de datos con el puerto serie.

Ejemplo de Buffer Serie_01:
Funcion: Espera la recepción de x bytes durante cierto tiempo del puerto serie.

Código: Visual Basic
  1. '********************************************************************************
  2. 'Ejemplo de Buffer Serie_01 *****************************************************
  3. 'Funcion: Espera la recepción de x bytes durante cierto tiempo del puerto serie**
  4. 'Puerto serie 38400 Baudios, almacena en una cadena los bytes recibidos *********
  5. 'By COS, 4/2016, 11/2013, Pic Simulator IDE v6.94 *******************************
  6. 'Pic EBasic con 16F88 ***********************************************************
  7. '********************************************************************************
  8. Define CONFIG = 0x2f50  'Definición de fuses
  9. Define CONFIG2 = 0x0000
  10. Define CLOCK_FREQUENCY = 8  'Clock a 8Mhz
  11. 'Define SIMULATION_WAITMS_VALUE = 1
  12. 'Biblioteca de funciones
  13. Include "_ProcSetUpEBasic16F88.bas"
  14. '---------------------------------------
  15. Call _setup_ebasic()  'Iniciliza la placa entrenadora Pic EBasic
  16. Lcdinit  'Activa el LCD
  17. Hseropen 38400  'Selecciona la velocidad del puerto serie RS232
  18. 'INTCON.PEIE = 1  'Bit habilita interrupciones perifericos
  19. 'Enable  'INTCON.GIE habilita las interrupciones globales
  20. Lcdout "Test Buffer"  'Datos al Lcd
  21. Hserout CrLf, CrLf  'Linea en blanco al hyperterminal
  22. WaitMs 100
  23. 'Rutina principal
  24. Dim indice As Byte
  25. indice = 0
  26. '**************************************************************************************
  27. main:
  28.        
  29.         If _buffer = True Then  'Si hay caracteres en el puerto serie (registro de la Usart)
  30.                 Call _hsergetstr(5, 10)  'Espero 5 caracteres por el puerto serie durante un tiempo máximo de 10mSeg.
  31.  
  32.                 Hserout CrLf, "Numero de caracteres leidos:", #_hsergetstr
  33.  
  34.                 indice = 0  'Reset al indice
  35.                 Hserout CrLf  'Nueva línea al puerto serie
  36.                 'Envia una cadena completa al purto serie
  37.                 While _string(indice) > 0  'Bucle que recorre la cadena
  38.                         Hserout _string(indice)  'Envia un elemento de la cadena al puerto serie
  39.                         indice = indice + 1  'Incrementa el indice
  40.                 Wend
  41.                 Hserout CrLf  'Nueva línea al puerto serie
  42.         Endif
  43. Goto main
  44. End                                              
  45. '*******************************************************************************
  46. 'Funcion que espera la recepción de x caracteres durante cierto tiempo en el puerto serie
  47. '_buffer: Bit que indica que están entrando datos en el puerto serie (registros de la Usart)
  48. 'Call _hsergetstr(numero de bytes a recibir, tiempo de espera máximo en mSeg): Llama a la función
  49. '_hsergetstr: Variable que tendra el número de caracteres que se almacenaron
  50. '_string(51): Almacenan los bytes o caracteres que entraron por el puerto serie, termina en fin de cadena (0)
  51. '_byte <= _lenbuffer (caracteres), _waitms <= 6000mSeg. (6Seg.), valor tipico entre 1 y 10mSeg.
  52. Symbol _buffer = PIR1.RCIF  'Si es True indica que hay datos en los registros Rx de la Usart
  53. Dim _string(51) As Byte  'Cadena que contendrá los datos recibidos por el puerto serie
  54. Function _hsergetstr(_byte As Byte, _waitms As Word) As Byte
  55.         Dim _lenbuffer As Byte  'Numero de caracteres, bytes o elementos
  56.         Dim _indice As Byte  'Indica el elemento del vector seleccionado
  57.         Dim _delay As Word
  58.         _lenbuffer = 50  'Numero de elementos -1
  59.         _indice = 0  'Primer elemento del vector
  60.         If _byte > _lenbuffer Then _byte = _lenbuffer
  61.         _waitms = _waitms * 10  'Se adapta la espera a la base patron Waitus 100.
  62.         _delay = _waitms  'Guarda el tiempo de espera
  63.         While _waitms > 0 And _indice < _byte  'Termina por tiempo o por bytes recibidos
  64.                 If _buffer = True Then  'Si hay datos se almacenan
  65.                         Hserget _string(_indice)  'Almacena byte
  66.                         _indice = _indice + 1  'Contador de caractes recibidos (indice del vector)
  67.                         _waitms = _delay  'Reset al contador de tiempo
  68.                 Else
  69.                         WaitUs 100  'Tiempo de espera patron
  70.                         _waitms = _waitms - 1  'Decrementa el tiempo
  71.                 Endif
  72.         Wend
  73.         _string(_indice) = 0  'Añade el caracter de fin de cadena al vector
  74.         _hsergetstr = _indice  'Devuelve el número de caracters recibidos
  75.         'Desbloquea la Usart en modo Rx si se bloqueo
  76.         If RCSTA.OERR = True Then  'Hay error en la Usart, entraron más datos de los que se extrajero (está bloqueada)
  77.                 RCSTA.CREN = 0  'Disable, continua recepción
  78.                 Hserget _indice  'Vacía registros usart
  79.                 Hserget _indice
  80.                 RCSTA.CREN = 1  'Enable, Continuous Receive Enable bit*/
  81.         Endif
  82. End Function

Nota: Mejorada la velocidad de captura (26/10/2013).
Nota: Actualizada (20/4/2016)
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: zgouki en 25 de Octubre de 2013, 08:16:13
Muchas gracias dogflu66, me ha resultado de mucha ayuda tus códigos bien explicados. Te djo un abrazo desde Rosario, Argentina. Y un gran aplauso tambien!  ((:-))  ((:-))  ((:-))  ((:-))
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: zgouki en 11 de Noviembre de 2013, 20:20:51
Estimado dogflu, recurro a su sabiduría esta vez para saber si es posible usar el o los pines determinados para la comunicación serial (RX y TX) como entrada o salidas digitales una vez habilitadas las interrupciones usart.
Le explico lo que quiero hacer: el pic receptor solo utiliza el pin RX, ya que no es necesario mandar información por el TX, por lo tanto este pin lo tengo sin conexión y no cumple función alguna. Pero mi proyecto requiere una salida mas, y este pin me vendría como anillo al dedo. El problema es que siempre queda a nivel alto si lo pongo como salida, nose como controlarlo. He probado colocando una subrutina que se activa mediante el timer1 y que hace lo siguiente:

   TRISB.2 = 0  'Salida
   PORTB.2 = 0

Pero no parece funcionar  :(  .

Alguna idea? Desde ya muchas gracias!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Noviembre de 2013, 20:33:55
Que yo sepa si se puede usar. Tienes que redefinirlo después de abrir el puerto:

Hseropen 38400 'Esto entre otras cosas, configura los pin de Tx y Rx como salida y entrada respectivamente.
Trisb.2 = 0 'Esta es la ultima configuración que perdura.

Pruébalo y me cuentas.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 17 de Noviembre de 2013, 20:37:17
Para todo aquel que esté interesado trabajar con el modulo de ultrasonidos HC-SR04 o equivalentes les dejo una función para manejarlo.
Mide correctamente desde 2Cm a 300Cm totalmente lineal. Hay que tener en cuenta que a distancias superiores a 1 metros, el haz abre mucho
y le pueden afectar las paredes laterales.

https://www.mouser.com/ds/2/813/HCSR04-1022824.pdf

Código: [Seleccionar]
'**********************************************************************************
'Funsion para HC-SR04.bas
'Funciones para la medición de distancia con el sensor HC-SR04 con TMR1
'Placa PicEBasic, By COS, 11/2018, 11/2013
'Basic Pic Simulator IDE (PSI), v7.48, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesPic16F88.bas"
'-----------------------------------------
Call _setupebasic()  'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Test P. HC-SR04"  'Imprime el texto en el LCD
WaitMs 2000  'Pausa de 2 Seg.
'-----------------------------------------
void_main:

Symbol _ledsr04 = RA4  'Se asigna pin del LED placa adaptadora
ConfigPin _ledsr04 = Output  'Led, salida
Call _setup_hcsr04(8, 0, 0)  'Oscilador, compensación positiva, compensación negativa

Dim distancia_mm As Word
Dim main As Byte

While main = main
'Muestra lecturas
_ledsr04 = True  'Led a On
distancia_mm = _gethcsr04()  'Lee sensor
WaitMs 50  'Pausa para que se vea el led iluminado
_ledsr04 = False  'Led a Off
Lcdcmdout LcdLine2Home  'Cursor al principio de la linea2
Lcdout "HC-SR04: ", #distancia_mm, "mm    "  'Salida de datos por el LCD
Hserout "HC-SR04: ", #distancia_mm, "mm", CrLf  'Salida de datos por Usart
Wend

End                                               
'-------------------------------------------------
'Funciones para el control del sensor HC-SR04
'********************************************************************
'Funcion para la configuración de la función principal
'_clk = Mhz del reloj del sistema
'_mas = factor de correción positivo, incrementa la lectura final
'_menos = factor de correción negativo, decrementa la lectura final
'Call _setup_hcsr04(Mhz reloj, incremento, decremento)
Proc _setup_hcsr04(_clk As Byte, _mas As Byte, _menos As Byte)
Call _hcsr04(_clk, _mas, _menos, 0)
End Proc                                         
'Función para la lectura del sensor
'Retorna una lectura en mm del sensor HC-SR04
'_GetHCSR04 = retorna la lectura en mm del sensor
'Lectura = _GetHCSR04()
Function _gethcsr04() As Word
_gethcsr04 = _hcsr04(0, 0, 0, 1)
End Function                                     
'Función principal de lectura y control del sensor HC-SR04
'Funcion de lectura y control del sensor HC-SR04, devuelve valor
'_clk = Mhz del reloj del sistema
'_mas = factor de correción positivo, incrementa la lectura final
'_menos = factor de correción negativo, decrementa la lectura final
'_ctrl = configración
'Call _gethcsr04(Mhz reloj, incremento, decremento, control)
'_gethcsr04 > de 0 lectura en mm, = 0 error de lectura
Symbol _echosr04 = RB4  'Se asigna pin del ECHO
Symbol _trigersr04 = RB1  'Se asigna pin del TRIGER
Function _hcsr04(_mhz As Byte, _mas As Byte, _menos As Byte, _ctrl As Byte) As Word
Dim _auxw As Word
Dim _auxl As Long
Dim _aux_mhz As Byte
Dim _aux_mas As Byte
Dim _aux_menos As Byte
_hcsr04 = 0  'Se marca error de lectura por defecto
'Inicializa la función
If _ctrl = 0 Then
ConfigPin _echosr04 = Input  'Echo, entrada
ConfigPin _trigersr04 = Output  'Triger, salida
_trigersr04 = False  'Inicializa el Triger
_aux_mhz = _mhz / 4  'Factor corrección a uSeg.
_aux_mas = _mas  'Calibrado positivo
_aux_menos = _menos  'Calibrado negativo
Call _setup_timer1(_tmr1_internal, _tmr1_div1)  'Configura el timer1
Call _timer1(True)  'Pone en marcha el timer1
'Call _disable_interrupts(_int_timer1)  'Desactiva las interrupciones del Timer1
Exit  'Fuerza la salida de la función
Endif
'Solicitud de una lectura al sensor -------------------------------------
'Se demanda lectura
_trigersr04 = True  'Inicia pulso del Triger
WaitUs 15  'Ancho del pulso del Triger en uSeg., minimo 10uSeg.
_trigersr04 = False  'Fin del pulso del Triger
Call _clear_timer1()  'Se borra el contador del Timer
While _echosr04 = False  'Se espera hasta que el sensor inicie una lectura
If _tmr1if = True Then Exit  'Fin si desbordo el Timer
Wend
Call _clear_timer1()  'Se borra el contador del Timer
While _echosr04 = True  'Se espera hasta que el sensor inicie fin de lectura
If _tmr1if = True Then Exit  'Fin si desbordo el Timer
Wend
_auxw = _get_timer1()  'Asigna la lectura del Timer
_auxw = ((_auxw / _aux_mhz) + _aux_mas) - _aux_menos  'Calibrado
'_auxl = ((_auxw * 340) / 2) / 1000  'Milimetros
_auxl = (_auxw * 34) / 200  'Milimetros
_hcsr04 = _auxl  'Pasa valor
End Function                                     
'**************************************************************************
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 01 de Diciembre de 2013, 20:56:52
Para terminar con la lectura de ancho de pulso, dejo una nueva versión de la lectura del sensor HC-SR04 con la novedad, de que he incorporado una función para la lectura del ancho de pulso, esta es _GetPulseWidthIn(Flanco, Tiempo de espera). La función devuelve la lectura del ancho de pulso en una variable tipo Long en uSegundos.

Código: [Seleccionar]
'**********************************************************************************
'Funcion _getpulsewidthin aplicado HC-SR04.bas
'Funciones para la medición del ancho de pulso de una señal externa con TMR1
'Aplicado a la lectura del sensor por ultrasonidos HC-SR04
'Placa PicEBasic, By COS, 11/2018, 12/2013
'Basic Pic Simulator IDE (PSI), v7.48, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
Define SINGLE_DECIMAL_PLACES = 1
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'Bibliotecas usadas:
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesPic16F88.bas"
Include "_FuncionesCapturaAnchoPulso.bas"
'-----------------------------------------
Call _setupebasic()  'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "Sensor HC-SR04"  'Imprime el texto en el LCD
WaitMs 2000  'Pausa de 2 Seg.
'-----------------------------------------
voidmain:
Symbol trigger = RB1  'Se asigna pin del TRIGGER para HC-SR04
Symbol _ledsr04 = RA4  'Se asigna pin del LED placa adaptadora HC-SR04
ConfigPin _ledsr04 = Output  'Led, salida
ConfigPin trigger = Output  'Trigger, salida
'Espencificar pin de adquisición en la función
'(Symbol _pinpulsewidthin = RB4  'Se asigna pin por donde se aplica la señal)
Call _setup_pulsewidthin(8)  'Se inicializa la función _pulsewidthin (oscilador y TMR1).
trigger = False  'Inicializa el Trigger
_ledsr04 = False  'Led a Off

Dim useg As Word
Dim main As Byte
Dim mm As Long

While main = main
'Activa una lectura del sensor HC-SR04
trigger = True  'Inicia pulso del Triger
WaitUs 15  'Ancho del pulso del Triger en uSeg., minimo 10uSeg.
trigger = False  'Fin del pulso del Triger

'Devuelve la lectura en uSegundos.
_ledsr04 = True  'Led a On
'Lee el ancho de pulso positivo del sensor durante un tiempo máximo de espera de 10mSeg.
useg = _getpulsewidthin(1, 100)
mm = (useg * 34) / 200  'Pasa a milimetros la lectura dada en uSeg.
WaitMs 300  'Pausa para que de tiempo a ver el led iluminado.
_ledsr04 = False  'Led a Off

'Muestra los datos por LCD y puerto serie RS232
Lcdcmdout LcdLine1Home  'Cursor al principio de la linea1
Lcdout "Tmp: ", #useg, "uSeg.    "  'Salida de datos por el LCD
Lcdcmdout LcdLine2Home  'Cursor al principio de la linea2
Lcdout "Dist: ", #mm, "mm    "  'Salida de datos por el LCD
Hserout "Lectura: ", #useg, "uSeg."  'Salida de datos por Usart (RS232)
Hserout "Distancia: ", #mm, "mm", CrLf  'Salida de datos por Usart (RS232)

Wend
End                                               
'********************************************************************
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 18 de Enero de 2014, 17:48:38
Estimado Dogflu66 saludos,


Nuevamente recurro a tu sabiduría, hace un tiempo te consulte por como poder hacer funcionar el sensor de Humedad y temperatura DHT22, al cual pudiste hacerlo funcionar bajo PSI, hasta la fecha satisfactoriamente esta funciona de maravilla, ha sido de apoyo para aplicaciones simples como medir temperatura y observarla dentro de la casa, y en uno que otro trabajo que he efectuado.

Ahora yendo al grano con la consulta estoy trabajando con un datalogger, para almacenar los datos utilizo un logger diseñado por sparkfun el cual permite utilizar una memoria MicroSd para guardar datos y que se cominica mediante RS232 con el pic18f4550, con este actual trabajo utilizo las entradas ADC pudiendo procesar los datos adquiridos desde sensores que trabajen de 0 a 5 VDC sin problemas, utilizo el rtc ds1307para las horas y hasta el sensor 1 wire ds18b20 sin complicaciones y eventualidades.
Sin embargo no todo puede ser color rosa, como antes te mencione te solicite ayuda para el DHT 22, mi problema es que al querer enviar los datos al logger de sparkfun los datos almacenados en la memoria micro SD se muestran como código ASCII y no los datos reales que en este caso seria la temperatura, hora y otros datos.
 
Te adjunto lo que pasa a ser mi programación y humildemente nuevamente te pido apoyo con respecto a solucionar este cacho que me tiene ya mucho tiempo sin poder resolver.

Saludos.


Código: [Seleccionar]
AllDigital
Define CLOCK_FREQUENCY = 20


'configuracion de parametros para dht22
CMCON = 0x07
OSCCON = 0x7e
Dim hr As Word
Dim tmp As Word
Dim chk As Word


TRISA.1 = 1  'entrada RHT03 inicio
WaitMs 100
Call _rht03ini(8)
WaitMs 2000

'configuracion canales analogicos
'ADCON1 = %00001010
'Dim adc As Word
'adc = 0

'configuracion de puerto
Symbol tx = PORTC.6


'configuracion puerto i2c
Symbol sda = PORTB.0
Symbol scl = PORTB.1


'configuracion parametros de reloj
Dim seg As Byte
Dim min As Byte
Dim hora As Byte
Dim daym As Byte
Dim dias As Byte
Dim mes As Byte
Dim anno As Byte

Dim seg1 As Byte
Dim min1 As Byte
Dim hora1 As Byte
Dim dias1 As Byte
Dim mes1 As Byte
Dim anno1 As Byte

Dim y As Word


'sincronizacion de reloj y toma de datos
Gosub lcd3
Gosub reloj_rtc
Gosub calculo1
Gosub calculo
While y > 0
y = y - 1
Gosub lcd
Wend
'termino sincronizacion salto a inicio y comienza trabajo datalogger

inicio:

Call _rht03read()
hr = _ped1(_rht03read.HW)
tmp = _ped1(_rht03read.LW)
chk = _rht03chk()

'Adcin 1, adc
Gosub reloj_rtc
Gosub lcd3
Gosub calculo1
If seg1 = 0 Or seg1 = 10 Or seg1 = 20 Or seg1 = 30 Or seg1 = 40 Or seg1 = 50 Then
Gosub enviar
Endif

Goto inicio
End                                              

Include "humedad.bas"
Include "trabajando con bits.bas"

reloj_rtc:
I2CRead sda, scl, 0xd1, 0x00, seg
WaitMs 20
I2CRead sda, scl, 0xd1, 0x01, min
WaitMs 20
I2CRead sda, scl, 0xd1, 0x02, hora
WaitMs 20
I2CRead sda, scl, 0xd1, 0x03, daym
WaitMs 20
I2CRead sda, scl, 0xd1, 0x04, dias
WaitMs 20
I2CRead sda, scl, 0xd1, 0x05, mes
WaitMs 20
I2CRead sda, scl, 0xd1, 0x06, anno
WaitMs 20
Return                                            

calculo1:
'conversion de hexa a decimal segundos
If seg >= 0 And seg <= 9 Then seg1 = seg
If seg >= 16 And seg <= 25 Then seg1 = seg - 6
If seg >= 32 And seg <= 41 Then seg1 = seg - 12
If seg >= 48 And seg <= 57 Then seg1 = seg - 18
If seg >= 64 And seg <= 73 Then seg1 = seg - 24
If seg >= 80 And seg <= 89 Then seg1 = seg - 30

'conversion de hexa a decimal minutos
If min >= 0 And min <= 9 Then min1 = min
If min >= 16 And min <= 25 Then min1 = min - 6
If min >= 32 And min <= 41 Then min1 = min - 12
If min >= 48 And min <= 57 Then min1 = min - 18
If min >= 64 And min <= 73 Then min1 = min - 24
If min >= 80 And min <= 89 Then min1 = min - 30

'conversion de hexa a decimal hora
If hora >= 0 And hora <= 9 Then hora1 = hora
If hora >= 16 And hora <= 25 Then hora1 = hora - 6
If hora >= 32 And hora <= 41 Then hora1 = hora - 12

'conversion de hexa a decimal dias
If dias >= 0 And dias <= 9 Then dias1 = dias
If dias >= 16 And dias <= 25 Then dias1 = dias - 6
If dias >= 32 And dias <= 41 Then dias1 = dias - 12
If dias >= 48 And dias <= 57 Then dias1 = dias - 18

'conversion de hexa A decimal mes
If mes >= 0 And mes <= 9 Then mes1 = mes
If mes >= 16 And mes <= 25 Then mes1 = mes - 6

'conversion de hexa a decimal año
If anno >= 0 And anno <= 9 Then anno1 = anno
If anno >= 16 And anno <= 25 Then anno1 = anno - 6
Return                                            

calculo:
If min1 >= 0 And min1 <= 4 Then y = 300 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 5 And min1 <= 9 Then y = 600 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 10 And min1 <= 14 Then y = 900 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 15 And min1 <= 19 Then y = 1200 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 20 And min1 <= 24 Then y = 1500 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 25 And min1 <= 29 Then y = 1800 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 30 And min1 <= 34 Then y = 2100 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 35 And min1 <= 39 Then y = 2400 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 40 And min1 <= 44 Then y = 2700 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 45 And min1 <= 49 Then y = 3000 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 50 And min1 <= 54 Then y = 3300 - min1 * 60 - (60 - (63 - seg1))
If min1 >= 55 And min1 <= 59 Then y = 3600 - min1 * 60 - (60 - (63 - seg1))
Return                                            

enviar:

Serout tx, 9600, #hora1
WaitMs 10
Serout tx, 9600, ":"
WaitMs 10
Serout tx, 9600, #min1
WaitMs 10
Serout tx, 9600, ":"
WaitMs 10
Serout tx, 9600, #seg1
WaitMs 10
Serout tx, 9600, ";"
WaitMs 10
Serout tx, 9600, #hr.HB
WaitMs 10
Serout tx, 9600, "."
WaitMs 10
Serout tx, 9600, #hr.LB
WaitMs 10
Serout tx, 9600, ";"
WaitMs 10
Serout tx, 9600, #tmp.HB
WaitMs 10
Serout tx, 9600, "."
WaitMs 10
Serout tx, 9600, #tmp.LB, CrLf
WaitMs 10
Return            


Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 20 de Enero de 2014, 15:52:18
¿Que datalogger es para echarle un vistazo?.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: Evonkc en 21 de Enero de 2014, 22:07:56
¿Que datalogger es para echarle un vistazo?.

El logger que utilizo es uno de spark fun, modelo logomatic V2 Serial SD datalogger.

Aquí dejo unos link

https://www.sparkfun.com/products/10216
https://www.sparkfun.com/datasheets/Widgets/SFE-0016-DS-Logomatic-v21.pdf

Como asi tambien en el siguiente recuadro te dejo la configuracion interna de la memoria Micro sd, la cual debe estar formateada en fat 16 y debe ser a lo mas de 2 gb en lo posible, ya casi en mi país no se ven muchas de estas.

Citar
MODE = 0
ASCII = y
Baud = 4
Frequency = 100
Trigger Character = $
Text Frame = 100
AD1.3 = N
AD0.3 = N
AD0.2 = N
AD0.1 = N
AD1.2 = N
AD0.4 = N
AD1.7 = N
AD1.6 = N
Saftey On = Y

Se agradece la ayuda e interés.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: arrluis en 16 de Febrero de 2014, 02:47:14
Hola podrían pasarme el diagrama en proteus por favor de "NOMBRE: 16F88_LCD_RTC_12" RESPUESTA No. 93
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 16 de Febrero de 2014, 21:20:30
Este hilo es más bien practico, no sé si alguien habrá pasado el ejemplo a Proteus.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: MiCrOtRoNiC en 10 de Marzo de 2014, 14:34:11
Maestros alguna librería para LCD 40x4..

saludos
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 11 de Marzo de 2014, 08:35:26
No he utilizado ese LCD, pero en teoría, la librería del pic simulator es estándar, debería funcionar también con ese lcd directamente.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: allado en 13 de Abril de 2014, 10:03:01
 :-/ Excelente Carlos, veo que tu curso no para!. Quizas no lo sepas Carlos pero mi incursión enserio en desarrollo con micros arranco alla por 2006 con el comienzo de este excelente curso, la didactica que usaste me ayudo muchisimo en mi trabajo diario. Estoy ansioso para ver cuando encaramos algo en ethernet con el ENC28J60..!!! te djo un abrazo.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 14 de Abril de 2014, 18:46:47
¡Cuánto tiempo!; me alegro de saber de ti, un abrazo también de mi parte.
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: zgouki en 17 de Abril de 2014, 18:15:50
Hola de nuevo dogflu, como te va?  ;-)
Estuve viendo los ultimos codigos que publicaste respecto a la USART y los ring buffers y me ha quedado una duda.
Cuando dice:

'Biblioteca de funciones
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesUartRingBuffer.bas"
Include "_FuncionesBasesTimer8_Pic16.bas"


Me tira error al compilar en el PSI debido a que no encuentra dichas funciones. Serias tan amable de indicarme donde las puedo conseguir?
Muchas gracias!  :)

EDIT: Me respondo a mi mismo, estas funciones estan en el primer post de esta pagina! (con extension txt). Eso me pasa por no leer todo atentamente, mil disculpas!  :oops:
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: SYLA0285 en 24 de Agosto de 2014, 18:05:42
Hola que tal, me estoy quebrando un poco la cabeza con el ide de PICBASIC ya que quiero programar un pic18f2550 y como tengo la version del compilador 2.5 no me admite las variables tipo long ni tampoco habilita correctamente los bits de configuración marcandome un error en el hexadecimal, alguien me podría ayudar, sorry por desviar un poco el tema pero este es el tema que encontre más a fin a mi problema y no sabía como iniciar uno nuevo :oops:, saludos.

De antemano gracias por la ayuda!!
Título: Re: PIC BASIC del PIC Simulator IDE
Publicado por: dogflu66 en 31 de Agosto de 2014, 10:37:43
Estas utilizando una versión muy antigua, no te queda otra que actualizarla.

http://www.oshonsoft.com/licenses.php
Título: Re: PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 02 de Septiembre de 2015, 20:50:00
Para el que quiera jugar con un stack (pila) por software le adjunto un programita de ejemplo y su respectivo Include con las funciones:

Código: [Seleccionar]
'Funciones Push/Pop por software
'PIC16F88, PSI v.7.39_02, By DogFlu66
'02/09/2015: Se implementan funciones Push_Single/Pop_Single
'09/2014: Funcion Stack (Push y Pop), trabajando con un software stack
'hay que especificar los tipos asbyte, aswork y aslong
'-------------------------------------------------------------------
Include "FuncionesStack_Push&Pop.bas"
Define CLOCK_FREQUENCY = 8
Define SINGLE_DECIMAL_PLACES = 2
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los Waitms
'-------------------------------------------------------------------
AllDigital  'Pin como digitales
TRISA = %00000000  'Pin como salidas (si lo permiten)
TRISB = %00000000  'Pin como salidas
'Abre puerto serie
Hseropen 4800  'Configura puerto serie harware a 4800baudios
'-------------------------------------------------------------------
'Rutina principal
main:
Dim x As Byte
Dim x1 As Word
Dim x2 As Long
Dim x3 As Single
Dim y As Long
Dim y1 As Single

Call _setup_stack()  'Inicializa la pila Stack por software

x = 101
x1 = 1001
x2 = 910001
x3 = 0.1
Hserout "x = 101, x1 = 1001, x2 = 910001, x3 = 0.1", CrLf, CrLf  'Imprime en el Hyperterminal

Call _stack_buffer()  'Actualiza los bytes libres de la pila
Hserout "Stack_buffer = ", #_stack_buffer, CrLf

Call _push(x, _asbyte)  'Pone un Byte en la pila
Call _push(x1, _asword)  'Pone un Word en la pila
y = _pop(_asword)

Hserout "_Push(x, _asbyte)", CrLf
Hserout "_Push(x1, _asword)", CrLf
Hserout "y = _Pop(_asword)", CrLf
Hserout "Y:", #y, CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf, CrLf

Call _push(x1, _asword)  'Pone un Word en la pila
Call _push(x2, _aslong)  'Pone un Long en la pila
Call _push_single(x3)  'Pone un Single (Float simple) en la pila

Hserout "_Push(x1, _asword)", CrLf
Hserout "_Push(x2, _aslong)", CrLf
Hserout "_Push_single(x3)", CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf, CrLf

y1 = _pop_single()  'Extrae un Single de la pila
Hserout "y1 = _Pop_Single()", CrLf
Hserout "Y1:", #y1, CrLf
y = _pop(_aslong)  'Extrae un long de la pila
Hserout "y = _Pop(_aslong)", CrLf
Hserout "Y:", #y, CrLf
y = _pop(_asword)  'Extrae un Word de la pila
Hserout "y = _Pop(_asword)", CrLf
Hserout "Y:", #y, CrLf
y = _pop(_asbyte)  'Extrae un Byte de la pila
Hserout "y = _Pop(_asbyte)", CrLf
Hserout "Y:", #y, CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf, CrLf

x = 102
x1 = 1002
x2 = 910002
x3 = 0.2
Hserout "x = 102, x1 = 1002, x2 = 910002, x3 = 0.2", CrLf, CrLf

Call _push(x, _asbyte)
Call _push(x1, _asword)
Call _push(x2, _aslong)
Call _push_single(x3)

Call _stack_buffer()
Hserout "Stack_Buffer=", #_stack_buffer, CrLf, CrLf

y1 = _pop_single()
Hserout "Y1:", #y1, CrLf
y = _pop(_aslong)
Hserout "Y:", #y, CrLf
y = _pop(_asword)
Hserout "Y:", #y, CrLf
y = _pop(_asbyte)
Hserout "Y:", #y, CrLf

Call _stack_buffer()
Hserout "Stack_Buffer = ", #_stack_buffer, CrLf

Halt  'Stop
End                                              

Nota: se ha añadido la extensión ".bas" al anexo de los archivos fuente (03/09/2015).
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 13 de Marzo de 2016, 14:39:31
(Ejemplo_1 números grandes con funciones: http://www.todopic.com.ar/foros/index.php?topic=14917.msg307599#msg307599)

Ejemplo_2 números grandes sin funciones:
Hace varios años que realice una función para trabajar con números grandes, pero solo fue como algo anecdótico, después de ver lo que se han popularizado en la red los números grandes (bigfont) para display no gráficos (LCD), he decido actualizarla y realizar una nueva versión simplificada con los números proporcionales y más vistosos.
Para hacerla más popular esta es una versión realizada en lenguaje basic tradicional, o sea con subrutinas y no con funciones.
El código esta explicado línea por línea y tan solo indicar que al utilizar subrutinas en la mayoría de los casos es necesario trabajar con variables globales. Este lenguaje utiliza variables globales y variables locales, las variables globales una ves que se declaran en la subrutina main, inicio o con el nombre que se tenga habitualmente costumbre de nombrarla son visibles desde cualquier parte del código del programa, mientras que el resto de variables que se declaran dentro del resto de subrutinas o funciones del programa son locales, y solo se pueden utilizar dentro de la zona de código donde se declararon. Esto es fundamental tenerlo en cuenta porque hace el código más transportable, sobre todo si se usan funciones en ves de subrutinas.

El programa funciona perfectamente en el simulador del IDE del PSI, tan solo hay que recompilar activando la línea "Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación"


Código: Visual Basic
  1. '*********************************************************************
  2. 'Escribiendo números grandes en LCD de dos líneas
  3. 'con programación tradicional (subrutinas)
  4. 'Para placa PicEBasic, By COS, 03/2016, 12/13, 12/11
  5. 'Basic Pic Simulator IDE (PSI), v7.40, Pic16F88
  6. '*********************************************************************
  7. 'Se modifican los patrones
  8. 'Se hace los numeros proporcionales 2x3 digitos
  9. 'El espacio de separación entre digitos se minimisa
  10. 'Se simplifica la función de impresión de numeros grandes
  11. '---------------------------------------------------------------------
  12. Define CONFIG = 0x2f70  'Fuses
  13. Define CONFIG2 = 0x3ffc
  14. Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
  15. Define STRING_MAX_LENGTH = 11  'Longitud variables string por defecto
  16. 'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  17. '---------------------------------------------------------------------
  18. '*********************************************************************
  19. 'Configuración de la placa entrenadora Pic EBasic ********************
  20. 'LCD con linea de datos a 4 Bit sin Bit R/W **************************
  21. 'Puerto serie RS232 a 38400baudios ***********************************
  22. '*********************************************************************
  23. 'Puerto del LCD ------------------------------------------------------
  24. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  25. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  26. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  27. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  28. Define LCD_RSBIT = 7  'RB7 como RS
  29. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  30. Define LCD_EBIT = 6  'RB6 como E
  31. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  32. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  33. Define LCD_INITMS = 50  'Espera inicialización del Display
  34. '---------------------------------------------------------------------
  35. Symbol ledv = RB0  'Etiqueta el led verde
  36. Symbol leda = RA7  'Etiqueta el led amarillo
  37. Symbol blcd = RB3  'Etiqueta el backlight del lcd
  38. Symbol adc = RA4  'Etiqueta la entrada analogica de la R. ajustable
  39. Symbol sw1 = RA6  'Etiqueta la tecla S1
  40. Symbol sw2 = RA5  'Etiqueta la tecla S2
  41. AllDigital  'ANSEL = 0x00  'Los pin I/O digitales
  42. CMCON = 0x07  'Comparador a off
  43. OSCCON = 0x7e  'Reloj interno a 8Mhz
  44. TRISA = 0x00  'Puerto A como salidas
  45. TRISB = 0x00  'Puerto B como salidas
  46. TRISA.4 = 1  'Como entrada (RA4, adc)
  47. TRISA.6 = 1  'Como entrada (RA6, tecla S1)
  48. TRISA.5 = 1  'Como entrada (RA5, tecla S2)
  49. TRISB.5 = 0  'Como salida(RB5,Tx RS232)
  50. TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
  51. TRISB.4 = 1  'Como entrada (RHT03 inicio)
  52. PORTB.3 = 1  'Luz lcd a ON (RB3)
  53. PORTA.7 = 1  'Led amarillo a OFF
  54. PORTB.0 = 1  'Led verde a OFF
  55. PORTB.1 = 0  'LED RHT03 a OFF
  56. Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
  57. Lcdinit  'Inicializa el LCD sin cursor
  58. '---------------------------------------------------------------------
  59. 'Variables globales
  60. Dim _word01 As String  'Declara cadena
  61. Dim _xpos As Byte  'Posición a imprimir el digito
  62. void_main:
  63.         Gosub _intstrngrandes  'Configura nuevos caracteres y los muestra
  64.         'Variables
  65.         Dim numero As Long
  66.         Dim main As Bit
  67.         numero = 0
  68.         While main = main  'Bucle principal
  69.                 _word01 = #numero  'Convierte un número a cadena
  70.                 _xpos = 1
  71.                 Gosub _strngrandes  'Escribe números grandes
  72.                 Lcdcmdout LcdLine2Pos(_xpos)  'Se escribirá en la línea dos en tal posición
  73.                 Lcdout #numero  'Escribe el número en formato normal
  74.                 numero = numero + 1  'Incrementa el número a imprimir
  75.                 WaitMs 1000  'Pausa de un segundo
  76.         Wend
  77. End                                              
  78. '*********************************************************************
  79. '****************Subrutinas Números Grandes***************************
  80. '*********************************************************************
  81. 'Configura los patrones de bits en la CGRam del LCD y los muestra en el LCD
  82. 'Gosub _intstrngrandes 'Poner al principio
  83. _intstrngrandes:
  84.         Lcddefchar 0, %11111, %11111, %11111, 0, 0, 0, 0, 0  'Barra horizontal superior.
  85.         Lcddefchar 1, 0, 0, 0, 0, 0, %11111, %11111, %11111  'Barra horizontal inferior.
  86.         Lcddefchar 2, %11111, %11111, %11111, 0, 0, 0, %11111, %11111  'Barras h. sup. e inf.
  87.         Lcddefchar 3, %11100, %11110, %11110, %11110, %11110, %11110, %11110, %11100  'Flecha derecha
  88.         Lcddefchar 4, %00111, %01111, %01111, %01111, %01111, %01111, %01111, %00111  'Flecha izq.
  89.         Lcddefchar 5, 0, 0, 0, 0, 0, %00011, %00111, %01111  'Terminación superior izquierda.
  90.         Lcddefchar 6, %00011, %00111, %01111, 0, 0, 0, 0, 0  'Terminación inferior izquierda.
  91.         Lcddefchar 7, 0, 0, 0, 0, 0, %11000, %11100, %11110  'Terminación inferior derecha.
  92.         Lcdcmdout LcdClear  'Se borra el LCD despues de guardar los chr
  93.         'Muestra los caracteres CGRam del LCD, números grandes
  94.         Lcdout "Patrones:"
  95.         Lcdcmdout LcdLine2Home
  96.         Lcdout 0, 1, 2, 3, 4, 5, 6, 7, 255  'Se imprimen los nuevos caracteres
  97.         WaitMs 3000  'Pausa de 3Seg
  98.         Lcdcmdout LcdClear  'Borrar el LCD
  99. Return                                            
  100. '*********************************************************************
  101. 'Subrutina que agranda los caracteres numéricos de una cadena
  102. 'Limitada a la longitud de la cadena, escrita para LCD de 2 líneas
  103. 'xpos: Posición de comienzo a imprimir en el LCD
  104. 'Gosub _strngrandes
  105. '*********************************************************************
  106. _strngrandes:
  107.         Dim _data As Byte  'Mascara del digito a dibujar
  108.         Dim _index As Byte  'Indice mascara
  109.         Dim _cdigito As Byte  'Contador caracteres de la cadena
  110.         Dim _bucle As Bit  'Control exit bucle linea
  111.         Dim _strchr As Byte  'Cotendrá el digito a dibujar
  112.         _bucle = True  'Bucle de control
  113.         _cdigito = 0  'Contador digitos
  114.         _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  115.         While _bucle = True  'Bucle control
  116.                 Lcdcmdout LcdLine1Pos(_xpos)  'Establece la posición inicial a escribir en el LCD
  117.                 For _index = 0 To 5  'Bucle control de ipresión mascaras superior e inferior (digito grande)
  118.                         If _strchr = "0" Then _data = LookUp(4, 0, 3, 4, 1, 3), _index  'Mascaras del 0
  119.                         If _strchr = "1" Then _data = LookUp(6, 255, " ", 5, 255, 7), _index  'Mascaras del 1
  120.                         If _strchr = "2" Then _data = LookUp(6, 2, 3, 4, 1, 7), _index  'Mascaras del chr 2
  121.                         If _strchr = "3" Then _data = LookUp(6, 2, 3, 5, 1, 3), _index  'M. chr 3
  122.                         If _strchr = "4" Then _data = LookUp(4, 1, 255, " ", " ", 255), _index  'M. chr 9
  123.                         If _strchr = "5" Then _data = LookUp(4, 2, 0, 5, 1, 3), _index  'M. chr 5
  124.                         If _strchr = "6" Then _data = LookUp(4, 2, " ", 4, 1, 3), _index  'M. chr 6
  125.                         'If _strchr = "7" Then _data = LookUp(6, 0, 3, " ", 255, " "), _index  'M. chr 7
  126.                         If _strchr = "7" Then _data = LookUp(6, 0, 255, " ", " ", 255), _index  'M. chr 7
  127.                         If _strchr = "8" Then _data = LookUp(4, 2, 3, 4, 1, 3), _index  'M. chr 8
  128.                         If _strchr = "9" Then _data = LookUp(4, 2, 3, " ", " ", 255), _index  'M. chr 9
  129.                         Lcdout _data  'Imprime mascara actual
  130.                         If _index = 2 Then  'Hace los cambios para dibujar la parte inferior del digito grande
  131.                                 Lcdcmdout LcdLine2Pos(_xpos)  'Establece posición en la linea 2
  132.                                 _xpos = _xpos + 3  'Posición del nuevo digito
  133.                         Endif
  134.                 Next _index
  135.                 _cdigito = _cdigito + 1  'Indica la proxima posición a imprimir
  136.                 _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  137.                 If _strchr = 0 Then _bucle = False  'Fin, se sale del bucle
  138.         Wend
  139. Return                                            
  140. '**************************************************************************


El video:

Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: Resistencio en 17 de Mayo de 2016, 01:45:18
No tenía experiencia con PSI...lo intenté compilar con la V6.91, y me tira error en linea 12, 13, 15, 60, 69, 114, 136...Alguna idea ??? No estará en algún lado este mismo ejercicio para PB ??? Saludos.
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 17 de Mayo de 2016, 10:29:04
Las líneas 12 y 13 van directamente relacionadas con el tipo de microcontrolador.
El resto de errores según parece es porque no tienes habilitado el modulo para trabajar con cadenas o string.
Lo ideal sería que actualizaras a una versión completa, de todas formas voy a ver si puedo modificar el código para que te funcione.
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 17 de Mayo de 2016, 21:09:05
A ver que tal con esta otra versión:

Código: Visual Basic
  1. '*********************************************************************
  2. 'Escribiendo números grandes en LCD de dos líneas
  3. 'en programación tradicional (subrutinas)
  4. 'Para placa PicEBasic, By COS, 18/05/2019, 03/16, 12/13, 12/11
  5. 'Basic Pic Simulator IDE (PSI), v7.41, Pic16F88
  6. '*********************************************************************
  7. 'Se modifican los patrones
  8. 'Se hace los numeros proporcionales 2x3 digitos
  9. 'El espacio de separación entre digitos se minimisa
  10. 'Se simplifica la función de impresión de numeros grandes
  11. '---------------------------------------------------------------------
  12. 'Define CONFIG = 0x2f70  'Fuses
  13. 'Define CONFIG2 = 0x3ffc
  14. Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
  15. Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  16. '---------------------------------------------------------------------
  17. '*********************************************************************
  18. 'Configuración de la placa entrenadora Pic EBasic
  19. 'LCD con linea de datos a 4 Bit sin Bit R/W
  20. 'Puerto serie RS232 a 38400baudios
  21. '*********************************************************************
  22. 'Puerto del LCD ------------------------------------------------------
  23. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  24. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  25. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  26. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  27. Define LCD_RSBIT = 7  'RB7 como RS
  28. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  29. Define LCD_EBIT = 6  'RB6 como E
  30. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  31. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  32. Define LCD_INITMS = 50  'Espera inicialización del Display
  33. '---------------------------------------------------------------------
  34. Symbol ledv = RB0  'Etiqueta el led verde
  35. Symbol leda = RA7  'Etiqueta el led amarillo
  36. Symbol blcd = RB3  'Etiqueta el backlight del lcd
  37. Symbol adc = RA4  'Etiqueta la entrada analogica de la R. ajustable
  38. Symbol sw1 = RA6  'Etiqueta la tecla S1
  39. Symbol sw2 = RA5  'Etiqueta la tecla S2
  40. AllDigital  'ANSEL = 0x00  'Los pin I/O digitales
  41. CMCON = 0x07  'Comparador a off
  42. OSCCON = 0x7e  'Reloj interno a 8Mhz
  43. TRISA = 0x00  'Puerto A como salidas
  44. TRISB = 0x00  'Puerto B como salidas
  45. TRISA.4 = 1  'Como entrada (RA4, adc)
  46. TRISA.6 = 1  'Como entrada (RA6, tecla S1)
  47. TRISA.5 = 1  'Como entrada (RA5, tecla S2)
  48. TRISB.5 = 0  'Como salida(RB5,Tx RS232)
  49. TRISB.2 = 1  'Como entrada (RB2, Rx RS232)
  50. TRISB.4 = 1  'Como entrada (RHT03 inicio)
  51. PORTB.3 = 1  'Luz lcd a ON (RB3)
  52. PORTA.7 = 1  'Led amarillo a OFF
  53. PORTB.0 = 1  'Led verde a OFF
  54. PORTB.1 = 0  'LED RHT03 a OFF
  55. 'Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
  56. Lcdinit  'Inicializa el LCD sin cursor
  57. '---------------------------------------------------------------------
  58. 'Variables globales
  59. Dim _word01(15) As Byte  'Declara cadena
  60. Dim _xpos As Byte  'Posición a imprimir el digito
  61. void_main:
  62.         Gosub _intstrngrandes  'Configura nuevos caracteres y los muestra
  63.         'Variables
  64.         Dim numero As Long
  65.         Dim main As Bit
  66.         numero = 0
  67.         While main = main  'Bucle principal
  68.                 Gosub _nmrstr  'Convierte un número a cadena
  69.                 _xpos = 1
  70.                 Gosub _strngrandes  'Escribe números grandes
  71.                 Lcdcmdout LcdLine2Pos(_xpos)  'Se escribirá en la línea dos en tal posición
  72.                 Lcdout #numero  'Escribe el número en formato normal
  73.                 numero = numero + 1  'Incrementa el número a imprimir
  74.                 WaitMs 1000  'Pausa de un segundo
  75.         Wend
  76. End                                              
  77. '*********************************************************************
  78. '****************Subrutinas Números Grandes*******************************
  79. '*********************************************************************
  80. 'Configura los patrones de bits en la CGRam del LCD y los muestra en el LCD
  81. 'Gosub _intstrngrandes 'Poner al principio
  82. _intstrngrandes:
  83.         Lcddefchar 0, %11111, %11111, %11111, 0, 0, 0, 0, 0  'Barra horizontal superior.
  84.         Lcddefchar 1, 0, 0, 0, 0, 0, %11111, %11111, %11111  'Barra horizontal inferior.
  85.         Lcddefchar 2, %11111, %11111, %11111, 0, 0, 0, %11111, %11111  'Barras h. sup. e inf.
  86.         Lcddefchar 3, %11100, %11110, %11110, %11110, %11110, %11110, %11110, %11100  'Flecha derecha
  87.         Lcddefchar 4, %00111, %01111, %01111, %01111, %01111, %01111, %01111, %00111  'Flecha izq.
  88.         Lcddefchar 5, 0, 0, 0, 0, 0, %00011, %00111, %01111  'Terminación superior izquierda.
  89.         Lcddefchar 6, %00011, %00111, %01111, 0, 0, 0, 0, 0  'Terminación inferior izquierda.
  90.         Lcddefchar 7, 0, 0, 0, 0, 0, %11000, %11100, %11110  'Terminación inferior derecha.
  91.         Lcdcmdout LcdClear  'Se borra el LCD despues de guardar los chr
  92.         'Muestra los caracteres CGRam del LCD, números grandes
  93.         Lcdout "Patrones:"
  94.         Lcdcmdout LcdLine2Home
  95.         Lcdout 0, 1, 2, 3, 4, 5, 6, 7, 255  'Se imprimen los nuevos caracteres
  96.         WaitMs 3000  'Pausa de 3Seg
  97.         Lcdcmdout LcdClear  'Borrar el LCD
  98. Return                                            
  99. '*********************************************************************
  100. 'Convierte un número tipo Long a cadena alfanumerica
  101. 'numero = número a convertir
  102. 'La transformación se guarda en el vector "_word01(indice)"
  103. _nmrstr:
  104.         Dim _indice As Byte
  105.         _indice = 0
  106.         Dim _char As Byte
  107.         Dim _len As Byte
  108.         Dim _flag As Bit
  109.         Dim _nn As Byte
  110.         Dim _x As Byte
  111.         Dim _numero1 As Long
  112.         _len = 9  'Número máximo de digitos a convertir -1
  113.         _flag = 0  'Si =0 indica que son ceros a la izquierda, no se procesan
  114.         If numero = 0 Then  'Marca que se procese el cero a la izquierda y Exit
  115.                 _flag = 1  'Se procesa el cero a la izquierda
  116.                 _len = 0  'Fin de la transformación
  117.         Endif
  118.         _x = 1
  119.         While _x = 1  'Bucle de control
  120.                 _numero1 = numero  'Se hace una imagen del número a transformar
  121.                 For _nn = _len To 1 Step -1  'Selecciona el digito a extraer
  122.                         _numero1 = _numero1 / 10
  123.                 Next _nn
  124.                 _char = _numero1 Mod 10  'Extrae el digito
  125.                 If _char > 0 Then _flag = 1  'Marca procesar ceros
  126.                 _char = _char + 48  'Pasa valor numérico a cadena, Acsii 48 = "0".
  127.                 _word01(_indice) = _char  'Pointer(_indice) = _char  'Se asigna elemento a la cadena
  128.                 If _flag = 1 Then _indice = _indice + 1  'Selecciona siguiente caracter de la cadena
  129.                 'No hay más digitos
  130.                 If _len = 0 Then _word01(_indice) = 0  'pointer(_indice) = 0  'Se asigna el cararcter fin de cadena a la cadena
  131.                 If _len = 0 Then Return  'Exit
  132.                 _len = _len - 1  'Cifra siguiente, hasta terminar
  133.         Wend
  134. Return                                            
  135. 'Subrutina que agranda los caracteres numéricos de una cadena
  136. 'Limitada a la longitud de la cadena, escrita para LCD de 2 líneas
  137. 'xpos: Posición de comienzo a imprimir en el LCD
  138. 'Gosub _strngrandes
  139. '*********************************************************************
  140. _strngrandes:
  141.         Dim _data As Byte  'Mascara del digito a dibujar
  142.         Dim _index As Byte  'Indice mascara
  143.         Dim _cdigito As Byte  'Contador caracteres de la cadena
  144.         Dim _bucle As Bit  'Control exit bucle linea
  145.         Dim _strchr As Byte  'Cotendrá el digito a dibujar
  146.         _bucle = True  'Bucle de control
  147.         _cdigito = 0  'Contador digitos
  148.         _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  149.         While _bucle = True  'Bucle control
  150.                 Lcdcmdout LcdLine1Pos(_xpos)  'Establece la posición inicial a escribir en el LCD
  151.                 For _index = 0 To 5  'Bucle control de ipresión mascaras superior e inferior (digito grande)
  152.                         If _strchr = "0" Then _data = LookUp(4, 0, 3, 4, 1, 3), _index  'Mascaras del 0
  153.                         If _strchr = "1" Then _data = LookUp(6, 255, " ", 5, 255, 7), _index  'Mascaras del 1
  154.                         If _strchr = "2" Then _data = LookUp(6, 2, 3, 4, 1, 7), _index  'Mascaras del chr 2
  155.                         If _strchr = "3" Then _data = LookUp(6, 2, 3, 5, 1, 3), _index  'M. chr 3
  156.                         If _strchr = "4" Then _data = LookUp(4, 1, 255, " ", " ", 255), _index  'M. chr 9
  157.                         If _strchr = "5" Then _data = LookUp(4, 2, 0, 5, 1, 3), _index  'M. chr 5
  158.                         If _strchr = "6" Then _data = LookUp(4, 2, " ", 4, 1, 3), _index  'M. chr 6
  159.                         'If _strchr = "7" Then _data = LookUp(6, 0, 3, " ", 255, " "), _index  'M. chr 7
  160.                         If _strchr = "7" Then _data = LookUp(6, 0, 255, " ", " ", 255), _index  'M. chr 7
  161.                         If _strchr = "8" Then _data = LookUp(4, 2, 3, 4, 1, 3), _index  'M. chr 8
  162.                         If _strchr = "9" Then _data = LookUp(4, 2, 3, " ", " ", 255), _index  'M. chr 9
  163.                         Lcdout _data  'Imprime mascara actual
  164.                         If _index = 2 Then  'Hace los cambios para dibujar la parte inferior del digito grande
  165.                                 Lcdcmdout LcdLine2Pos(_xpos)  'Establece posición en la linea 2
  166.                                 _xpos = _xpos + 3  'Posición del nuevo digito
  167.                         Endif
  168.                 Next _index
  169.                 _cdigito = _cdigito + 1  'Indica la proxima posición a imprimir
  170.                 _strchr = _word01(_cdigito)  'Extrae el caracter a agrandar
  171.                 If _strchr = 0 Then _bucle = False  'Fin, se sale del bucle
  172.         Wend
  173. Return                                            
  174. '**************************************************************************
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 10 de Junio de 2016, 10:44:28
Trabajando con parte decimal:
Para el que quiera experimentar un rato la parte decimal.
En el caso de no tener funciones en el lenguaje que trabajen con números reales o en el caso de tenerlos pero no
interesa su uso por ahorro de memoria, he escrito una función que extrae la parte decimal de una división, hasta 8 dígitos.
Se llama mediante:
  Call _Dec8(dividendo, divisor, numero decimales)
Los dígitos quedan almacenador en la variable de cadena (string) _Dec8, se usa una variable de cadena para que
no se pierdan los ceros iniciales.
Esto es:
En una variable numérica no se puede guardar el valor, por ejemplo: 04
Dim variable as Long
variable = 04 es simplificado de forma automática por variable = 4
Así que para mantener los ceros a la izquierda hay que usar una variable tipo String que no entiende de números, solo de codigos ASCII
y que cada codigo corresponde a un cararter.

Código: Visual Basic
  1. 'Funcion extrae parte decimal de un numero
  2. 'Basic PSI, v.7.41, By COS, 06/2016.
  3. 'Para simulación
  4. '********************************************************
  5. Define CLOCK_FREQUENCY = 4
  6. Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  7. 'Puerto del LCD ----------------------------------------------------------
  8. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  9. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  10. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  11. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  12. Define LCD_RSBIT = 7  'RB7 como RS
  13. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  14. Define LCD_EBIT = 6  'RB6 como E
  15. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  16. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  17. Define LCD_INITMS = 50  'Espera inicialización del Display
  18. Lcdinit
  19. AllDigital
  20. 'Declaracion de variables
  21. Dim dividendo As Long  'Dividendo
  22. Dim divisor As Long  'Divisor
  23. Dim decimales As Byte
  24. Dim numero As Long
  25. Dim n As Byte
  26. dividendo = 25
  27. divisor = 24
  28. decimales = 8
  29. 'Rutina principal y bucle principal
  30. main:
  31.         'Bucle decimales
  32.         For n = 1 To decimales
  33.                 numero = dividendo / divisor  'Parte entera
  34.                 Call _dec8(dividendo, divisor, n)  'Dividendo, divisor y numero de decimales
  35.                 Lcdcmdout LcdLine1Home  'Linea 1 y al principio de la linea
  36.                 Lcdout "Decimales:", #n  'Escribe valores en el lcd
  37.                 Lcdcmdout LcdLine2Home  'Linea 2 y al principio de la linea
  38.                 Lcdout #numero, ".", _dec8, "         "  'Escribe valores en el lcd
  39.                 WaitMs 2000  'Espera 2 segundos
  40.         Next n
  41. Goto main
  42. End                                              
  43. 'Extrae la parte decimal de un numero, hasta 8 digitos.
  44. '_dec8 tendra los digitos decimales en formato cadena (string)
  45. 'Call _Dec8(dividendo, divisor, numero decimales)
  46. Function _dec8(_dividendo As Long, _divisor As Long, _decimales As Byte) As String
  47.         Dim _resto As Long
  48.         Dim _n As Byte
  49.         Dim _aux As Long
  50.         _dec8 = ""  'Borra la cadena
  51.         If _decimales > 8 Then _decimales = 8  'Maximo 8 digitos de salida
  52.         If _decimales = 0 Then _decimales = 1  'Minimo 1 digito de salida
  53.         _resto = _dividendo Mod _divisor  'Resto
  54.         'Bucle que extrae la parte decimal
  55.         For _n = 1 To _decimales
  56.                 _resto = _resto * 10
  57.                 _aux = _resto / _divisor
  58.                 'Asigna los ceros a la izquierda
  59.                 If _aux = 0 Then
  60.                         _dec8 = _dec8 + "0"
  61.                 Endif
  62.         Next _n
  63.         If _aux > 0 Then _dec8 = _dec8 + #_aux  'Concatena los ceros a la izquierda con los otros digitos
  64. End Function
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 10 de Junio de 2016, 11:10:07
Y para el que no se maneje con funciones pego la versión tradicional con subrutina:

Código: Visual Basic
  1. 'Subrutina extrae parte decimal de un numero
  2. 'Basic PSI, v.7.41, By COS, 06/2016
  3. 'Para simulación
  4. '********************************************************
  5. Define CLOCK_FREQUENCY = 4
  6. Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
  7. 'Puerto del LCD ----------------------------------------------------------
  8. Define LCD_BITS = 4  'Bus de datos del lcd, a 4bit
  9. Define LCD_DREG = PORTA  'Bus de datos, puerto A
  10. Define LCD_DBIT = 0  'Bus datos 4, bit menos significativos del puerto
  11. Define LCD_RSREG = PORTB  'Bit de control RS, puerto B
  12. Define LCD_RSBIT = 7  'RB7 como RS
  13. Define LCD_EREG = PORTB  'Bit de control E, puerto B
  14. Define LCD_EBIT = 6  'RB6 como E
  15. Define LCD_COMMANDUS = 2000  'Espera despues de cada comando
  16. Define LCD_DATAUS = 100  'Espera despues de enviar un dato al LCD en uSeg.
  17. Define LCD_INITMS = 50  'Espera inicialización del Display
  18. Lcdinit
  19. AllDigital
  20. 'Declaracion de variables globales
  21. Dim _dec8 As String
  22. Dim dividendo As Long  'Dividendo
  23. Dim divisor As Long  'Divisor
  24. Dim decimales As Byte
  25. Dim numero As Long
  26. dividendo = 25
  27. divisor = 24
  28. decimales = 0
  29. 'Rutina principal y bucle principal
  30. main:
  31.         decimales = decimales + 1
  32.         If decimales > 8 Then decimales = 1
  33.         numero = dividendo / divisor  'Parte entera
  34.         Gosub _dec_8  'Dividendo, divisor y numero de decimales
  35.         Lcdcmdout LcdLine1Home  'Linea 1 y al principio de la linea
  36.         Lcdout "Decimales:", #decimales  'Escribe valores en el lcd
  37.         Lcdcmdout LcdLine2Home  'Linea 2 y al principio de la linea
  38.         Lcdout #numero, ".", _dec8, "         "  'Escribe valores en el lcd
  39.         WaitMs 2000  'Espera 2 segundos
  40. Goto main
  41. End                                              
  42. 'Extrae la parte decimal de un numero, hasta 8 digitos.
  43. '_dec8 tendra los digitos decimales en formato cadena (string)
  44. _dec_8:
  45.         Dim _resto As Long
  46.         Dim _n As Byte
  47.         Dim _aux As Long
  48.         _dec8 = ""  'Borra la cadena
  49.         If decimales > 8 Then decimales = 8  'Maximo 8 digitos de salida
  50.         If decimales = 0 Then decimales = 1  'Minimo 1 digito de salida
  51.         _resto = dividendo Mod divisor  'Resto
  52.         'Bucle que extrae la parte decimal
  53.         For _n = 1 To decimales
  54.                 _resto = _resto * 10
  55.                 _aux = _resto / divisor
  56.                 'Asigna los ceros a la izquierda
  57.                 If _aux = 0 Then
  58.                         _dec8 = _dec8 + "0"
  59.                 Endif
  60.         Next _n
  61.         If _aux > 0 Then _dec8 = _dec8 + #_aux  'Concatena los ceros a la izquierda con los otros digitos
  62. Return
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 31 de Agosto de 2016, 21:11:10
Manual Pic Simulator IDE:

Dejo algunos enlaces a manuales sobre el Basic del Pic Simulator IDE en castellano:

http://documents.mx/documents/manual-pic-simulator.html

https://es.scribd.com/doc/203377095/Pic-Simulator-IDE-Manual

http://www.academia.edu/11332094/PROGRAMACION_DE_PIC_CON_PIC_IDE_SIMULATOR
Título: Re:PIC BASIC del PIC Simulator IDE (Índice en página 1)
Publicado por: dogflu66 en 13 de Marzo de 2024, 06:38:01
Hola amigos, hace tiempo que se deje el hilo no por falta de visitas sino por falta de participación.
De todas maneras esto es un llamamiento para aquellos que siguen usando este lenguaje que viene integrado con un IDE que tiene simulador propio tanto de Basic como de Assembler. Ya lo utilicen como hobby, como nostalgia de otros tiempo o por que simple mente le gusta el lenguaje Basic o no lo utilizan pero les gusta participar porque alguna vez lo usaron. Si lo gramos reunir un reducido grupo de personas que quieran compartir sus experimentos tanto pasados como futuros podemos plantearnos continuarlo. El lenguaje ha tenido importantes mejoras que le permiten trabajar casi en cualquier proyecto deseado. El mero echo de ampliar sus librerías el hilo ya tendría diversión y debate por años. Si alguien esta interesado y para no contaminar el hilo puede enviarme un mensaje por la mensajería privada del foro.

Independientemente de lo expuesto hace algún tiempo que estoy continuando con el tema por aquí:
https://www.electro-tech-online.com/forums/oshonsoft/ , en Ingles.