# [Tutorial] y manejo de Proton IDE



## mecatrodatos (Nov 29, 2009)

Que tal estoy en busca de un tutorial de manejo de Proton ide o realizarlo con ayuda, manejo bien basic pero me interesa este entorno de programcion para los micros de alta gama he hecho programas basicos pero algunas instrucciones las desconosco se me ha facilitado por el entorno de microco studio, espero colaboracion he ire posteando ejemplos.

Bien vamos con el primer ejemplo para la utilización de protón al seleccionar cualquier tipo de microcontrolador se tiene el comando Device y se utiliza de la siguiente manera:


Una vez seleccionado el pic con el que se va a trabaja aparecerá en la sección de Code Explorer la carpeta con sus características de operación obteniendo información cuando se abre la carpeta del pic seleccionado esto es aplicable para todos.

Device 16F877A Device 16F84A Device 18F2550……Configuración del oscilador: Para operar con un oscilador externo se utiliza el comando XTAL=x, siendo x el rango de trabajo del oscilador por ejemplo:

XTAL=4 ; Oscilador de 4 MHZXTAL=8 ; Oscilador de 8 MHZ…

Definición de salidas: Se utiliza el comando Symbol precedido del alias y del pin del pic a utilizar por ejemplo:

Symbol LED=PORTD.0Symbol SW1 = PORTB.4

Retardos: Esta función realiza retardos según el número de ciclos de instrucción especificado en los valores posibles van desde 1 a 255. Un ciclo de instrucción es igual a cuatro periodos de reloj.

DelayMS time

Esta función realiza retardos del valor especificado en time. Dicho valor de tiempo es en milisegundos y el rango es 0-65535 sirve para obtener retardos más largos así como retardos ‘variables’.

Ejemplos:

DelayMS 500 ' Esperar 500msDelayMS 1000 ' Esperar 1segundo


DelayUS time

Esta función realiza retardos del valor especificado en time. Dicho valor es en microsegundos y el rango va desde 0 a 65535. 

Ejemplos:

DelayUS 500 ' Esperar 500UsDelayUS 1000 ' Esperar 1ms

High: Sirve para colocar el pin a uno lógico es decir en ON, ejemplo:

High LEDHigh PORTD.0

LOW: Sirve para colocar el pin a uno cero lógicos es decir en OFF, Ejemplo:


Low LEDLow PORTD.0


GoTo: comando para crear un bucle cerrado y continuación del programa

Nuestro primer programa quedaria asi:
titiliar un led por el puerto D del pic 16f877A cada 500 msg


Device 16F877A
XTAL ; Oscilador de 4 MHZ
Symbol LED=PORTD.0
INICIO:High LEDDelayMS 500Low LEDDelayMS 500GoTo INICIO

Dejo en archivo adjunto simulacion en proteus y codigo en proton para los que trabajan con pic basic pro les quedara facil para entrarnos con los pic de la familia 18f


----------



## mecatrodatos (Dic 1, 2009)

Bien vamos con el segundo proyecto en proton con el comando:

ALL_DIGITAL = True ' Coloca todo los pines como digitales

tambine de utilizan los condicionales de pbp IF , THEN , ELSE , ENDIF

IF ...THEN IF Comp { AND/OR Comp ... } THEN Label IF Comp { AND/OR Comp ... } THENDeclaración
ELSEDeclaraciónENDIF
Efectúa una ó más comparaciones .Cada término Comp puede relacionar una variable con una constante ú otra variable e incluye uno de los operadores listados anteriormente .


IF ... THEN evalúa la comparación en términos de CIERTO o FALSO .Si lo considera cierto , se ejecuta la operación posterior al THEN . Si lo considera falso , no se ejecuta la operación posterior al THEN .Las comparaciones que dan 0 se consideran falso .Cualquier otro valor es cierto .Asegurese de usar paréntesis para especificar el orden en que se deben realizar las operaciones .De otra manera , la prioridad de los operadores lo determina y el resultado puede no ser el esperado .


IF..THEN puede operar de dos maneras. De una forma, el THEN en un IF..THEN es esencialmente un 

GOTO

. Si la condición es cierta, el programa irá hacia la etiqueta que sigue al THEN. Si la condición es falsa, el programa va a continuar hacia la próxima línea después del IF..THEN. Otra declaración no puede ser puesta después del THEN; sino que debe ser una etiqueta.

If LED = 1 Then alarma 

‘ si el LED esta a uno logico(1), salta a la etiqueta alarma

En la segunda forma, IF..THEN puede ejecutar condicionalmente un grupo de declaraciones que sigan al THEN. Las declaraciones deben estar seguidas por un ELSE o un ENDIF para completar la estructura.

If LED_1 = 0 Then ' Chequea estado del Led
LED_1 = 1 'Invierte estado del Led

ElseLED_1 = 0EndIf

si el valor de LED no es cero logico entoces establer y terminar concicional . 

Por ultimo dejo simulacion y montaje en proteus del segundo proyecto


----------



## mecatrodatos (Dic 5, 2009)

Que tal amigos les dejo video proyecto 3 en donde se visualiza codigo en proton para display de 8 segmentos de 0 - 9, y simulacion en proteus. Por fin supe como grabar y que se viera bien lo pueden abrir con windows media player saludos

luego vere como puede subir todos en youtobe y crear un video tutorial


----------



## mecatrodatos (Ene 1, 2010)

Que tal año nuevo mentes nuevas empezando con el tutorial de pronton plus Ide en forma anexo vamos con fundamentos basicos he ir adaptandolo para convertirlo en pdf.

¿Qué es un microcontrolador?

Es un circuito integrado programable que acepta un listado de instrucciones y contiene todos los componentes de un computador. Se utilizan para realizar determinadas tareas o para gobernar dispositivos, debido a su reducido tamaño, suele ir incorporado en el propio dispositivo que gobierna. El microcontrolador es un dispositivo dedicado. En su memoria solo reside un programa destinado a gobernar una aplicación determinada, sus líneas de entradas y salidas (I/O) permiten la conexión de sensores y relay. Una vez programado y configurado el microcontrolador solamente sirve para gobernar la tarea asignada.


Un microcontrolador dispone normalmente de los siguientes componentes:
• Procesador o UCP (Unidad Central de Proceso).
• Memoria RAM para Contener los datos.
• Memoria para el programa tipo ROM/PROM/EPROM/EEPROM & FLASH.
• Líneas de (entrada / salida) para comunicarse con el exterior.
• Diversos módulos para el control de periféricos (temporizadores,
Puertos Serie y Paralelo, A/D y D/A, etc.).
• Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema.

Evidentemente, el corazón del microcontrolador es un microprocesador, pero cabe recordar que el microcontrolador es para una aplicación concreta y no es universal como el microprocesador.

El microcontrolador es en definitiva un circuito integrado que incluye todos los componentes de un computador. Debido a su reducido tamaño es posible montar el controlador en el propio dispositivo al que gobierna. En este caso el controlador recibe el nombre de controlador empotrado (embedded controller).

¿Diferencia entre microprocesadores y
Microcontroladores?

El microprocesador es un circuito integrado que contiene la Unidad Central de Proceso (CPU), también llamado procesador, de un computador. El CPU está formado por la Unidad de Control, que interpreta las instrucciones, y el BUS de Datos, que los ejecuta.

Los pines de un microprocesador sacan al exterior las líneas de sus buses de direcciones, datos y control, para permitir conectarle con la Memoria y los Módulos de (ENTRADA / SALIDA) E/S y configurar un computador implementado por varios circuitos integrados.

Se dice que un microprocesador es un sistema abierto porque su configuración es variable de acuerdo con la aplicación a la que se destine.

El microcontrolador es un sistema cerrado. Todas las partes del computador están contenidas en su interior y sólo salen al exterior las líneas que gobiernan los periféricos. Usted podría pensar que las características de un sistema cerrado representan una desventaja con relación a los Microprocesadores, pero en la práctica cada fabricante de microcontroladores oferta un elevado número de modelos diferentes, desde los más sencillos hasta los más poderosos. Es difícil no encontrar uno que se adapte a nuestros requerimientos del momento.

Es posible seleccionar la capacidad de las memorias, el número de líneas de (ENTRADA / SALIDA) E/S, la cantidad y potencia de los elementos auxiliares, la velocidad de funcionamiento, etc. Por todo ello, un aspecto muy destacado del diseño es la selección del microcontrolador a utilizar.

Podemos concluir con que la diferencia fundamental entre un Microprocesador y un Microcontrolador: es que el Microprocesador es un sistema abierto con el que se puede construirse un computador con las características que se desee, acoplándole los módulos necesarios.

Un Microcontrolador es un sistema cerrado que contiene un computador completo y de presentaciones limitadas que no se pueden modificar.

Sistemas numéricos

Un numero decimal como 5249 representa una cantidad igual a 5 millares, más 2 centenas, más 4 decenas, más 9 unidades. Los millares, centenas, decenas y unidades, son potencia de 10 implicadas por la posición de los coeficientes. Para ser más exactos, 5249 debe escribirse como:
5x103 + 2x102 + 4x101 + 9x100
5x1000 + 2x100 + 4x10 + 9x1
5000 + 200 + 40 + 9
5249

El sistema de número decimales se dice que es de base, o raíz 10 debido a que usa 10 símbolos y los coeficientes se multiplican por potencia de 10.

A parte del sistema decimal existen otros sistemas numéricos como son el sistema binario, el sistema octal y el sistema hexadecimal. Realmente los microcontroladores manejan el sistema binario; pero en la programación el más conveniente es el hexadecimal y para cálculos matemáticos el decimal. En la siguiente tabla vea la conversión equivalente entre el sistema decimal, hexadecimal y binario.




El sistema decimal está compuesto por 10símbolos (0–9), el sistema hexadecimal está compuesto por 16 símbolos (0-9, A, B, C, D, E, F) y el sistema binario está compuesto por dos símbolos (0-1).

Cualquier sistema numérico es infinito, mientras el sistema contenga mayor cantidad de símbolos su representación será más abreviada; como es el caso del sistema hexadecimal.
Para convertir de un sistema numérico a otro usted puede auxiliarse de una calculadora científica o de la calculadora incluida en el sistema operativo Windows.

Los microcontroladores trabajan con el sistema binario, decimal y hexadecimal. No son necesarias las conversiones de un sistema a otro. Pero sin embargo necesitan un formato de representación para que el PIC BASIC PROTON PLUS pueda reconocerlos.

Por ejemplo si se tiene el siguiente valor decimal: Mil Ciento Diez (1110). Este valor se puede interpretar:

• En binario (1110): Decimal 14
• En hexadecimal (1110): Decimal 4368

La misma representación puede interpretarse como 3 valores diferentes. El PIC BASIC PROTON PLUS distingue las cantidades decimales de forma natural y las hexadecimales y binarias por símbolos a la izquierda de la cifra a representar.

Lógica Binaria o de 2 estados

La lógica binaria trata con variables que toman dos valores distantes y con operaciones que tienen significado lógico. Los dos valores que toman las variables pueden designarse con nombres diferentes (verdadero y falso, si y no, true y false, 0 y 1, etc.), pero para este propósito no es conveniente pensar en términos de BITS y asignarles los valores de 1 y 0. La lógica binaria se usa para describir, en forma matemática, la manipulación y el proceso de la información binaria. Existe una analogía directa entre las señales binarias, los elementos de circuito binario y digito binario.

Un número binario de n dígitos, por ejemplo puede representarse por n elementos de números binarios, cada uno con una señal de salidaequivalente a 0 o al 1. Los sistemas digitales representan y manipulanno sólo números binarios, sino también otro muchos elementos discretosde información.

Un BIT, por definición, es un digito binario. Cuando se usa junto con un código binario, es mejor considerarlo como si denotara una cantidad binaria igual a 0 o 1. Para representar un grupo de 2n elementos distintos en un código binario, se requiere un mínimo de n BITS. Esto se debe a que es posible ordenar n BITS en 2n formas distintas. Por ejemplo un grupo de 16 elementos puede representarse mediante un código de 4 BITS. 24 = 16 elementos.

Durante todo el contenido de este tutorial se trabajara con los términos (1) lógico, (0) lógico, señal alta, señal baja, HIGH, LOW, 0 y 1. Cuando se dice que una señal es alta quiere decir que mide +5 Voltios con relación a tierra, cuando una señal es baja mide +0 Voltios con relación a tierra. Los BS2 trabajan con la lógica TTL, esta opera con +5 Voltios como fuente de alimentación. Las señales se fundamentan entre +0 Voltios y +5 Voltios.

Esto es aplicable tanto para las entradas como para las salidas, en la siguiente tabla se puede apreciar los diferentes términos para referirse a la lógica binaria.



Operaciones lógica básicas

Existen 3 operaciones lógicas llamadas: AND, OR y NOT.

1. AND esta función es verdadera cuando todas sus entradas son verdaderas. Y es falso cuando cualquiera de sus entradas son falsas. Se interpreta como la multiplicación binaria.
2. OR esta función es falsa cuando todas sus entradas son falsas. Y es verdadera cuando cualquiera de sus entradas sea verdadera. Se interpreta como la suma binaria.
3. NOT es la negación del resultado si es verdadero lo convierte en falso. Si es falso lo convierte en verdadero.


Estas son las 3 operaciones fundamentales en la lógica binaria, a partir de estas funciones se derivan otras más que son las combinaciones de las 3 funciones básicas.

Formato de conversión numérica del PROTON PLUS IDE

El editor PROTON PLUS IDE utiliza símbolos para identificar los distintos sistemas numéricos. Los números hexadecimales se representan con el signo de moneda ($), los números binarios con el símbolo de porcentaje (%), los caracteres ASCII encerrados entre comillas (") y los números decimales de forma directa. Vea el siguiente ejemplo:

75 ‘Decimal
%01001 ‘Binario
$65 ‘Hexadecimal
“A” ‘ASCII “

Las 3 instrucciones siguientes contienen el mismo significado:

PORTB = 14
PORTB = $E
PORTB = %1110

El PROTON PLUS IDE es un entorno de programación basado en un BASIC estructurado orientado a entrada y salida de señales. La utilización de sencillas instrucciones de alto nivel, permite programar los Microcontroladores para controlar cualquier aplicación llevada a cabo por un proceso. Las instrucciones de PBASIC PROTON PLUS IDE permiten controlar las líneas de (entrada /salida), realizar temporizaciones, realizar trasmisiones serie asincrónica, utilizar el protocolo SPI, programar pantallas LCD, capturar señales analógicas, emitir sonidos, etc. y todo ello en un sencillo entorno de programación que facilita la creación de estructuras condicionales y repetitivas con instrucciones como IF...THEN o FOR...NEXT y la creación de etiquetas de referencia.

Algunas aplicaciones de los Microcontroladores

La única limitante de los Microcontroladores es su imaginación. La facilidad de un puerto abierto de (entrada / salida), la capacidad de evaluación de señales para luego decidir una acción y poder controlar dispositivos externos. Hacen que el microcontrolador sea el cerebro de los equipos. Estos son algunos ejemplos de áreas de aplicaciones:

• Electrónica Industrial (Automatizaciones)
• Comunicaciones e interfase con otros equipos (RS-232)
• Interfase con otros Microcontroladores
• Equipos de Mediciones
• Equipos de Diagnósticos
• Equipos de Adquisición de Datos
• Robótica (Servo mecanismos)
• Proyectos musicales
• Proyectos de Física
• Proyectos donde se requiera automatizar procesos artísticos
• Programación de otros microcontroladores
• Interfase con otros dispositivos de lógica TTL:

1. Teclado
2. Pantallas LCD
3. Protocolo de comunicación: RS232, I2, SPI
4. Sensores
5. Memorias
6. Real Time Clock (RTC)
7. A/D, D/A, Potenciómetros Digitales

E/S de los Microcontroladores

La dirección de entrada y salida de un contacto dado está enteramente bajo el control de su programa. Cuando un contacto es declarado como una entrada de información, tiene muy poco efecto en los circuitos conectados con él, con menos de 1 microamperio (uA) de consumo interno.

Hay dos propósitos para poner un pin en modo de entrada de información: (1) leer en modo pasivo el estado (1 o 0) de un circuito externo, o (2) para desconectar las salidas que manejan el pin. Para que el consumo de corriente sea él más bajo posible, las entradas de información deben siempre estar cerca de +5 voltios o cercano a la tierra. Los pines no utilizados en sus proyectos no se deben dejar libres en modo de entrada. Los pines no usados deben ser declarados como salida aunque no estén conectados; esto es para evitar que las entradas estén interpretando el ruido externo como señales lógicas.

Cuando un pin esta en modo de salida, internamente está conectado a la tierra o +5 voltios a través de un interruptor muy eficiente del circuito CMOS. Si se carga ligeramente (< 1mA), el voltaje de la salida estará dentro de algunos mili voltios cercanos de la fuente de alimentación (tierra para 0; +5V para 1). Cada pin puede manejar unos 25 mA. Pero Cada puerto de 8 pines no debe exceder de los 50 mA con el regulador externo; los pines de RB0 al RB7 conforman un Puerto B de 8 BITS del PIC 16f877A como ejemplo.


----------



## mecatrodatos (Ene 24, 2010)

bien vamos con menejo de lcd con proton plus ide


> Device = 16F877
> XTAL = 4
> LCD_DTPIN = PORTD.4
> LCD_RSPIN = PORTD.2
> ...



dejo esquematico , simulacion , codigo fuente y .hex


----------



## eserock (Ene 24, 2010)

Pues gracias por esta info yo manejo pbp y estoy intentando hacer un programa para  lcd grafico y pues  empezare con el proton asi que  esto me viene como anillo al dedo


----------



## mecatrodatos (Ene 24, 2010)

bien aqui les dejo un video de lectura en modo a/d s 10 bits con proton lo pueden ver con bd player pro o windows media playaer

control de motor dc





> Device = 16F877
> XTAL = 4
> 
> Symbol IN3 = PORTA.0
> ...


 
dejo simulacion en proteus y toda las heeramiwentas para montarlo


----------



## mecatrodatos (Feb 21, 2010)

Que tal amigos anexo la primera parte del tutorial del manejo de proton de 10 partes.


----------



## mecatrodatos (Feb 22, 2010)

bien la seguynada parte del tutorial


----------



## mecatrodatos (Feb 24, 2010)

parte tres tutorial


----------



## mecatrodatos (Feb 27, 2010)

ue tal bien empezamos con proyectos con el pic 18f4550 aqui esta la 4 parte del tutorial.


----------



## mecatrodatos (Feb 28, 2010)

Bien la quinta parte del tutorial , me tomare un poco de tiempo para desarrollar la teoria y ejemplos de las partes faltantes la idea es manejar con el pic18f4550 comunicacion USB.


----------



## jann (Mar 3, 2010)

que tal  amigo muchas gracias por estos tutoriales, no me podrias hacer un ejemplo con el pic 16F88 es que la verdad ya hize unos pero en el pic simulator IDE y si lo en el simulador si lo corre perfecto pero en las conexiones no hace nada y ya me tiene arto estoy perdiendo esperanzas e batallado mucho y no me queda ojala me pudieras ayudar gracias


----------



## mecatrodatos (Mar 3, 2010)

Que programa deseas realizar ,sube lo que has hecho y veremos porque no te ando

Por otro lado la parte seis sera de manejo de teclado matixal por el puerto B por sus resistencias internas y confiigurado a otros puertos.estoy en eso


----------



## jann (Mar 3, 2010)

Ok mi amigo muchas gracias pro tu ayuda ya empeze a ver como trabaja ese programa de proton para empezar con el a trabajar despueste mando respuesta de lo que me a ayudado tu manual que estas realizando gracias, este es lo que e hecho en el PIC SIMULATOR IDE aver si me puedes hechar la mano.


```
Define LCD_BITS = 8
Define LCD_DREG = PORTA
Define LCD_DBIT = 0
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 1
Define LCD_EREG = PORTB
Define LCD_EBIT = 3
Define LCD_RWREG = PORTB
Define LCD_RWBIT = 2
Lcdinit 0
loop:
Lcdout "!!Hola!!"
WaitMs 2
Lcdcmdout LcdClear
WaitMs 2
Goto loop
```

estoy trabajando con el pic 16F88  espero tu ayuda gracias.


----------



## mecatrodatos (Mar 4, 2010)

*amigo intenta esto y me comentas:*


```
[B][I][COLOR=#17365d]AllDigital[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_LINES = 2[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_CHARS = 16[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_BITS = 8[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_DREG = RA[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_DBIT = 0[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_RSREG = RB[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_RSBIT = 1[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_EREG = RB[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_EBIT = 3[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_RWREG = RB[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Define LCD_RWBIT = 2[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Dim v1 As Byte[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Lcdinit 0[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Lcdcmdout LcdClear[/COLOR][/I][/B]
[B][I][COLOR=#17365d]loop:[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Lcdcmdout LcdLine1Home[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Lcdout "¡¡Hola!!"[/COLOR][/I][/B]
[B][I][COLOR=#17365d]WaitMs 2[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Lcdcmdout LcdClear[/COLOR][/I][/B]
[B][I][COLOR=#17365d]Goto loop[/COLOR][/I][/B]
[B][I][COLOR=#17365d]End[/COLOR][/I][/B]
```

El error en que no ande en proteus es que no se configuraron como pines digitales el puerto A y no se configuro el LCD antes del Programa Principal para recepcionar datos.lEn proton los comandos son mas faciles lo veras cuando trabajemos con los LCD y GLCD.


----------



## jann (Mar 4, 2010)

Hola amigo, este pues si funciono en el proteus y en el Pic Simulator IDE anda al 100 el problema es a la hora de ponerlo en el proto en lo fisico ahi no pasa nada con el LCD no ponen ningun mensaje... eso es lo que no entiendo se supone que si
en el proteus jala asi mismo ago conexiones en lo fisico y tendria que trabajar bien que no.

O sera que el PIC 16F88 No tiene la capacidad para encender el LCD otra es que no le pongo cristal segun yo estoy usando el cristal interno.


----------



## mecatrodatos (Mar 5, 2010)

Amigo sube el circuito y si puedes una foto del montaje debe haber un problema en el montaje asi te podre ayudar mejor.

Bien te dejo explicación sobre configuración del oscilador interno desde el programa fuente y un adjunto sobre el PIC 16f88.

CONFIGURACIÓN OSCILADOR EXTERNO EN PIC BASIC DEL  PIC 16F88

El primer paso es elegir en PIC SIMULATOR IDE, desde el menú "Opciones" -> "Select Microcontroller", el microcontrolador PIC16F88. Luego, debemos configurar los bits correspondientes. Lo destacable por ahora de esta configuración es que estamos dejando la memoria (FLASH y EEPROM) sin protección, que el pin RESET se va a comportar como I/O y que usaremos como oscilador el oscilador interno INTRC. En el caso que nos atañe utilizaremos el oscilador interno de este PIC ya que es muy completo y estable. Cuando digo completo es porque nos permite trabajar a varias frecuencias distintas entre ellas a 4Mhz y 8Mhz. Y lo mismo que para el WDT, hay que terminar de configurarlo desde nuestro código fuente.

REGISTRO PARA CONFIGURAR OSCILADOR INTERNO DEL PIC 16f88

Para configurar la frecuencia de trabajo del Oscilador Interno del  PIC 16f88 solo hay que  cambiar los bits 4, 5 y 6 del registro OSCCON. Se deben cambiar los bits que corresponden por el valor al que se quiera hacer trabajar al oscilador interno, por cierto se pueden poner en hex. O en binario (%01000110). Además se tienen que configurar los bits en Options- Configure Bits del PIC simulador ide., y poner que se va a trabajar con el oscilador interno: OSCILLATOR SELECTION: INTOSC. En documento anexo PDF esta la explicación de los Bits del registro OSCCON.

Un ejemplo de un programa de parpadeo de un led, configurando el oscilador interno.

AllDigital
OSCCON = %%01100110  'Se configura reloj interno a 4Mhz 
TRISB = 0

inicio:

PORTB.0 = 1
WaitMs 500
PORTB.0 = 0
WaitMs 500

Goto inicio


----------



## jann (Mar 5, 2010)

OK te pongo la imagen del circuito en el proteus y asi como esta es exactamente como conecte todo ya lo e revisado bien de cualquiermanera te adjuntare mas tarde la foto del circuito.


----------



## mecatrodatos (Mar 6, 2010)

Tu LCD es de 14 pines o es de 16 , lo que veo es que no conectaste un potencimetro para regular el espectro de la LCD, mira la imagen que te anexo si tiene 16 pines el 15 a Vss y el 16 con una resistencia de 10k a VDD para iluminacion de la pantalla.


----------



## jann (Mar 6, 2010)

ok mi este es de 16 los dos del final solo son para iluminar el led de la pantalla, este el potenciometro si lo coloco para regular la intencidad de las letras pero lo muevo para todos lados y no se mira nada este que otra cosa podra ser.


----------



## mecatrodatos (Mar 6, 2010)

Con que frecuencia esta trabajando el oscilador interno del pic?, postea la simulacion, .hex y codigo fuente para mirar como trabajan los registros en la simulacion.

por otro lado intenta colocando a VDD el pin MCLR del pic con una resistencia de 10K

Cambiando la configuracion de coneccion del LCD en PortB y los pines de control en PortA ( E, Rs Rw) y en el programador que estes utilizando deshabilitar las resistencias internas del puerto B, sino es el PIC KIT 2.


----------



## jann (Mar 6, 2010)

ok vere de esa manera aver si si capea.. uso el WinPic800 con el pic prog 800, 
este te mando el codigo .exe que le cargo al pic junto con el .bas  aver que puedes encontrar. gracias....


----------



## mecatrodatos (Mar 6, 2010)

Amigo configuraste el Oscilador Interno desde el software del Programador?, por ultimo añade estas linas al programa en la parte superior despues de configurar el LCD

OSCCON = %%01100110 'Se configura reloj interno a 4Mhz 
TRISB = 0
TRISA=0


----------



## jann (Mar 6, 2010)

ok este lo configure en el PIC SIMULATOR IDE en el programa del programador no encuentro nada referente al osilador interno solo le cargo el .hex y lo monto en el 
protoboard.

Muchisimas Gracias Viejon, eres atoda dar este parece que si faltaba eso no mas
con esas dos lineas que agrege trabajo al 100 y por fin me quite la espina parece que 
valio la pena tanto estar aferrado y por supuesto molestarte demasiado, que se te agradece toda tu atencion mucho,  no vivimos cerca si no te invitaba una noche de 
parranda de la emocion jajaja MUCHAS GRACIAS AMIGO!!!!!!


----------



## mecatrodatos (Mar 6, 2010)

Bien amigo estaremos en contacto para lo que necesites


----------



## jann (Mar 10, 2010)

Una pregunta mas amigo, este como saves cuando uno declara en waitms y pone 500 es igual a medio segundo verdad entonces por que yo si pongo esa cantidad puedo esperar horas y horas y no pasa nada por eemplo nunca parpadeara el led o si lo hara pero tardara mucho en cambio le pongo 1 y parpadea rapido le pongo 5 y un poco mas lento pero si pongo 1000  que se supone tiene que ser un segundo no lo hace y tarda mucho es por eso que le tengo que poner 1 o 2 o 3 cantidades pequenas para que pueda verse en lo fisico que lo aga,, alguna idea de por que sea eso...


----------



## masd (Mar 12, 2010)

Hola. Para utilizar el oscilador interno de un pic con protón utiliza este código:

Device 16F628A   ' o cualquier otro PIC
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF 

INTRC_OSC_NOCLKOUT activa el oscilador interno a su maxima frecuencia.

El resto de los "fusibles" los puedes localizar simplemente situando el cursor del ratón sobre la palabra "Config" y pulsa F1 que es la ayuda de protón y es muy, muy buena.

  WDT_ON Enable the internal Watchdog timer. 
  WDT_OFF Disable the internal Watchdog timer. 
  HS_OSC Use a High-speed crystal (Xtals over 4MHz) . 
  XT_OSC Use a standard crystal (4MHz or under). 
  LP_OSC Use a low frequency crystal (KHz range). 
  PWRTE_ON Enable power up timer. 
  PWRTE_OFF Disable power up timer.


----------



## mecatrodatos (Mar 12, 2010)

Amigo Jann para que no te pase eso debes definir el oscilador con el que trabajara el pic y su valor ya sea interno , o externo , ya que con esta frecuancia seleccionada realizara las operaciones el pic en tu caso 16f88 como siempre te invito a subir lo que realices para mirar como se te puede colaborar mejor.Por otro lado busca el la red El PROTON PLUS.

gracias por el aporte masd, podrias colocar un ejemplo aplicativo y su respetiva simulacion en proteus para todos los miembros del foro.


----------



## kabano (Mar 15, 2010)

que tal compañeros del foro , disculpas si me adelanto al preguntar esto pero podrian explicarme el como funciona la instruccion o comando* RESTORE* ? lo que pasa es que estoy pasando un programa de proton a pic basic pro.

saludos ¡!


----------



## mecatrodatos (Mar 15, 2010)

que tal creo que con lo que te explico y los ejemplo con otros comandos sabras como se utiliza el comando RESTORE

RESTORE

Restaurar el valor

Descripción general

Mueve el puntero en una tabla de datos a la posición especificada por el valor destrito

Operadores

Relación calidad - una constante, variable o expresión.
Ejemplo

DIM VAR1
 DATA 5 , 8 , "fred" , 12 
 RESTORE 
 READ VAR1  
 ' VAR1  ahora contendrá el valor 5 
 READ VAR1 
 ' VAR1 ahora contiene el valor 8 
 RESTORE 3 
 ' Puntero ahora colocado en la posición 4 en nuestro ejemplo es "r" 
 READ VAR1  
 'VAR1 ahora contiene el valor 114 es decir la 'r' carácter en decimal


La tabla de datos se define con los valores 5, 8, 102, 114, 101, 100,12 como "Fred" equivale a F: 102, I: 114, E: 101, d: 100 en decimal. El puntero de tabla es restituido de inmediato al inicio del programa. Esto no siempre es necesario, pero como regla general, es una buena idea para evitar que se desborde.  La VAR1 lee el primer elemento de los datos de la tabla e incrementa el puntero de la tabla. El próximo VAR1 Leer considera por lo tanto el segundo punto de los datos.


RESTORE 3 desplaza el puntero a la ubicación de la tabla de sesiones (primera ubicación es la posición de puntero 0) en la tabla - en este caso donde la letra «r» es. Leer VAR1 ahora recupera el equivalente decimal de «r», que es de 114.


DATA

Sintaxis 

DATA ( datos alfanuméricos ) 

Descripción general 

Coloque la información en la memoria de código utilizando la instrucción RETLW cuando se utiliza con dispositivos de 14-bit y la memoria FLASH cuando se utiliza un dispositivo de 16-bit . Para el acceso de lectura. 

Operadores 

De datos alfanuméricos - un 8,16, valor de 32 bits, o valores en coma flotante, o de cualquier carácter alfabético o cadena entre comillas. 

Ejemplo 

DIM VAR1 AS BYTE 
DATA 5, 8, "fred”, 12 
 RESTORE 
 READ VAR1   ' Variable VAR1 contiene el valor 5 
 READ VAR1   ' Variable VAR1 contiene el valor 8 
 ' Puntero se coloca en la posición 4 en la tabla de datos "r" 
 RESTORE 3 
 ' VAR1 contiene ahora el valor 114, es decir la 'r' 
 READ VAR1


La tabla de datos se define con los valores 5, 8, 102, 114, 101, 100,12 como "Fred" equivale a F: 102, I: 114, E: 101, d: 100 en decimal. El puntero de tabla es restituido de inmediato el inicio del programa. Esto no siempre es necesario, pero como regla general, es una buena idea para evitar que el contador de lectura se desborde. 

La VAR1 leyó por primera vez, toma el primer elemento de los datos de la tabla e incrementa el puntero de la tabla. El próximo VAR1 Leer considera por lo tanto el segundo punto de los datos. RESTORE 3 mueve el puntero de la tabla a la ubicación de sesiones (primera ubicación es la posición de puntero 0) en la tabla - en este caso donde la letra «r» es. Leer VAR1 ahora recupera el equivalente decimal de «r», que es de 114. 


Notas 

Las tablas de DATA deben ser colocadas al comienzo del programa. Los intentos de leer más allá del final de la tabla pueden resultar en errores y resultados imprevisibles. Sólo una instancia de DATA se permite por el programa, sin embargo, puede ser de cualquier longitud. Si el contenido de la declaración alfanumérica DATA no cabe en una sola línea, una continuación de la información adicional debe ser colocada directamente debajo, utilizando otra declaración de datos:


DATA "HELLO " 
DATA "WORLD"

Es el mismo:

DATA "HELLO WORLD"


LOOKUP


Sintaxis

Variable = LOOKUP Index , [ Constant { , Constant…etc } ]


Descripción general


Busque el valor especificado por el índice y lo almacena en la variable. Si el índice supera el valor más alto de los elementos de la lista, y luego la variable permanece sin cambios.


Operadores

Variable - una constante, una variable o expresión. Aquí es donde el valor recuperado será almacenado.
Índex - una constante o variable. Este es el número del artículo del valor a recuperar de la lista.
Constante (s) - cualquier valor de 8 bits (0-255). Un máximo de 255 valores puede ser colocado entre corchetes, 256 si se utiliza un dispositivo de núcleo de 16 bits.

Ejemplo

'Crear una animación de una línea de hilatura.

DIM INDEX as BYTE 
DIM Frame as BYTE 
CLS                                                   ' limpiar LCD 
Rotate: 
FOR INDEX = 0 TO 3                         ' Crear un bucle de  4 
Frame = LOOKUP INDEX , [ "|\-/" ]   ' Tabla de caracteres
PRINT AT 1 , 1 , Frame                     ' Mostrar en LCD
DELAYMS 200                                   ' Tiempo para ver caracteres
NEXT                                                  ' Siguiente
GOTO Rotate                                      ' Crea un Bucle Cerrado 


Notas

Comienza por el valor índice de 0. Por ejemplo, en el comando de búsqueda abajo. Si el primer valor (10) Se requiere, entonces el índice será cargado con 0 y 1 para el segundo valor (20), etc

VAR1 = LOOKUP INDEX, [10, 20 , 30 ]



READ

Sintaxis

LEA variable

Descripción general

Lea el valor siguiente de una tabla de datos y el lugar en la variable

Operadores

Variable - una variable definida por el usuario de tipo bit, byte, matriz de bytes, palabra, palabra matriz, DWORD o flotar.

Ejemplo 1


DIM VAR1 AS BYTE 
DATA 5, 8, "fred”, 12 
 RESTORE 
 READ VAR1   ' Variable VAR1 contiene el valor 5 
 READ VAR1   ' Variable VAR1 contiene el valor 8 
 RESTORE 3    ' Puntero se coloca en la posición 4 en la tabla de datos "r"
 READ VAR1     ' VAR1 contiene ahora el valor 114, es decir la 'r'


Ejemplo 2


DEVICE 16F877    
DIM CHAR AS BYTE
DIM LOOP AS BYTE
DATA "HELLO WORLD" ' Crea un cadena de texto en el código de la memoria 
CLS
FOR LOOP = 0 TO 9           ' Crea un bucle de 10
RESTORE LOOP                ' Punto de posición dentro de la declaración DATA 
READ CHAR                   ' Leer CHAR
PRINT CHAR                  ' Mostrar Valor de CHAR
NEXT
STOP



El programa anterior lee y muestra 10 valores de la declaración de datos de acompañamiento. Que resulta en "HELLO WORLD" como se muestra. Los datos no se utilizan simplemente para el almacenamiento de caracteres, también puede contener 8, 16, 32 bits, o valores en coma flotante. El siguiente ejemplo ilustra esto: 



DEVICE = 16F628DIM VAR1 AS BYTE
DIM WRD1 AS WORD
DIM DWD1 AS DWORD
DIM FLT1 AS FLOAT
DATA 123 , 1234 , 123456 , 123.456
CLS
RESTORE                          ' Ir a  la Primera ubicacion de DATA
READ VAR1                       ' Leer el valor de  8-bit 
PRINT DEC VAR1,"  " 
READ WRD1                       ' Leer el valor d e16-bit 
PRINT DEC WRD1
READ DWD1                      ' Leer el valor de 32-bit 
PRINT AT 2,1, DEC DWD1,"  "
READ FLT1                       ' Leer el valor de punto flotante 
PRINT DEC FLT1 
STOP


Ejemplos de Punto Flotante

14-Bit Ejemplo


 "14-bit de lectura de datos de punto flotante de una tabla y mostrar los resultados 



DEVICE = 16F877
DIM FLT AS FLOAT                    ' Declarar una variable de punto flotante 
DATA 3.14 , 65535.123 , 1234.5678 , -1243.456 , -3.14 , 998999.12 , 0.005
CLS                                            ' Limpiar LCD
RESTORE                                    ' Primera ubicación dentro de DATA
REPEAT                                      ' Crea un bucle
READ FLT                                   ' Lee los Datos de la tabla DATA 
PRINT AT 1 , 1 , DEC3 FLT          ' Mostrar datos Leídos
DELAYMS 1000                           ' tiempo de espera
UNTIL FLT = 0.005                      ' Para  0.005 cuando se lee
STOP 
16-bit Ejemplo

 "16-bit de lectura de datos de punto flotante de una tabla y mostrar los resultados 

DEVICE = 18F4550
DIM FLT AS FLOAT           
DATA 3.14 , 65535.123 , 1234.5678 , -1243.456 , -3.14 , 998999.12 , 0.005
CLS                        
RESTORE                    
REPEAT                      
READ FLT                   
PRINT AT 1 , 1 , DEC3 FLT   
DELAYMS 1000               
UNTIL FLT = 0.005          
STOP

Notas

Si una variable  float, DWORD o  WORD se utiliza en el comando de lectura, y luego a 32, o 16-bit (respectivamente) el valor se lee en la tabla de datos. En consecuencia, si se utiliza una variable de tamaño en bytes, y luego de 8-bits se leen. Las variables de tamaño BIT de tamaño, también leen 8-bits de la tabla, pero cualquier valor mayor que 0 es tratado como un 1. Los intentos de leer más allá del final de la tabla pueden resultar en errores y los resultados indeterminados.

El comando de lectura es un remanente de la sintaxis básica de otro tipo y ha sido sustituida por el uso de LREAD y CREAD, que ofrecen mucho más flexibilidad.


----------



## kabano (Mar 16, 2010)

excelente explicacion amigo mecatrodatos voy a implementarlo y pues de paso felicitarte por tus dos iniciativas de curso (pic basic pro y proton )y ademas con excelentes explicaciones.

ahora aprovecho para preguntar si esta bien ir aprendiendo los dos lenguajes de programacion al mismo tiempo tanto pbp y proton. puesto que voy siguiendo el de pic basic pro pero ahora tengo la intencion de tambien mirar el proton.

saludos ¡!


----------



## mecatrodatos (Mar 16, 2010)

Claro tiene tienen el mismo fundamento auque decidi abrir este hilo para comunicacion USB con el EasyHID por ello el pic que estoy utilizando en lo ejercicios de los tutoriales es el 18f4550


----------



## eserock (Mar 17, 2010)

Hola una peticion tendras algun ejemplo (no de los que vienen con el proton) sobre control de pantallas graficas, ya andube buscando alternativas y todos coinciden que en proton es  sencillo pero no compredno muy bien la forma en que esto se hace, tambien si me  puedes indicar que herramintas de software son las indicadas  para digitalizar imagnes  para estas pantallas desde ya gracias por la ayuda


----------



## mecatrodatos (Mar 17, 2010)

Bien la parte 6 del Tutorial de proton ide manejo de Telado Matrixal con el pic 18f4550 von las resistencias internas del puertoB , el siguiente numero cumplira los requerimeirnots de manejo de pantallas LCD Y GLDC con ejemplos y teoria.


----------



## kabano (Mar 17, 2010)

ok, mecatrodatos estare siguiendo los dos cursos y ya baje el tutorial de proton del 1-6 y empezar a estudiarlos¡¡¡

gracias

saludos¡¡


----------



## jann (Mar 29, 2010)

Muy buenos aporte amigo mecatrodos e estado aprendiendo mucho de tus tutoriales mas la gran ayuda que me brindaste con el LCD.


----------



## kabano (Mar 31, 2010)

buen dia, quisiera que me comenten porque no me funciona el circuito de una matriz de leds de 8x8 conectando las filas al puerto B del pic16f877A y las columnas al puerto C esto lo ago para visualizar la letra R en la pequeña matriz y con el siguiente codigo que viene comentado y pertenece al tutorial de NEO TEO "matriz de led de 8x8" y esta en proton ide.



> DEVICE = 16F877A            ' VAMOS A USAR UN PIC16F876A
> XTAL = 12                                         ' CON UN CRISTAL DE  12MHz
> 
> 
> ...


al original solo le modifique la primera y segunda linea del programa para un pic16f877A y XTAL = 12; bueno el problema que tengo es que al cargarlo al pic y poner a funcionar el circuito no me sale la letra R me salen todos ls led's de la matriz encendidos entonces le aumento tiempo de refresco a 200 mili segundos y veo que si avanzan las columnas con los 8 leds de cada una de ellas encendidos  (de la 1 a la 8) y al llegar a la columna 8 se vuelve a iniciar el ciclo for; entonces pienso que no se estan tomando los datos correspondiantes para formar la letra R que estan contenidos al inicio del programa con el comando DATA.
el circuito lo tengo conectado asi : http://www.neoteo.com/Portals/0/imagenes/cache/9B7Ax1024y768.jpg

y estos son los enlaces del tutorial de NEO TEO que consta de dos partes
parte 1 :Matriz de LED 8X8
parte 2:Matriz de LED 8X8 (Parte II)

saludos ¡¡¡


----------



## moisecito (Abr 11, 2010)

hola amigo gracias por todo, me pudieras indicar donde encontrar los manuales 7,8,9,10 atte moises coral


----------



## kabano (Abr 12, 2010)

que tal amigo moisecito, pues el amigo mecatrodatos solo ha posteado 6 partes de las 10 que consta el tutorial de proton ide y en cuanto tenga listas las demas partes estoy seguro que las compartira con nosotros que estamos siguiendo el tuto. pero con las 6 partes que ha puesto tenemos para ir estudiando un buen rato..

saludos ¡¡


----------



## tanypatricia (May 6, 2010)

hola mecatrodatos, he estado muy pendiente del tutorial y la verdad muy interesante, sabes bastante del tema. Espero me puedas ayudar.  Estoy trabajando en un proyecto que es convertir un nivel de burbuja a digital, es decir, digitalizar un nivel. ya lo tengo listo y funcionando con proton, pero ahora, necesito hacerlo en CCS. Ojala me colabores como lo haces con los otros participantes, cuando lo leas me respondes algo para enviarte el codigo q tengoy asi saber en que me puedes ayudar. Gracias.


----------



## mecatrodatos (May 8, 2010)

Que tal mira sube lo que has hecho y vere como te puedo ayudar.


----------



## tanypatricia (May 8, 2010)

Hola mecatrodatos, gracias x la atencion prestada. A continuacion subo el codigo en proton que deseo me ayudes a pasar a CCS.


```
Device 18F4523
Declare Xtal 20
Config_Start
   OSC = HS ; HS oscillator
   PWRT = OFF ; PWRT disabled
   BOREN = OFF ; Brown-out Reset disabled in hardware and software
   WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   LVP = OFF ; Disabled
   Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

                                                                     
'ADCON2.7 = 1
PortB_Pullups = 1
Declare Adin_Res 12      ' 10-bit result required
Declare Adin_Tad 32_FOSC     ' Set the ADC's clock source
Declare Adin_Stime 50       ' Allow 50us sample time

Declare LCD_Type 0          ' Type of LCD Used is Alpha
Declare LCD_DTPin PORTD.4   ' The control bits B4,B5,B6,B7
Declare LCD_RSPin PORTD.2  ' RS pin on B2
Declare LCD_ENPin PORTD.3   ' E pin on B3
Declare LCD_Interface 4     ' Interface method is 4 bit


  CCP1_Pin = PORTC.2   
   CCP2_Pin = PORTC.1   
Dim ADC_Loops As Word
Dim Temp As Word
Dim port As Byte
Dim incremento As Float
 Dim      ADC_Result1   As Word
 Dim      ADC_Result3   As Word
ADCON1 = %11001011          ' Set all to analogue inputs (PORTA)
TRISA = $FF ' Declare porta as all inputs
 TRISB = $FF
DelayMS 150

 
  TRISD.0=0
  PORTD.0=0

Dim Result1 As Float
Dim Result3 As Float
 Dim      ADC_Total1    As Float
  Dim      ADC_Total3    As Float
Dim Last_Result1 As Float
Dim Last_Result3 As Float
 
 Dim ax As Float
 Dim az As Float
 Dim inclina As Float 
Dim inclinamm As Float 
Dim inclinammPf As Float
Dim diferencia As Word

Dim mp1 As Byte
Dim brillo As Byte
 incremento=0.1
 ADC_Result1=0
  ADC_Result3=0
  brillo=0
  inclinammPf =0
  
ADC_Loops =800
Print $FE,1
 mp1=0
Print $FE,$40,$07,$05,$07,$00,$00,$00,$00,$00 ' Custom character for Degree
  


MenuP:
 incremento=0.1
     'PORTd.0 =0
 Print $FE,1
  Print At 1, 1, "Menu P"
 
  
  If mp1=1 Then
  Print At 2, 1, "Contrast"
  End If
  If mp1=2 Then
   Print At 2, 1, "Pos. F"
       End If
       
         If mp1=3   Then
   Print At 2, 1, "Inc A"
       End If
       
       If PORTB=254 Then
            If mp1>1 Then
            mp1=mp1-1
           
            Else
            
            mp1=3
            End If
             DelayMS 600
       End If
       
       If PORTB=251 Then
              If mp1<3 Then
            mp1=mp1+1
           
            Else
           
            mp1=1
            End If
             DelayMS 600
       End If
       
       
         If PORTB=253 Then
              If mp1=1 Then
               DelayMS 200
            GoTo menubrillo
           
             End If
              If mp1=2 Then
            DelayMS 200
            GoTo menuPosfinal
            
             End If
           
            If mp1=3 Then
            DelayMS 200
            GoTo menuPosActual
            
             End If
              
       End If
       
     DelayMS 50
     GoTo MenuP


menubrillo:

Print $FE,1
   Print At 1, 1, "C.Contraste"
        Print At 2,1, Dec brillo
        
         If PORTB=254 Then
            If brillo>1 Then
            brillo=brillo-3
           
            Else
            
            brillo=0
            End If
             DelayMS 400
       End If
       
       If PORTB=251 Then
              If brillo<30 Then
            brillo=brillo+3
           
            Else
           
            brillo=30
            End If
             DelayMS 400
       End If
         HPWM 1,brillo,1000
            DelayMS 100
            
           If PORTB=253 Then
            mp1=0
            DelayMS 100
           GoTo MenuP
           End If
           
         
            GoTo menubrillo

menuPosfinal:
        
        
      If PORTB=254 Then
            If inclinammPf >-88.8889 Then
            inclinammPf=inclinammPf-incremento
              
            Else
            
            inclinammPf=-88.8889 
            End If
             DelayMS 100
       End If
       
       If PORTB=251 Then
              If inclinammPf < 1600 Then
            inclinammPf=inclinammPf+incremento
           
            Else
           
            inclinammPf=1600
            End If
             DelayMS 100
       End If
              
              
        ' HPWM 2,inclinammPf,1000
            DelayMS 100
            
           If PORTB=253 Then
            mp1=0
            DelayMS 100
            GoTo MenuP
           End If
           
             If PORTB=250 Then
                If incremento < 100 Then
                incremento=incremento *10
                DelayMS 300
                    Else
                    incremento=0.1
                     DelayMS 300
                    End If
           End If
           
            Print $FE,1
   Print At 1, 1, "Ingr Pos"
     Print At 2, 1, Dec1  inclinammPf, " Mils"      
           
           
      GoTo menuPosfinal
menuPosActual:

 'GoTo menup

 ADC_Total1 = 0 ' Clear summing register
  ADC_Total3 = 0 
  ' Loop for a pre-determined number of times
  For Temp = 1 To ADC_Loops
    ADC_Result1 = ADIn 1      ' Grab a new ADC value
  
    ADC_Total1 = ADC_Total1 + ADC_Result1 ' Sum it to the total register
    DelayUS 2                         ' Allow internal capacitors to discharge
    
    ADC_Result3 = ADIn 3      ' Grab a new ADC value
     ADC_Total3 = ADC_Total3 + ADC_Result3 ' Sum it to the total register
    DelayUS 2     
  Next Temp
 
  ' Determin the average of all the equations
  ADC_Result1 = ADC_Total1 / ADC_Loops
    ADC_Result3 = ADC_Total3 / ADC_Loops

 

Result1 = ADC_Result1 *( 5.07/ 1023)            ' Scale it to volts
Result3 = ADC_Result3 *( 5.07/ 1023)       

 ax= (Result1 - 0.03)/0.8
   az= (Result3 - 0.03)/0.8

  inclina= ATan (ax/az)
  inclina=inclina * 57.2957795 *4.20023
  inclina= 232.666 -  inclina
    
 If inclina>-7 And inclina <92 Then   
 
     If inclina >= 0  Then
       inclina=inclina
       
       inclinamm=inclina*17.7778
       
     Else
        inclina=inclina*1.506
         inclinamm=inclina*17.7778
     End If

If Last_Result1 <>  inclina Then         ' Check if value has changed
   ' Print At 1, 1, Dec2  inclina,0, " "   ' If it has, display new data
      Print At 1, 1, Dec1  inclinamm," mils "   ' If it has, display new data
       Print At 2, 1, Dec1 inclinammPf," mils "
    Last_Result1 = inclina             ' and update last value
EndIf
 
 Else
  Print At 1, 1, "fuera de rang" 
  End If
 
 
'If Last_Result3  <> az Then         ' Check if value has changed
  '  Print At 2, 1, Dec4 az, " Z"   ' If it has, display new data
  '  Last_Result3 = az             ' and update last value
'EndIf

 If PORTB=253 Then
            mp1=0
            DelayMS 50
           GoTo MenuP
           End If
 
 diferencia=  inclinammPf -inclinamm
 
 If diferencia =0  Then
 HPWM 2,255,1000
 Else
 HPWM 2,0,1000
 End If
 
GoTo menuPosActual
```


----------



## lu2is (May 9, 2010)

Hola que tal.
Voy a comprar el PIC16F628A en la tienda Steren y segun en la descripcion de esa tienda (http://www.steren.com.mx/catalogo/interior3.asp?pdto=PIC16F628A-I/P) dice que el reloj interno de este pic corre a 20 MHz ¿Es correcto esto?
Ademas, si uso el PROTON IDE tendría que declarar XTAL = 20 si voy a usar el reloj interno o solo es necesario cuando se usa un reloj externo ?

gracias y saludos.


----------



## ChristopherBiomedical (Jul 22, 2010)

Gracias mecatrodatos por estos tutoriales, el mundo necesita gente asi


----------



## wiloinge (Ago 13, 2010)

Muy buena informacion gracias por su ayuda


----------



## Tata14 (Ago 31, 2010)

Muy buena toda esta información.
Gracias!!!


----------



## mecatrodatos (Sep 3, 2010)

Gracias por los comentarios. 

Bien amigos he terminado el tutorial lo subiré cuando arregle el computador y pase algunos artículos a PDF. Esta hasta la comunicación USB HID, paciencia por favor.


----------



## Tata14 (Sep 3, 2010)

Hola muchachos...
Me podrían ayudar con el LCD Chr Generator...tenía la versión 2.0.0.5 del Proton IDE pero a la hora de correr el generador de caractéres me salía un error de ActiveX q no lo dejaba ejecutar y ya no sé como arreglarlo. Tengo Windows 7 y actualmente el Proton IDE 1.0.0.1.

Gracias!!


----------



## mecatrodatos (Sep 3, 2010)

La versión de proton que tienes es la de prueba o es full puesto que en la carpeta de plugins esta incorporado el GLCD, LCD CHR Genrator, Mister E E-Z SPBRG Calculator, calculadora, Serial Communicator,y el EasyHID Wizard.

En el caso en que no los tengas busca en la red y adjuntalos en la carpeta de PLugin de tu versión de proton hay versiones libres de estas ayudas o ubica el proton portable.


----------



## Tata14 (Sep 3, 2010)

Ya los puse en la carpeta de plugins y nada.. 
Voy a tratar de bajar otra versión...pero me late q es este w7 el q molesta :s


----------



## mecatrodatos (Sep 4, 2010)

Ubica el proton portable de 32 bits es versión USB y viene con todo lo almacenas en tu memoria y corre en cualquier equipo , es lo mismo que el proteus portable , el ccs compiler y otros mas, te correrán bien en Windows 7.


----------



## Tata14 (Sep 9, 2010)

Hola... Ya lo he buscado y nada :s

Chicos a lo mejor alguno me pueda ayudar con programita que estoy haciendo. Consiste en mostrar un mensaje en movimiento en una LCD (de derecha a izquierda), el problem es que con un mensaje mayor a 16 caractéres pues este se queda corto y por ende no se muestra toda la información. Este prog lo hice en Assembler y sirvió pero no me dá con Basic :s

Este es el código:


```
DEVICE 16F877A

XTAL = 4

'CONFIGURACIÓN LCD:

LCD_DTPIN = PORTD.4        'Usado para interface de 4 líneas (líneas de datos) y deben ser conectadas  desde RD4 hasta RD7
LCD_RSPIN = PORTC.4       'RS al pin RB4
LCD_ENPIN = PORTC.6       'E al pin RB6
LCD_INTERFACE = 4         'Serán utilizadas 4 líneas de datos
lcd_lines = 2             'LCD de 2 líneas
LCD_TYPE = 0              'Indica que el tipo de LCD es numérica
ALL_DIGITAL = TRUE

dim P AS byte                'P = posición del dato
dim L as byte             'L = línea donde se úbica el dato

INICIO:

L = 1                     'Se sitúa el cursor en la linea 1 de la LCD
FOR P = 16 TO 1 step -1   'Este ciclo permite el moviento de derecha a izquierda, por eso se va dedrementadndo un paso
cls                       'Limpiar LCD
CURSOR L,P                'Se sitúa el cursor en las coordenadas L,P
PRINT "Electronica y Telecomunicaciones" 
DELAYMS 100
NEXT                      'Regresar al ciclo For
GOTO INICIO
```


----------



## Luis_speed (Sep 13, 2010)

Les adjunto un manual super resumido pero bueno pa aprender , un ejercicio 
y en esta direccion 

http://www.unrobotica.com/usbcon.htm

como  crear un control HID con el 18f4550


----------



## mecatrodatos (Sep 13, 2010)

Cordial saludo mi amiga tata con lo hecho por ti te doy la idea para el funcionamiento de desplazamiento de mensaje según tu requerimiento te recomiendo realizarlo de esta manera por otro lado recuerda que el valor del mensaje se justifica con for si por ejemplo deseas desplazar "foros de electrónica ", deberás contar las letras y espacios es decir en este caso son 20 caracteres y se colocaría For index: 20 to 0, por otro lado coloca siempre el conexionado en un solo puerto o combinado con el  Puerto E , yo utilizo en B para el  16f877A y asi utizar los beneficios de los puertos restantes,  no pude contestar antes ya que estoy muy ocupado con la universidad :


```
Device 16F877A

XTAL = 4

'CONFIGURACIÓN LCD:

LCD_DTPIN = PORTD.4        'Usado para interface de 4 líneas (líneas de datos) y deben ser conectadas  desde RD4 hasta RD7
LCD_RSPIN = PORTC.4       'RS al pin RB4
LCD_ENPIN = PORTC.6       'E al pin RB6
LCD_INTERFACE = 4         'Serán utilizadas 4 líneas de datos
LCD_LINES = 2             'LCD de 2 líneas
LCD_TYPE = 0              'Indica que el tipo de LCD es numérica
ALL_DIGITAL = TRUE

Dim index As Byte
Symbol SCRRIGHT = 28
Main: 
Print $fe,1
Print At 1,1, "Electronica y Telecomunicaciones" 
DelayMS 2000

GoSub Scroll_Derecha
DelayMS 1000
GoTo Main

Scroll_Derecha:
For index= 0 To 32            
Print $FE,SCRRIGHT
DelayMS 300
Next
Return
```

muchas gracias amigo Luis_speed por el aporte y bienvenido al foro


----------



## Tata14 (Sep 13, 2010)

Muchas gracias gracias Mecatrodatos!!! 

Aún me falta estudiar más el Basic pq en la U aprendimos fue Ass jeje.. y hay cosas q me enredan un poquito. 

Gracias


----------



## undreck (Oct 16, 2010)

hola como estan? es para ver quien me hace el favor de prestarme el instalador de pronton quiero aprender en ese lenguaje


----------



## Tata14 (Oct 16, 2010)

Holaaa ... creo no se puede adjuntar el instalador de Proton por aquí pq el tamaño excede lo permitído pero lo puedes ubicar en internet, te recomiendo Taringa.


----------



## atricio (Oct 17, 2010)

hola amigos como estan un favor alguien sabe como usar el bootloader de los micros 18f2550 y el 18f4550 en PROTON IDE he leido un poco sobre esto y segun mire se puede cargar al micro por esta herramienta un nuevo programa sin necesidad de un grabador es verdad eso o no????? les agradezco la ayuda desde ya muchas gracias


----------



## ByAxel (Oct 17, 2010)

atricio dijo:


> hola amigos como estan un favor alguien sabe como usar el bootloader de los micros 18f2550 y el 18f4550 en PROTON IDE he leido un poco sobre esto y segun mire se puede cargar al micro por esta herramienta un nuevo programa sin necesidad de un grabador es verdad eso o no????? les agradezco la ayuda desde ya muchas gracias



Que tal.
Dos opciones...

> Usando el Loader del Proton IDE, pero este requiere un pequeño circuito que se conecta a puerto serie de la PC, también es usado para depurar el programa el circuito. Para eso requiere que se grabe un programa antes de hacerlo que se encuentra en la carpeta de instalación "C:\Program Files\ProtonIDE\MCLoader\LoaderHEX"; ahi verás todos los *.HEX para cada PIC.

> Usando el Bootloader de Microchip, los programas se graban directo al PIC18F2550/4550 por medio de su módulo USB; igualmente se requiere grabar antes con el firmware que hace el trabajo. Bootloader P18.

saludos.


----------



## atricio (Oct 22, 2010)

muchas gracias por la respuesta quiere decir que si puedo re programar un micro controlador sin necesidad del programador sin problema o me equivoco. me explicas un poco 
1.- debo grabar el bootloader en el 18F2550
2.- conectar el circuito a la pc
3.- usar el proton para re programar

asi cambio el programa sin necesidad de el programador o me equivoco


----------



## ByAxel (Oct 23, 2010)

Si, una ves grabado el Bootloader se puede grabar, re-grabar el PIC por el USB con el programa que quieras sin usar el grabador...

1.- Si...; usa un grabador para eso, una vez grabado ya no necesitas del grabador...
2.- Si...
3.- No...; el bootloader de microchip requiere de su propio programa; mira que aquí lo explica mejor HID Bootloader.

El proton, como antes mencioné tiene un Loader pero necesariamente requiere de un circuito conectado al puerto serie para programar al PIC No usa el USB.

Y al usar el bootloader necesitas escribir "Declare PROTON_START_ADDRESS = $1000" en el Proton ya que el firmware del bootloader se aloja en la parte baja de la memoria de programa.

saludos.


----------



## frobangro (Oct 28, 2010)

estimados amigos queria hacerle una pregunta  

es sobre el bootloader evolupic 16f88 , el cual se encuentra en esta pagina 

http://www.scribd.com/doc/37858565/pic16f88

como es posible que el 16f88 se auto programe si este no posee instrucciones en ensamblador que permitan modificar la memoria de programa  

estare agradecido a sus respuestas 

muchas gracias


----------



## ByAxel (Oct 28, 2010)

Creo que te falto leer un poco más; dice:

_Gracias a la posibilidad del microcontrolador 16F88 de autoprogramar su memoria FLASH, elEVOLUPICBootloader 16F88 no necesita del hardware de programación ICSP, usado por su antecesor el EVOLUPIC 16F628 lo cual simplifica considerablemente su electrónica y permite, a través del firmwareBootloader *(precargado de fábrica)*, programar el 16F88, vía un cable serial DB9-DB9, ó cualquier cable de interfaz USB-DB9, mediante un software que se ejecuta en la PC_

saludos.


----------



## atricio (Oct 28, 2010)

disculpen la ignorancia alguien de ustedes ha armado el circuito para poder usar el bootloader del los micros por usb y usarlo con proton le intento entender pero no le hallo solucion pudieran pasarme esa informacion y sacarme esta duda muy grande de una vez muchas gracias de ante mano


----------



## ByAxel (Oct 29, 2010)

atricio dijo:


> disculpen la ignorancia alguien de ustedes ha armado el circuito para poder usar el bootloader del los micros por usb y usarlo con proton le intento entender pero no le hallo solucion pudieran pasarme esa informacion y sacarme esta duda muy grande de una vez muchas gracias de ante mano



El proton no puede grabar por USB.

Si buscas grabar/depurar desde el Proton, el tiene un Loader que es por el puerto serie, tiene la capacidad de depurar el programa en circuito (debugger):

Para que este funcione, antes necesitas grabar un programa en el PIC que lo encuentras en la carpeta que antes mencioné. La info lo encuentras en el archivo de ayuda del programa.

----------------
Bootloader por USB, hay varios en la web pero todos se basan en el de microchip; el hardware debe tener lo mínimo para que funcione el USB y un pulsador que seleccione entre el modo Bootloader (para grabar el firmware) y el modo normal (cuando funciona el firmware) como se ve en el circuito.

Ojo que este método también requiere que se grabe el firmware bootloader el el PIC, luego ya lo podrás conectar directamente a la PC sin inconvenientes de driver ya que este es HID.

Luego para grabar el firmware a probar se hace por medio de un programa que envié los datos por USB al PIC.

En la web vas a ver varias formas pero básicamente es el mismo ya que el código del programa es libre. El programa detecta automáticamente al PIC cuando lo conectas por el USB (el pulsador de Boot debe estar presionado para que entre en el modo Boot).

Por último cabe recordar que el bootloader ocupa la memoria desde 0000H hasta 1000H, entonces en el proton se debe poner la dirección de inicio del programa para que el compilador "compile" el firmware desde la dirección 1000H; pones al inicio de todo:
*Declare PROTON_START_ADDRESS = $1000*.

-----------------
- Abres el programa que graba por USB.
- Reinicias o conectas el PIC al USB con el pulsador (Boot) presionado.
- El programa lo debe reconocer; cargas el HEX.
- Grabas el HEX.
- Reinicias al PIC sin presionar el botón (Boot) haciendo que vaya directamente a ejecutar el firmware que se grabó.

-----------------
Importante: El firmware bootloader trabaja por defecto para el PIC18F4550, tiene el pulsador de Boot asociado al pin RB4. Para modificar el PIC y la ubicación del pulsador 'Boot' se debe editar el firmware del bootloader (requiere conocimientos del lenguaje C) y compilar el firmware en el C18 de microchip.

-----------------
Es todo, lo que no he buscado es un programa bootloader que haya sido hecho en el entorno del Proton o PicBasic para que pueda ser modificado por los usuarios que usen el lenguaje Basic; creo que debes de buscar eso o aprender un poco de lenguaje C para modificar el bootloader.

saludos.


----------



## atricio (Oct 30, 2010)

muchas gracias ahora si me quedo un poco mas claro ahora una pequeña duda en la pagina de microchip descargo el bootloader y tambien el programa o debo hacerlo con el bootloader que esta asociado el programa de grabacion


----------



## ByAxel (Oct 30, 2010)

El bootloader de microchip es parte de una colección de librerías (USB/TCPIP/Wifi/etc...) que necesariamente tienes que bajar todo el paquete para usar el bootloader.
Aqui: Microchip Application Libraries.
Luego de instalar el paquete lo encuentras en *C:\Microchip Solutions*, en la carpeta *USB Device - Bootloaders* >> *HID - Bootloader*. Adentro está el programa *HIDBootLoader* que graba al PIC por usb y en el resto de carpetas encuentras el firmware del PIC con USB que quieres usar.
En caso de usar el PIC18F4550, este ya tiene el firmware compilado y es el archivo *USB Device - HID - HID Bootloader - C18 - PIC18F4550.hex* pero para otros PICs compatibles a este, debes de editar el programa que se encuentra en la carpeta *HID Bootloader - Firmware for PIC18 Non-J Devices*;... aclaro que debes de tener el compilador C18 Full + MPLAB para poder compilar el programa.

Es mucho problema para un usuario de Basic, te sugiero buscar en la web el firmware booloader que ya esté compilado para el PIC que uses.

O también me puedes decir que PIC vas a usar y donde vas a poner el pulsador de boot para que yo lo compile y subo el HEX.

saludos.


----------



## atricio (Oct 31, 2010)

muchas gracias voy a usar el 18F2550 te lo agradeceria mucho y el pulsador de reset lo pondria en RC7 
y tambien si pudes me podrias decirme como poder compilarlos y donde busco lo que necesito para conocer un poquito mas si es posible claro esta muchas gracias por la ayuda


----------



## ByAxel (Oct 31, 2010)

Bueno falto más especificaciones pero lo preparé así:
- Oscilador externo de 20Mhz.
- Pulsador de boot en RC7; igual al esquema que puse anteriormente (entra al modo boot cuando el pulsador está presionado).
- Led que indica actividad del boot en RB7.

Pasos:
1) Grabas el firmware *HID Bootloader PIC18 Non J.hex* en el PIC con otro programador.
2) Colocas al PIC en la placa de aplicación.
3) Conectas el cable USB o reinicias al PIC pero teniendo presionado el pulsador para que el PIC entre en el modo Boot. Aquí la primera vez el sistema te debe avisar que se a detectado un nuevo dispositivo "Instalando el driver" o algo así; esperas a que termine "Instalado satisfactoriamente" o algo así y listo.
4) Puedes soltar el pulsador que solo es necesario al momento de conectar el cable USB o luego del reset del PIC.
5) Abres el programa *HIDBootLoader* (si ya está abierto, este reconoce si el PIC se a conectado o desconectado); este debe indicar que a reconocido al dispositivo. Al reconocerlo se habilitan los botones "Open Hex File", Program/Verifi, etc...
6) Luego de grabar el firmware de prueba por medio del bootloader se puede usar el botón "Reset Device" del programa que reiniciará al PIC y sin presionar el pulsador de boot para que vaya a ejecutar directamente el firmware de prueba.
7) Cada vez que quieras grabar otro firmware por medio del bootloader debes repetir los pasos desde el punto (3).


----------



## atricio (Nov 3, 2010)

hola amigo gracias por la mano ahorita lo probe lo que me pusiste me reconoce la actividad del boot pero al momento de tratar de grabarle no se que pasa pero se me queda como colgado y no hace nada se queda ahi que podria ser ???? sera porque uso windows 7


----------



## ByAxel (Nov 3, 2010)

- Lo tengo en el Win7 sin problemas, intenta correr el programa en modo compatibilidad o como administrador.
- Otra cosa es el hardware, intenta que no sea en protoboard y si lo es, te aseguras que no se mueva nada o falsos contactos que hacen que el PIC se reinicie y el soft pierda el control.
- También el MCLR con una resistencia a pull-up (V+), en condensador del USB (importante, puede ser de 470nF) y el cristal más sus condensadores.
- Y en el proton "Declare PROTON_START_ADDRESS = $1000", de lo contrario estará sobre-escribiendo el código del bootloader.


----------



## atricio (Nov 4, 2010)

Pues en lugar de un capacitor de 47nf le puse uno de 47uf en el VUSB me parece que fuera eso la resistencia se le puse y lo del proton le puse este codigo

```
Device 18F2550
XTAL 20

Declare PROTON_START_ADDRESS = $1000.

TRISB=%0000000

inicio:

High PORTB.1
DelayMS 200
Low PORTB.1

GoTo inicio
```

muchas gracias por la ayuda que me brindas


----------



## ByAxel (Nov 4, 2010)

El el código le falta un DelayMs 200 debajo de Low... de otro modo el PB1 siempre se va a ver encendido y no parpadeará, en realidad si pero Low solo se mantiene durante menos de 1us.


----------



## atricio (Nov 4, 2010)

tienes muchas razon gracias por la correcion dejame probarle y te aviso a una pregunta asi esta bien para que el firmware se pueda grabar por usb o me falta algo???????


----------



## ferrarif40gt (Nov 9, 2010)

Hola a todos, ahora estoy terminando de implementar un circuito y estoy dando mis primeros pasos en BASIC. Yo logre hacer un Datalogger de eventos, registrando fecha y hora que me entrega el DS1307. Todo guardandose en una EEPROM. Ahora necesito guardarlo en una memoria SD o MicroSD o bien en una USB, para esto me he encontrado estos desarrollos: http://www.ghielectronics.com/product/102  He estado leyendo al respecto, pero me encuentro un poco atorado o bien confundido. Podria alguien ayudarme con un pedazo de codigo que me de una idea de como ingresar datos usando esta tarjetita (que utiliza protocolo I2C) o mas informacion o ejemplos de como utilizar el protocolo I2C en BASIC. Gracias por la orientacion al respecto. Salu2. (Utilizo PROTON IDE)


----------



## ByAxel (Nov 9, 2010)

Que tal.
Las tarjetas SD o MicroSD usan el bus de datos SPI, no el I2C.
En proton, una foma fácil es usando la instrucción SHIN (revisa la sintaxis en la ayuda del proton) pero todo el protocolo para controlar las memorias SD las debes hacer manualmente. Otra es usando una librería externa llamada SD_File_System que la bajas del sitio oficial como plugin pero solo funciona para los PIC18 (incluye ejemplos).

saludos


----------



## ferrarif40gt (Nov 9, 2010)

Amigo estoy un poco confundido, en el manual de dicho dispositivo (uALFAT MicroSD Board), leyendole un poco veo que si acepta manejarlo por protocolo I2C. Ojala alguien haya usado este dispositivo anteriormente o pueda darme un idea de su uso. Gracias. Salu2


----------



## ByAxel (Nov 9, 2010)

En ese caso entendí mal, lo que quieres es controlar dicho circuido, no es verdad? ahora que veo el manual soporta ambos y el protocolo I2C no es complicado e incluso te da un ejemplo en C.

En su ejemplo, una lectura simple:

```
char Get_I2C_Data_lowlevel()
{
    I2C_Start();
    I2C_Write(ADDRESS+1); // read from 0xA4
    c = I2C_Read();
    I2C_Stop();
    return c;
}
```

En proton te sugiero usar el módulo I2C del PIC para que todo se controle vía hardware...
La velocidad máxima de clock es de 400Khz y la dirección de acceso es 0xA4


```
DECLARE HBUS_BITRATE 400
dim addr as $A4
dim var as char
...

HBSTART
HBUSOUT  addr + 1 ' Para leer
var = HBUSIN ' Obtiene el dato
HBSTOP
return
```

Pero los mismos ejemplos que incluye proton no usan estas instrucciones ya que lo hacen directamente sobre los registros del módulo I2C (le das un vistazo) y lo de leer o escribir en FAT ya creo que debes de experimentar; los comandos están en el resto del manual.

Algo más:
Proton Example Code


----------



## atricio (Nov 11, 2010)

hola buenas noches otra vez por aqui una curiosidad quiero usar el 16F873A como configuro el ADC para este micro intente mostrarlo en un LCD esta bien si lo pongo asi


```
Device 16F873A

XTAL 4

Declare ADIN_RES 10        ' 10-bit result required                 Utilizado para adc
Declare ADIN_TAD 32_FOSC       ' RC OSC chosen                         Utilizado para adc
Declare ADIN_STIME 50      ' Allow 50us sample time                Utilizado para adc
    
LCD_DTPIN = PORTB.0	' RUTINA PARA VISUALIZAR EN EL LCD PARA LA MEDICION
LCD_RSPIN = PORTB.4
LCD_ENPIN = PORTB.5
LCD_INTERFACE = 4	' 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0
LCD_COMMANDUS = 2000
LCD_DATAUS = 50

Dim VLM35 As Float
Dim CONT As Word
Dim SUM As Float

TRISB=%00000000
TRISA=%11111111
ADCON1=%10001001 

INICIO:

VLM= ADIn 1

DelayMS 100

Print $FE , $80, Dec VLM35
Print $FE , $C0, Dec VLM35

Cls

GoTo INICIO
```


----------



## viczea2002 (Nov 14, 2010)

Estimados Colegas:
Tengo un codigo desarrollado con PROTON 1.0.0.1, y estoy intentado compilar sin embargo no logro mi proposito ya que al darle la orden de compilar el programa me arroja el siguiente mensaje:  
ASM ERROR : Error [173] Source file path exceeds 62 characters
ASM ERROR : ASSEMBLER ERRORS.HEX file not Created

Por lo que solicito ayuda, si alguien me puede ayudar que les agradecere.

Un abrazo a todos.


----------



## moisecito (Nov 14, 2010)

tienes que crear una carpeta donde guardes los  archivos por ejemplo croton y listo


----------



## viczea2002 (Nov 14, 2010)

Gracias colega, hice como indicas, pero continua el mismo problema (Ruta de origen del archivo supera 62 caracteres)

Gracias.


----------



## atricio (Nov 15, 2010)

hola amigo mira lo que sucede es que tienes la direccion del archivo del micro que vas a usar muy grande por ejemplo si los haces correr desde mis dicumentos.
anda al disco duro que sea el que uses como raiz o al que lo tienes dedicado para memoria crea una carpeta que tenga un nombre corto no vasa colocar por ejemplo: PRENDIDO Y APAGADO DE UN LED CON RETARDO Y AUTO FANTASTICO eso mas los otros caracteres de ley se hacen mas de 62 procura hacer eso y cerciorate que los estas grabando en .bas


----------



## DEPREDADORX1 (Nov 20, 2010)

Que tal y como vamos,

Estoy empezando con proton y me parece super bueno Ok. utilizo el Amicus ya que es gratis aunque es solo para el pic18f25k20, que parece un pic muy completo aunque apenas empiezo a leer.
Aquí como leer un keypad 4x3 en lcd.
	
	



```
' LECTURA DE UN TECLADO 4x3 EN UN LCD

[php]
'Device = 18F25K20
'Xtal = 4
Optimiser_Level = 3            
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.0
LCD_ENPin = PORTB.1
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0


Symbol fila1 = PORTC.0
Symbol fila2 = PORTC.1
Symbol fila3 = PORTC.2
Symbol fila4 = PORTC.3
Symbol COLUMNA1 = PORTC.4
Symbol COLUMNA2 = PORTC.5
Symbol COLUMNA3 = PORTC.6
 
Dim boton As Byte
TRISC =%01110000

TRISB = 0
 boton=0
LECTURA:

    Call teclado
    If boton=10 Then LECTURA
    If boton=11 Then boton=0
    If boton=12 Then LECTURA
    Print At 1,1,Dec boton
    GoTo LECTURA
End
 
 teclado:
 boton=0 
 fila1=0
 If COLUMNA1=0 Then boton=1
 If COLUMNA2=0 Then boton=2
 If COLUMNA3=0 Then boton=3
 fila1=1
 fila2=0
 If COLUMNA1=0 Then boton=4
 If COLUMNA2=0 Then boton=5
 If COLUMNA3=0 Then boton=6
 fila2=1
 fila3=0
 If COLUMNA1=0 Then boton=7
 If COLUMNA2=0 Then boton=8
 If COLUMNA3=0 Then boton=9
 fila3=1
 fila4=0
 If COLUMNA1=0 Then boton=10
 If COLUMNA2=0 Then boton=11
 If COLUMNA3=0 Then boton=12
 fila4=1
 DelayMS 20 
 Return
 [/php]
```


----------



## DEPREDADORX1 (Nov 22, 2010)

Aquí de nuevo,

El siguiente codigo permite comparar 4 numeros digitados con los almacenados en memoria, como no he podido conseguir el Proton y utilizo el Amicus, se deben configurar algunos datos como los fuses.

```
' LECTURA DE UN TECLADO 4x3 EN UN LCD

'Device = 18F25K20
'Xtal = 4
Optimiser_Level = 3            
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.0
LCD_ENPin = PORTB.1
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0

'*****FILAS Y COLUMNAS***
Symbol fila1 = PORTC.0
Symbol fila2 = PORTC.1
Symbol fila3 = PORTC.2
Symbol fila4 = PORTC.3
Symbol COLUMNA1 = PORTC.4
Symbol COLUMNA2 = PORTC.5
Symbol COLUMNA3 = PORTC.6
'**** VARIABLES ******* 
Dim I           As Byte 
Dim Flag        As Byte   
Dim boton       As Byte
Dim CAPTURA[4]  As Byte     'Este arreglo es para capturar los valores pulsados en el teclado
Dim LEER[4]     As Byte     'Este arreglo es para guardar los valores previamente almacenados en memoria
Dim SALUDO[11]  As Byte     'Este arreglo es para el mensaje de bienvenida o el que ustedes deseen
Dim CONTADOR    As Byte
Dim INDEX       As Byte 
Dim Frame       As Byte 
Dim ABC         As Byte              


TRISC =%01110000          'Se declaran como salidas los pines 4,5,6 correspondientes a las columnas 
 TRISB=0                  'Puerto B se deja como salida
 
EWrite 0,[5,6,7,8]        'Guarda en la memoria los numeros 5678


 GoSub MENSAJE

 INICIO:
 CONTADOR=0
 LECTURA:
    Call teclado
    If boton=0  Then LECTURA
    If boton=10 Then LECTURA
    If boton=11 Then boton=0
    If boton=12 Then LECTURA
    Cls
    Print At 1,1,"Digite: ",Dec boton
    DelayMS 30
    CAPTURA[CONTADOR]=boton              'Guarda el valor pulsado en CAPTURA que es un arreglo de 4 bytes
    CONTADOR=CONTADOR+1                  'Se encarga de aumentar la posición donde capturamos el número pulsado
    If CONTADOR=4 Then                   'Cuando se pulsan 4 digitos muestra el mensaje de memoria llena
    Print At 1,1, "VERIFICANDO..."
    DelayMS 400
    GoSub MOSTRAR 
    Else
    GoTo LECTURA
    EndIf
    GoTo INICIO
 End
 
 MOSTRAR:
  For I= 0 To 3 Step 1                      'Aquí tenemos un ciclo que nos permite leer de la memoria los datos
   LEER[I]=ERead I                          'y almacenarlos el la variable LEER, que es un arreglo de 4 bytes
  Next I                                    
   
    Cls
    For I=0 To 3
    Print  Dec CAPTURA[I]                    'Aquí mostramos los cuatro dígitos capturados por teclado
    Next I
    DelayMS 300
    Cls
  
    For I=0 To 3
    Print Dec LEER[I]                        'Aquí mostramos los dígitos grabados en la memoria
    Next I
    DelayMS 300
    
    Flag=1
    For I=0 To 3
    If CAPTURA[I]<>LEER[I] Then Flag=0
    Next I
    Cls
    If Flag=1 Then  
    Print "Iguales"
    Else
    Print "Diferentes"
    EndIf
   Return
   
 MENSAJE:
 Cls

 Print At 1,1, "Bienvenido"
 Print $FE, $C0,"Digite y compare"

 SALUDO [0]  = "B"         
 SALUDO [1]  = "I"         
 SALUDO [2]  = "E"
 SALUDO [4]  = "N"
 SALUDO [5]  = "V" 
 SALUDO [6]  = "E"
 SALUDO [7]  = "N"
 SALUDO [8]  = "I"
 SALUDO [9]  = "D"
 SALUDO [10] = "O"

 'CLS                                
'ROTACION: 
' FOR INDEX = 0 TO 11                 
'   Frame = LOOKUP INDEX , ["BIENVENIDOS"]
'  PRINT AT 1 , 1 , Frame           
'  DELAYMS 200                      
' NEXT                                                
 Return

 
 teclado:
 boton=0 
 fila1=0
 If COLUMNA1=0 Then boton=1
 If COLUMNA2=0 Then boton=2
 If COLUMNA3=0 Then boton=3
 fila1=1
 fila2=0
 If COLUMNA1=0 Then boton=4
 If COLUMNA2=0 Then boton=5
 If COLUMNA3=0 Then boton=6
 fila2=1
 fila3=0
 If COLUMNA1=0 Then boton=7
 If COLUMNA2=0 Then boton=8
 If COLUMNA3=0 Then boton=9
 fila3=1
 fila4=0
 If COLUMNA1=0 Then boton=10
 If COLUMNA2=0 Then boton=11
 If COLUMNA3=0 Then boton=12
 fila4=1
 DelayMS 20 
 Return
```


----------



## chapin (Nov 22, 2010)

proton tiene la instruccion inkey con la que te ahorrarias un monton de lineas


----------



## DEPREDADORX1 (Nov 22, 2010)

Ok,Chapin, la verdad no  he practicado con inkey aun, si tienes un ejemplo que puedas publicar, te lo agradecería pues quiero hacer una alarma sencilla para ponerla en el foro.


----------



## chapin (Nov 25, 2010)

DEPREDADORX1

Seria algo asi:


```
Xtal 4
TRISB = 00000000
TRISA = 00000000

All_Digital = TRUE    

Declare Keypad_Port PORTB
PortB_Pullups = On
Declare LCD_Type  = 0       ;LCD is Alpha
Declare LCD_DTPin = PORTA.0 ;LCD data line starting port.pin
Declare LCD_ENPin = PORTA.7 ;LCD EN line
Declare LCD_RSPin = PORTA.4 ;LCD RS line
Declare LCD_Interface = 4   ;LCD 4 line interface
Declare LCD_Lines = 2       

Dim tecla As Byte  
Dim var1 As Byte

Cls

inicio:
 
DelayMS 500
var1 = InKey '0 1 2   4 5 6   8 9 10 12  13 14   'leido de teclado
tecla = LookUp   var1, [1,2,3,0,4,5,6,0,7,8,9,0,10,11,12]
                                                     
                                                     
                                                     
Print At 1,1,  Dec tecla                                      
DelayMS 2000 
Cls                                        
GoTo inicio
```


----------



## DEPREDADORX1 (Nov 26, 2010)

Gracias Chapin por el dato, uhm...  pos le he dado pero no se cual sea el error, aqui publico para ver si es posible, sin animo de abusar claro, que alguno de nuestros expert echen un empujon a ver cual es el error.


----------



## DEPREDADORX1 (Nov 28, 2010)

Aquí yo,

Me corrijo, para el pic16f877A me funcionó la lectura eliminando la conexión de las resistencias a las columnas del teclado, no he probado en físico por lo que no estoy seguro si sea correcto, pero la simulación corre bien.


----------



## viczea2002 (Nov 28, 2010)

Colegas como estan ya solucione mi problema gracias al colega  ATRICIO, a quien le  agradesco un monton.

Saludos


----------



## DEPREDADORX1 (Nov 29, 2010)

Venga!!! aquí estamos otra vez,

El siguiente código es la versión clásica de la clave de acceso vista en pic basic pro, ahora en proton, no he agregado el cambio de clave, eso para alguien interesado.  El siguiente código, si no estoy errando, sirve para calcular los kilometros x hora, eso sí, tomando en cuenta el metraje de cada llanta, supongo que el calculo funciona, pero acepto cualquier comentario al respecto de los compas.


```
'CLAVE DE ACCESO CON PROTON

 Device = 16F877A
 Xtal = 4

 All_Digital=true
 Keypad_Port PORTB
 PortB_Pullups true

 Declare LCD_Type = 0         ;LCD is Alpha
 Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
 Declare LCD_ENPin = PORTD.1  ;LCD EN line
 Declare LCD_RSPin = PORTD.0  ;LCD RS line
 Declare LCD_Interface = 4    ;LCD 4 line interface
 Declare LCD_Lines = 2

Print Cls
Dim I    As Byte
Dim x    As Byte
Dim y    As Byte
Dim CONT      As Byte
Dim flag      As Byte
Dim numero[4] As Byte
Dim LEER[4]   As Byte
Dim SALIDA As PORTC.0

EWrite 0,[5,6,7,8]        'Guarda en la memoria los numeros 5678

INICIO:
Print Cls
Low SALIDA
CONT=0
GoSub MENSAJE

TECLEAR:
x=InKey
x= LookUp x, [1,2,3,255,4,5,6,255,7,8,9,255,"*",0,"#",255,255]
If x <> 255 Then
Print At 2,1+CONT, "*"
DelayMS 400
numero[CONT]=x
CONT=CONT+1
EndIf
If CONT=4 Then 
GoSub COMPARAR_CLAVE
Else
GoTo TECLEAR
EndIf 
 GoTo INICIO
 
COMPARAR_CLAVE:
flag=1
Print Cls
Print At 1,1,"A Ingresado:"
For I=0 To 3
 Print Dec numero[I]
 Next
 DelayMS 1000
 Print Cls
 
For I= 0 To 3                      
 LEER[I]=ERead I                         
 Next I              


For I=0 To 3
 If numero[I]<>LEER[I] Then flag=0
 Next I
 Print Cls
 If flag=1 Then 
 Print "CLAVE CORRECTA"
 DelayMS 1500
 High SALIDA
 DelayMS 1000
 Low SALIDA
 Else
 Print "CLAVE INCORRECTA"
 DelayMS 1600
EndIf
Return


MENSAJE:
Print At 1,1, "Digite la clave "
Return
```



> Device = 16F628A
> Xtal = 4
> LCD_DTPin = PORTB.4
> LCD_RSPin = PORTB.1
> ...


----------



## atricio (Nov 29, 2010)

gracias alguien me podria ayudar como debo configurar el 16F628A para usarlo con oscilador externo porque quisiera usarlo para hacer un seguidor de linea y si tienen un ejemplito de un seguidor no tan complejo les agradeceria mucho


----------



## DEPREDADORX1 (Nov 29, 2010)

Hola atricio,

Aunque yo todavia no he llevado nada al protoboard con proton, creo que la configuración es tan sencilla como la que muestro en los ejemplitos anteriores. 
Device = 16F628A
Xtal = 4               ;  cristal externo de 4 MHZ

Si lo que quieres configurar son los fuses, es decir, el watchdog, protección, etc, ya te tocaría echar mano de algun tuto, de cualquier forma te anexo el que tengo, en ingles, por si acaso te parece para leer.


----------



## ByAxel (Nov 29, 2010)

Buen manual; como dato, el Proton tiene un plugin llamado "Fuse Configurator" que es una manera fácil de configurar los fuses que genera un código para el PIC16F628A con oscilador externo tipo XT:

```
Config BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_OFF, WDT_OFF, LVP_OFF, MCLRE_ON, XT_OSC
```
PIC Fuse Configurator (Ver 1.2.2.4)

saludos


----------



## DEPREDADORX1 (Nov 29, 2010)

Ah, claro, Excelente....

Como tengo la version 2.0.4 no puedo instalar ese plugin, será después, también recordé que existe otro complemento que me parece muy bueno, es el proton Header, este permite además de configurar los fuses, realizar todo el encabezado del programa segun nuestras necesidades, agregar la configuración para lcd, activar pull up internas, timer, I2c.


----------



## atricio (Nov 30, 2010)

gracias por la ayuda axel una maquina tus aportes pero me ensenarias a usarlo por favor  depredadorx1 puedes colocar el plugin para checarlo y ver como va


----------



## DEPREDADORX1 (Dic 1, 2010)

Hola Axel,

Buscalo en google que te sale enseguida, no tiene perdida, si no lo consigues entonces ahi si te lo puedo pasar, claro, si no hay problemas con las normas del foro, la verdad no sé.

Suerte!


----------



## ByAxel (Dic 1, 2010)

Si *DEPREDADORX1*, ya lo encontré gracias.

*atricio*, luego de instalarlo debe aparecer en "View > PlugIn > JGB Tools > Fuse configurator"; tan solo debes de declarar el PIC que vas a usar con Device, luego ejecutas el Fuse Configurator e inmediatamente te aparecen los fuses del PIC respectivo, seleccionas lo que quieres, luego clic en el botón "Finish" y aceptas... lo que hace es pegar el código de los fuses en la hoja actual de tu programa y lo pone justo donde se queda el cursor; por eso antes de usar "Finish" ubica el cursor debajo de Device.

saludos


----------



## atricio (Dic 1, 2010)

muchas gracias amigo intentando lastimosamente tengo una version incompatible para usar este plugin


----------



## DEPREDADORX1 (Dic 2, 2010)

Hola Atricio,

La versión de proton header que yo conseguí no necesita instalarse como plugin sino que funciona como una aplicación normal en el escritorio.


----------



## atricio (Dic 2, 2010)

ahi si me fregaste no te entiendo que me dices me pudes decir donde conseguiste esa version del proton y a pluggins me referia al complemento que coloco axel para los fuses del 16F628A


----------



## DEPREDADORX1 (Dic 3, 2010)

Busca en la pagina de sonsivri, está todo, yo no sé dónde metí el instalador, supongo que la versión que tengo está tocada o algo así pues tiene su propio acceso directo y abre como programa independiente, revisa en esa página y verás que encuentras el programa.


----------



## atricio (Dic 5, 2010)

hola amigo encontre este instaldor pero la verdad no se como hacerlo andar bien sera ques el que tu encontraste me puedes ayudar a hacerlo andar bien

http//www********com

*Como no cumplo las políticas del Foro me editaron el mensaje @ políticas del Foro.Com*​


----------



## DEPREDADORX1 (Dic 5, 2010)

Hola atricio, ese es el que hay. checa la siguiente dirección donde también está y te lo explican en spanish, eso sí, todo me ando bien en xp, en el windows 7 no supe.
http//www********com

Suerte con eso!


*Como no cumplo las políticas del Foro me editaron el mensaje @ políticas del Foro.Com*


----------



## ByAxel (Dic 5, 2010)

En la pagina oficial encuentran las versiones del compilador 3.5.0.4 (es la que tengo para Win7) y vi que hay otro más actual en http://www.protonbasic.com

saludos.


----------



## DEPREDADORX1 (Dic 5, 2010)

Gracias por la colaboración,

Bueno, ahora publico un código básico para usar el desborde del timer0 para calcular 1 segundo aprox. usando el  16f877, me parece interesante aunque aun no lo entiendo perfectamente, supongo que podría utilizarse para calcular un tiempo determinado para hacer por ejemplo, el envío de datos de una variable como temperatura, presión, etc, durante x tiempo. quedo atento a sus comentarios.



> Device = 16F877A               ; Chosen Picmicro
> DEFINE OSC 4                   ; utilizando un oscilador de 4 MHz
> 
> '**********Establezca la opción de registro************************
> ...


----------



## carptroya (Dic 10, 2010)

Hola a todos.

Estoy realizando el siguiente proyecto.

Barco cebador controlado por pic.

Como de programación no tenía ni idea (ahora tampoco mucha), empecé con niple. 
Los resultados fueron:
Adc
pwm
usart.
Con lo cual ya controlaba el barco por rf con los xbee.

Ahora empiezo con proton y creo que ya controlo algo este compilador.

Dejo simulación en proteus de adc y pwm con lcd para visualizar datos.
Me gustaría que lo mirasen y me dijeran que tal lo veis.

Lo siguiente en aprender seria comunicación por usart y i2c, por lo tanto si alguno se apunta que explique algo.

gracias


----------



## aleiov (Dic 11, 2010)

hola gente saben que paso con mecatrodatos, dejamos en el tutorial 6, o subio alguno mas, hace tiempo que no lo veo....


----------



## DEPREDADORX1 (Dic 11, 2010)

Hasta el momento no ha vuelto a subir nada, yo también estoy atento a ver si publica pues me interesa el manejo de pantallas graficas, entre otros temas. En fin, toca seguir esperando pero parece que andan bien ocupados y no que no será pronto su visita aqui.

Saludos.


----------



## aleiov (Dic 12, 2010)

bueno seguiremos esperandoooo saludos a a todos..


----------



## felolive (Dic 13, 2010)

HOla Compañeros como estan... Yo soy nuevo en el foro.. les ruego que me ayuden. Lo que necesito saber es como realizar una modulación y demodulación utilizando el pic16f877a en proton. mil gracias. att Felipe Chuncha


----------



## mecatrodatos (Dic 17, 2010)

Bien amigos aquí esta el primer segmento de la parte 7 del tutorial de Proton ide (7.1) manejo de pantallas LCD mañana subire el 7.2 de GLCD todo por el contenido que no me lo dejo subir en un solo documento, felices fiestas para todos.


----------



## aleiov (Dic 17, 2010)

Holaa mecatrodatos  ya subiste la parte 6, porque me quede en la 5....saludos.que sigan los exitos....

aaaaaaa perdon ya lo encontre la parte 6 que sigaan, estan exelentes los tutos, saludos....


----------



## DEPREDADORX1 (Dic 18, 2010)

Muchas gracias Mecatrodatos,

Excelente material, muy ilustrativo y didáctico.


----------



## aleiov (Dic 18, 2010)

Si la verdsad muchas gracias Mecatrodatos el material es exelentisimo, que sigan los exitos...saludos desde argentina


----------



## atricio (Dic 19, 2010)

muchas gracias por el aporte una maquina mecatrodatos...talvez para usted y los demas amigos del grupo hay alguien que pueda explicar un tanto como configurar la comunicacion serial desde el proton se los agradeceria mucho


----------



## chapin (Dic 20, 2010)

buenisimo Mecatrodatos gracias por tus aportes como siempre excelentes, gracias.


----------



## carptroya (Dic 23, 2010)

Hola a todos.

Mecatrodatos, muy bien el tutorial.

Atricio , en el adjunto , te dejo simulación en proteus de comunicación por usart de dos 876.
En el cual estoy utilizando ADC ,PWM,LCD y USART.
Esta simulado y probado en real , por lo tanto funciona, espero que te sea de utilidad.

Feliz navidad a todos


----------



## atricio (Dic 24, 2010)

oye muchas gracias tengo que mirarlo para inentar aprender algo muchas gracias


----------



## pipo12 (Dic 25, 2010)

hola que tal amigos les cuento que llevo mas de 1 año trabajando con proton IDE y es de lo mejor en la actualidad trabajo con Glcd samsung y toshiba y han respondido muy bien, hay un par de cosas que aun no he logrado con ellas pero estoy seguro que mas adelante lo lograre que rico encontrar este foro y sobretodo encontrar gente de Colombia, bueno amigos en unos días voy ha postear unos ejemplitos para el manejo de las Glcds felices Pascuas.....


----------



## chapin (Dic 26, 2010)

bien pipo12 estaremos atentos


----------



## atricio (Dic 28, 2010)

si estaremos atentos saludos y felices fiestas a todos


----------



## masd (Ene 7, 2011)

Hola a todos.
pipo12 que modelo de Glcd Toshiba has probado? t6963? Lo pregunto por que tengo una pantalla de estas y no consigo comunicarme bien con un pic + proton. No sé si Mecatrodatos incorporará ejemplos de esta pantalla gráfica en su , magnífico, tutorial que esta haciendo.
Un saludo a todos...


----------



## DEPREDADORX1 (Feb 18, 2011)

Saludos aqui nuevamente, parece que el foro se quedó muerto....
de todas formas me gustaría saber si alguien ha hecho un diseño para controlar un motor brushless ya que me gustaría adaptarle uno a mi bicicleta pero por motivos de presupuesto no he podido hacerme al comercial pues es caro, he visto alguna información sobre el motor que es entendible, pero respecto al control, sigo muy confundido y agradecería cualquier orientación respecto al tema. Adjunto algo que encotré en la red, me parece que le falta mucho en programación pues lo ideal sería un control pid para manejar bien las variables de velocidad-torque y viceversa.

Como siempre, mil y mas gracias


----------



## carptroya (Feb 19, 2011)

Dejo video de lo expuesto en el #120 de este mismo hilo.

Veréis un barco cebador controlado por pic.





 
Saludos


----------



## DEPREDADORX1 (Feb 19, 2011)

Muy divertido lo del bote, no es difícil controlar 2 motores con modulos rf genericos pues logré hacerlos funcionar, lo que no sé es si se puedan controlar al mismo tiempo con la programación en basic, para este caso sería uno para el impulsor y otro para la dirección, bueno, al menos eso creo.


----------



## carptroya (Feb 20, 2011)

Claro, que sí. Aunque en este proyecto para cambiar dirección utilizo las rpm de cada motor.

saludos


----------



## DEPREDADORX1 (Feb 20, 2011)

Si... que bien, me gustaría saber cómo, si eso te parece bien, claro, yo controlé unos pap pero, segun mi código, no podía pulsar para activar ambos al mismo tiempo porq se manejaba con una condición If, como no supe hacerle, desistí de armar un carrito rc pues perdía calidad en el trabajo.


----------



## carptroya (Feb 21, 2011)

en el #120 hay un archivo rar , en el se encuentra la simulacion en proteus juntos con los hex. tanto del emisor como receptor y por supuesto los codigo fuente.


saludos


----------



## DEPREDADORX1 (Feb 22, 2011)

Ah... super bueno,  lo chequearé pues me interesa... muchas gracias por tu ayuda.

Sí, es cierto, no lo había checado, ahora pretendo construir mi rc basandome en dicha información.
Suerte!


----------



## carptroya (Feb 22, 2011)

el proyecto lo estoy desarrollando en esta dire, para cualquier consulta que tengas




https://www.forosdeelectronica.com/f19/barco-rc-controlado-pic-19646/



Saludos


----------



## Amaro Pargo (Feb 26, 2011)

ByAxel dijo:


> Bueno falto más especificaciones pero lo preparé así:
> - Oscilador externo de 20Mhz.
> - Pulsador de boot en RC7; igual al esquema que puse anteriormente (entra al modo boot cuando el pulsador está presionado).
> - Led que indica actividad del boot en RB7.
> ...


 
Hola ByAxel, tengo realizada una entrenadora para un 18F2550 con un pulsador para boot en RC7 y un led indicador de actividad para el boot también en RC6. No logro modificar y compilar el programa bootloader para adaptarlo a esta configuración. ¿serías tan amable de realizar esta pequeña modificación en el firmware? Tan solo se trataría de cambiar el led de RB7 a RC6 ya que el resto de la configuración es la que tengo (20 Mhz, Pulsador de boot en RC7). Muchas gracias anticpadas


----------



## mecatrodatos (Feb 26, 2011)

Mira aquí http://www.neoteo.com/-19871-bootloader-para-18f2550-entrenador-neoteo/pg-2.neo, si después de leer como se realiza no entiendes con gusto realizaremos algunos ejemplos , por otro lado pido un poco de paciencia ya que el ordenador donde tenia el tuto se me ha dañado he tenido que realizar la travesía de desarrollarar el contenido faltante del tutorial de nuevo me ha llevado tiempo.


----------



## DEPREDADORX1 (Feb 27, 2011)

Saludos...

Estamos expectantes al siguiente tuto de mecatrodatos para el manejo de pantallas glcd, he encontrado un proyecto muy interesante que me gustaría abordar mas adelante, dejo el enlace para que chequen y vean que se ve muy bueno.
http://www.ivica-novakovic.from.hr/MotorCycle Computer Board with Nokia6280 lcd-eng.htm


----------



## CHR (Mar 8, 2011)

hola con todos tengo dudas de como usar las instrucciones *while---wend*, si me podrian explicar algo de como usar me seria de mucha ayuda.
gracias por la ayuda de antemano


----------



## DEPREDADORX1 (Mar 9, 2011)

Hola CHR,

Puedes mirar este corto video que de seguro te va a aclarar cualquier duda.


----------



## CHR (Mar 9, 2011)

gracias por el video muy explicativo me aclaro muchas dudas.
Tengo ahora un problema, paso el programa al pic, hice la simulación de mi programa en proteus y esta bien.
LO armo en el proto y cuando alimento al circuito no funciona nada, no se por que.
Aaa.. por cierto el circuito hace papadear un led y cuando pulso un pulsante hace parpadear otro led.
disculpen las molestias y de nuevo gracias por la ayuda de antemano.
Adjunto la simulación en proteus y los archivos .HEX y .bas

no se alguien porfa podria subir un tutorial de como grabar la programación que haces en el pic creo que esa es la parte donde estoy fallando. gracias de antemano


----------



## atricio (Mar 9, 2011)

puedo ayudarte en algo cuentame como grabas el micro no soy un experto pero ojala te pueda ayudar


----------



## CHR (Mar 9, 2011)

bueno... abro el programador que es el PICKIT2, busco el archivo .HEX y listo pongo en write y se graba la programación en el pic.


----------



## atricio (Mar 9, 2011)

si esa misma es la manera que creo que todos lo hacemos que micro andas usando mira que esten configurados bien los fuses del micro por ejemplo que si usas cristal u oscilador externo este configurado, que no hay otra configuracion activada que el micro al momento que lo grabas no te de ningun error seria bueno que lo mandes a verificar, adicionalmente puedes probar con un montaje basico y una configuracion muy sencilla tambien se me ocurre prender y apagar un led con un pulsador o algo por el estilo asi descartas que sea tu montaje en el proto adicionalmente te pudes dar cuenta que es lo que estas realizando mal en el soft tambein debes tener en cuenta que en el proteus los tiempos con la realidad varian puede ser que en el proteus lo mires pero en la realidad esta muy rapido talvez le hace falta una pausa intenta revisar esto y sino postea el programa en el foro para darte una mano....por ahora no tengo a la mano el proteus ya que toca hacer el respaldo de cada semestre entonces comprenderas porque no te hecho una mano de mejor manera


----------



## DEPREDADORX1 (Mar 10, 2011)

Pues ya todo lo ha dicho atricio,

cambia las pausas por 1000 ms (1 segundo) para que puedas ver cambios. Te recomiendo lo más básico para que tengas la certeza que tanto el pic como el quemador estan funcionando.

Device 16F628A 
Xtal=4
Symbol LED=PORTA.0

CMCON=7   ; todo las salidas digitales
TRISA=0   ; todo el puerto A como salida

INICIO:
High LED
DelayMS 1000
Low LED
DelayMS 1000
GoTo INICIO


----------



## CHR (Mar 10, 2011)

gracias por su ayuda voy a intentarlo de nuevo... cualquier cosa os estaré molestando de nuevo

Buscando en internet encontre un plugin que se llama Fuse configurator dicen que para usarlo necesitas tener una versión menor a la 3.3.0.5, yo tengo la versión 3.2.2.5, y se instala pero cuando voy a usarlo me sale un error access violation at address 00403F68 in module "Proton.ex".Read of address 00000044.
de aqui baje el plugin http://wiki.picbasic.org/index.php?n=Plugins.FuseConfigurator
 No se que hacer si me podrian ayudar les estaría muy agradecido


----------



## DEPREDADORX1 (Mar 11, 2011)

Hola CHR,

Yo tengo el mismo quemador y el mismo pic, acabo de probarlo  y me funcionó bien, el problema son los fuses efectivamente. Cuando trabajes con este pic siempre toma en cuenta que tiene oscilador interno, cuando pases al pic16f877A ya será otro cuento. Suerte!


Device 16F628A 
Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_Off,BODEN_OFF,LVP_OFF,MCLRE_OFF
Xtal=4
Symbol LED PORTB.0 ;nombre del pin 6

inicio:           
 High LED    
 DelayMS 1000
 Low LED   
 DelayMS 1000
 GoTo inicio 
End


----------



## haifer (Mar 12, 2011)

Me gustaría que se retomara el tutorial sobre el manejo del puerto USB usando Protón ID ya que he estado buscando información y estoy muy confundido no sé si alguien pueda ayudarme con este problemita, pues ya he hecho proyectos usando el puerto serial, pero quiero hacer algo con el puerto USB.

De antemano muchas gracias


----------



## atricio (Mar 15, 2011)

si me dices especificamente que es lo que quieres hacer talvez te pueda hechar una mano si no soy yo talvez los demas compañeros del foro si


----------



## haifer (Mar 15, 2011)

atricio dijo:


> si me dices especificamente que es lo que quieres hacer talvez te pueda hechar una mano si no soy yo talvez los demas compañeros del foro si



Bunas noches atiricio, gracias por responder mi petición, lo que tengo pensado hacer es una comunicación entre un micro controlador y labview. Pues ya he hecho comunicaciones seriales usando esta plataforma para mis proyectos pero quisiera esta vez usar  el puerto USB. Por este motivo estoy empeñado en aprender pero usando el Protón, yo he visto que hay otro foro que habla sobre este tema pero con CCS, y a mi criterio me parece que los códigos son más extensos, y como vengo de programar en ensamblador  no quiero caer en lo mismo. Básicamente quisiera lograr una comunicación USB con mi PC y luego veré como lo podre comunicar con labview, si alguien pudiese ayudarme le estaría muy agradecido.
Yo encontré esta paina donde hacen un proyecto usando el puerto pero  la parte de la configuración del cristal no me funciona  al compilar lo en protón.
http://sites.google.com/site/proyectosroboticos/encoder/pic-encoder-usb

En el momento esta es mi más fuerte referencia.  

De antemano muchas gracias.


----------



## Gerson strauss (Mar 15, 2011)

Deberias utilizar el Easy HID USB Wizard de proton, es un asistente que te ayudara a crear las rutinas para la comunicacion USB con la PC.


----------



## haifer (Mar 15, 2011)

Gerson strauss dijo:


> Deberias utilizar el Easy HID USB Wizard de proton, es un asistente que te ayudara a crear las rutinas para la comunicacion USB con la PC.



Realmente soy muy nuevo con el uso de este programa  y no se si me prodrias explicar de que Como puedo utilizarlo ya que no tengo conocimiento.

De ante mano muchas gracias.


----------



## atricio (Mar 16, 2011)

mira mi amigo te recomiendo que busques un poco de info sobre el easy hid wizard no es complicado de usarlo y sobre el vi en labview deberias investigar como hacer las conexiones con el visa del labview se que hay formas de hacerlo emulando el puerto serie para lograrlo eso no lo he hecho mira por lo pronto en este mismo foro coloque un pantallaso del vi que use yo mira si te sirve eso y que no mas quieres realizar de tareas en el labview yo tambien ando en esas con un plc haber si nos hechamos la mano para sacar a delante con los demas companeros tu proyecto y nos vamos sacando dudas sobre el tema que es muy extenso por el sin numero de aplicaciones que se pude lograr


----------



## haifer (Mar 17, 2011)

atricio dijo:


> mira mi amigo te recomiendo que busques un poco de info sobre el easy hid wizard no es complicado de usarlo y sobre el vi en labview deberias investigar como hacer las conexiones con el visa del labview se que hay formas de hacerlo emulando el puerto serie para lograrlo eso no lo he hecho mira por lo pronto en este mismo foro coloque un pantallaso del vi que use yo mira si te sirve eso y que no mas quieres realizar de tareas en el labview yo tambien ando en esas con un plc haber si nos hechamos la mano para sacar a delante con los demas companeros tu proyecto y nos vamos sacando dudas sobre el tema que es muy extenso por el sin numero de aplicaciones que se pude lograr



OK, voy a hacer algunos montajes y experimentos con la información que tengo y les comento como me va.....

De antemano muchas gracias por cualquier informacion suministrada sobre el tema...


----------



## atricio (Mar 18, 2011)

busca en el 4shared un amigo subio el tutorial muy bueno que hicimos para esto de la comunicacion con proton es un video paso a paso ojala te sirva


----------



## haifer (Mar 18, 2011)

atricio dijo:


> busca en el 4shared un amigo subio el tutorial muy bueno que hicimos para esto de la comunicacion con proton es un video paso a paso ojala te sirva




Muchas gracias no tienes el link del tutorial, el día de ayer encontré este tutorial creado por un argentino (Mario Sacco) y en mi criterio está muy completo comprendí cosas del EasyHID USB Wizard, que no sabía, pero aun no he podido hacer ningún montaje debido a que entre semana trabajo en una empresa y salgo a estudiar en la noche me toca esperar siempre los fines de semana.

Este es el link

http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb


----------



## atricio (Mar 18, 2011)

lo mire esta bastante bien explicado te va muy bien asi comenze yo dejame le pido a mi amigo la direccion de donde lo puso y te lo paso


----------



## alatac (Mar 19, 2011)

Buenas a todos

He comprado el Amicus18 para apreder algo sobre programación de pic y en concreto del 
18F25K20

ya he conseguido enceder leds mediante los ejemplos del manual, pero estoy intentando dormir el micro con el ejemplo


Symbol LED = RA0
Again:
High LED ' Turn LED on.
DelayMS 1000 ' Wait 1 second.
Low LED ' Turn LED off.
Sleep 60 ' Sleep for 1 minute.
GoTo Again


me da un error de watchdog, y como no tengo ni idea alguien me puede completar el ejemplo?

muchas gracias.


----------



## atricio (Mar 19, 2011)

esta programacion no parece de proton sino mas basic como micro code o picbasic deberias leer un poco el data del micro que usas talvez por eso te da ese inconveniente


----------



## DEPREDADORX1 (Mar 19, 2011)

Pues, acabo de correrlo en Proton y no me tiro errores, si no funciona a la hora de quemarlo entonces tienes que checar la configuración de los fuses a ver que tal, hasta hay puedo porque no tengo ese pic.

Device= 18F25K20
Xtal=4

Symbol LED = PORTA.0

INICIO:
High LED ' Turn LED on.
DelayMS 1000 ' Wait 1 second.
Low LED ' Turn LED off.
Sleep 60 ' Sleep for 1 minute.
GoTo INICIO


----------



## alatac (Mar 20, 2011)

muchas gracias por dedicarme vuestro tiempo
sigo con el siguiente error

The WatchDog fuse is disabled, so the AMicus18 wil never wake up on its own

La versión del Protos es la gratuita que te puedes baja en la página de Amicus18 y es la versión 1.0.1.4


----------



## DEPREDADORX1 (Mar 21, 2011)

Uhm... seguro que configuraste los fuses, no sé porque tiene que molestar, te vendría bien una versión completa de Proton, aquí en las primeras páginas se explica, así podrías probar con otro pic como el 16f628 y así, una vez que hayas probado que funcione, entonces pasas a otro pic, eso es lo que te recomiendo si te parece bien, de cualquier forma cambia la configuración de los fuses a ver que pasa.

Toma como referencia el ejercicio que hay más arriba que está con el pic 16f628, ese no funcionaba por la configuración de los fuses, pero con esta configuración me funcionó bien.

Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_Off,BODEN_O FF,LVP_OFF,MCLRE_OFF

Config INTRC_OSC: Esta parte es para poner a trabajar el pic con el oscilador interno, no todos los pic cuentan con oscilador interno, por ej el pic16f877 no lo tiene.

WDT_OFF: Esta parte indica que el Wachdog (perro guardian) está desactivado.

También te recomendaría pasarte por el hilo de basic (pic basic pro) que está bien largo y completo, allí resolverás  seguramente, todas tus dudas.

Sigue adelante, no te desanimes, una vez que logres despegar con lo básico vas a ver como te va gustando esto.


----------



## atricio (Mar 21, 2011)

disculpen por ser perdido pero quisiera saber como poder configurar el modulo ccp1 y ccp2 de los micros para poder hacer un pwm por hadware me hecharian una mano por favor


----------



## carptroya (Mar 21, 2011)

atricio en el post 109 lo tienes , hay una adc con pwm por hardwere.

en el 120 tienes ademas con cominicacion por usrt.


saludos


----------



## atricio (Mar 21, 2011)

muchas gracias amigo me recordaba que andaban por ahi pero no ubicaba bien


----------



## alatac (Mar 22, 2011)

Gracias DEPREDADORX1

Probare lo que me dices y te cuento,  por el momento he conseguido un sensor inflarrojos Sharp 2Y0A02 me funcione, mi siguiente paso es pasar al I2C.


----------



## CHR (Mar 26, 2011)

Hola a todos de nuevo: primero quiero dar gracias a las personas que me ayudaron con el problema de los fuses de proton.
Ahora quiero pedirles que me ayuden con el siguiente problema, estoy interesado en hacer un letrero de matriz de leds, segun lo que encontre me dan ideas de como hacerlo con el pic 16F628A y un 74LS164 para el registro de desplazamiento.
Bien ahora mi problema es el siguiente, según explica la pagina de donde saque las ideas para hacer la matriz el comando ShiftLeft se utiliza para rotar los bits, es decir toma los bits uno por uno y los mando al registro de desplazamiento, pero el comando ShiftLeft no existe en el proton  entonces no se si alguien podria ayudarme con un comando o una rutina que haga lo mismo.
ante mano gracias por la ayuda, les adjunto la pagina donde encontre las ideas como hacer esta matriz:http://www.ucontrol.com.ar/Articulos/matrizled7x32/matrizLED7x32.htm


----------



## haifer (Mar 27, 2011)

Bunas tardes estoy tratando de establecer una comunicación con el puerto USB, y hasta el momento he encontrado algunos programas que funcionan pero tengo un problema con el protón, al menos eso creo, debido a que no me compila una configuración crucial para el funcionamiento del pic me saca el siguiente error, Error[113]   C:\DOCUME~1\HAIRHI~1\Config~1\TEMP\A.S 3508 : Symbol Not previously defined (CPUDIV_1_1), el codigo del programa es el siguiente:


```
Device = 18F4550  ' Usamos el PIC 18F4550, pero puedes declarar cualquiera de los 18Fxx5x.
    
    Xtal = 48         ' El PLL interno siempre ha de ser de 48MHz. (No se refiere al cristal de cuarzo)    
    
    Reminders = 1     ' Mostrar todos los avisos al compilar.
    
    @CONFIG_REQ       ; Configuración para usar un cristal de 20MHz.
           @PLL_Req   ; * Haz clic aquí para ver otras configuraciones del cristal.
               @__config config1l, PLLDIV_5_1 & CPUDIV_1_1 & USBDIV_2_1
               @__config config1h, FOSC_HSPLL_HS_1
           @WATCHDOG_REQ
               @__config config2h, WDT_OFF_2 & WDTPS_128_2
           @DEBUG_REQ        
               @__config config4l, LVP_OFF_4 & ICPRT_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4
               @__config config3h, PBADEN_OFF_3
    
    All_Digital = 1   ' Todas las entradas/salidas serán digitales.

    '-------- Configuración Encoder -----------
    Symbol INTF   = INTCON.1         ' RB0 External Interrupt Flag
    Symbol INTE   = INTCON.4         ' RB0 External Interrupt Enable
    Symbol GIE    = INTCON.7         ' Global Interrupt Enable
    Symbol INTEDG = INTCON2.6        ' Flag = 0 Flanco bajada. Flag = 1 Flanco subida.

    On_Interrupt GoTo Interrupcion   ' Interrupción por Hardware (es la más rápida).

    GIE    = 1                       ' Activa interrupciones generales.
    INTE   = 1                       ' Activa la interrupción externa RB0/INT.
    INTEDG = 1                       ' Hace que inicialmente la interrupción se dispare
                                     ' por flanco de subida.     
    Dim x As Word                    ' Variable X ---> contador de posición actual.
    
    TRISA = %11111111
    TRISB = %11111111                ' Sólo usamos las entradas RB0 y RB1 para el encoder.
    TRISC = %11111111
    TRISD = %11111111    
       
    USB_Descriptor = "CDCDESC.INC" ' Descriptor del modo CDC (Puerto COM virtual)
    
    Dim PP0    As Byte System      ' Estado del USBPOLL
    
    Dim Buffer As String * 20      ' Declaramos (sobradamente) un buffer de 20 bytes.
    
    DelayMS 500                    ' Damos tiempo para inicializarse.
    
    Clear                          ' Pone a cero toda la memoria RAM del PIC antes de comenzar.
     
    Repeat                         
          USBPoll                  ' El PIC espera hasta enlazar con el PC a través del USB.
    Until PP0 = 6

    ' --------------------------------------------------------------------------------
    
    While 1 = 1
        
        Buffer = Str$(Dec5, x)     ' Convierte X (número) en una cadena (texto) de 5 cifras en ASCII.
                                   ' Esta cadena mostrará de 00000 hasta 65535.
        Repe:
           USBOut 3, Buffer, 5, Repe ' Envía la cadena de 5 bytes (ASCII correspondiente al número)
                                   ' al PC a través del USB.
    Wend
    
    End
    
    Interrupcion:             '-------- Decodificador de Encoder --------------
       
    Context Save              ' Salva en contexto de los registros antes de operar con la interrupción.
    
    If PORTB.0 = 1    Then    ' Si RB0 se ha puesto a 1 (flanco de subida),
       INTEDG  = 0            ' entonces activar la siguiente interrupción por flanco de bajada.
       If PORTB.1 = 1 Then    ' Si RB1 está a 1,
          Inc x               ' entonces incrementar el contador X.
       EndIf
    Else                      ' Si RB0 se ha puesto a 0 (flanco de bajada),  
       INTEDG  = 1            ' entonces activar la siguiente interrupción por flanco de subida.
       If PORTB.1 = 1 Then    ' Si RB1 está 1,
          Dec x               ' entonces decrementar el contador X.
       EndIf
    EndIf
     
    INTF = 0                  ' Borra el "flag" de la interrupción RB0/Int por poder permitir la   
                              ' siguiente interrupción cuando ocurra.
    Context Restore           ' Restablece el contexto de los registros tal como estaban antes de la
                              ' interrupción.
```

Fuente:  http://sites.google.com/site/proyectosroboticos/encoder/pic-encoder-usb

El  .Hex que me entregan en esta página de este programa funciona pero el .bas de protón me saca error al compilar.

Es solo por el código de configuración del cristal de 20 Mhz, no sé si necesite librerías adicionales en el protón o hay algo que falta en este.

De antemano muchas gracias quedo atento a cualquier ayuda.


----------



## autotronico (Mar 27, 2011)

bien he compilado el código y solamente me muestra un mensaje de almacenamiento de string, por lo que la ruta de easy HID USB, la cual estas trabajando no esta especificada y por ello sale el error que comentas. por lo que se deben generar los archivos que te anexo en imagen.


----------



## haifer (Mar 27, 2011)

Disculpa mi ignorancia es que estoy trabajando por primera vez con protón y no se muchas cosas , yo solo he trabajado la programación del micro usando mplab en ensamblador. Tú me dices que tengo que especificar la ruta del easy HID USB, ya estoy tratando de hacer esto pero si me pudieses dar una mano con esto estaría muy agradecido ósea dime como en el protón direcciono esta ruta, yo estoy en el momento bajando esta aplicación pues en otros foros me lo habían recomendado aunque no sé si el protón en si ya lo tenga instalado. De hecho si tuvieses  algún programa hecho por ti con  el puerto USB que fuese bidireccional  o ejemplos muy sencillos de enviar cualquier cosa al puerto y otro de recibir, te estaría eternamente agradecido pues en el momento estoy en fase de experimentación con este tema.

De antemano muchas gracias, por ayudarme con este tema ya que estado toda la tarde tratando de solucionar este inconveniente.


----------



## autotronico (Mar 27, 2011)

bien un poco de tiempo porque estoy de salida pero realizaremos ejemplos basicos.


----------



## haifer (Mar 27, 2011)

ok tranquilo, muchas gracias, quedo a la espera entonces.


----------



## autotronico (Mar 27, 2011)

bien para empezar visita esta pagina:

http://www.unrobotica.com/usbcon.htm

Por otro lado que versión de proton utilizas y como deseas realizar la interfaz de comunicación con el pc ( Visual Basic, C , delphi, labview, o con el hiperterminal)


----------



## atricio (Mar 27, 2011)

mira en paginas anteriores yo puse un ejemplo que use para comunicarme con LABVIEW y un micro 4550 esta explicado he incluso con el vi de labview en otro lado del mismo foro ojala te sirva. ojala los demas amigos podemos hacer un proyecto he ir disipando las dudas de todos


----------



## haifer (Mar 27, 2011)

Muchas gracias autotronico, primero que todo quisiera poder poner a andar el ejemplo que no me funciona osea como hiciste para cargar el .inc  de  easy HID USB, ya que no me anda, concidencialmente la pagina que adjuntaste la estoy revisando hace una hora y comprendí muchas cosas que aun no comprendía.  La comunicación que voy a hacer es con labview, y quiciera poder encontrar un buen ejemplo al menos el programa del micro bidireccional que es lo más complicado.

Atrico yo he visto foros en esta página creo que tuyos pero con CCS no con protón no sé si me equivoque ya que estado leyendo mucho y como es tanta información puede ser que se me haya pasado, así que si me equivoco podrías hacer me el favor de poner el link donde tienes esta información para estudiarla.

Lo único que me ha funcionado hasta el momento es el ejemplo del link que ajunte pero este lastimosamente no me está  compilando satisfactoriamente solo me funciona el .hex que ya viene compilado por el creador del post  y además no es bidireccional.

Disculpen la molestia voy a seguir leyendo a ver si puedo desenredar mis dudas, pero estaría muy agradecido si alguno de ustedes me ayuda con esto.

Se me olvidaba la versión que tengo es la 2.0.0.5  del 2009
Y el compilador versión 3.4.0.8
El loader versión 2.0.0.0


De antemano muchas gracias


----------



## pipo12 (Mar 28, 2011)

hola todos bueno en dias anteriores prometi postear un par de ejemplos donde hablamos de como usar las GLCD´S no es dificil tampoco es para decir que es facil, o complicado no yo mas bien diria que es un tema apacionante de y mucho cuidado, es aqui donde comienza un nivel de programacion medio, lo digo en base a lo que ya he podido lograr y en base a lo que he visto en amigos cercanos. para empezar posteare un ejemplo de una GLCD samsung  de Ref. YM 12864 y un PIC 18F452 vamos ha ir despacio primero como hacer q funcione;


```
Include "PROTON_G4.INT"
      
'***********************************
        Adin_Res = 10                'resolucuion a 10-bit   
        ADIN_DELAY = 50              'Allow 50us sample time         
'***********************************
        TRISA = %00000001            'configura el el bit.0 del(PORTA.0) como entrada Analoga
        ADCON1 = %1001               'Set de entrada analógica en PORTA.0
'***********************************        
        Dim XPOS_START As Byte
        Dim XPOS_END As Byte
        Dim YPOS_START As Byte
        Dim YPOS_END As Byte
        Dim SET_CLR As Byte
'*********************************** 
       
        Dim DATO As Word                                                                
        Dim VOLT As Byte          
                                                    
'*********************************** 

        DelayMS 300
        Cls
                                              
        XPOS_START = 0
        YPOS_START = 0
        XPOS_END = 127
        YPOS_END = 63
        SET_CLR = 1
        Line SET_CLR , XPOS_START , YPOS_START , XPOS_END , YPOS_END
        
        Cls
        DelayMS 100 
                               
        Line 1,0,0,127,0            'Dibuja un Marco en la Glcd
        Line 1,0,63,127,63          
        Line 1,0,0,0,63             
        Line 1,127,0,127,63
        Line 1,0,30,127,30
        
        FRANK:
        DATO = ADIn 0
        VOLT = DATO * 0.0488
        Print At 2,55,Inverse 0, Dec2 VOLT,"VOLTAGE"
        GoTo FRANK  

si miran con detenimiento encontraran una fabulosa libreria que nos ayuda un monton lo demas es sentido común claro sin dejar de lado q para cada GLCD es necesario consultar su respectivo hoja de datos, porq, 1 no todas las GLCD traen el mismo orden de conexiones 2 es de gran importancia saber con q tipo de controlador vamos a trabajar si es toshiba o samsung, claro y la referncia del controlador cuenta ya q las librerias de Proton por ahora no soportan todos los tipos de controladores q hay en el mercado para samsung trabaja muy bien con el controlador KS0108 y para toshiba el t6963 con estos para las lcd monocromaticas es suficiente cabe destacar q son unos de los mas comerciales aun que vamos a encontrar otros es por eso q antes de comprar una GLCD debemos mirar el data.
En la rutina encontraremos como leer un voltage de 0 a 5vot. atravez del puerto A/D y asi mostrarlo en pantalla, tambien vamos a poder observar un marco al tamaño de la GLCD y aqui debajo les dejo lo mas importante como debe ir nuestra libreria, claro debemos ajustala a nuestras necesidades 
    Device = 18F452
    Xtal = 20

    LCD_DTPort = PORTD
    LCD_RSTPin = PORTB.3 'B.5-c1
    LCD_ENPin = PORTC.0   'B.4-E0
    LCD_RWPin = PORTB.4  'B.3-C0
    LCD_CS1Pin = PORTB.0 'B.0-E1
    LCD_CS2Pin = PORTB.1 'B.1-E2
    LCD_RSPin = PORTB.2   'B.2
    LCD_Type = GRAPHIC
    Internal_Font = On
    Font_Addr = 0

    SDA_Pin = PORTC.4
    SCL_Pin = PORTC.3

    Serial_Baud = 9600
    Rsout_Pin = PORTC.6
    Rsout_Mode = TRUE
    Rsout_Pace = 1
    Rsin_Pin = PORTC.7
    Rsin_Mode = TRUE

    Hserial_Baud = 2400                ' Set baud rate to 2400 for 4MHz XTAL
    Hserial_RCSTA = %10010000       ' Enable serial port and continuous receive
    Hserial_TXSTA = %00100000       ' Enable transmit and asynchronous mode
    Hserial_Clear = On                ' Enable Error clearing on received characters

    Keypad_Port = PORTB

    CCP1_Pin = PORTC.2
    CCP2_Pin = PORTC.1

    Symbol T300 = 3313
    Symbol N300 = 3313 + $4000
    Symbol T600 = 1646
    Symbol N600 = 1646 + $4000
    Symbol T1200 = 813
    Symbol N1200 = 813 + $4000
    Symbol T2400 = 396
    Symbol N2400 = 396 + $4000
    Symbol T4800 = 188
    Symbol N4800 = 188 + $4000
    Symbol T9600 = 84
    Symbol N9600 = 84 + $4000

    Symbol OT2400 = 396 + $8000                       ' Open True
    Symbol OT1200 = 813 + $8000                       ' Open True
    Symbol OT9600 = 84 + $8000                      ' Open True
    Symbol OT300  = 3313 + $8000                  ' Open True

    Symbol ON2400 = 396 + $4000 + $8000              ' Open Inverted
    Symbol ON1200 = 813 + $4000 + $8000              ' Open Inverted
    Symbol ON9600 = 84 + $4000 + $8000              ' Open Inverted
    Symbol ON300  = 3313 + $4000 + $8000         ' Open Inverted

' Rsout / Serial Constants
    Symbol HOME = 1
    Symbol BELL = 7
    Symbol BKSP = 8
    Symbol TAB = 9
    Symbol CR = 13

    All_Digital = TRUE    ' Set PORTA and PORTE to all digital
```


----------



## DEPREDADORX1 (Mar 29, 2011)

Que tal les va compañeros,

Gracias por el ejemplo de glcd a pipo12, mi pregunta es sencilla, para crear la libreria hay que guardar esos datos con extensión  *.txt usando la libreta o me estoy equivocando.

Suerte a mil.


----------



## pipo12 (Mar 29, 2011)

NO si usted escudriña su programa va a encontrar en los archivos .INC las librerias con las q cuenta y puede llamar segun sea su necesidad, estas estan en ASM. ya es la manera con la cual nos permite el compilador hacer muy trabajos y en poco tiempo. Hay q tener encuenta q las librerias las podemos ajustar a nuestra convenencia, claro hablo de direccionamiento de bits, y si es el caso agregar una instruccion o tambien deshabilitar....para un futuro posteare como imprimir en la GLCD varios tamaños de fuente y para finalizar vamos a ver como imprimir imagenes ya sean fijas o animadas


----------



## pipo12 (Mar 30, 2011)

no he teido oportunidad de mirar el archivo de 32 bits. pregunto ya lo probaron podemos pensar en trabajar con los dspic, bueno no entiendo como sale dicho archivo libreria o actualizacion si en Cronwill aun no se habla de ello bueno si alguien me lo puede explicar gracias


----------



## atricio (Mar 30, 2011)

si seria bueno que puedieran explicar un poquito de como tratar los Dspic con Proton


----------



## haifer (Abr 14, 2011)

Buenas, no se si alguno de ustedes haya trabajado con GLCD(LCD grafiaco), usando proton IDE pues yo he usado siempre las alfanumericas, y en uno de los manuales que se presentan en este foro hay ejemplos pero solo com paltallas alfanumericas pero para graficadoras no.

De antemano muchas gracias quedo atento.

_Buscar en Mercadolibre: MCO-17436818-lcd-display-grafico-de-64x128-pixeles-_JM_

Esta es la GLCD que quiero controlar

Lcd Grafico Display 12864 128x64 Verde Topway Lm12864bly


----------



## dabopeyton (Abr 17, 2011)

Hola necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y las dos primeras del puerto b ya que la profesora quiere que le coloque un display 7 segmento en el puerto C del pic,  y en el puerto D conectar 4 leds en los bits menos significativos. apenas me inicializo en esto es apenas mi primera practica lo veo muy complejo, ya que es apenas la primera practica y ni eh visto clase teorica estado leyendo tutorial de proton y proteus, El micro q uso es el PIC 16f877 y lo estoy programando en lenguaje basic. quientenga algo parecido o por lo menos ideas del teclado 4x4, por favor necesito ayuda de como lograrlo

Espero q me ayuden, desde ya gracias


----------



## haifer (Abr 18, 2011)

dabopeyton dijo:


> Hola necesito ayuda para programar un teclado hexadecimal pero lo quiero manejar con el puerto b y las dos primeras del puerto b ya que la profesora quiere que le coloque un display 7 segmento en el puerto C del pic,  y en el puerto D conectar 4 leds en los bits menos significativos. apenas me inicializo en esto es apenas mi primera practica lo veo muy complejo, ya que es apenas la primera practica y ni eh visto clase teorica estado leyendo tutorial de proton y proteus, El micro q uso es el PIC 16f877 y lo estoy programando en lenguaje basic. quientenga algo parecido o por lo menos ideas del teclado 4x4, por favor necesito ayuda de como lograrlo
> 
> Espero q me ayuden, desde ya gracias




Mira en este mismo foro esta la respuesta para esta inquietud, mecarodatos subio  un PDF muy util.: 

https://www.forosdeelectronica.com/f24/tutorial-manejo-proton-ide-27932/index2.html

mas sin embargo te adjunto el PDF aqui que el subio, para manejar teclados hexadecimal  usando Proton ide...

suerte....


----------



## atricio (Abr 18, 2011)

disculpen la pregunta usar el select case en proton es lo mismo para usar en pic basic o tiene diferente metodo de aplicacion


----------



## DEPREDADORX1 (Abr 19, 2011)

Hola Atricio,

Pues este ejemplo está en la ayuda, parece igual que en pic basic.


```
Dim VAR1 As Byte
 Dim RESULT As Byte

 DelayMS 300             ' Wait for PICmicro to stabilise
 Cls                     ' Clear the LCD

 RESULT = 0              ' Clear the result variable before we start
 VAR1 = 1                ' Variable to base the conditions upon
 
 Select VAR1

  Case 1                 ' Is VAR1 equal to 1 ?
   RESULT = 1            ' Load RESULT with 1 if yes

  Case 2                 ' Is VAR1 equal to 2 ?
   RESULT = 2            ' Load RESULT with 2 if yes

  Case 3                 ' Is VAR1 equal to 3 ?
   RESULT = 3            ' Load RESULT with 3 if yes

  Case Else              ' Otherwise...
   RESULT = 255          ' Load RESULT with 255

 EndSelect

 Print Dec RESULT        ' Display the result
 Stop
```


----------



## atricio (Abr 19, 2011)

lo que quiero es ver si puedo comparar el binario que me daria un puerto y irle dando los case para elborar unas pequenas rutinas para una banda transportadora por ejemplo si el puerto b me da 6 en binario me de el case 6 y mandar a hacer tareas al micro es posible esto desde proton he mirado un ejemplo muy parecido en picbasic pero no me corre y queria realizarlo mejor en proton


----------



## atricio (Abr 20, 2011)

Hola de nuevo amigos una pregunta estoy haciendo un seguidor de linea por el momento realize un codigo simple para probar toda la estructura que he planeado hacer casi un seguidor basico pero realizo pruebas despues de unas cuantas pruebas es como que el micro ya no siguiera la programacion se queda sin hacer nada que puede ser ojala me puedan hechar una mano les adjunto el codigo para ver si va el problema por el software y si es por el hadware ojala me pudieran dar algunos consejos para que no me pase esto


```
Device 16F873
XTAL 4

TRISB=%00000000
TRISC=%00011111

Symbol CN1=PORTC.0
Symbol CN2=PORTC.1
Symbol CN3=PORTC.2
Symbol CN4=PORTC.3
Symbol CN5=PORTC.4

Symbol SAL1=PORTB.0
Symbol SAL2=PORTB.1
Symbol SAL3=PORTB.2
Symbol SAL4=PORTB.3

PORTC=0
PORTB=0

' CERO  =>  VE BLANCO
' UNO =>  VE LA LINEA

INICIO:
'==================================================================================================================================
'COMPARACIONES PARA LOS SENSORES:
'==================================================================================================================================
If CN1=1 And CN2=1 Then 
'And CN3=1 And CN4=0 And CN5=0 Then

GoTo ADELANTE

End If

If CN1=0 And CN2=1 Then 
'And CN3=1 And CN4=1 And CN5=1 Then

GoTo DERECHA

End If

If CN1=1 And CN2=0 Then 
'And CN3=0 And CN4=1 And CN5=1 Then

GoTo IZQUIERDA

End If

If CN1=0 And CN2=0 Then 
'And CN3=1 And CN4=1 And CN5=1 Then

GoTo ATRAS

End If

'==================================================================================================================================
'MOTOR DERECHA  : SAL1 ; SAL2
'MOTOR IZQUIERDA: SAL3 ; SAL4
'==================================================================================================================================

'==================================================================================================================================
'RUTINAS PARA LOS MOTORES
'==================================================================================================================================
ADELANTE:

SAL1=1 : SAL2=0: SAL3=1 : SAL4=0

GoTo INICIO

ATRAS:

SAL1=0 : SAL2=1: SAL3=0 : SAL4=1

GoTo INICIO

IZQUIERDA:

SAL1=1 : SAL2=0: SAL3=1 : SAL4=1 

GoTo INICIO

DERECHA:

SAL1=1 : SAL2=1: SAL3=1 : SAL4=0 

GoTo INICIO

'==================================================================================================================================
End
'==================================================================================================================================
```


----------



## DEPREDADORX1 (Abr 21, 2011)

Hola atricio,

Pues lástima que no halla un experto por aquí para echarnos una mano con las dudas, por cierto, cómo te fue con la comparación de bits?

Sobre el seguidor de líneas te pregunto, no tienes simulación?.  Pues yo veo que corre bien, lo único que puedo decirte es que yo evito poner los retornos a inicio tanto como pueda, casi siempre me arrojan un error de sobreflujo de no se qué, por eso uso return, bueno, tendrías que probar a ver si anda. También parece que funciona asi, tendrías que probar a ver si anda:


```
INICIO:
'==================================================================================================================================
'COMPARACIONES PARA LOS SENSORES:
'==================================================================================================================================
If CN1=1 And CN2=1 Then GoSub  ADELANTE
If CN1=0 And CN2=1 Then GoSub  DERECHA
If CN1=1 And CN2=0 Then GoSub IZQUIERDA
If CN1=0 And CN2=0 Then GoSub ATRAS
 GoTo INICIO
'==================================================================================================================================
'MOTOR DERECHA  : SAL1 ; SAL2
'MOTOR IZQUIERDA: SAL3 ; SAL4
'==================================================================================================================================
'==================================================================================================================================
'RUTINAS PARA LOS MOTORES
'==================================================================================================================================
ADELANTE:
SAL1=1 : SAL2=0: SAL3=1 : SAL4=0
Return

ATRAS:
SAL1=0 : SAL2=1: SAL3=0 : SAL4=1
Return

IZQUIERDA:
SAL1=1 : SAL2=0: SAL3=1 : SAL4=1 
Return

DERECHA:
SAL1=1 : SAL2=1: SAL3=1 : SAL4=0 
Return

'==================================================================================================================================
End
'=========
```


----------



## mecatrodatos (Abr 22, 2011)

cordial saludo amigos para responder la pregunta del amigo atricio dos ejemplo aplicativos con sus respectivos códigos y simulación en proteus

Ejemplo1:



> Device=16F628A
> Dim BUTON As PORTA.0		' Asignar pulsador a PORTA.0.
> Dim contar As Byte			'crear variable de dato para el select case
> Dim SEG7 As PORTB		'DISPLAY de 7 segmentos en PORTB
> ...



Ejemplo 2:



> Device = 16F628A
> CMCON=7				'PORTA'como digital
> Dim BUTON As PORTA.0		'boton en Porta.0
> Dim contador As Byte			'variable para el select case
> ...



perdonaran no responder a sus inquietudes antes pero he estado muy ocupado


----------



## atricio (Abr 22, 2011)

muchas gracias ire a interntar un par de cosas y les comentare como me fue intente con el select case la verdad no me funciono nada aparentemente no entiende las variaciones que quiero realizar muchas gracias mecatrodatos una gran ayuda y muy bien explicado espero armar lo requerido y postear mis resultados


----------



## mecatrodatos (Abr 23, 2011)

para el amigo dabopeyton que expuso algunas dudas en el curo de pic basic de comandos referentes a Proton dejo manual del mismo:

http://www.compile-it.com/protonds/proton_ds_userguide.pdf

y de doy explicación de algunos lo demás es mirar el manual.

HPWM

HPWM es un tren de pulsos que un usuario puede especificar su frecuencia y ciclo de trabajo. El ciclo de trabajo es el porcentaje de tiempo que el pulso se mantiene alta en comparación con el tiempo que se mantiene baja. Así, un ciclo de trabajo de 50% significa que se mantiene alta para el 50% del tiempo, y baja el 50% del tiempo. Un ciclo de trabajo del 25% significa que el pulso es alto el 25% del tiempo, y baja el 75% del tiempo.

50% ciclo de trabajo (frecuencia = 2kHz);

25% ciclo de trabajo (frecuencia = 2kHz);

No importa cuál sea la frecuencia, el ciclo de trabajo será el mismo, sólo que los pulsos serán más aplastados .Hay límites en la frecuencia del PWM, que son:

Frecuencia Xtal - frecuencia PWM más bajo utilizable

•    4 MHz - 244Hz
•    8MHz - 489Hz
•    10MHz - 611Hz
•    12MHz - 733Hz
•    16MHz - 977Hz
•    20MHz - 1221Hz
•    24MHz - 1465Hz
•    33MHz - 2015Hz
•    40MHz - 2442Hz

•    
Y con todas las velocidades Xtal, el más rápido de frecuencia posible es 32767Hz. Así que hay limitaciones con el PWM en lo que respecta a la frecuencia que puede producir. Cuanto más rápida sea la frecuencia, la mejor para esta aplicación, ya que aumenta la respuesta de las salidas.

El ciclo de trabajo es un valor entre 0 y 255, donde 0 es 0% y 255 es de 100%, es decir, un ciclo de trabajo de 63 en realidad significa el 25% como 63/255 = 0,25 (25%). 

El comando de  PBP  y  Proton es:

HPWM Canal, Dutycycle, Frecuencia


SERVO Comando de Proton:

También conocido como sistemas de retroalimentación cerrada, los motores servo vienen con un circuito de control, que detecta si hay un mecanismo del motor  en la ubicación deseada y si no se corrige un error de forma continua hasta que el motor alcance el punto adecuado. Servo por lo general vienen en pequeños envases de plástico como el siguiente, pero ten en cuenta que hay todo un sistema en el interior; circuito del motor en sí, engranajes y motor de accionamiento y control.

Servo es por lo general tienen gran esfuerzo de torsión debido a su engranaje. La velocidad del motor disminuye, pero aumenta su par, lo que les permite manejar grandes cargas. El bucle de realimentación cerrado mencionado anteriormente es en realidad un potenciómetro interno que está conectado a un eje mecánico para detectar el ángulo de giro. La señal del potenciómetro proporciona datos para el circuito de control para asegurar que el motor se encuentra en el ángulo deseado.

La mayoría de los servos están diseñados para funcionar dentro de un rango limitado, por ejemplo, 90 ° o ° 180, pero puede ser modificado para rotación continua. Este control exacto de la rotación y el par gracias al engranaje hace que el servo sea un gran dispositivo para incluir en cualquier proyecto de tipo mecánico-robóticas. La mayoría de servo operar desde 4,8 a 7,2 V DC.


El eje del motor servo se coloca con señales de ancho de pulso modulado (PWM). Así que todos los servos vienen con tres cables (alimentación, tierra y Control). Por lo general, en los servos de afición con ángulo de 90 ° de rotación, la señal anchura varía entre 1 y 2 ms. Si el pulso es la rotación más amplia continúa hasta que alcanza los límites mecánicos. Esta señal se aplica a la línea de control del servo. Consulte la hoja de datos para obtener más información del motor que baja ha seleccionar.

Para el ejemplo vamos a utilizar un servo que tiene una rotación máxima de 180 ° y opera con una señal de control de 1ms a 2ms.

Con esto en mente, una señal con un pulso de 1,5 ms alta llevara al servo a mitad de camino, o una señal en 2mS hará ir al servo a 100% la desviación. Esta señal debe ser enviada al servo a (50 Hz), permitiendo al programa realizar muchas otras funciones.

En el comando de Proton servo se limita a a lo que se menciono anteriormente. Mediante su uso podemos hacer que el servo baja a cualquier posición, y que se quede allí. Algunos servos tienen diferentes requisitos de pulso para diferentes ángulos, pero Los  Servos  más comunes operarán desde 1ms a 2ms.

Una vez que el servo está en la posición, el potenciómetro de retroalimentación al circuito de control interno de los servos se asegurará de que el servo no se deriva de la posición deseada, (siempre que se actualizan con la posición cada 50 ó 20 ms), si hay demasiado tiempo entre las señales de control, el servo se deriva. Consulte la hoja de datos de su servo.

Ejemplo:


```
Device = 18F4550
XTAL = 4
 
Dim Servo_Position As Word
 
LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.3
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
 
ALL_DIGITAL = True
 
DelayMS 150
Cls
 
Servo_Position = 1500
 
inicio:
 
 Repeat 
 Servo PORTA.0, Servo_Position 
 DelayMS 20 
 Inc Servo_Position 
 Print At 1, 1, "Servo = ", DEC4 Servo_Position 
 Until Servo_Position = 2000
 
 Repeat 
 Servo PORTA.0, Servo_Position 
 DelayMS 20 
 Dec Servo_Position 
 Print At 1, 1, "Servo = ", DEC4 Servo_Position 
 Until Servo_Position = 1000 
 
 GoTo inicio
```


----------



## atricio (Abr 23, 2011)

buenas noches señores parece que resolvi la duda que tenia con respecto a este programa


```
Device 16F873
XTAL 4

TRISB=%00000000
TRISC=%00011111

Symbol CN1=PORTC.0
Symbol CN2=PORTC.1
Symbol CN3=PORTC.2
Symbol CN4=PORTC.3
Symbol CN5=PORTC.4

Symbol SAL1=PORTB.0
Symbol SAL2=PORTB.1
Symbol SAL3=PORTB.2
Symbol SAL4=PORTB.3

PORTC=0
PORTB=0

' CERO  =>  VE BLANCO
' UNO =>  VE LA LINEA

INICIO:
'==================================================================================================================================
'COMPARACIONES PARA LOS SENSORES:
'==================================================================================================================================
If CN1=1 And CN2=1 Then 
'And CN3=1 And CN4=0 And CN5=0 Then

GoTo ADELANTE

End If

If CN1=0 And CN2=1 Then 
'And CN3=1 And CN4=1 And CN5=1 Then

GoTo DERECHA

End If

If CN1=1 And CN2=0 Then 
'And CN3=0 And CN4=1 And CN5=1 Then

GoTo IZQUIERDA

End If

If CN1=0 And CN2=0 Then 
'And CN3=1 And CN4=1 And CN5=1 Then

GoTo ATRAS

End If

'==================================================================================================================================
'MOTOR DERECHA  : SAL1 ; SAL2
'MOTOR IZQUIERDA: SAL3 ; SAL4
'==================================================================================================================================

'==================================================================================================================================
'RUTINAS PARA LOS MOTORES
'==================================================================================================================================
ADELANTE:

SAL1=1 : SAL2=0: SAL3=1 : SAL4=0

GoTo INICIO

ATRAS:

SAL1=0 : SAL2=1: SAL3=0 : SAL4=1

GoTo INICIO

IZQUIERDA:

SAL1=1 : SAL2=0: SAL3=1 : SAL4=1 

GoTo INICIO

DERECHA:

SAL1=1 : SAL2=1: SAL3=1 : SAL4=0 

GoTo INICIO
```

al parecer al quitarle en end al final se resolvio no se me ha vuelto a quedar el micro posible no posible coinsidencia la verdad no lo se ojala alguien puediera ratificar o hacerme saber lo equivocado que he estado.

tambien por molestarles un favor como saben este codigo es para un seguidor de linea y quisiera hacerlo booteable desde el proton por puerto serial para no andar sacando el micro y otra vez metiendolo ya hemos malogrado algunas patitas y se nos han roto con lo que ya no valen los micros quisiera saber si pueden hecharme una mano con esto. claro si es posible o ando definitivamente fuera de todo


----------



## mecatrodatos (Abr 24, 2011)

Atricio te dejo información para lo que necesitas al igual que vídeos 
Para ver los vídeos descarga:

http://vlc-media-player.softonic.com/

por otro lado puedes colocar End al finalizar un programa en proton bajo las siguientes condiciones:

EndSelect
GoTo inicio 
End

Next                                       ' 
GoTo Main         
End     


De lo contrario el programa no realizara el bucle

delayMs 1000                        ' segunda línea                
   GOTO MAIN         
  End


----------



## atricio (Abr 24, 2011)

muchisimas gracias amigo mecatrodatos tengo que leerlo les molestare alguna duda que tenga me supongo que seran muchas gracias por la ayuda entonces ahora comprendo porque se paraba el micro no seguia el bucle gracias ahora si a trabajar en esto


----------



## atricio (Abr 24, 2011)

hola amigos ando de nuevo por aqui he revisado la documentacion que me paso mecatrodatos pero tengo un par de preguntas ahora:

1.- para incluir el bootloader solo lo grabo en el micro y nada mas; no tengo que poner en el programa que  voy a grabar nada para identificar que use el bootloader para que no sobre escriba el bootloader.

2.- el circuito para usar la comunicacion serial puede usarse un cable Rs232 a USB porque tengo una portatil

3.- por aqui son muy escasos los max 232 y muy caros asi que averiguando me pasaron este diagrama que les adjunto acontinuacion como no requiero distancia mas que la que pueda haber desde el robot a mi pc no creo q tenga atenuacion por la extencion del cable. es valido el circuito o de ley tengo que hacerm el circuito entre el max232 y el micro.

4.- como saben lo quiero para mi robot seguidor de linea es posible que se haga esto a pesar que este todo montado o requiere un minimo de cosas conectadas

Amigo mecatrodatos muy buena la apliacacion me quede impresionado al momento de mostrar la apliacion de osciloscopio que mustra muy buena. de paso esta pregunta se puede usar ese programita para diferentes apliaciones sin necesidad de comprar el board que lo venden.

Disculpen tantas preguntas la ingnoracia vence pero ojala me puedan hechar una mano


----------



## mecatrodatos (Abr 30, 2011)

Atricio perdón por no responder rápido pero aqui va.

R1/:Antes de utilizar el programa MicroCode Loader es necesario pre cargar el microcontrolador a utilizar con el código “bootloader”, proceso que se puede realizar con el PIc KIt 2 Clon de moyano. 

Al energizar al microcontrolador, o al realizar un “reset” del microcontrolador, el programa pre cargado en el microcontrolador “bootloader” realiza un chequeo de comunicación a través del UART del micro, si existe un programa cargador como el MicroCode Loader, se le da el control del microcontrolador al, programa MicroCode Loader, si no se encuentra ninguna actividad en el puerto de comunicaciones, el microcontrolador saldrá del programa “bootloader” y ejecutará el programa que tiene contenido en su memoria flash.

El código (firmware) “bootloader” reside o se almacena en las últimas 256 palabras de la memoria de programación (Flash) del microcontroladores de la serie PIC16F, y en las últimas 336 palabras de la memoria de programación (Flash) de los microcontroladores de la serie PIC18F.

Todos los registros de la memoria EEprom y del microcontrolador están disponibles como recursos para el usuario.

R2/:Si , o un convertidor Usb serial que puedes utilizar con todos los pic de la serie 16 y 18 f El software MicroCode Loader se comunica con el microcontrolador a través del UART del microcontrolador (USART). 

R3/:Si posees portátil sin conexión serial (Rs232) debes hacer obligatoriamente un convertidor UBS-SERIAL como el que se observa en el Manual –PT40 Pág. 4 con el convertidor FT232 USB a SERIAL TTL u otro se encuentres en Internet

R4/esarrollas un conector en tu Robot seguidor de líneas tipo CONECTOR ICSP 6P. y si deseas potencializar el código conectas con el convertidor USB –serial al a través del UART del micro que estés utilizando ver pagina 18 Manual –PT40

Si yo tengo el programa por la extensión es difícil subirlo, lo único es que desarrolles el esquemático del USB-SERIAl en físico y te lo facilito.

y otra vez Perdón por la respuesta tan tarde


----------



## atricio (Abr 30, 2011)

hola amigo muchas gracias a ti por molestarte y compartir el conocimiento ahora me dejas con unas cuantas dudas mas el integrado que existe ahi no hay en el mercado local de ecuador creo que no lo voy a poder encontrar me va a tocar usar el diagrama que te lo colgue anteriormente ojala funcione.
adicionalmente he hecho supuestamente un iscp para hacer lo que dices pero no me ha funcionado bien en ocaciones funciona y otras no he verificado conexiones la verdad no se que pueda ser ojala me pudieras dar alguna recomendacion para ello.
ahora tengo una duda adicional tengo que hacer una comunicacion serial - labview ojala pudieran colgar algun ejemplito con esto pero primero lo primero hechenme una mano con eso del booloader


----------



## mecatrodatos (May 1, 2011)

Atricio mira si lo puedes conseguir por ebay creo que no es tan costoso y la facilidad de armar el circuito vale la pena (http://translate.google.com/transla...drodrigues.web.simplesnet.pt/usb_to_rs232.htm), por otro lado sube el circuito de tu robot para mirar como se te puede ayudar en verdad no se si tu circuito funcione para la comunicación portátil (USB)- serial, veo que es mas aplicable a computadores con puerto RS 232 incluido.

la cuestión de labview tocara mirar en este mismo foro algunos proyecto que postee : 
https://www.forosdeelectronica.com/...ic-pro-ccs-compiler-serie-paralelo-usb-25601/


----------



## atricio (May 1, 2011)

muchas gracias amigo mecatrodatos eres una maquina para esto segun miro este integrado solo existe en version smd no con pines ahi se me complica todo la verdad no se soldar en smd por si acaso te adjunto el diseno de mi seguidor disculpen pero soy novato para esto y por lo cual es bien basico ojala m puedas hechar una mano. en el link que me pasaste solo hay por entrada digital ojala me puedas dar algunos consejos de como mejorar el diseno y demas asuntos sobre el mismo gracias de antemano


----------



## dabopeyton (May 4, 2011)

Buenas tardes amigos, y en especial a mi amigo  para que me hechen una mano con los siguientes comandos y la sintaxis de lookup, lookDown, EDATA, EWRITE, EREAD, Y SI ES POSIBLE la diferencia de lookup respecto a lookDown y Edata con EWRITE Xfavor, amigo. Gracias de ante manos

trabajo con proton amigo


----------



## mecatrodatos (May 6, 2011)

*Atricio*: dame tiempo el fin de semana te doy repuesta 

*dabopeyton*:
EWRITE: Escribir un valor en la memoria EEPROM de a bordo.
EDATA: Definir contenido inicial de EEPROM de a bordo.

La EEPROM en un microcontrolador PIC es la memoria que puede contener información incluso cuando el PIC está apagado. Esto es útil para almacenar datos y contraseñas e información clave que es cambiante.

Leer y escribir  desde la EEPROM del PIC es muy sencillo con un lenguaje de programación de alto como de protones +, y es tan simple como lo siguiente;

Variable= EREAD Address
EWRITE  Address, [Variable, Variable]

El tipo de variable que se va a guardar para determinar la cantidad de memoria EEPROM se escribirá también. Por ejemplo:

Dim large_Variable As Dword
EWRITE 00, [large_Variable]

 El ejemplo anterior se escribe Large_Variable para hacer frente a 00 de la EEPROM del PIC. Pero debido a DWord contienen 4 bytes de información, direcciones de 00, 01, 02, 03 se escribirá también. 
Se debe tomar este tipo de cosas en cuenta. Otros ejemplos son las palabras de 2 bytes, o flotadores de 4 bytes, etc.
Lectura de la EEPROM es tan fácil, y un rápido vistazo al archivo de Ayuda de protones te guiará en la dirección correcta.

Aquí está un pequeño programa que muestra una EEPROM de lectura y escritura: 


```
Device = 16F877A
Xtal = 4
 
Dim DWord_Var as DWord
Dim Word_Var as Word
 
Dim Temp_DWord as DWord
Dim Temp_Word as Word
 
LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.3
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
All_Digital = True
 
Delayms 150
Cls
 
DWord_Var = 1000000
Word_Var = 1000
 
Inicio:
 
 EWrite 00, [DWord_Var, Word_Var]
 
 Temp_DWord = ERead 00
 Temp_Word = ERead 04
 
 Print At 1, 1, DEC7 Temp_DWord
 Print At 2, 1, DEC5 Temp_Word
 
 Inc DWord_Var
 Inc Word_Var
 
 DelaymS 1000
 
 Goto Inicio
```

LOOKUP: Obtener un valor constante de una tabla de búsqueda. 
LOOKUPL: Obtener un valor constante o variable de tabla de búsqueda.
LOOKDOWN: Buscar en una tabla lookdown, un valor constante. 
LOOKDOWNL: Buscar en una tabla lookdown, un valor constante o variable. 

Son comandos que en una tabla se almacenan caracteres para posteriormente ser mostrados o guardados en una variable.

x= LookUp x, [1,2,3,255,4,5,6,255,7,8,9,255,"*",0,"#",255,255]


----------



## dabopeyton (May 6, 2011)

mecatrodatos dijo:


> LOOKUP: Obtener un valor constante de una tabla de búsqueda.
> LOOKUPL: Obtener un valor constante o variable de tabla de búsqueda.
> LOOKDOWN: Buscar en una tabla lookdown, un valor constante.
> LOOKDOWNL: Buscar en una tabla lookdown, un valor constante o variable.
> ...




*mecatrodatos* como siempre ayudando al progimo. muchas gracias por la informacion.

me gustaria un ejemplo de looKUP y lOOKUP te lo agradesco


----------



## mecatrodatos (May 8, 2011)

*Atricio:*: te dejo sugerencias de tu circuito, como andas con el desarrollo de la placa para el loader.
*dabopeyton*: en la parte 4 o 5 del Tutorial no recuerdo bien ,hay un ejemplo de la utilización del comando  lOOKUP , revisa por favor.

Atricio mira aquí :_ https://www.forosdeelectronica.com/posts/494352/ _esto te puede servir y te aclarara muchas dudas saludos.


----------



## DEPREDADORX1 (May 8, 2011)

Saludos,
No se si alguien pueda ayudarme con mi pequeño proyecto pero espero encontrar al menos algun tipo de orientación pues no se si alguno de los foreros maneje visual.net, de cualquier forma es una programación muy básica, yo solo tengo unos 15 dias de haberle entrado al .net., bueno, lo que
quiero es conectar visual.net en una aplicación básica para envío y recepción de datos con proteus, la simulación es un conversor a/d con 16f877 que imprime en una lcd, aunque puedo ver que hay conexión con el puerto compi en proteus, pues veo que parpadea cuando pulso uno de los botones, no puedo lograr interpretar ningún dato.  En la recepción de visual pasa lo mismo,  solo recibo el signo ?.  Los puertos utilizados los cree con Virtual Serial Port, asignado uno al compi en proteus y el otro al componente SerialPort de visual.
De cualquier forma adjunto todo el paquete.

Gracias de antemano.


----------



## atricio (May 8, 2011)

hola amigo muchas gracias por la ayuda segun miro no andaba tan perdido con el diseno del robot eso creo segun las correcciones que me haz hecho el favor de hacer pero quisiera hacer otra pregunta 

1. eso quiere decir que con ese circuito ya podre cargar al micro con el prgrama desde serial obiamente con adicionando el circuito para la transmision y recepcion 

2. el circuito que te mencione antes esta bien para poder hacer la comunicacion serial para la pc y el micro o de ley tengo que usar un max232

tengo que decirte lamentablemente que he andado un poco quedado con esto porque no he hallado mucha informacion para el caso ando confundido porque tengo que hacer una comunicacion serial para el micro y la pc recibiendo 2 variables analogas y una de salida 

ojala me puedas hechar una mano mas de la que ya me haz dado gracias mecatrodatos


----------



## mecatrodatos (May 8, 2011)

*Atricio*:

R1/: Solamente tienes que conectar la placa de tu robot a la placa de desarrollo Loader como se ve en el ink que te pase anteriormente: http://translate.google.com/transla...drodrigues.web.simplesnet.pt/usb_to_rs232.htm

R2/: Es preferible usar la Max 232, pero en el libro de microcontroladores PIC programación en Basic de Carlos a reyes Pág. 143 esta el circuito para comunicar el PIC con el PC, siempre y cuando tenga puerto serie, sino como te dije anteriormente debes armas el circuito US-RS232, por si tu computador solo posea puertos USB. La Max 232, te sirve para proteger el puerto y una comunicación mas estable te recomiendo que armes la placa del loader con la Max 232 para evitar problemas. Conectas la Placa al puerto USB o Serie según sea el caso y esta a la placa de tu robot.


----------



## atricio (May 8, 2011)

amigo mecatrodatos muchas gracias por la ayuda ahora entendi lo grave va estar encontrar el integrado aqui en mi pais no creo que haya mucho menos smd me va a tocar usar el cable usb a serial mientras consigo estos integrados ademas del max232 o la 40106.
si este es otro proyecto ya que nos metieron con lo serial nos toca indagar como comunicar via serial 2 analogas recibidas por un 16f870 mandarlas al labview y de ahi poder enviar una reapuesta al micro para que haga actuar un motor segun un numero que yo le de.
muchas gracias por la ayuda voy a hacer algunos intentos y les avisare


----------



## DEPREDADORX1 (May 8, 2011)

Gracias mecatrodatos,

Muy bueno el curso. Sigo buscando como hacer la comunicación bidireccional en .net, en el foro de visual todo está hecho con c++ que yo no manejo, seguiré buscando a ver como me va y si consigo que funcione lo publico aquí por si le llega a servir a alguien.

Suerte


----------



## atricio (May 8, 2011)

hola amigos he realizado pruebas pero en el microcode loader no me deja cambiar el puerto por defecto esta en el com1 y de ahi no me deja cambiarlo que puedo hacer


----------



## mecatrodatos (May 8, 2011)

Tu computador cuantos puertos serie tiene ? si solo tiene USB no te preocupes 

Por defecto toma Com1 siempre y cuando tengas conectada la placa para el Loader o sino te saldrá mensajes como:

Reset Required

Please reset the tarjet microcontoller in ordr to acess the bootloader porcess....

Tu computador cuantos puertos serie tiene ? si solo tiene USB no te preocupes 

Por defecto toma Com1 siempre y cuando tengas conectada la placa para el Loader o sino te saldrá mensajes como:

*Reset Required*

_Please reset the tarjet microcontoller in ordr to acess the bootloader porcess_....[/QUOTE

Tu computador cuantos puertos serie tiene ? si solo tiene USB no te preocupes 

Por defecto toma Com1 siempre y cuando tengas conectada la placa para el Loader o sino te saldrá mensajes como:

*Reset Required*

_Please reset the tarjet microcontoller in ordr to acess the bootloader porcess_....[/QUOTE[/QUOTE]


----------



## atricio (May 9, 2011)

hola amigo mecatrodatos por lo pronto no he podido lograr realizar la placa por tal motivo no la uso estoy usando el cable usb serial que se lo puede comprar mas facilmente adicionalmente descarte que sea el cable ya que hice un ejemplo en labview uni el 2 con el 3 que son tx y rx y me transmite estoy usando el diagrama de la 40106 que te postie hace algunos dias uso el microcodeloader pero no me deja cambiar del com1 al com4 que tengo el cable puesto por lo que creo que no se puede realizar el bootloader


----------



## mecatrodatos (May 13, 2011)

Atricio en la información que te suministre esta la solución al problema toca crear un puerto virtual serial , no puedo subir el software iloader ya que su tamaño excede lo permitido pero veré como puedo ayudarte.


----------



## atricio (May 14, 2011)

muchas gracias amigo sabes que esto de la comunicacion serial se ve interante pero me anda sacando de orbita a cada rato disculpa que sea tan bobo pero revise el uso del microcode loader pero no dice nada de crear un puerto virtual


----------



## mecatrodatos (May 14, 2011)

te escribiré un mensaje privado con todo lo relacionado para crear el puerto y puedas sacar tu proyecto adelante saludos


----------



## atricio (May 14, 2011)

muchisimas gracias amigo como siempre ire subiendo poco a poco los resultados asi no queda esto en el aire de seguro sirve a algunos companeros mas


----------



## mecatrodatos (May 14, 2011)

ya te envié lo que necesitas mira tu cuenta saludos y espero te sirva.


----------



## atricio (May 14, 2011)

muchas gracias amigo lo miro cualquier pregunta te molestaria por favor


----------



## DEPREDADORX1 (May 18, 2011)

Saludos otra ves,

Para los iniciados en este arte como yo, basándome en ejemplos y demás información hallada en internet, aquí un pequeño ejemplo de comunicación serial entre proteus y visual.net donde se envían por puerto serie los datos de conversión A/D de porta.0 del pic16f877A, utilizando dos puertos virtuales creados con el programa Configure Virtual port serial Driver, el com2 asignado al Compi de proteus y el com3 al serialPort de visual.


----------



## dabopeyton (May 26, 2011)

Amigo, buenas como estan.
   necesito un consejo o ayuda..

estoy intentando controlar tres servo motores para un hexopodo.

como puedo trabajar para tener una buena sincronizacion. y cuantos grados tiene que girar cada motor. mas tarde subo la tabla de como quiero que trabaje. izquierda, derecha, y adelante.

para ser mas especifico, si tengo en el PORTA una entrada X y el el PORTB quiero controlar un servo motor, cuando en el PORTA obtenga un 1 que el servo funcione, pero quiero que sea en siclos repetitivos. es decir que se mantenga moviendo de 67º a 115º por decir algo. ese es el principio de mi hexapodo. un ejemplo de un motor. pero no se como lograr esto.


Quien tenga la solucion porfavor se lo agradezco


----------



## Nunainos (Jun 1, 2011)

Hola amigos, como están.

He realizado un programador, el Pickit2 Clone de los que se encuentran en el hilo Programador de microcontroladores PIC y memorias por puerto USB PICKIT2 CLONE, y estoy intentando programar con el Proton IDE, pero no puedo, bueno mejor dicho, no se instalar este programador en el entorno del Proton.

Alguien tendría la amabilidad de ayudarme??

Muchas gracias.


----------



## Gerson strauss (Jun 1, 2011)

hola Nunaimos, Proton ide es un programa que te permite mediante el lenguaje Basic crear el firmware para ser grabado en un pic, para grabar el pic puedes utilizar otros programas como el icprog, winpic 2000, ponyprog etc, para el Pickit 2 se necesita uno diferente, buscalo en la pagina de microchip o tambien en donde este el esquema del pickit 2 seguramente tambien estara el software de programacion, creo que estas confundiendo los programas, proton es para desarrollar el firmware y compilarlo y los demas para grabar el archivo .hex a tu pic.

Saludos!


----------



## Nunainos (Jun 1, 2011)

Gracias, pero a ver creo que no entendí bien. Por ejemplo, he realizado en proton el tipico programita que hace encender y apagar un led. Entonces, una vez hecho eso, que puedo hacer desde el proton??.

Una vez, hecho el .hex, lo paso a mi programador con otro grabador??

Muchas gracias.


----------



## DEPREDADORX1 (Jun 2, 2011)

Hola,

Para que el quemador funcione tienes que grabarle el firmware primero al pic que hace parte del quemador como tal, sino no funcionará nunca para grabar otros pics. El proton es para cuando el quemador funcione como tal, pues este programa genera el archivo .hex de la aplicación que desees cargar a tu otro pic (el de la aplicación que desees desarrollar, led parpadeante, semaforo, etc). Si tienes todo listo entonces colocas en el soket el pic a grabar, abres el programa pickit2 y debe reconocerlo enseguida, ahora abres file-import hex y después en el botón write para escribir el programa.


----------



## Nunainos (Jun 2, 2011)

Entonces, ¿desde el Proton no puedo crear el programa y luego cargarlo al pic que yo tenga en mi programador?

Si he entendido bien, con el proton creo el programa que genera un hex, y este hex lo importo desde el programa PicKit2 y lo cargo en el pic, ¿es así?.

Perdonar mi ignorancia, pero soy muy novato.

Muchas gracias.


----------



## atricio (Jun 2, 2011)

hola amigo yo tambien soy un poco nuevo en el tema mira tratare de explicarte de una manera facil haber si men entidendes

mira en el proton haz de cuenta que tu escribes la lista de instrucciones que deseas que haga el microcontrolador que tu haz elegido como el microcontrolador habla un leguaje diferente al que nosotros le damos las instrucciones.

el proton convierte el lenguaje de tus instrucciones  osea el que nosotros entendemos lo transforma al leguaje que entiende el microcontrolador por eso genera el .hex que ya debes conocer.

ahora para que el micro haga las maravillas que tu quieres hacer lo tienes que grabar osea grabar tus instrucciones en el micro.

ahora como grabas tus instrucciones en el micro lo haces con una grabadora de pics segun entiendo que es una pickit2 clone del foro mismo con esa tarjetica vas a grabar tu microcontrolador.

te invito a que mires este video te aclarara un poco el panorama






espero haber ayudado un poco y no confundido mucho


----------



## Nunainos (Jun 3, 2011)

Muchas gracias amigo Atricio por tus buenas explicaciones, pero ¿entonces porque el proton ide tiene en su menu, acciones tales como , verificar, borrar, leer o escribir igual que en el programador del pickit2?

Gracias una vez más.-


----------



## atricio (Jun 4, 2011)

en hora buena que te pude sacar un poco la duda. ahhhhh ahora con respecto a eso tu puedes cargar los datos de proton directamente hacia el microcontrolador mediante comunicacion serial con esto puedes grabar a tu microntrolador sin necesidad de grabador pero tienes anteriormente con un grabador como el pickit2 clone grabar valga la redundacia en tu pic un programita maestro que se llama bootloader este programita hace que cada que inicies tu micro entre en una fase de busqueda de datos en el puerto serial del micro si no encuentra nada sigue adelante con el software demas programado.
estoy en pruebas queriendo lograr esto con un 16F870 me han ayudado bastante los companeros del foro pero ando un poco quedado con esto por eso de tener solo usb me toca usar un conversor de usb a serial y eso me ha traido un poco de complicaciones espero no haberte confundido saludos


----------



## Nunainos (Jun 4, 2011)

Pero tengo un problema amigo Atricio, y es que el Pickit2 Clone no funciona por serial sino por USB. Y perdoname otra vez, no entendi muy bien el tema del bootloader. Siento de nuevo mi ignorancia. 

Muchas gracias.


----------



## dabopeyton (Jun 23, 2011)

AMIGOS LES PIDOAYUDA, ya que se que lo siquiente es sencillo para ud. necesito utilizar ADC del pic para 3 LDR. en proton IDE, como lo podria hacer? en dode quiero que me trabajen como swiches
para unos y ceros y me den 8 combinaciones es decir
x  y  z
0  0  0  apagado
0  0  1  derecha
0  1  0  adelante
0  1  1  derecha
1  0  0  izquierda
1  0  1  apagado
1  1  0   izquierda
1  1  1   atras

Es que realizo mi hexadopo seguidor de luz... y me falta ese detalle.


----------



## atricio (Jun 24, 2011)

Nunainos dijo:


> Pero tengo un problema amigo Atricio, y es que el Pickit2 Clone no funciona por serial sino por USB. Y perdoname otra vez, no entendi muy bien el tema del bootloader. Siento de nuevo mi ignorancia.
> 
> Muchas gracias.




hola amigo disculpa pero no he revisado el mail hace un tiempo por temas del trabajo y de la u mira el bootloader es un porgramita que activa la comunicacion serial del microcontrolador que quieres usar para tu aplicacion como para aprender te recomiendo un 16F877A o un 16F870 que son buenos para tratar de aprender a programar esos poseen un modulo de comunicacion serial este programa lo que hace es definir que el microcontrolador al energizarce por primera active la comunicacion serial y busque comunicarse datos por serial ahi entra el proton que tambien emite datos en por serial de la PC se engancha la comunicacion y define la programacion del microcontrolador a ser usado asi mas o menos se usa el bootloader si no te queda muy claro seria bueno que busques en la red.
que proyecto tienes en mente realizar????? para poderte ayudar de la mejor manera



dabopeyton dijo:


> AMIGOS LES PIDOAYUDA, ya que se que lo siquiente es sencillo para ud. necesito utilizar ADC del pic para 3 LDR. en proton IDE, como lo podria hacer? en dode quiero que me trabajen como swiches
> para unos y ceros y me den 8 combinaciones es decir
> x  y  z
> 0  0  0  apagado
> ...



mira amigo revisa en post anteriores ahi se define como habilitar el modulo adc del micro 
tienes que tomar en cuenta el tipo de micro que vas a usar dependiendo de eso se modifican los registros como ADCON1, ADCON0, TRISA, TRISB, TRISXXXXX no es tan dificil como lo piensas define bien lo que quieres usar y ojala te pueda hechar una mano


----------



## DEPREDADORX1 (Jun 25, 2011)

Hola nuevamente,

Sería bueno saber como es que debe funcionar el hexapodo, supongo que tendrías que poner a comparar los datos de cada canal uno contra otro para determinar cuál es el que recibe más luz y determinar la dirección, al menos eso es lo que yo entiendo, de todos modos mira este ejemplo que adjunto para que tengas una idea básica a ver si te sirve o sino, acláralo aquí y así podremos manejarlo de otra forma.

Suerte.

```
Device = 16F877A
       	Xtal = 4
       	
     '***** CONFIGURACION LCD *****   
       Declare LCD_Type = 0         ;LCD is Alpha
       Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
       Declare LCD_ENPin = PORTD.1  ;LCD EN line
       Declare LCD_RSPin = PORTD.0  ;LCD RS line
       Declare LCD_Interface = 4    ;LCD 4 line interface
       Declare LCD_Lines = 2

    '***** CONFIGURACIÓN RESOLUCIÓN *****
'Declaration for Analog to Digital Conversion
Adin_Res = 8               '10 bit resolution
Adin_Tad = FRC              'RC OSC
ADIN_DELAY = 100            '10us delay for sampling

Symbol QNTZ = 5.0/255 
 Dim RAW     As Word      
 Dim canal1  As Byte
 Dim canal2  As Byte
 Dim SENSOR1 As Float
 Dim SENSOR2 As Float

'----------------------------------------        
   TRISC =0          
   TRISB =0              
   TRISA =%00000011              
   ADCON1=100                           ' Port A0,A1-A3 Conversión A/D
  
INICIO:
    	canal1 = ADIn 0				
        canal2 = ADIn 1
        
        SENSOR1 = canal1 * QNTZ		
        SENSOR2 = canal2 * QNTZ
        Print At 2,2, Dec SENSOR1," ",Dec SENSOR2
        DelayMS 100
        If SENSOR1>=SENSOR2 Then  
         GoSub ADELANTE
         Else
         GoSub ATRAS
        EndIf
GoTo INICIO	

 ADELANTE:
 Cls
 Print At 1,1, "ADELANTE"
 DelayMS 300
 Return
 
 ATRAS:
 Cls
 Print At 1,1, "ATRAS"
 DelayMS 300
 Return
```


----------



## atricio (Jun 26, 2011)

es muy buena la concepacion del control tiene mucha razon


----------



## mecatrodatos (Jun 29, 2011)

que tal les anexo un entremés de la parte 7.2 del tutorial


----------



## haifer (Jun 29, 2011)

mecatrodatos dijo:


> que tal les anexo un entremés de la parte 7.2 del tutorial



ojala puedas traer el tutorial pronto, realmente seria un gran aporte.

De antemano muchas gracias...


----------



## mecatrodatos (Jun 29, 2011)

PARTE 7.2 DEL TUTORIAL , para inquietudes , sugerencias , criticas , rechazos ..... desde este foro


----------



## DEPREDADORX1 (Jun 30, 2011)

Excelente información, gracias de nuevo.

Ahora solo queda conseguir la pantalla a ver si se puede implementar algun proyecto.

Suerte.


----------



## chapin (Jun 30, 2011)

gracias por el aporte mecatrodatos, como siempre buenisimos


----------



## ramonlara (Jul 1, 2011)

buenas noches he estado buscando bibliografias sobre el bus i2c en proton para un 18f4450, por favor tienen algo por ahy sobre ese tema que me puedan mostrar, ejemplos, enlaces, etc.
gracias.
nuevamente agradecido de antemano.


----------



## chapin (Jul 2, 2011)

utiliza el buscado,r seguramente alli encontraras algo de lo que necesitas


----------



## haifer (Jul 2, 2011)

ramonlara dijo:


> buenas noches he estado buscando bibliografias sobre el bus i2c en proton para un 18f4450, por favor tienen algo por ahy sobre ese tema que me puedan mostrar, ejemplos, enlaces, etc.
> gracias.
> nuevamente agradecido de antemano.



Buenos días, yo estuve un tiempo con la misma inquietud, y la guía que trae Protón “userguide” me soluciono muchas dudas, es muy sencillo y trae muchos ejemplos sobre el manejo del bus I2C, hay aplicaciones para leer y programar  memorias EEprom, pero es lo mismo para cualquier dispositivo que use este protocolo. El PDF está en este link :

http://www.compile-it.com/protonds/proton_ds_userguide.pdf


So lo escribe I2C en el buscador del PDF y te mostrara paso a paso toda la informacion. Esto sirve para caulquier pic que lo soporte, Cualquier duda me comentas, suerte.


----------



## CHR (Jul 23, 2011)

si quieres saber sobre la comunicación I2C, en la pagina de neoteo esta un ejemplo con un DS1307 que es un reloj en tiempo real que usa esta comunicación.
Te puede ayudar bastante como me ayudo a mi.
Esta hecho con pic 18F2550 pero la sintaxis es la misma para todos los pics
http://www.neoteo.com/ds1307-reloj-en-tiempo-real-con-18f2550


----------



## franchute12 (Jul 26, 2011)

Hola a Todos 

Quisiera que me ayudaran necesito realizar una conversion analoga-digital con un pic 12F675 en Proton IDE , la verdad es la primera ves q trabajo con este micro y pues estoy un poco confundido.....

les agradeceria cualquier ayuda que me puedan brindar ......


----------



## DEPREDADORX1 (Jul 27, 2011)

este ejemplo està en inglès, pero si le echas cabeza creo que algo puedes obtener, lo saquè de la misma ayuda de protòn.


```
12F675 ADC Example 

' Perform an ADC conversion on the 12F675 8-pin PICmicro device

 Device = 12F675
 XTAL = 4
        
 SERIAL_BAUD = 9600 
 RSOUT_PIN = GPIO.0
 RSOUT_MODE = TRUE
 RSOUT_PACE = 10
        
'-------[DEFINE SOME ALIAS'S TO ADC REGISTERS]---------------------------

' ANSEL register's bits
 Symbol ANS0 = ANSEL.0
 Symbol ANS1 = ANSEL.1
 Symbol ANS2 = ANSEL.2
 Symbol ANS3 = ANSEL.3
 Symbol ADCS0 = ANSEL.4  ' ADC conversion clock select bit
 Symbol ADCS1 = ANSEL.5  ' ADC conversion clock select bit        
 Symbol ADCS2 = ANSEL.6  ' ADC conversion clock select bit       
  
' ADCON0 register's bits  
 Symbol ADFM = ADCON0.7
 Symbol VCFG = ADCON0.6
 Symbol CHS2 = ADCON0.4  ' ADC channel select bit
 Symbol CHS1 = ADCON0.3  ' ADC channel select bit
 Symbol CHS0 = ADCON0.2  ' ADC channel select bit
 Symbol GO_DONE = ADCON0.1  ' ADC Conversion status/ plus enable conversion-bit
 Symbol ADON = ADCON0.0  ' ADC Enable bit: 1 = enabled, 0 = disabled.
        
'-------[ASSIGN A VARIABLE FOR THE ADC RESULT]---------------------------
        
 Dim AD_RESULT as ADRESL.WORD ' Convert the ADRESL register into a WORD variable 

'-------[INITIALISE THE PICMICRO]----------------------------------------
 Delayms 500    ' Wait for the PICmicro to stabilise
 Goto OVER_ADC_SUBS   ' Jump over the subroutines
        
'-------[START AN ADC CONVERSION]----------------------------------------
GET_ADC:
 ADON = 1     ' Enable the ADC
 Delayus 50                ' Wait for sample/hold capacitors to charge
 GO_DONE = 1              ' Start conversion
 While GO_DONE = 1 : Wend  ' Poll the GO_DONE flag for completion of conversion
 ADON = 0     ' Disable the ADC, to save power
 Return
          
'-------[INITIALISE THE ADC REGISTERS]----------------------------------
' Standard procedures for setting up the ADC 
OVER_ADC_SUBS:                
 TRISIO = %11111111   ' All pins set for input
        
 ADCS0 = 1    ' \
 ADCS1 = 1    '   Setup ADC's clock for FRC
 ADCS2 = 0    ' /
        
 VCFG = 0     ' VREF is set to VDD of PICmicro
 ADFM = 1     ' Right justify the ADC result
        
 ANS0 = 0     ' Set AN0 (GPIO.0) as Digital input
 ANS1 = 0     ' Set AN1 (GPIO.1) as Digital input
 ANS2 = 1     ' Set AN2 (GPIO.2) as Analogue input
 ANS3 = 1     ' Set AN3 (GPIO.3) as Analogue input
        
'-------[MAIN PROGRAM LOOP STARTS HERE]----------------------------------
' Perform ADC conversions and display the result serially
       
 While 1 = 1     ' Create an infinite loop
  ADCON0 = ADCON0 | (2 << 2)   ' Select the channel to read
  Gosub GET_ADC    ' Perform an ADC conversion
  Rsout "CHANNEL 2 = " , DEC AD_RESULT,13  ' Display the result serially
  Delayms 500     ' Wait for half a second
 Wend      ' Do another conversion
```


----------



## atricio (Jul 28, 2011)

hola amigos aqui regresando de un lago tiempo a lo que me gusta martirizame con los micros ahora vengo con una duda como puedo hacer una comunicacion I2C para comunicarme con 2 micros como deberia configurarla le agradeceria mucho una ayuda quisiera hacerla con 16f877a o con 16f628a


----------



## dannyy (Jul 28, 2011)

amigo mecatrodatos soy un seguidor tuyo y e visto tus aportes y son buenísimos quisiera saber para cuando estar listo el siguiente tutorial porque te quedaste en 7.2 pantallas glcd solo quisiera saber cuando saldrá el 7.3 o el 8 un saludo y felicitaciones por el material esta excelente


----------



## duaiber (Ago 13, 2011)

buenas tardes amigo tengo una pregunta para aclarar unas dudas hasta que serie de pic se pueden programar con proton, y lo otro que quiero decir es que tengo un problema en cuanto a la lectura de memoria de la eeprom de un pic877 con proton, el problema es el siguiente: yo stoy guardando datos que son unas rutas para un robot movil mediante un teclado las meto en el pic para guardarlas con  ewrite, si las leo de una vez con eread el dato leido es el correcto pero si hago otras cosas y luego quiero leer el dato en la direccion correcta el dato es otro es una locura puesto que el dato deberia ser el mismo. si alguien puede ayudarme de antemano le agradezco


----------



## dannyy (Ago 13, 2011)

el proton lee desde el 12fxx asta 18f4550 pasando tambien por los mas conocidos como:
16f84,16f84a,16f628, 16f628a, 16f877, 16877a ,16f876,etc lo cuales estos son los mas principales
y sobre lo otro no te entiendo tu pregunta


----------



## duaiber (Ago 14, 2011)

Bueno, lo que pasa es que tengo el siguiente problema, yo kiero guardar un dato en la eeprom del pic lo stoy haciendo con la funcion ewrite y me funciona bien el dato es guardado pero cuando lo voy a leer con la funcion eread no extrae el dato q guarde, sino un dato diferente, entonces hice la prueba guardando y en la siguiente linea envie a leer y publicar en un lcd y me funciona bien. La cosa es que cuando guardo el dato y hago un salto a otra rutina y envío a leer  el dato q guarde como que se pierde no es el mismo y stoy apuntando en la misma direccion q guarde de forma directa pero nose porque cambia ese dato, ya esto lo he practicado con picbasic y me funciona bien. Y pues kisiera solucionar este problema en proton.


----------



## chapin (Ago 15, 2011)

dauiber pon tu codigo para que podamos ayudar


----------



## duaiber (Ago 15, 2011)

les pasare el codigo donde tengo el problema ya que el codigo es muy extenso:


```
For i = cont1 To cont2
EWrite i, [X]
sal = ERead i             ' si hago esto no tengo problemas el dato x al leerlo es el que se guardo      
Print  # sal
DelayMS 500
next
```

asi me funciona bien pero si hago esto es donde el dato guardado en la eeprom se me pierde o por lo menos no me arroja el que es.


```
For i = cont1 To cont2
EWrite i, [X]
DelayMS 500
next
goto leer
leer:
For i = 0 To cont2
sal = ERead i        'aqui cuando leo en la variable sal se guarda un dato incorrecto
Next
```

en el primer for staria guardando funciona asi yo introduzco datos con un teclado al micro y el va guardando en la eeprom luego cuando ya introduje todos los datos mando a ejecutar q seria leer para mover un robot movil pero cuando mando a leer en las direcciones q guarde no sta el dato q deberia star, el error me lo da es cuando hago un salto como explique arriba si guardo y leo de una vez me funciona bien pero si guardo y realizo un salto no me funciona.


----------



## DEPREDADORX1 (Ago 16, 2011)

Hola duaiber,

Yo te recomendarìa que utilizaras el còdigo de la clave de acceso que està en las primeras pàginas del foro, como punto de partida claro, una vez establecido que si funciona entonces ir agregandole, yo tuve un problema parecido al querer cambiar la clave, a la final no supe y abandonè, ojalà y tengas una respuesta màs concreta de los compañeros.

Suerte.


----------



## duaiber (Ago 16, 2011)

Amigo gracias por tu respuesta, pero busque en las primeras 4 paginas y no consegui el codigo me dirias en que pagina esta?


----------



## duaiber (Ago 16, 2011)

Buenas noches me gustaria obtener una respuesta al problema que plante.


----------



## DEPREDADORX1 (Ago 17, 2011)

Hola duaiber,

Con este se guarda lo que se digita y se compara con lo que hay en memoria, especulando solamente creo que el problema debes tenerlo al empezar a leer la memoria, de cualquier forma, parte de este y ve agregandole a ver como te va.

suerte.


```
Device = 16F877A
 Xtal = 4

 All_Digital=true
 Keypad_Port PORTB
 PortB_Pullups true

 Declare LCD_Type = 0         ;LCD is Alpha
 Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
 Declare LCD_ENPin = PORTD.1  ;LCD EN line
 Declare LCD_RSPin = PORTD.0  ;LCD RS line
 Declare LCD_Interface = 4    ;LCD 4 line interface
 Declare LCD_Lines = 2

Print Cls
Dim I         As Byte
Dim x         As Byte
Dim y         As Byte
Dim CONT      As Byte
Dim flag      As Byte
Dim numero[4] As Byte
Dim LEER[4]   As Byte
Dim SALIDA As PORTC.0
EData 5,1,2,3
EWrite 0,[5,6,7,8]        'Guarda en la memoria los numeros 5678

INICIO:
Print Cls
Low SALIDA
CONT=0
GoSub MENSAJE

TECLEAR:
x=InKey
x= LookUp x, [1,2,3,255,4,5,6,255,7,8,9,255,"*",0,"#",255,255]
If x <> 255 Then
Print At 2,1+CONT, "*"
DelayMS 400
numero[CONT]=x
CONT=CONT+1
EndIf
If CONT=4 Then 
GoSub COMPARAR_CLAVE
Else
GoTo TECLEAR
EndIf 
 GoTo INICIO
 
COMPARAR_CLAVE:
flag=1
Print Cls
Print At 1,1,"A Ingresado:"
For I=0 To 3
 Print Dec numero[I]
 Next
 DelayMS 1000
 Print Cls
 
For I= 0 To 3                      
 LEER[I]=ERead I                         
 Next I              


For I=0 To 3
 If numero[I]<>LEER[I] Then flag=0
 Next I
 Print Cls
 If flag=1 Then 
 Print "CLAVE CORRECTA"
 DelayMS 1500
 High SALIDA
 DelayMS 1000
 Low SALIDA
 Else
 Print "CLAVE INCORRECTA"
 DelayMS 1600
EndIf
Return


MENSAJE:
Print At 1,1, "Digite la clave "
Return
```


----------



## ecajg2b (Ago 25, 2011)

depredadorx1 dijo:


> hola atricio,
> 
> pues este ejemplo está en la ayuda, parece igual que en pic basic.
> 
> ...



hola amigo me he guiado de este programa  keriendo modificar a agregar unas 4 entradas mas es q lo kiero acoplar a un texteo de unos sensores pa un proyecto qm e toy inventando pero se me vuelve loco ahi te adjunto algo de lo q he  hecho
espero me des una ayuda y me explikes ya q soy nuevo en esto del entorno de los microcontroladores


----------



## atricio (Ago 26, 2011)

cual es el problema que tienes no lo entiendo para que te hechen una mano seria mejor que expliques no son magos los amigos del foro


----------



## ecajg2b (Ago 26, 2011)

si disculpa el problema es q al compilar el programa la lcd me bota un error tremendo osea me va botando los mensajes todos consecuitivos como si siempre  estuviera detectando todos los pulsadores al mismo tiempo la idea mia es q al presionar pulsador me bote un solo mensaje y se kede ahi en la lcd y ps al notar el segundo pulsador presionado osea ambos juntos  bote otro mensaje y asi consecutivamente hasta estar los 5 pulsadores presionados 
serian 5 mensajes diferentes, tengo la lcd configurada por el ptod la entrada de los pulsadores por ptob ahi anexe el diagrama y lo k llevo del programa espero me puedan decir q podria hacer pa solucionar


----------



## DEPREDADORX1 (Ago 27, 2011)

Hola a todos,

La verdad no entiendo muy bien que quieres hacer con esto ecajg2b, veo que preguntas por el puerto c.0, etc pero mirando la simulaciòn no hay nada conectado en el puertoC, aclara y miramos.

De cualquier forma, si quieres sacar un mensaje especìfico con dos pulsadores, utiliza la condiciòn lògica  AND. Ej:

if port1=1 AND port2=1 then gosub MENSAJE1
if port3=1 AND port2=1 then gosub MENSAJE2

Ojalà y te sirva, sino, publica nuevamente tus dudas.


----------



## atricio (Ago 27, 2011)

hola amigo mira esta parte del post ahi el amigo mecatrodatos me explico como hacer lo que tu me dices que quieres hacer esta ya realizado es solo que adaptes un poco lo que quieres hacer en la lcd nada mas miralo ami me ayudo 

https://www.forosdeelectronica.com/posts/486110/


----------



## ecajg2b (Ago 28, 2011)

hola amigosl es cuento q leyendo bien aki en el foro y  ps con las ideas q me dio los usuarios q me respondieron creo q lleguen al fin y al logro del programa tal cual como lo keria lo adjuntare en un archivo en rar aunque falta unos reotqes ya esta la idea tal cual yo la keria


----------



## atricio (Sep 3, 2011)

buena esa para eso el el foro felicitaciones


----------



## mendek (Sep 8, 2011)

hola  que tal @mecatrodatos, debido a que el tutorial se extendio de forma indefinida XD se me canso la vista, de tanto leer y me gustaria saber si cuentas con algun tutorial especializado en la programacion del pic16f84 para nosotros los principiantes ya que lo que encuentro es para otros pics y supongo que la forma de programar no es la misma para todos los pics. desde ya muchas gracias y espero puedas ayudar a los novatos je.


----------



## DEPREDADORX1 (Sep 9, 2011)

Como este es un espacio abierto, me gustaría decirle al amigo mendek que muchos de los ejercicios están hechos con el pic16f628, el cual no tiene muchas diferencias con el 16f84, mas bien mejorías, tenemos los comparadores y más memoria disponible, aquí te paso un enlace a  donde tratan el tema para que veas.

http://todopic.mforos.com/6510/3461829-16f84-a-16f628-que-hay-que-tener-presente-para-migrar/


----------



## adiktofer (Sep 20, 2011)

Que bueno este tutorial sobre el manejo de PROTON Basic, ya descargue los 7 archivos, muy buenos todos.
Creo q con esos seria nivel principiante. Ahora tengo q multiplexar displays de 7 segmentos para mostrar la temperatura en grados C utilizando el conversor A/D del 16F877A.
No tengo incoveniente alguno en realizar la conversion ADC, ya que todo se resume a una regla de tres simple. Lo que si es algo nuevo para mi es el manejo de las interrupciones y recien estoy empezando a documentarme sobre el tema, pero creo q con un ejemplo despejaria mis dudas.
Tengo entendido que PROTON tiene dos formas de manejar las interrupciones, segun su manual de usuario:

- *On Interrupt*  : interrupcion por software
- *On_Interrupt* : interrupcion por hardware

Segun el manual de PROTON, la mas eficiente y RECOMENDADA es por medio de hardware. Para ello se definen todos los registros. He aqui un ejemplo con el 16F84:


```
' Flash an LED attached to PortB.0 at a different rate to the
' LED attached to PortB.1
Device = 16F84
On_Hardware_Interrupt Goto Flash
' Assign some Interrupt associated aliases
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol PS0 = OPTION_REG.0 ' Prescaler ratio bit-0
Symbol PS1 = OPTION_REG.1 ' Prescaler ratio bit-1
Symbol PS2 = OPTION_REG.2 ' Prescaler ratio bit-2
' Prescaler Assignment (1 = assigned to WDT 0 = assigned to oscillator)
Symbol PSA = OPTION_REG.3
' Timer0 Clock Source Select (0 = Internal clock 1 = External PortA.4)
Symbol T0CS = OPTION_REG.5
Symbol LED = PORTB.1
Goto Over_interrupt ' Jump over the interrupt subroutine
' Interrupt routine starts here
Flash:
' xor PortB with 1, Which will turn on with one interrupt
' and turn off with the next the LED connected to PortB.0
PORTB = PORTB ^ 1
T0IF = 0 ' Clear the TMR0 overflow flag
Context Restore ' Restore the registers and exit the interrupt
Over_interrupt :
TRISB = %00000000 ' Configure PortB as outputs
PORTB = 0 ' Clear PortB
' Initiate the interrupt
GIE = 0 ' Turn off global interrupts
PSA = 0 ' Assign the prescaler to external oscillator
PS0 = 1 ' Set the prescaler
PS1 = 1 ' to increment TMR0
PS2 = 1 ' every 256th instruction cycle
T0CS = 0 ' Assign TMR0 clock to internal source
TMR0 = 0 ' Clear TMR0 initially
T0IE = 1 ' Enable TMR0 overflow interrupt
GIE = 1 ' Enable global interrupts
Inf:
Low LED
DelayMs 500
High LED
DelayMs 500
Goto Inf
```

segun el comentario inicial, sirve para parpadear dos LEDs a distintas frecuencias.
Alguien capo q me de una mano con el codigo sobre todo en la interrupcion por desborde del timer0.
Gracias.


----------



## DEPREDADORX1 (Sep 20, 2011)

Saludos adiktofer,

Pues lo mejor, creo yo, es ir de lo básico a lo complejo, primero este ejemplo sencillo para que te relaciones con una interrupción bien sencilla, te adjunto un documento que quizas te ayude.


> Device = 16F877A
> Xtal = 4
> 
> 'Declaration for Analog to Digital Conversion
> ...


----------



## reyvilla (Oct 6, 2011)

Buenas estoy empezando a trabajar con proton y he realizado algunos programas, les comento que trabajo mucho con PBP por lo cual se me ha hecho fácil entender el proton, hace poco tenia problemas con la configuración de los fuses y encontré un programita interesante para resolver este problema les anexo el link de descarga, es de mucha ayuda a la hora de programar en proton.

https://rs297dt.rapidshare.com/#!do...roton_picbasic_Fuse_generator.rar|206|R~0|0|0

PD: yo lo descargue y lo probé esta bien completo aunque solo trabaja con mas o menos 10 pic los mas populares.


----------



## mendek (Oct 7, 2011)

que tal buenos dias, tengo un problema con el 16f84a, lo que pasa es que hice una alarma para un local, pero a la hora de encender el pic la mayoria de los leds a las salidas se encienden por un tiempo muy pequeño tiempo y se apagan casi inmediatamente, mi duda es si no habra alguna instruccion de proton ide para evitar que las salidas enciendan hasta que no se cumplan las condiciones del programa.
desde ya gracias por la ayuda.


----------



## chapin (Oct 7, 2011)

prueba colocar portb = 0 antes de cofigurar los trisb


----------



## mendek (Oct 7, 2011)

si de hecho puse eso antes de empesar con el programa


----------



## atricio (Oct 9, 2011)

capaz que es solo configuracion de tu programa nada mas

hola amigos un favor alguien monto el protocolo modbus en un micro sabe alguien como hacerlo 
ojala pudieran postear algo de eso por favor 
espero me puedan ayudar con informacion con el tema


----------



## mecatrodatos (Oct 17, 2011)

Que tal hay atricio hay dos formas con rs 232 o rs 485, que deseae relizar ¿comunicacion industrial ? o algo como el scada.


----------



## atricio (Oct 18, 2011)

hola amigo mecatrodatos quisiera hacerlo por rs232 me parece el mas facil hasta para poder 
armarlo porque no se como se hace en 485.
es para hacer una pequena red para una comunicacion entre maestros y esclavos y poderlo montar en labview talvez estoy delirando pero es un proyecto de la U y no se por donde atacar primero he tratado de leer algo sobre el tema pero me tiene mas confundido las cosas.
sera que tienes algo con lo que pueda comenzar para poder trabajar porque si me siento en el limbo y no quiero seguir nadando contracorriente gracias de antemano por la ayuda que me puedas prestar muy agradecido por la atencion que le des a este mensaje


----------



## DEPREDADORX1 (Oct 19, 2011)

Pido disculpas a atricio por interrumpir el hilo que lleva pero necesito formular una pregunta a ver si encuentro respuesta en el foro, me gustaría saber que programa o complemento para proton puedo utilizar para convertir en código las imágenes y así trabajarlas con una pantalla gráfica, hasta ahora no he podido no he logrado dar con Pic BasicPlus glcd que menciona Mecatrodatos en la última guía que publicó, estaría supremamente agradecido si pudieran orientarme al respecto.


----------



## mecatrodatos (Oct 23, 2011)

DEPREDADORX1:

los programs son:

1.Pic BasicPlus
2.*GLiPIC2 *
*3.*BMP-2 Asm
4.y otros tantos mas que no me acuerdo.  hay una mas que esta incluido en el proton de 32 bits pero no me acurdo del nombre.


El complemento:
1. Graphic LCD Data Mate: http://wiki.picbasic.org/index.php?n=Plugins.GraphicLCDDataMate que es un plugin.

Atricio ya respondi a tu consulta mira en tu email, saludos


----------



## DEPREDADORX1 (Oct 23, 2011)

Gracias Mecatrodatos,

Respecto al complemento Data Mate no he logrado que me funcione, siempre obtengo un error de ejecución 429 que no sé a que debe y tengo la versión de Proton ide 2.0.0.7 con compilador 3.5.1.1. Tendré que probar con los otros programas.

Nuevamente gracias por la ayuda y espero poner a trabajar lo más pronto posible poner a trabajar una de una pantalla gráfica.


----------



## mecatrodatos (Oct 23, 2011)

DEPREDADORX1:

Sera subir el programa porque hay casos en que falta librerias para ubicacion de registros, por otro lado vere si puedo subir otra tutoria de manejo de Glcd con los otros programas que conozco y el plugin de proton.


----------



## DEPREDADORX1 (Oct 24, 2011)

Muchas gracias por atender nuestras inquietudes y bueno, seguiremos expectantes ese material a ver si nos ponemos manos a la obra con algun proyecto especial con pantallas gráficas, a mi particularmente me interesa hacerme un velocímetro digital con algún tipo de animación bien colorida, ojalá y pueda materializarlo.

Hasta nuevo aviso.


----------



## Diogra (Oct 24, 2011)

hola amigos... soy estudiante de ing de telecomunicaciones y necesito ayuda con una practica de laboratorio, que se refiere a lo siguiente:
1.	Implementar un mecanismo para monitorear el ángulo de desplazamiento de una articulación usando como elemento transductor: a) un potenciómetro b) fibra óptica y opto-acoplador, muestre a través de una pantalla LCD la lectura del sensor y accione un servo-motor posicionándolo al ángulo leído (entre 0 – 180°), una mecanismo robótico equivalente al mecanismo sensor para reproducir sus movimientos.

 Yo he realizado la siguiente configuracion en proton pero no se porque no me corre en proteus...

Device 16F877
XTAL   20
ADCON1= $80
TRISA =$1
Declare LCD_DTPIN PORTD.4
Declare LCD_RSPIN PORTD.1
Declare LCD_EMPIN PORTD.2
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
DelayMS 150
Cls
Dim potenc As Word 
Dim POS As Word 
Dim ang As Byte
Dim a As Byte
Inicio:
potenc= ADIn 0
ang= LookDownL potenc,<[$002,$080,$0ff,$180,$200,$27f,$2ff,$37f,$3ff]
POS = LookUpL ang,[1000,1167,1250,1333,1500,1665,1750,1832,3000]
Servo PORTC.0 , POS
Print At 1,1, "servo motor"
Print At 2,1, HEX potenc
DelayMS 1000
GoTo Inicio


Si me pueden ayudar se lo estaria muy agradecida... Gracias...
y son excelentes las tutoriales he aprendido mucho


----------



## chapin (Oct 24, 2011)

que error es el que te muestra proteus. saludos


----------



## DEPREDADORX1 (Oct 25, 2011)

Hola Diogra,

Pues hice unas modificaciones para el lcd y aparentemente funciona, te tocaría mirar bien si lo que está haciendo es lo que requieres, de cualquier forma, aun sin ser expertos estamos en disposición de ayudarte en lo que podamos.

Aquí te adjunto lo que hice y mucha suerte con lo tuyo.


----------



## Diogra (Oct 26, 2011)

*Hola Depredador... Gracias por la ayuda.. falta algunas cosas y montarlo para defenderlo.. Gracias por la ayuda.... :-D *


----------



## ONOFRE (Nov 3, 2011)

hola a todos los del foro, si alguien pudiera ayudarme, el problema que tengo es el siguiente: estoy ralizando transmision y recepcion de datos por usb con proton ide y visual basic 6.0, pero solo logro realizar el envio de datos del visual al pic o solamente del pic a la pc, pero no logro ambas al mismo tiempo.


----------



## jpardo (Nov 19, 2011)

Si pudieran publicar algun artículo sobre  manejo de servomotores y sensores de ultrasonido empleados en robotica.  Interesante el tutorial. Gracias y Saludos.


----------



## Diogra (Nov 21, 2011)

Hola nuevamente chicos :-D Necesito ayuda para realizar un guante sensorizado para mover una pinza robotica, si tiene alguna informacion sobre como realizar el guante se lo agradeceria es que no se mucho como empezar esa parte ya el movimiento de la pinza robotica con motores servo lo tengo pero no se como realizar la parte del guante que por medio de sensores se mueva la pinza  si tienen algun tutorial o guia que me faciliten se los agradeceria mucho :-D


----------



## DEPREDADORX1 (Nov 21, 2011)

Hola Diogra,

Yo solo tengo esto como forma de entretenimiento para ratos de ocio, osea, no soy de los más apropiados para aconsejarte, de todos modos te expongo una idea de lo que posiblemente haría en mi caso, lo que haría es llevar la medida de unos potenciómetros (uno por cada mordaza de la pinza), otros para los giros, etc. Hacerlo con sensores, la verdad no sé cuáles serían para esto, swiches convencionales no servirían pues darían solo un 1 o 0 lógicos y lo que necesitas medir es una variable analógica como es el movimiento. En resumen, yo le adaptaría al guante unas pequeñas guayas o cables que lleguen a cada pot para hacerlos girar y les adaptaría unos resortes a los pot, al igual que los controles rc, para devolverlos a la posición original.  Bueno, esa es mi humilde opinión, esperemos que algún otro compañero del foro con mayor conocimiento pueda darte otra orientación al respecto.

Suerte... y si lo realizas pues...  compártelo


----------



## autotronico (Dic 3, 2011)

mecatrodatos dijo:


> PARTE 7.2 DEL TUTORIAL , para inquietudes , sugerencias , criticas , rechazos ..... desde este foro



He intentado realizar proyectos de GLCD con la tutoria, estoy con un lm35 para visualizar el valor en una GLCd esto es lo llego hasta el momento:



```
Device = 18F4550

Xtal = 20
'*****Aparametro ADC******
TRISA=%000001       '
ADCON1 = %10000010  
Adin_Res 10         
Adin_Tad FRC
Adin_Stime 50       '
Dim HAM_DEGER As Word
Dim VOLT As Float 
'*****asignacion GLCD******
LCD_DTPort = PORTB                
LCD_RSPin = PORTD.5                
LCD_ENPin = PORTD.1                
LCD_RWPin = PORTD.4               
LCD_CS1Pin = PORTD.2               
LCD_CS2Pin = PORTD.3              
LCD_Type =  GRAPHIC                
Internal_Font = On                 
Font_Addr = 0
GLCD_EXTERNAL_PRINT = PPRINT
Input PORTA.0
Dim raw As Word
Dim v As Float
Print Cls
Loop:
raw=ADIn 0
Print At 1,1,"Raw:", Dec4 raw
v=(5/1023)* raw
v=v*1000
Print At 2,1, Dec1 v ,"mv"
v=v/10 
Print At 2,9,"Tem:", Dec v ,"C"
DelayMS 2000
GoTo Loop
```

mi duda es que no he podido aplicar las fuentes de letra arial 12 y 8 al programa porque me da errores.


----------



## atricio (Dic 4, 2011)

ONOFRE dijo:


> hola a todos los del foro, si alguien pudiera ayudarme, el problema que tengo es el siguiente: estoy ralizando transmision y recepcion de datos por usb con proton ide y visual basic 6.0, pero solo logro realizar el envio de datos del visual al pic o solamente del pic a la pc, pero no logro ambas al mismo tiempo.



hola amigo no se si te han respondido busca en gogle la pagina de *micros y mas micros * es una pagina de un paisno ecuatoriano ahi hay ya realizada una aplicacion de lo que tu quieres


----------



## biker2k3 (Dic 9, 2011)

Hola gente tengo un pequeño problema no me anda el serin en un 12f683, osea el compilador me marca error y no me lo compila, alguien tiene algun ejemplo? el serout anda perfecto pero pongo serin y me marca error


----------



## DEPREDADORX1 (Dic 10, 2011)

Hola biker2k3,

Me parece que en las primeras páginas hay un proyecto de un barco rc que utiliza serin-serout pero con pic 16f877, funciona muy bien pues yo lo probé, te recomiendo que pruebes con otro pic para descartar que el problema fisico y sino, entonces coméntalo, recuerda también checar la ayuda de proton que trae muchos ejemplos.

Suerte.


----------



## biker2k3 (Dic 10, 2011)

DEPREDADORX1 dijo:


> Hola biker2k3,
> 
> Me parece que en las primeras páginas hay un proyecto de un barco rc que utiliza serin-serout pero con pic 16f877, funciona muy bien pues yo lo probé, te recomiendo que pruebes con otro pic para descartar que el problema fisico y sino, entonces coméntalo, recuerda también checar la ayuda de proton que trae muchos ejemplos.
> 
> Suerte.



Gracias voy a probar, pasa que intente todo y no puede ser problema fisico porque no puedo ni sikiera compilarlo


----------



## biker2k3 (Dic 23, 2011)

Ya lo resolvi, no lo habia configurado para que use oscilador interno. Ahora tengo otra pregunta me podrian explicar para que sirve esto

    Declare Dead_Code_Remove = On                   ' Some extra Optimisation
    Declare Optimiser_Level = 1                 'Vi que esto lo ponen a 1,3 o 6
    Int_Sub_Start
    Int_Sub_End




Yo tengo un programa con las interrupciones asi...

GoTo INITIALIZE

On_Hardware_Interrupt GoTo Interrupcion       ' Interrupción por Hardware (es la más rápida)
;############### INTERRUPT CODE ##################
Disable;
Interrupcion:
Context Save
If INTCON.2 = 1 Then   ;#########   TIMER   #########

;...Codigo para ejecutar cuando salta el timer...

  Resume
EndIf

If INTCON.1 = 1 Then   ;######## PULSO EN RB0 ########
; ...Codigo cuando detecto pulso en RB0
Resume
                  ;****** Fin de Interrupcion ***********
Context Restore
Enable
;############## REGISTROS ####################
INITIALIZE:


----------



## agustin280 (Ene 7, 2012)

hola que tal soy nuevo en este foro, mi nombre es AGUSTIN NIEVA estudiante de ING.ELECTRONICA, tengo una duda no se si me puedan ayudar, tengo en mente realizar un proyecto con un GLCD de 128x64, mas un panel touch para dicho GLCD, la duda es para saber si se puede manipular el panel touch con PROTON IDE??? si es asi alguien podria decirme como hacer un pequeño ejemplo???, cabe mencionar que he progrmado microcontroladores con pic basic pro, ya que ese lenguaje me parecio muy amigable, pero cuando busque infromacion para saber si se podia manipular un GLCD con PBP, me desilucione al saber que no se podia y por eso ando en esa transicion de lenguaje de PBP a PROTON IDE, ya que este lenguaje igual se me ha hece amigable y similar a PBP,  lo que se hasta ahora es que si se puede manipular un GLCD con PROTON, pero no se si tambien el PANEL TOUCH, y si no se pudiera con PROTON alguien podria decirme con que otro lenguaje? que no sea C, CCS, mikroc, es que la verdad esos lenguajes me dan mucho dolar de cabeza.


----------



## atricio (Ene 7, 2012)

hola amigo mio la verdad se que si se puede hacer con proton en mi unniversidad si lo lograron pero la verdad me han contado que es un poco lioso...te recomiendo si quieres intentar mikrobasic compiler for pic o mikrobasic pro for pic es mas facil busca un libro que es de programacion en ese lenguaje de conexion electronica me parece que es la pagina ponlo en gogle pero ojala los amigos del foro si te puedan hechar una mano para hacerlo en proton asi aprendemos todos


----------



## agustin280 (Ene 7, 2012)

ok muchas grcias atricio, seguire buscando un lenguaje el cual pueda entender, y si seria agradable que en proton se pudiera hacer, la verdad tengo este proyecto, todo en PBP, encencialmente consiste en una comunicacion pic-pic, uno de los pic me leera la temperatura de un sensor LM35, y me la manda por comunicacion serial, ahora solo los micros se comunicacn con un solo cable, estoy por incorporar los modulos de RF para quitar ese cable y se haga una comunicasin simplex, bueno entonces ya que  el pic manda la temepratura hacia el otro pic, entocnes el pic receptor la lee y la muestra en un lcd de 16x2, de ahi hay un menu donde el usuario elige si desea un control on-off o brecha diferencial, selecionando el control deseado aparece otro sub-menu el cual establece los valore sde brehca diferencial o de control on-off, de ahi sale otro sub menu donde ya esta funcionando el control deseado, como salidas tengo 2 ledes, uno me representa  un calentador y el otro me representa un enfriador, esas salidas se activan dependiendo de la temperatura establecida. esencialmente eso es lo que hace mi proyecto, pero dada la necesidad de que en el LCD de 16x2 no alcanzan a verse todos los menus, por eso opte por el GLCD y para quitar los botones y mejor implementar un panel touch, creo que con el panel le daria una mejro vista al proyecto.
Espero y alguien mas pueda darme un ejemplo en proton, claro si es que se puede en proton.
 de antemano gracias colegas.


----------



## DEPREDADORX1 (Ene 12, 2012)

Saludos Agustin,

El tema parece bien interesante, habrá que esperar tus avances a ver si nos atrevemos a algo, estuve buscando algo sobre el tema aunque solo encontré algo básico pero en inglés, te paso el dato a ver si puedes indagar algo mas en este foro.

http://www.protonbasic.co.uk/showthread.php/58675-Touch-Screen-new-sample


----------



## agustin280 (Ene 16, 2012)

de antemano gracias por responder, la verdad he estado ocupado en otras asuntos, pero si ya me empeze a familiarizar con mikrobasic pro for pic, y ahora ando estudiendo un poco, se me ha complicado por asuntos que he tenido que atender, y ahora que regreso a claces me vere un poco mas limitado de tiempo, hasta ahora trato de emigrar mi proyecto a mikrobasic por for pic, tambien he encontrado un software llamado VISUAL GLCD de mikroelectronica, y de igual forma estoy estudiando dicho software, aunq no tengo la version completa, pues esta version qeu adquiri esta limitada.
bueno me despiedo, espero poder avanzar un poco en estas semenas proximas.


----------



## mendek (Ene 16, 2012)

que tal foro, bueno pues tengo una duda con respecto al manejo de botones, lo que quiero hacer es mostrar en leds del puerto b del pic16f887 los numeros bInarios del 0 a 255 cada que pulse un boton, pero mi problema es qu con pulsar el boton los numeros empiezan a cambiar rapidamente y si meto un delayms 500 y dejo pulsado en boton, cada medio segundo el led avanza.
lo que quiero es que cada que pulse el boton avanse un solo numero

Device = 16F887
XTAL=8
ALL_DIGITAL=1
'*********************************************
Symbol CONTADOR = PORTA.1
'*********************************************
Input   PORTA.1
Output  PORTB
Low PORTB
Dim X As Byte
'*********************************************
X=0
'*********************************************
INICIO:
If CONTADOR = 0 Then
delayms 500 'es lo que para mi no esta bien 
Next X
PORTB=X
EndIf
Goto INICIO


----------



## DEPREDADORX1 (Ene 17, 2012)

Hola mendek,

No sé si esto será lo que buscas, prueba de cualquier forma, este ejemplo está en el libro de pic basic pro de Carlos A. Reyes.

Suerte en tu aprendizaje y recuerda compartir tus avances en el foro.


----------



## ricbevi (Ene 17, 2012)

mendek dijo:


> que tal foro, bueno pues tengo una duda con respecto al manejo de botones, lo que quiero hacer es mostrar en leds del puerto b del pic16f887 los numeros bInarios del 0 a 255 cada que pulse un boton, pero mi problema es qu con pulsar el boton los numeros empiezan a cambiar rapidamente y si meto un delayms 500 y dejo pulsado en boton, cada medio segundo el led avanza.
> lo que quiero es que cada que pulse el boton avanse un solo numero
> 
> Device = 16F887
> ...



Hola...creo que lo que pretendes hacer es esto:
Device = 16F887
Xtal=8
All_Digital=1
'*********************************************
Symbol CONTADOR = PORTA.1
'*********************************************
Input PORTA.1
Output PORTB
Low PORTB
Dim X As Byte
'*********************************************
X=0
'*********************************************
INICIO:
           If CONTADOR = 0 Then ' se pulso el boton
                    DelayMS 50 ' espero
                  If CONTADOR = 0 Then GoTo INICIO 'espero hasta que suelte pulsador
                      X = X + 1  ' incremento la variable
               PORTB = X    ' mustro el resultado en el puerto
           EndIf  ' finaliza condicion inicial
           If X = 255 Then X = 0  ' si la variable tomo el valor maximo la limpio
           GoTo INICIO  ' repito ciclo

End

Saludos.

Ric.


----------



## mendek (Ene 17, 2012)

ok claro que funciono, bueno hay algo que me parese interesante y que yo no sabia, cuando escribes:
If CONTADOR = 0 Then GoTo INICIO
1.-ya no es nesesario poner el endif abajo??
2.-y cuando escribes If CONTADOR = 0 Then GoTo INICIO solo ejecuta  el goto inicio, es decir solo lo que esta a la derecha?


----------



## ricbevi (Ene 18, 2012)

mendek dijo:


> ok claro que funciono, bueno hay algo que me parese interesante y que yo no sabia, cuando escribes:
> If CONTADOR = 0 Then GoTo INICIO
> 1.-ya no es nesesario poner el endif abajo??
> 2.-y cuando escribes If CONTADOR = 0 Then GoTo INICIO solo ejecuta  el goto inicio, es decir solo lo que esta a la derecha?



Son dos condiciones anidadas una dentro de la otra y es necesario el Endif al final por que se refiere a la condición primera superior y la segunda comparación es a fin de esperar a que sueltes el pulsador ya que si paso la primera es porque se encuentra pulsado y solo si lo sueltas cambiara la condición y proseguirá con el programa con un pequeño retardo en el medio a fin de separar en el tiempo las comprobaciones y actuar de "anti-revote" .

Ric.


----------



## mendek (Ene 18, 2012)

ya aclarado esto, me surgio otra duda, e investigado en internet acerca de las subrutinas pero la mayoria de las explicaciones vienen en ensamblador y no le eniendo nada, lo que quiero hacer con un pic16f84a es que mientras esta ejecutando algo en primer plano ejecute otra cosa en segundo plano, es posible eston con proton ide?


----------



## atricio (Ene 18, 2012)

si es posible se llaman interrupciones en post anteriores revisa y estan ejemplos relativamente son mas faciles


----------



## Gerardoadrian (Ene 28, 2012)

amigo mecatrodatos esta muy buena tu tutorial pero hace falta 3 tutoriales ,me gustaría armar un libro con todo lo que estas subiendo a la pagina y me hace falta eso. te agradezco pronta respuesta


----------



## mendek (Ene 28, 2012)

hora otra duda, cuanto es lo maximo que puede sperar un pic en el delayms??
por que resulata que quiero que espere una hora y como a los 2 min empeza a actuar

lo que pongo en el codigo fuente es: delayms 3600000

y quisiera saber que es lo que hago mal.


----------



## atricio (Ene 29, 2012)

lo que yo estoy seguro si puede hacer eso el micro pero lo que yo hiciera es hacer un contador con señal de reloj desde una entrada del micro es decir contar el numero de pulsos de señal de reloj externa y cumplido esto hacer que haga la otra tarea que mencionas bueno eso es una idea nada mas no se si te sirva del todo o no o tambien puedes estructurar lo mismo pero con desborde de timer 0 o 1 con ello tendiras una rutina de retardo mas precisa en ejempls anteriores un amigo posteo un encoder el que usaba desbordamiento del timer y lo ocupo como temporizador


----------



## mendek (Ene 29, 2012)

listo pensandole un poco lo que hice fue esto:

for x=0 to 60
delayms 60000
next x

no se si me explique?

60000 x q es mas o menos lo maximo qu puede esperar (1min)


----------



## atricio (Ene 30, 2012)

ya probaste eso te funciona armalo y cuentas como te fue


----------



## ricbevi (Ene 31, 2012)

mendek dijo:


> listo pensandole un poco lo que hice fue esto:
> 
> for x=0 to 60
> delayms 60000
> ...



Hola nuevamente....... de la Help del Proton

*Syntax

DELAYMS Length 

Overview

Delay execution for length x milliseconds (ms). Delays may be up to 65535ms (65.535 seconds) long. *

Soporta una word de 16 bit o lo que es lo mismo 2 a la 16 = 65536( 0 a 65535)

La idea del For Next es correcta y es una de las formas de hacer esperas "largas"

Saludos.

Ric.


----------



## mendek (Ene 31, 2012)

atricio dijo:


> ya probaste eso te funciona armalo y cuentas como te fue



si, ya lo probe y aunque no es muy preciso del todo, mi trabajo no lo requeria asi que opte por dejarlo asi, pienso que no es preciso ya que los pulsos de reloj que se necesitan para ejecutar el for se van acumulando y esto hace que se tarde un poco mas de tiempo


----------



## electrobicho (Mar 5, 2012)

Disculpen las molestias, observando los hilos que dejan, vi que ponen el de unrobotica y descargue de ahí proton y seguí los pasos que se exponen para instalarlos, el problema es que no encuentro la carpeta de ayuda, si alguien sabe donde puedo descargar una versión que la traiga les estaría agradecido o si mejor aun me pasan la carpeta de samples de proton, en si quiero uno que trata de comunicación usb_cdc, pero igual me vendría de maravilla todos los ejemplos que proporciona proton al instalarce


----------



## D@rkbytes (Mar 7, 2012)

electrobicho dijo:


> Disculpen las molestias, observando los hilos que dejan, vi que ponen el de unrobotica y descargue de ahí proton y seguí los pasos que se exponen para instalarlos, el problema es que no encuentro la carpeta de ayuda, si alguien sabe donde puedo descargar una versión que la traiga les estaría agradecido o si mejor aun me pasan la carpeta de samples de proton, en si quiero uno que trata de comunicación usb_cdc, pero igual me vendría de maravilla todos los ejemplos que proporciona proton al instalarce


Puede ser que tu instalación de Proton si tenga la carpeta de ayuda.
Lo que pasa es que no se instala dentro de la carpeta donde se instalo, sino en otra.
En mi caso por ejemplo se instala en C:\Documents and Settings\Darkbytes\PDS\Samples
Buscala en una carpeta de tu sistema que se parezca a la que te indique.
También cuando le doy Open al editor, inmediatamente me situa en la carpeta PDS.


----------



## biker2k3 (Mar 20, 2012)

Alguien tiene algun ejemplo para usar CPP o como podria hacer una transmicion serial pero modulada a 38khz para mandarla por infrarrojo? graciass 

ME estoy volviendo loco buscando ejemplos y no puedo hacer andar el CPP para ke module, la parte del serial y eso esta echo ya. Si no me sale eso podria usar interrupciones comunes pero no se si me cortaran la transmision serial.


----------



## electrobicho (Mar 22, 2012)

Tienes la carpeta de ejemplos en proton? ahí deben de venir algunos, aunque debo decirte que de igual manera estoy intentando manejar pwm y protocolo RC5 en mi caso, use el ejemplo que viene en los documentos de proton(el pdf) pero no me funciona, que avances tienes?


----------



## miborbolla (Mar 23, 2012)

atricio dijo:


> hola amigos como estan un favor alguien sabe como usar el bootloader de los micros 18f2550 y el 18f4550 en PROTON IDE he leido un poco sobre esto y segun mire se puede cargar al micro por esta herramienta un nuevo programa sin necesidad de un grabador es verdad eso o no????? les agradezco la ayuda desde ya muchas gracias



Claro que se puede acá te dejo un link de un pequeño tutorial que hice y deje en otro foro, si te interesa puedes leerlo.







Por supuesto lo comparto también aquí, para quien le pueda servir.

Saludos y si hay comentarios, estaré atento por si puedo ayudar.


----------



## electrobicho (Mar 23, 2012)

Interesante, yo tengo una tarjeta con bootloader igual, pero desgraciadamente no encontré cristal de 48 MHz, igual cuando hago comunicación USB uso uno de 20 MHz, e ajustado PLL pero nada, la comunicación con el cristal de 20 como es de suponerse es ligeramente mas lenta, igualmente en modo HID como en tu caso, nada comlejo por ahora, solo servomotores y leds, saludos


----------



## miborbolla (Mar 26, 2012)

electrobicho dijo:


> Interesante, yo tengo una tarjeta con bootloader igual, pero desgraciadamente no encontré cristal de 48 MHz, igual cuando hago comunicación USB uso uno de 20 MHz, e ajustado PLL pero nada, la comunicación con el cristal de 20 como es de suponerse es ligeramente mas lenta, igualmente en modo HID como en tu caso, nada comlejo por ahora, solo servomotores y leds, saludos


 
Hola electrobicho, te comento que yo uso un cristal de 20 mhz (fisicamente) , pero derivado de la implantacion del bootloader de microchip el microcontrolador queda configurado a 48 mhz, y asi es como programo mis aplicaciones en este caso el "proton " le dejo asignado que uso un cirstal de 48 mhz.


Saludos


----------



## electrobicho (Mar 27, 2012)

miborbolla has utilizado la comunicación CDC con proton? En modo HID e hecho algunos bichos pero me gustaría probar este método que al igual lo usan normalmente en C, por que por BULK desconozco que se se pueda ralizar, Saludos de Oaxaca, México


----------



## miborbolla (Mar 27, 2012)

electrobicho dijo:


> miborbolla has utilizado la comunicación CDC con proton? En modo HID e hecho algunos bichos pero me gustaría probar este método que al igual lo usan normalmente en C, por que por BULK desconozco que se se pueda ralizar, Saludos de Oaxaca, México



Para ser directo, solo he utilizado hasta ahora los ejemplos propios del Proton, sin modificar mucho, pero de ahí a producir mi propia interface o dicho de otra forma, que pueda hacer desde ceros mi configuración personalizada, simplemente no lo he logrado. Así que disto mucho de poder presumir que la he utilizado a placer. 

Pero en esto estoy y cuando tenga un control total de la situación les compartiré el como y los porqués, de todos los archivos de configuración involucrados en la comunicación que comentamos.

Recibe un cordial saludo desde el Defectuoso (ciudad de México)


----------



## electrobicho (Mar 28, 2012)

Desgraciadamente yo no tengo la carpeta de ayuda de proton, serías tan amable de proporcionarla? desconozco el motivo del por que y la necesito para ver como usar los pic 16f88X ya que al migrar códigos útiles de los 87X a  estos no me funcionan, posiblemente ahí logre ver algunos ejemplos para usarlos adecuadamente, saludos


----------



## miborbolla (Mar 28, 2012)

electrobicho dijo:


> Desgraciadamente yo no tengo la carpeta de ayuda de proton, serías tan amable de proporcionarla? desconozco el motivo del por que y la necesito para ver como usar los pic 16f88X ya que al migrar códigos útiles de los 87X a  estos no me funcionan, posiblemente ahí logre ver algunos ejemplos para usarlos adecuadamente, saludos



Te mande un mensaje privado, para que tengas los ejemplos....Saludos


----------



## electrobicho (Mar 28, 2012)

En CCS hay una carpeta que se llama ejemplos, proton lo tiene igual? o de donde salen los ejemplos, que ye vienen hechos por default, saludos


----------



## miborbolla (Mar 28, 2012)

electrobicho dijo:


> En CCS hay una carpeta que se llama ejemplos, proton lo tiene igual? o de donde salen los ejemplos, que ye vienen hechos por default, saludos



Cuando se instala el proton ide, te genera una carpeta de usuario "PDS" dentro de "mis documentos", dentro de la cual existen a su vez, tres subcarpetas que son:

LIBRARY
SAMPLES
USER

Dentro de la carpeta de samples encontraras todos los ejemplos.

Así que si utilizas un portable o algo asi del Proton ide, no encontraras esta carpeta que te genera la instalación completa.


----------



## electrobicho (Mar 28, 2012)

Pues no me genero esa carpeta ya le di buscar por todos lados y nada, si hay algun alma caritativa que me pase esa carpeta se lo agradecería mucho, le di buscar en mi disco C y no encuentra, solo los samples de CCS y Pic basic



Ya lo encontre jeje, se instalo en otra dirección ,saludos y gracias


----------



## carptroya (Abr 12, 2012)

alguno teneis un ejemplo de de pwm con el 16f88 por hardware..

con el 876 lo configuro bien, pero se resiste con el 88...........gracias


----------



## electrobicho (Abr 12, 2012)

Yo aún no uso pwm, es el hpwm? o a cual te refieres, si no es molestia podrías mostrar tu código?


----------



## carptroya (Abr 13, 2012)

Si me refiero al pwm por harwere(hpwm), o lo que es lo mismo utilizar el modulo pwm que tiene el 16f88.

Para hacerlo por harw en el 876 solo hay que decirle que active los modulos del micro en este caso tiene dos CCP1 y CCP2 y que genere el PWM con la sentencia HPWM.
*Device*=*16F876     *
*Xtal *4
_'_
_  '_
_  '_
_'  configuracion LCD_
_  '_
_  '   _
*LCD_Type *= 0                 _' LCD alfanumerica tipica_

*LCD_DTPin *= PORTB.4         _' datos PORTB.4,5,6,7_

*LCD_RSPin *= PORTB.1        _' LCD RS pin_
*LCD_ENPin *= PORTB.3        _' LCD EN pin_
*LCD_Interface *= 4           _'  4-bit LCD _
*LCD_Lines *= 2               _'  2-Line LCD_
_'_
_    '_
_    '_
_    '_
_    '_

*Declare **CCP1_Pin  *PORTC.2   _'activar ccp1 PWM por harwere_
*Declare **CCP2_Pin *PORTC.1     _'activar ccp2 PWM por harwere_


*Declare **Adin_Res *8 _'resultado de 8-bit  _

*Declare **Adin_Tad *FRC _'OSC interno elegido _

*Declare **Adin_Stime *100 

TRISC = 1       _'_
TRISB = 0         _'poner puerto b salida_
TRISA =00000111         _' Configure AN0 y AN1(PORTA.0 y PORTA.1) entrada_
ADCON1.7 =0             _'sin justificacion un solo registro_

_'_
_ '_
_ ' variables_
_ '_


*Dim *b *As Byte*
* Dim *c *As Byte*
* Dim *pulsa_1 *As Byte*
* Dim *pulsa_11 *As Byte*
* Dim *pulsa_2 *As Byte*
* Dim *pulsa_22 *As Byte*
* Dim *x *As Word*


_' PROGRAMA_
_ '_
_ '_

 inicio:



 b =*ADIn *0 _'coloca la conversión en la variable   b_
*DelayUS *3
 c=*ADIn *1   _'coloca la conversión en la variable c_
*DelayUS *3

  x=*ADIn *2

 x=x*300  
*HPWM *1,b,x
*HPWM *2,c,x+1000
*If *PORTC.0=1 *Then *pulsa_1=0
*If *PORTC.0=0 *Then *pulsa_1=1
PORTC.4=pulsa_1
_' b=11_
_' c=22_
*Print At *2,1,"dato ",*Dec3 *b,"-",*Dec3 *c
*DelayMS *100
_' Print At 2,1,"dato ","   ","-","   "_
*GoTo *inicio



Con el 88 si lo configuro igual NO me funciona.

Si utilizo este ejemplo si que funciona:

_' Demonstrate Hardware PWM_
_' Output a 1KHz signal with duty cycle sweeping from 20% to 80% once per second_

*Device **16F88*
*Declare **Xtal *4

*Dim *Duty *As Word        *_' Duty cycle value (CCPR1L:CCP1CON<5:4>)_

TRISB.0 = 0             _' Set PORTC.2 (CCP1) to output_
CCP1CON = %00001100     _' Set CCP1 to PWM_
T2CON = %00000101       _' Turn on Timer2, Prescale=4_
PR2 = 249               _' Set PR2 to get 1KHz out_
    Duty = 200              _' Set duty cycle to 20%_
Loop:
CCP1CON.4 = Duty.0      _' Store duty to registers as_
CCP1CON.5 = Duty.1      _' a 10-bit word_
CCPR1L = Duty >> 2
    Duty = Duty + 10        _' Increase duty cycle_
*DelayMS *17              _' Delayms 1/60 of second_
*If *Duty < 800 *Then *Loop _' Do it again unless 80% duty cycle_
    Duty = 200              _' Reset to 20% duty cycle_
*GoTo *Loop               _' Do it forever_

Pero me gustaría hacerlo con el HPWM y no tener que configurar tantos registros.


----------



## mendek (Abr 13, 2012)

rayos!, por mas que veo las rutinas para hacer funcionar un servo en proton no entiendo, existen algunas cosas que mas de uno no sabemos para que son, espero alguien pueda hacer un pequeño tutorial para enseñarnos como se hace desde ya muchas gracias, seguire investigando


----------



## electrobicho (Abr 14, 2012)

tengo un pic de estos en mi caja de recuerdos, le echare mano para ver si logro conseguir algo, aunque soy nuevo en proton, por cierto visita mi blog haber que te parece www.protonbasic.wordpress.com desde que empece con proton decidí hacer el mismo


----------



## biker2k3 (Abr 16, 2012)

Te paso el pedasito de codigo que use para generar una portadora de 38Khz 50% Duty con un 12f683

TRISIO.2 = 0 ' CCP1 (GPIO.2 = Output)
PR2 = 25 ' Set PWM Period for approx 38KHz
CCPR1L = 13 ' Set PWM Duty-Cycle to 50% 
CCP1CON = %00001100 ' Mode select = PWM
T2CON = %00000100 ' Timer2 ON + 1:1 prescfale


----------



## dabopeyton (Abr 26, 2012)

buenos dias amigos, necesito ayuda o consejos con respecto a que estoy realizando una caminadora con control de pulsación cardíaca, necesito saber que comando puedo utilizar para ir variando la velocidad del motor dependiendo a las pulsaciones que tenga a la entrada. un ejemplo: si en la entrada tengo 120 pulsaciones por min necesito que el motor baje su velocidad.
y necesito hacer por lo menos 4 velocidades. si tienen algun ejemplo mejor. espero su ayuda.


----------



## DEPREDADORX1 (Abr 26, 2012)

Hola dabopeyton,

Yo no soy el idóneo para responderte, es interesante lo que haces, pues he visto aquí mismo en el foro como toman una señal, por ejemplo de un potenciómetro, y la montan en pwm.  Será posible hacer lo mismo con la orden count que me imagino estás utilizando en el proyecto, es solo una sugerencia, esperemos que otros foreros puedan asesorarte mejor.

Suerte.


----------



## dabopeyton (Abr 26, 2012)

DEPREDADORX1 dijo:


> Hola dabopeyton,
> 
> Yo no soy el idóneo para responderte, es interesante lo que haces, pues he visto aquí mismo en el foro como toman una señal, por ejemplo de un potenciómetro, y la montan en pwm.  Será posible hacer lo mismo con la orden count que me imagino estás utilizando en el proyecto, es solo una sugerencia, esperemos que otros foreros puedan asesorarte mejor.
> 
> Suerte.



Hola Amigo DEPREDADORX1, me puedes dar un ejemplo o ubicar el link del ejemplo que me dices, para ver si puedo adaptarcelo a lo que quiero. ya que me interesa ir avanzando con el proyecto. gracias de ante mano.


----------



## DEPREDADORX1 (Abr 27, 2012)

Hola dabopeyton,

Este ejemplo es del proyecto trabuquito, del forero captroya, tendrías que adaptarlo a tus necesidades, eliminar lo del rf y probar con Count,  en este ejemplo se toma la señal recibida y se monta para controlar dos motores con los modulos pwm del pic que direccionan un pequeño barco a radiocontrol.


```
Device=16F876     
                  Xtal 4
     
   TRISC =%11000000       'poner el puerto c como salida  
   TRISB = 0         'poner puerto b salida

'Declare	Serial_Baud = 9600
'Declare	Rsout_Pin = PORTC.6
'Declare	Rsout_Mode = TRUE
'Declare	Rsout_Pace = 1
'Declare	Rsin_Pin = PORTC.7
'Declare	Rsin_Mode = TRUE


Declare	Hserial_Baud = 9600				' Set baud rate to 9600
Declare	Hserial_RCSTA = %10010000       ' Enable serial port and continuous receive
Declare	Hserial_TXSTA = %00100100       ' Enable transmit and asynchronous mode
Declare	Hserial_Clear = On	
 
Declare CCP1_Pin  PORTC.2   'activar ccp1 PWM por harwere
Declare CCP2_Pin PORTC.1     'activar ccp2 PWM por harwere

TRISA =00000000         ' Configure AN0 (PORTA.0) entrada

 Dim b As Word
 Dim c As Byte
Dim d As Byte
 Dim e As Byte
  Dim f As Byte
   Dim g As Byte
 Dim alto As Byte
 Dim centro As Byte
 Dim bajo As Byte
 
 inicio:
 HSerIn  [b,c] 
 HPWM 1,b,500
 HPWM 2,c,500
 
 GoTo inicio
```


----------



## fernandoae (Abr 28, 2012)

Que tal gente? estoy construyendo un dimmer para un proyecto de domótica, ya tengo todo funcionando, pero se me ocurrio que para evitar cableados los dimmers sean por infrarrojos con protocolo rc5 que ya esta incorporado en proton ide, el problema es que cuando entro a la interrupcion por segunda vez despues no se que pasa y ya no hace nada el dimmer. alguien sabe a que se debe? este es el código con el que estoy probando.

```
Device= 16F88
On_Interrupt GoTo INTERRUPCION

@CONFIG_REQ
@__CONFIG _CONFIG1, CP_OFF & CCP1_RB0 & DEBUG_OFF & WRT_PROTECT_OFF & CPD_OFF & LVP_OFF & BODEN_OFF & MCLR_OFF & PWRTE_ON & WDT_OFF & INTRC_IO 
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF
 
Xtal 8
All_Digital= true
PortB_Pullups = true

TRISA.0 = 1
TRISB.0 = 1

OSCCON.6 = 1
OSCCON.5 = 1
OSCCON.4 = 1

Symbol GIE = INTCON.7
Symbol INT0IE = INTCON.4
Symbol INT0IF = INTCON.1
Symbol INTEDGE=OPTION_REG.6

Dim paso As Byte
Dim brillo As Byte

INTCON = 0 
DelayUS 500
GIE=0
INT0IF=0
INTEDGE=0
INT0IE=1
GIE=1

GoTo INICIO

INTERRUPCION:

While GIE=1                             ' make sure to disable the Global interrupt
GIE=0                                      ' Disable Global interrupt
Wend

If INT0IF = 1 Then
High PORTA.1
DelayMS 1500
Low PORTA.1
DelayMS 1500

INT0IF = 0
EndIf
Set GIE
Context Restore
Return

' esto es para ver si el return no funciona y sigue desde acá
DelayMS 2500
High PORTA.1
DelayMS 2500
Low PORTA.1

INICIO:

For brillo = 0 To 9 
GoSub DIMMER
Next brillo

For brillo = 9 To 0 Step -1
GoSub DIMMER
Next brillo
 
GoTo INICIO

DIMMER:

For paso = 0 To 20
DelayMS brillo
High PORTA.1
DelayUS 10
Low PORTA.1

While PORTA.0 = 1
Wend

DelayMS brillo
High PORTA.1
DelayUS 10
Low PORTA.1
 
While PORTA.0 = 0
Wend
Next paso
Return
```


----------



## biker2k3 (Abr 28, 2012)

Hola tengo un simple problema que no puedo resolver, hice un control remoto pero necesito poner a dormir el pic 12f683 y no pude hacerlo andar, elprograma anda perfecto esta todo temrinado solo necesito que se duerma y se active cuando aprete algun boton, si pueden darme una mano se los agradeceria.



> ;Asi consume 0.41mA y la CR2032 es de 240mA, duraria 24 días.
> 
> Device 12F683
> Config INTRC_OSC_NOCLKOUT,WDT_OFF,MCLRE_OFF,CP_Off,PWRTE_ON
> ...


----------



## DEPREDADORX1 (Abr 29, 2012)

Hola,

Estoy probando el código del dimmer y no me arroja ningún error, parece funcionar bien,  esperemos que algun expert pueda echarle una ojeada a ver si encuentra el error. 


Suerte.


----------



## J2C (Abr 29, 2012)

Biker2k3

Como respondi a tu pregunta en el post *#2023* del thread del *PicBasicPro* (https://www.forosdeelectronica.com/posts/646607/) el *Proton+* necesita que le indiques el tamaño del SLEEP en segundos permitiendo solo un máximo de 65535 (poco más de 18 hs).

También te recomende que lo usaras directamente en ASM desde tu programa de Proton asi:


```
ASM
SLEEP
ENDASM
```
 
Ya que ahi lo pone realmente a dormir hasta que lo vuelvan a despertar.

En ese post te pase un link de un manual del *Proton+* que dice otra cosa con respecto al SLEEP. 


El µControlador al entrar en el modo Sleep debe quedar consumiendo mucho menos de 100 µA salvando las corrientes que malgastes con PullUp's/PullDown's para lo cual debes analizar la necesidad o el re-diseño de las mismas.



Saludos, JuanKa.-

P.D.: Para que te puedan ayudar mejor pon también el circuito que quieres usar, así será mas sencillo hacerte recomendaciones.-


----------



## fernandoae (Abr 29, 2012)

La verdad que parece ser algún error del Proton, porque hay veces que entra 3-4-5 veces bien en la interrupción y despues se queda apagado... es mas, hice un código en pic simulator ide que hace lo mismo y funciona bien...
Está bien la parte donde se sale de la interrupción?


----------



## DEPREDADORX1 (Abr 29, 2012)

Que tal fernandoae,

Pues no pude probar en proteus con el f88, traté de agregar una parte del codigo a una interrupcion por puerto b.0 de un 16f877 y dejó de funcionar de inmediato, no me deja trabajar con esos ciclos for, quizás sea más fácil con pwm.


----------



## fernandoae (Abr 29, 2012)

El tema es que el pwm no sirve en este caso porque estamos trabajando con altena y triacs, por eso se usa el control de fase, que consiste en detectar cuando la señal pasa por cero volts, esperar un tiempo determinado y disparar el triac, por eso si o si tiene que ser asi 

Yo al principio crei que era el pic, pero despues lo simulé en proteus (no me gusta usar simuladores ) y pasaba lo mismo... ya vamos a ver que puede ser, estoy viendo de conseguir una version nueva del compilador.


----------



## biker2k3 (Abr 30, 2012)

Hola J2C te respondi en el otro foro hace un rato_ https://www.forosdeelectronica.com/posts/648361/ _

Ahora para facilitar las cosas necesitaria algun ejemplo en proton de un 12f683 que se ponga en sleep y se despierte cuando cambie de estado alguna entrada. Ya con eso lo iria modificando para adaptarlo a mi programa. 

Intente hacer eso solo y tampoco me funciona, el pic se duerme y no se despierta por nada del mundo. gracias


----------



## jcasanova120 (May 12, 2012)

Hola, tengo un problema con mi programa, en proteus ya lo simule y si funciona pero a la hora de hacerlo en fisico no funciona, estoy utilizando un pic16f887, tal vez pienso que no active el oscilador interno en la programacion del proton, esa es mi duda como se programa la activacion del oscilador interno a 8mhz??? gracias


----------



## D@rkbytes (May 13, 2012)

jcasanova120 dijo:


> Hola, tengo un problema con mi programa, en proteus ya lo simule y si funciona pero a la hora de hacerlo en fisico no funciona, estoy utilizando un pic16f887, tal vez pienso que no active el oscilador interno en la programacion del proton, esa es mi duda como se programa la activacion del oscilador interno a 8mhz??? gracias


Saludos jcasanova120
Ve si este código de configuración en Proton te funciona fuera del simulador.

```
Device = 16F887             ; Microcontrolador seleccionado
Xtal = 8                    ; Cálculos del programa basados en 8MHz.
                                                                   
; Palabra de configuración (Fuses)                                                                 
Config1 INTRC_OSC_NOCLKOUT,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,WDT_OFF,FCMEN_ON,IESO_OFF,LVP_OFF,BOR_OFF
Config2 WRT_OFF,BOR21V
                                                                   
ANSEL   = 0                 ; Puerto A como digital
ANSELH  = 0                 ; Puerto B como digital
; Para esta configuración, ver Data Sheet. Pagina 64
OSCCON  = $74               ; %01110100    Configurar el registro OSCCON a 8MHz estable.
```
Suerte y hasta luego.


----------



## jcasanova120 (May 13, 2012)

Darkbytes, ya funciono mi circuito en fisico, tu programacion que me diste funciono a la perfeccion en conjunto con lo que planeaba hacer, te agradezco mucho, Gracias, me has salvado mi proyecto.


----------



## patariki (May 20, 2012)

Hola, he estado leyendo todos los mensajes y comentarios y veo que manejan la programacion de pics a un nivel que yo no llego. He estado tonteando encendiendo leds y jugando con pulsadores con un 16F876A. Hace unos dias intenté manejar el encendido de 8 leds conectados al puertoB con el giro de un potenciometro de 10K, pero no funcionó. El resultado es que parecen encenderse de manera aleatoria y cuando giro el pote no cambian. ¿alguien podria ayudarme? gracias


----------



## biker2k3 (May 20, 2012)

patariki dijo:


> Hola, he estado leyendo todos los mensajes y comentarios y veo que manejan la programacion de pics a un nivel que yo no llego. He estado tonteando encendiendo leds y jugando con pulsadores con un 16F876A. Hace unos dias intenté manejar el encendido de 8 leds conectados al puertoB con el giro de un potenciometro de 10K, pero no funcionó. El resultado es que parecen encenderse de manera aleatoria y cuando giro el pote no cambian. ¿alguien podria ayudarme? gracias



Tendrias que postear el programa para que te podamos ayudar. Y como conectaste el pote.


----------



## D@rkbytes (May 20, 2012)

patariki dijo:


> Hola, he estado leyendo todos los mensajes y comentarios y veo que manejan la programacion de pics a un nivel que yo no llego. He estado tonteando encendiendo leds y jugando con pulsadores con un 16F876A. Hace unos dias intenté manejar el encendido de 8 leds conectados al puertoB con el giro de un potenciometro de 10K, pero no funcionó. El resultado es que parecen encenderse de manera aleatoria y cuando giro el pote no cambian. ¿alguien podria ayudarme? gracias


Saludos patariki
Te adjunto dos ejemplos para Proton IDE.
Uno usando la instrucción Pot y otro usando el ADC del PIC16F876A
El ejemplo para usar el conversor analógico a digital, puede ser para cualquier otro PIC con ADC
En ambos ejemplos utilize un LCD 16x2 basado en el controlador Hitachi HD44780
Pero solo fue para leer los valores, así que puedes omitir las instrucciones para el LCD

Espero te sirvan. 

Suerte y hasta luego.


----------



## patariki (May 21, 2012)

Muchas gracias Darkbytes! voy a probar las dos opciones que me enviaste, en caso de tener problemas posteo el programa y el esquema que estoy probando. Saludos!


----------



## DEPREDADORX1 (May 30, 2012)

Saludos a todos,

Me gustaría implementar un velocimetro digital con pantalla grafica y he estado probando pero... como que los tiempos no coinciden con la realidad usando *Counter* y tampoco lo logré con la interrupción por B0 , me gustaría saber si alguien ya lo hizo con buenos resultados, adjunto aquí lo que he hecho y espero que algun forero me pueda colaborar con alguna idea.

Suerte y gracias.


----------



## carptroya (Jun 2, 2012)

Hola, aunque con el glcd aun no lo utilizo (lcd, si), veo en tu código con no multiplicas por 60 la variable FLT, para que te diese las rpm, ya que solo cuentas un solo segundo.

Saludos


----------



## DEPREDADORX1 (Jun 3, 2012)

Hola carptroya,

Yo lo que hago es multiplicar las vueltas que da la rueda cada segundo por el diámetro de la misma, supongo que debe funcionar bien, ese dato lo paso después a kilometros x hora, la cuestión es que me gustaría que el incremento se visualizara de forma creciente o decreciente al igual que sucede con un velocímetro de aguja o análogo, aunque también vi uno con displeys pero con código en assembler y se veía lo más de bien, en fin, le seguiré dando a ver que me resulta pues estoy bien interesado en implementarlo.


----------



## carptroya (Jun 4, 2012)

Ahora ya te entendí…… quieres que por un lado te de las rpm del motor y velocidad del vehículo.
Rpm = 1 segundo * 60 
Velocidad = numero de vueltas *longitud de la rueda

Igual algún compañero te da una solución más fácil, pero yo lo simularía de esta forma:
Pondría un micro para generar una frecuencia variable. Con tu micro leería los pulsos y aplicaría las dos formulas.


----------



## DEPREDADORX1 (Jun 4, 2012)

Si claro, esa es la idea, no quisiera tener que agregarle más al circuito porlo que lo voy a dejar así sencillo, ya estuve checando unos ejemplos que encontré en http://www.electro-tech-online.com/microcontrollers/ y todos utilizan counter, estonces supongo que así debe servir, yo lo que cuestionaba era la precisión en el dato porque es lo vi que era crítico en ccs y assembler, parece que todo eso es nulo con proton, en fin, hasta no montarlo en la moto y confrontar con el velocímetro analógico no estaré tranquilo, de momento trataré de hacer una barra indicadora que acompañe el dato creciente o decreciente de la velocidad, para que se vea más llamativo y dinámico.

Suerte y gracias por opinar.


----------



## carptroya (Jun 4, 2012)

Igual me explique mal, el micro para que hiciera la frecuencia variable, era solo para simularlo en la realidad no se utilizaría.
Se quedaría tal cual tú lo pusiste.

Yo para mi barco utilizo el counter para ver las rpm de los motores.

Saludos


----------



## DEPREDADORX1 (Jun 4, 2012)

Ah... ya veo, no hay problema, pues si te funciona bien entonces no hay problema con los tiempos de ejecución de las instrucciones, etc, es lo que veo que comentan con otros lenguajes y para lo que le tiran una cantidad de formulas que me parecen tediosas por lo que pensaba desistir del proyecto, ahora entonces me interesa más que los datos fluyan naturalmente de forma ascendente y descendente segun corresponda, también trataré de agregarle cualquier otro detallito.

De nuevo gracias por tu aporte carptroya y sigo atento a las opiniones.


----------



## miborbolla (Jun 6, 2012)

Hola compañeros, aunque ya lei y relei lo que se indica aqui con respecto al uso del CDCDESC.Inc en proton ide, no puedo hacer que me funcione como corresponde la comunicacion entre la pc y el microcontrolador,  dejo mi codigo que utilizo hasta abajo, de primera instancia lo unico que quiero lograr es que en el hyperterminal de windows pueda recibir los caracteres de la variable "buffer".

-Todo se compila OK,

-El microcontrolador es reconocido por windows, instalo el driver y me reporta el puerto COM6 (en mi caso)

-El microntrolador al parecer esta funcionando y enviando el "buffer" hacia la pc, ya que si observan mi rutina, enciendo/apago un led cada segundo y reenvio el "buffer" de nuevo.

Sin embargo desde windows simpre me dice que el COM6 no esta disponible o se encuentra en uso. 

Y ese es mi problema, ya no se me ocurre que hacer.

Tengo windows 7 de 32 bits, utilizo proton 3.5.2.7. 

también conecte el microcontrolador a otro equipo con windows XP y me ocurre exactamente lo mismo; es reconocido, pide el driver, asigna el puerto COMx, pero al momento de quererle utilizar con hyperterminal o el "serial comunicator" del propio proton, me manda el mismo mensaje de que el puerto comx no esta disponible o se encuentra en uso.


Aqui el codigo:


```
'****************************************************************
'*  Name    : USBSERIE.BAS                                      *
'*  Author  : Miguel Angel Borbolla Bonomi                      *
'*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
'*          : All Rights Reserved                               *
'*  Date    : 01/06/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   : SE INTENTA COMUNICACION SERIAL VIA USB            *
'*          :                                                   *
'****************************************************************
Device = 18F2550 

Xtal = 48 

USB_Descriptor = "CDCDESC.INC" ' Carga el descriptor de la clase CDC (Puerto COM virtual)
    
    Dim PP0    As Byte System      ' Estado del USBPOLL.
    
    Dim Buffer As String * 20      ' Declaramos (sobradamente) un buffer de 20 bytes. (Max.=64 bytes)
 
    DelayMS 500                    ' Damos tiempo para inicializarse.
    
    Clear                          ' Pone a cero toda la memoria RAM del PIC antes de comenzar.
     
    Repeat                         
          USBPoll                  ' El PIC espera hasta enlazar con el PC a través del USB.
    Until PP0 = 6


Symbol LED1 PORTB.0                ' hacemos un alias del portb.0 donde tenemos un led conectado




Inicio:
    
        Buffer = "VIVO "    ' llena la variable buffer con la cadena "Vivo "
                                  
        Repe:
        USBOut 3, Buffer, 5, Repe ' Envía la cadena de 5 bytes (ASCII correspondiente a los números)
                                  ' al PC a través del USB.
    
    High LED1            'encendemos/apagamos el led, simplemente para ver que esta pasando por aqui el programa
        DelayMS 1000     
    Low LED1
        DelayMS 1000
        
   GoTo Inicio
```


----------



## electrobicho (Jun 6, 2012)

Miborbolla, a mi me sucede lo mismo, pero me asigna el puerto 20, igualmente no se a que velocidad transmite los datos, espero que alguien nos ayude con esto, mi intención es usar este tipo de comunicación para usar otro software en la PC que no se hecho en Visual Basic, Delphi o Visual C, que son los de HID, Saludos


----------



## miborbolla (Jun 6, 2012)

electrobicho dijo:


> Miborbolla, a mi me sucede lo mismo, pero me asigna el puerto 20, igualmente no se a que velocidad transmite los datos, espero que alguien nos ayude con esto, mi intención es usar este tipo de comunicación para usar otro software en la PC que no se hecho en Visual Basic, Delphi o Visual C, que son los de HID, Saludos



Yo también quiero eliminar para siempre los max232 de mis proyectos y aprovechar el usb, por lo pronto en la comunicación CDC (serial sobre usb), pero nada mas no lo logro. 

Es mas me conformo por el momento de que alguien se apiade de uno, y nos preste un  .HEX funcionando, para estar 100% seguros y saber donde tenemos el problema, a mi me suena que sea en el lado de de Windows, puesto que en el pic al parecer todo esta bien, incluso para estar seguros he metido el "bootloader" de microchip en mi hardware, y todo funciona perfectamente.

Ojala alguien nos de una ayuda al respecto. yo quiero ver en el hyperterminal, algo como "hello word", "estoy vivo" algo asi...y en el display LCD conectado al microcontrolador, "eco" de lo que tecleo en el hyperterminal....Helppp 

Saludos.


----------



## miborbolla (Jun 8, 2012)

Me contesto yo solo con respecto a la comunicación cdc sobre usb utilizando el proton IDE, ya que logre un primer "avance" sobre este tema, aquí dejo mi código, que bien sirve como primera prueba para los que estamos iniciando, lo único que hace es abrir el puerto: leer lo que se teclea y en el momento de presionar "enter", lo recibe el microcontrolador y regresa exactamente lo mismo a la computadora.

Yo personalmente utilizo el  programa del "serial comunicator" incluido en el proton, y no se requiere mas que compilar y grabar el .HEX en el microcontrolador.


```
'****************************************************************
'*  Name    : USBSERIE.BAS                                      *
'*  Author  : Miguel Angel Borbolla Bonomi                      *
'*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
'*          : All Rights Reserved                               *
'*  Date    : 01/06/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   : SE INTENTA COMUNICACION SERIAL VIA USB            *
'*          :                                                   *
'****************************************************************
Device = 18F2550 

Xtal = 48 

USB_Descriptor = "CDCDesc.INC" ' Carga el descriptor de la clase CDC (Puerto COM virtual)
    
    Dim PP0    As Byte System      ' VARIABLE QUE CONTIENE ESTADO del USBPOLL.
    
        
    Dim Buffer As String *20' Declaramos (sobradamente) un buffer de 20 bytes. (Max.=64 bytes)
    
   
      DelayMS 500                    ' Damos tiempo para inicializarse.
    
    Clear                          ' Pone a cero toda la memoria RAM del PIC antes de comenzar.

All_Digital = On


  Repeat
       USBPoll        ' EN ESTE BUCLE ESPERAMOS A QUE EL MICRO SEA RECONOCIDO POR WINDOWS
               Until PP0=6
    
Inicio:
   
           
       Repeat 
           USBIn 3, Buffer,Auto ' EN ESTE BUCLE SE LLENA EL BUFFER HASTA QUE DEMOS "ENTER"
                    Until STATUS.0 = 0' EN LA CONSOLA DE "serial comunicator"

                 
        Repeat              
            USBOut 3, Buffer,Auto ' EN ESTE BUCLE SE ENVIA EL BUFFER A LA CONSOLA DE "serial comunicator"
                    Until STATUS.0=0


   GoTo Inicio
```


Ojala sirva a los demás para comprobar que tanto el hardware como el software, funciona bien, ya después iremos investigando mas al respecto.

Las conclusiones que saco y de por que no me funcionaba el codigo que comparto mas arriba en otro post, es que se debe mantener un constante "monitoreo" del USBPOLL a no mas de cada 5US. Ya que si no se pierde la comunicacion.

Aquí dejo la nota obtenida del manual del propio proton:

Notes for 18F devices
The method used for USB on the 18F devices is a polled method, meaning that no interrupt is
working in the background. However, this does mean that either a USBpoll, USBin, or USBout
command needs to be executed approximately every 10ms for HID and 5ms for CDC or the
USB interface connection will be lost.

Saludos y buen dia


----------



## electrobicho (Jun 14, 2012)

Y como sabes a que velocidad envías los datos y a que puerto serial virtual, a mi me sale el 20 pero no pasa nada cuando entro al "emulador" que tiene proton "F4" creo que es para que salga, me sale error o puerto ocupado, leí por ahí también que se debe de usar un puerto menos, que no sobrepase a 10


----------



## Stefany9 (Jun 14, 2012)

Hola a todos, necesito ayuda urgente... estoy tratando de programar un pic 18F4550 para trabajar con un teclado matricial 4x3 y un LCD y me estoy guiando el en tutorial parte 6 que nos facilito mecatrodatos.... practicamente pongo igual y el el proteus me funciona a la perfección pero el rato de implementarlo en vivo... primero al querer quemar el programa el pickit2 me da una advertencia de que faltan palabras de configuración que se supone que son los fuses, buscando informacion he puesto varios fuses que creo son los necesarios pero no consigo que me salga ni un numero en el lcd, a veces me sale simbolos y otras veces no me sale nada, si alguien sabe que fuses debo poner se lo agradeceria mucho... ya llevo 3 dias intentandolo y nada... gracias de antemano


----------



## D@rkbytes (Jun 14, 2012)

Stefany9 dijo:


> Hola a todos, necesito ayuda urgente... estoy tratando de programar un pic 18F4550 para trabajar con un teclado matricial 4x3 y un LCD y me estoy guiando el en tutorial parte 6 que nos facilito mecatrodatos.... practicamente pongo igual y el el proteus me funciona a la perfección pero el rato de implementarlo en vivo... primero al querer quemar el programa el pickit2 me da una advertencia de que faltan palabras de configuración que se supone que son los fuses, buscando informacion he puesto varios fuses que creo son los necesarios pero no consigo que me salga ni un numero en el lcd, a veces me sale simbolos y otras veces no me sale nada, si alguien sabe que fuses debo poner se lo agradeceria mucho... ya llevo 3 dias intentandolo y nada... gracias de antemano


Saludos Stefany9
Si subes el programa que estas intentando hacer funcionar,
y el diagrama de las conexiones que estas realizando,
es como posiblemente las personas del foro te podrán ayudar.

Suerte.


----------



## Stefany9 (Jun 15, 2012)

Hola... muchas gracias por la sugerencia... adjunto el esquema en proteus y el programa que como dije antes es el mismo del tutorial de mecatrodatos, lo único que cambie fue agregarle los fuses que encontré... cabe recalcar que en la simulación en proteus funciona perfectamente, el problema surge al implementarlo en el circuito, la respuesta que obtengo en el lcd es algo así "OoOoO", supongo que si esta llegando algo al lcd pero por los fuses no es lo correcto, y cuando dejo sin esos fuses como mencione en el pickit2 me sale una advertencia de falta de palabras de configuración y lo que obtengo en el lcd es algo como esto "?¿:/+", espero que haya explicado lo mejor posible mi problema y que me puedan ayudar con algo... gracias de antemano.


----------



## D@rkbytes (Jun 16, 2012)

Stefany9 dijo:


> Hola... muchas gracias por la sugerencia... adjunto el esquema en proteus y el programa que como dije antes es el mismo del tutorial de mecatrodatos, lo único que cambie fue agregarle los fuses que encontré... cabe recalcar que en la simulación en proteus funciona perfectamente, el problema surge al implementarlo en el circuito, la respuesta que obtengo en el lcd es algo así "OoOoO", supongo que si esta llegando algo al lcd pero por los fuses no es lo correcto, y cuando dejo sin esos fuses como mencione en el pickit2 me sale una advertencia de falta de palabras de configuración y lo que obtengo en el lcd es algo como esto "?¿:/+", espero que haya explicado lo mejor posible mi problema y que me puedan ayudar con algo... gracias de antemano.


Saludos.
En la carpeta PDS\Includes\PPI se encuentra un archivo llamado P18F4550.PPI
Dentro de ese archivo esta la definición de fuses del 18F4550.
En el puedes encontrar los fuses adecuados para tu programa.
Este archivo es muy largo, y los fuses se encuentran en la sección Fuse Definitions.
Para poder verlo, necesitas abrirlo con el block de notas.

Si miras en la parte de hasta abajo del archivo, veras los fuses que el compilador usa por default.

Adjunto un ejemplo de teclado 3x4 para un 18F4550 y la definición de fuses para el 18F4550

Suerte.


----------



## miborbolla (Jun 16, 2012)

electrobicho dijo:


> Y como sabes a que velocidad envías los datos y a que puerto serial virtual, a mi me sale el 20 pero no pasa nada cuando entro al "emulador" que tiene proton "F4" creo que es para que salga, me sale error o puerto ocupado, leí por ahí también que se debe de usar un puerto menos, que no sobrepase a 10



electrobicho:

la terminal "serial cominicator" lo configuro a 9600 bps, paridad none, byte size 8, stop bit 1

lo mismo para el hyperterminal.

Ahora el por que te da el com20, quizás por que en tu historial de dispositivos tengas ya muchas pruebas atras de otros dispositivos, sin embargo puedes forzar a que sea un com mas bajo, esto en las propiedades de tu puerto que reconoce, en windows Xp, me lo reconoce como com12 y aun asi me funciono el programita que deje posteado....un saludo.


----------



## mendek (Jun 17, 2012)

algun ejemplo para variar la luminocidad a un led? con un 16F887, dentro de los ejemplos de proton no encuentro algo que me sea de gran ayuda. gracias de antemano


----------



## electrobicho (Jun 18, 2012)

Ya me resulto, de hecho estoy haciendo la interfez en Labview pero apenas me inicio igual en eso, pero ya leo datos en simulación, saludos


----------



## D@rkbytes (Jun 18, 2012)

mendek dijo:


> algun ejemplo para variar la luminocidad a un led? con un 16F887, dentro de los ejemplos de proton no encuentro algo que me sea de gran ayuda. gracias de antemano


Saludos.
Este ejemplo que adjunto me gusta porque genera un desvanecimiento constante y lento de luz.

Como no mencionas de que otra forma quieres variar la intensidad de luz del LED, esta es mi sugerencia.

Nota. No incluyo simulación porque el efecto sobre el LED no se distingue.
El diagrama y código fuente estan dentro del archivo.

Suerte.


----------



## mendek (Jun 19, 2012)

muchas gracias @d-rkbytes, al ver el programa me surgieron algunas dudas:
1.- ¿para que sirven los siguientes comandos?: Config1 INTRC_OSC_NOCLKOUT,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,WDT_OFF,FCMEN_ON,IESO_OFF,LVP_OFF,BOR_OFF
Config2 WRT_OFF,BOR21V
2.-¿no basta con poner XTAL = 8 y forsosamente se tiene que poner tambien OSCCON  = $74, o para que es el OSCCON  = $74?
3.-¿por que el .7 en OPTION_REG.7 = 0 que pasa si pongo .5?
4.-¿en el comando PWM LED_1,Duty,10, diez es el ancho de pulso en cero y duty es el ancho de pulso positivo?
desde ya muchas gracias por la ayuda.


----------



## D@rkbytes (Jun 19, 2012)

mendek dijo:


> muchas gracias @d-rkbytes, al ver el programa me surgieron algunas dudas:
> 1.- ¿para que sirven los siguientes comandos?: Config1 INTRC_OSC_NOCLKOUT,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,WDT_OFF,FCMEN_ON,IESO_OFF,LVP_OFF,BOR_OFF
> Config2 WRT_OFF,BOR21V
> 2.-¿no basta con poner XTAL = 8 y forsosamente se tiene que poner tambien OSCCON  = $74, o para que es el OSCCON  = $74?
> ...


Saludos mendek.
Respuestas:
1.- Son los fuses de configuración del PIC (Son muy importantes al grabar el PIC) _Puedes ver este post_
2.- Es importante declarar la velocidad del clock, pero en esta configuración se usa oscilador interno a 8MHz.
3.- El bit 7 del registro OPTION_REG (RBPU) estando en 0 habilita los resistores de pull up en el puerto B.
El bit 5 (T0CS) hace referencia a la fuente de reloj del TMR0 (Leer Data Sheet para más información)
4.- Tengo entendido según esa instrucción...
Que Duty es el ancho del pulso, una variable de 0-255, que genera un voltaje análogo de 0 a 5V.
Y Cycles, otra variable de 0-255 que determina el número de ciclos de salida.
Más información de la instrucción PWM y HPWM la puedes ver en el manual de ayuda de Proton.

Suerte.


----------



## mendek (Jun 19, 2012)

ok, viendo la ayuda en proton *PORTB_PULLUPS *= 1 es lo mismo que usar OPTION_REG.7 = 0, exepto que no entiendo el 1 y cero respectivamente, no se supone que los dos deverian ser uno para activar las resistencias pull-up. Yo tenia la idea de que al variar la intencidad de un led se variaba la corriente, pero ahora veo que se controla por ancho de pulso.

Qusiera aclarar que a la hora de compilar en proton me marca error en CONFIG1 y CONFIG2 cual sera la causa?


----------



## D@rkbytes (Jun 19, 2012)

mendek dijo:


> ok, viendo la ayuda en proton *PORTB_PULLUPS *= 1 es lo mismo que usar OPTION_REG.7 = 0, exepto que no entiendo el 1 y cero respectivamente, no se supone que los dos deverian ser uno para activar las resistencias pull-up. Yo tenia la idea de que al variar la intencidad de un led se variaba la corriente, pero ahora veo que se controla por ancho de pulso.
> 
> Qusiera aclarar que a la hora de compilar en proton me marca error en CONFIG1 y CONFIG2 cual sera la causa?


Es que cuando usas las instrucciones de Proton, se programan de forma diferente.
En Proton te pide un valor Booleano.
Como por ejemplo All_Digital = True
Que manejando registros en el 16F887 sería:
ANSEL = 0
ANSELH = 0
En el 16F877/A sería ADCON1 = 6 o 7 Ya que estando los bits 2,1 en 1 el bit 0 no es tomado en cuenta.
En el 16F628A sería CMCON = 7 y así etc. Usando All_Digital te ahorras buscar la configuración.

Ahora, ¿te manda warning o error? Si es warning y te compila no te preocupes.
Si es error, posiblemente se deba a la versión del compilador.
Yo tengo la versión 3.5.2.2, hay más actuales pero esa me ha servido bien.

Suerte.


----------



## mendek (Jun 19, 2012)

jaja posiblemente sea eso tengo la 3.2.5.5 ahorita probaré  con la más actual gracias por toda la ayuda


----------



## Stefany9 (Jun 22, 2012)

D@rkbytes dijo:


> Saludos.
> En la carpeta PDS\Includes\PPI se encuentra un archivo llamado P18F4550.PPI
> Dentro de ese archivo esta la definición de fuses del 18F4550.
> En el puedes encontrar los fuses adecuados para tu programa.
> ...



Muchisimas gracias  D@rkbytes, tu ayuda me ha sido muy importante... has salvado mi tesis practicamente, aunque todavia no funciona como espero porque ademas de recibir de el teclado estoy trabajando con comunicacion serial con un modulo Vrbot y tengo problemas con los baudios... pero por lo menos ya funciona mejor gracias a los fuses que me recomendaste... te agradezco un mundo....


----------



## mendek (Jun 23, 2012)

Que tal foro nuevamente aquí intentando con proton e isis.
Lo que pasa es que ahora quise hacer un programa que me ponga a 1 lógico solo un puerto a las vez y que lo anterior sea aleatorio, también asocie cada puerto (salida) con un interruptor respectivamente, son 8 interruptores y 8 salidas.
Cada que se active el interruptor de dicho puerto activo, generara al azar otro puerto y su respectivo interruptor deberá ser activado y así sucesivamente.
Mi problema es que a la hora de simularlo en proteus algunos puertos de entrada están siempre en 0 lógico a pesar de que active las resistencias pull-up o ponga una "físicamente" y no se por que ocurre eso.
¿Que creen que pueda ser?

Adjunto mi código, junto con la simulación:


```
Device = 16F887
Xtal = 8               
OSCCON  = $74
ANSELH  = 0                 ; Puerto B como digital
OPTION_REG.7 = 0            ; Resistencias de Pull Up en Puerto B
TRISB = $FF                 ; %11111111    (255)                           
'****************************************************************

Symbol VAR1=PORTB.0
Symbol VAR2=PORTB.1
Symbol VAR3=PORTB.2
Symbol VAR4=PORTB.3
Symbol VAR5=PORTB.4
Symbol VAR6=PORTB.5
Symbol VAR7=PORTB.6
Symbol VAR8=PORTB.7

'****************************************************************

Input VAR1
Input VAR2
Input VAR3
Input VAR4
Input VAR5
Input VAR6
Input VAR7
Input VAR8

Output PORTD

Dim x As Word
Dim y As Byte

'****************************************************************
x=0
Seed $0345
Cls
Low PORTD
'****************************************************************
inicio:

x=Random ' GENERA UN VALOR ALEATORIO EN X
   
y=(x//10)   ' SE EXTRAEN LAS UNIDADES PARA DIVIDIR TODAS LAS POSIBILIDADES EN 10 CASOS DEL 0 AL 9
    
Select y    'SE SELECCIONA UNO SOLO DE LOS CASOS
    
Case 0      'SI Y=0 MANDAS AL BUCLE "UNO"
GoTo UNO
    
Case 1      'SI Y=1 MANDAS AL BUCLE "DOS"
GoTo DOS 
    
Case 2 
GoTo TRES
    
Case 3 
GoTo CUATRO
  
Case 4 
GoTo CINCO

Case 5 
GoTo SEIS

Case 6
GoTo SIETE
    
Case 7 
GoTo OCHO
    
Case 8 
GoTo inicio
    
Case 9 
GoTo inicio

EndSelect

GoTo inicio
'****************************************************************
UNO:
PORTD=1            'SE DECLARA PUERTO D=1
If PORTD = 1 Then
    If VAR1=0 Then GoTo inicio    ' SE VERIFICA SI EL INTERRUPTOR ES ACCIONADO, SI LO ES, MANDA AL RANDOM Y SE REPITE TODO
EndIf
GoTo UNO                                          

DOS:
PORTD=2
If PORTD = 2 Then
    If VAR2=0 Then GoTo inicio
EndIf
GoTo DOS

TRES: 
PORTD=4
If PORTD = 4 Then
    If VAR3=0 Then GoTo inicio
EndIf
GoTo TRES

CUATRO:
PORTD=8 
If PORTD = 8 Then
    If VAR4=0 Then GoTo inicio
EndIf
GoTo CUATRO                                     

CINCO:
PORTD=16 
If PORTD = 16 Then
    If VAR5=0 Then GoTo inicio
EndIf
GoTo CINCO

SEIS: 
PORTD=32
If PORTD = 32 Then
    If VAR6=0 Then GoTo inicio
EndIf
GoTo SEIS

SIETE: 
PORTD=64
If PORTD = 64 Then
    If VAR7=0 Then GoTo inicio
EndIf
GoTo SIETE

OCHO:
PORTD=128 
If PORTD = 128 Then
    If VAR8=0 Then GoTo inicio
EndIf
GoTo OCHO
```


----------



## D@rkbytes (Jun 23, 2012)

mendek dijo:


> Mi problema es que a la hora de simularlo en proteus algunos puertos de entrada están siempre en 0 lógico a pesar de que active las resistencias pull-up o ponga una "físicamente" y no se por que ocurre eso.
> ¿Que creen que pueda ser?


Saludos mendek.
Cambia la instrucción Cls por Clear
La instrucción Cls se usa para borrar un LCD.
Por eso tendrás RB2,RB3,RB5,RB6,RB7 siempre en 0.
Ya que al no estar ninguna configuración inicial para un LCD,
Proton toma por default el puerto B para enviar el comando de borrar pantalla.

Nota: Al usar la instrucción Cls, automaticamente convierte algunos pines como salidas.

Suerte.


----------



## mendek (Jun 23, 2012)

@d-rkbytes una ves mas gracias, e aprendido a usar mas o menos la ayuda de proton, esta ves con la función random


----------



## Stefany9 (Jun 25, 2012)

Hola amigos... les molesto una vez mas... necesito que me ayuden a trabajar con el ADC del pic 18f4550, necesito dos entradas para recibir la señal analogica de dos sensores sharp que tenia pensado sean A0 y A1, he probado configurando el adc para recibir la señal de un potenciomentro y mostrarla en el lcd y funciona bien, me he basado en el ejemplo que D@rbytes facilito en ejemplos anteriores, pero lo que necesito es que aparte de visualizar el valor decimal de la conversion, pueda utilizar este en una estructura condicional para que si es un valor especifico por ejemplo 512, realice una tarea y si es otro valo realice otra, como puedo realizar esta conversion para tener el valor decimal en una variable???... existe alguna funcion que me realice ese cambio, porque he revisado y solo encuentro las funciones val y str pero ninguna hace lo que quiero... espero su ayuda... muchas gracias


----------



## D@rkbytes (Jun 25, 2012)

Stefany9 dijo:


> Hola amigos... les molesto una vez mas... necesito que me ayuden a trabajar con el ADC del pic 18f4550, necesito dos entradas para recibir la señal analogica de dos sensores sharp que tenia pensado sean A0 y A1, he probado configurando el adc para recibir la señal de un potenciomentro y mostrarla en el lcd y funciona bien, me he basado en el ejemplo que D@rbytes facilito en ejemplos anteriores, pero lo que necesito es que aparte de visualizar el valor decimal de la conversion, pueda utilizar este en una estructura condicional para que si es un valor especifico por ejemplo 512, realice una tarea y si es otro valo realice otra, como puedo realizar esta conversion para tener el valor decimal en una variable???... existe alguna funcion que me realice ese cambio, porque he revisado y solo encuentro las funciones val y str pero ninguna hace lo que quiero... espero su ayuda... muchas gracias


Saludos.
¿Ya probaste usando un Select Case?
Como por ejemplo...

```
Comparar:
Select Case ADC_Value
Case 512
; Código (Hago esto)
Case 128
; Código (Hago esto otro)
Case Else
; Código (Etc.)
End Select
Goto MainLoop
```
Suerte.


----------



## Stefany9 (Jun 25, 2012)

Si D@rkbytes el problema que tengo es que el valor que recibo del adc es un simbolo, y no puedo comparar eso... lo que quiero es que ese valor sea decimal... como el que se imprime en el lcd al poner dec3 variable, esa variable sin ponerle el dec3 me sale un simbolo, hay alguna funcion que me permita hacer lo mismo que hace el dec3 para imprimir pero que en este caso sea para asignarle a otra variable el valor decimal de lo que recibo con el adc???

No se si me estoy explicando bien... ojala me puedas ayudar.....


----------



## D@rkbytes (Jun 25, 2012)

Stefany9 dijo:


> Si D@rkbytes el problema que tengo es que el valor que recibo del adc es un simbolo, y no puedo comparar eso... lo que quiero es que ese valor sea decimal... como el que se imprime en el lcd al poner dec3 variable, esa variable sin ponerle el dec3 me sale un simbolo, hay alguna funcion que me permita hacer lo mismo que hace el dec3 para imprimir pero que en este caso sea para asignarle a otra variable el valor decimal de lo que recibo con el adc???
> 
> No se si me estoy explicando bien... ojala me puedas ayudar.....


Entonces toma como resultado su valor decimal utilizando # o Dec
Por ejemplo DecValue = #ADC_Value o DecValue = Dec ADC_Value

Ahora, como te mencione anteriormente, es mejor que subas un ejemplo
de lo que estas haciendo y no te funciona, para poder ayudarte mejor.


----------



## DEPREDADORX1 (Jun 26, 2012)

Saludos foreros,

Estoy intentando medir rpm para un motor dc, parece funcionar aunque no del todo bien, utilizo un 7447 y un encapsulado de 4 displey de 7 seg, ya me quedé sin ideas para que no se note el parpadeo, así como sucede en la simulación está sucediendo en físico, por lo que acudo a este espacio con la esperanza de encontrar alguna idea viable.

Como siempre, muchas gracias.


----------



## D@rkbytes (Jun 26, 2012)

DEPREDADORX1 dijo:


> Saludos foreros,
> 
> Estoy intentando medir rpm para un motor dc, parece funcionar aunque no del todo bien, utilizo un 7447 y un encapsulado de 4 displey de 7 seg, ya me quedé sin ideas para que no se note el parpadeo, así como sucede en la simulación está sucediendo en físico, por lo que acudo a este espacio con la esperanza de encontrar alguna idea viable.
> 
> Como siempre, muchas gracias.


Saludos DEPREDADORX1
¿Seguro que montaste el circuito físicamente?
Lo digo porque tienes transistores NPN con el emisor hacia VDD para conmutar los displays.
Aparte resistencias de 100K para los segmentos. En fin. 
Modifique el programa que adjuntaste y el diseño para hacerlo funcionar.
Se puede simular el circuito, pero a baja velocidad de conmutación.
Lo deje en 250 mS para que se pueda apreciar la conmutación de los displays.
Cuando se monte el circuito, hay que cambiar los retardos a 2mS.
Con ese retardo es como físicamente me ha dado buenos resultados la multiplexación.
Pero yo he usado tablas LookUpL para no usar el decodificador 7447 o 7448,
y trabajar los segmentos directamente por un puerto del micro.
En lo personal me gusta más como se muestran los números de esta forma.
Ya que puedes modificar el número 6 y el 9, que los 744X ya tienen definidos.

Prueba el programa modificado y nos cuentas como te fue.

Suerte.


----------



## DEPREDADORX1 (Jun 27, 2012)

Gracias por responder,

Efectivamente lo monté con 3904 y funciona la conmutación.  He vuelto a probar y el problema persiste, en definitiva para que me funcione tengo 2 opciones, eso creo, una sería utilizar un puerto por cada displey directamente, lo que funciona perfectamente por cierto pues probé con 2 displey aunque es poco práctico pues se utilizan muchos pines; la otra forma me parece la más adecuada, utilizar tres  4511 para 3 displeys, esto eliminaría el parpadeo ya que esto decodificadores a 7 seg tienen latch y permiten memorizar los datos para mostrarlos hasta que se refresquen nuevamente.  En realidad lo que quería era implementarlo con lo que tenía, pic16f877+4447+módulo de 4 displeys, pero veo que así no se ve nada bien, de todas formas mi sincero agradecimiento por la ayuda, apenas lo implemente, lo subo por si alguien lo llega a necesitar.


----------



## D@rkbytes (Jun 27, 2012)

DEPREDADORX1 dijo:


> Gracias por responder,
> 
> Efectivamente lo monté con 3904 y funciona la conmutación.  He vuelto a probar y el problema persiste, en definitiva para que me funcione tengo 2 opciones, eso creo, una sería utilizar un puerto por cada displey directamente, lo que funciona perfectamente por cierto pues probé con 2 displey aunque es poco práctico pues se utilizan muchos pines; la otra forma me parece la más adecuada, utilizar tres  4511 para 3 displeys, esto eliminaría el parpadeo ya que esto decodificadores a 7 seg tienen latch y permiten memorizar los datos para mostrarlos hasta que se refresquen nuevamente.  En realidad lo que quería era implementarlo con lo que tenía, pic16f877+4447+módulo de 4 displeys, pero veo que así no se ve nada bien, de todas formas mi sincero agradecimiento por la ayuda, apenas lo implemente, lo subo por si alguien lo llega a necesitar.


Me imagine que pasaría eso, ya que el problema del parpadeo se produce al regresar a Counter.
Que tiene un periodo de 1 segundo, y eso detiene la secuencia de conmutación.

OK. Sigue intentando con otros métodos, te deseo suerte.

Hasta luego.


----------



## sydjoe (Jun 27, 2012)

mecatrodatos dijo:


> bien vamos con menejo de lcd con proton plus ide
> 
> 
> dejo esquematico , simulacion , codigo fuente y .hex



BUENAS NOCHES, hola estoy haciendo este programa (lo deje adjunto led22) entonces, quisiera preguntarte xq el programa cuando lo simulo me hace todo bien, pero luego cuando cumple todo el ciclo no se queda titilando?, como cuando uno coloca un solo led y se queda titilando siempre.
espero me hayas entendido y me puedas ayudar. chau...


----------



## mendek (Jun 28, 2012)

Osea que lo que quieres lograr es..... que si no se oprime el boton los leds esten parpadeando de forma indefinida? y que si se oprime cumplan con el ciclo que quieres?


----------



## sydjoe (Jun 28, 2012)

exactamente y no entiendo xq no se sigue cumpliendo en ciclo de titilar. Que estoy haciendo mal?





mendek dijo:


> Osea que lo que quieres lograr es..... que si no se oprime el boton los leds esten parpadeando de forma indefinida? y que si se oprime cumplan con el ciclo que quieres?


ah otra cosa y disculpa el abuso, sabes que antes de inicio coloque que todos los puertos estuvieran apagados y en la simulacion no aparecen apagados. pero hago eso mismo programa con dos leds y si me aparecen apagados y cuando presiono el pulsador comienzan a titilar, pero igual no siguen cumpliendo el ciclo sino q se vuelven a apagar. y le quito off y hace lo mismo. la unica manera de que sigan titilando es que le quite la condicion del pulsador. y obviamente no quiero eso. gracias.


----------



## DEPREDADORX1 (Jun 28, 2012)

Hola sydjoe,

Yo pienso que puedes enviar a una subrutina cuando se pulse el botón, mientras se hará el ciclo establecido. los puertos D0 a D5 están inicializados con alto (1), cámbialos a bajo (0) para que empiecen apagados. Espero haber entendido y que te pueda servir de ayuda.


```
inicio:
if boton=1  then gosub lo_que_sea  'Se pulsó el botón, ir a subrutina
'esto lo está haciendo constantemente
DelayMS 400
PORTD.0=1
PORTD.1=1
DelayMS 200
PORTD.0=0
PORTD.1=0
DelayMS 600
goto inicio

lo_que_sea:
DelayMS 200
PORTD.4=0
PORTD.5=0
DelayMS 600
return
```


----------



## sydjoe (Jun 28, 2012)

DEPREDADORX1 dijo:


> Hola sydjoe,
> 
> Yo pienso que puedes enviar a una subrutina cuando se pulse el botón, mientras se hará el ciclo establecido. los puertos D0 a D5 están inicializados con alto (1), cámbialos a bajo (0) para que empiecen apagados. Espero haber entendido y que te pueda servir de ayuda.
> 
> ...


COMO ESTAS DEPREDADORX1?, Gracias por responder. hice lo que tu me dijiste pero me da error el gosub y creo que es xq no la se declarar. Y_Y


----------



## DEPREDADORX1 (Jun 28, 2012)

Hola, no te preocupes, lo modifiqué de todos modos, lo que sucede con tu código también es que los retardos suman más de 3 segundos haciendo parpadear los leds, como el programa se va ejecutando linea a linea demora demasiado para chequear el boton, la solución más práctica es con la interrupción por puerto B.0, sino estás familiarizado con el tema, debes estudiarlo para comprenderlo un poco más o reducir drásticamente los tiempos de tal forma que el puerto del pulsador pueda ser leido muy rápido, de lo contrario tendrás que pulsarlo durante un largo periodo.  Yo me tomé el atrevimiento de modificar el código con el agregado de la interrupción, ojalá te sirva, anexo todo funcionando, si te falla ya es otro cuento con el proteus.


----------



## sydjoe (Jun 28, 2012)

muchas gracias DEPREDADORX1, me sirvio mucho, saludos desde venezuela. cualquier duda ya se para preguntarte jeje. chau.


----------



## DEPREDADORX1 (Jun 29, 2012)

Saludos,

Adjunto cuenta vueltas o rpm con displeys de 7 segmentos, uno con decodificador bcd 4511 y otro conectando un displey por puerto, aunque no me gustó mucho el resultado pues en físico con un pulsador muestra valores que a mi parecer están errados porque saltan de uno a otro sin mostrar el ascenso o descenso correspondiente, segun la programación y la simulación parecen funcionar correctamente, bueno ahí quedan, ojalá alguien se anime a mejorarlos y lo publique aquí para aclarar dudas, sino, pues ahí queda por si alguien lo necesita.


----------



## sydjoe (Jun 30, 2012)

saludos DEPREDADORX1 Buenas tardes, estoy leyendo el tutorial parte 4 y estoy haciendo los ejercicios propuestos, y no entiendo la parte en donde dice mostrar los numeros binarios del 0 al 255 en los leds. mi pregunta es que quiere decir con esto?, ya que lo hago y en la simulacion los leds se encienden discontinuamente, y todos se encienden de manera diferente. no entiendo, como deberian o 
deben encenderce los leds?, por ejemplo el ejercicio que dice: Los números de inicio y final de 65 a 190, como deberien encender los leds? (adjunto el ejemplo y la simulacion).


----------



## DEPREDADORX1 (Jul 1, 2012)

Hola sydjoe,

Ah.... interesante cierto, lo que nosotros vemos solo es el efecto de parpadeo de los leds pero... Ajá, ciertamente es el dialecto de 0 y 1 o lenguaje binario que habla el pic, al enviar la variable X directamente a todo el puerto, el micro no tiene otra forma de hacerlo, al menos que yo sepa. Para que veas bien la cosa, puedes enviar un valor directamente al puerto, eje:  portb=1,  sino, pues aprende el manejo del lcd y así puedes hacer ambas cosas.  Sigue practicando y aprendiendo, publica aquí y ojalá en poco tiempo seas tu quien me eche la mano con los programas, je, je, je....  Suerte!


----------



## sydjoe (Jul 1, 2012)

jeje gracias DEPREDADORX1, creo que ya entendi la cuestion es que los leds van a encender segun el numero binario donde esten para asi hacer el conteo y llegar hasta el 255 por ejemplo si es el 64 solo se va encender el bit 6 o en mi caso el PORTD.6. Me di cuenta al hacer lo que me dijiste. espero no se burlen de mi por no haber entendido eso...


----------



## D@rkbytes (Jul 1, 2012)

sydjoe dijo:


> por ejemplo si es el 64 solo se va encender el bit 6 o en mi caso el PORTD.6


Saludos sydjoe
Pues aún sigues sin entender.
Toma el puerto como si fuera un número binario de 8 bits.
Empezando por el bit más alto del puerto D tenemos RD7,RD6,RD5,RD4,RD3,RD2,RD1,RD0
Entonces si mandas un 64 al puerto > PORTD = 64 tendrás > b'01100100'
RD7 = 0 RD6 = 1 RD5 = 1 RD4 = 0 RD3 = 0 RD2 = 1 RD1 = 0 RD0 = 0

Te recomiendo una buena lectura sobre el código binario.

Suerte.


----------



## sydjoe (Jul 1, 2012)

D@rkbytes dijo:


> Saludos sydjoe
> Pues aún sigues sin entender.
> Toma el puerto como si fuera un número binario de 8 bits.
> Empezando por el bit más alto del puerto D tenemos RD7,RD6,RD5,RD4,RD3,RD2,RD1,RD0
> ...


jajaja esta bien lo hare!. bueno en realidad quise decir lo que tu dijiste... pero igual gracias. (perdon por el mal entendido)


----------



## Stefany9 (Jul 3, 2012)

Hola a todos, necesito de urgencia que me ayuden a programar el micro 18F4550 para recibir la distancia detectada de dos sensor sharp que tienen salida analogica detectando una distancia de 10 a 80 cm por los pines A0 y A1, por favor es de urgencia.... se los agradezco a todos y espero que me puedan ayudar... necesito los comandos para recibir las señales por ADC...


----------



## D@rkbytes (Jul 4, 2012)

Stefany9 dijo:


> necesito los comandos para recibir las señales por ADC...


Saludos Stefany9
Adjunto 2 ejemplos sencillos para trabajar con el ADC a 8 y 10 Bits en el 18F4550

Espero que esto sea lo que necesitas, ya que no adjuntas ningún proyecto.

Nota:
Para mostrar los resultados finales, se tiene que usar una formula conforme al tipo de sensor.

Suerte.


----------



## DEPREDADORX1 (Jul 5, 2012)

Saludos a todos,

Solicito ayuda a los amigos del foro, estudiando un poco el uso del timer0 me he topado con una pequeña dificultad para incrementarlo por el pin tocki, supongo un detalle mínimo para que funcione pero no he podido dar, agradecería una mano con este error, publico el codigo a la espera de ayuda.

```
Device = 16F877A
Xtal = 20

All_Digital true
'Declaration for LCD 
       Declare LCD_Type = 0         ;LCD is Alpha
       Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
       Declare LCD_ENPin = PORTD.1  ;LCD EN line
       Declare LCD_RSPin = PORTD.0  ;LCD RS line
       Declare LCD_Interface = 4    ;LCD 4 line interface
       Declare LCD_Lines = 2


'**********Establezca la opción de registro************************
             '10110101
OPTION_REG = %10110000      ; PÁGINA 48 de Hoja de datos del PIO 16f877a
                                               ; bit 7=1 deshabilita pull-ups de PORTB
                                               ; bit 6   bit para seleccionar borde de interrupción
                                               ; bit 5   incremento:  0-reloj interno, 1 por pin TOCKI
                                               ; bit 4   Determina flanco de incremento: 0-de high a low, 1-de low a high
                                               ; bit 2=1 }
                                               ; bit 1=0 } Timer0 conjuntos pre-escalador Para 64
                                               ; bit 0=1 }
'**********establece el registro de control de interrupción*******

INTCON = %11100000             ; bit 7=1  permite todas las interrupciones
                               ; bit 6   (PEIE)   permite las interrupciones periféricas (1=Enable, 0=Disable)
                               ; bit 5=1 (tmr0IE) permite interrumpir el desbordamiento del Timer0
                               ; bit 4   (intoIE) bit que habilita la interrupción por B.0
                               ; bit 2   (tmr0IF) es la bandera de desborde de TMR0, se debe limpiar al final de la interrupción.
                               
                             
TRISA=%00010000
TRISD=0

Dim B0 As Byte
Symbol led= PORTA.1
Symbol LED1=PORTA.2

On Interrupt GoTo desborde_TMR0
           
INICIO:
Print At 2,1,Dec B0                       
  High led
  DelayMS 200
  Low led
  DelayMS 200
 GoTo INICIO
Disable

desborde_TMR0:   
Inc B0 
If B0 < 255 Then SALIR            
Cls
B0 = 0                                   
Toggle LED1
SALIR:                               
INTCON.2 = 0                    
Resume                           ; Reanudar el programa principal
Enable                           ; Deshabilitar y habilitar la rutina de interrupción 
End
```


----------



## D@rkbytes (Jul 6, 2012)

DEPREDADORX1 dijo:


> Saludos a todos,
> 
> Solicito ayuda a los amigos del foro, estudiando un poco el uso del timer0 me he topado con una pequeña dificultad para incrementarlo por el pin tocki, supongo un detalle mínimo para que funcione pero no he podido dar


Saludos DEPREDADORX1
Adjunto un sencillo ejemplo con el 16F877A, para el incremento del TMR0 por el pin RA4 (T0CKI)
Cuando el TMR0 se desborda ocurre la interrupción y es mostrado por LCD y un LED.

Suerte.


----------



## sydjoe (Jul 6, 2012)

mecatrodatos dijo:


> bien vamos con menejo de lcd con proton plus ide
> 
> 
> dejo esquematico , simulacion , codigo fuente y .hex


buenas noches, como estan? hola espero me puedn ayudar, estoy haciendo en programa que me encienda un led durante 5 minutos y que cuando presione un pulsador durante 3 segundos se apague el led, entonces como hago para que el pulsador sepa que lo voy a presionar por tres segundos y luego apague el led?? espero me puedan ayudar. gracias.


----------



## D@rkbytes (Jul 6, 2012)

sydjoe dijo:


> como hago para que el pulsador sepa que lo voy a presionar por tres segundos y luego apague el led?? espero me puedan ayudar. gracias.


Saludos sydjoe
La respuesta es...
Utilizando la instrucción While.
Intentalo, veras que no tendrás complicación.
Ahora que si algo se te complica, posteas tu código y te ayudo con gusto.

Suerte.


----------



## sydjoe (Jul 6, 2012)

D@rkbytes dijo:


> Saludos sydjoe
> La respuesta es...
> Utilizando la instrucción While.
> Intentalo, veras que no tendrás complicación.
> ...


hola muchas gracias por responder lo intente con el while asi:

device= 16f877A
xtal 20
trisb=1
trisd=0
all_digital=1
dim x as byte

INICIO:
for x=0 to 5
portd.0=1 , este es el led
delayms 60000
next x
    while portb.0=%00000011
    portd.0=0 , este es el pulsador
    wend
GOTO INICIO

y no me funciono.


----------



## D@rkbytes (Jul 6, 2012)

sydjoe dijo:


> hola muchas gracias por responder lo intente con el while asi:
> 
> device= 16f877A
> xtal 20
> ...


Checa este código y me avisas que tal te funciona.


----------



## sydjoe (Jul 6, 2012)

D@rkbytes dijo:


> Checa este código y me avisas que tal te funciona.



funciona chido!! gracias!!!, estuve cerca xq intente hacer el programa asignando una variable q se incrementra yo la habia puesto asi x=0 y despues x=x+1 y despues hice esto while portb.o=x portd.0=0 wend, pero no funciono jeje... pero muchas gracias, estoy comenzando y me gusta mucho. muchos agradecimientos....


----------



## DEPREDADORX1 (Jul 7, 2012)

Muchas gracias D@rkbytes, efectivamente era lo que buscaba pues no había podido echar a andar por el tocki, voy a analizar el código a ver en que fallaba y espero poder desarrollar algo con esto.

Suerte a todos y, nuevamente, mis sinceros agradecimientos por la ayuda!


----------



## mendek (Jul 9, 2012)

buenas noches foro, otra ves aquí intentando aprender un poco mas, lo que pasa es que me gustaría aprender a utilizar las interrupciones con un ejemplo un tanto sencillo que haga lo siguiente:

que un led parpadee indefinidamente en el puerto porta.0 
y que si presiono un interruptor en el puerto portb.0 después de 500ms encienda un led en el puerto porta.1 durante 1000ms y después se apague.

desde y muchas gracias.


----------



## DEPREDADORX1 (Jul 9, 2012)

Hola mendek,

Aquí te pongo la interrupción por b.0 bien sencilla, modifica los tiempos a tu gusto, analiza los registros intcon y option reg, esos son los principales para la interrupción por b.0 y timer0.


```
Device = 16F877A
Xtal = 4

'Declaration for LCD 
       Declare LCD_Type = 0         ;LCD is Alpha
       Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
       Declare LCD_ENPin = PORTD.1  ;LCD EN line
       Declare LCD_RSPin = PORTD.0  ;LCD RS line
       Declare LCD_Interface = 4    ;LCD 4 line interface
       Declare LCD_Lines = 2


 Symbol LED= PORTB.1
 Symbol LED2=PORTB.2
 
 On Interrupt GoTo interrupcion ;  En caso de interrupción ir a subrutina interrupción
 INTCON=%10010000               ; el bit 7 habilita las interrupciones en general
                                ;  El bit 4 habilita la  interrupción B.0
 
 PROG:
  High LED
  DelayMS 200
  Low LED
  DelayMS 200
  GoTo PROG
  
  Disable             ; Desabilita las interrupciones en el handler
  
  interrupcion:              
  High LED2
  DelayMS 2000
  Low LED2
  INTCON=%10010000    ; Habilita la interrupción B.0 (INTCON.1=0)
  Resume              ; Retorna al programa donde ocurrió la interrupción 
  Enable              ; Habilita las interrupciones después del handler
  End
```


----------



## mendek (Jul 9, 2012)

¿algunas lecturas que me recomienden para comprender lo que es el INTCON el TMR0?, es que la verdad no entiendo para que se usan y cuales son sus funciones, justamente ese fue el ejemplo que vi pero que no entendí, ese ejemplo viene en un manual que me ha servido de mucho, pero de todas formas gracias DEPREDADORX1

buscando en la ayuda de proton la verdad es que no logro saber como se habilita la interrupción, es decir como hago para que entre en el nivel "interrupción"


----------



## DEPREDADORX1 (Jul 10, 2012)

Bueno, aquí te adjunto alguna lectura que puede ayudarte para ir comprendiendo cada cosa, el intcon es el registro de control para las interrupciones por puerto b.0 y timer0, cada bit tiene su función, el GIEE es como el swiche principal, sino lo activas no puedes habilitar  ninguna interrupción; el PEIE, tiene que ver con interrupciones por periféricos, de principio no interesa pues no tiene que ver con b.0 o timer0; el TOIE, es el bit que habilita la interrupción por timer0;el INTE, habilita la interrupción por b.0;RBIE, este bit habilita la interrupción por el puerto B; TOIF, este bit cambia cuando se produce el desborde de timer0;INTF, este bit es la bandera o flag que indica cambio por b.0 cuando está habilitada y finalmente el bit RBIF (bit 0 de intcon), éste indica un cambio el el puerto B cuando se habilita dicha interrupción. Echale una ojeada a la documentación pues tienes que analizar el registro Option reg también.

Suerte!


----------



## mendek (Jul 10, 2012)

ya por fin pude hacer funcionar el programa DEPREDADORX1,  ahora lo que pasa es que tenia un mal entendido con respecto a las interrupciones y su función, yo pensé que servían para ejecutar algo en segundo plano, es decir, como el ejemplo que mencionaba, de que un led este parpadeando indefinidamente, pase lo que pase ese led debe de estar parpadeando y que si se oprime un botón otro led prenda durante X tiempo y se apague, como si ejecutara algo en segundo plano, ya habia preguntado lo mismo en este foro, pero no me acuerdo donde y me dijeron que con interrupciones se podia lograr pero ya veo que no, alguien sabe como se logra eso, ya leí el !tema completo¡ y no encontré alguien que quisiera lo mismo, nuevamente gracias por la ayuda DEPREDADORX1, lo olvidaba este programa solo lo pude probar con el 16F84A pero con el 16F887 no pude, era el mismo programa solo cambiaba el tipo de pic pero nada, ¿a que se debera?



DEPREDADORX1 dijo:


> ```
> Device = 16F877A
> Xtal = 4
> 
> ...


----------



## DEPREDADORX1 (Jul 11, 2012)

Hola mendek,

Las interrupciones son, valga la redundancia, para interrumpir algo, para nuestro caso dejan la ejecución normal del programa para atender la interrupción inmediatamente.  La programación se ejecuta línea a línea, si quieres que realice algo adicional necesitas las interrupciones, en los ejemplos de proton está un ejemplo que combina 2 interrupciones, creo que timer1 y timer3, el caso es que una está habilitada como interrupción prioritaria mientras que la otra como secundaria, me parece que con esto es mucho lo que puede hacerse aunque yo no he llegado hasta allá, soy solo un aficionado y no requiero tanto complique.  Sobre el ejemplo, aunque nunca he simulado con ese pic, podría asegurarte que el error debe estar en la configuración de los registros de interrupción, bueno, al menos eso creo yo así sin tener un ejemplo que aplique a ese pic.

Suerte!


----------



## stratos1111 (Ago 2, 2012)

Buenas tardes.
Lo siento por el idioma, pero yo soy de Grecia.
Si alguien me puede dar un ejemplo con dos temporizador en protonbasic.
Empecé a aprender programación, pero no he encontrado ningún ejemplo que utiliza el temporizador 2.
gracias


----------



## DEPREDADORX1 (Ago 5, 2012)

Hola stratos1111,

Es todo lo que tengo, espero pueda ayudarte.


----------



## stratos1111 (Ago 5, 2012)

Gracias. Que lo pruebe. Que estés bien


----------



## DEPREDADORX1 (Ago 10, 2012)

saludos,
Aquí publico un velocímetro con interrupción por B0 y timer1, el primero para contar los giros de la rueda y el otro para calcular un tiempo determinado para hacer los calculos.  Ahora lo que hay que analizar es como mejorar la resolución del velocímetro puesto que con una sola vuelta se va a 75km/h, que os ocurre respecto a esto para alcanzar una resolución exacta de 1k/h?


----------



## electrobicho (Ago 13, 2012)

Hola a todos, verán e realizado algunos proyectos básicos con Visual basic 6 y Proton pur USB HID, ahora me e descargado el Visual studio 2010, alguien tiene algún ejemplo de como usar el HID en esta versión? de lo contrario alguien sabe como usar la comunicación serie con esta versión? saludos, espero no molestar


----------



## yamilongiano (Ago 13, 2012)

Hola increible manual me dejo prendiendo leds y todo en poco tiempo, sin siquiera leer mucho.

ahora mismo e descargado el manual y lo leeré tranquilamente.

pero tengo una pregunta ¿es posible programar un pic directamente con proton pero usando el pickit 3 de microchip como interfaz?


otra pregunta ¿son solo 6 pdfs  del manual de proton o no ?


----------



## D@rkbytes (Ago 13, 2012)

yamilongiano dijo:


> tengo una pregunta ¿es posible programar un pic directamente con proton pero usando el pickit 3 de microchip como interfaz?


Posiblemente si el PICKit 3 acepta comandos desde el IDE Proton.

Por ejemplo. Yo uso el WinPic800 con estos parámetros.



Puede ser cosa de buscar algún parámetro para que funcione con el PICKit 3.​

yamilongiano dijo:


> otra pregunta ¿son solo 6 pdfs  del manual de proton o no ?


Eso no lo sé, yo suelo usar siempre la ayuda que el mismo Proton tiene.

Saludos.​


----------



## yamilongiano (Ago 13, 2012)

gracias por la respuesta darkbyte. mecatrodatos gracias e manual.


¿donde se puede cambiar el pic por default. he estado buscando como cambiar el microcontrolador pero no encuentro donde?. o especificando al comienzo basta y la carpeta que dice el nombre del pic no importa mucho(pic16f628a).


----------



## D@rkbytes (Ago 13, 2012)

yamilongiano dijo:


> ¿donde se puede cambiar el pic por default. he estado buscando como cambiar el microcontrolador pero no encuentro donde?.


En Proton no se selecciona el PIC a utilizar.
Esto se declara por software.

```
[B]Device[/B] [B][COLOR=Navy]16F628A[/COLOR][/B] ; Microcontrolador
; Palabra de configuración
[B]Config[/B] INTRC_OSC_NOCLKOUT,CP_OFF,CPD_OFF,WDT_OFF,MCLRE_ON,PWRTE_ON,BOREN_OFF,LVP_OFF
;*******************************************************************************
[B][COLOR=DarkRed]Xtal[/COLOR][/B] = 4                    ; Oscilador a 4MHz
```
Y Proton automaticamente hace el cambio de microcontrolador.


----------



## yamilongiano (Ago 13, 2012)

gracias.

otra consulta:

yo compre el pickit 3 y que para usarlo en protondeberia instalarlo manualmente que el .exe se encuentra aqui.

C:\Program Files\Microchip\MPLAB IDE\Programmer Utilities\Pickit3\PK3CMD.exe

The parameters are:
-P$target-device$ -F$hex-filename$ -E -M -B 

The -B (batch) is only to keep the DOS window open after programming to
see completion messages and could be left out. A space bar press will exit DOS.
If the PIC hangs after programming add a -L to release the MCLR.
Add an V5 or V.3 and possibly other voltages to power the PIC from the Pickit3 USB.

¿me podrían explicar que son los parámetros por favor?


----------



## D@rkbytes (Ago 13, 2012)

yamilongiano dijo:


> gracias.
> ¿me podrían explicar que son los parámetros por favor?


Ahora veras por qué te decia que es bueno mirar la ayuda que viene con Proton.
En ella viene esto.

Saludos.​


----------



## yamilongiano (Ago 14, 2012)

D@rkbytes dijo:


> Ahora veras por qué te decia que es bueno mirar la ayuda que viene con Proton.
> En ella viene esto.
> Ver el archivo adjunto 78061
> Saludos.​



si busque en el manual y casi siempre encuentro, pero aun así aveces quedan dudas donde los traductores aveces  no traducen completamente, y mirare mas el manual en ingles, en todo caso gracias. quizas no darkbytes no entendio mi pregunta o me explique mal.

lo que quería saber eran las variables -B -L etc...

por ejemplo -L es para resetear si no me equivoco. y el -B para mantener la ventana de DOS abierta. etc...

donde se encuentran para tener mas información o si alguien sabe seria genial...


----------



## yamilongiano (Ago 14, 2012)

Hola a todos e estado jugando un ratito con proton ... pero lo cierto es que proton juega conmigo jajaja.

atravez del comando "DEVICE" e seleccionado el pic16f84 

ejemplo grafico:







que estoy haciendo mal con una instrucción tan simple.a alguien le sucede.


----------



## D@rkbytes (Ago 15, 2012)

yamilongiano dijo:


> donde se encuentran para tener mas información o si alguien sabe seria genial...


Saludos.
Los parámetros requeridos, vienen en el software del programador que uses.
No sé si todos los tengan.
Por ejemplo, aparte de otros yo uso el WinPic800, y vienen en el menú (Ayuda/Parámetros)

-l            Lee  
-p           Programa
-v           Verifica
-a           Auto detección del dispositivo
-s           Salir terminada la acción
-i            Ignora la extensión del archivo usando .HEX
-e           Lee el contenido de la EEPROM antes de programar
-d           Fuerza a usar un dispositivo

Ejemplo : Programa el archivo Mihex.hex usando 16F877 y salir al terminar.
-p -s -dPIC16F877 c:\Mihex.hex

Y también vienen otros ejemplos para otros entornos de desarrollo.

Suerte.





yamilongiano dijo:


> a travez del comando "DEVICE" e seleccionado el pic16f84
> 
> que estoy haciendo mal con una instrucción tan simple.a alguien le sucede.



Reinstala el programa o actualízalo. Ya que al escribir el nombre del dispositivo,
automáticamente tiene que actualizarse el árbol de la izquierda.


----------



## montoya8332 (Ago 16, 2012)

buenas noches , estoy en un proyecto con lCD  pero necesito ayuda con algo, me gustaria saber como puedo  mostrar caracteres de doble linea, es decir  por ejemplo el numero 1 formado  entre caracteres de la fila 1 y la fila 2.  estoy usando el software proton . de anemano muchas gracias


----------



## electrobicho (Ago 16, 2012)

Escribiendo en la memoria CGRAM, bueno así creo que es lo normal, lo malo es que no recuerdo como se llama el programita que hace los códigos para poder copiar y pegar los caracteres especiales


----------



## DEPREDADORX1 (Ago 29, 2012)

Saludos nuevamente,

He encontrado entre mis checheres un nokia 1100 del cual me gustaría reutilizar la pantalla, hasta ahora no he podido encontrar ningún programa básico que me trabaje con proton, todo lo que he visto está para lenguaje C, agradecería si alguno de los compañeros del foro la sabe manejar o tiene idea de como sacar un mensaje sencillo en ella, lo comparta en este espacio, le estaré como siempre muy agradecido.

Suerte!


----------



## carptroya (Ago 29, 2012)

comunicacion SPI te adjunto datashell.

http://www.picbasic.co.uk/forum/content.php?r=174-Using-Nokia-3310-LCD



http://www.picbasic.co.uk/forum/showthread.php?t=327

 si tienes otro movil te interesara esta dire:

http://sandiding.tripod.com/Bertys.html

Saludos


----------



## DEPREDADORX1 (Ago 29, 2012)

Gracias por responder tan rápido,

Voy a checar todo y cualquier duda, estaré preguntando nuevamente, estaré posteando la simulación apenas la logre funcionar.

Hasta pronto!


----------



## carptroya (Ago 30, 2012)

como tendras que realizar comunicacion SPI te adjunto estos dos documentos.


----------



## LecheroXXX (Sep 23, 2012)

Hola amigos del foro les escribo porque necesito de su ayuda, estoy empezando a programar en Proton IDE y el problema que tengo es que cuando voy a la opcion y le doy clic "compile and program" no me crea el archivo .HEX y tampoco se abre la ventana donde se le direcciona para guardar dicho archivo...ademas me sale un mensaje, les dejo la captura que hice del mensaje quiza  falte configurar algo, espero que puedan ayudarme gracias


----------



## JeKastillo (Sep 28, 2012)

Hola "LecheroXXX" si solo quieres crear el .HEX tienes que hacer clic el Only Compile.. el que tiene solo el engranaje, porque si le haces donde dice "compile and program" no va a reconocer el programador ya que me imagino que no lo tienes.. espero te sirva..


----------



## DEPREDADORX1 (Oct 6, 2012)

Saludos nuevamente,

De la red obtuve unos ejemplos y me pareció interesante compartirlos aquí, están en inglés pero son buenos, échenle una ojeada a ver si les son útiles... 

Suerte!



Estos son otros, toca por partes.


----------



## lalog861 (Oct 9, 2012)

Hola que tal buen día,
alguien me podría apoyar para poder definir el oscilador externo en el pic16f883. Porque? estaba trabajando con el pic16f877A con proton ide, todo estuvo muy bien, realice una matriz de led de 8x8 corriendo perfecto.

Pero decidí realizarla con el pic16f883 por menos costo y mas pequeño....Cuando realizo la simulación en proteus para probar si enciende led muy bien.... pero al montarlo en el circuito no realiza nada...

Porque creo que es la definición del oscilador? probé compilando el programa con micocode studio y tampoco funciono, pero con una instrucción para forzar trabajar con el oscilador externo funciono en microcode studio...

vi en algunos post que definen el oscilador interno, pero el externo no!!!!
No se como declararlo con Proton Ide, alguien podría ayudarme como definir el oscilador externo.

Saludos y de antemano muchas gracias... excelente foro


----------



## carptroya (Oct 9, 2012)

pon codigo y simulacion.


----------



## lalog861 (Oct 10, 2012)

Que tal, 
en la simulación si me funciona, pero al montarlo en físico no.
Cuando realizaba con el pic16f877A funcionaba a la perfeccion solo colocando
Device 16F877A
XTAL = 4

Pero con el otro pic no me funciona en fisico:
Device 16F883
XTAL = 4

Probé con otro programa (microcode studio) al principio no me funciono, paso lo mismo que con proton ide.

pero utilice una instruccion que es para forzar a utilizar el oscilador externo, ya con esto me funciono con microcode studio, la instrucción es:
@ device XT_OSC 
osccon = %1100100

Me gustaría saber hacer lo mismo con proton ide, ya que este programa me parece mejor, y ya tengo el código de programación y otros dos proyectos con este programa y me gustaría poder utilizar con el pic16f883...... Pero por lo antes mencionado no me corre en físico...

Saludos..


----------



## carptroya (Oct 10, 2012)

Igual no tiene configurado bien los fuses (recuerdo del 88 que me dio problemas).
Al no tener ese micro, no puedo probar este código te lo dejo para que lo compruebes en REAL.

Saludos



aunque en el rar ponga 18f883 es un 16f883........

saludos


----------



## D@rkbytes (Oct 10, 2012)

lalog861 dijo:


> Hola que tal buen día,
> alguien me podría apoyar para poder definir el oscilador externo en el pic16f883.


¿Cuando te refieres a usar oscilador externo, a que tipo te refieres?
Hay externo con cristal  XT, HS (High Speed), con resonador, R/C y fuente de reloj externa.

Los tipos de palabra de configuración desde el 16F882 hasta el 16F887 son los mismos.
Esta es una configuración clásica con cristal.

```
Config1 XT_OSC,LVP_OFF,FCMEN_ON,IESO_OFF,BOR_OFF,CPD_OFF,CP_OFF,MCLRE_ON,PWRTE_ON,WDT_OFF
Config2 WRT_OFF,BOR21V
```
Para otras configuraciones, estas son las disponibles.
Config1 LP_OSC, Etc,Etc. (Oscilador con resonador de baja frecuencia. Hasta 200KHz.)
Config1 XT_OSC, Etc,Etc. (Oscilador a Xtal. Hasta 4MHz.)
Config1 HS_OSC, Etc,Etc. (Oscilador a Xtal. Hasta 20MHz.)
Config1 EXTCLK_OSC, Etc,Etc. (Oscilador Digital Externo)
Config1 INTRC_OSC_NOCLKOUT,Etc,Etc. (Oscilador R/C Interno. Sin salida de reloj)
Config1 INTRC_OSC_CLKOUT,Etc,Etc. (Oscilador R/C Interno. Con salida de reloj)
Config1 RC_OSC_NOCLKOUT,Etc,Etc. (Oscilador R/C Externo. Sin salida de reloj)
Config1 RC_OSC_CLKOUT,Etc,Etc. (Oscilador R/C Externo. Con salida de reloj)

Como puedes ver, son 8 tipos diferentes para la selección del oscilador.
El uso del registro OSCCON es sobre todo para cuando se usa el oscilador interno del PIC.
Un ejemplo de configuración para 8MHz estable, sería de esta manera...
OSCCON = %01110101
La información de configuración del registro OSCCON y más información esta en la hoja de datos.

Si deseas utilizar los puertos A y B como digitales, debes establecer los registros ANSEL y ANSELH en 0
ANSEL = 0           ; Puerto A Digital I/O
ANSELH = 0          ; Puerto B Digital I/O

Espero esta información te sea de utilidad.

Suerte.


----------



## lalog861 (Oct 10, 2012)

Gracias por responder!!!!

Carptroya: el código que me enviaste lo probé en el pic y no me funciono, en la simulación si enciende el led, pero en físico no, se queda encendido el led en porta.0
Sobre el código al quererlo compila no me deja me arroja un error (Anexo error 1)

D@rkbytes: Puse el código pero me arroja unos errores al compilar, me apareció también con el código que me paso Carptroya, no se si tenga algún problema o realice mal algo..
(Anexo error 2)

Saludos y gracias.


----------



## D@rkbytes (Oct 11, 2012)

lalog861 dijo:


> D@rkbytes: Puse el código pero me arroja unos errores al compilar, me apareció también con el código que me paso Carptroya, no se si tenga algún problema o realice mal algo..
> (Anexo error 2)


Saludos.
En el programa que subió carptroya, la palabra de configuración esta escrita en lenguaje ensamblador.
Las configuraciones que publique, están como se deben escribir en Proton.

Si te fijas bien, veras que se usa Config1 y Config2 para declarar las palabras de configuración.
Y tu estas escribiendo solamente Config en las dos palabras.

Ahora, compilando el programa de carptroya, no te debe producir error.
Si te produce error, debes actualizar la versión del programa que estas usando.

Suerte.


----------



## lalog861 (Oct 16, 2012)

Muchas gracias por le apoyo


----------



## lalog861 (Oct 20, 2012)

Que tal, buen dia señores..

alguien sabra porque me marca este warning al compilar el archivo, el error aparece con la version 2.0, antes tenia la 1.4 y    no me aparecía el warning......
el mismo programa con la versión 1.4 no aparece nada..pero la cambie porque la 1.4 no me marcaba error con los fuses y ya con la 2.0 no..pero ahora marca este warning..


saludos

Me falto el error......


----------



## ricbevi (Oct 20, 2012)

lalog861 dijo:


> Que tal, buen dia señores..
> 
> alguien sabra porque me marca este warning al compilar el archivo, el error aparece con la version 2.0, antes tenia la 1.4 y    no me aparecía el warning......
> el mismo programa con la versión 1.4 no aparece nada..pero la cambie porque la 1.4 no me marcaba error con los fuses y ya con la 2.0 no..pero ahora marca este warning..
> ...



Lo que te avisa el compilador que los comandos son viejos y pueden ser eliminados en las versiones mas nuevas. Consulta la ayuda de tú versión y que comandos hacen lo mismo que los que estas usando en este momento.
Supongo que lo hacen con el fin de que si cambias a una nueva versión tus programas aun sean compila bles/portables aunque yo tengo la 3.5.2.7 y todavía aparecen.
Saludos.

Ric.


----------



## lalog861 (Oct 21, 2012)

Revisando la ayuda, la instruccion read se remplaza por lread cread y restore creo que no..
le intente emigrar el programa a estas instrucciones pero no me funciono..

intento hacer una matriz de led 8x8. tome la ayuda de una pagina "neoteo.com" ahi viene este programa...

Me podrian echar la mano en emigrar este programa sin utilizar la instruccion restore por lo que me aparece de error.... le intente pero no me salio

saludos,

Se me paso subir el archivo


----------



## ricbevi (Oct 21, 2012)

lalog861 dijo:


> Revisando la ayuda, la instruccion read se remplaza por lread cread y restore creo que no..
> le intente emigrar el programa a estas instrucciones pero no me funciono..
> 
> intento hacer una matriz de led 8x8. tome la ayuda de una pagina "neoteo.com" ahi viene este programa...
> ...



No se por que quieres cambiar los comandos si lo que te esta dando es una advertencia solamente pero al menos en mi versión lo compila correctamente y genera el archivo a cargar los cuales adjunto(tuve que modificar solamente la linea Read = Letra y quitarle el signo igual).
Por otro lado acostumbra a adjuntar las reformas que has echo y no te funcionaron por que no todos tomamos las cosas desde el mismo punto de vista.
Saludos.
Ric.


----------



## lalog861 (Oct 23, 2012)

Que tal ricbevi,

lo que pasa es que en la simulación en proteus veía unos mensajes con unas instrucciones que con la version anterior no me aparecian...pero con lo que me comentaste me anime armar la matriz en físico y me funciono a la perfección,,,

Gracias por el apoyo, saludos!!!!


----------



## mendek (Dic 28, 2012)

que tal compañeros del foro, he estado buscando acerca de como hacer un cronometro en proton pero no tenido mucha suerte, lo que he hecho es poner algunas instrucciones para pintar el resultado en un LCD pero los pulsos de reloj necesarios para cada instrucción se van acumulando y no queda nada preciso, por ahí vi que seria mas correcto utilizar el tmr0 pero la verdad es que tampoco encontré información clara acerca de eso, alguien que me pueda proporcionar información , desde ya muchas gracias


----------



## D@rkbytes (Dic 28, 2012)

mendek dijo:


> que tal compañeros del foro, he estado buscando acerca de como hacer un cronometro en proton pero no tenido mucha suerte, lo que he hecho es poner algunas instrucciones para pintar el resultado en un LCD pero los pulsos de reloj necesarios para cada instrucción se van acumulando y no queda nada preciso, por ahí vi que seria mas correcto utilizar el tmr0 pero la verdad es que tampoco encontré información clara acerca de eso, alguien que me pueda proporcionar información , desde ya muchas gracias


Saludos.
Este ejemplo está escrito en PICBasic, pero si ya conoces algo de Proton no te será difícil entenderlo.
Proton usa PICBasic como lenguaje de programación, pero con otra sintaxis.
Así que si deseas migrar el ejemplo a Proton tampoco te resultará difícil hacerlo.

Cronómetro

Suerte.​


----------



## mendek (Ene 3, 2013)

Bueno gracias D@rkbytes quizás fui algo lejos, ya vi el ejemplo y pensé que debería empezar con ejemplos mas fáciles para enseñarme a usar el TMR0 y no se si alguien tenga algún ejemplo de como encender y apagar un led, tan simple como eso pero no se hacerlo con el TMR0, desde ya gracias.


----------



## D@rkbytes (Ene 3, 2013)

mendek dijo:


> Bueno gracias D@rkbytes quizás fui algo lejos, ya vi el ejemplo y pensé que debería empezar con ejemplos mas fáciles para enseñarme a usar el TMR0 y no se si alguien tenga algún ejemplo de como encender y apagar un led, tan simple como eso pero no se hacerlo con el TMR0, desde ya gracias.


Saludos nuevamente mendek.
No sé si ya viste _este ejemplo_, se trata del incremento del TMR0 por el pin RA4 (T0CKI)
A estas horas del partido ya es para tratar con ejemplos un poco más avanzados con el TMR0. 
Pero déjame hacer una recopilación de algunos proyectos que tengo, y posteriormente los subiré. 

;********************************  08/01/2013  *********************************
Para no crear otro post, aquí mismo adjunto los programas de ejemplo usando el TMR0
Vienen mezclados, pero son para lenguaje PICBasic.
Nota: Incluí dos ejemplos para Amicus18, que vendría siendo el Proton para PIC18
Por lo tanto esos programas deben ser compilados con Amicus18 IDE
Aquí unos archivos que ya había subido al Foro.
Tutorial TMR0 (PDF)
Los Timers del PIC16F84A (RAR)

Hasta pronto. Feliz y Prospero Año 2013 a todos.


----------



## sydjoe (Ene 10, 2013)

buenas tardes, muchas gracias por ofrecer tus conocimientos gracias a ello he hecho mis programitas bien bonitos, jeje.

hoy me dirijo a ti para hacerte una pregunta, estoy haciendo un semaforo con pic16f877 y quiero que cuando este en verde genere un sonido en otro puerto donde este un buzzer, como hago que suene? con decirle por ejemplo PORTA.1=1 es suficiente?? o es algun tipo de libreria como sound, frecuency?? De ante mano muchas gracias.

ah se me olvido otra cosita, quiero hacer un control para encender el semaforo, disculpa mi abuso, como lo haria?? jiji gracias.


----------



## D@rkbytes (Ene 10, 2013)

sydjoe dijo:


> buenas tardes, muchas gracias por ofrecer tus conocimientos gracias a ello he hecho mis programitas bien bonitos, jeje.
> 
> hoy me dirijo a ti para hacerte una pregunta, estoy haciendo un semaforo con pic16f877 y quiero que cuando este en verde genere un sonido en otro puerto donde este un buzzer, como hago que suene? con decirle por ejemplo PORTA.1=1 es suficiente?? o es algun tipo de libreria como sound, frecuency?? De ante mano muchas gracias.
> 
> ah se me olvido otra cosita, quiero hacer un control para encender el semaforo, disculpa mi abuso, como lo haria?? jiji gracias.


Supongo que te refieres a mi...
Bien, pues con respecto a tus preguntas...
Si solo quieres activar un buzzer, así como lo describes basta, PORTX.X = 1
Lo puedes controlar con un transistor simplemente.
Si quieres generar sonidos, si debes utilizar la función SOUND
*SOUND* _Pin_,[_Note_,_Duration_{,_Note_,_Duration..._}]

Hace tiempo subí un ejemplo de un semáforo, quizá te pueda servir para darte una idea.
*Semáforo con PIC12X508*

Suerte.


----------



## sydjoe (Ene 10, 2013)

D@rkbytes dijo:


> Supongo que te refieres a mi...
> Bien, pues con respecto a tus preguntas...
> Si solo quieres activar un buzzer, así como lo describes basta, PORTX.X = 1
> Lo puedes controlar con un transistor simplemente.
> ...



Jeje muchas gracias, se me olvido colocar a quien me refería, pero muchas gracias tu semáforo esta mucho mejor que el mio jajajaja (claro Estoy comenzando a programar... ), cuando lo termine lo subo para que me feliciten tambien, ademas le voy agregar un control remoto para encenderlo espero poder hacerlo sin preguntar. Saludos


----------



## sydjoe (Ene 11, 2013)

D@rkbytes dijo:


> Supongo que te refieres a mi...
> Bien, pues con respecto a tus preguntas...
> Si solo quieres activar un buzzer, así como lo describes basta, PORTX.X = 1
> Lo puedes controlar con un transistor simplemente.
> ...



HOLA D@rkbytes como estas? oye no se que sucede ayer hice este programa y funciona perfecto "device 16f877", luego hoy me puse a hacer lo del semáforo que te mencione anteriormente y no funciona, inclusive usando parte del otro programa y nada el pulsador no funciona, solo funciona cuando asigno que el pulsador sea igual a 1 y que encienda el led, pero al colocarle luego del "then" delayms 100 deja de funcionar . Que estaré haciendo mal?? o que estará pasando?? de ante mano gracias.


----------



## D@rkbytes (Ene 11, 2013)

sydjoe dijo:


> HOLA D@rkbytes como estas? oye no se que sucede ayer hice este programa y funciona perfecto "device 16f877", luego hoy me puse a hacer lo del semáforo que te mencione anteriormente y no funciona, inclusive usando parte del otro programa y nada el pulsador no funciona, solo funciona cuando asigno que el pulsador sea igual a 1 y que encienda el led, pero al colocarle luego del "then" delayms 100 deja de funcionar . Que estaré haciendo mal?? o que estará pasando?? de ante mano gracias.


Saludos.
Prueba entonces así...

```
Device 16F877

Config HS_OSC,WDT_OFF,PWRTE_ON,LVP_OFF,BOREN_OFF

Xtal=20

TRISD = 0
TRISB = 1

PORTD = 0

Dim a As Byte

All_Digital = 1

Inicio:
    If PORTB.0=1 Then
Bucle:
    DelayMS 400
    PORTD.0=1
    PORTD.1=1
    DelayMS 200
    PORTD.0=0
    PORTD.1=0
    DelayMS 600
    PORTD.2=1
    PORTD.3=1
    DelayMS 200
    PORTD.2=0
    PORTD.3=0
    DelayMS 400
    PORTD.4=1
    PORTD.5=1
    DelayMS 200
    PORTD.4=0
    PORTD.5=0
    DelayMS 600
    PORTD.0=1
    PORTD.1=1
    DelayMS 200
    PORTD.0=0
    PORTD.1=0
    DelayMS 600
    PORTD.2=1
    PORTD.3=1
    DelayMS 200
    PORTD.2=0
    PORTD.3=0
    DelayMS 400
    PORTD.4=1
    PORTD.5=1
    DelayMS 200
    PORTD.4=0
    PORTD.5=0
    DelayMS 600
    GoTo Bucle
    Else
    GoTo Inicio
    EndIf
    End
```
Te recomiendo que no solo te refieras a una sola persona, si tu caso lo pueden resolver otras más.
De esta manera podrás recibir colaboración y opiniones de otras personas. 

Suerte.


----------



## sydjoe (Ene 11, 2013)

Ok gracias, saludos a todos


----------



## jmpl (Ene 27, 2013)

Hola. estoy desarrollando un proyecto para medir temperatura utlizando un lm35 y PIC 16f877a.
soy nuevo en esto y es i primer proyecto. quisiera saber como cambio el estado de un puerto. por ejemplo tengo un el portc.5 = 0 y quiero ponerte un switch que al apretarlo me coloque ese mismo puerto  en 1 y asi prender un led para decir que mi lm35 esta funcionando. o si hay otra forma de hacerlo 

si alguien me pudiera ayudar estaria muy agradecido


----------



## D@rkbytes (Ene 27, 2013)

jmpl dijo:


> Hola. estoy desarrollando un proyecto para medir temperatura utilizando un lm35 y PIC 16f877a.
> soy nuevo en esto y es i primer proyecto. quisiera saber como cambio el estado de un puerto. por ejemplo tengo un el portc.5 = 0 y quiero ponerte un switch que al apretarlo me coloque ese mismo puerto  en 1 y así prender un led para decir que mi lm35 esta funcionando. o si hay otra forma de hacerlo
> 
> si alguien me pudiera ayudar estaría muy agradecido


Para saber como se cambia de estado un pin, deberías leer el tema desde el principio "Ahí está explicado"
*Normas del Foro* *16)* Antes de preguntar algo en un post. *¡ Lee (Y mira) todo el contenido **!*

En cuanto a qué con encender un LED ya quiera significar que el LM35 esté funcionando, Nop.
Quizás eso te sirva para indicar que estás encendiendo el termómetro, más no que funcione.
Eso necesita cierta rutina. Podrías hasta incluir comparaciones de temperatura, etc.

Adjunto un sencillo ejemplo con el LM35 a 10 Bits y un LCD 16x2

Lo que le quieras agregar ya corre por tu cuenta.

Suerte.


----------



## jmpl (Ene 27, 2013)

oye gracias por tu ayuda. pero si no es mucho pedir me puedes explicar algo.
la parte de la formula que utilizas en tu ejemplo: 19712 es el valor leído por el ADC a 1.5V (Voltaje máximo a 150°C). me puedes decir que es ADC? según lo que entiendo es el valor que recibe el puerto cuando entran 1.5v? estoy en lo cierto?

gracias


----------



## D@rkbytes (Ene 27, 2013)

jmpl dijo:


> 19712 es el valor leído por el ADC a 1.5V (Voltaje máximo a 150°C). me puedes decir que es ADC?


ADC = Analog Digital Converter.
Son las siglas en ingles de Conversor Analógico Digital.


jmpl dijo:


> según lo que entiendo es el valor que recibe el puerto cuando  entran 1.5v? estoy en lo cierto?


Sip. Al configurar la conversión a 10 Bits, ese es el valor leído por el ADC.


----------



## jmpl (Ene 28, 2013)

Oye gracias entendí.

Ahora tengo un pequeño problemita, el programa no hace lo que quiero, el programa que quiero hacer es sensar la temperatura con el lm35, si la temperatura es menor o igual a 18 que prenda el segundo led y apague los otros 2, y si esta entre 19 y 34 osea que si es mayor que 18 y menor que 35 encienda el tercer led, y si es mayor que 35 encienda el 4t0 y apague los demás, el led 1 lo utilizo para indicar que el lm35 esta funcionando, 


```
Device = 16F877A
XTAL 4



'parámetros del conversor analógico
Declare ADIN_RES = 10       ; 10 bits de resolución
Declare ADIN_TAD = FRC      ; Seleccionar RC OSC
Declare ADIN_STIME = 50     ; 50uS para tiempo de muestreo

Dim ADC_Value As Word     
Dim Temperatura As Float 

TRISC = 0

INICIO:
               
  PORTC.5 = 1
  PORTC.0 = 0
  
  ADC_Value = ADIn 0 
  Temperatura = ADC_Value * 150 / 19712 
  
     If Temperatura <= 18 Then 
     PORTC.2 = 1
     PORTC.3 = 0
     PORTC.4 = 0
     End If
      
     If Temperatura > 18 And Temperatura < 35 Then
     
     PORTC.3 = 1
     PORTC.2 = 0
     PORTC.4 = 0
     
     End If
     
     If Temperatura >= 35 Then
     
     PORTC.4 = 1
     PORTC.2 = 0
     PORTC.3 = 0
     End If
     
  DelayMS 500  

    
  GoTo INICIO
```

Estoy utilizando proton ide y el simulador en proteus con un PIC16f877A


Ajunto lo que he hecho para me ver si tengo algo mal o alguna sugerencia de como lo puedo arreglar.

Gracias por su tiempo.


----------



## ricbevi (Ene 28, 2013)

jmpl dijo:


> ahora tengo un pequeño problemita el programa no hace lo que quiero, el programa que quiero hacer es sensar la temperatura con el lm35, si la temperatura es menor o igual a 18 que prenda el segundo led y apague los otros 2, y si esta entre 19 y 34 osea que si es mayor que 18 y menor que 35 encienda el tercer led, y si es mayor que 35 encienda el 4t0 y apague los demas , el led 1 lo utilizo paa indicar que el lm35 esta funcionando,
> 
> ```
> Device = 16F877A
> ...



Hola...Verifica el esquema que te adjunto ya que en el tuyo colocabas el LM35 donde NO esta el ADC del PIC...debes leer la hoja de datos del pic a utilizar ya que no todos los PIC tienen las mismas soluciones de hardware en el mismo lugar.
Envuelve si vas a pegar código aquí en la etiqueta que dice CODE que es mas fácil para transportar y respeta la estructura de lo escrito.
El pin MCLR debes mandarlo a estado estado alto si  no no arranca el programa.
Revisa las aclaraciones que realice al código que esta mas arriba en este mensaje resaltado en colores.
La lógica esta bien pero se puede simplificar.

Saludos.

Ric.


----------



## jmpl (Ene 28, 2013)

gracias por tu ayuda me a servido mucho. 

pero tengo en problemas en abrir tu simulacion me sale este error: (archivo adjunto)
me gustaria verlo 

utilizo el proteus 7 professional


----------



## ricbevi (Ene 30, 2013)

A ver si ahora lo podes ver...ese problema es por que yo uso la versión 7.10 ahora lo guarde con compatibilidad a la versión 7.

Ric.


----------



## sydjoe (Ene 30, 2013)

buenas tardes amigos de la comunidad, estoy probando un buzzer y no he podido cambiar el tono sigue igual a pesar de los camandos que le coloque, espero me puedan decir que estoy haciendo mal o que esta mal, este es el programa:
adjunto tambien el pic en proteus.
edito: ah otra cosa cuando le coloco que si el pulsador sea igual 1, suena como un ruido en blanco. =)


```
device 16f877
Config XT_OSC,CP_OFF,CPD_OFF,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF
xtal=20 

TRISB = 1
TRISC = 0
Dim a As Byte
symbol buzzer=portC.0
SYMBOL BOTON=PORTB.0
all_digital=1

inicio:
FOR A=1 TO 120  STEP -1
SOUND BUZZER,[a,50]
next a
end
;IF BOTON=1 THEN
;DELAYMS 300
;Sound buzzer,[10,50]
;DELAYMS 1000
;Sound buzzer,[78,200]
;DELAYMS 1000
;Sound buzzer,[88, 100]
;DELAYMS 1000
;Sound buzzer,[119, 100]
;ELSE
;BUZZER=0
;END IF
END INICIO
```


----------



## D@rkbytes (Ene 30, 2013)

sydjoe dijo:


> estoy probando un buzzer y no he podido cambiar el tono sigue igual a pesar de los camandos que le coloque, espero me puedan decir que estoy haciendo mal o que esta mal





			
				D@rkbytes dijo:
			
		

> Al Buzzer solo le puedes cambiar la frecuencia del tono, Ya sabes en Edit Properties.


Utiliza el componente llamado SOUNDER

Saludos.


----------



## sydjoe (Ene 30, 2013)

excelente!! GRACIAS!!, estaba probando con un speaker segun la ayuda de proton al usar el comando "freqout", pero sonaba super bajito. espero que con el sounder pueda hacer mi programa completo, por fin. jiji


----------



## jmpl (Ene 30, 2013)

oye ricbevi muchas gracias por todo y tu tiempo .. te lo agradezco


----------



## jmpl (Feb 6, 2013)

D@rkbytes dijo:


> ADC = Analog Digital Converter.
> Son las siglas en ingles de Conversor Analógico Digital.
> 
> Sip. Al configurar la conversión a 10 Bits, ese es el valor leído por el ADC.



pero me puedes decir cual es la conversión o formula que realizas para obtener que 1.5v equivale a 19712?


----------



## D@rkbytes (Feb 6, 2013)

jmpl dijo:


> pero me puedes decir cual es la conversión o formula que realizas para obtener que 1.5v equivale a 19712?


Míralo tu mismo ahora con este ejemplo.

Saludos.


----------



## mendek (Feb 8, 2013)

Que tal foro, buenas tardes, bueno pues los 2 comentarios anteriores a este me sirvieron mucho, ya que estoy en un proyecto, al ver el programa proporcionado por D@rkbytes "16F877A Termómetro LM35 II.rar " me surgió una duda de si puedo usar el ds18b20 en vez del lm35 para este programa, desde ya muchas gracias.


----------



## D@rkbytes (Feb 8, 2013)

mendek dijo:


> Que tal foro, buenas tardes, bueno pues los 2 comentarios anteriores a este me sirvieron mucho, ya que estoy en un proyecto, al ver el programa proporcionado por D@rkbytes "16F877A Termómetro LM35 II.rar " me surgió una duda de si puedo usar el ds18b20 en vez del lm35 para este programa, desde ya muchas gracias.


Nop.
No son iguales, el LM35 es un sensor análogo, y el DS18B20 es un sensor digital.
Así que el programa, es totalmente diferente al que se usa para el DS18B20

Aquí esta un _proyecto para el DS18B20_

Saludos.


----------



## mendek (Feb 9, 2013)

muchas gracias D@rkbytes, abusando un poco, hice los siguiente, busque acerca de como hacer la converción en caso de querer medir voltaje, y di con la siguiente formula:

 ADC_Value = ADIn 5      
 voltaje=ADC_Value * 5 / 65535

para medir de 0 a 5 volts, pero en caso de que yo quiera medir un voltaje de 0 a 20 volts, no entiendo muy bien como se usa la fórmula para dicha converción, desde ya muchas gracias por la ayuda.


----------



## D@rkbytes (Feb 9, 2013)

mendek dijo:


> muchas gracias D@rkbytes


De nada. 


mendek dijo:


> busque acerca de como hacer la conversión en caso de  querer medir voltaje, y di con la siguiente formula:
> 
> ADC_Value = ADIn 5
> voltaje=ADC_Value * 5 / 65535
> ...


Pues si, así sería, para medir de 0 a 5V, pero los valores como ese de 65535, cambian.
Para que entiendas como determinar el factor de división, adjunto un ejemplo con la explicación.

Saludos.


----------



## mendek (Feb 9, 2013)

Osea que según entiendo, el procedimiento para determinar el 65535 o el 63168 (este último como en el ejemplo que me acabas de pasar) es ver el valor tope (por así decirlo) de ADIn que se tiene al medir los 20v efectivos, obviamente siempre que se pase a un voltaje adecuado para el PIC, es correcto esto?


----------



## D@rkbytes (Feb 9, 2013)

mendek dijo:


> Osea que según entiendo, el procedimiento para determinar el 65535 o el 63168 (este último como en el ejemplo que me acabas de pasar) es ver el valor tope (por así decirlo) de ADIn que se tiene al medir los 20v efectivos, obviamente siempre que se pase a un voltaje adecuado para el PIC, es correcto esto?


Pues si, sin embargo el valor que tome, es el valor a través de los componentes del divisor de tensión.
Y por eso dije que ese valor cambia, debido a las tolerancias de los mismos.
Si aplicamos +5V directamente, la lectura directa debe ser de 65472, así como está el código.
Y he aquí un error mio en la programación, ya que deberíamos obtener como lectura 1023
que son los 10 Bits b'1111111111' = 1023, para esto debí haber configurado el registro ADCON1
con el bit 7 a 1  y entonces si obtendremos como lectura 1023 al tope del ADC.
Esto haría tener una justificación a la derecha de la lectura,
y los 6 bits más significantes de ADRESH serían leidos como ceros.

Ahora entonces, tendrás que hacer la correspondiente modificación al programa. 

Suerte.


----------



## sydjoe (Feb 11, 2013)

D@rkbytes dijo:


> Nop.
> No son iguales, el LM35 es un sensor análogo, y el DS18B20 es un sensor digital.
> Así que el programa, es totalmente diferente al que se usa para el DS18B20
> 
> ...


buenas noches foro, tengo una duda, ¿como hago para guardar el estado de un puerto para usarlo despues y mandar a hacer una instruccion dependiendo del estado de este?, y otra preguntita y disculpen el abuso, ¿mientras se este ejecutando una linea del programa, no puedo hacer otra cosa? por ejemplo ver si un boton fue presionado y hacer tal cosa. de ante mano gracias.


----------



## mendek (Feb 11, 2013)

En cuanto a la primer pregunta, a como yo lo entiendo, simplemente manda dicho puerto al estado que quieras y después compruébalo con un if. La segunda me la respondió D@rkbytes con anterioridad, puedes leer unas páginas atrás.


----------



## D@rkbytes (Feb 11, 2013)

Usa una variable...
Dim Var_PortX As Byte

Luego la cargas con el estado del puerto...
Var_PortX = PORTX

Para saber si un botón fue pulsado mientras  corre el programa principal, puedes hacer uso de las interrupciones.

Suerte.


----------



## sydjoe (Feb 12, 2013)

D@rkbytes dijo:


> Usa una variable...
> Dim Var_PortX As Byte
> 
> Luego la cargas con el estado del puerto...
> ...



gracias, eso es exactamente lo que estoy buscando, pero no se como usar las interrupciones. se usa asi:
led=1
on interrupt
boton==1
resumen
led=1. 

jeje espero ir por buen camino. . de ante mano gracias


----------



## D@rkbytes (Feb 12, 2013)

sydjoe dijo:


> gracias, eso es exactamente lo que estoy buscando, pero no se como usar las interrupciones. se usa asi:
> led=1
> on interrupt
> boton==1
> ...


Algo así,  para más botones (4 P.E) puedes usar la interrupción por cambio de estado en RB4<>RB7
Si solo requieres detectar el estado de un botón puedes usar la interrupción por RB0.

```
On_Hardware_Interrupt GoTo MyInt
INTCON = %11010000          ; Configurar la Interrupción solo por RB0
OPTION_REG.6 = 0            ; Activar la interrupción por flanco de bajada en RB0

MainProgram:
; Aquí tu código principal (Esto es un ejemplo)
    PORTA.0 = 1
    DelayMS 100
    PORTA.0 = 0
    DelayMS 100
    GoTo MainProgram

; Esta parte es el controlador de la interrupción.
Int_Sub_Start 
; Aquí se llega al ejecutarse la interrupción.
MyInt:
    Context Save              ; Guardar el contexto de los registros.
    INTCON.1 = 0            ; Limpiar la bandera de interrupción por RB0
; Aquí el código que se ejecutara durante la interrupción del programa principal.
    PORTA.1 = 1
    DelayMS 1000
    PORTA.1 = 0
    Context Restore          ; Restaurar el contexto de los registros.
    End
```
Suerte.


----------



## sydjoe (Feb 12, 2013)

GRACIAS me sirvio mucho la ayuda!  ahora el incoveniente es que si dentro de la interrupcion utilizo un while o if, se detiene completamente la secuencia del programa, te paso el programa para que lo veas con tus propios ojos, jeje. ah bueno y la finalidad o la idea de lo que quiero hacer es que el semaforo tenga un control remoto IR con el cual yo encienda el sonido dependiendo del color en el cual se encuentre, mas que todo con el estado verde y rojo peatonal.


----------



## razetto (Feb 12, 2013)

Hola, necesito ayuda con la programación en Proton, necesito controlar la velocidad de un motor cc con dos pulsadores, uno para que incremente y el otro para que disminuya. Todo lo tengo armado con un PIC 16F877A. Utilizando el ejemplo de Proton funciona pero como yo necesito que los incrementos sean al pulsar, no me responde, queda siempre a la misma velocidad.

Este es mi programa:


```
Device = 16F877A           
Declare Xtal = 4      

Dim Duty As Byte
Duty = 128
Symbol PIN = PORTC.6     'IN1 L293D

TRISA =%11111111
TRISC =%00000000


PROG1:
    High PORTC.5          'Enable L293D
    If PORTA.0 = 0 Then Duty = Duty + 32  'Aumenta la Vel.
    If PORTA.1 = 0 Then Duty = Duty - 32  'Disminuye la Vel.
    DelayMS 5
    PWM PIN,Duty,20 
GoTo PROG1
```

 Si me pudiesen dar una solución.

Muchas Gracias.


----------



## D@rkbytes (Feb 13, 2013)

sydjoe dijo:


> GRACIAS me sirvio mucho la ayuda!  ahora el incoveniente es que si dentro de la interrupcion utilizo un while o if, se detiene completamente la secuencia del programa, te paso el programa para que lo veas con tus propios ojos, jeje. ah bueno y la finalidad o la idea de lo que quiero hacer es que el semaforo tenga un control remoto IR con el cual yo encienda el sonido dependiendo del color en el cual se encuentre, mas que todo con el estado verde y rojo peatonal.


OK.

Prueba así...

```
[B]Disable[/B]
ESTADOAUDITIVO:
    [B]Context Save[/B]             
    [COLOR=SeaGreen]INTCON[/COLOR].1 = 0 
    [B]If[/B] verdeP = 1 [B]Then[/B]
    [B]FreqOut[/B] Buzzer,100,1000 
    [B]DelayMS[/B] 1000
    [B]FreqOut[/B] Buzzer,100,1000
    [B]DelayMS[/B] 1000
    [B]FreqOut[/B] Buzzer,100,1000
    Buzzer = 0          
[B]    EndIf    
    Resume    
    Context Restore
    Enable[/B]
```
Suerte.


----------



## sydjoe (Feb 13, 2013)

gracias D@rkbytes! tambien muchas gracias al foro .


----------



## yoeninstein (Feb 19, 2013)

que tal amigos espero me pudan echar un soplidito ajajja lo que pasa es que me decidi empezar a jugar con los pics tengo el 16f887 y me encontre un tutorial para el proton ide hasta ahi todo bien pero el ejemplo que bien para novatos de prender y apagar un led lo paso por proteus y funcina sin problemas pero lo monto en mi proto le pongo un regulador de 5 volts 7805 y no funciona primero no encendia nada ni el led nadams el led piloto que puse para saber si tiene voltaje me puse a leer resulta que tenia que ponerle la instruccion para trabajar con osilador interno ok ya prendio el led pero no se apaga como en la simulacion, se queda prendido y si toco algun componente se apaga y se queda apagado si toco la tierra del transistor regulador se apaga el led si toco alguna terminal del chip se apaga el led si mando a tierra el pin 1 del chip se apaga el led le pongo aqui el codigo que creo esta de mas por que es algo que ya pusieron por todo el foro pero igual lo pongo espero que alguin vea este post y me puda echar la mano por adelantado les agradesco la ayuda que pudan brindar que algun sere reciproco con lo que aprenda 


cabe decir que el portd.7 es la terminal 30 del 887 


*Device *= *16F887*[/SIZE] _' Use a device with full speed USB capabilities
[/size]_OSCCON = %01100110 _'Se configura reloj interno a 4Mhz 
[/size]_*Symbol *LED=PORTD.7
INICIO:
*High *LED
*DelayMS 1*000
*Low *LED
*DelayMS 1*000
*GoTo *INICIO


----------



## D@rkbytes (Feb 19, 2013)

¿Ya estableciste la palabra de configuración ?
De ella dependen varias cosas, y sobre todo el tipo de oscilador que se usará.

Aquí puedes ver algo acerca de lo que te menciono --> _Palabra de configuración 16F882 /887_


----------



## yoeninstein (Feb 19, 2013)

voy a darle una leida y dejo saber el avance


----------



## yoeninstein (Feb 20, 2013)

gracias a todos por su ayuda ya me funciono al moderador que me oriento tambien gracias si me faltaban los fuses ahora voy con otro poryectode los que e visto aqui en el foro para practicar


----------



## electrobicho (Feb 20, 2013)

Saludos a todos, alguien podría poner algún ejemplo de como usar un registro de desplazamiento, encender 8 led por ejemplo, o algo básico para basarme para hacer un código que tengo en mente, lamentablemente nunca los e usado pero tengo en mis manos un 74ls164, espero me puedan brindar su ayuda, encuentro ejemplos en C y soy muy malo en eso


----------



## yoeninstein (Feb 20, 2013)

bueno me encontre otro ejercicio interesante para practicar codigo es este

*Device 16F887*[/SIZE] _ 




[/size]_*Config1 *INTRC_OSC_NOCLKOUT,LVP_OFF,FCMEN_ON,IESO_OFF,BOR_OFF,CPD_OFF,CP_OFF,MCLRE_ON,PWRTE_ON,WDT_OFF
*Config2 *WRT_OFF,BOR21V

OSCCON = 0b1100100_;
[/size]_TRISC=0
PORTC=0
　
　
inicio:
*Toggle *PORTC[/SIZE].0 ' cambia de 0 a y de 1 a 0
*DelayMS *6000
*Toggle *PORTC[/SIZE].1
*DelayMS *6000
*Toggle *PORTC.2
*DelayMS *6000
*GoTo *inicio

con este codigo se supone que deben de prender los leds uno por uno quedarce encendidos y apagarce cuando el codigo le invierte el estado con el comando toggle  porque el toggle lei es para invertir el estado del puerto
 si es 0-1 si es 1-0
bueno resulta que contodos los ports funciona como debe de ser se quedan encendidos los leds hasta que el codigo les dice que se apaguen otra ves  menos con el portc con cualquiera de las salidas del port c el led prende y apaga no se queda encendido si algun guro me pudiera echar la mano quiero aprender y pues hasta aqui llegue no se si ay quedarle alguna instruccion extra al pic


----------



## gustavo01 (Feb 22, 2013)

pipo12 dijo:


> hola que tal amigos les cuento que llevo mas de 1 año  trabajando con proton IDE y es de lo mejor en la actualidad trabajo con  Glcd samsung y toshiba y han respondido muy bien, hay un par de cosas q  aun no he logrado con ellas pero estoy seguro que mas adelante lo  lograre que rico encontrar este foro y sobretodo encontrar gente de  Colombia, bueno amigos en unos días voy ha postear unos ejemplitos para  el manejo de las Glcds felices Pascuas.....



Cordial saludo para todos en este foro estoy dando mis primeros pasos  con los micro y proton me parece muy bueno, ahora tengo un problema y es  q*ue* cuando mi pc tenia xp el compilador funcionaba muy bien ahora  q*ue*  tengo la nueva versión de windwos no me compila el programa  quisiera  saber si ud cuenta con una nueva versión actualizada de este editor que  me funcione ahora muchas gracias.


----------



## D@rkbytes (Feb 22, 2013)

Esto es lo más nuevo desde la página oficial de Proton


----------



## gustavo01 (Feb 23, 2013)

Saludo muchas gracias por su pronta respuesta , ya descargue el programa lo instale pero no me compila he visto algunos tutoriales en la red donde dice que ha que configurar con un compilador pero no me funciona , muy seguramente sabes de lo que estoy hablando porque parece que es un paso para que funcione , si me puedes ayudar me seria de mucha utilidad.espero atento.


----------



## D@rkbytes (Feb 23, 2013)

gustavo01 dijo:


> Saludo muchas gracias por su pronta respuesta , ya descargue el programa lo instale pero no me compila he visto algunos tutoriales en la red donde dice que ha que configurar con un compilador pero no me funciona , muy seguramente sabes de lo que estoy hablando porque parece que es un paso para que funcione , si me puedes ayudar me seria de mucha utilidad.espero atento.


Tienes que tener instalado MPLAB®, lo puedes descargar desde aquí --> Microchip MPLAB IDE
Te vas hasta abajo de la pagina, en la sección Downloads y descargas MPLAB IDE
Que para ésta fecha es la versión 8.89 y pesa más de 100Mb. (111Mb Aprox.)
Por ahora el compilador que tienes que seleccionar, se encuentra en la carpeta PDS
Esa carpeta está donde instalaste Proton IDE. Por default en C:\Archivos de programa\ProtonIDE\PDS
Eso lo haces en el menú View --> Compile and Program Options...
Puedes seleccionar Find Automatically... ó Find Manually... Te recomiendo que utilices Find Automatically...
Con eso hecho, ya debes poder compilar tus programas.

Suerte.


----------



## gustavo01 (Feb 23, 2013)

Bueno muchas gracias por el tiempo y el interes con el cual me haz ayudado, le comento que ya tenia instalado el Mplab version 8.85, lo que no se es si hay que hacer algun procediemiento para que trabajen juntos o algo asi, por otro lado realice el procedieminto tal cual me lo explico pero nada sigue sin funcionar siempre q intento compilar me sale en la parte de abajo un mensaje que dice: "ERROR:missing security key" e intenta compilar sale una linea roja muy rapido y no sale nada mas , creo que seguire con el editor que tenia antes pues es una version portable de pbp   me tocara instalar xp de nuevo.


----------



## sydjoe (Feb 26, 2013)

Buenos días a todos, hola chicos ya estoy practicando con lcd y display 7 segmentos, con lcd me fue super bien, pero cuando estuve practicando con el display no me funciono inclusive me dio un  mensaje, aquí les dejo las imágenes correspondientes a cada prueba.
en la imagen la simulación 1 lo probé así:

```
device= 16f877a
Config XT_OSC,CP_OFF,CPD_OFF,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF
xtal 20
Dim VEC As Byte
DIM NUM AS BYTE
ALL_DIGITAL= TRUE
portb_pullups=false 
trisc =%00000000
'PORTC=%11111111
VEC=0
num=0  
INICIO:
PORTC=%11111111
for vec=0 to 9
lookupl vec,[191,134,219,207,230,237,253,135,255,239], ' o [0,1,2,3,4,5,6,7,8]
portc=num
delayms 1000
next vec
goto inicio

y la segunda simulacion asi:
device= 16f877a
Config XT_OSC,CP_OFF,CPD_OFF,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF
xtal 20
Dim VEC As Byte
DIM NUM AS BYTE
ALL_DIGITAL= TRUE
portb_pullups=false 
trisc =%00000000
'PORTC=%11111111
VEC=0
num=0  
INICIO:
for vec=0 to 9
lookupl vec,[191,134,219,207,230,237,253,135,255,239], ' o [0,1,2,3,4,5,6,7,8]
portc=num
delayms 1000
next vec
goto inicio
```

solo me ha funcionado con un ejemplo de select case pero solo he podido que cuente hasta 6 y yo quiero que cuente hasta 6 después hasta 3 y luego otra vez 6 en bucle. espero me ayuden gracias amigos. 

edito: según es un problema con la ubicación y escritura en la memoria del pic,
pero ¿por qué con el ejemplo del select case no sucede eso?. ji. gracias.


----------



## DEPREDADORX1 (Feb 26, 2013)

Hola Sydjoe,

A ver, yo probé el código y le agregué algunas modificaciones pequeñas, puse un led para indicar que finaliza un primer conteo de 0-9 y sigue otro de 0-3, me parece que puede servirte, haz los cambios que necesites y comenta. Suerte.


----------



## sydjoe (Feb 27, 2013)

DEPREDADORX1 dijo:


> Hola Sydjoe,
> 
> A ver, yo probé el código y le agregué algunas modificaciones pequeñas, puse un led para indicar que finaliza un primer conteo de 0-9 y sigue otro de 0-3, me parece que puede servirte, haz los cambios que necesites y comenta. Suerte.
> 
> buenos dias muchas gracias, estuve leyendo por alli y encontre esta tabla de valores " TABALA.JPG" y asi si me funciono agregandole los cambios tambien.  besos.


----------



## mendek (Feb 28, 2013)

Que tal, busque sobre el comando cls, pero no me quedo muy claro, lo que quiero hacer es que cuando una cantidad varíe (en una LCD) por ejemplo:
imprimo en la LCD 65283 
y si ésta baja a 245 (si no borro totalmente la pantalla)
me queda 24583 
El punto es, que quiero saber como refrescar esa posición donde está varando dicho número sin necesidad de borrar toda la pantalla, para que no se vea el parpadeo con cada pasada del cls. Espero que me entiendan  desde ya muchas gracias


----------



## D@rkbytes (Feb 28, 2013)

Tan solo cuenta los caracteres que sobran, en tu caso 2 (83) y rellena ese sobrante con espacios.
Por ejemplo:
Print At 1,1,Dec3 Result,"  " ; <-- Dos espacios para borrar los sobrantes.

Suerte.


----------



## sydjoe (Mar 4, 2013)

BUENOS DIAS COMUNIDAD, los felicito por saber tanto de proton ide y todo lo que involucra, pero yo por otra parte no tengo la misma suerte,, desde hace tiempo estoy (tratando) haciendo un semaforo con algunas cualidades, pero me a costado un monton...., pero gracias a ustedes ya he hecho bastante, gracias. La pregunta que tengo para hoy en mi caso es que ¿como hago para introducir el for de conteo de un display 7 segmentos sin que se coloque lento el programa por el on_interrupt?, lo e intentado hacer asi: coloco dos pic, uno para el contador y el otro para el semaforo, pero no hay sincronizacion, y cuando coloco el contador dentro de la misma parte del semaforo es decir la secuencia for, cuenta una sola secuencia y no me lee las otras secuencias de conteo, y si mientras hace el primer conteo hago la interrupcion se pone lento. aqui les dejo la simulacion y los programas. Espero me haya sabido explicar. de ante mano gracias


----------



## D@rkbytes (Mar 6, 2013)

Mira si tras corregir algunos detalles tanto en la simulación como en los programas, ya te funciona.
No sé bien como funcione tu proyecto, así que solamente tú podrás determinarlo.

Los detalles fueron:
La velocidad del PIC Contador estaba en 1MHz en la simulación.
Reduje la cantidad de variables para ahorrar memoria.
Modifique el uso de LookUpL, ya que en mi versión generaba error por ser obsoleta la sintaxis.
Corregí los For de 0 a 2 y de 0 a 5 para el uso de LookUpL ( llegar a 3 y a 6 queda fuera de la tabla)
No es muy importante el excedente de un número, pero puede causar confusiones. 
En el diseño utilizaste dos PIC16F877, pero en los programas usaste PIC16F877A.
Y eso genera errores de compatibilidad por locaciones de memoria.
Reduje la velocidad a 4MHz, ya que de esa forma es mas estable la simulación.
Ya cuando montes el circuito físicamente, la podrás cambiar a 20MHz.

Suerte.


----------



## mendek (Mar 15, 2013)

D@rkbytes dijo:


> Para saber como se cambia de estado un pin, deberías leer el tema desde el principio "Ahí está explicado"
> *Normas del Foro* *16)* Antes de preguntar algo en un post. *¡ Lee (Y mira) todo el contenido **!*
> 
> En cuanto a qué con encender un LED ya quiera significar que el LM35 esté funcionando, Nop.
> ...



Que tal, en la materia de instrumentación, estamos haciendo censado de temperatura, pero ahora medimos temperatura por de bajo de los 0 °C, y no pudimos, así que el profesor nos dejo investigar como hacer para medir estas temperaturas , y lo que he encontrado es con amplificadores operacionales, pero nada directo del LM35 al PIC, es posible esto(directo)?


----------



## DEPREDADORX1 (Mar 16, 2013)

Hola Mendek,

En el foro de pic basic pro hay un ejemplo que utiliza el sensor DS1624 que mide temperaturas positivas y negativas entre  -55°C to +125°C, no sé si ese rango podría servirte pero de cualquier forma quería hacertelo saber.

Suerte en tu investigación.


----------



## D@rkbytes (Mar 18, 2013)

mendek dijo:


> Que tal, en la materia de instrumentación, estamos haciendo censado de temperatura, pero ahora medimos temperatura por de bajo de los 0 °C, y no pudimos, así que el profesor nos dejo investigar como hacer para medir estas temperaturas , y lo que he encontrado es con amplificadores operacionales, pero nada directo del LM35 al PIC, es posible esto(directo)?


Mira el ejemplo que adjunto, utiliza dos amplificadores operacionales para conseguir lecturas negativas.
Mide desde -55 °C hasta los 150 °C del LM35.
Personalmente no lo he probado así, solamente con conexión directa al PIC (0 °C hasta 150 °C)
Espero les sirva, y si lo llegan a armar, nos comentan los resultados.

Suerte.


----------



## yager (Mar 24, 2013)

hola amigos quisiera de su gran ayuda en el siguiente: que es un reloj con salida para una matriz de leds ,como puedo configurar en las interrupciones de manera que no habilite los pull ups de portB ya que estoy utilizando para las filas de la matriz

```
Symbol FILA = PORTB
 Symbol Dato = PORTA.0
 Symbol Shift = PORTA.1
 Symbol Load = PORTA.2
 hour = 12        				 
 minute = 54
 second = 0
  All_Digital = True
  Low FILA 
-->  OPTION_REG = %01010110      ' Set TMR0 configuration and enable PORTB pullups
--> INTCON = $A0        		' Enable TMR0 interrupts
  On Interrupt GoTo Tickint		' Create a SOFTWARE INTERRUPT
 
 Inicio:
```


----------



## D@rkbytes (Mar 25, 2013)

yager dijo:


> hola amigos quisiera de su gran ayuda en el siguiente: que es un reloj con salida para una matriz de leds ,como puedo configurar en las interrupciones de manera que no habilite los pull ups de portB ya que estoy utilizando para las filas de la matriz


El bit que habilita o deshabilita las resistencias pull-up del puerto B es el bit 7 (RBPU) del registro OPTION_REG
Cuando está en 1 (Por default) se encuentran deshabilitadas, y en 0  se habilitan.
Por lo tanto solo cambia la configuración que tienes por ésta otra...

OPTION_REG = %*1*1010110      ' Set TMR0 configuration and *disable* PORTB pullups

Saludos.


----------



## COSMICO (Abr 3, 2013)

Hola muchachos, que buen tema.
miren la hora que me dio aqui en colombia, y teniendo que madrugar a trabajar..jejje
Me podrian dar una idea de como usar el TMR1 como cntador de pulsos externos en Proton.
Gracias y felicidades.


----------



## DEPREDADORX1 (Abr 4, 2013)

Pues ahí va este ejemplo que está en basic pro y los cambios son mínimos:

```
'PICBASIC PRO program to demonstrate using Timer1 gate in single-pulse mode to capture single pulse event times.
' Description : PICBASIC PRO program to demonstrate using Timer1 gate
' in single-pulse mode to capture single pulse event times.

Device = 16F877A
Xtal = 20

All_Digital true
'Declaration for LCD 
       Declare LCD_Type = 0         ;LCD is Alpha
       Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
       Declare LCD_ENPin = PORTD.1  ;LCD EN line
       Declare LCD_RSPin = PORTD.0  ;LCD RS line
       Declare LCD_Interface = 4    ;LCD 4 line interface
       Declare LCD_Lines = 2
	 
  Dim	Pval As Word    ' Holds pulse time from Timer1
  
  GoSub Init    ' Hardware initialization routine  
	    
'Clear
   
	mainloop:
	   PORTB.4 = 1   ' Toggle RB4 on Timer1 gate pin high
       PORTB.4 = 0   ' Toggle Timer1 gate pin low to stop Timer1	    
	   Pval.LowByte = TMR1L  ' Read Timer1 value
	   Pval.HighByte = TMR1H	    
	   Print At 2,1, "pulsos",Dec Pval	    
	  ' GoSub Reset1   ' Clear Timer1 count & reset T1 gate
	   DelayMS 500   
	   GoTo mainloop ' Do it forever
	    
	Reset1:
	   TMR1H = 0    
	   TMR1L = 0
	   Return
	    
	Init:
       TRISC.0=1	    
	   TRISB = %00100000  ' RB5 = input for T1 gate, RB4 = output to gate
	   PORTB = 0          ' Hold T1 gate low at start	    
	   T1CON = %00000011  ' Timer1 on, incremento por tocki   
       Return
	   End
```


----------



## COSMICO (Abr 4, 2013)

Hola amigo DEPREDADORX1.
Gracias, muy amable buen dato.


----------



## mendek (Abr 26, 2013)

Que tal compañeros, bueno pues ya he encontrado info. acerca del protocolo de comunicación SPI para la aplicación de los módulos NRF24L01 y encontré ésta imagen:





pero tengo el problema que ahora no cuento con posibilidades de comprar este PIC, pero tengo el PIC16F887 y según yo la forma de conectarlo es la siguiente:

Pero bueno, lo mero mero, es que no encuentro ejemplos de éste protocolo para Proton IDE, tengo entendido que necesito algunas librerías para hecharlo a andar, espero alguien me pueda orientar desde ya gracias


----------



## D@rkbytes (Abr 26, 2013)

Saludos mendek.
Empieza por estudiar las instrucciones SHIn y SHOut
Estas sirven para lograr comunicación SPI con Proton.

Suerte.


----------



## carptroya (Abr 28, 2013)

pasate por este hilo.

http://www.todopic.com.ar/foros/index.php?topic=22611.0


saludos


----------



## ke45 (May 2, 2013)

nesecito ayuda cuando compilo en proton sale este error 
error:usb key  not  found


----------



## oscarintintin (May 25, 2013)

como puede leer el ancho de un pulso que entra al pic, basicamente la señal del encoder de un motor controlado por pwm. Hechado una ojeada alas paginas anteriores que usan el comando pulsin o el timer1 alguien me podria brindar un ejemplo en esto ? gracias de antemano. Existe algun conflicto al usar el hpwm y el pulsin ?

el valor que me arroja el pulsin no concuerda con el del osciloscopio en la simulacion


----------



## mendek (May 25, 2013)

D@rkbytes dijo:


> ¿Cuando te refieres a usar oscilador externo, a que tipo te refieres?
> Hay externo con cristal  XT, HS (High Speed), con resonador, R/C y fuente de reloj externa.
> 
> Los tipos de palabra de configuración desde el 16F882 hasta el 16F887 son los mismos.
> ...



Que tal compañeros bueno pues siguiendo lo que cité tengo esto:

```
'*SELECCIONAR MICROCONTROLADOS PIC.   
Device 16F887
'* PALABRAS DE CONFIGURACIÓN.
Config1 HS_OSC,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,WDT_OFF,FCMEN_ON,IESO_OFF,LVP_OFF,BOR_OFF
Config2 WRT_OFF,BOR21V 
Xtal=16
'* TODOS LOS PUERTOS SE CONFIGURAN COMO DIGITALES.
All_Digital = true 
'* SE DEFINEN LOS PARÁMETROS DEL CONVERSOR ANALÓGICO.
Declare Adin_Res = 10       ; 10 bits de resolución. 
Declare Adin_Tad = FRC      ; Seleccionar RC OSC.
Declare Adin_Stime = 50     ; 50uS para tiempo de muestreo.
```

y siendo así el microcontrolador debería funcionar con un reloj externo de 16MHz pero a pesar de que se lo quito éste sigue funcionando, mi duda es como se hace que trabaje con un reloj externo de 16MHz, es necesario configurar el registro OSCCON?


----------



## becar (May 27, 2013)

hola, estoy iniciandome en programacion con proton que descargue de internet, pero no me compila el programa, me tira un error que dice : USB Key not found.
Alguien me puede ayudar con esto ? gracias.


----------



## D@rkbytes (May 27, 2013)

mendek dijo:


> el microcontrolador debería funcionar con un reloj externo de 16MHz pero a pesar de que se lo quito éste sigue funcionando


Éste y algunos otros PIC, cuentan con un sistema llamado (Fail-Safe Clock Monitor)
Sirve para detectar fallas en el módulo del oscilador externo.
Cuando existe una falla empieza a funcionar este sistema, habilitando automáticamente el oscilador interno.
Pero si estás trabajando a una frecuencia de 16MHz, entonces se reducirá la frecuencia trabajo,
ya que la máxima frecuencia de operación del oscilador interno es de 8MHz.

Éste modo de operación es controlado por el fuse FCMEN (Fail-Safe Clock Monitor Enable)
Cuando está en ON se habilita la capacidad de que entre en funcionamiento el oscilador interno.



mendek dijo:


> mi duda es como se hace que trabaje con un reloj externo de 16MHz, es  necesario configurar el registro OSCCON?


Para trabajar con un oscilador externo se debe usar el fuse EXT_RC.
Y para usar un cristal de 16MHz, se debe usar el fuse HS_OSC.
El registro OSCCON solamente se configura cuando se trabaja con el oscilador interno.
En el se establece a que frecuencia trabajara el oscilador interno, si será de baja o alta frecuencia,
desde 31KHz, hasta 8MHz, si en baja o alta frecuencia será estable, y otras cosas más.

Cómo siempre se a dicho...
Lean la hoja de datos del PIC y encontraran toda la información que necesitan.


ke45 dijo:


> nesecito ayuda cuando compilo en proton sale este error
> error:usb key  not  found





becar dijo:


> hola, estoy iniciandome en programacion con proton  que descargue de internet, pero no me compila el programa, me tira un  error que dice : USB Key not found.
> Alguien me puede ayudar con esto ? gracias.


Ese mensaje es debido a que el programa no está registrado.
Necesitas adquirir una licencia para recibir la clave (KEY)

Suerte.


----------



## mendek (May 28, 2013)

Ok D@rkbytes muchas gracias por la ayuda, ahora he estado experimentando con estas palabras de configuración y lo que me pasa es que conecto el circuito y  el PIC se reinicia cada segundo aproximadamente, al quemarlo con el masterprog me tira el siguiente aviso _"faltan bits de configuración en el archivo HEX!!"_ y lo que tengo es lo siguiente:


```
Device 16F887
'* PALABRAS DE CONFIGURACIÓN.
Config1 EXT_RC_ON,HS_OSC_ON,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,WDT_OFF,FCMEN_ON,IESO_OFF,LVP_OFF,BOR_OFF
Config2 FCMEN_OFF,WRT_OFF,BOR21V  
'* CONFIGURACIÓN DEL OSCILADOR INTERNO.     
Xtal=16
'* TODOS LOS PUERTOS SE CONFIGURAN COMO DIGITALES.
All_Digital = true 
'* SE DEFINEN LOS PARÁMETROS DEL CONVERSOR ANALÓGICO.
Declare Adin_Res = 10       ; 10 bits de resolución. 
Declare Adin_Tad = 32_FOSC   ; Seleccionar OSC.
Declare Adin_Stime = 50     ; 50uS para tiempo de muestreo.
```

otra duda es que estuve revisando el Declare Adin_Tad = 32_FOSC y tengo duda si está bien escrito ya que voy a utilizar un oscilador externo de 16MHz, según la ayuda es uno de los siguentes DECLARE ADIN_TAD 2_FOSC , 8_FOSC , 32_FOSC , or FRC, pero no estoy seguro si es el 32_FOSC.


----------



## D@rkbytes (May 28, 2013)

mendek dijo:


> que me pasa es que conecto el circuito y  el PIC se reinicia cada segundo aproximadamente, al quemarlo con el masterprog me tira el siguiente aviso _"faltan bits de configuración en el archivo HEX!!"_


Debe ser porque está mal tu palabra de configuración.
Para lo que requieres, usa esta...

```
Reminders = False
Config1 EXTRCIO,LVP_OFF,FCMEN_OFF,IESO_OFF,MCLRE_ON,PWRTE_ON,WDTE_OFF
Config2 WRT_OFF,BOR21V
Reminders = True
```



mendek dijo:


> otra duda es que estuve revisando el Declare Adin_Tad = 32_FOSC y tengo duda si está bien escrito ya que voy a utilizar un oscilador externo de 16MHz, según la ayuda es uno de los siguentes DECLARE ADIN_TAD 2_FOSC , 8_FOSC , 32_FOSC , or FRC, pero no estoy seguro si es el 32_FOSC.


Es muy importante el uso de esas declaraciones, ya que de ellas depende la resolución de la conversión.
Si no seleccionas bien el tipo de reloj que se usará para la conversión AD, puedes tener mala resolución,
y en el peor de los casos, ninguna conversión. Usa por ahora FRC y ve realizando pruebas.
Al usar FRC se garantiza que el conversor funcione sin problemas,
aunque se obtenga menor velocidad de conversión y resolución.
En la hoja de datos, pagina 105, tabla 9-1 se explica lo que te menciono con más detalles.

Saludos.


----------



## rrc46 (May 28, 2013)

D@rkbytes ¿podrías indicarme dónde puedo encontrar información sobre los fuses? Gracias.


----------



## D@rkbytes (May 28, 2013)

rrc46 dijo:


> D@rkbytes ¿podrías indicarme dónde puedo encontrar información sobre los fuses? Gracias.


Dependiendo del tipo de PIC, son los fuses que tiene, no todos tienen los mismos.
Por aquí puedes ver algunos. Significado de los Fuses
En la hoja de datos del PIC también, y en la carpeta PPI de Proton vienen los que usa cada PIC.
Sólo busca el archivo *.ppi correspondiente al PIC que vayas a usar.
La carpeta se encuentra por default en C:\Archivos de programa\ProtonIDE\PDS\Includes\PPI

Suerte.


----------



## rrc46 (May 28, 2013)

Muchas gracias D@rkbytes, ya supongo que cada micro tiene sus fuses, pero en los datasheets no dicen qué es cada uno, al menos yo no soy capaz de entenderlos y es por eso que este documento me aclara bastante.


----------



## D@rkbytes (May 28, 2013)

Con estos ejemplos que realicé, se demuestra el funcionamiento del sistema "Fail-Safe Clock Monitor".
Están desarrollados en torno a un PIC18F4550, que también cuenta con este sistema, así como el 18F2550,
el 16F88 y la serie 16F88X que son mas grandes que el anterior y cuentan con oscilador interno a 8MHz.

Los ejemplos muestran el estado del registro OSCCON en una pantalla LCD 16x2 y se hace parpadear un LED.
El LED tiene una duración de 1 segundo encendido y otro segundo apagado.

En el primer ejemplo se llevó la frecuencia de trabajo del PIC a 48MHz, partiendo de un cristal de 4MHz.
Y se configuró el registro OSCCON para trabajar estable a 8MHz.
Así, al desconectar el cristal de los pines 13 (OSC1/CLKI) y 14 (OSC2/CLKO/RA6) se activa el oscilador interno.
En este ejemplo se puede ver como se reduce la velocidad del encendido y apagado del LED a 4 veces.

En el segundo ejemplo también se parte de un cristal de 4MHz, pero sin elevar la frecuencia de reloj.
Entonces se configura el registro OSCCON para trabajar estable a 4MHz.
Cómo ambos osciladores tienen la misma frecuencia de reloj, no se nota el cambio al activarse el oscilador interno.

Para volver a restaurar el oscilador a cristal, se debe hacer un reset en el pin 1 (MCLR/Vpp/RE3)
Ya que no se sale de este modo ni activando el perro guardián (Watch Dog Timer)

Notas:
.- En los dos ejemplos se usa la misma conexión, lo único que cambia son los programas.
.- Se incluyen las simulaciones, pero los proyectos sólo se pueden ver funcionar si se hacen físicamente.

Saludos.


----------



## mendek (May 30, 2013)

Gracias por la información D@rkbytes, ahora estuve haciendo pruebas con el código que me mandaste


D@rkbytes dijo:


> Debe ser porque está mal tu palabra de configuración.
> 
> ```
> Reminders = False
> ...


Pero el pic sigue funcionando cuando le quito el cristal de 16MHz y no se ve ninguna diferencia en los tiempos de operación, cuando está con el cristal y cuando no, ya verifique la conexión y todo anda bien, sospecho de estas lineas de mi programa, no sé si afecten el PORTA.6 y 7 (pines para el clock):

```
'* TODOS LOS PUERTOS SE CONFIGURAN COMO DIGITALES.
All_Digital = true 
'* SE DEFINEN LOS PARÁMETROS DEL CONVERSOR ANALÓGICO.
Declare Adin_Res = 10       ; 10 bits de resolución. 
Declare Adin_Tad = FRC   ; Seleccionar OSC.
Declare Adin_Stime = 50     ; 50uS para tiempo de muestreo.
```
También intenté poner las otras palabras de configuración, pero me tira el mismo error en el masterprog:

```
Reminders = False
Config1 EXT_RC_ON,HS_OSC_ON,EXTRCIO,PWRTE_ON,MCLRE_ON,WDT_OFF,LVP_OFF,BOR_OFF
Config2 FCMEN_OFF,WRT_OFF,BOR21V
Reminders = True
```
No sé si algo estoy haciendo mal, pienso que una forma de verificar que el FSCM esté apagado es desconectar el cristal una ves que el PIC esté funcionando y que éste deje de funcionar o que en su defecto la velocidad de operaciones del PIC disminuya. Nuevamente gracias por la ayuda.


----------



## D@rkbytes (May 30, 2013)

mendek dijo:


> Gracias por la información D@rkbytes, ahora estuve haciendo pruebas con el código que me mandaste
> 
> Pero el pic sigue funcionando cuando le quito el cristal de 16MHz y no se ve ninguna diferencia en los tiempos de operación, cuando está con el cristal y cuando no, ya verifique la conexión y todo anda bien, sospecho de estas lineas de mi programa, no sé si afecten el PORTA.6 y 7 (pines para el clock):


¿Estás usando un oscilador externo a 16MHz, o un cristal de 16MHz.?
Debes aclarar que tipo estás usando, porque por lo que ahora comentas, estás usando un cristal de 16MHz.
Para los tipos, oscilador externo o cristal, el fuse de configuración es diferente. 


mendek dijo:


> sospecho de estas lineas de mi programa, no sé si afecten el PORTA.6 y 7  (pines para el clock):
> 
> ```
> '* TODOS LOS PUERTOS SE CONFIGURAN COMO DIGITALES.
> ...


Nop, esas líneas del programa no afectan a los pines del oscilador.


mendek dijo:


> También intenté poner las otras palabras de  configuración, pero me tira el mismo error en el masterprog:
> 
> ```
> Reminders = False
> ...


En esa palabra de configuración aparte de tener mal la sintaxis, no debes repetir los fuses del oscilador.
EXT_RC_ON ; No existe.
HS_OSC_ON ; No existe.
Cómo el compilador no los reconoce, toda la palabra de configuración quedará errónea en el  archivo HEX.
Y seguramente queda activo el fuse FCMEN, por lo tanto tu programa está trabajando con el oscilador interno.
Si estás usando un cristal de 16MHz, esta debe ser tu palabra de configuración...

```
Config1 HS_OSC,LVP_OFF,FCMEN_OFF,IESO_OFF,MCLRE_ON,PWRTE_ON,WDTE_OFF
Config2 WRT_OFF,BOR21V
```
Suerte.


----------



## mendek (May 31, 2013)

listo problema resuelto, si!! lo que pasa es que a veces a uno se le pasa mostrar los pequeños detalles  , GRACIAS por la ayuda


----------



## Mushito (May 31, 2013)

Hola, baje un archivo ejemplo de la pagina...
https://sites.google.com/site/proyectosroboticos/encoder/encoder-por-software/pic-encoder-usb

para probar mi compliador, luego abrì la carpeta descargada, de su carpeta descargada borrè el *.hex, abri el archivo *.bas con el proton, a continuacion le cambie solo el nombre del archivo bas y luego intentè compilar y nada.
Me saliò el siguiente mensaje de error (ver adjunto)
¿como puedo solucionarlo?


----------



## D@rkbytes (May 31, 2013)

Mushito dijo:


> Me saliò el siguiente mensaje de error (ver adjunto)
> ¿como puedo solucionarlo?




Claramente el compilador te está indicando los siguientes errores...

ERROR: Incapaz de encontrar PrPrc.exe
ERROR: Asegúrese que éste se localice en la carpeta Includes ​ 

Busca dentro de esa carpeta para comprobar la existencia del programa PrPrc.exe.

Puede ser que la instalación esté corrupta y tengas que reinstalar el programa Proton IDE.

Suerte.​ ​


----------



## miborbolla (Jun 12, 2013)

Hola Compañeros de foro:

Estoy practicando con transmisores/receptores infrarojos y en particular con un sensor de presencia, con la finalidad de tener otra opción a los sensores de calor PIR. 

¿Por que? como sabemos los sensores PIR aun cuando son muy efectivos como sensor de movimiento, no se desempeñan muy bien cuando en su campo de acción un objeto se queda fijo y simplemente ya no sensan nada a menos que se mueva de nuevo el objeto.

Viendo por el foro los diferentes circuitos, en la que la mayoría, están basados en el 555 y el 567 que son analógicos y por tanto dependen de temperatura y tolerancia de los componentes o que mas bien están pensados como sensores de proximidad de poco alcance, me decidi a usar un microcontrolador para este propósito.

dejo aquí el código, diagrama y archivo en proteus (dentro del archivo .rar)...aunque debo advertir que el archivo en proteus no simula para nada la sección del infrarojo, ya que no encontré ningún receptor para poderlo simular.


```
'****************************************************************
'*  Name    : detector IR.BAS                                   *
'*  Author  : miborbola                                         *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 04/06/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
 
Device = 16F628                      'SE DECLARA EL TIPO DE MICROCONTROLADOR A UTILIZAR 
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_OFF, MCLRE_OFF, DATA_CP_OFF 'se configuran fusibles de operacion (oscilador interno)
Xtal = 4                          ' DELCARAMOS LA FRECUENCIA DEL OSCILADOR EN EL MICROCONTROLADOR

All_Digital = On    
TRISA = %11111100       ' SE CONFIGURA PORTA COMO ENTRADAS
TRISB = %10000000       ' se configura el portb como salidas de la 0 a la 6 y la 7 como entrada
Symbol ROJO =   PORTB.4  'LED ROJO QUE INDICARA CUANDO ESTA OCUPADO EL LUGAR
Symbol VERDE =  PORTB.5  'LED VERDE QUE INDICARA CUANDO ESTA LIBRE EL LUGAR
Symbol RECEPTOR=PORTB.7  'ENTRADA CONFIGURADA PARA DAR ACUSE, SI EL FOTORECEPTOR SENSA LA FRECUENCIA EMITIDA POR EL DIODO EMISOR INFRAROJO 
Symbol HABILITA=PORTB.6  'salida que se utiliza para habilitar los pulsos del led infrarojo o Modulacion del Led infrarojo

                        '
Low ROJO                ' nos aseguramos de tener en nivel bajo nuestros leds a manera de "inicializacion"
Low VERDE               '
Low HABILITA            '

TRISB.3 = 0            ' SE DECLARA QUE PUERTO SE UTILIZARA COMO SALIDA PWM PARA EL DIODO EMISOR INFRAROJO
PR2       = 25         ' configura frecuencia 38KHz
CCPR1L    = 15         ' configura el Duty-Cycle al 50%
CCP1CON   = %00001100  ' selecciona el modo de PWM
T2CON     = %00000100  ' enciende el Timer2 ON + 1:1 prescale


Inicio:
    
    Low HABILITA       ' activamos rafaga infraroja de 38 khertz en el ambiente
    DelayUS 125        ' esperamos a que se propague el infrarojo en el ambiente
        If RECEPTOR=0 Then GoTo Enciende   ' si el receptor LF 1838 detecta la rafaga de 38 khz va a la rutina Enciende,
        If RECEPTOR=1 Then GoTo Apaga      ' si no la detecta va a la rutina Apaga
    High HABILITA       ' Desactivamos la rafaga de 38 khz en el ambiente
    DelayUS 125
        GoTo Inicio    ' volvemos al Inicio


Enciende:
            High ROJO    ' Encendemos el Led rojo para indicar que se detecto un objeto y,
            Low VERDE    ' Apagamos led verde 


Confirma:                 ' Con la finalidad de confirmar que un objeto se encuentra proximo se inicia este ciclo
                
                    High HABILITA ' nos aseguramos de no tener la rafaga infraroja de 38 khertz en el ambiente
                     DelayMS 2000  'esperamos dos segundos, aunque puede ser mayo o menor el tiempo 
                    Low HABILITA   ' activamos rafaga 38 kilohertz nuevamente
                     DelayUS 125
                    If RECEPTOR=0 Then GoTo Confirma' Si el recepto LF 1838 detecta rafaga de 38 khz salta a Confirma mientras se detecte objeto
                    High HABILITA  'si no se detecta rafaga (objeto) apagamos ragaga
                     DelayUS 125
                
GoTo Inicio                  'Regresamos al Inicio
        
Apaga:
            Low ROJO         'Como no se detecto rafaga de 38 khz apagamos led ROJO y
            High VERDE       'Encendemos led Verde
               
GoTo Inicio
```

*Mi teoría de operación:*

Como se podrá apreciar, el circuito esta basado en en un LED Infrarojo Comun y corriente, que  produce una ráfaga a 38 Khz utilizando la técnica PWM del propio microcontrolador y encendido/apagando por medio del PIN RB6; para poder "modular" el Infrarojo en comento.

Por otro lado tenemos un "clasico" receptor de infrarojos (a 38khz) que es muy utilizado en todo tipo de aparatos y que su salida, es conectado al microcontrolador a travez del pin RB7 y que por este medio podremos saber si existe la ráfaga de 38 khz. Esta Actividad es mostrada por medio de dos leds: Uno verde y otro rojo, que indicaran si hay presencia (rebote) o no de la rafaga de 38 KHZ.

Con este circuito he logrado desde unos centímetros hasta varios metros (5mts) con una estabilidad bastante buena y que depende de la resistencia en serie con el Led emisor infrarojo (he probado desde 1.2 kohms hasta 47 ohms) entre mas baja en ohms es la resistencia mas alcance tengo y viceversa.

_*Nota.- en un principio puede ser desconcertante la "sensibilidad" ya que, en mi caso, tuve que "aislar" el led transmisor del receptor para que la radiacion infraroja, no se ligara directamente entre los dos componentes. por lo tanto debe considerarse este punto. Yo coloque un cable de 50 cms al led infrarojo y lo puse bajo mi mesa de pruebas, usando la misma como aislante óptico.*_

Espero sus comentarios, es la primera versión, ya que mi intención es lograr mas estabilidad por software, en su momento haré las actualizaciones pertinentes....

Por lo pronto tengo algunas preguntas, o dudas, a los mas experimentados en el tema de infrarojos, ojala me las pueden despejar .

En el comienzo del proyecto, la señal PWM de 38 KHZ obtenida en el pin RB3/ccp1, la colocaba en el Diodo infrarojo y el otro pin del Led a tierra, y aunque tenia el transmisor muy cercas del receptor, no lograba establecer el enlace, sin embargo si Yo "conmutaba" manualmente el led, si que se hacia el enlace, pero por solo un minimo de tiempo, de tal suerte que quedaba en la misma situacion. ¿por que pasa esto? y ¿por que si volvía a "conmutar" las veces que quisiera de nuevo el LED, en las mismas veces, se establecía el enlace por un breve espacio de tiempo?

Para probar que el microncrolador, o el receptor estaba "Vivo", utilizando un transmisor de TV, si me daba el acuse debido los leds que puse para ese proposito. Por otro lado, utilizando mi multimetro en su modalidad de medidor de Frecuencia me daba los 38 khz exactos.

Por estas razones que expongo, me di a la tarea de conmutar por medio del microcontrolador al  diodo infrarojo por medio del PIN RB6....

Les dejo un saludo y en verdad espero sus comentarios, ya que me tiene intrigado el asunto.


----------



## atricio (Jun 12, 2013)

hola amigos ojala me puedan ayudar necesito medir la corriente que existe en un circuito y he pensaxo usar un micro y un lcd pero no se como realizar la medicion de corriente para poder incluirlo en la analoga del micro alguna idea que me puedan facilitar les agradeceria mucho


----------



## mendek (Jun 15, 2013)

Que tal yo estoy en lo mismo, yo lo estoy haciendo con una resistencia shunt,en forma de bobina con alambre de cobre de calibre 14 mas o menos de unos 30 cm, para después aplicarla en el circuito y medir su voltaje (conociendo la resistencia de la bobina) y así obtener la corriente indirectamente.
Como la medición del voltaje en la bobina será muy pequeña, puedes implementar un par de OPAMPs.


----------



## atricio (Jun 16, 2013)

hola si mal no te entiendo usas una bobina en lugar de una resistencia..esta es equivalente a 1ohm y luego la mides en el micro verdad....ahora te pregunto es aplicable a AC xq ese es mi cometido ademas no se si sea y xq no usar una resistencia en lugar de una bobina cual es el efecto si me puedes explicar por favor me seria de mucha ayuda


----------



## mendek (Jun 16, 2013)

Si investigas sobre la resistencia shunt, te darás cuenta que son resistencias muy pequeñas que no afectan a la carga a la cual le vas a medir la corriente, propiamente la bobina es la resistencia shunt, para mi caso obtuve una resistencia de 0.00186 ohms aproximadamente, bueno habra que indagar un poco para ver como se puede aplicar a AC


----------



## mendek (Jun 28, 2013)

Bueno, siguiendo con éste hilo del amperímetro, tengo un problema a la hora de medir, y es que la medición oscila tremendamente (en la realidad) y no sé por que oscila tan feo, las resistencias para las ganancias de los OPAMPs son potenciometros de precisión para reducir la distorsión de las ganancias, funciona con una resistencia shunt, y por cada 10mV en la Rshunt tengo 1V a la salida de los OPAMPs y por ende a la entrada de mi PIC, cuya Rshunt es muy baja y a la cual le mido el voltaje, para conocer después indirectamente la corriente, mi circuito y código lo adjunto:


----------



## D@rkbytes (Jun 29, 2013)

mendek dijo:


> Bueno, siguiendo con éste hilo del amperímetro, tengo un problema a la hora de medir, y es que la medición oscila tremendamente (en la realidad) y no sé por que oscila tan feo


Intenta tomando varias muestras de la lectura, y luego obtén el valor promedio.
Para que entiendas cómo se hace, adjunto un ejemplo.

Espero te sirva.

Saludos.


----------



## carptroya (Ago 13, 2013)

Os dejo un programa que lee la trama nmea y visualiza los datos en pantalla lcd.
Este ejemplo solo muestra la hora, pero se puede utilizar para visualizar cualquiera de los 11 campos que tiene la sentencia $GPRMC.

Este es el formato:

$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68.

Imagino que no hace falta decir que un micro simula varias tramas nmea (GPS), es leído por el otro micro y visualizado en una lcd,decir que tengo dos terminales para ver que trama entrega el gps y otra para la captura del micro.


----------



## Gerson strauss (Ago 13, 2013)

Hola,

Alguien sabe como utilizar un Display lcd 20X4 en proton?

Gracias.


----------



## D@rkbytes (Ago 13, 2013)

Gerson strauss dijo:


> Hola,
> 
> ¿Alguien sabe como utilizar un Display lcd 20X4 en proton?


Si, aquí un ejemplo con un PIC16F877A en proton.

Saludos.


----------



## Gerson strauss (Ago 15, 2013)

D@rkbytes dijo:


> Si, aquí un ejemplo con un PIC16F877A en proton.
> 
> Saludos.



Ok, lo revisare a ver como funciona. Muchas gracias. 

Bueno ya lo probe. El codigo es muy simple y no tiene refresco de pantalla y es precisamente alli en donde esta el problema. Si ha este codigo le agregamos mas lineas de programacion, en donde al final el programa debe pasar otra vez para enviar los datos al display, entonces ya no funcionara.

Gracias de todas formas por tu ayuda.


----------



## carptroya (Ago 15, 2013)

Gerson strauss dijo:


> Ok, lo revisare a ver como funciona. Muchas gracias.
> 
> Bueno ya lo probe. El codigo es muy simple y no tiene refresco de pantalla y es precisamente alli en donde esta el problema. Si ha este codigo le agregamos mas lineas de programacion, en donde al final el programa debe pasar otra vez para enviar los datos al display, entonces ya no funcionara.
> 
> Gracias de todas formas por tu ayuda.


 
pon tu codigo, para verlo


----------



## Gerson strauss (Ago 15, 2013)

carptroya dijo:


> pon tu codigo, para verlo



Este es el código de Darkbytes. Funciona porque escribe en el display 1 vez y no hace nada mas (no hay refresco del display).


```
;*******************************************************************************
; Programa: LCD20x4.bas
; Versión: 1.0
; Autor: D@rkbytes
; Compañia: Digitek
; Notas: 
; Control de una pantalla LCD 20x4
;*******************************************************************************
Device = 16F877A	; Microcontrolador utilizado
REMINDERS = False
; Palabra de configuración
Config XT_OSC,LVP_OFF,PWRTE_ON,WDT_OFF
REMINDERS = True
;*******************************************************************************
XTAL 4                      ; Establecer que se trabajará con 4MHz.
ALL_DIGITAL = True          ; Pines análogos en modo digital

; Configuración de la pantalla LCD
Declare LCD_TYPE    Alpha       ; Alfanumérico
Declare LCD_DTPIN   PORTD.4     ; Bus de datos de RD4 a RD7
Declare LCD_RSPIN   PORTC.6     ; Pin RS en RC6
Declare LCD_ENPIN   PORTC.7     ; Pin E en RC7
Declare LCD_INTERFACE   4       ; Modo 4 Bits
Declare LCD_LINES   4           ; Pantalla de cuatro líneas


MainProgram:
    Cls                         ; Inicializa y borra la pantalla.
    Print At 1,1,"PRIMER LINEA DEL LCD"
    Print At 2,1,"SEGUNDA LINEA LCD"
    Print At 3,1,"TERCER LINEA DEL LCD"
    Print At 4,1,"CUARTA LINEA DEL LCD"
    ; Ó hacer esto otro...
;    Print $FE,$94,"TERCER LINEA DEL LCD"
;    Print $FE,$D4,"CUARTA LINEA DEL LCD"
    End



;	  ______________________________________________________________
;	/\  Código generado con PIC16F628A Config v1.4 - By D@rkbytes  \
;	\_|            ******************************************       |
;	  |           / Descárgalo gratuitamente desde...      /        |
;	  |          /     www.galeon.com/exodusklient        /         |
;	  |         ******************************************          |
;	  |                                                             |
;	  |             Visita: www.forosdeelectronica.com              |
;	  |                                                             |
;	  |                             \|||/                           |
;	  |                             (o o)                           |
;	  |  ________________________ooO-(_)-Ooo________________________|__
;	  \_/_____________________________________________________________/
```

Pero si le agregas mas lineas de código (como en el siguiente ejemplo) y refrescas el display, entonces empieza a funcionar mal. Por ejemplo las lineas parpadean o desaparece parte del texto. Alguna solución?.
Gracias


```
;*******************************************************************************
; Programa: LCD20x4.bas
; Versión: 1.0
; Autor: D@rkbytes
; Compañia: Digitek
; Notas: 
; Control de una pantalla LCD 20x4
;*******************************************************************************
Device = 16F877A	; Microcontrolador utilizado
REMINDERS = False
; Palabra de configuración
Config XT_OSC,LVP_OFF,PWRTE_ON,WDT_OFF
REMINDERS = True
;*******************************************************************************
XTAL 4                      ; Establecer que se trabajará con 4MHz.
ALL_DIGITAL = True          ; Pines análogos en modo digital

; Configuración de la pantalla LCD
Declare LCD_TYPE    Alpha       ; Alfanumérico
Declare LCD_DTPIN   PORTD.4     ; Bus de datos de RD4 a RD7
Declare LCD_RSPIN   PORTC.6     ; Pin RS en RC6
Declare LCD_ENPIN   PORTC.7     ; Pin E en RC7
Declare LCD_INTERFACE   4       ; Modo 4 Bits
Declare LCD_LINES   4           ; Pantalla de cuatro líneas


MainProgram:
    Cls                         ; Inicializa y borra la pantalla.
    Print At 1,1,"PRIMER LINEA DEL LCD"
    Print At 2,1,"SEGUNDA LINEA LCD"
    Print At 3,1,"TERCER LINEA DEL LCD"
    Print At 4,1,"CUARTA LINEA DEL LCD"
    
    High PORTA.0
    DelayMS 100
    High PORTA.1
    DelayMS 100
    High PORTA.2
    DelayMS 200
    Low PORTA.0
    DelayMS 100
    Low PORTA.1
    DelayMS 100
    Low PORTA.2
    DelayMS 200
    GoTo MainProgram
; Ó hacer esto otro...
;    Print $FE,$94,"TERCER LINEA DEL LCD"
;    Print $FE,$D4,"CUARTA LINEA DEL LCD"
    End



;	  ______________________________________________________________
;	/\  Código generado con PIC16F628A Config v1.4 - By D@rkbytes  \
;	\_|            ******************************************       |
;	  |           / Descárgalo gratuitamente desde...      /        |
;	  |          /     www.galeon.com/exodusklient        /         |
;	  |         ******************************************          |
;	  |                                                             |
;	  |             Visita: www.forosdeelectronica.com              |
;	  |                                                             |
;	  |                             \|||/                           |
;	  |                             (o o)                           |
;	  |  ________________________ooO-(_)-Ooo________________________|__
;	  \_/_____________________________________________________________/
```


----------



## ricbevi (Ago 16, 2013)

Gerson strauss dijo:


> Este es el código de Darkbytes. Funciona porque escribe en el display 1 vez y no hace nada mas (no hay refresco del display).
> 
> 
> ```
> ...



Hola...¿como no va a "parpadear" si le has colocado un retardo mínimo de mas de 0.8 segundos entre impresión e impresión al agregarle dichas lineas?
Saludos.

Ric.


----------



## Gerson strauss (Ago 17, 2013)

ricbevi dijo:


> Hola...¿como no va a "parpadear" si le has colocado un retardo mínimo de mas de 0.8 segundos entre impresión e impresión al agregarle dichas lineas?
> Saludos.
> 
> Ric.



Ok entiendo, seguramente ese es el problema ... pero entonces cual es la solución?


----------



## ricbevi (Ago 18, 2013)

Gerson strauss dijo:


> Ok entiendo, seguramente ese es el problema ... pero entonces cual es la solución?



En programación como en otros ordenes no existen formulas "mágicas" si no distintas soluciones posibles a distintas problemáticas...Depende de lo que quieras hacer y pretendas como resultado...por ejemplo imprimir en el display y en la posición que le corresponda solo el dato que cambie de valor y no toda la linea y todas las lineas en un solo paso. Ten en cuenta que la impresión cuando mas datos a imprimir tengas mas demora en ejecutarse.

Ric.


----------



## Gerson strauss (Ago 18, 2013)

ricbevi dijo:


> En programación como en otros ordenes no existen formulas "mágicas" si no distintas soluciones posibles a distintas problemáticas...Depende de lo que quieras hacer y pretendas como resultado...por ejemplo imprimir en el display y en la posición que le corresponda solo el dato que cambie de valor y no toda la linea y todas las lineas en un solo paso. Ten en cuenta que la impresión cuando mas datos a imprimir tengas mas demora en ejecutarse.
> 
> Ric.



Imprimir solo el dato a mostrar ... no había pensado en eso!. Probare a ver que pasa. 

Gracias.


----------



## Tusepulto (Ago 31, 2013)

buenas a todos hace mucho tiempo no programo un pic ps mas o menos unos 8 años y muchas cosas han cambiado..! les escribo porque realmente me siento como el mas novato de todos y quisiera que uds me colaboren con lo que puedan y de ante mano se los agradesco...!!!

tengo instalado el proton ide ( loader version 3.5.2.7 y compiler version 3.5.3.4) anda de maravilla 


```
'TRATANDO DE ACTIVAR OCSILADOR INTERNO DEL 16F628a


Device  16F628A
Config INTOSC_OSC_NOCLKOUT_  ; activo el ecsilador interno

PCON.3=1                      ;configuro la volicidad del oscilador a 4mhz 
  
TRISA=%00000000               ;coloco pueto A como salida
TRISB=0                        ;coloco puerto b como salida

PORTB=0                        ;borro puerto b

  inicio:                       ;inicio secuencia
   PORTB =%00000001
   DelayMS 100
   PORTB =%00000010
   DelayMS 100
   PORTB =%00000100
   DelayMS 100
   PORTB =%00001000
   DelayMS 100
   PORTB =%00010000
   DelayMS 100
   PORTB =%00100000
   DelayMS 100
   PORTB =%01000000
   DelayMS 100
   PORTB =%10000000
   DelayMS 100
   GoTo inicio
   End
```
la idea de este programa es hacer una secuencia con leds en el puerto B
he escrito este codigo tratando de activar el oscilador interno del pic 16f628a pero este no me activa  solo funcionan unos leds cuando toco con mi dedo el pin RA7/OSC1/CLKIN 
estoy utlizando el pickit 3 para grabar los micros y me he dado cuenta que este tiene unos bits de configuracion estos bits cambian dependiendo del pic que utilice si alguien sabe para que son estos bits en el pickit 3 programer para el pic16f628a le agradeceria mucho..!! tengo muchas mas pregunas pero por el momento solo los molesto con estas... saludos desde medellin colombia:::


----------



## D@rkbytes (Ago 31, 2013)

Busca la información sobre los fuses en la hoja de datos del PIC16F628A
Sobre esta sección en la página 98 encontrarás lo que hacen:
*REGISTER 14-1: CONFIG – CONFIGURATION WORD REGISTER

*Y para tu código puedes utilizar esta palabra de configuración...
*Device* *16F628A*
*Reminders* = False
*Config* INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF
*Reminders* = True
*Xtal* = 4

Elimina la configuración del bit 3 del registro PCON, pues es la opción por default para INTOSC = 4MHz.
Y como opcional en la palabra de configuración puedes agregar esto...
MCLRE_OFF
Para hacer que el pin RA5 (MCLR/Vpp) Funcione como entrada.

Para hacer que los pines con comparadores análogos funcionen como digitales usa esto...
*All_Digital* = True

Saludos.


----------



## electrobicho (Sep 7, 2013)

Saludos les cuento que tengo un problema, intento leer un canal del 12f675 y no me funciona, les adjunto el código para que lo vean y me comenten en donde esta mi error, saludos

```
Device = 12F675    		
Reminders = OFF
	Config CPD_OFF,CP_OFF,BODEN_OFF,MCLRE_OFF,PWRTE_OFF,WDT_OFF	,INTRC_OSC_NOCLKOUT	
Reminders = On
Xtal  4

Declare Rsout_Mode TRUE ' Así mismo transmiten datos
Declare Rsout_Pin GPIO.4 ' Pin de salida es PORTB.0
Declare Serial_Baud 9600 ' Los baudios son 9600

DelayMS 100         'RETARDO INICIAL ANTES DE EMPEZAR
Declare Adin_Res = 10 'CONVERSOR A-D DE 10BITS 
Declare Adin_Tad = FRC      ; Seleccionar A/D RC_Int_Osc
Declare Adin_Stime = 50

Dim LUZ As ADRESL.Word     'VARIABLE PARA LA ENTRADA DEL ADC
Dim Luz2 As Word
    
CMCON = 7           'COMPARADORES APAGADOS 
    TRISIO = %00000001  'GPIO.0 ES ENTRADA (AN0), EL RESTO ES SALIDA
    'ANSEL = %00100001   'AN0 HABILITADO 
    'ADCON0 = %10000011  'Vref = VCC / MÓDULO ADC ENCENDIDO
     ANSEL = %00110001                   ' Set ADC clock to Frc and GP0 to analog mode
    ADCON0 = %11000001
GPIO=0

LAZO:          'CARGO EN LA VARIABLE EL VALOR DE LA ENTRADA
    LUZ = ADIn 0
    RSOut "Valor: ",Dec LUZ,13
    DelayMS 1000
    
GoTo LAZO    
End
```


----------



## D@rkbytes (Sep 7, 2013)

electrobicho dijo:


> Saludos les cuento que tengo un problema, intento leer un canal del 12f675 y no me funciona, les adjunto el código para que lo vean y me comenten en donde esta mi error, saludos


Así es como te debe de funcionar.
Compara ahora el código corregido y encuentra los cambios que realicé.

```
Device = 12F675            
Reminders = OFF
    Config INTRC_OSC_NOCLKOUT, MCLRE_OFF, WDT_OFF, PWRTE_ON    
Reminders = On
Xtal  4

Set_OSCCAL              ; Obtener el valor de calibración del oscilador interno

Declare Rsout_Mode TRUE ' Así mismo transmiten datos
Declare Rsout_Pin GPIO.0 ' Pin de salida es PORTB.0
Declare Serial_Baud 9600 ' Los baudios son 9600

;DelayMS 100         'RETARDO INICIAL ANTES DE EMPEZAR
Declare Adin_Res = 10 'CONVERSOR A-D DE 10BITS 
Declare Adin_Tad = FRC      ; Seleccionar A/D RC_Int_Osc
Declare Adin_Stime = 50

;Dim LUZ As ADRESL.Word     'VARIABLE PARA LA ENTRADA DEL ADC
Dim LUZ     As Word 
;Dim Luz2    As Word
    
CMCON = 7           'COMPARADORES APAGADOS 
;TRISIO = %00000001  'GPIO.0 ES ENTRADA (AN0), EL RESTO ES SALIDA
'ANSEL = %00100001   'AN0 HABILITADO 
'ADCON0 = %10000011  'Vref = VCC / MÓDULO ADC ENCENDIDO
;ANSEL = %00110001                   ' Set ADC clock to Frc and GP0 to analog mode
;ADCON0 = %11000001
ADCON0.7 = 1            ; Justificar el resultado a la derecha
;GPIO=0
RSOut   0               ; Estabilizar el puerto serial
DelayMS 100             ; Retardo de 100Ms antes de iniciar el programa

LAZO:          'CARGO EN LA VARIABLE EL VALOR DE LA ENTRADA
    LUZ = ADIn 0
    RSOut "Valor: ",Dec LUZ,13,10   ; Enviar el valor seguido de CR/LF
    DelayMS 1000
    
    GoTo LAZO    
    
    End
```
Suerte.


----------



## electrobicho (Sep 8, 2013)

Me vas a matar D@rkbytes, mi código siempre funciono, mi error era tan simple como que en lugar del 12f675 tenía el 12f629 en la simulación jejeje, adjunto el código que uso

```
Device = 12F675    		
	Reminders = OFF
	Config MCLRE_OFF,WDT_OFF,INTRC_OSC_NOCLKOUT	
	Reminders = On
Xtal  4

Declare Rsout_Mode TRUE 
Declare Rsout_Pin GPIO.4 
Declare Serial_Baud 9600 

Declare Adin_Res = 10 
Declare Adin_Tad = FRC      
Declare Adin_Stime = 50

Dim LUZ As Word
Dim luz2 As Float
    
 CMCON = 7            
 TRISIO = %00000001  
 ANSEL = %00100001   
 ADCON0 = %10000011
RSOut 0
DelayMS 100

LAZO:          
    LUZ = ADIn 0
    luz2= (489*LUZ)/1000
    RSOut "Valor: ",Dec luz2,13
    DelayMS 1000
    
GoTo LAZO    
End
```


----------



## D@rkbytes (Sep 8, 2013)

electrobicho dijo:


> Me vas a matar D@rkbytes, mi código siempre funcionó, mi error era tan simple como que en lugar del 12f675 tenía el 12f629 en la simulación jejeje, adjunto el código que uso


Aunque hubieras puesto el 12F675 en la simulación o en físico, con el código que tenías anteriormente no hubiera funcionado.
Con el código que colocas ahora ya funciona pues ya usaste las correcciones que realicé a tu código.
Sin embargo, sigues configurando algunos registros que al usar funciones de proton no tiene caso configurar.
Al usar funciones de proton, él mismo se encarga de configurar los registros involucrados.
Y también para eso se usan las declaraciones de configuración para la conversión ADC.
Por lo tanto te queda de sobra configurar TRISIO y ANSEL, tan sólo debes configurar el bit 7 de ADCON0 en 1
Ésto con el objetivo de justificar el resultado a la derecha porque usas 10 bits de resolución para el ADC.
En el código que colocas ahora también te falta agregar la instrucción Set_OSCCAL
Si no lo haces, posiblemente tengas lecturas erróneas cuando montes el circuito físicamente.

Saludos.


----------



## electrobicho (Sep 8, 2013)

pues lo arme tal cual y todo funciona bien, creo que se si debe de colocar el ansel, según la hoja de datos, la configuración a la derecha se ve en el adcon, creo que poner aparte adcon.7 esta de mas si ya se coloco en el adcon0 inicial


----------



## D@rkbytes (Sep 8, 2013)

electrobicho dijo:


> pues lo arme tal cual y todo funciona bien, creo que se si debe de colocar el ansel, según la hoja de datos, la configuración a la derecha se ve en el adcon, creo que poner aparte adcon.7 esta de mas si ya se coloco en el adcon0 inicial


Estás algo confundido aún con la programación de microcontroladores.
Cuando digo; tan solo tienes que configurar el bit 7 de ADCON0 sólo tienes que hacer: ADCON0.7 = 1
Y ya no configurar todo el registro cómo lo estás haciendo: ADCON0 = %10000011
Ahí ya es lógico que tienes puesto el bit 7 en 1, pero también el bit 1 y el 0 
Ahora, si estuvieras programando en lenguaje ensamblador, ahí si tendrías que configurar todos los registros.
Pero como te mencioné anteriormente, proton se encarga de hacerlo cuando usas las funciones del mismo.
Prueba físicamente con un 12F675 el código que posteaste al principio y comprueba que no funcionará.


----------



## electrobicho (Sep 8, 2013)

¿Y el ANSEL  entonces no se usa? por que es ahí donde según la hoja de datos se elije que AN0-4 se usara



Quiero dejar un aporte que realice hace ya algo de tiempo cuando aún solía jugar con los PIC's (hay que trabajar  ) Primero hay que recordar que la trasmisión se realiza a 9600 baudios y que se debe de ver en el administrador de dispositivos que puerto serie emula la creación , para este caso es el 20, bueno aquí se los dejo y un par de videos para que vean que si funciona
https://www.youtube.com/watch?v=2fdsGEnpCVw
https://www.youtube.com/watch?v=dheAWeKqROo


```
Device = 18F4550                                    
    Declare Xtal = 48 
    Declare PROTON_START_ADDRESS = $1000                                  
    Declare Optimiser_Level = 3
    Declare Reminders = Off                        

    Declare USB_Descriptor = "CDCdesc.Inc"            
    Dim PP0 As Byte System                              
    Dim Var1 As Word                                    
    Dim Array1[20] As Byte                             
    Dim Out_Buffer As String * 20                       
    Dim In_Buffer As String * 20 
    Dim Entrada As Byte                      

    Symbol Carry_Flag = STATUS.0                        
    Symbol TRNIF = UIR.3  
    TRISB=0                          
    PORTB=0                                         
    All_Digital = True                                  
    
    Repeat                                            
        USBPoll                                         
    Until PP0 = %00000110                                           
    Inicio:                                         
        Repeat                                          
            USBIn 3, In_Buffer, Auto                    
        Until Carry_Flag = 0
        DelayMS 1
        USBPoll
        Entrada= Val (In_Buffer,Dec)
        Clear In_Buffer
        
        
        Select Case Entrada
            Case 1
                Toggle PORTB.0
                USBPoll
                Clear In_Buffer
            Case 2
                Toggle PORTB.1
                USBPoll
                Clear In_Buffer
            Case 3
                Toggle PORTB.2
                USBPoll
                Clear In_Buffer
            Case 4 
                Toggle PORTB.3
                USBPoll
                Clear In_Buffer
            Case 5
                Toggle PORTB.4
                USBPoll
                Clear In_Buffer
            Case 6
                Toggle PORTB.5
                USBPoll
                Clear In_Buffer
            Case 7
                Toggle PORTB.6
                USBPoll
                Clear In_Buffer
            Case 8
                Toggle PORTB.7
                USBPoll
                Clear In_Buffer
         End Select
    GoTo Inicio
    End
```

Saludos de Oaxaca, México


----------



## D@rkbytes (Sep 8, 2013)

electrobicho dijo:


> ¿Y el ANSEL  entonces no se usa? por que es ahí donde según la hoja de datos se elije que AN0-4 se usará


Cuando usas la función ADIn de proton, ya no tienes que configurar el registro ANSEL.
Proton se encarga de eso automáticamente, es por eso que la función te pide un canal.
Por ejemplo: *LUZ = ADIn 0* (Aquí la variable LUZ contendrá el valor del canal 0)

Si programaras en lenguaje ensamblador, entonces si tendrías que configurar el registro ANSEL y varios más.

Otro ejemplo sería la configuración del registro TRISIO.
Si haces por ejemplo: GPIO.0 = 1 sin configurar el pin GP0 como salida, no funcionará.
En cambio si usas la instrucción High GPIO.0 sin configurar GP0 como salida, si funcionará.
Y eso es porque proton se encarga de configurar los registros involucrados para cada función.

Esa es la ventaja de la programación con lenguajes de alto nivel.
No son mejores que el lenguaje ensamblador (bajo nivel), pero simplifican muchas cosas.

Saludos.


----------



## electrobicho (Sep 13, 2013)

Tengo una pequeña duda, ya que poseo en mi poder un 12f629, me gustaría saber si alguien logro usar RC5in con este pequeñin, lo e usado en el 18f2550 pero no se si se logre el mismo resultado en los enanos, de antemano les agradezco y les envío un cordial saludo


----------



## fernandoae (Sep 13, 2013)

Si, no hay ningun problema. Yo con un 12f675 hice un receptor ir con 8 salidas biestables y 8 de pulsos.


----------



## oscarintintin (Dic 7, 2013)

Saludos a todos. hace tiempo ya que me choco con un problema constante al momento de efectuar una interrupción  debido ala recepción de datos del puerto serial, sucede que se cuelga y no regresa al programa, la solución que normalmente le daba era recibir los datos dentro del programa principal y ya no por interrupción pero de esta forma no esta activo en todo momento. les adjunto un programa en el cual se paraliza después de recibir un dato.gracias de antemano¡¡¡


----------



## cguerrero1205 (Ene 22, 2014)

Hola... Estoy desarrollando un proyecto pero me quede en una parte porque ni idea de como hacerlo...

Lo que quiero es esto, 

Tengo un LCD, cómo saben ellos tienen dos pines los cuales si se alimentan los led's del LCD encienden... Bueno tengo un botón con el cual entro al menú y hago ciertas cosas... Lo que quiero es que cuando presione el botón se inicie un temporizador de 3 minutos y que al mismo tiempo un puerto del pic se ponga en 1 y encienda los leds del LCD... Y al cabo de los 3 minutos se apaguen los leds... Y si se vuelve a presionar el botón que se repita el ciclo... Espero me hayan entendido y puedan ayudarme...
Trabajo con pic 16f887 en protón ide...

Nunca he trabajado con interrupciones ni con el timer... Esto es para hacer un ahorro de energía, ya que qlimento el circuito con una batería...

Gracias


----------



## COSMICO (Feb 10, 2014)

Hola amigos
No se si esta pregunta ya fue resuelta, o no tiene solución, pero.
¿Por que proton ide me genera nueve archivos diferentes al compilar?
¿Son todos estos necesarios? ¿esto se puede configurar?, la verdad no encuentro como...


----------



## D@rkbytes (Feb 10, 2014)

Todos los compiladores generan varios archivos para poder crear el archivo final *.hex.
Algunos editores de código tienen opciones para establecer que archivos serán creados y de que forma.
Sin embargo en Proton IDE estas opciones no están incluidas y los archivos que se generan al compilar no se pueden evitar. 
Lo que puedes hacer para limpiar los archivos que a final de cuentas te puedan resultar innecesarios, es crear un archivo por lotes *.bat que realice una limpieza de esos archivos.


----------



## COSMICO (Feb 10, 2014)

Me lo sospeche desde un principio.
Gracias por aclarar mi duda amigo D@rkbytes



Ahora si una pregunta de programacion.
En este trozo de código...

 loop:
 COUN = Counter ENTRADA,100 
 RPM=COUN*10*60   ' RPM=COUN*10*60  
 goto loop
 Disable


Interrrupcion
???, codigo
???
Resume
Enable     'reactiva interrupciones
End 

por que el código de interrupción no se me ejecuta antes de que termine el tiempo de conteo de COUN, lo que deseo en la interrupciÓn es pasar el valor de pulsos contados a un display 
cuadruple de 7segmentos, esto de la interrupción lo estoy haciendo cada 5 ms;¿ Hay alguna restriccion con esta instrucción COUN?.


----------



## yovoy (Abr 18, 2014)

Saludos a todos. ¿Cómo podría resumir un poco el programa que adjunto?
Pues así como está no termina de funcionar, creo que si fuesen instrucciones case si pitaría, pero no sé como asociar el rango con las instrucciones case. Una ayuda a este aprendiz.
Adjunto el programa.
Muchas gracias por resolver mis dudas.


```
Device 16F876A
 
Symbol SDA_PORT = PORTC.4
SDA_PIN = PORTC.4
Symbol SCL_PORT = PORTC.3
 SCL_PIN = PORTC.3 
 
ALL_DIGITAL = true
LCD_DTPIN = PORTB.4'lcd pins DB4-DB7 
LCD_RSPIN = PORTA.1     'lcd pin 4 RS 
LCD_WRPIN = PORTA.2
LCD_ENPIN = PORTA.3     'lcd pin 6 EN 
LCD_INTERFACE = 8 '4     'pins portb4 - portb7 
LCD_LINES = 2    
LCD_TYPE = 0        
SLOW_BUS = On
 Dim light As Byte
 Dim rango As Word      
 Symbol srf1 = $FE
 Symbol srf081 = srf1
 Symbol srf2 = $E0
 Symbol srf082 = srf2
 Symbol cmdreg=0 
 Symbol lightreg=1
 Dim posicion As Byte
 Dim pos1 As Word
 Dim pos2 As Word
 Dim pos3 As Word
 
posicion = 0
 pos1 = 1000
 pos2 = 1500
 pos3 = 2000
 Symbol pin PORTC.0
 
 DelayMS 200
 Cls
 While 1=1
 
 BusOut $FE,$00,[$51]
 BusOut srf1,cmdreg,[81] 
 DelayMS 80 '66 
 BusIn $FE,$01,[light,rango]
 BusIn srf081,lightreg,[light,rango]
 Print At 1,1, "Med1=" ,Dec rango, "cm ", DEC2 light,"lux   "
 DelayMS 100
 Wend
 
  Case 1:
If range = 10  Then
 Servo pin , pos1
    Cls 
 Print At 2,1,"Estas en frente"
 DelayMS 190
Case 2: 
If range = 12 Then 
 Servo pin,pos2
    Cls 
 Print At 2,1,"Estas a la izq"
 DelayMS 190
  Case :
 If range = 8 Then 
 Servo pin ,pos3
   Cls 
 Print At 2,1,"Estas a la dcha"
 DelayMS 190 
   EndIf
  EndIf                             
 EndIf 
 End Case
```

  No sé como se pega el rar.


----------



## D@rkbytes (Abr 18, 2014)

yovoy dijo:


> no sé como asociar el rango con las instrucciones case.


Para asociar valores con el uso de los Cases, debes hacerlo de esta forma.

*Select Case* Valor
*Case* Valor_X1
; Código
*Case* Valor_X2
; Código
*Case* Valor_X3
; Código
*Case* *Else*
; Código por defecto cuando no se encontró Valor_XX
*EndSelect*

También se pueden usar varios valores en una sola sección.

*Case* 1, 2, 3, 4
; Código cuando el valor sea 1, 2, 3 o 4

O comparaciones:

*Case* > 135
*Print At *1,1,"Es mayor a 135 "
*Case* < 135
*Print At* 1,1,"Es  menor a 135 "



yovoy dijo:


> No sé como se pega el rar.


Mira por aquí: * ¿Cómo subo imágenes, archivos y demás?*

Suerte.


----------



## chargers17 (Abr 25, 2014)

Buenas tardes, soy nuevo en esto de programar PIC, tengo una tarea que es controlar un motor D.C por medio de PWM en el programa Proton IDE, pero he buscado como hacerlo con HPWM y PWM pero no se mueve el motor D.C.
Por favor, ¿alguien me puede explicar como se debe hacer para moverlo?


----------



## D@rkbytes (Abr 26, 2014)

chargers17 dijo:


> Buenas tardes, soy nuevo en esto de programar PIC, tengo una tarea que es controlar un motor D.C por medio de PWM en el programa Proton IDE, pero he buscado como hacerlo con HPWM y PWM pero no se mueve el motor D.C.
> Por favor, ¿alguien me puede explicar como se debe hacer para moverlo?


Es muy sencillo, tal vez no estés conectando bien el motor.

Este es un ejemplo usando el ADC para variar el ciclo activo con un potenciómetro. (PIC16F88)

```
Device 16F88
Reminders = False
Config1 INTRC_IO,CCP1_RB3,LVP_OFF,BODEN_OFF,PWRTE_ON,WDT_OFF
Config2 IESO_OFF,FCMEN_OFF
Reminders = True
;*******************************************************************************
Xtal = 8                    ; Frecuencia del oscilador
Create_Coff = True 

Declare Adin_Res = 8        ; 8 bits para el resultado
Declare Adin_Tad = FRC      ; Usar el oscilador RC interno
Declare Adin_Stime = 50     ; 50us para el muestreo

Dim Duty    As Byte         ; Variable para controlar el ciclo activo.
    
Inicio:
    OSCCON  = %01110100     ; Oscilador interno a 8MHz, estable.
    TRISB   = %11110111     ; Configurar RB3 como salida (CCP1)

Programa:
    Duty = ADIn 1           ; Leer el canal 1 y guardar el valor en Duty
    HPWM 1,Duty,1000        ; Generar PWM con el ciclo activo de 0 a 100% @ 1KHz.
    GoTo Programa

    End
```
Este otro ejemplo es para variar el ciclo activo con pulsadores. (PIC16F628A)

```
Device 16F628A
Reminders = False
Config FOSC_INTOSCIO,WDT_OFF,PWRTE_ON,BOREN_OFF,LVP_OFF
Reminders = True
;*******************************************************************************
Xtal = 4                    ; Frecuencia del oscilador (Interno)

Inicio:
    PortB_Pullups = True    ; Activar resistencias Pull-Up en puerto B
    TRISB = %11110111       ; Configurar RB3 como salida (CCP1)
    Dim Duty    As Byte     ; Variable para controlar el ciclo activo.
    Duty = 127              ; iniciar el ciclo activo a la mitad (50% Aprox.)
    Call Cargar_Duty        ; Iniciar el módulo PWM por hardware.

Programa:
    If PORTB.1 = 0 Then
        DelayMS 50
        Duty = Duty +1      ; Incrementar el ciclo activo.
        Call Cargar_Duty    ; Recargar el periodo del ciclo activo.
    End If
    
    If PORTB.0 = 0 Then
        DelayMS 50
        Duty = Duty -1      ; Decrementar el ciclo activo.
        Call Cargar_Duty    ; Recargar el periodo del ciclo activo.
    End If
    
    GoTo Programa
    
Cargar_Duty:
    HPWM 1,Duty,1000        ; Generar PWM con el ciclo activo de 0 a 100% @ 1KHz.
    Return
    
    End
```
En ambos casos se usó PWM por hardware porque se genera siempre un pulso constante.
El LED conectado antes de la base del transistor sirve como monitor del ciclo activo del PWM.

Nota:
También se puede usar un Power MOSFET.

Espero estos ejemplos te sean de utilidad.

Suerte.


----------



## cesario (May 13, 2014)

Hola a todos y gracias de antemano.

Estoy haciendo un proyecto con pic16f873a y programando con proton ide.

Debo leer un voltaje en la entrada analógica y determinar si sube o baja, una vez determinado esto, debo generar una salida analógica de 4v a 0v.

Ya lo hice pero tengo problemas, al generar la salida tiene brincos, es decir, no es lineal, de repente se va a cero y regresa.
Es decir, tengo problemas con el algoritmo al calcular el ciclo de trabajo del hpwm.

Espero haberme explicado y que alguien tenga idea de que hacer.

Saludos y gracias.



```
LECTURA:

vadc=0
vadc = ADIn 0 
If vadc > 530 Then
GoTo adelante
ElseIf vadc < 490 Then 
GoTo atras
Else GoTo inicio
EndIf

adelante:
PWM PORTB.0,70,50
vadc = ADIn 0 
ciclo = Abs ((vadc/2)+150)
ciclo=~ciclo
HPWM 1,ciclo,1600
If vadc > 530 Then
GoTo adelante
Else GoTo LECTURA
EndIf

atras:
PWM PORTB.1,70,50
vadc=ADIn 0
ciclo = Abs ((vadc/2))
ciclo= (ciclo + (vadc/7))
HPWM 1,ciclo,1600
If vadc < 490 Then 
GoTo atras
Else GoTo LECTURA 
EndIf    



End
```


----------



## D@rkbytes (May 14, 2014)

cesario dijo:


> al generar la salida tiene brincos, es decir, no es lineal, de repente se va a cero y regresa.
> Es decir, tengo problemas con el algoritmo al calcular el ciclo de trabajo del hpwm.
> 
> Espero haberme explicado y que alguien tenga idea de que hacer.


El valor para modificar el ciclo activo de 0 a 100% es de 0 a 255.
Debes tener en cuenta que la función PWM genera pulsos solo durante determinados ciclos, no es constante.
La función HPWM siempre genera una salida constante pues lo hace por hardware.

Ambas funciones cambian su ciclo activo con valores de 0 a 255.
Por ejemplo, si deseas el 50% aproximadamente del ciclo activo, debes poner un valor de 127

Saludos.


----------



## cguerrero1205 (May 15, 2014)

Hola.

Estoy trabajando en un proyecto para la universidad sobre un  seguidor de linea que esta controlado a través de un PIC16F887, este  funciona en base a un control PID.

He hecho gran parte de la programación pero no he conseguido que  funcione.
Me gustaría que alguien me ayude revisando el código y dándome  consejos.
(Es primera vez que uso PID y no sé si esté bien estructurado  o formulado el código)

Adjunto el código en .bas para que lo abran con PROTON IDE.
La simulación esta hecha en Proteus 8.1

Gracias. Espero prontas respuestas.


----------



## yovoy (May 16, 2014)

Muchas gracias D@rkbytes por la respuesta y perdon por no contestar antes 
espero que con lo que leo de todos vosotros pronto no tenga que molestar


----------



## AbrahamB (Jun 4, 2014)

Buenas tardes, soy nuevo en la programación, y me he decidido a hacer un programa para un proyecto planteado en clases, que en realidad lo veo complicado para ser principiante en en proton ide, El funcionamiento del proyecto que trata de un sistema de acceso por tecnología RFID que se comunica a una computadora y una pantalla lcd tiene una salida para un relé que se activa dependiendo si se da acceso a la persona o no. me podrían indicar que variables tengo que tener en cuenta, como inicializar tanto la pantalla lcd y la interfaz con la computadora, como tomar los datos del RFID, abajo dejo el esquema del circuito. 

Gracias de antemano..!


----------



## DEPREDADORX1 (Jun 6, 2014)

Puedes hacer una búsqueda en google para empezar y cuando tengas algo de código, postea aquí que de seguro algun forero o moderador te echa la mano. Googleando encontré este ejemplo en pic basic pro, que es casi igual:
http://www.scielo.org.mx/pdf/poli/n40/n40a9.pdf


----------



## AbrahamB (Jun 6, 2014)

Muchas gracias con la ayuda, en verdad es de gran utilidad ese archivo.. Seguiré buscando!!!


----------



## Pablo Tapia (Jun 22, 2014)

Hola, recien comienzo en lo de programacion y tengo un proyecto al que no le encuentro solucion, se trata de un pulsador que al presionarlo enciende el foco a 12 V. y al presionarlo por 2 seg. cambia de rele y enciende el foco a 9 V. y si se vuelve a presionar se apaga el foco, en el proteus se ve bien, pero al probarlo en la placa no hace el cambio .... se apaga el foco... ya le agrege optoacopladores y nada... No es ruido.... Es tal mi desesperacion que llegue a pagarle a un Peruano (Alex Tineo Juiro de microsistemas AT) que se dice "programador" y dejo el programa peor y solo se quedo con  mi dinero, Hojala alguien me pueda ayudar, adjunto programa y simulacion, de antemano gracias....


----------



## D@rkbytes (Jun 22, 2014)

Pablo Tapia dijo:


> Hola. Recién comienzo en lo de programación y tengo un proyecto al que no le encuentro solución.
> Se trata de un pulsador que al presionarlo enciende el foco a 12 V. y al presionarlo por 2 seg. cambia de rele y enciende el foco a 9 V. y si se vuelve a presionar se apaga el foco.
> *En el proteus se ve bien, pero al probarlo en la placa no hace el cambio*, se apaga el foco.


Tal vez se deba a que estás usando el pin RA4 que tiene drenador abierto y estás colocando una resistencia de 10k hacia VDD y otra del mismo valor hacia la base del transistor, lo cual suma 20k.
Me parece que es un valor algo alto para llevar a saturación al transistor.

Prueba con el esquema del circuito que adjunto y también un programa más simplificado.

Suerte.


----------



## Pablo Tapia (Jul 9, 2014)

Hola D@rkbyte, de entrada, gracias por tu desinteresada ayuda..... y como dije, recien comienzo con lo de programacion, lo de "drenador abierto" me confirmo lo que ya sabia... (que no sabia nada) y como la curiosidad es la madre de todo conocimiento, investigue un poco y encontre que configurar el pin RA4 como salida genera muchos problemas con pocas soluciones, debido a mi poco conocimiento del tema, pense en migrar a un pic con mas pines.... hasta en retirarme..... en fin, la solucion fue invertir los pines, configure el RA4 como entrada y el RB7 en salida y solucion del problema, utilice tu diagrama electrico que resulto mas apropiada y el programa corre OK  Saludos Y Gracias...


----------



## mijastro (Jul 15, 2014)

buenas tardes con todos los presentes de este foro, soy nuevo en esto y necesito pedir de favor si alguien me podria ayudar con la programación de un velocimetro digital utilizando el pic 18f2550 y una lcd teniendo en cuenta que para el conteo el pulsos utilizo un sensor de contacto que entra por el PORTA.0.
estaria muy agradecido con la ayuda por mas pequeña que sea


----------



## DOSMETROS (Jul 15, 2014)

Te fijaste por aqui :

https://www.forosdeelectronica.com/busqueda.htm?cx=partner-pub-2315955773772045%3A8229477962&cof=FORID%3A10&ie=ISO-8859-1&q=veloc%EDmetro+digital&siteurl=www.forosdeelectronica.com%2Fsearch.php%3Fsearchid%3D1013476&ref=www.forosdeelectronica.com%2Fsearch.php%3Fsearchid%3D1013475&ss=6831j3450977j20


----------



## mijastro (Jul 16, 2014)

muchas gracias por comentar pero lo que yo busco es la programacion en proton o alguna idea de como calcular la velocidad teniendo el numero de pulsos en 1seg


----------



## DEPREDADORX1 (Jul 16, 2014)

Hola mijastro,

Yo estaba haciendo algo parecido hace algún tiempo pero al final no lo terminé, aquí te adjunto el ejemplo del amigo darkbyte y otros apuntes a ver que tal te va, ojalá lo logres y, por supuesto, recuerda compartir tus avances aquí en el foro.


----------



## mijastro (Jul 16, 2014)

hola disculpen adjunto los archivos de simulacion en proteus y la codificacion en proton, utilizo el 18f2550 y un sensor de contacto magnetico pero en la simulacion utilizo una señal de reloj con 555 si alguien me ayda en que estoy fallando le estaria agradecido


----------



## ricbevi (Jul 16, 2014)

mijastro dijo:


> hola disculpen adjunto los archivos de simulacion en proteus y la codificacion en proton, utilizo el 18f2550 y un sensor de contacto magnetico pero en la simulacion utilizo una señal de reloj con 555 si alguien me ayda en que estoy fallando le estaria agradecido



Hola...revise solo de pasada pero...¿cuando piensas decirle al compilador que tipo de display usaras y donde estará conectado?...si no informas eso para empezar no creo que aparezca nada en el mismo a la hora de imprimir...también es de buena practica anticipar los fusibles que usaras en la cabecera del programa....tienes declarado el puerto b todo como entradas cuando en realidad esta conectado al display que son salida, etc, etc.
Saludos.

Ric.


----------



## D@rkbytes (Jul 17, 2014)

ricbevi dijo:


> ¿Cuando piensas decirle al compilador que tipo de display usaras y donde estará conectado?
> Si no informas eso para empezar no creo que aparezca nada en el mismo a la hora de imprimir.


Como comentario:
Al igual que el PICBasic de MicroCode Studio, también Proton IDE tiene pines que usa por defecto para el control de la pantalla cuando se omiten las declaraciones de control.

Es por ese motivo que aún sin estar estas declaraciones en el programa de *mijastro*, funciona la pantalla. 



ricbevi dijo:


> También es de buena practica  anticipar los fusibles que usaras en la cabecera del programa.


Eso si es importante pero también se pueden establecer externamente cuando se graba el PIC.


ricbevi dijo:


> Tienes  declarado el puerto b todo como entradas cuando en realidad esta  conectado al display que son salida, etc, etc.


Recordemos que muchas de las funciones propias que realiza un entorno de alto nivel, establecen los pines como entradas o salidas dependiendo que función estemos usando.
Así, en este caso para el control de la pantalla, Proton se encarga de realizar esta tarea.
Sin embargo si es redundante establecer los pines de un puerto como entradas, ya que por defecto así están.

Saludos Ric. 
Me da gusto verte de nuevo por el Foro.​


----------



## ricbevi (Jul 17, 2014)

Saludos D@rkbytes y muy atinados y educativos tus comentarios como siempre...cuando descargue el archivo originalmente subido,* no funcionaba el display* y después de hacer las modificaciones que detalle y subí, empezó a funcionar...supongo que como no utilizo dicha versión(8.1) todavía del forma asidua, estaría con alguna configuración que no correspondía y hasta no realizar dichos cambios no funciono en mi caso en particular.
Personalmente soy de los que prefiere dejar lo menos posible que decida el software que es lo que yo pretendo hacer, ya que pequeños detalles de esa "poca mota"(declarar micro-controlador, frecuencia de reloj, definir fusibles, definir ubicación de dispositivos externos, etc.), son los que hacen que uno pierda bastante tiempo buscando por que no funciona algún proyecto en particular o no lo hace de la forma que uno ideo.
Un abrazo y muchas gracias por tú permanente generosidad.

Ric.


----------



## mijastro (Jul 17, 2014)

buenos dias con todos, en mi compilador no tengo problema del display ni en mi simulacion ya que yo uso el proteus 8.0, y el proton es la version 2.2.5 que en esta no se necesita declarar la lcd que se va a ocupar


----------



## ricbevi (Jul 17, 2014)

mijastro dijo:


> buenos dias con todos, en mi compilador no tengo problema del display ni en mi simulacion ya que yo uso el proteus 8.0, y el proton es la version 2.2.5 que en esta no se necesita declarar la lcd que se va a ocupar



Como comente anteriormente en el Proteus 8.1 que tengo instalado da la lista de errores de display que adjunte con anterioridad los archivos que subiste oportunamente(por lo que no importaría la versión de Proton si ya esta el "hex" generado que es el que se utiliza en la simulación así como el proyecto de Proteus)  y solo después de reformar los item que anteriormente remarque entonces empezó a funcionar (mí versión del IDE 2.0.1.0 y 3.5.2.7 del compilador).
Adjunto capturas con la carga de los dos archivos distintos y sus resultados así como los archivos usados en ambos casos.

Ric.


----------



## mijastro (Jul 19, 2014)

buenas con todos, yo tambien utilice el proteus 8.1 y no me funcionaba por esa razon utilice la version anterior y me corria muy bien


----------



## ricbevi (Jul 20, 2014)

mijastro dijo:


> buenas con todos, yo tambien utilice el proteus 8.1 y no me funcionaba por esa razon utilice la version anterior y me corria muy bien



OK...me quedo tranquilo que no es algo de "seteo" si no de versión....revisa el comando "Counter" en la ayuda del Proton que tal vez allí encontraras la solución a lo que buscas.
Saludos.

Ric.


----------



## mijastro (Jul 21, 2014)

gracias por comentar, pero ya utilice la funcion counter pero no obtuve buenos resultados


----------



## ricbevi (Jul 21, 2014)

mijastro dijo:


> gracias por comentar, pero ya utilice la funcion counter pero no obtuve buenos resultados



Con los datos que aportas es muy difícil prestarte ayuda...Tú sabes lo que has echo y como y nosotros solo lo que tú nos dices y hasta ahora es "no anda"...en el software que subiste no hay ningún lapso de tiempo para la cuenta de los cambios de estado del pin RA.0 de entrada entonces ¿como piensas relacionarlo con la formula de *velocidad = espacio /* *tiempo*? tienes en cuenta el estado del pin pero no hay ninguna referencia a un lapso de *tiempo.
*Falta que informes que relación guarda la entrada de pulsos con la distancia recorrida aparte del calculo de 2*Pi*Radio. El comando Counter en la simulacion funciona correctamente(no se en lo real por los rebotes de señal en el sensor).
Ric.


----------



## mijastro (Jul 21, 2014)

Muchas gracias por comentar. Mira lo q*ue* yo uso es un sensor como el q*ue* está en la imagen de la rueda trasera del carro y si el conteo de los pulsos es de 4 en 1segundo
	

	
	
		
		

		
			





.

Esta es la imagen del sensor.


----------



## mijastro (Jul 22, 2014)

buenas me faltaba algo de especificar que ya tenemos la relacion tiempo-pulsos que adjunto en la imagen y en la programacion tiene que sonar una alarma que me indique que cuando la velocidad haya pasado los 30km/h, "reduzca la velocidad"


----------



## ricbevi (Jul 22, 2014)

mijastro dijo:


> buenas me faltaba algo de especificar que ya tenemos la relacion tiempo-pulsos que adjunto en la imagen y en la programacion tiene que sonar una alarma que me indique que cuando la velocidad haya pasado los 30km/h, "reduzca la velocidad"



La forma que se me ocurre para medir la velocidad según la formula que antes expuse es o mides en un tiempo pre-determinado la cantidad de pulsos entrantes o mides el tiempo entre cada pulso...un método tiene mayor exactitud a menor velocidad y el otro a mayor velocidad entre los pulsos.
El problema que se plantea es que para medir 5Km/h en ambos métodos y con la escala que pasate, deberías esperar 60minutos(1hora)/5= 12minutos(poco practico un velocímetro que demore tanto en informar a que velocidad vas...a menos que seas una tortuga)  para que ocurra 1 pulso o lo que es lo mismo que has recorrido 1000mts(1Km). Con el mismo razonamiento para 30Km/h debes esperar 2minutos para que ocurra un pulso.
Si el generador de pulso esta solidariamente puesto al eje de la rueda del vehículo, las ruedas de este miden aproximadamente 318mts de diámetro!!!!!(quisiera "pasear" en él) 

Ric.


----------



## mijastro (Jul 23, 2014)

ricbevi dijo:


> Con los datos que aportas es muy difícil prestarte ayuda...Tú sabes lo que has echo y como y nosotros solo lo que tú nos dices y hasta ahora es "no anda"...en el software que subiste no hay ningún lapso de tiempo para la cuenta de los cambios de estado del pin RA.0 de entrada entonces ¿como piensas relacionarlo con la formula de *velocidad = espacio /* *tiempo*? tienes en cuenta el estado del pin pero no hay ninguna referencia a un lapso de *tiempo.
> *Falta que informes que relación guarda la entrada de pulsos con la distancia recorrida aparte del calculo de 2*Pi*Radio. El comando Counter en la simulacion funciona correctamente(no se en lo real por los rebotes de señal en el sensor).
> Ric.



muchas gracias por la programacion me fue de mucha ayuda y si alguien puede darme algun otro metodo de funcionamiento les estare muy agradecido


----------



## mijastro (Jul 28, 2014)

buenos dias disculpen una pregunta como hago para adaptar lo de distancia vs pulsos


----------



## emelyjose (Oct 19, 2014)

hola buena noche, Soy de Venezuela, y recién comienzo en la programación y comenzé con el micro code studio pero por no manera directamente puntos flotante me cambie al proton IDE, actualmente he programado un controlador de temperatura para una incubadora de huevos y me funciona muy bien. la cuestión esta en que a este código deseo incorporarle una rutina que me permita realizar el volteo automático en un tiempo especifico, pero no logra que el programa me corra sin interferir en el control y sensado de la temperatura.  como podria hacer para que el volteo se me realize digamos en un segun plano ? que se ejecuten los dos programas pero uno independiente del otro.

en el caso del control de temperatura, este me sensa y controla constantemente y el volteo automatico tendria que realizarse cada 8 horas

como podria yo realizar esto?   

ojala puedan ayudarme y se los agradeceria un mundo


----------



## ricbevi (Oct 19, 2014)

emelyjose dijo:


> hola buena noche, Soy de Venezuela, y recién comienzo en la programación y comenzé con el micro code studio pero por no manera directamente puntos flotante me cambie al proton IDE, actualmente he programado un controlador de temperatura para una incubadora de huevos y me funciona muy bien. la cuestión esta en que a este código deseo incorporarle una rutina que me permita realizar el volteo automático en un tiempo especifico, pero no logra que el programa me corra sin interferir en el control y sensado de la temperatura.  como podria hacer para que el volteo se me realize digamos en un segun plano ? que se ejecuten los dos programas pero uno independiente del otro.
> 
> en el caso del control de temperatura, este me sensa y controla constantemente y el volteo automatico tendria que realizarse cada 8 horas
> 
> ...



Hola...Debes ser mas especifico en lo que tienes echo hasta ahora(software, hardware) ya que nosotros solo sabemos lo que tú nos cuentas del proyecto en cuestión. Generalmente se utiliza interrupciones y algún reloj de tiempo real tipo el DS1307 u otro dependiendo del requerimiento del desarrollo, etc.
Saludos.

Ric.


----------



## emelyjose (Oct 20, 2014)

HOLA  ricbevi,  gracias por comentar.

Te cuento.... como mencione anteriormente, hace un tiempo realice un controlador de temperatura para una incubadora de huevos de gallinas y si que me funciona muy bien hasta incluso he llegado a sacar pollitos. el problema que tengo es que al software que realice le quiero anexar una rutina que me permita controlar el volteo automático cada 8:25 horas sin que esta rutina me interfiera en el trabajo del censado de la temperatura, esto seria como correr dos programas al mismo tiempo ó que trabaje en un modo de segundo plano algo asi me imagino yo, no se si estoy equivocado....  

cabe mencionar que uso el Proton IDE

aca te dejo el codigo del programa a ver si me puedes dar una mano ya que soy nuevo en esta area.


```
'****************************************************************
'*  Name    : control de temperatura.BAS                                       *
'*  Author  : [EMELY SUMOZA]                                    *
'*  Notice  : Copyright (c) 2014 [SMILLER c.a]              *
'*          : All Rights Reserved                                     *
'*  Date    : 20/06/2014                                             *
'*  Version : 1.0                                                         *
'*  Notes   :                                                               *
'*          :                                                                  *
'****************************************************************

Device 16F877A ' Define LCD registers and bits
Declare Xtal=4
TRISA=0
CMCON = 7                    ; Set PORTA and PORTE to digital
;-------------------------------------------------------------------------------

Declare LCD_Type 0           ; definimos el tipo de lcd que se va a utilizar  
Declare LCD_DTPort PORTA     ; Definimos puertos a emplear
Declare LCD_DTPin PORTA.0    ; puertos que se usaran como línea de datos 
Declare LCD_RSPin PORTB.2    ; puerto que va funcionar como RESET
Declare LCD_ENPin PORTB.1    ; Definimos el puerto que va a ENABLE en el LCD

;-------------------------------------------------------------------------------

DQ      VAR     PORTB.0      ; One-wire data pin
count_per_c VAR Byte         ; Count per degree C
;-------------------------------------------------------------------------------

temperature VAR Word            
x VAR Byte
x3 var Float
Tempbaj VAR Float
tempalt VAR Float
;------------------------------------------------------------
rF VAR PORTB.7 
rC VAR PORTB.6
led VAR PORTA.4
enter VAR PORTB.5
bsubir VAR PORTB.4
bbajar VAR PORTB.3
;-------------------------------------------------------------------------------
DIn VAR Byte
DIn = 0
x1 var Float
x1 = 28.2
x2 var Float
x2 = 28

EWrite Din,[x1]
tempalt  = ERead 0
EWrite Din,[X2]        ;contenido inicial 0 de la EEPROM
                               ;lee la EEPROM 0 y lo guarda en tempalt
tempbaj  = ERead 1            ;lee la EEPROM 1 y lo guarda en tempbaj
;-------------------------------------------------------------------------------
Print $fe, 1,"BIENVENIDO" ;limpiar LCD y sacar texto
Print $fe, $c1,"CARGANDO ."
DelayMS 1500
Print $fe, 1,"BIENVENIDO " ;limpiar LCD y sacar texto
Print $fe, $c1,"CARGANDO .." 
DelayMS 1000
Print $fe, 1,"BIENVENIDO" ;limpiar LCD y sacar texto
Print $fe, $c1,"CARGANDO ...."
DelayMS 1000
Print $fe, 1,"TEMPERATURA" ;limpiar LCD y sacar texto
Print $fe, $c1,"CARGANDA "
DelayMS 1000


;-------------------------------------------------------------------------------
inicio:                               ;3 parpadeos del led que indica funciona
For x =1 To 3
High led
DelayMS 500
Low led
DelayMS 300
Next
;-------------------------------------------------------------------------------
mainloop:    ;programa principal de censado de temperatura
        OWrite DQ, 1, [$CC, $44] ' inicia la convención de la temperatura
        High led
        DelayMS 100
        Low led   
        DelayMS 100
        
        OWrite DQ, 1, [$CC, $BE]         ' lee la temperatura
        ORead DQ, 0, [temperature.LowByte, temperature.HighByte]
        temperature = temperature */ 1600
        x3=temperature/100
        Print $fe, 1,"TEMPERATURA"
        Print $fe, $c1, Dec1 x3,06, 223,"C"
        ;-----------------------------------------------------------------------
        For x = 1 To 10 ;repetir 10 veces
        If enter =0 Then grabar1a
       
        DelayMS 10
        If X3 <= tempbaj  Then calentar ;si X3 es <tempbaj ir a calentar 
        If X3 >= tempalt Then enfriar  ;si X3 es >tempALT ir a ENFRIAR
                
        Low rC : Low rF ;apagar los 2 relés
        Next
        
        GoTo mainloop ;continuar censando

calentar:
High rC : Low rF
GoTo mainloop

enfriar:
High rF : Low rC
GoTo mainloop

grabar1a:
GoSub soltar

grabar1:
Print  $fe, 1, "Programar temp."
Print $fe,$c0,"baja= ",Dec1 tempbaj ,223,"C"
DelayMS 50
If bbajar=0 Then restar1
If bsubir=0 Then sumar1
If enter=0 Then grabarA
GoTo grabar1

restar1:
GoSub soltar ;programa antirrebote de tecla
If tempbaj < 1 Then grabar1
tempbaj= tempbaj -0.1
GoTo grabar1

sumar1:
GoSub soltar
If tempbaj > 100 Then grabar1
tempbaj= tempbaj + 0.1
GoTo grabar1

;..................................................................
grabarA:
GoSub soltar
EWrite 1,[x1] ;escribir en la dirección 0 de la EEPROM
;...................................................................

grabar2:
Print $fe, 1, "Programar temp."
Print $fe,$c0,"alta= ",Dec1 tempalt ,223,"C"
DelayMS 100
If bbajar=0 Then restar2
If bsubir=0 Then sumar2
If enter=0 Then grabarB
GoTo grabar2

restar2:
GoSub soltar
If tempalt < 5 Then grabar2
tempalt= tempalt -0.1
GoTo grabar2

sumar2:
GoSub soltar
If tempalt > 50 Then grabar2
tempalt= tempalt + 0.1
GoTo grabar2

;................................................................
grabarB:
GoSub soltar
EWrite 0,[x2];escribir en la dirección 1 de la EEPROM
GoTo inicio
;................................................................

soltar: ;programa antirrebote de tecla
 
High led:
High PORTB.7
DelayMS 150
Low led

soltar2:
If bbajar=0 Then soltar2
If bsubir=0 Then soltar2
If enter=0 Then soltar2
DelayMS 100
Return
End
```


----------



## ricbevi (Oct 20, 2014)

emelyjose dijo:


> HOLA  ricbevi,  gracias por comentar.
> 
> Te cuento.... como mencione anteriormente, hace un tiempo realice un controlador de temperatura para una incubadora de huevos de gallinas y si que me funciona muy bien hasta incluso he llegado a sacar pollitos. el problema que tengo es que al software que realice le quiero anexar una rutina que me permita controlar el volteo automático cada 8:25 horas sin que esta rutina me interfiera en el trabajo del censado de la temperatura, esto seria como correr dos programas al mismo tiempo ó que trabaje en un modo de segundo plano algo asi me imagino yo, no se si estoy equivocado....
> 
> ...




Entonces haces lo que te comente...le agregas un DS1307(en el hilo anterior esta el datasheet), si no tienes ejemplos de programación en el foro están(usa el buscador). Básicamente haces lo mismo que cuando lees la temperatura y decides que hacer con ella nada mas que ahora es cuestión de tiempo. Lo puedes intercalar...lees la hora, temperatura y después decides que hacer con cada auno de los diferentes parámetros....si llego la hora volteas, si llego la temperatura mínima enciendes calefacción, etc.
Creo haber visto en el foro un aporte de una incubadora de ese tipo así que deberías de usar el buscador para revisar también al respecto....mira aquí 
Saludos.

Ric.


----------



## emelyjose (Nov 2, 2014)

hola. bien veo que me entendiste con respecto a lo que requiero hacer.

te dejo una explicación  mas sencilla para ver si me ayudas como se realiza una rutina de este tipo.

Comienzo:

Imagínate que en un proyecto usted desea realizar tres trabajos, la cual son---- leer temperatura y otro encender dos led en diferentes tiempos,

1: Que en ningún momento el pic me deje de censar y controlar la temperatura. 

2: Que al mismo tiempo que realiza el trabajo (1) me encienda un led por decir cada (X) segundos  (ajustable),

3: Que al mismo tiempo que realiza el trabajo (1 y 2) Me encienda un led y me lo deje encendido por (Y) minutos y luego apague.

Lo que deseo realmente es como realizar una rutina  que me permita hacer esto pero que ninguna de las 3 funciones intervenga en el trabajo de las demás ( es como tener 3 pic funcionando 1 para la temperatura, uno para un led y el otro para el otro led ) pero los tres pic en uno solo.

Existe la posibilidad de poder realizar esto ? 

De mano te agradecería, uno por que estoy realizando este proyecto y otro por que me gustaría aprender como realizar este tipo de rutinas. he pedido ayuda en muchos foros en cuanto a esto pero realmente no la he obtenido.


----------



## ricbevi (Nov 3, 2014)

emelyjose dijo:


> hola. bien veo que me entendiste con respecto a lo que requiero hacer.
> 
> te dejo una explicación  mas sencilla para ver si me ayudas como se realiza una rutina de este tipo.
> 
> ...



Es posible hacer eso y mucho mas con un PIC pero no de la forma que lo planteas...no hace el trabajo de tres PIC si no que lo puede hacer tan rápido que seria como si así lo hicieran. La temperatura no es un parámetro (al menos en esta aplicación) que cambie en el orden de los mili-segundos por lo que no es necesario estar permanentemente sobre ella, y puedes dedicarle tiempo a prender el led que quieres, consultar al IC que te recomendé dedicado al tiempo, etc.
El problema de este y otros foro es que se brinda ayuda no se hacen trabajos a pedido por lo que encontraras ni mas ni menos que eso.
Ejemplo simplificado del programa a hacer

1)Mido la temperatura
2)Consulto el tiempo(o inviertes el orden del proceso uno por el dos según te pazca/convenga))
3)Comparo con los parámetros anteriores y muestro en display si quiero
4)Actuó en consecuencia según mi criterio(calefacción, refrigeración, volteo, etc)
5)repito el ciclo...voy al punto 1 

Te reitero usa el buscador del foro que creo haber visto tratado el tema de una incubadora para huevos.

Ric.


----------



## DEPREDADORX1 (Nov 3, 2014)

hola emelyjose,

Lo mejor será que trates con interrupciones, no te garantizo fiabilidad al 100%, yo quería hacer un velocímetro digital usando timer0 y timer1 pero al final desistí, entonces te recomendaría empezar con lo básico sobre ese tema, aquí en el foro hay mucha información al respecto y tambien en la ayuda de proton. Creo que debes mirar la pagina 21 donde se trata algo referente a las interrupciones.

Mucha suerte con el proyecto y no olvides publicar tus avances.


----------



## Tusepulto (Abr 15, 2015)

Buenas noches, genios. ¿Cómo están todos? Espero que bien.
Hoy les escribo porque necesito un poco de ayuda.

Estoy haciendo un programa con 4 switchs y los switchs deben ser presionados en una secuencia correcta para activar una salida, al transcurrir 3 minutos después de activar dicha salida, el programa vuelve al inicio, hasta ahí todo perfecto.
La pregunta es, si puedo reducir mi programa con otras lineas de código que me faciliten cambiar la secuencia de activación más fácilmente.
¿Alguien me puede regalar una secuencia de While y Wend para saber como trabajan este tipo de instrucciones?

De antemano, muchas gracias.

```
Device 16F628A

      Reminders=false
      Config intrc_osc_noclkout,wdt_off,pwrte_on,lvp_off,boden_off,mclre_off
      Reminders =true
Xtal = 4
All_Digital true
 
 TRISA =%00001111
 TRISB =%00000000
 
  
 Dim contador As Word
                            
 Symbol in1=PORTA.0
 Symbol in2=PORTA.1
 Symbol in3=PORTA.2
 Symbol in4=PORTA.3
 
 contador=0  
 PORTA =0
 PORTB =0 
 
 inicio: 
 If in1 = 1 Then 
 GoTo intro2
 EndIf 
 GoTo inicio
;************************************************************************************************************
 intro2:
 contador = contador +1
 If in2 =1 Then 
 contador=0
 GoTo intro3
 EndIf
 
 If in3=1 Then
 GoTo inicio
 If in4=1 Then
 GoTo inicio
 EndIf
 EndIf
 DelayMS 1
 If contador > 2000 Then
 contador =0
 GoTo inicio 
 EndIf 
 GoTo intro2
;************************************************************************************************************* 
 intro3:
 contador = contador +1
 If in3 =1 Then 
 contador=0
 GoTo intro4
 EndIf
 
 If in1=1 Then
 GoTo inicio
 If in4=1 Then
 GoTo inicio
 EndIf
 EndIf
 DelayMS 1
 If contador > 2000 Then
 contador =0
 GoTo inicio 
 EndIf 
 GoTo intro3
 ;**************************************************************************************************************
 intro4:
 contador = contador +1
 If in4 =1 Then 
 contador=0
 GoTo salida
 EndIf
 
 If in1=1 Then
 GoTo inicio
 If in2=1 Then
 GoTo inicio
 EndIf
 EndIf
 DelayMS 1
 If contador > 2000 Then
 contador =0
 GoTo inicio 
 EndIf 
 GoTo intro4
;************************************************************************************************************** 
 salida:
 contador = contador+1
 High PORTB.2
 PORTB.0=PORTA.0
 PORTB.1=PORTA.1
 If in3=1 Then 
 contador =0
 GoTo bloqueo
 EndIf
 
 DelayMS 45
 If contador > 4000 Then 
 contador=0
 Low PORTB.2
 GoTo inicio
 EndIf 
 GoTo salida
 
 bloqueo:
 contador=contador+1
 
 DelayMS 10
 If contador > 300 Then 
 contador = 0 
 Low PORTB.2
 GoTo inicio
 EndIf
 
 If in3=1 Then 
 GoTo bloqueo
 EndIf
 
 Clear contador
 GoTo salida
 End
```


----------



## Arsenic (Abr 26, 2015)

Hola, tengo una pregunta: Estoy haciendo un tipo tornito y necesitaría ayuda. Es un torno con sensor de chásis abierto. Para que el pic sepa que el chásis está abierto, he colocado uno de esos switchs de "palanca". Lo que necesito es que el motor funcione un tiempo en un sentido (cuando el switch se cierra) y otro tiempo en el sentido contrario (cuando se abre). ¿Qué es lo que puedo hacer? Hice uno que hasta ahora llevo bien, pero sólo cumple con el movimiento una vez. Les dejo el código:



```
Stats:
    While PORTB.4 = 0
        DelayMS 100
        If i = 0 Or i = 5 Then
        GoTo Down
    Wend
    While PORTB.4 = 1
        DelayMS 100
        GoTo Up
    Wend
    
    
    
    
Down:
    If PORTB.4 = 0 Then
        If i < 5 Then
            For i = 0 To 5 Step 1
                High PORTB.0
                DelayMS 150
                Low PORTB.0
                High PORTB.1
                DelayMS 150
                Low PORTB.1
                High PORTB.2
                DelayMS 150
                Low PORTB.2
                High PORTB.3
                DelayMS 150
                Low PORTB.3
            Next i
        EndIf
        If i > 0 Then
            For i = 5 To 0 Step -1
                High PORTB.0
                DelayMS 150
                Low PORTB.0
                High PORTB.1
                DelayMS 150
                Low PORTB.1
                High PORTB.2
                DelayMS 150
                Low PORTB.2
                High PORTB.3
                DelayMS 150
                Low PORTB.3
            Next i
        EndIf
    EndIf
    If PORTB.4 = 1 Then
        GoTo Stats
    EndIf

 
Up:
    If PORTB.4 = 1 Then
            If j < 5 Then
                For j = 0 To 5 Step 1
                    High PORTB.3
                    DelayMS 150
                    Low PORTB.3
                    High PORTB.2
                    DelayMS 150
                    Low PORTB.2
                    High PORTB.1
                    DelayMS 150
                    Low PORTB.1
                    High PORTB.0
                    DelayMS 150
                    Low PORTB.0    
                Next j
            EndIf
            If j > 0 Then
                For j = 5 To 0 Step -1
                    High PORTB.3
                    DelayMS 150
                    Low PORTB.3
                    High PORTB.2
                    DelayMS 150
                    Low PORTB.2
                    High PORTB.1
                    DelayMS 150
                    Low PORTB.1
                    High PORTB.0
                    DelayMS 150
                    Low PORTB.0
                Next j
            EndIf          
    EndIf
    If PORTB.4 = 0 Then
        GoTo Stats
    EndIf






End
```

Resuelto.


----------



## Tusepulto (Abr 26, 2015)

buenas noches a todos alguien me puede ayudar con los fuses del pic12f1822 y como configurar su oscilador interno..!! de antemano muchas gracias


----------



## D@rkbytes (Abr 27, 2015)

Ese tipo de PIC tiene varias opciones para configurar el oscilador interno.
• 32 MHz (requires 4x PLL)
•16 MHz
•8 MHz
•4 MHz
•2 MHz
•1 MHz
• 500 kHz (default after Reset)
• 250 kHz
• 125 kHz
• 62.5 kHz
• 31.25 kHz
• 31 kHz (LFINTOSC)

Esa información la puedes encontrar en la hoja de datos.
Por ejemplo, este programa configura el oscilador interno a 32 MHz y hace destellar un LED en RA0 cada 500 ms.

```
[B]Device [COLOR=DarkSlateBlue]12F1822[/COLOR]
[COLOR=DarkRed]Reminders[/COLOR] = Off
Config1 [/B]FOSC_INTOSC, WDTE_OFF, PWRTE_ON, FCMEN_OFF, MCLRE_OFF[B]
Config2 [/B]WRT_OFF, PLLEN_OFF, LVP_OFF[B]
[COLOR=DarkRed]Reminders[/COLOR] = On

[COLOR=DarkRed]Xtal[/COLOR] [/B]= 32MHz[B]
Declare [COLOR=DarkRed]Create_Coff[/COLOR] [/B]=[B] On

[/B]Inicio:[B]
    [COLOR=DarkGreen]OSCCON[/COLOR] = [/B]%11110000[B]
    [COLOR=DarkGreen]ANSELA[/COLOR] [/B]= 0[B]
    Symbol[/B] LED = PORTAbits_RA0[B]
    
    
[COLOR=Red]Rem[/COLOR] [/B]Programa principal:[B]

    While [/B]1 = 1[B]
        Toggle [/B]LED[B]
        DelayMS[/B] 500[B]
    Wend
    
    End[/B]
```
La sintaxis de la palabra de configuración depende de la versión que estés usando.
Este programa fue escrito con el IDE, versión 2.0.1.0 y Compilador, versión 3.5.7.2


----------



## jmpl (Jul 27, 2015)

Saludos foreros, hace tiempo había comenzado con proton pero la deje un poco de lado por la universidad donde utilizaba assembler, pero ahora quiero retomar a proton por que me gusta mas. .

Estoy realizando con la ayuda de un ejemplo de paginas anteriores, pruebas sobre la interrupción externa por rb0, utilizo el 16f877a, para ver como funciona y colocarla en un proyecto futuro, entonces hice un contador ascendente y descendente de 0 a 10 y lo muestro en la pantalla, algo muy sencillo, entonces quiero que cuando ocurra la interrupción, colocar "interrupción" en la pantalla y espere un tiempo corto y luego vuelva al programa contador, pero el problema que tengo es que en la simulación cuando activo el pulsador en la pantalla efectivamente se coloca interrupción pero dura mucho tiempo sin volver al programa principal aun cuando coloco un dalayms 1000, la espera es para ver la pantalla y ya.
A que se deberá esto?. Por que dura tanto en volver al programa?, tengo algo mal configurado?. Agradezco a quien pueda ayudarme, ya he recibido ayuda por aquí y estoy muy agradecido,  . Adjunto el ejemplo

```
Device = 16F877A
Config HS_OSC , WDT_OFF , PWRTE_ON , CP_OFF , LVP_OFF 

XTAL 20

Declare LCD_TYPE    Alpha       
Declare LCD_DTPIN   PORTB.4     
Declare LCD_RSPIN   PORTB.2     
Declare LCD_ENPIN   PORTB.3  
Declare LCD_INTERFACE   4       
Declare LCD_LINES   2  

Dim I As Word 
Cls 

On_Hardware_Interrupt GoTo MyInt
INTCON = %11010000          ; Configurar la Interrupción solo por RB0
OPTION_REG.6 = 0            ; Activar la interrupción por flanco de bajada en RB0

INICIO:
; Aquí tu código principal (Esto es un ejemplo)

    For I = 0 To 10
    
    Print At 1, 1, "Numero", DEC4 I
    DelayMS 500
    Next I 
    
   DelayMS 100
   
    For I = 10 To 0 Step -1   
    
    Print At 1, 1, "Numero", DEC4 I
    DelayMS 500
    Next I 
    
  
       GoTo INICIO

; Esta parte es el controlador de la interrupción.

; Aquí se llega al ejecutarse la interrupción.
Disable
MyInt:
    Context SAVE              ; Guardar el contexto de los registros.
    INTCON.1 = 0            ; Limpiar la bandera de interrupción por RB0
; Aquí el código que se ejecutara durante la interrupción del programa principal.
    Cls
    Print At 1, 1, "Interrupcion"      
   DelayMS 1000
    INTCON=%10010000   
    Context Restore          ; Restaurar el contexto de los registros.
    Resume
    Enable    
    
   
    End
```


----------



## D@rkbytes (Jul 27, 2015)

No veo nada extraño en el programa que pueda provocar el exceso de retardo que mencionas.
El programa en sí, si tiene algunos detalles que corregir, pero nada para que se tarde tanto en salir de la interrupción.

Si estás simulando, verifica que la frecuencia del microcontrolador sea la misma que en el programa.


----------



## jmpl (Jul 27, 2015)

Pensé en esos mismo pero ya verifique la frecuencia y está bien, me puedes decir que detalles debo mejorar.

Le quite el retardo y funciona bien. Claro la pantalla  que dice interrupcion apenas se puede Ver, Pero si vuelve al programa dél contador.


----------



## D@rkbytes (Jul 28, 2015)

Realicé el montaje físicamente para comprobar lo que mencioné, y no existe el retardo excesivo que mencionas.
También hice una simulación, y si el PIC tiene los 4 MHz por defecto del simulador y en el programa 20 MHz, entonces si existe una velocidad de ejecución muy lenta.
Este error al simular es muy común y ya lo había comentado en alguna ocasión.
También he comentado que al simular se deben usar frecuencias bajas. (Esto mejora el proceso porque no se sobrecarga el simulador.)

Si vas a simular debes establecer una frecuencia de 1 MHz o 4 MHz y al microcontrolador le estableces esa frecuencia.
Ya cuando realices el proyecto físicamente, vuelves a establecer la frecuencia normal de operación.

Estos serían los cambios en el programa y basados en la sintaxis de Proton IDE:

```
Device = 16F877A
    Reminders = Off
    Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF
    Reminders = On

    Declare Xtal 20MHz

    Declare LCD_Type    Alpha       
    Declare LCD_DTPin   PORTB.4     
    Declare LCD_RSPin   PORTB.2     
    Declare LCD_ENPin   PORTB.3  
    Declare LCD_Interface   4       
    Declare LCD_Lines   2  

    Dim I As Byte                ; Como se va a contar hasta 10, no es necesaria una variable del tipo Word

Inicio:  

    On_Hardware_Interrupt GoTo MyInt
    INTCON = %11010000          ; Configurar la Interrupción solo por RB0
    OPTION_REGbits_INTEDG = 0   ; Activar la interrupción por flanco de bajada en RB0
    
    Cls                         ; Inicializa y limpia la pantalla

; Aquí tu código principal (Esto es un ejemplo)
    While 1 = 1
        For I = 0 To 10
            Print At 1, 1, "Numero: ", Dec2 I   ; Usar Dec2, porque sólamente usaremos dos dígitos.
            DelayMS 500
        Next I 
    
        DelayMS 100
   
        For I = 10 To 0 Step -1       
            Print At 1, 1, "Numero: ", Dec2 I
            DelayMS 500
        Next I 
    
    Wend

; Esta parte es el controlador de la interrupción.
; Aquí se llega al ejecutarse la interrupción.
MyInt:
    Context Save                ; Guardar el contexto de los registros.
    
    If INTCONbits_INTF = 1 Then ; Comprobar el bit INTF (External Interrupt Flag Bit)
        ; Aquí el código que se ejecutara durante la interrupción del programa principal.
        Print At 1, 1, "Interrupcion"      
        DelayMS 1000
        Cls                     ; Limpiamos la pantalla al final
                                ; Porque el texto mostrado es superior al anterior.
        INTCONbits_INTF = 0     ; Limpiar la bandera de interrupción por RB0
    End If
    
    Context Restore             ; Restaurar el contexto de los registros.
      
    End
```
Dejé los mismos comentarios, agregué otros, lo mejoré un poco y eliminé las partes de código redundantes.

Realiza una prueba en físico y verás que el retorno de la interrupción debe durar un poco más de 1 segundo debido al tiempo que tarden en ejecutarse las instrucciones subsecuentes, incluyendo las de escritura para la pantalla. (Unos cuantos milisegundos más)


----------



## kowart (Nov 27, 2015)

Aqui el archivo ----> tanto en Proton como PBP Ver el archivo adjunto CronÃ³metro.rar  Este programa fue subido originalmente por D@rkbytes en PBP


----------



## jfev (Dic 4, 2015)

Hola. Tengo un problema para controlar unos servo motores con el PIC16F877A, usando proton.

Primero quise trabajarlos usando una variable Word, pero tengo que apagarla al final para que siga corriendo la programación y no me sirve para la aplicación que le quiero dar a los servos, debido a que vuelven a quedar libra y no quedan en la posición deseada.

He estado intentando hacerlo con HPWM, pero con los datos que me indica colocar, no sé cómo determinar el valor del ciclo de trabajo, la frecuencia y el periodo que son necesarios para poder trabajar con los servo motores.
O no sé qué otra función puedo utilizar para controlar los servo motores.

Gracias por la ayuda que me puedan dar.


----------



## D@rkbytes (Dic 4, 2015)

jfev dijo:


> Hola. Tengo un problema para controlar unos servo motores con el PIC16F877A, usando proton.
> 
> Primero quise trabajarlos usando una variable Word, *pero tengo que apagarla* al final para que siga corriendo la programación y no me sirve para la aplicación que le quiero dar a los servos, debido a que *vuelven a quedar libra* y no quedan en la posición deseada.


¿A qué te refieres con apagar una variable y con que vuelven a quedar libra? 



jfev dijo:


> He estado intentando hacerlo con HPWM, pero con los datos que me indica colocar, no sé cómo determinar el valor del ciclo de trabajo, la frecuencia y el periodo que son necesarios para poder trabajar con los servo motores.
> O no sé qué otra función puedo utilizar para controlar los servo motores.


El uso de las instrucciones se encuentra en el documento de ayuda de Proton IDE


jfev dijo:


> Gracias por la ayuda que me puedan dar.


¿Ya leíste la hoja de datos del servo motor que estás usando?

Proton es para lenguaje Basic y en el Foro se encuentran muchos ejemplos para controlar servo motores.


----------



## Gerson strauss (Dic 4, 2015)

jfev dijo:


> He estado intentando hacerlo con HPWM, pero con los datos que me indica colocar, no sé cómo determinar el valor del ciclo de trabajo, la frecuencia y el periodo que son necesarios para poder trabajar con los servo motores.
> O no sé qué otra función puedo utilizar para controlar los servo motores.
> 
> Gracias por la ayuda que me puedan dar.



Para utilizar los servo motores, debes utilizar la instrucción *SERVO*

main:
if porta.0 = 0 then
servo portb.0, 1500 'centra el servo
endif
goto main


----------



## kowart (Dic 27, 2015)

Hola continuando con el manejo de Proton ide dejo aquí una test para un lcd 16x2


```
'PROJECT PBP TO PROTON

Device 16F877A
'SUSCRIBETE A MI CANAL EN YOUTUBE  --->https://www.youtube.com/KORZ ES
'ORIGINAL TOPIC ---> http://www.picbasic.co.uk/forum/showthread.php?t=18416&page=2&highlight=matrix+serial
'VIDEO ----> https://www.youtube.com/watch?v=HugwQ4b9iBU 
'DIGITAL RESITOR http://www.protonbasic.co.uk/archive/index.php/t-53777.htm

Xtal 20
				
                                  
'Declare NO_Clrwdt	' watchdog is cleared manually  PBP a Proton+ conversion 
                    'more info --->http://www.protonbasic.co.uk/group.php?gmid=35&do=discuss#gmessage35  
                  

Declare Watchdog = 1

Declare All_Digital = True
Declare LCD_Type 0      ' LCD alfanumerica
Declare LCD_Interface 4 ' 4 lineas de datos
Declare LCD_DTPin PORTA.0 ' lineas de datos al PORTB RB4->RB7
Declare LCD_ENPin PORTB.3 ' EN al pin RB2
Declare LCD_RSPin PORTA.4 ' RS al pin RB3
Declare LCD_Lines 2       ' LCD de cuatro lineas
Declare LCD_DataUs  50				' LCD timing  
Declare LCD_CommandUs 2000				'
'
DATA  142,145,145,143,129,130,140,128		'9 digit roll stored horizontal
DATA  142,145,147,149,153,145,142,128		'0
DATA  132,140,132,132,132,132,142,128		'1
DATA  142,145,129,130,132,136,159,128		'2
DATA  159,130,132,130,129,145,142,128		'3
DATA  130,134,138,146,159,130,130,128		'4
DATA  159,144,158,129,129,145,142,128		'5
DATA  134,136,144,158,145,145,142,128		'6
DATA  159,129,130,132,136,136,136,128		'7
DATA  142,145,145,142,145,145,142,128		'8
DATA  142,145,145,143,129,130,140,128		'9
DATA  142,145,147,149,153,145,142,128		'0
'
DATA %01110000 ' invader frame a
DATA %00011000 ' stored vertical
DATA %01111101 '
DATA %10110110 '
DATA %10111100 '
DATA %00111100 '
DATA %10111100 '
DATA %10110110 '
DATA %01111101 '
DATA %00011000 '
DATA %01110000 '
DATA %10011100 ' invader frame b
DATA %10011000 ' stored vertical
DATA %01111101 '
DATA %00110110 '
DATA %00111100 '
DATA %00111100 '
DATA %00111100 '
DATA %00110110 '
DATA %01111101 '
DATA %10011000 '
DATA %10011100 '
'
DATA  "  edit 2015" ' original LC2D V2 - (c) Brek Martin 
'

Dim dis[51] As Byte 				    ' monochrome display buffer 24x17   
Dim rolls[8] As Byte
'How does one alias an element in a byte array?
Dim rolls0 As rolls#0 : Dim rolls1 As rolls#1
Dim rolls2 As rolls#2 : Dim rolls3 As rolls#3	    '
Dim rolls4 As rolls#4 : Dim rolls5 As rolls#5	    '
Dim rolls6 As rolls#6 : Dim rolls7 As rolls#7
Dim L0 As Byte					              ' LCD RAM index and used as counter
Dim CW As Byte : Dim CL As Byte			    ' multi purpose counters
Dim lind As Byte : Dim pind As Byte			    ' framebuffer indexing variables
Dim slug As Byte :Dim invert As Byte			    ' set invert 0xFF to invert display
Dim wtemp As Word					    '
Dim temp As wtemp.Byte0				    '
Dim tempb As wtemp.Byte1				    '
Dim px As Byte	: Dim py As Byte			    ' coordinates for library routines
'''''''''''''''''''''''''''''''''''''''''''''''''''''
'         END OF DISPLAY BUFFER CODESPACE           '
'''''''''''''''''''''''''''''''''''''''''''''''''''''
'
Dim x As Byte	' user coordinates for 2D graphics
Dim y As Byte	' these are for the user program
'
Dim dy As Byte	' line drawing variables can
Dim y1 As Byte	' be removed if not using lines
Dim y0 As Byte	' line drawing may break if start
Dim dx As Byte	' and end points are the same
Dim x1 As Byte	' which is not yet tested
Dim x0 As Byte	' thanks to oogabooga to for
Dim stepx As Byte	' optimisation of my code for
Dim stepy As Byte	' PBP unsigned integer bytes
Dim frac As Byte	' expand to words for bigger LCD
'
Dim ftick As Byte	' frame count variables can
Dim frame As Byte	' be removed if not counting
'
Dim dval As Byte	' value for printed variable
Dim digit As Byte	' buffer for printing sprites
Dim index As Byte	' eeprom index for sprite data
Dim dgx As Byte	' coordinates to print sprite
Dim dgy As Byte	'
Dim demd As Byte	' actual digits on the screen
Dim demdl As Byte	'
Dim dfc As Byte	' digit frame counter
'
'	circle drawing variables can be removed
'	if you remove the circle drawing routine
'   	some variables are shared with square drawing
'	this circle routine is borrowed from the GLCD
'	library posted by Dave on MELabs PBP forum
'	do not draw circles with radius less than 3.
'
Dim cx As Byte	' shared with square drawing routine
Dim cy As Byte	'
Dim glc_x As Byte	'
Dim glc_y As Byte	'
Dim glc_s As Word	' slope
Dim radius As Byte	' radius
'
Dim cdx As Byte	' circle demo horizontal coordinate
'
Dim doff As Byte	' digit odometer effect variables
Dim doffl As Byte	'
Dim doffm As Byte	'
Dim dcompl As Byte '
Dim dcompm As Byte '
Dim ddirl As Bit	' digit counting direction variables
Dim ddirm As Bit	' not implemented yet - out of memory
'
Dim xdir As Bit	' direction variables that can be
Dim ydir As Bit	' removed if not running the demo
'
Dim backled As Bit ' LED backlight flash status
'
invert = $FF	' 0xFF to invert display colours
'
'
' execution time!
'
CMCON = 7	' set portb to digital
TRISB.6 = 0	'set LCD backlight output
'
'the demo program turns on the backlight
'turn it on here if your program does not
'portb.6 = 1'turn on LCD backlight
'
backled = 1	' initially set led backlight on
ftick = 0	' reset demo section counter
frame = 0	' reset frame counters
x = 2		' set intial point coordinates
y = 2		'
cdx = 11	' set initial circle position
dfc = 0		' reset some variables that could
doff = 0	' break things if not initialised
dval = 0	'
demd = 0	'
demdl = 0	'
digit = 0	'
'
DelayMS 1200	'delayms for LCD to start
Print $FE,1	'clear LCD
'
'
cycle:		' main routine - demo user program
@ clrwdt	; clear watchdog timer manually
'
x = x - 1		' move the point for the demo
If xdir = 0 Then	' the moving point controlls
x = x + 2		' most of the demo parts
EndIf
y = y - 1
If ydir = 0 Then
y = y + 2
EndIf
'
If ftick < 4 & ftick != 1 Then ' draw the moving point
px = x+0 : py = y+0 ' draw point
GoSub setpixel
EndIf
'
If ftick = 0 Then 	' draw rest of the ball around moving point
px = x+1 : py = y+0	' this is the first demo part
GoSub setpixel
px = x-1 : py = y+0
GoSub setpixel
px = x+0 : py = y+1
GoSub setpixel
px = x+0 : py = y-1
GoSub setpixel
EndIf
'
If x > 21 And xdir = 0 Then ' check the screen bounds
xdir = 1		     ' for the point we are moving around
EndIf   
If x < 1 And xdir = 1 Then
xdir = 0
EndIf
If y > 15 And ydir = 0 Then
ydir = 1
EndIf
If y < 1 And ydir = 1 Then
ydir = 0
EndIf
'
If ftick = 1 Then 	' draw dynamic circles
cx = x : cy  = y	' this is the second demo part
radius = (y/2) + 2
GoSub  drawcircle
EndIf
'
If ftick = 2 Then 	' draw dynamic lines
x0 = 0 : y0 = 0		' which is an example of diagonal lines
x1 = x : y1 = y
GoSub drawline
x0 = x : y0 = y
x1 = 22 : y1 = 0
GoSub drawline
x0 = x : y0 = y
x1 = 22 : y1 = 16
GoSub drawline
x0 = 0 : y0 = 16
x1 = x : y1 = y
GoSub drawline
EndIf
'
If ftick = 3 Then	' draw the crosshair effect
x0 = x : y0 = 0		' which is an example of straight lines
x1 = x : y1 = 16
GoSub drawline
x0 = 0 : y0 = y
x1 = 22 : y1 = y
GoSub drawline
EndIf
'
If ftick = 4 Then 	' draw digits
dval = demd /10		' which is an example of drawing sprites
demdl = demd		' where the data was stored horizontal
demdl = demdl - (dval * 10)
dgx = x-6 : dgy = y-4
GoSub printdigit
dval = demdl
dgx = x+1 : dgy = y-4
GoSub printdigit
EndIf
'
If ftick = 5 Then	' squares
x0 = 11 : y0 = 8
radius = dfc
GoSub drawsquare
EndIf
'
If ftick = 6 Then	' squares with strobe
radius = dfc		' coords were set in previous section
GoSub drawsquare
EndIf
'
If ftick = 7 Then	' more squares
x0 = x : y0 = y
radius = 5
GoSub drawsquare
EndIf
'
If ftick = 8 Then	' dynamic squares
x0 = x : y0 = y
radius = y/2
GoSub drawsquare
EndIf
'
If ftick = 9 Then	' draw invader sprite
dgx = x-5 : dgy = y-4	' which is an example of animated sprite
GoSub printsprite	' where the data was stored vertically
EndIf
'
If ftick = 10 Then	' circles trick
cx = cdx : cy  = 8	' a trick to look like the entire LCD is used
radius = 7
GoSub  drawcircle
cx = cdx + 24
GoSub  drawcircle
cdx = cdx - 1
EndIf
'
If ftick == 11 Or ftick == 12 Then	' dynamic circles trick with strobe
cx = cdx : cy  = 8		' a trick to look like the entire LCD is used
radius = (y/2) + 2		'
If ftick = 12 Then
cy = 15 - y
EndIf
GoSub  drawcircle
cx = cdx + 24
GoSub  drawcircle
cdx = cdx - 1
EndIf
'
If ftick = 13 Then	' rolling odometer effect display
dval = demd /10		' the odometer display also moves
demdl = demd		' around the display
demdl = demdl - (dval * 10)
If dval != dcompm Then
'ddirm = 0		' determine digit count direction
'IF dval < dcompm THEN	' odometer only works on a variable
'ddirm = 1		' that is being incremented by one
'ENDIF			' not enough memory to reverse
dcompm = dval
doffm = 8
EndIf
doff = doffm
If doffm > 0 Then
doffm = doffm - 1
EndIf
dgx = x-6 : dgy = y-4
GoSub printdigit
If demdl != dcompl Then
'ddirl = 0		' determine digit count direction
'IF demdl < dcompl THEN	' oops, ran out of memory to reverse
'ddirl = 1		' the roll direction of movement
'ENDIF			' so this is incomplete
dcompl = demdl
doffl = 8
EndIf
doff = doffl
If doffl > 0 Then
doffl = doffl - 1
EndIf
dval = demdl
dgx = x+1 : dgy = y-4
GoSub printdigit
EndIf
'
If ftick == 14 Then ' dynamic squares trick
x0 = cdx : y0  = 8  ' a trick to look like the entire LCD is used
radius = (y/2) + 2  '
GoSub  drawsquare
x0 = cdx + 24
GoSub  drawsquare
cdx = cdx - 1
EndIf
'
If cdx = 242 Then	' check bounds for moving circle demos
cdx = 10		'
EndIf			'
'
If ftick = 15 Then	' reset demo section counter
ftick = 0		' there are currently fifteen demo parts
doff = 0
EndIf	
'
'
GoSub writecg		' write the frame buffer to LCD
'
'
frame = frame + 1	' count actual frames
If frame = 150 Then	'
frame = 0		'
ftick = ftick + 1	' frame counter increments demo counter
invert = $00		' revert to normal after first section
EndIf
'
dfc = dfc + 1		' increment the dynamic squares width
If dfc > 8 Then		'
dfc = 0			'
demd = demd + 1		' increment counter for display variable
EndIf			'
If demd > 99 Then	' keep display variable in two digit range
demd = 0		'
EndIf			'
'
If ftick = 4 Or ftick = 9 Or ftick = 13 Then	' variable sprite delay
DelayMS ftick*20					' for all digit and invader sprites
EndIf						' otherwise lcd lag messes up the display
'
PORTB.6 = 1					' strobe the LED backlight
If ftick = 6 Or ftick = 11 Then			' for these demo sections only
backled = backled + 1				' alternate backlight status
PORTB.6 = backled				' set led backlight to current status
EndIf						'
'
GoTo cycle					' end main routine - do the next frame
'
'
'
'
setpixel:	  ' size and performance win for V2
lind = py * 3 ' byte index for line
pind = 0
slug = px
If px > 7 Then
pind = 1
slug = px - 8
EndIf
If px > 15 Then
pind = pind + 1
slug = px - 16
EndIf
If lind+pind < 51 Then ' range check
temp = dis[lind+pind]
For CW = 0 To 7
If slug = CW Then
temp.7 = 1
EndIf
wtemp = wtemp << 1
Next CW
dis[lind+pind] = tempb
EndIf
Return
'
writecg:	' size, ram and performance win for V2
L0 = $40	' reset lines
For CL = 0 To 7 ' write first half of display
For CW = 0 To 3
rolls[CW] = (dis[0] ^ invert) >> 3
GoSub Rotate
Next CW
Print $FE,L0+$00,rolls[0]
Print $FE,L0+$08,rolls[1]
Print $FE,L0+$10,rolls[2]
Print $FE,L0+$18,rolls[3]
L0 = L0 + 1'
Next CL
For CW = 0 To 23 ' skip invisible line
GoSub RotateDisplay
Next CW
L0 = $60	' reset lines
For CL = 0 To 7 ' write second half of display
For CW = 0 To 3
rolls[CW] = (dis[0] ^ invert) >> 3
GoSub Rotate
Next CW
Print $FE,L0+$00,rolls[0]
Print $FE,L0+$08,rolls[1]
Print $FE,L0+$10,rolls[2]
Print $FE,L0+$18,rolls[3]
L0 = L0 + 1'
Next CL
' draw to LCD
Print $FE,$80	'draw first line of display
For CL = 0 To 3
Print 0,1,2,3	'
Next CL
Print $FE,$C0	'draw second line of display
For CL = 0 To 3
Print 4,5,6,7					'
Next CL
Return
'
printdigit:	' print a single digit to screen
index = dval * 8' set index position for digit
For L0 = 0 To 7
GoSub readeep
For CL = 0 To 4
If digit.4 = 1 Then
px = dgx+CL : py = dgy+L0
GoSub setpixel
EndIf
digit = digit << 1
Next CL
index = index + 1
Next L0
Return
'
printsprite:	' print a monochrome graphic sprite to screen
index = 88	' set index position for sprite
If frame.3 = 1 Then ' select frame
index = index + 11
EndIf
For L0 = 0 To 10
GoSub readeep
For CL = 0 To 7
If digit.0 = 1 Then
py = dgx+CL : px = dgy+L0
GoSub setpixel
EndIf
digit = digit >> 1
Next CL
index = index + 1
Next L0
Return
'
readeep:
'READ index+8,digit		' not ever using the rolling odometer effect
digit = ERead (index-doff)+8' are using rolling odometer effect sometimes
Return				' slight performance penalty if you are
'
drawsquare:		' draw square to screen
  cx = radius : cy = 0
  While cx >= cy
	px = cx + x0 : py = cy + y0
	GoSub setpixel
	px = cy + x0 : py = cx + y0
	GoSub setpixel
	px = -cx + x0 : py = cy + y0
	GoSub setpixel
    px = -cy + x0 : py = cx + y0
	GoSub setpixel
    px = -cx + x0 : py = -cy + y0
	GoSub setpixel
    px = -cy + x0 : py = -cx + y0
	GoSub setpixel
    px = cx + x0 : py = -cy + y0
	GoSub setpixel
    px = cy + x0 : py = -cx + y0
	GoSub setpixel
    cy = cy + 1
  Wend
Return
'
drawcircle:		' draw circle to screen
  	glc_x = 0
  	glc_y = radius
  	glc_s = 2-2*radius
  	While glc_x <= glc_y
	px = glc_x+cx : py=glc_y+cy
	GoSub setpixel
	px = cx-glc_x : py=glc_y+cy
	GoSub setpixel
	px = cx+glc_x : py=cy-glc_y
	GoSub setpixel
	px = cx-glc_x : py=cy-glc_y
	GoSub setpixel
	px = glc_y+cx : py=glc_x+cy
	GoSub setpixel			
	px = cx-glc_y : py=cy+glc_x
	GoSub setpixel
	px = cx+glc_y : py=cy-glc_x
	GoSub setpixel
	px = cx-glc_y : py=cy-glc_x
	GoSub setpixel
	If glc_s.15 =1 Then
    glc_s = glc_s + (4*glc_x + 6)
    Else
    glc_s = glc_s + (4*(glc_x-glc_y) + 10)
    glc_y = glc_y - 1
	EndIf
	glc_x = glc_x + 1
  	Wend
Return
'
drawline:	' draw any line to screen including diagonals
	stepx = 0
	stepy = 0
	frac = 0
	'line from start point x0,y0 to destination point x1,y1.
	dy = y1 - y0
	dx = x1 - x0
	If dy > 128 Then
    dy = 0 - dy
    stepy = stepy - 1
    Else
    stepy = 1
    EndIf
	If dx > 128 Then
    dx = 0 - dx
    stepx = stepx - 1
    Else
    stepx = 1
    EndIf
	dy = dy << 1
	dx = dx << 1
    'draw pixel
	px = x0 : py = y0
	GoSub setpixel
	If dx > dy Or dx > 128 Then
    frac = dy - (dx >> 1)
    While x0 != x1
    If frac < 128 Then
	y0 = y0 + stepy
 	frac = frac - dx
	EndIf
    x0 = x0 + stepx
    frac = frac + dy
    'draw pixel
	px = x0 : py = y0
	GoSub setpixel
    Wend
	Else
    frac = dx - (dy >> 1)
    While y0 != y1
    If frac < 128  Then 
	x0 = x0 + stepx
	frac = frac - dy
	EndIf
    y0 = y0 + stepy
    frac = frac + dx
    'draw pixel
	px = x0 : py = y0
	GoSub setpixel
    Wend
	EndIf
Return
'
Rotate:									' the only assembler routine
GoSub rota								' needed for speed
rota:									' by neglecting to carry the
GoSub RotateDisplay						' status bit, it also clears
GoSub RotateDisplay						' the buffer for the next frame
RotateDisplay:							' bitwise rotate array right


   @ Rlf        dis + 50       ,F				; ditching the first bit
   @ Rlf        dis+49		,F				;
   @ Rlf        dis+48		,F				;
   @ Rlf        dis+47		,F				;
   @ Rlf        dis+46		,F				;
   @ Rlf        dis+45		,F				;
   @ Rlf        dis+44		,F				;
   @ Rlf        dis+43		,F				;
   @ Rlf		 dis+42		,F				;
   @ Rlf		 dis+41		,F				;
   @ Rlf		 dis+40		,F				;
   @ Rlf		 dis+39		,F				;
   @ Rlf		 dis+38		,F				;
   @ Rlf		 dis+37		,F				;
   @ Rlf		 dis+36		,F				;
   @ Rlf		 dis+35		,F				;
   @ Rlf		 dis+34		,F				;
   @ Rlf		 dis+33		,F				;
   @ Rlf		 dis+32		,F				;
   @ Rlf		 dis+31		,F				;
   @ Rlf		 dis+30		,F				;
   @ Rlf		 dis+29		,F				;
   @ Rlf		 dis+28		,F				;
   @ Rlf		 dis+27		,F				;
   @ Rlf		 dis+26		,F				;
   @ Rlf		 dis+25		,F				;
   @ Rlf		 dis+24		,F				;
   @ Rlf		 dis+23		,F				;
   @ Rlf		 dis+22		,F				;
   @ Rlf		 dis+21		,F				;
   @ Rlf		 dis+20		,F				;
   @ Rlf		 dis+19		,F				;
   @ Rlf		 dis+18		,F				;
   @ Rlf		 dis+17		,F				;
   @ Rlf		 dis+16		,F				;
   @ Rlf		 dis+15		,F				;
   @ Rlf		 dis+14		,F				;
   @ Rlf		 dis+13		,F				;
   @ Rlf		 dis+12		,F				;
   @ Rlf		 dis+11		,F				;
   @ Rlf		 dis+10		,F				;
   @ Rlf		 dis+9		,F				;
   @ Rlf		 dis+8		,F				;
   @ Rlf		 dis+7		,F				;
   @ Rlf		 dis+6		,F				;
   @ Rlf		 dis+5		,F				;
   @ Rlf		 dis+4		,F				;
   @ Rlf		 dis+3		,F				;
   @ Rlf		 dis+2		,F				;
   @ Rlf		 dis+1		,F				;
   @ Rlf		 dis+0		,F				;
   @ Bcf		 dis+50		,0				;clear MSB
Return
```


Aqui el video simulando en Proteus 









En Proteus se selecciona - > resistencia tipo digital para este caso


----------



## kowart (Ene 11, 2016)

Aqui les dejo el código


```
Device 16F877A
Xtal 8

DelayMS 1000

'justificacion,voltaje de referencia etc.
ADCON0 = %10000001  '-page 127 DATASHEET del 16f877a (configuracion de A.0) 
ADCON1 = 14 ' -page 128 Datasheet del 16f877a (configuracion de A.0) set the ADC all digital except for AN 0
'http://melabs.com/support/887migration.htm
'Salidas y entradas
TRISA = %000001 'Salidas-->PORTA.0 = Entrada
TRISB = %00000000 'Salidas
TRISC = %00000000 'Salidas

'Declaraciones del ADC
Declare Adin_Res 8   '10
Declare Adin_Tad FRC
Declare Adin_Stime 100

Declare Hserial_Baud = 9600
Declare Hserial_RCSTA = %10010000
Declare Hserial_TXSTA = %00100000
Declare Hserial_Clear = On


Dim dato As Byte'Word


inicio:
dato = ADIn 0
HSerOut [#dato,13]


If dato>30 Then     '1
PORTB.0 = 1  
Else
PORTB.0 = 0
EndIf 


If dato>42 Then      '2
PORTB.1 = 1  
Else
PORTB.1 = 0
EndIf 


If dato>54 Then      '3
PORTB.2 = 1  
Else
PORTB.2 = 0
EndIf 


If dato>66 Then      '4
PORTB.3 = 1  
Else
PORTB.3 = 0
EndIf 


If dato>78 Then     '5
PORTB.4 = 1  
Else
PORTB.4 = 0
EndIf 


If dato>90 Then      '6
PORTB.5 = 1  
Else
PORTB.5 = 0
EndIf 


If dato>102 Then      '7
PORTB.6 = 1  
Else
PORTB.6 = 0
EndIf 


If dato>114 Then      '8
PORTB.7 = 1  
Else
PORTB.7 = 0
EndIf 


If dato>126 Then      '9
PORTC.0 = 1  
Else
PORTC.0 = 0
EndIf 


If dato>138 Then      '10
PORTC.1 = 1  
Else
PORTC.1= 0
EndIf 


If dato>150 Then      '11
PORTC.2 = 1  
Else
PORTC.2 = 0
EndIf 

If dato>162 Then      '12
PORTC.3 = 1  
Else
PORTC.3 = 0
EndIf 


If dato>174 Then      '13
PORTC.4 = 1  
Else
PORTC.4 = 0
EndIf 

If dato>186 Then      '14
PORTC.5 = 1  
Else
PORTC.5 = 0
EndIf 

GoTo inicio
```


video


----------



## javichorefue (Feb 20, 2016)

Hola una consulta compilo con el proton y me arroja tres archivos pero ninguno con extensión hex;ayuda por favor


----------



## ricbevi (Feb 21, 2016)

javichorefue dijo:


> Hola una consulta compilo con el proton y me arroja tres archivos pero ninguno con extensión hex;ayuda por favor



Hola...Sera por que tiene errores el archivo que compilas por lo que no lo puede hacer y estos te los marca en un archivo con extensión ".err" ...¿que extensión tienen los archivos que genera la salida?
Saludos.

Ric.


----------



## COSMICO (Feb 21, 2016)

Lo más seguro es lo que dice el amigo.
Si hay un error en el código, no se genera el .ex, y si un err.


----------



## blackpic (Feb 21, 2016)

Saludos.
Estoy tratando de hacer andar un dimmer con un PIC12F683 pero éste no me funciona como corresponde y quisiera que me orienten en lo que estoy haciendo mal.

El código es el siguiente:

```
OSCCON=%01100000                        '4MHZ
ANSEL = %00110001
CMCON0 = 7
TRISIO = %11111101
GPIO  = %00000000
WPU = 0'%00110000
ADCON0=%10000000 ;CANAL0,A/D-ON
        

Declare ADIN_RES 10
Declare ADIN_TAD FRC
Declare ADIN_STIME 50
On_Hardware_Interrupt  GoTo FLASH'ON_INTERRUPT FLASH

GIE = 0
INTF = 0   ' Limpia el flag de Int. del GP2 
T0IF = 0 ' Limpia el flag de Int. del TMR0
T0CS = 0 ' Define al TMR0 se utiliza como timer
PSA = 0 ' Asigna el pre-escalador al TMR0
PS2 = 0 ' Asigna al pre-escalador 256
PS1 = 0 
PS0 = 0 
TMR0 = 207 ' Carga inicialmente al registro TMR0
PEIE = 1 ' Habilita las int. de periféricos
T0IE = 0 ' Habilita la interrupción por TMR0
INTE = 1  ' Habilita la interrupción por GP2
GIE = 1 ' Habilita interrupciones globales

Conteo = 0 ' Limpia la variable Conteo
Conteo_T0 = 0 ' Limpia la variable Conteo_T0

Loop: 
valor = (ADIn 0) /4
 GoTo Loop
 End

Disable ' 

FLASH:   
If INTF = 1 Then
Conteo_T0=0
T0IE = 0
Conteo = Conteo + 1 'incrementa conteo
T0IE = 1
INTF = 0 
EndIf

If T0IF = 1 Then
Conteo_T0 = Conteo_T0 + 1 ' Incrementa Conteo_T0
T0IE = 0 ' Deshabilita la interrupción por TMR0
TMR0 = 207 ' Carga inicialmente al registro TMR0
T0IF = 0 ' Limpia el flag de int. del TMR0
T0IE = 1 ' Habilita la interrupción por TMR0

If   Conteo_T0<valor Then
ZVS =1
Else
ZVS =0
EndIf 

EndIf
Context Restore
Resume
```

Gracias de ante mano.


----------



## blackpic (Feb 22, 2016)

Hi aun mi cabeza me da vuelta con el dimmer tengo el inconveniente de un palpadeo pero no logro ver donde esta el problema.

veo que el pulso de salida no es estable, me varia el ancho de este agradeceria un comentario.


----------



## callecuatro1976 (Abr 23, 2016)

Hola. Les consulto.
Estoy haciendo este programa con Proton IDE y funciona bien en el proteus, pero con una advertencia: (logic contention(s) detected on net)
Y cuando lo hago en el protoboard, me junta la imagen con la medición del voltímetro y no entiendo por qué.
*


		PHP:
	

Device = 18F4550
 
 XTAL = 4
 TRISA = %11111111 
 ADCON0 = %10000000 
 ADCON1 = %00001010 
 
 ' Resultado con justificación a la derecha
 ADIN_RES 8 
 ADIN_TAD FRC
 ADIN_STIME 50 
 
 
 Dim lectura As Word
 Dim lectura1 As Word
 Dim amper As Float
 Dim VOLT As Float 
 
 Declare LCD_DTPORT PORTD 
 Declare LCD_RSPIN PORTB.2 
 Declare LCD_ENPIN PORTB.5 
 Declare LCD_RWPIN PORTB.4 
 Declare LCD_CS1PIN PORTB.1 
 Declare LCD_CS2PIN PORTB.0 
 LCD_TYPE = GRAPHIC 
 INTERNAL_FONT = On 
 FONT_ADDR = 0
 GLCD_EXTERNAL_PRINT = PPRINT
 Cls
 DelayMS 100
 
 Dim Xpos As Byte
 Dim Ypos As Byte
 Dim Addr As Word
 Dim char As Byte 
 
 DelayMS 100 
 For Ypos = 0 To 7
 For Xpos = 0 To 127
 
 Addr = (Ypos*128)+Xpos
 char = CRead imagen+Addr
 LCDWrite Ypos,Xpos,[char]
 Next 
 Next 
 
 DelayMS 500
 
 Cls
 
 bucle: 
 lectura= ADIn 0
 VOLT= (lectura * 50) /1023 
 Print Font Arial____8
 Print At 0,10,"Volt "
 Print Font ArialK____12
 Print At 15,10, DEC1 VOLT
 
 
 lectura1= ADIn 1
 amper= (lectura1 *50) / 1023
 Print Font Arial____8
 Print At 0,65,"Amper"
 Print Font ArialK____12
 Print At 15, 60,DEC1 amper 
 DelayMS 100 
 
 GoTo bucle
 
 End 
 Include "imagen.inc"
 Include "ARIALk12.TXT"
 Include "arial8.txt"

*


----------



## callecuatro1976 (Abr 25, 2016)

Subo esquema que me olvide, probé varias imágenes pero no me funciona gracias a todos por la ayuda.


----------



## roberttorres (Abr 25, 2016)

callecuatro1976 dijo:


> Subo esquema que me olvide, probé varias imágenes pero no me funciona gracias a todos por la ayuda.


Buenas callecuatro1976
Probaste poner el pin RW a GND??


----------



## callecuatro1976 (Abr 26, 2016)

NO eso no probé , lo que hace es mostrar la imagen,  no limpia la pantalla y muestra los datos del voltímetro y amperímetro , si sacas la imagen muestra los datos del voltímetro y amperímetro pero se pixela un poco en las muestras,  como varias  en los refrescos de pantalla? gracias por responder


----------



## callecuatro1976 (Abr 27, 2016)

No funciona probé 3 pic diferentes el pic 16f887 ni siquiera muestra algo , el pic 18f4550 muestra la imagen y arriba de la imagen muestra los datos del voltímetro, y con el 16f877a hace lo mismo que con el 18f4550 y no se porque no limpia la pantalla , me dan una mano con el código , gracias


----------



## roberttorres (Abr 28, 2016)

Buenas callecuatro1976
lastimosamente no manejo muy bien el proton ide pero te adjunto unos archivos, en proteus funciona, pero no lo probé físicamente.


----------



## callecuatro1976 (May 6, 2016)

* Declare GLCD_EXTERNAL_PRINT [/SIZE]*[/SIZE]= PPRINT
* Cls
 DelayMS *100

* Dim *Xpos *As Byte
 Dim *Ypos *As Byte
 Dim *Addr *As Word
 Dim *char *As Byte 

 For *Ypos = 0 *To *7
*For *Xpos = 0 *To *127
 Addr = (Ypos*128)+Xpos
 char = *CRead *imagen+Addr
*LCDWrite *Ypos,Xpos,[char]
*Next 
 Next 
 DelayMS *1000 
* Cls

* bucle: 
 lectura= *ADIn *0
 VOLT = (lectura* 50)/1023
* Print Font *Arial____8
* Print At *0,10,"Volt "
[/SIZE]* Print Font *ArialK____12
* Print At *15,10, *DEC1 *VOLT," "[/SIZE]


solucionado agregue la línea 
 DeclareGLCD_EXTERNAL_PRINT [/size]= PPRINT
 y para refrescar la pantalla se coloca comillas 
 Print At 15,10, *DEC1 *VOLT," " 
 lo subo por si le sirve a alguien , saludos


----------



## Gerson strauss (Jun 15, 2016)

Hola, estoy haciendo un programa y quiero liberar el puerto b6 y b7 utilizando el oscilador interno, en el PIC 16F88. Configure todo y el programa funciona, pero tiene un defecto ... que los tiempos (delays) se alteran.

Si hago un tiempo de 1seg se convierte como en 300 ms, todo lo demas funciona muy bien. Dejo el encabezado del programa, por si alguien me puede ayudar. Muchas gracias.


```
Device 16F88
Config INTRC_IO,PWRTE_ON,WDT_OFF,BODEN_OFF,CP_OFF,LVP_OFF 

OSCCON = %01110100 '8mhz
OSCTUNE = %00011111 'f maxima
CMCON = 7
ALL_DIGITAL = TRUE
PORTB_PULLUPS = off
TRISA = %00011111
TRISB = %00000000
'DEFINO COMUNICACION CON PANTALLA LCD

LCD_DTPIN = PORTB.4 'Configuracion del LCD
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.3
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
'*****************************************
'DEFINO EL BUS 12C

Declare SDA_PIN = PORTB.0
Declare SCL_PIN = PORTB.1
Declare SLOW_BUS On
```


----------



## D@rkbytes (Jun 15, 2016)

La palabra de configuración en el PIC16F88 es diferente a otros PIC16.
Aparte de configurar el registro OSCCON, también debes definir la frecuencia de operación. Con Xtal = XXMHz

Prueba de ésta forma:

```
Device  16F88
Reminders = Off
Config1 INTRC_IO,CCP1_RB3,WRT_PROTECT_OFF,LVP_OFF,PWRTE_ON,WDT_OFF
Config2 IESO_OFF,FCMEN_OFF
Reminders = On

Xtal = 8MHz


Inicio:
    OSCCON = %01110010
```
Si necesitas que los pines con ADC sean digitales, únicamente usa; All_Digital = *On
*Esto configura todo el registro ANSEL en 0.
Y el registro CMCON es para la configuración de los comparadores análogos.


----------



## Gerson strauss (Jun 15, 2016)

D@rkbytes dijo:


> La palabra de configuración en el PIC16F88 es diferente a otros PIC16.
> Aparte de configurar el registro OSCCON, también debes definir la frecuencia de operación. Con Xtal = XXMHz
> 
> Prueba de ésta forma:
> ...



Gracias, probare a ver que pasa. 



Fue exactamente como lo indicaste; ya funciona perfectamente. Eres un experto Darkbytes, muchas gracias.


----------



## COSMICO (Jun 30, 2016)

Buenas amigos.
aquí con una pregunta, que me salio de un dilema. aunque no soy experto en proton, se que ustedes lo pueden ser.
Tengo estas dos tablas. que están en lenguaje Basic para picaxe.

symbol VoltsTbl = 0
     eeprom 0,(255,246,237,229,221,214,207,201)
     eeprom 8,(195,190,184,179,175,170,166,162)
     eeprom 16,(158,154,151,147,144,141,138,135)
     eeprom 24,(133,130,128,125,123,121,118,116)
     eeprom 32,(114,112,111,109,107,105,104,102)
     eeprom 40,(101,99,98,96,95,93,92,91)
     eeprom 48,(90,88,87,86,85,84,83,82)
     eeprom 56,(81,80,79,78,77,76,75,74)

     symbol SineTbl = 64
     eeprom 64,(0,25,50,74,98,120,142,162)
     eeprom 72,(180,197,212,225,236,244,250,254)
     eeprom 80,(255,254,250,244,236,225,212,197)
     eeprom 88,(180,162,142,120,98,74,50,25)

Si las meto tal cual a proton, da error. 
Si las meto en un (LookUpL VoltsTbl), me dice que es muy grande..
Como las acomodo a proton basic... Mientras ustedes me responden amablemente, yo sigo intentando..


----------



## D@rkbytes (Jun 30, 2016)

Como Proton difiere en algunas instrucciones a PBP, debes usar la instrucción "Edata"
Con esa instrucción debes escribir todos tus datos dentro de la misma.

Así por ejemplo:

```
Write_Data:
    EData   255,246,237,229,221,214,207,201,195,190,184,179,175,_
            170,166,162,158,154,151,147,144,141,138,135,133,130,_
            128,125,123,121,118,116,114,112,111,109,107,105,104,_
            102,101,99,98,96,95,93,92,91,90,88,87,86,85,84,83,82,_
            81,80,79,78,77,76,75,74,0,25,50,74,98,120,142,162,180,_
            197,212,225,236,244,250,254,255,254,250,244,236,225,_
            212,197,180,162,142,120,98,74,50,25
    Return
```


----------



## COSMICO (Jul 1, 2016)

Hola Amigo D@rkbytes.

Ya había contemplado esto, pero hay una duda.
Como esto lo hace la EEprom desde su dirección cero, acortando tu ejemplo

Write_Data:
    EData   255,246,237,229,221,214,207,201,195,190,184,179,175..Ocuparía desde 0 a la 12 posición

Write_Data2:
         EData
         212,197,180,162,142,120,98,74,50,25, Esta , ocuparía desde la 13 a la 22 posición.

En mi ejemplo son dos tablas con nombre diferente, pero guardadas en memoria EEprom, y siguen este método de almacenamiento.. Estaría correcto, la verdad he estado revisando el manual de proton, pero no hay ejemplo parecido, de tabla partida como esta y almacenada en EEprom.


----------



## D@rkbytes (Jul 1, 2016)

La instrucción "EData" escribe siempre desde la dirección 0

Sintaxis:
EData Constant1 { ,...ConstantN, etc. }

Así que una instrucción EData posterior, sobreescribirá los datos de la anterior desde la dirección 0.

Como tus datos llevan un almacenamiento en orden consecutivo, no tendrás problema mientras sepas desde donde buscar los datos.

Si lo quieres hacer por orden de dirección, puedes usar la instrucción; "EWrite"

Sintaxis:
  Ewrite Address, [ Variable {, Variable…etc } ]

Esta instrucción es la equivalente a "EEPROM" de PBP.
Para leer, se usa; "ERead"

Sintaxis:
Variable = Eread Address


----------



## COSMICO (Jul 1, 2016)

Ok, amigo.
Aunque es codigo en ediitor de programa para picaxe, que esta escrito el código.
Asi...Read b0, valsine, donde b0, hace alusión a la primera posicion de memoria "0" de la EEprom, y deja el dato almacenado en valsine segun he podido entender en el manual Picaxe.


----------



## Csarst (Jul 25, 2016)

Que tal con todos, me podrían por favor aclarar lo siguiente?...estoy usando un pic 16F870 para medir voltaje por el A.0 y temperatura por A.1,...mediante los 2 ejemplos que estaban publicados en página 20, entiendo que con el registro ADCON1 se configuran que entradas del puerto "A" serán Analógicas  y cuales Digitales, entonces quedaria como ADCON1=%10000000 (se activan todos los adc)...pero mi duda radica  que cuando uso una resolución de 10 bits( Declare ADIN_RES = 10) se usan este otro de comando: ADCON2.7 = 1  y cuando uso una resolución de 8 bits, ya no aparece ADCON2.7 = 1...por que es necesario ese comando en la resolución de 10 bits?...de antemano gracias por contestar mi duda...


----------



## D@rkbytes (Jul 25, 2016)

¿Ya leíste la sección "ANALOG-TO-DIGITAL CONVERTER (A/D) MODULE", en la hoja de datos?


----------



## Csarst (Jul 25, 2016)

Si estoy en esa parte del Datasheet del 16F870....pero a diferencia del 18F4550, el pic con el que estoy trabajando tiene solo regsitros ADCON0 y ADCON1...supongo


----------



## D@rkbytes (Jul 25, 2016)

Supones bien, mientras en la hoja de datos no aparezca otro registro ADCONX


----------



## Csarst (Jul 25, 2016)

Entonces, con el regristro ADCON0 puedo controlar la operación de control A/D ,...es decir controlar la frecuencia de reloj, el bit 2 me dice si empiezo la conversión (ADCON0.2=1) y lo que me interesa a mi...elegir el canal de entrada al conversor. Mientras que el registro ADCON1 sirve para configurar los terminales del puerto A, cuales seran analógicas y cuades E/S digitales:
El registro ADCON0 tiene 8 bits y cada grupo controla una función del ADC, estoy poniendo ADCON0=%01000001:

01: Voy usar una frecuencia de Fosc/8
000: Voy usar el puerto A.0 como entrada para el conversor
0: Aún no inicia la conversión
0: lee como cero, no se puede cambiar este bit
1: El conversor A/D está operativo 

Modifique la programación de esta manera; talvez es correcta?


```
Device = 16F870
XTAL = 20
LCD_TYPE = 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
LCD_LINES = 2

Declare ADIN_RES = 10  ;resolución de 10 bits     
Declare ADIN_TAD = FRC      
Declare ADIN_STIME = 50 
ADCON1=%10000000   ;se activan todos los adc
TRISA=%11111111    ;todo el puerto A como entrada 
TRISC=0            ;salidas al relé del ventilador
TRISB=0            ;salidas al LCD 16x2
Dim A As Word 
Dim B As Word
Dim C As Float 
Dim D As Float 
Cls
Print At 2,1,"Fuente 0V a 25V"
DelayMS 1000
Cls

inicio:
ADCON0=%01000001 ;selecciono el canal A.0 con Fosc/8, no inicio la conversión pero el conversor esta activo
DelayMS 50
ADCON0.2=1  ;inicia la conversión
DelayMS 50
A=ADRESH

ADCON0=%01001001;selecciono el canal A.1 con Fosc/8, no inicio la conversión pero el conversor esta activo
DelayMS 50
ADCON0.2=1  ;inicia la conversión
DelayMS 50
B=ADRESH

Print At 1,1,"Temp.(",223,"C):"
Print At 2,1,"Voltaje(V):"
C=(A*25)/1023   ;conversión para 25v en el LCD
D=(B*150)/307   ;Conversión de temperatura con referencia de 5voltios
Print At 1,11,DEC1 D
Print At 2,12,"-",DEC1 C
DelayMS 170
GoTo inicio
 

End
```


----------



## D@rkbytes (Jul 25, 2016)

Registro ADCON0
Bits <7:6> (ADCS1:ADCS0) = Selección del reloj para el conversor.
Bits <5:3> (CHS2:CHS0) = Selección del canal. <AN7:AN0>
Bit 2 (GO/DONE) = Bit de estado de la conversión. (Flag)
Bit 1 = No implementado, será leído como 0
Bit 0 = (ADON) Si está en 1 se inicia la conversión.

Registro ADCON1
Bit 7 = (ADFM) Formato de la conversión.
1 = Justificación a la derecha. Los 6 bits más significativos de ADDRESH serán leídos como 0.
0 = Justificación a la izquierda. Los 6 bits menos significativos de ADDRESL serán leídos como 0.
Bit 6 (ADCS2) Registro espejo de ADCON0 <ADCS1:ADCS0>)
Bits <5:4> = No implementados, serán leídos como 0.
Bits <3:0> = Selección del modo de operación de los conversores AD. y su vRef.
En éstos últimos bits se selecciona que pines serán análogos y cuales digitales. (Conforme a la tabla de <PCFG3CFG0>)

De esa forma está mal ese programa.
En Proton puedes únicamente configurar el registro ADCON1 y lo demás lo haces con las instrucciones nativas.
Así, por ejemplo:

```
Device = 16F870
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, WRT_OFF
XTAL = 20

Declare LCD_TYPE = 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES = 2

Declare Create_Coff = On

Declare ADIN_RES    = 10
Declare ADIN_TAD    = FRC      
Declare ADIN_STIME  = 50 

Inicio:
    Dim Valor_ADC   As  Word
    Dim Voltaje     As Float
    Dim Temperatura As Float
    
    ADCON1 = %10000000  ; Justificación a la derecha.
    
Programa:
    Valor_ADC = ADIn 0
    
    Voltaje = ((Valor_ADC * 5) / 1024)
    
    If PORTB.3 = 1 Then
        Temperatura = (Voltaje * 100)
    Else
        Temperatura = ((Valor_ADC *150) / 308)
    End If
    
    Print At 1,1,Dec2 Voltaje, " V"
    Print At 2,1,Dec2 Temperatura," ",0xDF,"C"
    DelayMS 500
    
    GoTo Programa
    
    End
```
PD:
Si quieres realizar el programa utilizando únicamente los registros, obviamente también se puede.


----------



## Csarst (Jul 26, 2016)

Me salieron unas dudas en el ejemplo que me estas describiendo, realizas las 2 lecturas ADC solo por el puerto A.0???  y porque  utilizas el PORTB.3 si ya esta siendo usado como Enable de la LCD??


----------



## D@rkbytes (Jul 26, 2016)

Es una sola lectura con tres tipos de conversión y por un solo canal. (RA0/AN0)
Lo del pin RB3 fue un error al escribir el programa, tuvo que ser PORTC.3

Saludos.


----------



## Csarst (Jul 26, 2016)

Listopp...ya le entiendo lo que estas haciendo, pero lo que quiero hacer es tener mediciones de 2 magnitudes diferentes por 2 canales diferentes, es decir: Voltaje por el RA0 y Temperatura(usando el LM35) por el RA3....esto lo puedo lograr mediante el comando ADin ?


```
Device = 16F870
XTAL = 20
LCD_TYPE = 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
LCD_LINES = 2

Declare ADIN_RES = 10  ;resolución de 10 bits     
Declare ADIN_TAD = FRC      
Declare ADIN_STIME = 50 
ADCON1=%10000000   ;se activan todos los adc
TRISA=%11111111    ;todo el puerto A como entrada 
TRISC=0            ;salidas al relé del ventilador
TRISB=0            ;salidas al LCD 16x2
Dim A As Word 
Dim B As Word

inicio:
A=ADIn 0    ;lectura A.0
DelayMS 50
B=ADIn 4    ;lectura A.1
DelayMS 50

Print At 1,1,"Temp.(",223,"C):"
Print At 2,1,"Voltaje(V):"

Print At 1,11,DEC2 B
Print At 2,12,DEC2 A
DelayMS 170
GoTo inicio
 

End
```


----------



## D@rkbytes (Jul 26, 2016)

Si se puede, pero por lo que mencionas, tu programa es contradictorio.
Dices querer usar el pin RA3, (RA3 = AN3/VRef+)
Entonces debes usar; ADIn 3, No ADIn 4 que corresponde al pin RA5.

También te faltan las fórmulas de conversión a voltaje y temperatura.
En la forma en que lo estás haciendo, únicamente vas a obtener la lectura de bits del ADC.
Y no olvides agregar la palabra de configuración, o el microcontrolador no funcionará físicamente.
Eso lo puedes hacer al grabar el PIC, pero es mejor que lo hagas dentro del programa.


----------



## akira_ve (Ago 16, 2016)

Amigos, necesito una ayuda.

He escrito un programa desde hace mucho en asm y estoy aprendiendo PIC Basic.
Estoy comenzando con el Proton Basic y conseguí el Mikro Basic. ¿Cuál es mejor?

Otra pregunta. ¿Cómo depuro programas con el Proton Basic?
He visto por allí que se puede hacer que el Proton Basic funcione a través del MPLAB, ¿pero también se puede depurar con el?

Disculpen mi ignorancia y gracias de antemano.


----------



## Jose1306 (Sep 14, 2016)

Buenas, 

Estuve leyendo este tema porque estoy teniendo problemas para leer un POT-LIN de 100K por medio de ADin, nunca utilice esta instrucción. Trataron diferentes problemas con diferentes microcontroladores. 

Capaz que alguien tiene idea de como configurar bien el micro para la lectura del POT en un 18F4550 y no me siga tirando errores. Adjunto mi código y la simulación, tal ves pueden identificar fácilmente el problema.

Saludos.


----------



## D@rkbytes (Sep 14, 2016)

Para lograr que la pantalla funcione en el puerto B usando el canal 12 del mismo puerto, tienes que emplear un switch de control usando los registros .
La configuración de bits en ADCON1 para el canal 12, involucra también a <AN11:AN8>
O sea que mientras se lee el canal 12, los bits 8 al 11 serán análogos, y eso impedirá el funcionamiento de la pantalla.

Te adjunto un ejemplo empleando el control que te menciono.
Como es muy sencillo, también agregué la interrupción del Timer1 para controlar el bit 2 del puerto D.


----------



## Jose1306 (Sep 16, 2016)

Gracias D@rkbytes.

Si quiero que el oscilador interno funcione a 1MHz, se modifica algo mas del código? ademas de la configuración del reloj interno que ente caso esta para 4MHz. 

El código funciona igual pero cambian los tiempos de operación ? Ej: con 4Mhz un tiempo de 500us, tarda menos si esta a 1Mhz.


----------



## D@rkbytes (Sep 16, 2016)

Desafortunadamente, Proton no permite usar una frecuencia de 1 MHz.
Así que el programa se ejecutará a 4 MHz, ya que no permite frecuencias inferiores.


----------



## Jose1306 (Sep 19, 2016)

Ok. Gracias. 

Que sucede si no utilizo el Timer1 ? porque estoy teniendo problema con los otros puertos. Por ejemplo el puerto C 0 y 1 (PortC.0 ; PortC.1) no me fuciona como I/O. 

Puedo cambiarle la configuracion a los otros puertos y utlizarlos como I/O ?


----------



## D@rkbytes (Sep 19, 2016)

Si hablas del ejemplo que subí, no pasa nada, sólo fue un relleno opcional de código.
Todos los pines que puedan ser entradas o salidas, deben funcionar, incluso los dedicados al USB.
Únicamente necesitas establecer una correcta configuración y no debes tener problemas.

Lee la hoja de datos, ahí encontrarás toda la información sobre el funcionamiento y configuración de registros.


----------



## Jose1306 (Sep 19, 2016)

Si me refería al ejemplo que subiste. Estuve leyendo y entendí como que se podía no habilitar las interrupciones si no se configuraban. 

Perfecto D@rkbytes.

Muchas gracias.


----------



## Jose1306 (Nov 2, 2016)

Hola nuevamente. 

Intente leer 2 puertos por medio de la configuracion A/D que me daba la hoja de datos pero me devuelve un error en la simulacion (adjunto una foto con el error), pero me lee perfectamente los valores del canal 12 y el 5. 

Se puede utilizar mas de un canal A/D a la vez ? como se puede configurar eso ?

A que se debe ese error ? 


```
Dim Valor_ADC   As Word
    Dim valor_ADC2  As Word
     
    
    OSCCON = 0b01100000
    
    While OSCCONbits_IOFS = 0       ; Esperar hasta que el oscilador interno sea estable.
        Nop
    Wend
    
    ADCON0 = 0b00110001             ; Canal 12 y ADC = On
    ADCON2 = 0b10000011             ; Resultado de la conversión con justificación a la derecha.
    
    ADCON0 = 0b00010101             ; Canal 5 y ADC = On
    ADCON2 = 0b10000011             ; Resultado de la conversión con justificación a la derecha.
 
    Cls ; Limpia o inicializa la pantalla.

Programa:
    ADCON1 = 0b00000010             ; Activar el conversor para el canal 12
    
    Valor_ADC = ADIn 12           ; Leer el resultado de la conversión.  
    
    While ADCON0bits_GO = 1         ; Esperar a que esté lista la conversión.
        Nop
    Wend      

    ADCON1 = 0x0F                             ; Deshabilitar los conversores AD.
    ADCON1 = 0b00001001             ; Activar el conversor para el canal 12
    
    valor_ADC2 = ADIn 5           ; Leer el resultado de la conversión.  
    
    While ADCON0bits_GO = 1         ; Esperar a que esté lista la conversión.
        Nop
    Wend 
    
     ADCON1 = 0x0F                   ; Deshabilitar los conversores AD.     
    
    Print $Fe,$80, "Valor ADC: ",Dec4 Valor_ADC
    Print $Fe,$C0, "Valor ADC2: ",Dec4 valor_ADC2
    
    DelayMS 50                      ; Éste retardo se puede omitir.
    
    GoTo Programa
```

Gracias !!!!!!


----------



## D@rkbytes (Nov 2, 2016)

Jose1306 dijo:


> Intenté leer 2 puertos por medio de la configuración A/D que me daba la hoja de datos pero me devuelve un error en la simulación,
> (Adjunto una foto con el error) pero me lee perfectamente los valores del canal 12 y el 5.


Las advertencias son porque no estás seleccionando los canales adecuadamente.
Si obtienes lecturas puede ser porque estás usando un simulador.


Jose1306 dijo:


> ¿Se puede utilizar mas de un canal A/D a la vez?


Sí, puedes usar todos los conversores disponibles seleccionando qué canal se usará.


Jose1306 dijo:


> ¿Cómo se puede configurar eso?


Con el registro ADCON0



Jose1306 dijo:


> ¿A que se debe ese error?


No son errores, son advertencias.
Cuando se genera un error el simulador deja de funcionar. 

Así debe ser el programa para usar los canales 5 y 12:

```
Inicio:
    Dim Valor_ADC1    As Word
    Dim valor_ADC2    As Word
     
    
    OSCCON = 0b01100000
    
    While OSCCONbits_IOFS = 0       ; Esperar hasta que el oscilador interno sea estable.
        Nop
    Wend
    
    ADCON2 = 0b10000011             ; Resultado de la conversión con justificación a la derecha.
 
    Cls ; Limpia o inicializa la pantalla.

Programa:
    ADCON1 = 0b00000000             ; Configurar el conversor para leer todos los canales.
    ADCON0 = 0b00010100             ; Activar el canal 5
    
    Valor_ADC1 = ADIn 5             ; Leer el resultado de la conversión.  
    
    While ADCON0bits_GO = 1         ; Esperar a que esté lista la conversión.
        Nop
    Wend      

    ADCON0 = 0b00110000             ; Activar el canal 12
    
    valor_ADC2 = ADIn 12            ; Leer el resultado de la conversión.  
    
    While ADCON0bits_GO = 1         ; Esperar a que esté lista la conversión.
        Nop
    Wend 
    
    ADCON1 = 0x0F                   ; Deshabilitar los conversores AD.     
    
    Print At 1,1, "Canal 05: ", Dec4 Valor_ADC1
    Print At 2,1, "Canal 12: ", Dec4 valor_ADC2
    
    DelayMS 50                      ; Éste retardo se puede omitir.
    
    GoTo Programa
    
    End
```


----------



## Jose1306 (Nov 3, 2016)

Perfecto ! Muchas gracias D@rkbytes !!


----------



## Pablo Tapia (Ene 27, 2017)

Hola a todos, hace un tiempo hize un programa en proton de un temporizador de 6 rangos, este funciona perfecto, le intento agregar un pulsador para que active un relay y asignar una potencia en cada etapa del mismo la cual se visualiza con un led en cada estado del relay, en la simulacion funciona bien, arme esta parte en protoboard y la primera vez cambia el relay pero se apaga en segundos, despues se vuelve erratica la funcion del pulsador y el apagado del relay persiste, no se que estoy haciendo mal?????? podria alguien por favor, revisar esta parte del codigo (linea 110, funcion del pulsador) de antemano gracias¡


----------



## D@rkbytes (Ene 28, 2017)

Verifica si con los cambios que realicé al programa, ya funciona correctamente, o al menos un poco mejor.


----------



## Pablo Tapia (Ene 29, 2017)

Hola D@rkbytes, mejoro notablemente el programa, sobre todo la funcion del pulsador de cambio, se estabilizo... nunca habia usado el comando button y me parece que es mas estable que if- then....solo tuve que cambiar los valores de delay-rate y obtuve la respuesta que deseaba, te agradesco tomes tu tiempo para compartir tus conocimientos, ! Muchas gracias D@rkbytes !!


----------



## D@rkbytes (Ene 29, 2017)

Pablo Tapia dijo:


> Nunca había usado el comando Button y me parece que es mas estable que if - then.


Sí, así es, ya que produce un anti rebote que mejora las condiciones de contacto del pulsador.

Acabo de ver que tuve un error en las variables para Button.
Las declaré pero sólo usé B0 en todas las comprobaciones.
Eso provoca que no se genere el bucle de comprobación del pulsador.

Actualiza el programa por el siguiente:

```
Ver_Rango:  ; Bucle para visualizar el contador.
    Button P_Mas, 0, 255, 255, B0, 0, Menos     ; Verificar si se ha pulsado P_Mas
    Inc Rango   ; Incrementar variable "Rango"
    If Rango > 6 Then Rango = 0
    GoSub Visualizar
Menos:                 
    Button P_Menos, 0, 255, 255, B1, 0, Enter   ; Verificar si se ha pulsado P_Menos
    Dec Rango   ; Decrementar variable "Rango"
    If Rango < 0 Then Rango = 6
    GoSub Visualizar
Enter:
    Button P_Enter, 0, 255, 255, B2, 0, Cambiar ; Verificar si se ha pulsado P_Enter
    GoTo Temporizador
Cambiar:
    Button P_Cambio, 0, 255, 255, B3, 0, Salir  ; Verificar si se ha pulsado P_Enter
    If Cambio = 0 Then
        Cambio = 1
        High Relay
    Else
        Cambio = 0
        Low Relay
    End If
Salir:
    GoSub Visualizar
    GoTo Ver_Rango
```
Saludos.


----------



## Pablo Tapia (Ene 30, 2017)

Hola D@rkbytes, buen dia... si, lo note y compile con esos cambios, tambien la declaracion del pull up interno, el compilador me marcaba un aviso (declaracion no reconocida, "en ensamblador") asi que la corregi y pues funciono bien.... de nueva cuenta, gracias por tu ayuda, Salu2


----------



## Hekzael (Mar 23, 2017)

hola como están, muy bueno este post, para aprender a programar pic en basic , mi consuta es que, me descargue proton IDE SE y no me reconoce el pic 18f4550 cuando lo declaro, por ello consulto que version de proton IDE es la necesaria ? y donde podria descargarla, el post esta un poco inactivo, pero me atrevo a consultar


----------



## D@rkbytes (Mar 23, 2017)

Necesitas ser usuario registrado para poder tener acceso a otro tipo de PICs.
Descarga, registro y actualizaciones: *Proton Development Suite*


----------



## Hekzael (Mar 23, 2017)

gracias amigo ya logre conseguirlo , intente descargarlo desde hay, pero sin resultado, no pude descargarlo, a lo mejor era mi Internet que es muy lento :/ , mil gracias de nuevo


----------



## Maginner (May 25, 2017)

mecatrodatos dijo:


> Que tal amigos anexo la primera parte del tutorial del manejo de proton de 10 partes.



Queridisimo Mecatrodatos, pasaron 7 años desde que enviaste ese comentario, no se si leeras esta cita jajaja Ojala que si  ... Estuve rastreando todas las partes y pude descargar hasta la parte  6, me faltarian las 4 restantes. Por favor, ¿Me las podrìas facilitar? desde ya muchas  gracias. Y también gracias por iluminar con estos aportes, me sirvieron de mucho!


----------



## crismafer (Oct 24, 2017)

Se que el grupo esta inactivo. Pero sino es así, necesito una ayuda o un poco mas informacion de usar el PWM... No el HPWM... O que me aconsejar para varial la luz de un LED? O un motor DC?... He probado usar PWM PORTB.0,150,255 y nada....


----------



## D@rkbytes (Oct 24, 2017)

Es mejor usar PWM por hardware (Instrucción HPWM) que por software. (Instrucción PWM)
Si quieres variar la intensidad de un LED, necesitas una variable que modifique el parámetro "_Duty_"

Parámetros de la instrucción PWM:
PWM _Pin, Duty, Cycles

_El problema con la instrucción PWM es que únicamente genera pulsos determinados por el parámetro "_Cycles_"
Por lo tanto, esa instrucción debe estar llamándose constantemente para mantener los pulsos y que se muestren cambios en la intensidad del LED cuando cambie el ciclo activo. "_Duty_"

Con HPWM no sucede eso, ya que al usarse el módulo CCP, siempre se estará generando PWM.
En este caso, lo único que se tiene que modificar es el parámetro "_Dutycycle_" (Usando una variable)

Parámetros de HPWM:
HPWM_ Channel, Dutycycle, Frequency
_


----------



## Gerson strauss (Oct 25, 2017)

D@rkbytes dijo:


> Con HPWM no sucede eso, ya que al usarse el módulo CCP, siempre se estará generando PWM.
> En este caso, lo único que se tiene que modificar es el parámetro "_Dutycycle_" (Usando una variable)
> 
> Parámetros de HPWM:
> ...



Hola Darkbytes. Quería saber, si en este caso la función HPWM tiene que esperar hasta que el programa pase por la variable que controla el Dutycycle para que haya algún cambio a la salida. Gracias.


----------



## D@rkbytes (Oct 25, 2017)

Así es, porque esta instrucción necesita parámetros que únicamente son modificados cuando se invoca.
Sin embargo, mantiene los pulsos constantes, contrariamente a la instrucción PWM.


----------



## crismafer (Oct 25, 2017)

D@rkbytes dijo:


> Es mejor usar PWM por hardware (Instrucción HPWM) que por software. (Instrucción PWM)
> Si quieres variar la intensidad de un LED, necesitas una variable que modifique el parámetro "_Duty_"
> 
> Parámetros de la instrucción PWM:
> ...




Me anduvo bien el PWM, no tengo problema con esto... Pero hay diferencia con HPWM.... Como se usa? Me podrias pasar un ejemplo?, con cualquiera... LED o MOTORDC... 


Por que la parte de canal, no se que canal se refiere...


----------



## D@rkbytes (Oct 25, 2017)

El uso de todas las instrucciones se encuentra en la ayuda de Proton.
También se incluyen ejemplos en la carpeta PDS\Samples.
La diferencia entre PWM y HPWM, es que la primera genera PWM por software y la segunda por hardware.
Por eso la primer letra de la instrucción tiene una H. (_Hardware_)
Así que la instrucción HPWM únicamente puede funcionar con PIC's que tengan módulo CCP.
Y como algunos PIC tienen varios módulos CCP, por eso HPWM requiere saber por qué canal se va a generar la señal. (_Channel_)

Adjunto un ejemplo con HPWM.


----------



## crismafer (Oct 28, 2017)

D@rkbytes dijo:


> El uso de todas las instrucciones se encuentra en la ayuda de Proton.
> También se incluyen ejemplos en la carpeta PDS\Samples.
> La diferencia entre PWM y HPWM, es que la primera genera PWM por software y la segunda por hardware.
> Por eso la primer letra de la instrucción tiene una H. (_Hardware_)
> ...



Esta bueno la funcion, la mayorias de mis pic tienen el CCP. Asi que mas tarde me pongo con ese tema. Muy bueno el ejemplo. 

Cambiando de tema, tengo un problema, ahora estoy simulando en proteus un servo motor con LCD 16X2, todo bien, pero cuando lo monto en protoboard, el LCD y el led de encendido del trafo parpadea cuando actua el Servo, puede ser que consuma mucho el servomotor?.... He usado la función *Servo Port.Pin, Variable* .. Si necesitas un vídeo, avísame así lo subo en youtube y veas como actúa físicamente.


----------



## pandacba (Oct 28, 2017)

Sube un esquema de tu proyecto, y fotos del mismo para poder ver como fue implementado en la práctica.
Ya que la fuente de motor debe estar de tal forma que los pulsos que genera no afecten al micro.
Que tipo de servomotor estas utilizando? marca y modelo del mismo por favor


----------



## crismafer (Oct 28, 2017)

pandacba dijo:


> Sube un esquema de tu proyecto, y fotos del mismo para poder ver como fue implementado en la práctica.
> Ya que la fuente de motor debe estar de tal forma que los pulsos que genera no afecten al micro.
> Que tipo de servomotor estas utilizando? marca y modelo del mismo por favor



1 X ServoMotor MG90S
1 X PIC16F887 con 8MHz y 22pF

 Pensaba si 5V alimentar al servo con una PILA 9V con LM7805 y el PIC conectada a otra fuente 5V, andaría me parece... Separar las dos cosas... Y no todo en un mismo lugar....


----------



## pandacba (Oct 28, 2017)

Aún con una fuente de pones un regulador para el pic y otro para el servo y solo las masas en común, agregas unas capacidades de 0.1uF y allí ya no deberías tener problemas
Que corriente entrega tu fuente, ya que el servo consume entre 400 y 500mA a máxima potencia


----------



## crismafer (Oct 29, 2017)

D@rkbytes dijo:


> El uso de todas las instrucciones se encuentra en la ayuda de Proton.
> También se incluyen ejemplos en la carpeta PDS\Samples.
> La diferencia entre PWM y HPWM, es que la primera genera PWM por software y la segunda por hardware.
> Por eso la primer letra de la instrucción tiene una H. (_Hardware_)
> ...



En Proteus anda de 10, pero cuando lo armo fisicamente, no me hacen caso los botones... Que estoy haciendo de mal?.... Les adjunto unas imagen...

Para el motor utilicé 5V con transistor de 2N2222A... Y el resto de los componente iguales....
Tengo que declarar algo al CCP1 en el PIC?


----------



## crismafer (Oct 29, 2017)

Disculpen chico, tras hora buscando el problema recien me doy cuenta que era que el grabador de PIC no se grabó correctamente me parece, ya me parecía raro que no se regulaba el PWM, por que siempre me aseguro en la protoboard... Es una mala costumbre que tengo de no poner los PULL UP-DOWN en proteus, pero obviamente lo monte físicamente una resistencia de 10Kohm. Logré hacer andar. Que era no se. Lo solucioné re-grabando de nuevo al PIC. (Un TM-PROG 2.0 tengo).


----------



## crismafer (Oct 30, 2017)

Tengo problema con LM35, estoy simulando en proteus, todo normal, pero físicamente, no se queda quieto el valor, marca cualquier cosa, de 18 a 32 grados... El Display esta muy bien, solo que no se queda quieto el valor de muestro. Que estoy haciendo de mal? Les adjunto... Es porque después quiero usarlo para regular la velocidad de un ventilador mediante PWM con LM35. Estuve viendo el manual de Proton en Ingles, dice que hay que usar ADin y Adcon (adcon no me quedo claro, ¿Que seria?)

Aca lo subí en YouTube, para que vean el muestro del valor en LCD.


----------



## pandacba (Oct 30, 2017)

Con adcon le decis que todo el puerto es digital o alguna de sus salidas o por el contrario le indicas que todo el puerto o todas las entradas AN son analógicas o solo algunas de ellas
Con ADCON1=7 todo es digital
En cambio ADCON1=%10000000 'El PORTA.0 es anlógico
Quedaría así
TRISA = %00000001 'AN0 como entrada
ADCON1 = %10000000 'PORTA.0 es analógico


----------



## D@rkbytes (Oct 30, 2017)

pandacba dijo:


> Con adcon le decis que todo el puerto es digital o alguna de sus salidas o por el contrario le indicas que todo el puerto o todas las entradas AN son analógicas o solo algunas de ellas
> Con ADCON1=7 todo es digital
> En cambio ADCON1=%10000000 'El PORTA.0 es analógico
> Quedaría así
> ...


No. En el PIC16F887, los registros involucrados para definir que un pin debe ser análogo, son los registros ANSEL y ANSELH.
(Y esto es nada más para los puertos con ADC)
Colocando un 1 en el bit 7 de ADCON1, lo que se hace es declarar una justificación hacia la derecha en el resultado de la conversión.

Ejemplo:

```
Device 16F887
; Palabra de configuración
Reminders = Off
Config1 INTOSCIO,LVP_OFF,FCMEN_OFF,IESO_OFF,PWRTE_ON,WDTE_OFF
Config2 WRT_OFF,BOR21V
Reminders = On

Xtal 8MHz

Declare Create_Coff On              ; Crear el archivo para depuración (.cof)

; Declaración de variables
Dim Valor_ADC   As Word
Dim Temperatura As Float

Inicio:
    OSCCON = %01110001              ; Configurar el oscilador interno a 8MHz.
; Configuración del ADC
    ADCON1bits_ADFM = 1             ; Resultado con justificación a la derecha
    Declare Adin_Res    = 10        ; Resultado ADC a 10 bits
    Declare Adin_Tad    = FRC       ; Reloj del ADC (FRC = Interno)
    Declare Adin_Stime  = 50        ; Tiempo de muestreo en uS
    ANSEL = 1                       ; Canal 0 análogico
    ANSELH = 0                      ; Puerto B Digital I/O (En vez de All_Digital)
; Configuración de la pantalla
    Declare LCD_Type    Alpha       ; Alfanumérica
    Declare LCD_DTPin   PORTD.4     ; Bus de datos de RD4 a RD7
    Declare LCD_RSPin   PORTD.3     ; Pin RS en RD3
    Declare LCD_ENPin   PORTD.2     ; Pin E en RD2
    Declare LCD_Interface   4       ; Modo a 4 Bits
    Declare LCD_Lines   2           ; Pantalla de dos líneas
    
    Cls                             ; Inicializar o limpiar la pantalla.
    Print At 1,1, "Temperatura LM35"

Programa:
    Valor_ADC = ADIn 0              ; Se lee el canal 0 y se guarda el valor en "Valor_ADC"
    Temperatura = (150 * Valor_ADC) / 308; (308 = Valor que tendrá el ADC a 150 °C "1.5V")
    ; Mostrar el resultado en pantalla
    Print At 2,1, Dec2 Temperatura, " ", 0xDF, "C  " 
    GoTo Programa
    
    End
```


----------



## pandacba (Oct 30, 2017)

Doc, vos ves en alguna parte que yo menciono el 16F877? 
Pregunto por ADCON  y lo que leyo en en manual, solo me referí a eso a lo que pregunto, y me limite a eso en forma genérica y no particular, si ha leido alguna vez mis post verá que enfatizo en la lectura de la hoja de datos, no importa si es un micro un transitor o lo que fuere, hoja de datos al lado y todo lo que publica el fabricante


----------



## D@rkbytes (Oct 30, 2017)

La consulta realizada por crismafer, es para un PIC16F887, no para un PIC16F877


----------



## crismafer (Oct 30, 2017)

D@rkbytes dijo:


> No. En el PIC16F887, los registros involucrados para definir que un pin debe ser análogo, son los registros ANSEL y ANSELH.
> (Y esto es nada más para los puertos con ADC)
> Colocando un 1 en el bit 7 de ADCON1, lo que se hace es declarar una justificación hacia la derecha en el resultado de la conversión.
> 
> ...



Me anduvo pero al ultimo tuve que ponerle Delayms 1000, porque no me dejaba leer en la pantalla... Me resultó... Gracias...




```
Device = 16F887
Xtal 8


Declare LCD_Type Alpha
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
Declare LCD_DTPin PORTD.4
Declare LCD_Lines 2

DelayMS 150
Cls

Print At 1,1, "Temperatura"

Declare Adin_Res 10       ; 10 bits de resolución
Declare Adin_Tad FRC      ; Seleccionar RC OSC
Declare Adin_Stime  50     ; 50uS para tiempo de muestreo

Dim ADC As Word     
Dim Temperatura As Float 



INICIO:
 
  ADC_Value = ADIn 0 
  Temperatura = ADC * 150 / 19712
  Print At 2,1, "Temp: ", Dec1 Temperatura
  DelayMS 1000
     
    
  GoTo INICIO
```

Esa es la forma que me maté haciendolo toda la tarde, en la cual pude lograr hacerlo andar y obtener una temperatura mas precisa.... Nuevamente gracias... No dude en escribirme... Todavia no soy experto, pero me gusta colaborar con ustedes... Y compartir mis conocimiento que he aprendido....


----------



## D@rkbytes (Oct 30, 2017)

No te esperes mucha precisión ni del conversor AD del PIC y mucho menos del LM35, los dos siempre introducirán cierto error.
El regulador usado y las variantes de voltaje conforme a la temperatura, generan cierta  fluctuación que repercute en las lecturas del conversor.
Pero recuerda que su uso básico en general, es para fines didácticos y que en la mayoría de aplicaciones, siempre irán bien.
Ya para casos de precisión, se usa la referencia del conversor y otro canal que la lea, para tenerla en cuenta y será base de la fórmula que muestre la derivación.


----------



## crismafer (Nov 4, 2017)

Sobre el motor Paso a Paso, tengo entendido que se maneja con secuencia binarias. Es correcto? Porque lo simulo en proteus y no gira en sentido horario como deseo. Aqui paso el codigo y el esquema.


```
'Motor Paso a Paso con L298N

Device 16F887
Xtal 4
All_Digital true

TRISD=%00000000
PORTD=0

Inicio:
    PORTD=%00001001
    DelayMS 200
    PORTD=%00000011
    DelayMS 200
    PORTD=%00000110
    DelayMS 200
    PORTD=%00001100
    DelayMS 200
GoTo Inicio
```


----------



## Gerson strauss (Nov 4, 2017)

pandacba dijo:


> Doc, vos ves en alguna parte que yo menciono el 16F877?
> Pregunto por ADCON  y lo que leyo en en manual, solo me referí a eso a lo que pregunto, y me limite a eso en forma genérica y no particular, si ha leido alguna vez mis post verá que enfatizo en la lectura de la hoja de datos, no importa si es un micro un transitor o lo que fuere, hoja de datos al lado y todo lo que publica el fabricante



Es solo guiarse por los nombres de los registros en inglés. 
ADCON = Analog to digital control (Control de análogo a digital)
ANSEL = Analog selection (Selección a análogo)


----------



## pandacba (Nov 4, 2017)




----------



## D@rkbytes (Nov 4, 2017)

Básicamente, no todos los PIC tienen los mismos registros, y tampoco su uso es igual de uno a otro.
Las cosas cambian y por eso la hoja de datos siempre nos servirá para encontrar esas diferencias.

Muchas personas copian códigos para usarlos en los PIC que tienen disponibles y obviamente al compilar obtendrán errores.
Errores que muchas veces se pueden corregir, y otras veces no se logrará un funcionamiento correcto aunque se logre la compilación.
Y eso será precisamente porque los registros aunque tengan el mismo nombre, no tienen la misma función.


----------



## Gerson strauss (Nov 4, 2017)

D@rkbytes dijo:


> Y eso será precisamente porque los registros aunque tengan el mismo nombre, no tienen la misma función.



¡Increíble! ¿podrías darme algún ejemplo (referencia del PIC) en donde ANSEL, ADCON etc signifique otra cosa?.Gracias.


----------



## cosmico74 (Nov 4, 2017)

crismafer dijo:


> Sobre el motor Paso a Paso, tengo entendido que se maneja con secuencia binarias. Es correcto? Porque lo simulo en proteus y no gira en sentido horario como deseo. Aqui paso el codigo y el esquema.
> 
> 
> ```
> ...


Precisamente estoy testeando un motor a pasos BIPOLAR en proteus y en protoboard fisicamente y si me gira correctamente en ambos sentidos,estuve revisando tu codigo y no se parece en nada al mio,tal vez ahi esta el error te recomiendo que lo revises...


----------



## D@rkbytes (Nov 5, 2017)

Gerson strauss dijo:


> ¡Increíble! ¿podrías darme algún ejemplo (referencia del PIC) en donde ANSEL, ADCON etc signifique otra cosa?.Gracias.


Ejemplos ya no serán adecuados, porque estoy 100 % seguro que ya he puesto alguno.
Y lo digo porque aquí existe un Buscador.
Aparte de eso, la hoja de datos así lo dice.
Muchos podrán hablar de leer y releer una hoja de datos, pero he visto que esas personas no ayudan.
Mencionar datos y características se obtienen al ver la hoja de datos.

He visto posts que preguntan por algo que se obtiene viendo la hoja de datos.
Y no pocos, bastantes.
Ahora, te diré algo muy importante...
Cuando no eres capaz de comprender lo que en ella viene, creo que será el momento de regresar a la Universidad y preguntarle a tu Catedrático, eso que no comprendes.

Yo actualmente respondo a preguntas que no puedan tener una explicación lógica y basada en fundamentos que lo puedan demostrar.


----------



## crismafer (Nov 5, 2017)

cosmico74 dijo:


> Precisamente estoy testeando un motor a pasos BIPOLAR en proteus y en protoboard fisicamente y si me gira correctamente en ambos sentidos,estuve revisando tu codigo y no se parece en nada al mio,tal vez ahi esta el error te recomiendo que lo revises...



Por eso pregunto cual error? Porque el profesor de mi facultad me dice que el motor se mueve con secuencias binarias, no me dio ejemplo y ni nada, revise pagina por pagina en este tema no se han hablado aún. Entonces empecé hacer ese codigo. Pero no hace nada. Estoy tratando de usarlo con L298N y motor paso a paso que tengo.


----------



## Gerson strauss (Nov 5, 2017)

D@rkbytes dijo:


> Ejemplos ya no serán adecuados, porque estoy 100 % seguro que ya he puesto alguno.
> Y lo digo porque aquí existe un Buscador.
> Aparte de eso, la hoja de datos así lo dice.
> Muchos podrán hablar de leer y releer una hoja de datos, pero he visto que esas personas no ayudan.
> ...



Bueno amigo no es para que te enojes. 

Revise varias hojas de datos y encontré que en el PIC18f2550 no existe ANSEL; allí hacen la selección análogo y digital, desde ADCON0 Y ADCON1. Pero obviamente también contiene los bits de control del conversor AD.

No seria practico ni adecuado que un registro con el mismo nombre tenga significados diferentes.

Pero si pueden tener un bit de más o un bit de menos o estar unidos (2 registros asociados en uno solo).

CONCLUSION: Si o si, un registro significara lo mismo en todos los PIC ( porque su nombre asi lo indica), pero podrá tener un orden diferente de bits.

Creo que ambos tenemos la razón y ambos estamos equivocados.

Por cierto, nunca fui a la universidad.


----------



## wolfbitt (Nov 24, 2017)

carptroya dijo:


> Hola a todos.
> 
> Mecatrodatos, muy bien el tutorial.
> 
> ...



Muchas gracias por la info colegas.. me ha servido mucho..
si alguien mas me recomienda algo sobre RF se lo agradecere mucho.
saludos


----------



## crismafer (Nov 24, 2017)

Holas Chicos... Estoy tratando de hacer Comunicacion Serial, y no logro conectar Proteus con Proton IDE... Me cuando pulso Serial Com, no me aparece nada... Aqui les dejo una captura... Me dice que no esta instalado... Que archivo y donde puedo descargarlo..?

El ejemplo lo saque de internet, es para mi PIc 16F887


```
Device 16F887
Xtal 8
All_Digital true
TRISA=0
PORTA=0

Declare Hserial_Baud 9600
Dim LED As Byte

Inicio:
    HRSOut "Hola",13
    Repeat
        HRSOut "Introduzca numero de led: ", 13
        HRSIn Dec1 LED
        Until LED >= 1 And LED <= 3
        Select LED
        Case 1:
            Toggle PORTA.0
            DelayMS 10
        Case 2:
            Toggle PORTA.1
            DelayMS 10
        Case 3:
            Toggle PORTA.2
            DelayMS 10
        End Select
        DelayMS 10
GoTo Inicio
End
```

Aqui dejo otra imagen que no me dejo subirla...


----------



## D@rkbytes (Nov 25, 2017)

Necesitas instalar puertos serie virtuales.

Edit:
Una mejora al código:

```
Device 16F887

Reminders = False
Config1 INTOSCIO, FCMEN_OFF, WDT_OFF, PWRTE_ON, LVP_OFF
Reminders = True
Xtal 8MHz
All_Digital = True

Declare Hserial_Baud 9600
Dim LED As Byte

Inicio:
    TRISA = 0b11111000
    PORTA = 0
    HRSOut "Hola", 13

Programa:
    While 1 = 1
        HRSOut "Introduzca numero de led: ", 13
        HRSIn Dec1 LED
        If LED >= 1 And LED <= 3 Then
            Select Case LED
                Case 1
                    Toggle PORTAbits_RA0
                Case 2
                    Toggle PORTAbits_RA1
                Case 3
                    Toggle PORTAbits_RA2
            End Select
        End If
    Wend

    End
```


----------



## crismafer (Dic 2, 2017)

Una pregunta, chicos, es una maquina CNC que me hice hace unos años atras, y voy a meterles 3 pares de sensor de final de carrera de tipo SWITCH como el de click del mouse. El sensor va trabajar con el PIC 16F628A, en el final de carrera, si o si debo meterle una resistencia PULL-DOWN. Al no poner eso sucede algo?... Puede que haca interferencia o algo? O quemarlo ?.... La maquina CNC trabaja una hora por dia.... Si hay otra solucion para no poner resistencia, alguna idea que me puedan dar?

Aca paso el codigo por si la mosca.


```
Device = 16F628A
Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_Off,BODEN_OFF,LVP_OFF,MCLRE_OFF
Xtal = 8   
TRISA=%00000000
TRISB=%10111111
PORTB=0

Dim A As Byte

Symbol XPos = PORTB.0
Symbol XNeg = PORTB.1
Symbol YPos = PORTB.2
Symbol YNeg = PORTB.3
Symbol ZPos = PORTB.4
Symbol ZNeg = PORTB.5
Symbol Rele = PORTB.6
Symbol BT   = PORTB.7
Symbol Bocina = PORTA.0


Inicio:
    If XPos=1 Then GoTo Apagado
    If XNeg=1 Then GoTo Apagado
    If YPos=1 Then GoTo Apagado
    If YNeg=1 Then GoTo Apagado
    If ZPos=1 Then GoTo Apagado
    If ZNeg=1 Then GoTo Apagado
GoTo Inicio
        
        
        
Apagado:
    High Rele
    DelayMS 50
    For A=0 To 4
        Bocina = A
        DelayMS 500
    Next A 
GoTo Selecion

Selecion:
    If BT=1 Then
        Low Rele
        GoTo Inicio
    End If
GoTo Selecion
```


----------



## D@rkbytes (Dic 2, 2017)

Las resistencias Pull-Up o Pull-Down siempre son necesarias para definir un estado lógico.
El microcontrolador no se dañará, pero no tendrá un estado lógico definido al estar el pin en estado flotante.
Eso provocará falsas lecturas y hará que tu programa no responda adecuadamente.
¿Por qué? Porque las condiciones ambientales y la estática, harán que el pin de entrada cambie de estado de forma errática.


----------



## pandacba (Dic 2, 2017)

Como dice D@rkbytes siempre se debe referenciar una entrada a masa o a al +B según como se utilice la entrada, de igual manera con cualquier dispositivo lógico, compuerta, contador, flip flop, etc etc,


----------



## crismafer (Dic 18, 2017)

Chicos, estoy tratando de programar un Motor paso a paso, que con un boton varie el tiempo, y un boton para cambio de sentido de giro, resulta que cuando pulso el boton de cambio de giro, cambia bruscamente , horario antihorario horario antihorario horario en forma aleatoria, quisiera saber si hay una solucion que cuando pulso, o lo mantengo pulsado que me cambie sin que sea aleatorio el cambio de giro. Me explico? Aqui paso el codigo.


```
Device 16F887
Xtal 8

TRISC=%11110000
PORTC=0

Declare LCD_Type 0
Declare LCD_RSPin PORTD.2
Declare LCD_ENPin PORTD.3
Declare LCD_DTPin PORTD.4
DelayMS 150
Cls 

Dim A As Word

Symbol BT1 PORTC.4   
Symbol BT2 PORTC.5   
Symbol BT3 PORTC.6   

Dim Tiempo As Word
Tiempo = 100



Horario:
    For A=0 To 8
        PORTC=LookUpL A, [8,12,4,6,2,3,1,9]
            Print At 1,1, "Tiempo:", Dec4 Tiempo
            Print At 2,1, " HORARIO            "
        If BT1=1 Then
            Tiempo = Tiempo + 100
        End If
        If BT2=1 Then
            DelayMS 500
            GoTo Antihorario
        End If
    DelayMS Tiempo
    Next A
GoTo Horario

Antihorario:
    For A=8 To 0 Step -1
     PORTC=LookUpL A, [8,12,4,6,2,3,1,9]
            Print At 1,1, "Tiempo:", Dec4 Tiempo
            Print At 2,1, "ANTIHORARIO            "
            If BT1=1 Then
                Tiempo = Tiempo + 100
            End If
            If BT2=1 Then
                DelayMS 500
                GoTo Horario
            End If
        DelayMS Tiempo
    Next A
GoTo Antihorario
```


----------



## D@rkbytes (Dic 21, 2017)

crismafer dijo:


> Resulta que cuando pulso el botón de cambio de giro, cambia bruscamente , horario antihorario, horario antihorario, en forma aleatoria.
> Quisiera saber si hay una solución que cuando pulso, o lo mantengo pulsado, que me cambie sin que sea aleatorio el cambio de giro. ¿Me explico?


Existen varias formas de solucionarlo, pero la forma más sencilla es usando un bucle de espera hasta que se suelte el pulsador.

Por ejemplo:

```
If BT2 = 1 Then
        While BT2 = 1: Wend    ; Esperar hasta que se suelte el pulsador.
        GoTo Antihorario
    End If
```


----------



## crismafer (Dic 23, 2017)

Buen día chicos, les cuento que he comprado un Display LCD 16x2 con puerto I2C , que lo compré para ahorrarme los puertos, porque tengo un PIC pequeño 16F819, y me hice un mini alarma conectado con una bocina de camión para mi garaje ya que se viene la fiesta quiero asegurar mi casa. He estado buscando solución para este, he encontrado codigo, he leído el manual de Proton IDE, me compila bien, pero no me aparece nada en el Display. Aquí les paso lo que encontré por internet y además de esto le metí algunos códigos de I2C, para ver si lograba, y nada. Aquí les adjunto el código. Ah, y otra cosa, me recibí de Tecnico Superior Mecatronica hace dos días, eso es gracias a ustedes por haberme ayudado un montón con el tema de programación, y agradezco mucho a D ark y a P andaCBA.
Aquí adjunto el código.

Hay comentario en color azul lo que escribí.


```
Device 16F819
Create_Coff true
Xtal = 8
All_Digital true 

Declare Optimiser_Level = 0 
Declare LCD_Type = 0 
Declare LCD_DTPin = PORTA.0 
Declare LCD_ENPin = PORTB.0 
Declare LCD_RSPin = PORTB.2 
Declare LCD_Interface 4 
Declare LCD_Lines = 2 

Declare SDA_Pin PORTB.1   'Es lo que encontré en el manual de 
Declare SCL_Pin PORTB.4   'Proton IDE, así leyendo lo armé así
Declare Slow_Bus On 

Symbol null = 0
Symbol LCDdelay = 5       'Eso lo encontré gooogleando en 
Symbol SSPIF PIR1.3       'una pagina en ingles
Symbol BF SSPSTAT.0 
Symbol R_W SSPSTAT.2 
Symbol D_A SSPSTAT.5 
Symbol CKP SSPCON.4 
Symbol SSPEN SSPCON.5 
Symbol SSPOV SSPCON.6 
Symbol WCOL SSPCON.7 

Dim buff As Byte 

Init: 
SSPADD = 8 
SSPCON = $36 
GoSub Banner
buff = null

Begin: 
Loop:
If SSPIF = 1 Then 
GoSub i2cSlave
EndIf 

SSPOV = 0 
WCOL = 0

If buff != 0 Then ;
Print buff
buff = 0 
EndIf

GoTo Loop 
Stop 

i2cSlave: 
SSPIF = 0 
If R_W = 1 Then i2cTX 
If BF = 0 Then Return 
If D_A = 1 Then i2cRX 
If SSPBUF != 2 Then Return 
Return

i2cRX: 
buff = SSPBUF ;
Return

i2cTX:
SSPBUF = buff 
CKP = 1 
Return

Banner:
Print $fe,1
DelayMS LCDdelay
Print " * i2cLCD101 *"   'Y no me aparece en la pantalla
Print $fe,$c0
Print "LCD Addr:",@SSPADD   
DelayMS 5000
Print $fe,1
DelayMS LCDdelay
Return

End
```

Y otra cosa el C.I. del I2C es un PCF8574T

Aquí paso el diagrama también, es exactamente lo mismo.


----------



## D@rkbytes (Dic 26, 2017)

La instrucción "*print*" es únicamente usada para pantallas que usan el CI Hitachi 44780, el CI Samsung KS0108, o el  CI Toshiba T6963
Lo que estás haciendo no sirve de nada, porque "*print*" no tiene nada que ver con I2C

Lo que necesitas hacer son una serie de rutinas para que por medio del PCF8574 emules el protocolo.
Proton lo permite hacer relativamente sencillo, usando las instrucciones nativas, como:
*BStart, BusOut y BStop

*El problema será escribir cadenas directamente, así que se tendrá que hacer uso de arreglos (Arrays)
En los PIC18 si se pueden declarar variables del tipo *String*, pero implementarlas tal vez sea complejo.


----------



## Gerson strauss (Abr 20, 2018)

Hola.

Estoy haciendo un contador de objetos usando el PIC16F628A. Para los segmentos del Display de leds uso el PORTB; el problema es que necesito usar el RB0 para la interrupción externa (entrada de pulsos a contar) ... y pues el programa ocupa el PORTB para los segmentos y así no puedo usar la interrupción.

Como puedo decirle a PROTON que use el PORTB sin usar el RB0? ... osea que empiece desde RB1.

Muchas gracias a quienes puedan ayudarme.


----------



## pandacba (Abr 20, 2018)

Todo tiene solución en lugar de manejar los dígitos uno por uno manejalos en BCD y utiliza un BCD a 7 segmentos externos como por ejemplo el CD 4511, el 7447, 74C47 y varios más solo necesitas 4 líneas


----------



## D@rkbytes (Abr 20, 2018)

Gerson strauss dijo:


> ¿Cómo puedo decirle a PROTON que use el PORTB sin usar el RB0?
> O sea, que empiece desde RB1.


Rotando 1 bit a la izquierda el valor que se le dará al puerto B.
Como son 7 bits (1 por segmento) el bit 0 del puerto B quedará libre sin afectar el valor.


----------



## Gerson strauss (Abr 21, 2018)

pandacba dijo:


> Todo tiene solución en lugar de manejar los dígitos uno por uno manejalos en BCD y utiliza un BCD a 7 segmentos externos como por ejemplo el CD 4511, el 7447, 74C47 y varios más solo necesitas 4 líneas



Esa es otra opción, pero me gustaría ahorrar en hardware ... quiero aprovechar al máximo el micro. Gracias.

	Mensaje automáticamente combinado: Abr 21, 2018



D@rkbytes dijo:


> Rotando 1 bit a la izquierda el valor que se le dará al puerto B.
> Como son 7 bits (1 por segmento) el bit 0 del puerto B quedará libre sin afectar el valor.



Probare esa opción a ver que pasa. Gracias D@rkbytes.


----------



## Gerson strauss (Abr 21, 2018)

¡Perfecto! D@rkbytes ... ya se libero el RB0. Fue exactamente como lo mencionaste.

Así quedo...



      Select Case DECIMAL

      Case 0

      DIGITO = 64 << 1

      Case 1

      DIGITO = 121 << 1

      Case 2

      DIGITO = 36 << 1

      Case 3

      DIGITO = 48 << 1

      Case 4

      DIGITO = 25 << 1

      Case 5

      DIGITO = 18 << 1

      Case 6

      DIGITO = 2 << 1

      Case 7  continua...

Nuevamente muchas gracias.


----------



## D@rkbytes (Abr 21, 2018)

Es más sencillo usar una tabla.
Adjunto el ejemplo. (Expandible hasta 6 dígitos)


----------



## Gerson strauss (Abr 21, 2018)

D@rkbytes dijo:


> Es más sencillo usar una tabla.
> Adjunto el ejemplo. (Expandible hasta 6 dígitos)



¡Genial! con esa tabla usando lookup se ve mas resumido y bonito el programa... lo haré así.
Muchas gracias.


----------



## D@rkbytes (Abr 21, 2018)

Nota: Olvidé quitar esta parte del inicio.

```
Indice = 0
    Display = LookUp Indice,[0x3F, 0x06, 0x5B, 0x4F, 0x66, _
                             0x6D, 0x7D, 0x07, 0x7F, 0x6F]
    PORTB = Display << 1
    DigUni = 1
    DigDec = 1
```
Todo eso no es necesario. Lo usé como una prueba antes de escribir el resto del programa.


----------



## Gerson strauss (Abr 22, 2018)

D@rkbytes dijo:


> Nota: Olvidé quitar esta parte del inicio.
> 
> ```
> Indice = 0
> ...



Ok, ya entiendo bien el programa. Gracias.


----------



## Gerson strauss (Ene 9, 2019)

Hola a todos, estoy trabajando en un proyecto con el 12f683 y necesito sacar un promedio de las conversiones A/D (para mejorar la resolución de las medidas). Utilizo variables Word para procesar todo, pero cuando grabo el PIC este corre el programa pero muy lento; si quito la rutina del promedio, el programa funciona pero es mas inexacto, porque ya no promedia.

¿Sera que este PIC no puede manejar variables word?

Esta es la parte de la conversión:

Device = 12F683
Reminders = OFF
Config  INTOSCIO,FCMEN_OFF,IESO_OFF,BOD_OFF,CPD_OFF,CP_OFF,MCLRE_OFF,PWRTE_ON,WDT_OFF,BOREN_OFF
Reminders = On
Xtal 8

Declare Adin_Res = 10 'Resolución ADC=10 bits

OSCCON = %01110100 ' 8 mhz Osc interno.
OSCTUNE = %00000000
CMCON0 = %00000111 'Comparador apagado
CMCON1 = %00000000
PIE1 = %00000000
TRISIO =%00001011
ANSEL =%00100011 'ADC 1 y 2 activados 
ADCON0 =%10000001 'bit 7 vdd-ref
OPTION_REG = %10000111
INTCON = %11100000
IOC = %00000000

Dim ACUMESR As Word 'Acumula medidas del ADC.
Dim CUENTAS As Byte 'Acumula cuentas.
Dim IN As Word ' Para el ADC. 

START:
ADCON0.1 = 1
DelayMS 50
If ADCON0.1 = 1 Then GoTo START
IN = ADIn 0
ACUMESR = ACUMESR + IN
CUENTAS = CUENTAS + 1
If CUENTAS = 10 Then
ACUMESR = ACUMESR / 10
IN = ACUMESR
CUENTAS = 0
GoTo COMP
'EndIf
GoTo START

Gracias por la ayuda.


----------



## Dr. Zoidberg (Ene 9, 2019)

Yo miraria el codigo ensamblador generado para verificar que el compilador no esté metiendo operaciones en punto flotante en el medio de las operaciones.
Yo no se que hace el compilador basic al encontrar una division con el operador "/"


----------



## D@rkbytes (Ene 9, 2019)

Gerson strauss dijo:


> cuando grabo el PIC este corre el programa pero muy lento.
> Si quito la rutina del promedio, el programa funciona pero es más inexacto, porque ya no promedia.


Ese retardo de 50 milisegundos, a lo mucho debería ser de 50 microsegundos.
También sería más conveniente promediar dentro de un bucle for.


----------



## Dr. Zoidberg (Ene 9, 2019)

D@rkbytes dijo:


> Ese retardo de 50 milisegundos, a lo mucho debería ser de 50 microsegundos.
> También sería más conveniente promediar dentro de un bucle for.


Ese código no es de lo mejor que he visto  y no entiendo si quiere hacer la conversión a todo lo que dá el micro (50 us) o tomar una muestra cada 50 ms, en cuyo caso el if sería una suerte de protección por si no terminó la conversión 
De todas formas, pisa el valor de la variable IN calculada con el resultado de cada nueva conversión... en fin, si es un fragmento del código total debería mostrar algo más para entenderlo, pero YO escribiría de nuevo el programa, por que si lo que queda está así.....huuummmmmm


----------



## Gerson strauss (Ene 9, 2019)

D@rkbytes dijo:


> Ese retardo de 50 milisegundos, a lo mucho debería ser de 50 microsegundos.
> También sería más conveniente promediar dentro de un bucle for.


OK lo haré de esa manera ... pero lo raro es que esa rutina de conversión la uso en un PIC16F88 y funciona muy bien, haciendo de voltimetro y amperimetro digital. Muchas gracias.


Dr. Zoidberg dijo:


> Ese código no es de lo mejor que he visto  y no entiendo si quiere hacer la conversión a todo lo que dá el micro (50 us) o tomar una muestra cada 50 ms, en cuyo caso el if sería una suerte de protección por si no terminó la conversión
> De todas formas, pisa el valor de la variable IN calculada con el resultado de cada nueva conversión... en fin, si es un fragmento del código total debería mostrar algo más para entenderlo, pero YO escribiría de nuevo el programa, por que si lo que queda está así.....huuummmmmm


 Es que soy novato en programación, por eso pregunto. Gracias.


----------



## D@rkbytes (Ene 9, 2019)

Este sería un código muy sencillo para promediar:

```
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Dim Muestras As Byte
    Dim Promedio As Word
    
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
    
    SerOut GPIO.5, 84, [0x00]   ; Iniciar RS-232 por software
    DelayMs 100

Programa:
    While 1 = 1
        Promedio = 0
        
        For Muestras = 1 To 10  ; Tomar 10 lecturas
            Promedio = Promedio + ADIn 0
        Next Muestras
        
        Promedio = Promedio / 10
        
        ; Descomentar para depuración:
        ;SerOut GPIO.5, 84, [Dec4 Promedio, 13, 10]
        ;DelayMs 250
    Wend
    
    End
```
El único retardo sería el que genere la instrucción ADIn que debe esperar hasta que el ADC esté listo.
El retardo después de SerOut es únicamente con fines de depuración.


----------



## Gerson strauss (Ene 9, 2019)

D@rkbytes dijo:


> El único retardo sería el que genere la instrucción ADIn que debe esperar hasta que el ADC esté listo.
> El retardo después de SerOut es únicamente con fines de depuración.



Probé lo del tiempo 50us pero hace lo mismo, igual con el bit de fin de conversión se asegura leer el ADC en el momento preciso. Haré lo del promedio, gracias por el código.


----------



## ricbevi (Ene 10, 2019)

Hola...Lo que veo yo....

El código que subiste esta incompleto y por ejemplo no se ve que coloques a 0 nunca, la variable ACUMESR, una ves que terminas los cálculos y comienzas nuevamente las mediciones.

Al dividir entre 10 el resultado de esta operación, es una fija que te dará algo con coma y tienes definida un Word y no Float 

Esta comentado el Endif  de las 10 acumulaciones por lo que si te compila así la cosa puede terminar en cualquier lado, sales de esa condición con un Goto no con un Gosub ( esto puede o no ser importante) que permitiría el retorno, no sabemos que pasa en COMP, etc, etc.

Para opinar con mas fundamento al menos a mi me falta mas de lo que muestras.

Saludos.

Ric.


----------



## Gerson strauss (Ene 10, 2019)

ricbevi dijo:


> Hola...Lo que veo yo....
> 
> El código que subiste esta incompleto y por ejemplo no se ve que coloques a 0 nunca, la variable ACUMESR, una ves que terminas los cálculos y comienzas nuevamente las mediciones.
> 
> ...



Hola. Si, el programa no esta completo (es muy grande). Las cantidades no tienen punto flotante ... y creo que las variables se actualizan con el nuevo valor que le ingrese, solo tengo que borrar la variable cuentas para hacer un nuevo promedio.


----------



## Gerson strauss (Ene 10, 2019)

¿Que les parece esta forma? no se por que da problema si consulto el bit de finalización del ADC, pero no creo que haya problema si se espera los 50us para leer el ADC. Lo importante es que ya promedia y el circuito ahora es mucho mas estable que antes. 

For CUENTAS = 1 To 100
ADCON0.1 = 1
DelayUS 50
IN = ADIn 0
ACUMESR = ACUMESR + IN
Next 
ACUMESR = ACUMESR / 100
IN = ACUMESR
CUENTAS = 0
ACUMESR = 0


----------



## D@rkbytes (Ene 11, 2019)

Algo que se tiene que tener en cuenta es que, la variable no se desborde con la suma.
Si es del tipo Word (16 bits) desbordará cuando se supere el valor 65535
O sea que no tiene caso tomar 100 muestras porque habrá un desborde durante el incremento y eso hará que la cuenta se reinicie.
Suponiendo que el ADC esté al máximo: 100 * 1023 = 102300
Por lo tanto, con una variable de 16 bits únicamente se podrán realizar 64 muestras sin que exista desborde. (65535 / 1023 = 64,061)

Otra cosa.
ADIn se encarga de establecer el bit 1 (GO/DONE) de ADCON0 en 1, así que sería conveniente retirar ADCON0.1 = 1, porque es redundar.

Algo importante es tratar de ahorrar memoria, y el uso de una variable para guardar la lectura de ADIn, se puede omitir.
Por eso en mi código hice lo siguiente:
Promedio = Promedio + ADIn 0

Si la variable para guardar el valor de ADIn se piensa usar en otra parte de la rutina o del programa, entonces sí tendría sentido.

PD:
Sigues sin limpiar la variable ACUMESR antes de realizar la suma, recuerda que una variable es acumulativa.
Si la variable se encuentra con datos previos, se le sumarán los nuevos y el desborde ocurrirá de imprevisto, con lo cual el resultado se altera.


----------



## Gerson strauss (Ene 11, 2019)

D@rkbytes dijo:


> Algo que se tiene que tener en cuenta es que, la variable no se desborde con la suma.
> Si es del tipo Word (16 bits) desbordará cuando se supere el valor 65535
> O sea que no tiene caso tomar 100 muestras porque habrá un desborde durante el incremento y eso hará que la cuenta se reinicie.
> Suponiendo que el ADC esté al máximo: 100 * 1023 = 102300
> ...



Si, entiendo lo del desborde y el ADC en este caso solo llega hasta 253 aprox. Osea que 253 * 100 = 25300. El bit GO/DONE lo active porque así lo dice en la DATASHEET del 12f683, pero PROTON lo activa automáticamente (no lo sabia). La variable para guardar ADIN si la uso mas adelante ... aunque si podría quitarla, pero el PIC tiene mucho espacio aun.

Si limpio la variable ACUMESR, antes y después de usarla. Estoy haciendo un medidor de ESR digital por eso el nombre de la variable.
ACUMESR = Acumular ESR.

Ahora es sumamente estable al promediar la conversión A/D, pero solo si promedio 100 ... menos de eso sigue inestable. 

Muchas Gracias D@rkbytes, sin tu ayuda no lo hubiese logrado.


----------



## D@rkbytes (Ene 11, 2019)

La estabilidad se puede mejorar usando un voltaje de referencia externo para el ADC y no tomando el mismo VDD del microcontrolador.
Algo que yo uso para mejorar notablemente la estabilidad aparte de eso es, usar algún timer para realizar la lectura del ADC
Eso me ha servido en varios casos en donde deseo mostrar voltaje o corriente, no sé si pueda servir para un ESR, aunque supongo que sí.


----------



## Gerson strauss (Ene 11, 2019)

D@rkbytes dijo:


> La estabilidad se puede mejorar usando un voltaje de referencia externo para el ADC y no tomando el mismo VDD del microcontrolador.
> Algo que yo uso para mejorar notablemente la estabilidad aparte de eso es, usar algún timer para realizar la lectura del ADC
> Eso me ha servido en varios casos en donde deseo mostrar voltaje o corriente, no sé si pueda servir para un ESR, aunque supongo que sí.



¡Vaya increíble lo de usar el timer!, pero mis conocimientos no me lo permiten por ahora. El PIC 12F683 funciona con 2.7v y la resolución  es buena para este caso (2.6mv) aun usando el VDD como VREF  y no me alcanzan los pines para usar VREF externo. Quizás usando un PIC con VREF interno de 1v, pero no se si hay uno de 8 pines, solo lo he visto en uno de 18 pines como el 16F1827.  Gracias.


----------



## pandacba (Ene 11, 2019)

Podes publicar tu esquema electrico? Tal vez te sirva utitilizar un TL548C que se comunica via I2C que tal vez ya estes utilizando para mostrar en un display, por lo que no necesitas ningún pin más y te queda uno más disponible


----------



## Gerson strauss (Ene 11, 2019)

pandacba dijo:


> Podes publicar tu esquema electrico? Tal vez te sirva utitilizar un TL548C que se comunica via I2C que tal vez ya estes utilizando para mostrar en un display, por lo que no necesitas ningún pin más y te queda uno más disponible



Es que el circuito y PCB ya esta terminado y "no puedo agregar mas componentes". Dejo el diagrama y advierto que soy muy inusual diseñando circuitos  y pues a muchos no les gusta.

Es un medidor de ESR con indicación por Leds (solo 3 leds: bueno, regular, malo). La mayoría piensa que no sirve.


----------



## pandacba (Ene 11, 2019)

Sin el menor ánimo de desanimarte, pero siendo realista.
Para diseñar un instrumento de medición hay que conocer la naturaleza de lo que se mide.
Quien diseño esto evidencia que no tiene idea de que se mide.
El valor de bueno para los capacitores no es igual para todos, va cambiando de acuerdo a la fama de capacitores
Mira esta escala de uno comercial

Si observas por ejemplo para un valor de 7 según la gama de capacitores para unos es bueno, para otra dudosa y para otra mala.
Por eso no sirve que mida con tres led.
Aún los digitales traen una tabla en el frente para cotejar según la capacidad que se trate
Mira, este que es digital, te da la capacidad y el valor ESR, y tiene la tabla impresa en el frente


----------



## D@rkbytes (Ene 11, 2019)

Gerson strauss dijo:


> Es un medidor de ESR con indicación por Leds (solo 3 leds: bueno, regular, malo)
> *La mayoría piensa que no sirve*.


Soy de esos que piensan lo mismo.

Hace ya algunos años que armé este *Medidor de ESR* y funciona bastante bien.
En ese tiempo lo hice sobre circuito impreso perforado y hasta ahora sigue ahí.

Posteriormente quise hacerlo con un microcontrolador, pero de saber que ese funcionaba bien, ya no me animé a hacerlo.


----------



## Gerson strauss (Ene 11, 2019)

D@rkbytes dijo:


> Soy de esos que piensan lo mismo.
> 
> Hace ya algunos años que armé este *Medidor de ESR* y funciona bastante bien.
> En ese tiempo lo hice sobre circuito impreso perforado y hasta ahora sigue ahí.
> ...


Si, la gente desconfía de lo nuevo ...aunque funcione. El medidor de ESR con 3 leds no tiene 3 indicaciones; tiene 8 para el ESR + otra para indicar cortocircuito y otra para indicar batería baja ... osea que tiene 10 indicaciones.

Se basa en el hecho de que si un condensador esta averiado o malo, no hay que saber que tan averiado o malo esta ... esta malo y hay que cambiarlo.

Ya lo he usado con excelentes resultados.


----------



## pandacba (Ene 11, 2019)

Conozco como funciona y conozco como de debe medir, he comparado infinidad de medidores y te puedo decir que sirve y que no sirve, y ese circuito si tu quieres hacerlo hazlo, pero te digo algo no me baso en un capricho si no en conocimiento real, no por nada en la universidad tuve una materia que se llama mediciones eléctricas y electrónicas y otra en la que se ve la composición de los materiales de los componentes electrónicos, como se construyen, como están compuestos y como se miden a nivel de los fabricantes.
Tienen una parte teórica y otra práctica esas materias son un colador para avanzar, asi que debes saberlas muy pero muy bien.
Por eso te digo con conocimiento de causa, que queda muy bonito pero no sirve como instrumento, porque lo que te indicará no es real.
Nosotros entre otras cosas, calibramos instrumental de medición y mi hermano que es ingeniero electricista electrónico hace las certificaciones, lo cual implica tener instrumental para llevar a cabo mediciones y comparaciones y por supuesto los patrones necesarios.
Tu has lo que quieras, solo intento ayudarte para que mejores y aprendas más.

Yo utilizaría la misma placa, y  el micro para manejar un display y un conversor A/D


----------



## Gerson strauss (Ene 11, 2019)

pandacba dijo:


> Conozco como funciona y conozco como de debe medir, he comparado infinidad de medidores y te puedo decir que sirve y que no sirve, y ese circuito si tu quieres hacerlo hazlo, pero te digo algo no me baso en un capricho si no en conocimiento real, no por nada en la universidad tuve una materia que se llama mediciones eléctricas y electrónicas y otra en la que se ve la composición de los materiales de los componentes electrónicos, como se construyen, como están compuestos y como se miden a nivel de los fabricantes.
> Tienen una parte teórica y otra práctica esas materias son un colador para avanzar, asi que debes saberlas muy pero muy bien.
> Por eso te digo con conocimiento de causa, que queda muy bonito pero no sirve como instrumento, porque lo que te indicará no es real.
> Nosotros entre otras cosas, calibramos instrumental de medición y mi hermano que es ingeniero electricista electrónico hace las certificaciones, lo cual implica tener instrumental para llevar a cabo mediciones y comparaciones y por supuesto los patrones necesarios.
> ...



No necesito su "ayuda". Mi capricho quedo así:


----------



## Gerson strauss (Abr 17, 2019)

Hola. Esta vez tengo problemas en sumar números con punto flotante; y es que PROTON parece que no hace la suma o no se hacerla.

Estoy haciendo esto:

Dim VOLT As Float
Dim VOLTUP As Float

VOLT = ADIn 0
DelayUS 50
VOLT = VOLT / 204.8  
VOLTUP = VOLT + 0.4

Digamos que VOLT/204 tiene como resultado 1.6 y le sumo 0.4 seria igual a  VOLTUP = 2.0

Luego hago esto:

If VOLT < VOLTUP Then GoTo STAND_BY
If VOLT > VOLTUP Then GoTo POWER_ON

Como se ve VOLT (1.6) es menor que VOLTUP (2.0) y debería ir a la rutina STAND_BY, pero no lo hace y se va a POWER_ON.

Pero si lo hago así, entonces si funciona:

If VOLT < 2.0 Then GoTo STAND_BY
If VOLT > 2.0 Then GoTo POWER_ON

¿Por que?... de antemano muchas gracias por la ayuda.


----------



## D@rkbytes (Abr 17, 2019)

La variable VOLT debe ser del tipo Byte si es que se usa el ADC a 8 bits. (0 a 255)
Y debe ser del tipo Integer si es que el ADC va a 10 bits. (0 a 1023)
Así que no tiene sentido que sea Float.

Mejor haz esto ya con VOLT como Integer:
VOLT = ADIn 0
VOLTUP = (VOLT / 204.8) + 0.4


----------



## ricbevi (Abr 18, 2019)

Gerson strauss dijo:


> Hola. Esta vez tengo problemas en sumar números con punto flotante; y es que PROTON parece que no hace la suma o no se hacerla.
> 
> Estoy haciendo esto:
> 
> ...



Hola...Tienes que usar dos variables, una para el valor del ADC(Word) y otra para el resultado(Float).

```
Dim VoltP As Word
Dim VOLT As Float
Dim VOLTUP As Float

VoltP = ADIn 0
DelayUS 50
VOLT = VoltP / 204.8
VOLTUP = VOLT + 0.4
```

Por lo que veo siempre VOLTUP va a ser mayor de VOLT en 0.4 por que lo único que haces es sumarle 0.4 a esta(VOLTUP = VOLT + 0.4) por eso no te trabaja la comparación de "If VOLT < VOLTUP Then GoTo STAND_BY" ya que nunca se dará.

Por otro lado si solo habrá esas dos acciones pueden resumirse en


```
If VOLT < VOLTUP THEN
    GoTo STAND_BY
Else
    GoTo POWER_ON
ENDIF
```

Saludos.

Ric.


----------



## Gerson strauss (Abr 18, 2019)

D@rkbytes dijo:


> La variable VOLT debe ser del tipo Byte si es que se usa el ADC a 8 bits. (0 a 255)
> Y debe ser del tipo Integer si es que el ADC va a 10 bits. (0 a 1023)
> Así que no tiene sentido que sea Float.
> 
> ...



¿No se puede usar float para guardar el valor del ADC a 10 bits? pero es que necesito los decimales. 

Pero probare a ver que pasa. Muchas gracias.


----------



## D@rkbytes (Abr 18, 2019)

Gerson strauss dijo:


> ¿No se puede usar float para guardar el valor del ADC a 10 bits?


De que se puede se puede, pero no tiene sentido y es un desperdicio de memoria.
El conversor AD entrega un valor comprendido entre 0 y 1023 (10 bits, sin decimales)
Por eso siempre se usa una variable Integer para leer el conversor y otras más para el proceso.
Incluso todo el proceso se puede realizar sin usar variables Float y aún así se pueden obtener los decimales.
Pero si se quiere usar Float por comodidad a costa del consumo de memoria, entonces debe limitarse su uso.
Mientras menos variables Float se puedan usar será mejor, y si con una sola se puede obtener el resultado, pues qué bien.

Siempre se debe tener la costumbre de ahorrar memoria aunque los programas sean pequeños o el microcontrolador muy grande.


----------



## Gerson strauss (Abr 18, 2019)

Usando word para VOLT, el programa redondea la cantidad de 1.6 a 2 ...y ahora la suma no es 2.0 sino 2.4


Usando float para VOLT, la suma es correcta. Funciona perfecto en Proteus, pero no en la realidad.


----------



## D@rkbytes (Abr 18, 2019)

Eso es porque no estás haciendo bien las cosas.

Adjunto un ejemplo.


----------



## Gerson strauss (Abr 18, 2019)

D@rkbytes dijo:


> Eso es porque no estás haciendo bien las cosas.
> 
> Adjunto un ejemplo.



Si, debe ser porque no he explicado lo que debe hacer el programa.

Se trata de hacer un circuito que desconecte un electrodoméstico, cuando este se encuentre en Standby,
con el fin de "ahorrar energía" y proteger el mismo.

Hago las pruebas con un televisor, el cual en standby me da un voltaje de 1.6v rectificados y 2.6v encendido, los cuales llevo
al ADC del micro (12f683).

Para ello están las 2 variables VOLT y VOLTUP. En la primera guardo el valor de 1.6v y creo un umbral sumando 0.4v para que la otra 
variable sea mayor, dando como resultado = 2.0v

Cuando el TV esta en standby, el programa espera 1 minuto y a la vez revisa el ADC por si aumenta el voltaje (para saber que el tv se encendió en medio de la espera) si no enciende, el RELE se desconecta y el TV queda sin energía.

Para reactivar todo, el programa queda en una rutina donde se lee un botón del control remoto; si este se presiona
el micro energiza el tv y se repite el ciclo nuevamente.

Cuando el televisor enciende, VOLT pasa de 1.6v a 2.6v superando a VOLTUP (2.0V) y el programa mantiene el RELE conectado.

En este momento lo tengo funcionando perfectamente, pero si le pongo valores fijos. Lo de usar las variables es porque, el micro 
ajustaría automáticamente el umbral al que debe trabajar, pues no es el mismo en todos los electrodomésticos.

Si dejo los valores fijos en el programa, tendría que ajustar el umbral para cada aparato ... lo cual seria muy incomodo y poco practico.

Gracias por el ejemplo, pero tampoco funciono.


----------



## ricbevi (Abr 18, 2019)

Gerson strauss dijo:


> ¿No se puede usar float para guardar el valor del ADC a 10 bits? pero es que necesito los decimales.
> 
> Pero probare a ver que pasa. Muchas gracias.



Que tiene que ver que necesites decimales si siempre el ADC es de 8, 10, etc bit. No sabe nada de decimales.

Necesitas decimales al momento de la conversión a valores no antes.

Si te da mal la cuenta algo estas haciendo mal seguramente como el error de la comparación cuando tu mismo programas que incrementan el valor de una variable, jamás este ultimo puede ser menor al valor que acabas de incrementar.

Te pase el código, aplica como lo lo publique y no puede haber problema.

Si quieres ayuda global debes publicar todo(programa, esquema, lo que pretendes, etc) lo que tienes y has hecho porque si no es un juego de sacar información con tirabuzón.


Gerson strauss dijo:


> Si, debe ser porque no he explicado lo que debe hacer el programa.
> 
> Se trata de hacer un circuito que desconecte un electrodoméstico, cuando este se encuentre en Standby,
> con el fin de "ahorrar energía" y proteger el mismo.
> ...



Si sabes que quieres comparar el valor a 2V para que quieres crear una variable, sólo compara con 2 y listo por un lado y para que quieres pasar a volt el valor del ADC.

Si quieres comparar y que haga algo cuando supere los 2V de la escala de 0-5V, comparas cuando llegue al valor 409 0 410 en la lectura del ADC serán tus 2V


```
Dim Volt as Word
......
......
Volt= ADIn 0
If Volt <= 409 then STANBY
......
......
```

Sin cuentas, demoras y complicaciones de decimales, etc. por parte del microcontrolador, la cuenta la haces tú una solo vez para saber el valor de corte que corresponde al ADC, comparas y tomas la decisión que corresponde.

Si necesitas que sea variable no hay problemas, crea una con valor Word, lees el ADC con el valor de referencia  y le sumas el valor correspondiente a la diferencia del ADC pero en valores redondos.
EJ: leiste 327(1.6V) le sumas 82(0.4V) y te da los 409(2V) que almacenas como límite de comparación.
Si lee 300, le sumas 82 y almacenar el resultado para ser comparado, etc, etc.

Los valores con comas solo se justifican si necesitas mostrar algo, a nivel de decisiones lógicas en este caso no son necesarios y los microcontroladores de bajos recursos no son tan buenos tratando con ellos en operaciones matemáticas. 

Ric.


----------



## Gerson strauss (May 13, 2019)

Hola a todos. Estoy entrenando con el PIC 16F1827 y es primer vez que lo uso. Hice un programa pequeño
con un led y un mensaje en un display lcd 2x16; el led funciona pero el mensaje no se muestra.
Quizás sea algún registro que causa  problema en los puertos, pues este PIC tiene "muchas funciones" en 
comparación con los PIC clásicos. Probé el programa con un  16f88 (con sus propios registros obviamente)
 y funciona.¿ Alguien sabe que pasa?

El display esta bueno.

Gracias de antemano.


```
Device = 16F1827
Reminders 0
Config1 FOSC_HS,WDTE_OFF,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,BOREN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_OFF,PLLEN_OFF,STVREN_OFF,LVP_OFF, 'FOSC_INTOSC
Reminders 1
Xtal 10
PortB_Pullups = OFF
'****************************************************************
'All_Digital = TRUE
TRISA = %00000000
TRISB = %00000000
OSCTUNE = %00000000
'OSCCON = %01101000 '4 Mhz
CM1CON0 = %00000000
CM1CON1 = %00000000
CM2CON0 = %00000000
CM2CON1 = %00000000
APFCON0 = %00000000
APFCON1 = %00000000
'**************************************************************
'ADC
Adin_Res = 10 
Adin_Tad = FRC
Adin_Stime = 50
FVRCON = %10000001 '1.024V
ADCON0 = %00000000
ADCON1 = %11110011'Vref interno
'****************************************************************
'DISPLAY LCD
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.2
LCD_ENPin = PORTB.3
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0
'****************************************************************
'SENSOR CAPACITIVO
CPSCON0 = %00000000
CPSCON1 = %00000000
'****************************************************************
'ALIAS
Symbol LED = PORTB.0
'****************************************************************
Cls
DelayMS 100
MAIN:
Print At 1,1,"PRUEBA DISPLAY"
Print At 2,1,"PIC 16F1827   "
High LED
DelayMS 200
Low LED
DelayMS 200
GoTo MAIN

End
```


----------



## ricbevi (May 13, 2019)

Adivinando por que no subiste la simulación y como esta el codigo no compila por que no usaste *Declare *antes de algunas declaraciones como las del LCD, etc seguramente te comiste llevar el *MCLR a +B *y lo tienes declarado en los fusibles que lo usas.

Después de las correcciones a tu codigo a mi me funciona en Proteus 7.9


----------



## Gerson strauss (May 13, 2019)

ricbevi dijo:


> Adivinando por que no subiste la simulación y como esta el codigo no compila por que no usaste *Declare *antes de algunas declaraciones como las del LCD, etc seguramente te comiste llevar el *MCLR a +B *y lo tienes declarado en los fusibles que lo usas.
> 
> Después de las correcciones a tu codigo a mi me funciona en Proteus 7.9



Ya incluí declare y hace lo mismo. No hice simulación pues uso un entrenador.
El MCLR esta bien. Si funciona el led es porque el micro esta funcionando.

Puede ser los fuses o el micro tiene algún puerto malo.

Gracias por la simulación ... seguiré probando.


----------



## ricbevi (May 13, 2019)

Si el led funciona es por que esta pasando por el sector de la impresión al LCD. Me inclino más por un error de conexión, alimentación del display, etc aunque nunca hay que descartar nada.

Los Declare son indispensables por que si no no genera el archivo hex para cargar al PIC(no compila).



Yo uso la version 3.6.2.1 y si bien figuran como aceptados y en el lugar pero se niega a compilar si no los pones, puede ser esta versión.

En tu versión de los fusibles es indispensable que el pin Nº4 este a +B o directo o mediante una resistencia de Pull-Up, en la que subi yo en el mensaje anterior esta modificado para que no sea necesario.


----------



## Gerson strauss (May 13, 2019)

Tengo la versión 3.5.2.7 y compila con o sin DECLARE. Las conexiones están bien, porque con
un PIC16F88 funciona utilizando los mismos pines para el LCD y el LED.
¡Encontré el problema!

Faltaba configurar los registros ANSELA y ANSELB ya que en este PIC el puerto B es
también análogo y digital.

Gracias.


```
Device = 16F1827
Reminders 0
Config1 FOSC_HS,WDTE_OFF,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,BOREN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_OFF,PLLEN_OFF,STVREN_OFF,LVP_OFF, 'FOSC_INTOSC
Reminders 1
Xtal 10
PortB_Pullups = OFF
'****************************************************************
'All_Digital = TRUE
TRISA = %00000000
TRISB = %00000000
OSCTUNE = %00000000
'OSCCON = %01101000 '4 Mhz
CM1CON0 = %00000000
CM1CON1 = %00000000
CM2CON0 = %00000000
CM2CON1 = %00000000
APFCON0 = %00000000
APFCON1 = %00000000
'**************************************************************
'ADC
Declare Adin_Res = 10 
Declare Adin_Tad = FRC
Declare Adin_Stime = 50
FVRCON = %10000001 '1.024V
ADCON0 = %00000000
ADCON1 = %11110011'Vref interno
ANSELA = %00000000
ANSELB = %00000000 
'****************************************************************
'DISPLAY LCD
Declare LCD_DTPin = PORTB.4
Declare LCD_RSPin = PORTB.2
Declare LCD_ENPin = PORTB.3
Declare LCD_Interface = 4
Declare LCD_Lines = 2
Declare LCD_Type = 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50
'****************************************************************
'SENSOR CAPACITIVO
CPSCON0 = %00000000
CPSCON1 = %00000000
'****************************************************************
'ALIAS
Symbol LED = PORTB.0
'****************************************************************
Cls
DelayMS 100
MAIN:
Print At 1,1,"PRUEBA DISPLAY"
Print At 2,1,"PIC 16F1827   "
High LED
DelayMS 200
Low LED
DelayMS 200
GoTo MAIN

End
```
Asi se ve en el entrenador.


----------



## D@rkbytes (May 13, 2019)

Gerson strauss dijo:


> Faltaba configurar los registros ANSELA y ANSELB ya que en este PIC el puerto B es
> también análogo y digital


Con All_Digital = TRUE ya lo tenías resuelto, pero comentaste esa instrucción.


----------



## Gerson strauss (May 13, 2019)

D@rkbytes dijo:


> Con All_Digital = TRUE ya lo tenías resuelto, pero comentaste esa instrucción.


Si, es cierto ... igual lo de ANSELB me hubiese dado problemas después. Gracias


----------



## Gerson strauss (May 25, 2019)

D@rkbytes dijo:


> La variable VOLT debe ser del tipo Byte si es que se usa el ADC a 8 bits. (0 a 255)
> Y debe ser del tipo Integer si es que el ADC va a 10 bits. (0 a 1023)
> Así que no tiene sentido que sea Float.
> 
> ...



Ya encontré el problema de este proyecto. Sucede que al encender el equipo a proteger (un TV en este caso) se genera un pico de corriente y después de un tiempo se estabiliza ... y como el PIC es muy rápido "captura" este valor, el cual era de unos 3 voltios y yo esperaba que fuera 1.6 (el valor del TV en stand by).

Para averiguarlo use la función MAX/MIN del multimetro ... y con esos 3v de referencia en lugar de 1.6v todas las matemáticas se alteraban y el programa no funcionaba como debería.

La solución fue entonces hacer un retardo de 12 segundos (no se si sea mucho tiempo) antes de leer el valor de stand by ... y ahora si guarda el valor correcto.


```
'********************************************
'Para eliminar el pico de corriente al inicio
DelayMS 300
High RELE
For CUENTAS = 0 To 11
DelayMS 1000
Next
Clear CUENTAS
'********************************************
CAPTURA:
For CUENTAS = 0 To 9
VOLT = ADIn 0
DelayUS 50
ACUMVOLT = ACUMVOLT + VOLT
Next
ACUMVOLT = ACUMVOLT / 10
ACUMVOLT = ACUMVOLT / 204.8
VOLTUP = ACUMVOLT + 0.300
Clear CUENTAS
Clear ACUMVOLT
Clear VOLT
```

Ahora todo funciona perfectamente; muchas gracias a todos por la ayuda.


----------



## Gerson strauss (Nov 9, 2019)

Hola. Ahora tengo un problema con el PIC12F1822 ... y es que configuro el PIC para hacer una conversión A/D, pero en el AN0  aparece un voltaje de 0.6v y en AN1  otro de 1.4v cuando debería ser cero. Los  pines están como análogos y como entradas.

Supongo que estoy configurando mal algún registro, porque este PIC tiene varias funciones (ADC, DAC, CPS, PWM etc). Dejo la configuración de los registros. Gracias.


```
Device = 12F1822
Reminders = OFF
Config1 FOSC_INTOSC,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_OFF,PLLEN_OFF,STVREN_OFF,LVP_OFF
Reminders = On
Xtal 4
'*********************************************
'DECLARACIONES
'*********************************************
Declare Adin_Res = 10 'Resolución ADC=10 bits
Declare Adin_Stime = 50
'****************************************
'CONFIGURACION DE REGISTROS
'***************************************
OSCCON = %01101010 ' 4mhz Osc interno.
OSCTUNE = %00000000                                
CM1CON0 = %00000000 'Comparador apagado
CM1CON1 = %00000000
PIE1 = %00000000
PIE2 = %00000000
PIR1 = %00000000
PIR2 = %00000000
PORTA = %00001011 '0,1,3 como entradas
ANSELA = %00000011 '0,1 entradas analogas
ADCON0 = %00000011
ADCON1 = %10110011 'FRC
FVRCON = %10000011 'VREF = 4.096V
WDTCON = %00000000 'Watchdog timer
DACCON0 = %00000000
DACCON1 = %00000000
T1CON = %00000000
CPSCON0 = %00000000
CPSCON1 = %00000000
SRCON0 = %00000000
SRCON1 = %00000000
APFCON = %00000000
BAUDCON = %00000000
LATA = %00000000
WPUA = %00000000
OPTION_REG = %10000000
INTCON = %00000000
```


----------



## D@rkbytes (Nov 15, 2019)

No entiendo para qué configuras tantos registros que no vas a utilizar.
Si únicamente quieres usar el ADC, configura nada más los registros involucrados.
Así se use o no el ADC, cuando un pin es configurado como entrada, el voltaje que aparezca en él es debido a un factor externo.


----------



## Gerson strauss (Nov 16, 2019)

D@rkbytes dijo:


> No entiendo para qué configuras tantos registros que no vas a utilizar.
> Si únicamente quieres usar el ADC, configura nada más los registros involucrados.
> Así se use o no el ADC, cuando un pin es configurado como entrada, el voltaje que aparezca en él es debido a un factor externo.



Hola. Configuro todos esos registros  buscando resolver el problema. El voltaje aparece con los pines al aire sin conectar nada en ellos y el ADC lo lee. En ese programa falta TRISA que confundí con PORTA, pero al configurar todo bien el problema aun continua. Gracias.


----------



## D@rkbytes (Nov 16, 2019)

Estando un pin sin conexión cualquier carga estática lo cargará con un voltaje parásito.
Siempre es necesario que el pin tenga una conexión externa a algo.
Es una prueba absurda medir el voltaje en un pin configurado como entrada análoga.
Hasta en una que sea digital lo sería, siempre y cuando no esté configurada alguna resistencia pull-up interna.


----------



## Gerson strauss (Nov 16, 2019)

D@rkbytes dijo:


> Estando un pin sin conexión cualquier carga estática lo cargará con un voltaje parásito.
> Siempre es necesario que el pin tenga una conexión externa a algo.
> Es una prueba absurda medir el voltaje en un pin configurado como entrada análoga.
> Hasta en una que sea digital lo sería, siempre y cuando no esté configurada alguna resistencia pull-up interna.



Si, pero el problema es que por ejemplo ingreso un voltaje de 3v en la entrada AN1 y el PIC lo que mide es 1.4v. Si mido el voltaje con el pin conectado no hay 3v sino 1.4v. Con un PIC 12F683 si funciona (el mismo programa y el pin mide 0v en lugar de 1.4v...osea bien). Lo que quiero es usar el voltaje de referencia interno 1.024v que no lo tiene el 12f683.


----------



## D@rkbytes (Nov 16, 2019)

Dependiendo de la configuración del ADC y de la fórmula usada, podrá decir cualquier cosa.
El cómo estás realizando la conversión, no lo sabemos.


----------



## Gerson strauss (Nov 17, 2019)

D@rkbytes dijo:


> Dependiendo de la configuración del ADC y de la fórmula usada, podrá decir cualquier cosa.
> El cómo estás realizando la conversión, no lo sabemos.



Lo que estoy haciendo es intentar migrar un programa que* funciona bien* en un 12f683 a un 12f1822 ¿por que? porque quiero usar el voltaje de referencia interno (1.024) de ese PIC.

¿Para que? para mejorar la resolución del ADC. En el 12F683 el VREF esta conectado a VDD (3v) ...entonces tengo pasos de 3mv en el ADC.
Si usara el 12f1822 con VREF interno de 1.024v ... tendría pasos de 1mv en el ADC. No puedo usar VREF externo porque todos los pines están ocupados. El voltaje máximo que ingresa al ADC es de 800mv aprox.

¿Cual es el problema? en el PIC 12F1822 aparece un voltaje parásito de 0.6v en AN0 y 1.4v en AN1 con los pines al aire; esto hace funcionar mal todo el programa. Todo ese problema no ocurre en el 12f683.

¿Por que no subo el programa? porque es de un circuito comercial (más de 300 unidades vendidas) entonces cualquiera lo tendría ... y adiós ingresos!


----------



## D@rkbytes (Nov 17, 2019)

Bueno, el hecho de que sea un programa comercial no es para que no puedas publicar únicamente lo solicitado.
Pero viendo que se te complica, para mí no es ningún inconveniente subir un ejemplo.
Esto es con el fin de que le pueda servir a varias personas.

No hay dificultad alguna para lograr que un microcontrolador funcione correctamente, todo está en la hoja de datos.

PD: En este Foro he publicado cientos de ejemplos que usan partes de mis programas comerciales.


----------



## Gerson strauss (Nov 20, 2019)

D@rkbytes dijo:


> Bueno, el hecho de que sea un programa comercial no es para que no puedas publicar únicamente lo solicitado.
> Pero viendo que se te complica, para mí no es ningún inconveniente subir un ejemplo.
> Esto es con el fin de que le pueda servir a varias personas.
> 
> ...



Finalmente encontré el problema. Probé su programa y ocurrió lo mismo (voltaje parásito en AN0 y AN1) ... ya cansado de todo, empece a sospechar 
de la fuente de alimentación (es casera pero nunca había dado problemas) coloque una batería de 9v y puse una resistencia de 100 ohm para alimentar un zener de 2.7v   y llevar ese voltaje al PIC. Medí y esta vez todo funciono correctamente; las entradas analógicas ya miden 0.00v y el programa funciona bien. 

CONCLUSIÓN: El problema es la fuente de alimentación (es como si la tierra no estuviera o esta de forma parcial) ¿?
El programa siempre estuvo bien, pues mire la datasheet muchas veces (cada registro) la verdad hice muchas cosas
antes de preguntar aquí. La migración del 12f683 al 12f1822 fue un éxito, después de muchas horas de pruebas.

Gracias por su ayuda D@rkbytes ... y lamento mucho lo de "circuito comercial" se que hiere muchas susceptibilidades en este foro.
Solo quería proteger mi esfuerzo y pues es una lastima que se entienda de otra manera.


----------



## Dr. Zoidberg (Nov 20, 2019)

Gerson strauss dijo:


> Solo quería proteger mi esfuerzo y pues es una lastima que se entienda de otra manera.


El problema es precisamente ese: vos queres proteger tu esfuerzo a costa del esfuerzo "gratuito" de quienes colaboran en el foro. Te parece correcto???

Lo lógico sería que contrataras a alguien que resolviera tu problema con un convenio de confidencialidad de por medio...y claro...pagando lo que sea que cobre.
Así trabajan las empresas para las que yo he brindado servicios, y nadie se pone mal ni se ofende: negocios son negocios....pero para todos.


----------



## Gerson strauss (Nov 20, 2019)

Dr. Zoidberg dijo:


> El problema es precisamente ese: vos queres proteger tu esfuerzo a costa del esfuerzo "gratuito" de quienes colaboran en el foro. Te parece correcto???
> 
> Lo lógico sería que contrataras a alguien que resolviera tu problema con un convenio de confidencialidad de por medio...y claro...pagando lo que sea que cobre.
> Así trabajan las empresas para las que yo he brindado servicios, y nadie se pone mal ni se ofende: negocios son negocios....pero para todos.



Pero si yo hice el programa y solo tenia una duda y ademas mostré la parte en donde considere que estaba el problema ... y al final yo encontré la solución sin ayuda de nadie. No crees que eres algo exagerado en la apreciación de las cosas? 

No busques problemas donde no los hay ... jamas exijo que alguien me de una respuesta. Si D@rkbytes regala sus códigos, es decisión de el.


----------



## Dr. Zoidberg (Nov 20, 2019)

Gerson strauss dijo:


> No crees que eres algo exagerado en la apreciación de las cosas?


Vos fuiste quien se quejó de la situacion. A mi me importa tres pepinos...directamente no colaboro si la consulta se trata de un producto comercial.


Gerson strauss dijo:


> jamas exijo que alguien me de una respuesta.


Entonces para que creas el tema y posteas una consulta???


----------



## Gerson strauss (Nov 20, 2019)

Dr. Zoidberg dijo:


> Vos fuiste quien se quejó de la situacion. A mi me importa tres pepinos...directamente no colaboro si la consulta se trata de un producto comercial.


Si no le importa entonces para que se mete.



Dr. Zoidberg dijo:


> Entonces para que creas el tema y posteas una consulta???


Para que el que quiera y por su propia voluntad responda.


----------



## Dr. Zoidberg (Nov 20, 2019)

Gerson strauss dijo:


> Si no le importa entonces para que se mete.


Por que no violo ninguna regla y por que me gusta armar despelote exponiendo a los "vivos" del foro. Está mal???



Gerson strauss dijo:


> Para que el que quiera y por su propia voluntad responda.


Aaaahhhhhh.....y por eso no decis nada de lo "comercial" ni mostras nada del problema y los que quieren colaborar tienen que adivinar ??
No entiendo...


----------



## Gerson strauss (Nov 20, 2019)

Dr. Zoidberg dijo:


> Por que no violo ninguna regla y por que me gusta armar despelote exponiendo a los "vivos" del foro. Está mal???


Yo vivo y usted loco ... ahhhh!!


Dr. Zoidberg dijo:


> Aaaahhhhhh.....y por eso no decis nada de lo "comercial" ni mostras nada del problema y los que quieren colaborar tienen que adivinar ??
> No entiendo...


No busque que fuera comercial, solo lo instale en mi carro y luego a otros le gustaron... y si puedo ganar dinero pues no tiene nada de malo.
Yo no pedí que me hicieran un programa para vender; yo lo hice solo ... luego tuve una duda y consulte. No veo el problema.
El foro también es comercial porque tiene publicidad y gana dinero con los temas creados por los miembros.


----------



## gevv (Ene 31, 2021)

Hola,

Nuevo sitio web oficial  Proton IDE: *Proton BASIC Community*


----------



## lahmun (Oct 24, 2021)

D@rkbytes dijo:


> No. En el PIC16F887, los registros involucrados para definir que un pin debe ser análogo, son los registros ANSEL y ANSELH.
> (Y esto es nada más para los puertos con ADC)
> Colocando un 1 en el bit 7 de ADCON1, lo que se hace es declarar una justificación hacia la derecha en el resultado de la conversión.
> 
> ...


Hola D@rkbytes,
¿Puede convertirlo de PIC16F887 a cómo usar PIC16F877A? Lo que necesito cambiar.
​


----------



## D@rkbytes (Oct 25, 2021)

lahmun dijo:


> Hola D@rkbytes,
> ¿Puede convertirlo de PIC16F887 a cómo usar PIC16F877A? Lo que necesito cambiar.


Si lo hago yo, no vas a aprender, pero si lees la hoja de datos, sí que lo harás.


----------



## lahmun (Oct 25, 2021)

D@rkbytes dijo:


> Si lo hago yo, no vas a aprender, pero si lees la hoja de datos, sí que lo harás.


Hola,
El principal problema para mí y podría ser para todos aquí no es un experto como tú, no es muy hábil para leer una hoja de datos, así que lo que quiero decir, espero que puedas explicar aquí los detalles sobre el ADC del procesador PIC16F877A, lo veré como lo describe Así que de ti o aquí podría ser, lo entiendo.


----------



## DOSMETROS (Oct 25, 2021)

También podrías leerlo varias veces , tratar de ir entendiendo y hacer consultas puntuales y específicas , sino suena cómo muy cómodo


----------



## carptroya (Nov 24, 2021)

*H*ola a todos, tengo un problema y la verdad no consigo solucionarlo*, *os cuento.
*H*e realizado un programa para leer los datos de un gps ( solo altitud y longitud) y mostrarlo en una lcd.
*E*st*á* realizado en un 18f4550 ( adjunto programa y simulaci*ó*n en *P*roteus).
*E*l problema es que lo quiero pasar a un 18f2550 y no soy capaz (dejo tambien programa y simulaci*ó*n en *P*roteus)

*C*ódigo del 4550

```
Device = 18F4520

        Xtal = 4

 All_Digital = true

Declare Hserial_Baud  = 9600         
Declare Hserial_RCSTA = %10010000     
Declare Hserial_TXSTA = %00100100     
Declare Hserial_Clear = On             

Declare LCD_Type = 0     
Declare    LCD_DTPin        PORTB.0
Declare    LCD_RSPin        PORTB.4
Declare    LCD_ENPin        PORTB.5
Declare LCD_Lines        2
Declare LCD_Interface    4

TRISB = 0

Dim latitud As String *8
Dim longitud As String *9
Dim valido As String *1
Cls

DelayMS 10

    inicio:
    Cls
    DelayMS 100
    Print At 1,1,"    buscado"
    Print At 2,1,"    satelite"
    HSerIn [Wait( "$GPGGA" ),skip 37 ,Str valido]
    If Val(valido,Dec)<>1 Then GoTo inicio

    programa:

    DelayMS 100
    'Espera hasta Recibir $GPGGA lo que venga detras es guardado en las variables: latitud,longitud
    HSerIn [Wait( "$GPGGA" ),skip 12 ,Str latitud,skip 3 ,Str longitud]

    Print At 1,1,Str latitud,"  Latitud"
    Print At 2,1,Str longitud," Longitud"
    
    DelayMS 100     

    GoTo programa
```
Código del 2550

```
Device = 18F2550

Xtal 4

Config_Start
 PLLDIV = 1    ;No prescale (4 MHz oscillator input drives PLL directly)
 CPUDIV = OSC4_PLL6    ;[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
 USBDIV = 1    ;USB clock source comes directly from the primary oscillator block with no postscale
 FOSC = XT_XT    ;HS oscillator (HS)
 FCMEN = OFF    ;Fail-Safe Clock Monitor disabled
 IESO = OFF    ;Oscillator Switchover mode disabled
 PWRT = OFF    ;PWRT disabled
 BOR = OFF    ;Brown-out Reset disabled in hardware and software
 VREGEN = OFF    ;USB voltage regulator disabled
 WDT = OFF    ;WDT disabled (control is placed on the SWDTEN bit)
 PBADEN = OFF    ;PORTB<4:0> pins are configured as digital I/O on Reset
 LPT1OSC = OFF    ;Timer1 configured for higher power operation
 MCLRE = OFF    ;RE3 input pin enabled; MCLR pin disabled
 STVREN = OFF    ;Stack full/underflow will not cause Reset
 LVP = OFF    ;Single-Supply ICSP disabled
 XINST = OFF    ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
 Debug = OFF    ;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

    All_Digital = true

Declare Hserial_Baud  = 9600         
Declare Hserial_RCSTA = PORTC.7     
Declare Hserial_TXSTA = PORTC.6     
Declare Hserial_Clear = On             

Declare LCD_Type = 0     
Declare    LCD_DTPin        PORTB.0
Declare    LCD_RSPin        PORTB.4
Declare    LCD_ENPin        PORTB.5
Declare LCD_Lines        2
Declare LCD_Interface    4

TRISB = 0
'trisc = 1

Dim latitud As String *8
Dim longitud As String *9
Dim valido As String *1

Cls

DelayMS 100

inicio:
Cls

DelayMS 500

Print At 1,1,"    buscado"
Print At 2,1,"    satelite"

HSerIn [Wait( "$GPGGA" ),skip 37 ,Str valido]

If Val(valido,Dec)<>1 Then GoTo inicio

programa:
DelayMS 500
    'Espera hasta Recibir $GPGGA lo que venga detras es guardado en las variables: latitud,longitud
HSerIn [Wait( "$GPGGA" ),skip 12 ,Str latitud,skip 3 ,Str longitud]

Print At 1,1,Str latitud,"  Latitud"
Print At 2,1,Str longitud," Longitud"

DelayMS 500     

GoTo programa
```
*G*racias.


----------



## D@rkbytes (Nov 24, 2021)

carptroya dijo:


> *E*st*á* realizado en un 18f4550 ( adjunto programa y simulaci*ó*n en *P*roteus).
> *E*l problema es que lo quiero pasar a un 18f2550 y no soy capaz (dejo tambien programa y simulaci*ó*n en *P*roteus)


El PIC18F2550 es idéntico en hardware al PIC18F4550, solo que no tiene el puerto D ni el E y tampoco SPP, pero no lo estás usando.
Así que solo es cuestión de usar los puertos disponibles, porque en fuses y registros internos es igual.


----------



## ricbevi (Nov 24, 2021)

D@rkbytes dijo:


> El PIC18F2550 es idéntico en hardware al PIC18F4550, solo que no tiene el puerto D ni el E
> Así que solo es cuestión de usar los puertos disponibles, porque en fuses y registros internos es igual.


Sí, efectivamente verifique eso porque probé y realmente en la simulación no funciona la comunicación por el puerto serie( para poder colaborar).

Realmente no se si es un problema del Ares en la simulación o realmente hay algo que se me escapa...se queda esperando en lazo en la linea


```
HSerIn [Wait( "$GPGGA" ),skip 37 ,Str valido]
```

Como si nunca recibiera dicha cadena de caracteres pese a que la terminal virtual recibe perfectamente y la simulación con el 18F4520 también funciona perfectamente.

Como decimos por aquí "un real ministerio" 

Saludos.


----------



## D@rkbytes (Nov 24, 2021)

El programa para el supuesto 18F4550 dice: Device = 18F4520 
Y no tiene palabra de configuración.


----------



## ricbevi (Nov 24, 2021)

La simulación y la compilación de Protón subida dice 18F4520 y funciona perfectamente.

Cambiando el micro por el susodicho 18F2550, agregando los fusibles que me parecieron correctos( no se si esto es así ya que nunca trabaje/estudie la serie 18) no funciona la comunicación serie(al menos en la recepción.

Realice al vuelo unas modificaciones a lo subido para probar si era problemas de puerto serie y efectivamente solo recibe "0"

```
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2021 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 24/11/2021                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

        Device = 18F2550
        Xtal = 4
        

Config_Start
PLLDIV = 1 ;No prescale (4 MHz oscillator input drives PLL directly)
CPUDIV = OSC4_PLL6 ;[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
USBDIV = 1 ;USB clock source comes directly from the primary oscillator block with no postscale
FOSC = HS  ;HS oscillator (HS) XT_XT
FCMEN = OFF ;Fail-Safe Clock Monitor disabled
IESO = OFF ;Oscillator Switchover mode disabled
PWRT = OFF ;PWRT disabled
BOR = OFF ;Brown-out Reset disabled in hardware and software
VREGEN = OFF ;USB voltage regulator disabled
WDT = OFF ;WDT disabled (control is placed on the SWDTEN bit)
PBADEN = OFF ;PORTB<4:0> pins are configured as digital I/O on Reset
LPT1OSC = OFF ;Timer1 configured for higher power operation
MCLRE = OFF ;RE3 input pin enabled; MCLR pin disabled
STVREN = OFF ;Stack full/underflow will not cause Reset
LVP = OFF ;Single-Supply ICSP disabled
XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
Debug = OFF ;Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
Config_End

 All_Digital = true 
        
            


Declare Hserial_Baud = 9600 ' velocidad del puerto serie
Declare Hserial_RCSTA 144
Declare Hserial_TXSTA 36
Declare Hserial_Clear = On           

Declare LCD_Type = 0       
Declare    LCD_DTPin        PORTB.0
Declare    LCD_RSPin        PORTB.4
Declare    LCD_ENPin        PORTB.5
Declare LCD_Lines        2
Declare LCD_Interface    4

TRISB = 0

Dim latitud As String *8
Dim longitud As String *9
Dim valido As String *1
Dim tes As Byte

Cls
DelayMS 10

    inicio:
    
    'Cls
    DelayMS 100
    Print At 1,3,"    buscado"
    Print At 2,1,"    satelite"
    HSerIn 100,[ tes ]'[Wait( "$GPGGA" ),skip 37 ,Str valido]
    Toggle PORTB.7
   ' If Val(valido,Dec)<>1 Then GoTo inicio
      
    programa:
  
    DelayMS 100
    'Espera hasta Recibir $GPGGA lo que venga detras es guardado en las variables: latitud,longitud
      
   ' HSerIn [Wait( "$GPGGA" ),skip 12 ,Str latitud,skip 3 ,Str longitud]
    
        
    Print At 1,1, Dec tes'valido'Str latitud,"  Latitud"
    Print At 2,1,Str longitud," Longitud"
    DelayMS 100       
    
    'GoTo programa
   GoTo inicio
```

Como para verificar que pasa por la instrucción de recepción y lo que "recibe" lo pone en linea 1, posición 1 e invariablemente muestra "0"

Hay algo en la configuración del puerto/fusibles, etc que se me escapa.


----------



## D@rkbytes (Nov 24, 2021)

ricbevi dijo:


> Hay algo en la configuración del puerto/fusibles, etc que se me escapa.


Los fuses no son correctos para FOsc = 4 Mhz. (Usa cristal)

Yo usaría esta para 4 MHz usando el oscilador interno, aunque preferiría usar los 8 MHz.

```
Config_Start
    PLLDIV = 1, CPUDIV = OSC1_PLL2, USBDIV = 1
    FOSC = INTOSC_XT
    FCMEN = OFF, IESO = OFF, PWRT = On
    VREGEN = OFF, WDT = OFF, PBADEN = OFF, LVP = OFF
Config_End
```


----------



## carptroya (Nov 25, 2021)

Gracias por responder.

D@rkibytes , tienes razón el archivo .rar no corresponde con el nombre del micro(18f4520), fue un error al ponerle el nombre.

En el código del 18f4520 no hizo falta la configuración para poder simularlo y funciona bien.

En el código del 18f2550 si no lo configuro NO funciona ni la lcd, use tu configuración y tampoco funciona.



Ricbevi , tienes razón, yo creo también que es problema de configuración( me tiene loco del todo el 18f2550).

Saludos y gracias.


----------



## Scooter (Nov 25, 2021)

Creo que deberías de empezar por algo muy simple para verificar detalles del programador, etc e ir descartando.
Conforme empiecen las cosas a funcionar vas añadiendo cosas.


----------



## ricbevi (Nov 25, 2021)

Es lo que hice Scooter

E l programa original es extremadamente simple, imprime leyenda en pantalla, espera entrada por el puerto serie de una cierta cadena de caracteres que usa como referencia, salta una serie de posiciones en la cadena recibida, extrae el dato y lo muestras en las líneas del LCD.

Reforme el programa para que en un lazo cerrado solo reciba un byte del puerto serie y lo muestre en la primera linea del display sin esperar ninguna cadena en especial de caracteres y siempre muestra "0" por lo que deduje que el problema esta en el puerto serie. 

La configuración básica del emisor y el receptor esta bien en cuanto a la velocidad, etc (de echo con el otro modelo de PIC funciona correctamente), el problema se plantea al seleccionar este modelo.

Dada esta circunstancia me inclinaba por pensar que la falla proviene de la configuración de algún fusible del PIC o la UART o falla directamente el modelo simularle en Ares. 

Acabo de probar y con los pic mas grandes funciona perfectamente con la configuración por defecto de los fusibles del PIC en Proton (Ej:18F4550, 18F46K20 ) pero con la misma familia 18F4455,18F2455 y 18F2250 ni siquiera arranca el programa si no se programa los fusibles.


----------



## carptroya (Dic 4, 2021)

Bueno, de momento dejare este proyecto parado hasta que consiga los gps, luego vere en real lo que ocurra.
En estos dias estube haciendo lo mismo(18f2550) en mikroc(el codigo no es mio, solo modifique algunas cosas) y simularlo en proteus.
 Lo dejo por si alguno lo quiere ver.

Saludos a todos


----------



## lahmun (May 1, 2022)

Hola miembro,
Encontré este código en este foro, estoy interesado en usarlo para mi protector de altavoces.
Lo que necesito, una vez que este voltaje de entrada sea superior a 2 V, entonces el LED estará alto o alto, pero necesito que antes de que el LED esté alto (arriba), parpadee unos segundos y luego permanezca alto, y una vez que el voltaje de entrada sea más bajo entonces el led debe ir hacia abajo.
Intenté esto para agregar un poco de retraso, funciona bien, pero el problema es que cuando le doy un voltaje más bajo, el LED sigue subiendo.
Así que por favor ayuda.

Gracias,
Lahmun.

```
;*******************************************************************************
; Programa: Main.bas
; Versión: 1.0
; Autor: D@rkbytes
; Compañia: Digitek
; Correo: 
; Notas: Comparación de resultado Float
;*******************************************************************************
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Symbol LED = GPIO.2         ; Pin de salida para un LED
    Dim Volt As Word
    Dim VoltUp As Float
   
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
   
    SerOut GPIO.5, 84, [0x00]   ; Iniciar RS-232 por software
    DelayMS 100

Programa:
    While 1 = 1
        Volt = ADIn 0
        VoltUp = (Volt * 5.0) / 1023
       
        If VoltUp < 2.0 Then
             
            GoSub StandBy
        Else
            GoSub PowerOn
           
        End If
        ; Descomentar para depuración:
        SerOut GPIO.5, 84, [#VoltUp, 13, 10]
        DelayMS 250
    Wend
   
 
   
StandBy:
    Low LED
    Return

PowerOn:
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    DelayMS 250
    Low LED
    DelayMS 250
    High LED
    'Return
 
   End
```


----------



## D@rkbytes (May 1, 2022)

lahmun dijo:


> el problema es que cuando le doy un voltaje más bajo, el LED sigue subiendo.


Eso se resuelve usando una bandera.

Ejemplo:

```
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Dim ADC_In As Word          ; Variable para almacenar el valor del ADC
    Dim b As Byte
    Dim Flag_High As Bit        ; Bandera de estado alto.
    Clear Flag_High             ; Iniciar en 0
    ; Descomentar si se usará depuración RS-232
    ;Symbol Tx_Pin = GPIO.5      ; Pin de salida serial RS-232
    
    Symbol LED = GPIO.2         ; Pin de salida para el LED
  
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
    
    ; Descomentar si se usará depuración RS-232
    ;SerOut Tx_Pin, 84, [0x00]   ; Iniciar RS-232 por software @ 9600 Bps.
    DelayMS 100
    

Programa:
    While 1 = 1
        ADC_In = ADIn 0
        ; (ADC_In / VRef) * Resolución ADC
        ; (2.0 / 5.0) * 1023 = 409.2
        If ADC_In > 409 Then
            If Flag_High = 0 Then
                Flag_High = 1
                GoSub PowerOn
            End If
        Else
            Flag_High = 0
            GoSub StandBy
        End If
        ; Descomentar si se usará depuración RS-232
        ;SerOut Tx_Pin, 84, [#ADC_In, 13, 10]
        ;DelayMS 250
    Wend
  
 
StandBy:
    Low LED
    
    Return

PowerOn:
    For b = 1 To 4
        High LED
        DelayMS 250
        Low LED
        DelayMS 250
    Next
    
    High LED
    
    Return
 
    End
```


----------



## lahmun (May 1, 2022)

D@rkbytes dijo:


> Eso se resuelve usando una bandera.
> 
> Ejemplo:
> 
> ...



Hola D@rkbytes
Probé su código en mi simulador, wow, funcionó perfectamente, así como esperaba.
Muchas gracias.


Gracias,
Lahmun.


----------



## lahmun (May 13, 2022)

lahmun dijo:


> Hola D@rkbytes
> Probé su código en mi simulador, wow, funcionó perfectamente, así como esperaba.
> Muchas gracias.
> 
> ...





D@rkbytes dijo:


> Eso se resuelve usando una bandera.
> 
> Ejemplo:
> 
> ...


Hola D@rkbytes ,
Que tu código funcione bien para mí.
Hice un poco para aumentar el led para que esté encendido, una vez que el led principal está encendido.
Así que agrego 3 pines más (3-5-6) como pin de salida.
Mi plan es, si el pin 2 está alto (yo mido es 3,86 voltios) luego de parpadear unos segundos, el pin 2 y 3-5-6 están altos) entonces si el pin 2 se vuelve de voltaje más bajo (dilo en la medida 1,7 Vdc o menos que, el pin 3-5-6 también se apaga)


```
Symbol LED = GPIO.2         'Output pin for the LED
    Symbol BOARD_LED = GPIO.1      'Output pin for mainboard
    Symbol RELAY = GPIO.4                'Output pin for the RELAY
    Symbol TRANSISTOR = GPIO.5     'Output pin for the TRANSISTOR
```


```
'(ADC_In / VRef) * Resolution of ADC
         '(1.7 / 5.0) * 1023 = 347,8    = This calculate for 1.7 Volt Input
         '(2.0 / 5.0) * 1023 = 409.2    = This calculate for 2 Volt Input
         '(3.0 / 5.0) * 1023 = 613.8    = This calculate for 3 Volt Input
         '(3.9 / 5.0) * 1023 = 797.4    = This calculate for 3.9 Volt Input 
         '(4.0 / 5.0) * 1023 = 818.4    = This calculate for 4 Volt Input
        
        'If ADC_In > 409 Then        'If Input Voltage 2 Volt (409) then
        If ADC_In > 797 Then        'If Input Voltage 3.93 Volt (799.4) then
```


```
PowerOn:
    For b = 1 To 4
        High LED
      '' DelayMS 250
      ''Low LED
      '' DelayMS 250
        
    Next
    'Low LED
    'DelayMS 50
    High BOARD_LED
    'High LED
    DelayMS 50
    High RELAY
    DelayMS 50
    High TRANSISTOR
    Return
    End
```
Lo que quiero decir es cuando

```
Symbol LED = GPIO.2         ; Pin de salida para el LED
```
Es alto moverse alrededor de 3.0 voltios luego otro led

```
Symbol BOARD_LED = GPIO.1      'Output pin for mainboard
 Symbol RELAY = GPIO.4          'Output pin for the RELAY
 Symbol TRANSISTOR = GPIO.5     'Output pin for the TRANSISTOR
```
Llegar alto, pero si led

```
Symbol LED = GPIO.2         ; Pin de salida para el LED
```
Se vuelve baja o digamos obtener 1.7 Vdc, entonces toda la led

```
Symbol BOARD_LED = GPIO.1      'Output pin for mainboard
Symbol RELAY = GPIO.4          'Output pin for the RELAY
Symbol TRANSISTOR = GPIO.5     'Output pin for the TRANSISTOR
```
También volverse bajo o standby

Lo intenté varias veces pero no funciona, 3 led no es el led principal que siempre sube una vez que el led principal GPIO.2 se vuelve más bajo.

Gracias,
Lahmun


----------

