# [Tutorial] Pic Simulator IDE Pequeña instrucción



## Milesatra (Jul 21, 2014)

Bueno he visto que en este foro hay muy buena ayuda para casi todos los IDE's de programacion, pero no he visto ni uno de PIC simulator, y apesar que es un poco antiestetico, este es muy funcional y si se logra aprender a trabajar con el es una herramienta muy util.
En este Tema estaré subiendo algunos ejemplos y contestando dudas que peudan surgir sobre el IDE.
Primero que nada quisiera dejar el enlace para la pagina OFICIAL de PIC simulator 
http://www.oshonsoft.com/downloadspage.php
bueno alli solo escribimos el Captchat y listo tendremos una version demo, si queiremos comprar el original pues nos vamos a la derecha y picamos en licencias.. bueno eso ya lo dejo a su gusto.
Lo primero a explicar es la sencilla sintaxis, estaremos trabajando por ahora solo con el Basic compiler asi que una vez tengamos instalado el IDE vamos a la pestaña "Tools" y luego damos click en "Basic Compiler" y nos desplegara otra ventana con un block de notas.
Lo primero a explicar es el lenguaje, un PIC reconoce una serie de instrucciones en un codigo especifico (el numero y lo que hacen las instrucciones esta definido por el fabricante) pero resulta que trabajar con estos comandos tan basicos y poco flexibles es un poco complicado, asi que para un inicio un poco mas comodo, podemos utilizar un compilador de Basic o de cualquier otro lenguaje que sepamos usar o nos interese, ya que en este compilador alguien ya se ha dado a la tarea de crear una equivalencia entre las funciones y procesos que podemos definir en ese lenguaje y lo que debe de hacer en las instrucciones del pic.
No entrare mas en la historia y funcionamiento basico de los PIC's pero si alaguien esta interesado en aprender un poco mas aca dejo un enlace que puede que les sirva. 
http://www.mikroe.com/chapters/view/79/capitulo-1-el-mundo-de-los-microcontroladores/

Antes de empezar nuestro programa debemos definir el valor de nuestro reloj y que PIC vamos a utilizar para esto damos click en la parte de "Microcontroller" en la parte superior izquierda de la primer ventana que sale, y seleccionamos el modelo de nuestro PIC. Luego damos select y en la misma linea solo que del lado derecho encontramos "Clock Frequency" aca damos click tambien y escribimos unicamente el valor de nuestro reloj. Para este ejemplo utilizaremos un PIC 16F877A y un reloj de 8.00 MHz

El primer tema que hay que tener en cuenta es la distribucion de los peurtos, al hacer un programa o un sistema embebido, este tendra una funcion y dependiendo de esta, tendremos que definir que pines son entrada y que pines son salidas.
En el Basic compiler de Pic simulator podemos definir cada pin individualmente como entrada, asignandole un 1 binario en la posicion que corresponde a ese puerto o definirlo como salida asignandole un 0 binario en el que corresponde.
Es decir suponiendo que queremos hacer que en el puerto B en el pin B2 sea una entrada y el resto salidas pues lo hacemos de la siguiente manera:
TRISB = 00000100b
esto indica que el pin en la posicion B2 sera una entrada y el resto salidas, tambien podemos usar decimales en la asignacion, simplemente quitamos la "b" y tambien podemos usare hexagesimales, simplemente agregando "0x" antes del numero. Si usamos otro puerto simplemente dejamos el "TRIS" y cambiamos acontinuacion la letra del peurto, "A", "B", "C" o el que querramos, asegurandomos siempre que exista en nuestro pic.

Ahora haremos nuestro primer ejemplo y programa en PIC simulator, este unicamente encendera un led conectado al peurto B0 del PIC.

Luego de definir cuales son entradas y cuales salidas vamos al inicio de nuestro programa,
por lo general se recomienda que se le ponga un inicio y un fin antes de empezar con cualquier cosa asi que vamos a eso:

Primero asignamos un nombre de "etiqueta" este sera el nombre de esta porcion de codigo, puede ser cualquier cosa, esta servira para ordenarnos y para poder llamar esta porcion del codigo mas adelante en este caso se llamara "start"
Despues vamos abajo y escribimos un "GOTO start" esto ara que regrese a la etiqueta "start" una vez alla terminado de ejecutar el codigo, esto nos sirve pues necesitamos que el programa se ejecute muchas veces, tomemos en cuenta que al PIC le tomara unas decimas de segundo recorrer aun el programa mas dificil que podamos pensar y luego no ara nada asi que lo encerramos por eso en un ciclo infinito, para que siempre este funcionando.
y nos deveria quedar algo asi:

```
start:
Goto start
```
una vez tengamos eso debemos definir nuestra unica salida, por ahora como no utilizaremos ninguno de los otros pines del puerto B, podemos asignarlos todos como salidas, pero tambien podemos asignar unicamente el que vallamos a utilizar para.

```
TRISB = 11111110b
start:
Goto start
```
Una vez definida la salida que utilizaremos, podemos hacer que encienda el led, esto lo hacemos con el comando PORTB = xxxx este comando es como el TRIS pero no asigna entrada o salida, sino asigna un 0 o 1 a cada uno de los puertos en sus salidas, donde 0 = 0v y 1 = 5v. En esta funcion tambien podemos usar valores decimales, binarios o exagesimales siguiendo las mismas instrucciones que en el TRIS.

```
TRISB = 11111110b
start:
PORTB = 1b
Goto start
```
Para que tenga un poco de funcionalidad y podamos apreciar el trabajo haremos que el led parpadee asi que asignamos un retardo o Delay. El comando que utilizamos es el "WaitUs" o "WaitMs" lo que nos indica lo que esta despues del "Wait" es si el valor que ponemos acontinuacion es de milisegundos o microsegundos, para fines practicos no es muy utilizado el "WaitUs" pues no es apreciable pero en la simulacion es mejor usarlo pues si usamos milisegundos se tardara demaciado.

```
TRISB = 11111110b
start:
PORTB = 1b
WaitUs 100
Goto start
```
luego de esto apagamos el led.

```
TRISB = 11111110b
start:
PORTB = 1b
WaitUs 100
PORTB = 0
Goto start
```
Bueno, en codigo hasta aqui termina el ejemplo, ahora viene la simulacion, lo primero que debemos hacer es ir a la parte de arriba, en "Tools" y seleccionar "Compile & Assamble & Load" esto compilara, ensamblara y cargara el programa en el simulador.
Hecho eso vamos a la otra ventana y seleccionamos en el menu de arriba la opcion "Rate" aca vamos hasta la ultima opcion "Ultimate" esto es para que el programa se ejecute rapido, sino se ejecutara muy lento.
Para poder ver nuestro programa funcionar vamos a la parte de "Tools" en ese mismo menu y seleccionamos la opcion "Microcontroller View" nos abrira otra ventana con cada uno de los pines del PIC acontinuacion vamos a la ventana principal y seleccionamos la opcion "Simulaton" y vamos a la opcion "Start", regresamos a la ventana de "Microcontroller View" y listo esta corriendo nuestro programa, veremos que en el puerto B0 estaraa oscilando nuestro led, (oscila entre el estado "ON" y "OFF" la etiqueta a la derecha del PIN), Tambien podemos ir a la opcion "Tools" en la ventana principal y seleccionar "8 X Led board" y veremos ahora si el led parpadear y no solo el estado de la etiqueta.
Ese es el primer ejemplo que traigo, mas tarde subire el siguiente sera sobre uso de Botones en PIC simulator, si alguien tiene una duda sobre algo de la IDE puede preguntar



Ejemplo # 2
Led que oscila cuando se preciona un boton y se apaga con otro
vamos a lo primero, definimos el PIC y el clock, siempre 16F877A para estos ejemplos y 8.00 MHz
Definimos tambien los puertos y asignamos el inicio

```
TRISB = 255 '11111111b
TRISD = 0
start:
If PORTB = 2 Then
PORTD = 0
Endif
If PORTB = 1 Then
PORTD = 1
Endif
Goto start
```
El IF es una funcion condicional, es decir hara lo que escribamos  en su interior solo si se cumple la condicion que escribamos en el.
Ahora simulamos el programa como hicimos el anterior, para cambiar el estado de un pin de entrada en el simulador, vamos al Microcontroller View y buscamos el pin que declaramos como entrada, en este caso "B0" para encender y "B1" para apagar, alapar del estado "OFF" en este momento habra un boton con una "T" alli damos click y cambiara su estado de "OFF" a "ON" o de "ON" a "OFF" depende de su estado anterior.
Y alli tenemos nuestro segundo programa hecho.


----------



## Milesatra (Jul 22, 2014)

Ejemplo # 3
Ahora aprenderemos a usar la funcion ADC del Microcontrolador (si dispone de ella)
como ya hemos hecho antes, ajustamos el microcontrolador, 16f877a y el reloj de 8.00 Mhz
abrimos el compilador de Basic y empezamos.
Primero que nada debemos definir que puertos Analógicos son los que vamos a usar, para eso usamos el comando ADCON1 = xxx, en este asignamos que puertos seran usados como digitales y cuales como analógicos, por ahora pondremos un 0, indicando que todos seran analógicos, (si quisieramos todos digitales se coloca un 7). En caso de querer convinaciones aca dejo un enlace con la tabla de equivalencias para cada una de las diferentes convinaciones que se peuden hacer.
http://www.alos.5u.com/pic16f877/Modulo3.html
Bueno, una vez definido esto, definimos tambien las entradas, que en este caso usaremos como entrada analogica el puerto A0, y encenderemos una serie de leds conectados al puerto B.
Aclarando algo antes de empezar, los puertos analogicos convierten un valor de voltaje, escalar, en un valor entero de 10 bits, por lo que el valor maximo de voltaje que introduzcamos (5v.) sera igual a 1023 y el valor minimo (0) sera igual a 0, por lo que si introducimos por ejemplo un 4.5 este se vera como un 920 para saber a que numero entero equivale un valor de voltaje simplemente hacemos una regla de 3 (1023*v)/5 con esto tenemos el valor que reconocera nuestro PIC. tambien es importante resaltar que el PIC no trabaja con numeros decimales ni fraccionarios, asi que unicamente nos mostrara el entero, y eliminara la parte decimal de la operacion de conversion.
Como tendremos 8 leds conectados, debemos dividir los 5v de entrada entre los 8 leds, esto para que se enciendan de a uno por vez correspondiendo cada uno a un valor de voltaje, con lo que obtenemos que cada led se encendera aproccimadamente cada 0.62v que equivalen a 127 para nuestro PIC. para hacer que nuestros leds no se apagen en el momento de variar no haremos que compare el valor del pin de entrada con una variable fija, sino le daremos un rango para que no tengan cabida los "agujeros" en los que ningun led estará encendido.

```
ADCON1 = 0
TRISA = 255
TRISB = 0

Dim state As Word
Dim disp As Byte

start:
Adcin 0, state

If state >= 126 And state < 253 Then disp = 1  '1
If state >= 253 And state < 380 Then disp = 3  '2
If state >= 380 And state < 507 Then disp = 7  '3
If state >= 507 And state < 634 Then disp = 15  '4
If state >= 634 And state < 761 Then disp = 31  '5
If state >= 761 And state < 887 Then disp = 63  '6
If state >= 887 And state < 1023 Then disp = 127  '7
If state = 1023 Then disp = 255  '8
If state = 0 Then disp = 0
PORTB = disp
Goto start
```
Y bueno con esto ya tenemos la codificacion cubierta, ahora viene la simulacion, primero lo compilamos, guardamos, ensamblamos y cargamos.
pasamos a la ventana principal y abrimos el "Microcontroller View" y el "8 x Led Board", para variar el valor de entrada en A0, simple y sencillamente damos click a la "A" que aparacece alapar de este y variamos el numero que tomará en nuestro programa ese pin.
Hay que aclarar que si no soltamos el click, el pin no registra el cambio por lo que nada en nuestrop programa cambiara.


----------



## SantiMerca (Ene 12, 2015)

Hola, si tenes más ejemplo por favor me gustaría verlos. Muchas gracias por el aporte.


----------



## estebanratto (May 13, 2017)

hola, el tipo de variable single hace calculos con coma flotante, y con la declaracion
Define SINGLE_DECIMAL_PLACES = (1 a3) elegimos la cantidad de decimales.


----------



## Marce2576 (Sep 29, 2018)

alguien pudo hacer recepción serie con Hserget para pasar algunos ejemplos, ya que estoy comunicando un arduino con pic y del lado pic la recepción no me devuelve los valores correctos.


----------

