[Tutorial] y manejo de Proton IDE

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.
 
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.
 

Adjuntos

  • teclado y lcd.rar
    64.5 KB · Visitas: 146
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.
 

Adjuntos

  • 18F4550 Teclado 3x4.rar
    17.9 KB · Visitas: 179
  • PIC18F4550 Fuse Defs.tXt
    8.2 KB · Visitas: 133
Última edición:
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.
 
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
 
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.
 

Adjuntos

  • 16F887 LED_Dimmer.rar
    39.1 KB · Visitas: 198
Última edición:
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.
 
Última edición:
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.
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.
 
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?
 
Última edición:
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.
 
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.

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....
 
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:

Código:
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
 

Adjuntos

  • ALEATORIO.rar
    14.3 KB · Visitas: 95
  • ALEATORIO.txt
    2.3 KB · Visitas: 51
Última edición:
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.
 
Última edición:
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
 
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...
Código:
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.
 
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.....
 
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.
 
Última edición:
Atrás
Arriba