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

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carli

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 109
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #90 en: 23 de Enero de 2007, 23:28:56 »
Hola, estoy renegando con un LCD que no puedo hacer andar  :8}

Con este codigo:

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

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

Desde ya muchas gracias.
Nueve de Julio - Buenos Aires - Argentina

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #91 en: 24 de Enero de 2007, 04:56:42 »
Hola Carlos!
La conexion de los datos seria:

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

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

Suerte! :mrgreen:
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 Carli

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 109
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #92 en: 24 de Enero de 2007, 09:00:19 »
Ariel, disculpa mi @%&·$".

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

Disculpen la ignorancia!!!!
Nueve de Julio - Buenos Aires - Argentina

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #93 en: 12 de Febrero de 2007, 21:46:57 »
Aqui dejo un ejemplito:
-Ya se puede cambiar la hora del reloj
-Los datos a cambiar quedan en modo parpadeo
-Se modifican solo con dos teclas
-Las teclas responden muy bien, sin fallos, si pulsas rapido respondes rapidas y si pulsas lento van lentas.

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

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

PD: 03/06/08
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead
« Última modificación: 20 de Junio de 2016, 20:22:32 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #94 en: 24 de Febrero de 2007, 10:11:08 »
Nueva versión, volviendo a trabajar con el modulo ADC:

Ahora utilizando funciones.

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

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

PD: 03/06/08
      I2CWrite sda, scl, 0xd0, x, x
      I2CRead sda, scl, 0xd1, x, x
      0xd0 = %11010000 => Seleccion del chip DS1307 y modo escritura
      0xd1 = %11010001 => Seleccion del chip DS1307 y modo lectura
      %1101000x (direccion de seleccion del chip %1101000) siendo "x" el bit indicador de Write/Read. Este bit menos significativo lo controla directamente la funcion I2CWrite y I2CRead, por lo que su valor
      es indiferente, la funcion I2CWrite lo pondra a valor "0" de forma automatica y al ser compilada tambien I2CRead lo colocara a 1.
« Última modificación: 20 de Junio de 2016, 13:51:32 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #95 en: 02 de Marzo de 2007, 22:26:37 »
Esto es en lo siguiente en lo que estoy trabajando:
Circuito adaptador acondicionador para el circuito integrado medidor de temperatura LM35DZ (0C a 100C).



PD. Se me olvido colocar la R7
Otro PD. Se me olvido colocar la R8
« Última modificación: 15 de Junio de 2016, 12:33:52 por dogflu66 »
Saludos desde Granada, España.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #96 en: 03 de Marzo de 2007, 02:27:46 »
Ojalá todos los esquemas que uno mira vinieran tan claritos y bien explicados, Carlos. Gracias.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #97 en: 03 de Marzo de 2007, 09:53:13 »
R7 y R8 son importantes para:

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

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


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

PD. o por lo menos lo intento...  :D
Saludos desde Granada, España.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #98 en: 03 de Marzo de 2007, 09:58:05 »
Hola Carlos!
Muy bueno! Yo uso siempre sensores "digitales", tipo el DS1820 por no saber justamente hacer lo que hace tu circuito. Gracias por compartir tan excelente trabajo. :)
Seguramente voy a probarlo en el proximo proyecto. :-/

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

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #99 en: 03 de Marzo de 2007, 10:08:24 »



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

De todas formas estoy realizando un articulo con todo el contenido del hilo.
Saludos desde Granada, España.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #100 en: 03 de Marzo de 2007, 10:13:45 »
Perfecto!!!
Muy buen trabajo. ME das permiso para que use este esquema acondicionador (citando la fuente y el articulo original, claro) cuando llegue al capitulo del ADC en la GUIA de PIC BASIC?

(hoy voy a subir dos capitulos mas que tengo listos desde hace dias y no he hecho tiempo de postear en el foro :( )
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 LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #101 en: 03 de Marzo de 2007, 11:42:15 »
Hola:

Felicidades Carlos por el gran trabajo que bienes haciendo con la plaquita y los ejemplos  :-/

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #102 en: 03 de Marzo de 2007, 14:21:48 »
Gracias maistro.

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

Saludos desde Granada, España.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #103 en: 03 de Marzo de 2007, 15:37:54 »
Gracias Carlos!

El ego se siente mejor cuando es reconocido, asi que lo voy a destacar muy bien. 8)
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 dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #104 en: 03 de Marzo de 2007, 22:33:46 »
Pues la placa ya esta construida y funcionando...  :mrgreen:


« Última modificación: 03 de Mayo de 2014, 16:03:06 por dogflu66 »
Saludos desde Granada, España.