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

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #345 en: 02 de Abril de 2008, 19:28:22 »
El programa:

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #346 en: 02 de Abril de 2008, 20:25:21 »
Y aqui queda el video del ejemplo anterior:

Saludos desde Granada, España.

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #347 en: 02 de Abril de 2008, 21:24:09 »
Excelente aplicacion del modulo ccp1 para el pic16f88.
Solo una observacion  :mrgreen: el modo de disparo especial que activa el adc es el ccp2 en la serie p16F8xxx.
Bonita la tarjeta me tendre que hacer una tambien  :mrgreen:
Saludos


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #348 en: 03 de Abril de 2008, 07:20:47 »
Hola pana, el PIC16F88 solo tiene un modulo CCP, que se llama CCP1.
Al tener solo un modulo con nombrarlo como CCP seria lo correcto
pero el datasheet del micro lo nombra siempre como CCP1.
Saludos desde Granada, España.

Desconectado Oso57

  • PIC10
  • *
  • Mensajes: 2
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #349 en: 03 de Abril de 2008, 13:28:42 »

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

Les agradeceré enoermemente su respuesta.

Saludos del Oso.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #350 en: 03 de Abril de 2008, 13:44:07 »
Hola!

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

Saludos! :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Oso57

  • PIC10
  • *
  • Mensajes: 2
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #351 en: 03 de Abril de 2008, 13:52:57 »
Gracias aitopes... efectivamente así es... el que sabe, sabe... :D

Saludos... sigo aprendiendo  :)

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #352 en: 03 de Abril de 2008, 20:54:48 »
Que tal amigos!
Dogflux lo que coloque arriba es porque los pic16f877, por ejemplo, utilizan el modulo ccp2 para el disparo especial que activa el adc  :mrgreen:

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

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

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #353 en: 04 de Abril de 2008, 10:46:03 »
Hola pana Ralf

La observación no iba para ti pana Ralf, pero como lo escribí sin tiempo desde el trabajo me salió mal expresado el post. :D
Saludos desde Granada, España.

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #354 en: 04 de Abril de 2008, 17:40:30 »
No hay problema mi estimado amigo!   :mrgreen:

Saludos

Desconectado alejhandr0

  • PIC10
  • *
  • Mensajes: 2
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #355 en: 07 de Abril de 2008, 01:28:28 »
Hola amigos, soy un NOVATO con los pic pero entiendo de electronica, tengo una inquietud..
 Experimentando mucho con lo que he leido aqui y alla, modifique varios programas  para realizar uno propio de un VOLTIMETRO simple para el automovil utilizando  un pic y tres display de 7 segmentos (13,8), con la entrada en RA0 analogico (0 a 5V) donde con un divisor de tension redusco los 13.8V a 1.38V para aplicarlo a la entrada RA0.
El problema es que para el 16F88 me corre el programa, simula perfecto con el IDE v6.40 y me funciona, pero para adaptarlo a otro similar como el 16F628A al compilar me produce un ERROR en la linea:
 ANSEL = %00000001 'RA0 analogico..
Para este pic como seria la linea¿? Veo que aqui la mayoria utiliza el 12F88 pero quiero experimentar con varios PIC para aprender.. He procurado leer todo lo relacionado con el comado pero estoy perdido..   Gracias de antemano..

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #356 en: 07 de Abril de 2008, 10:46:46 »
Lo siento pero el 16F628 no tiene ADC, solo tiene comparador.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #357 en: 07 de Abril de 2008, 10:55:44 »
PD. Ansel da error porque no es utilizado por el 16F628
puedes probar con el "CMCON = 0x07  'Todas las entradas digitales"
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #358 en: 07 de Abril de 2008, 11:01:26 »
Parte de un ejemplo para el PIC16F628:

Código: QBasic/QuickBASIC
  1. '--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
  2. '--------------------------------ASIGNACION DE I/O y valores de inicion de las salidas----------------------
  3. CMCON = 0x07  'Desactivo el modulo comparador del PORTA PARA LA SERIE 16F62x
  4. TRISB.7 = 0  'Ptt
  5. TRISB.6 = 0  'Rx
  6. TRISB.5 = 0  'Ok/Temporizador
  7. TRISB.4 = 0  'RL4
  8. TRISB.3 = 0  'RL3
  9. TRISA.4 = 0  'RL2
  10. TRISB.0 = 0  'RL1
  11. TRISA.0 = 1  'E1
  12. TRISA.1 = 1  'E2
  13. TRISA.2 = 1  'E3
  14. TRISA.3 = 1  'E4
  15. PORTA.5 = 1  'Selecciona M/S
  16. PORTB.7 = 0  'Estado de las salidas al inicio
  17. PORTB.6 = 0
  18. PORTB.5 = 0
  19. PORTB.4 = 1
  20. PORTB.3 = 1
  21. PORTA.4 = 1
  22. PORTB.0 = 1
  23. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
  24. Hseropen 1200  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
  25. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos(USART), para que funcione la implementacio P. SERIE
  26. PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  27. T1CON.TMR1ON = 1  'Configuracion y habilitacion del TMR1
  28. T1CON.TMR1CS = 0
  29. T1CON.T1CKPS0 = 0
  30. T1CON.T1CKPS1 = 0
  31. TMR1H = 0xec
  32. TMR1L = 0x78
  33. PIE1.TMR1IE = 1
  34.  
  35. OPTION_REG.T0CS = 0  'selecciona reloj interno
  36. OPTION_REG.PSA = 1  'asigna el prescales al WDT
  37. OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division
  38. OPTION_REG.PS1 = 1
  39. OPTION_REG.PS2 = 1
  40. INTCON.T0IE = 0  'deshabilito interrupcion por el trm0
  41. Enable  'INTCON.GIE habilita todas las interrupciones globales
Saludos desde Granada, España.

Desconectado alejhandr0

  • PIC10
  • *
  • Mensajes: 2
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #359 en: 07 de Abril de 2008, 11:42:36 »
Ahora estoy mas perdido, porque segun el Microcontroller View  del  16F628A aperece con 4 puertos analogicos (RA0, RA1, RA2, RA3) en el PIC SIMULATOR IDE..  pero no acepta el ANSEL, sera error del programa...