Autor Tema: PIC BASIC del PIC Simulator IDE Oshonsoft (Índice en página 1)  (Leído 859900 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 #150 en: 07 de Abril de 2007, 18:29:47 »
Otro ejemplo:

Código: [Seleccionar]
  '******************************************************
'Ejemplo 8
'Pic16F88 o similar, PSI v7.41
'Cambia el estado del puerto B
'Versión: 2
'Bucle For/Next, ShiftRight, ShiftLeft, salida datos por puerto B
'Efecto coche fantástico.
'Oscilador interno y por defecto 4Mhz
'------------------------------------------------------
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 4  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Solo se usa cuando se simula, hace que se ignoren los tiempos de los WaitMs
'------------------------------------------------------------------------
'Inicializacion de los modulos internos del micro-------------
AllDigital  'Pin como I/O, deshabilita pin analogicos
TRISA = 0  'Puerto A como salida excepto RA5
TRISB = 0  'Puerto B como salida
PORTB = 0  'B tendra todos los pin en estado bajo
'----------------Asignacion de nombres-----------------------------------
Symbol led = PORTB.0  'asigna nombre a un pin fisico
'-----------------Declaracion de variables-------------------------------
Dim a As Word  'Declaración de la variable a como de 16bit
Dim i As Byte  'Variable indice para el bucle For/Next, esta variable no
'importa el valor que tenga cuando llegue al bucle For este la inicializa
'----------------Asignacion de valores a las variables
a = %10000000  'Se da el valor de entrada en forma binaria, no importa en que formato
'se asigne el valor a una variable o registro, el compilador internamente siempre
'lo transforma a binario.
'----------------Cuerpo del programa------------------------------------
inicio:
For i = 1 To 7  'La variable i tomara los valores comprendidos entre 1 to 7
PORTB = a  'Saca el valor de la variable por el puerto B
a = ShiftRight(a, 1)  'Desplaza la variable a un bit a la derecha
WaitMs 1000  'Espera 1Seg.
Next i  'i = 7 termina el bucle y se incrementa i en uno (i=8)
For i = 1 To 7  'La variable i tomara los valores comprendidos entre 1 to 7
PORTB = a  'Saca el valor de la variable por el puerto B
a = ShiftLeft(a, 1)  'Desplaza la variable a un bit a la izquierda
WaitMs 1000  'Espera 1Seg.
Next i  'Si i = 7 termina el bucle y se incrementa i en uno (i=8)
Goto inicio  'Impide que se termine el programa
End                                           

« Última modificación: 13 de Junio de 2016, 10:46:46 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #151 en: 07 de Abril de 2007, 18:39:51 »
Lo ideal para simular el programa:

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #152 en: 07 de Abril de 2007, 18:45:24 »
Pudes cargar un registro completo de la forma tradicional, que es la que yo utilizo:

PORTB = %01010101

Y con respecto a cambiar uno o varios bit de un registro pues tambien la forma tradicional:

Mirg = Mirg And %11111110 ' pone a cero el bit 0 del registro.
« Última modificación: 07 de Abril de 2007, 18:51:06 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #153 en: 07 de Abril de 2007, 18:59:51 »
En el ejemplo pasado de la pagina 5, se ve claramente el uso de ShiftRight y tambien modificacion de bit de una variable
esta en la rurina "lee_hora", que nos pasa de BCD a decimal, suprimiendo antes los bit de control del RTC.

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

'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_RTC_12
'MICRO: PIC16f88A

http://www.todopic.com.ar/foros/index.php?topic=14917.80
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #154 en: 07 de Abril de 2007, 19:32:52 »
hay otras formas tambien de modificar un bit o comprobar en que estado se encuentra.

a.0 = 1 ' el bit de menos peso de a sera igual a 1, dejando el resto como estaban

a=%10000000 'esto es igual que a=128, el %indica que el numero a continuacion esta expresado en binario
b=0 ' esto es igual que b =%00000000
b.0 = a.7
if b = 1 then *****
if b = 0 then *****

esto se puede hacer de una u otra forma con cualquier longitud de registro.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #155 en: 09 de Abril de 2007, 17:34:54 »
Y fusionando el programa del RTC con el de Temperatura:

Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_LCD_RTC_ADC_10
'MICRO: PIC16F88A
'FECHA/AUTOR: 04/07 - By COS, PSI v7.41
'Version 1.0
'DESCRIPCION: Muestra en el display la fecha, hora (24h)mediante el DS1307 y temperatura (LM35)
'S1 y S2 pulsadas al mismo tiempo, entramos en programacion del reloj
'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
'S1, pulsado al principio salida del RTC a on, 1Hz, y S2 salida a off, led off
'Se muestra la temperatura en el LCD mediante un LM35, temperatura positiva y negativa
'************************************************************************************************************
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
'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 RTC ------------------------------------------
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
'Variables del ADC y Rutina division (temperatura) ---------
Dim entero As Word  'Parte entera
Dim decimal As Word  'Los dos decimales
Dim division As Long  'Almacenara el numero con los dos decimales
Dim adc_4 As Word  'Contendra el valor de la entrada del ADC
Dim aux_adc_4 As Word  'Auxiliar
'Variables temperatura -----------------------------------------------
Dim factor_escala As Word  'Contiene el factor de correcion para pasar el valor del ADC a voltios, max. 5V
Dim temperatura As Word  'Almacena la temperatura final
Dim temp As Long  'Contendra la temperatura completa sin coma
Dim signo As Bit  'Indica el signo de la temperatura
'Variables calculo media aritmetica (temperatura) ----------
Dim media_temp(20) As Word  'Numero de muestras para calcular la media aritmetica
Dim media_indice As Byte  'Se utiliza como indice
Dim aux_media As Byte  'Variable auxiliar
'Asignaciones ----------------------------------------------------------
Dim error As Byte
error = 0
'Asignacion de valores a las variables (RTC) ---------------
s1_on = 0
s2_on = 0
dato = 7  'Tuera 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  'Temporiza 100 mSeg
timer1_ms_tiempo = 50  'Temporiza 50m Seg.
timer2_ms_tiempo = 500  'Temporiza 500 mSeg.
timer3_ms_tiempo = 5  'Temporiza 5 mSeg.
timer1_100ms_tiempo = 10  'Temporiza 1 Seg.
timer2_100ms_tiempo = 255  'Temporiza 25.5 Seg.
timer3_100ms_tiempo = 1  'Temporiza 0.1seg.
'Asiganacion de valores a las variables (temperatura) -----
entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 10  'Factor de escala para un decimal
temperatura = 0
temp = 0
media_indice = 0
aux_media = 0
'Asignacion de I/O y valores de inicio de las salidas ------
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
'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 TMR1 e 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
Enable  'INTCON.GIE habilita todas las interrupciones globales
'-----------------------------------------------------------------------
Lcdinit  'Inicializa el lcd sin cursor
PIE1.TMR1IE = 1  'Habilita interrupcion del timer1
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 "ADC_Temperatura"  'Escribe en el lcd
pause = 3000
Gosub pause_ms  'Espera el tiempo indicado en pause
Lcdcmdout LcdClear  'Borra el display y cursor a casa
'Inicializa media_temperatura -----------------------------
Gosub inicializa_temp
'Inicializa los registros del RTC ---------------------------
Gosub inicaliza_rtc
'Inicializa la salida del RTC --------------------------------
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
If s1 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x10  'Salida a 1hz, a on
If s2 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x80  'Salida a off, led off
PIE1.TMR1IE = 1  'Habilita las interrupciones del timer1
pause = 1000
Gosub pause_ms  'Espera el tiempo indicado en pause
'Bucle principal
main:
error = 0
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  '__________________

If timer2_100ms >= timer2_100ms_tiempo Then
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
Gosub media_arit  'Salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'Llama a la funcion dvsion_dcmles, que retorna un long
timer2_100ms = 0
Endif
Goto main
End                                               
'********************************* Subrutinas **********************************************
inicaliza_rtc:  'Inicializa el reloj----------------------------------------
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, 0, reg(0)  'Leo los segundos
reg(0) = reg(0) And %01111111  'Habilito bit de control que activa el reloj
I2CWrite sda, scl, 0xd0, 0, reg(0)  'Escribo el registro de los segundos
I2CRead sda, scl, 0xd0, 1, reg(0)  'Leo el registro de los minutos
reg(0) = reg(0) And %10111111  'Habilito bit de control que activa el formato de 24h
I2CWrite sda, scl, 0xd0, 0, reg(0)  'Escribo el registro de los minutos
'Inicializa la salida del RTC -------------------------------------------
If s1 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x10  'Salida a 1hz, a on
If s2 = 0 Then I2CWrite sda, scl, 0xd0, 7, 0x80  'Salida a off, led off
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 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 regis. 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
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
I2CWrite sda, scl, 0xd0, dato, aux_ajuste  'actualiza el dato ya modificado
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
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
PIE1.TMR1IE = 0  'Deshabilita las interrupciones del timer1
I2CRead sda, scl, 0xd0, i, reg(i)  'Lectura de la direccion de memoria indicada del RTC, formato BCD
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
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
Gosub print_lcd_temp  'Salto con retorno a la rutina de impresion de la temperatura
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                                           
'--------------------------------------Subrutina lectura ADC, division y LCD
lee_adc:  '_______________________Lee la entrada analogica
Adcin 4, adc_4  'Lee el valor de la entrada analogica y lo guarda en adc_4
Return                                           
print_lcd_temp:  '____________________Muestra los datos por el display
entero = division.HW  'Sede el word alto a entero, parte entera
decimal = division.LW  'Sede el byte alto del word bajo a decimal_1
Lcdout " "
If signo = 0 Then Lcdout "+", #entero, "."  'Muestra los datos en el lcd
If signo = 1 Then Lcdout "-", #entero, "."  'Muestra los datos en el lcd
Lcdout #decimal, "C   "  'Muestra los datos en el lcd
Return                                           
'________Argumentos de entrada dos variables tipo word, dividendo y divisor, argumento de salida una variable tipo long
Function dvsion_dcmles(dvdo As Word, dvsor As Word) As Long  '________Rutina funcion division con decimales
Dim f_entera As Word  'Variable local, contendra la parte entera
Dim f_resto As Word  'Variable local, contendra el resto
Dim f_decimal As Word  'Contendra la parte decimal
f_entera = dvdo / dvsor  'Obtengo la division
f_resto = dvdo Mod dvsor  'Obtengo el resto
f_decimal = (f_resto * 10) / dvsor  'Calculo 1 decimal, para obtener 2 decimales multiplicar por 100
dvsion_dcmles.HW = f_entera  'Almacena la parte entera en el word alto
dvsion_dcmles.LW = f_decimal  '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                                     
'___________Calculo de la media aritmetica de la temperatura, 20 muestras
media_arit:
media_temp(media_indice) = temperatura  'Asigna el valor
temperatura = 0  'Se inicaliza a cero
For aux_media = 0 To 19  'Blucle for, se ejecuta 20 veces
temperatura = temperatura + media_temp(aux_media)  'Se suman los valores
Next aux_media  'Cierra for
temperatura = temperatura / 20  'Termina el calculo de la media
media_indice = media_indice + 1  'Controla la entrada de datos que corresponde a media_temp(x)
If media_indice > 19 Then media_indice = 0  'Acota el ultimo valor del indice de media_temp
Return                                           
'___________Calculo de la temperatura
temp_calculo:  'Calculo de la temperatura y del signo de la misma
If adc_4 > 112 Then  'Determina si la temperatura es superior a 0ºC
aux_adc_4 = adc_4  'Asigna el valor del ra4 a la variable auxiliar
aux_adc_4 = aux_adc_4 - 112  'Elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'Calcuala el valor de la temperatura sin coma decimal
signo = 0  'Temperatura positiva
Endif
If adc_4 = 112 Then  'Determina si la temperatura es 0ºC
temp = 0  'Temperatura 0ºC
signo = 0  'Asigna signo positivo
Endif
If adc_4 < 112 Then  'Determina si la temperatura es inferior a 0ºC
aux_adc_4 = adc_4  'Asigna el valor del RA4 a la variable auxiliar
aux_adc_4 = 112 - aux_adc_4  'Elimina de la temperatura la parte de la escala negativa
temp = (5000 * aux_adc_4) / 1023  'Calcuala el valor de la temperatura sin coma decimal
signo = 1  'Asigna el simbolo menos a la temperatura
Endif
temperatura = temp  'Se pasa de Long a Word
Return                                           
inicializa_temp:  '__________Inicializa la media aritmetica de la temperatura en el arranque
Gosub lee_adc  'Salto con retorno, rutina de lectura de la entrada ADC
Gosub temp_calculo  'Salto con retorno, hace el calculo de la temperatura y guarda el valor en temperatura
For media_indice = 0 To 19  'Indice para rocorrer todas las direcciones de memoria que forman la variable tipo array media_temp
media_temp(media_indice) = temperatura  'Se de el valor a media_temp
Next media_indice  'Terminacion del bucle For
media_indice = 0  'Se inicializa a cero, para un uso posterior
Gosub media_arit  'Salto con retorno, calcula la media aritmetica
division = dvsion_dcmles(temperatura, factor_escala)  'Llama a la funcion dvsion_dcmles, que retorna un long
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
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
Endif
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                                                                                       
« Última modificación: 20 de Junio de 2016, 20:11:43 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #156 en: 09 de Abril de 2007, 17:38:16 »
Código: [Seleccionar]
'---------------

PD. no puse el archivo correcto, ahora si...  :mrgreen:

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, 14:34:50 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #157 en: 09 de Abril de 2007, 17:40:29 »
Lo tuve que pegar en dos partes..  :mrgreen:

y una foto para no variar de costumbres...  :D

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #158 en: 13 de Abril de 2007, 19:16:47 »
Ahora le toco el control a un servo Futaba S3003:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_Pic_EBasic_LCD_Timer1_ADC_PWM_RB4
'Descripcion: Control de un servomotor (Futaba S3003) usando el ADC, Timer1, Interrupciones
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 4/07, By COS
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'uso del timer1 para controlar el PWM
'lectura de entrada analogica y conversion a tiempo
'conversion de tiempo a valores a cargar en el timer1
'************************************************************************************************
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTA  'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'Define LCD_RWBIT = 5  'se usara el RA5 como RW (si se suprime el compilador no protesta)
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 = 5  '50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'****************************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'--------------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'------------------------------------declaracion de variables---------------------------------------
'************************************variables de los timer****************************************
'-------------------------------Variables del ADC y Rutina division------------------------------
Dim adc_4 As Word  'contiene el valor de la entrada ADC
'-------------------------------------------------------------------------------------------------
Dim pwm As Word  'variable de paso
Dim pwm_nop As Word  'variable de paso
Dim aux_pwm As Long  'calculo del tiempo a ON, de la señal de control
Dim aux_pwm_nop As Long  'calculo del tiempo a OFF, de la señal de cotrol
Dim timer_pwm As Word  'valor del tiempo a on, para ser interpretado
Dim timer_pwm_nop As Word  'valor del tiempo a off, para ser interpretado
Dim flag1_pwm As Byte  'variable que determina si ON o a OFF de la señal de control
Dim flag2_pwm As Byte  'controla la actualizacion de una nueva posicion del servo
'--------------------------------Variables generales-----------------------------------------------
'------------------------------------asignacion de valores a las variables--------------------------
pwm = 62535
pwm_nop = 28535
aux_pwm = 62535
flag1_pwm = 1
flag2_pwm = 0
adc_4 = 0
'------------------------------------Definicion de puertos------------------------------------------
Define ADC_SAMPLEUS = 0  '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, negado
PORTB.0 = 1  'led verde a off, negado
'------------------------------------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
Enable  'INTCON.GIE habilita todas las interrupciones globales
'------------------------------------Inicio-------------------------------------------------------
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "LCD_Tmr1_ADC_PWM"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Servo S3003"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
Lcdcmdout LcdClear  'borra el display
PIE1.TMR1IE = 1  'activa las interrupciones del timer1
'------------------------------------rutinas del Programa----------------------
main:  'comienza el programa principal
If flag2_pwm = 1 Then  'permite una nueva posicion del servo
Gosub lee_adc  'salto con retorno a la rutina de lectura del ADC
aux_pwm = ((adc_4 + 213) * 223) / (1023 + 213)  'tiempo a ON de la señal de control del servo
'213, es el valor que se le asigna por defecto al ADC cuando el potenciometro esta a cero
If aux_pwm < 45 Then aux_pwm = 45  'tiempo minimo a ON, de la señal de control del servo
aux_pwm_nop = 2000 - aux_pwm  'calculo del tiempo de la señal de control a OFF
aux_pwm_nop = 65535 - ((aux_pwm_nop * 100) / 5)  'valor a cargar en el timer1, OFF
aux_pwm = 65535 - ((aux_pwm * 100) / 5)  'valor a cargar en el timer1, ON
pwm = aux_pwm  'se cambia de long a word, para acelerar la rutina de interrupciones
pwm_nop = aux_pwm_nop  'se cambia de long a word, apra acelerar la rutina de interrupciones
Gosub print_lcd  'salto con retorno a la rutina que muestra los dato por el display
flag2_pwm = 0  'bloquea la rutina hasta que se procese la nueva posicion
Endif
Goto main  'impide que termine el programa principal
End  'es conveniente ponerlo siempre segun el manual
'--------------------------------------Subrrutina lectura ADC, division y LCD
lee_adc:  '_______________________lee la entrada analogica
Adcin 4, adc_4  'lee el valor de la entrada analogica y lo carga en adc_4
Return                                           
print_lcd:  '____________________muestra los datos por el display
Lcdcmdout LcdLine1Home  'cursor al principio
Lcdout "ADC ", #adc_4, " ", #pwm, "       "  'muestra los datos en el lcd
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
'___________Rutina generadora del PWM, para la entrada de control del servomotor
If flag1_pwm = 1 Then  'controla el tiempo de la señal del servo a OFF
RB4 = 0  'salida del servo a OFF
TMR1H = timer_pwm_nop.HB  'recarga el contador del timer1 para que desborde, tiempo a off
TMR1L = timer_pwm_nop.LB  'recarga el contador del timer1 para que desborde, tiempo a off
flag1_pwm = 0  'permite la alternancia entre señal del servo a ON o a OFF
flag2_pwm = 1  'permiten que entren nuevos valoles del ADC, nueva posicion del servomotor
timer_pwm = pwm  'recarga la rutina con los nuevos valores del potenciometro
timer_pwm_nop = pwm_nop  'recara la rutina con los nuevos valores del potenciometro
Else
RB4 = 1  'salida de la señal de contol del servo a ON
TMR1H = timer_pwm.HB  'recarga el contador del timer1 para que desborde, tiempo a on
TMR1L = timer_pwm.LB  'recarga el contador del timer1 para que desborde, tiempo a on
flag1_pwm = 1  'permite la alternancia entre señal del servo a ON o a OFF
Endif
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
End                                               
« Última modificación: 22 de Diciembre de 2007, 23:44:28 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #159 en: 15 de Abril de 2007, 07:13:27 »
Una imagen con los modulos del simulador:

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #160 en: 15 de Abril de 2007, 07:20:11 »
Un ejemplo para darle un valor util al TIMER0:

Código: [Seleccionar]
'***************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_Pic_EBasic_Timer0
'Descripcion: Base de tiempos programable empleando el Timer0
'Micro: pic16f88 / 8mhz reloj interno
'Version: 1.0
'Fecha/Autor: 4/07, By COS
'Las bases de tiempos no interrumpen el flujo normal del programa
'************************************************************************************************
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms
'--------------------------------------Reasignacion de nombres---------------------------------------
Symbol led_amarillo = PORTA.7  'led amarillo
Symbol led_verde = PORTB.0  'led verde
Symbol luz_lcd = PORTB.3  'retroiluminacion del lcd
'--------------------------------Variables generales-----------------------------------------------
Dim timer0_1ms As Word  'declaracion de la base de tiempos
Dim timer0_1ms_tiempo As Word  'determina el tiempo en que la base de tiempos estara incrementandose
'------------------------------------asignacion de valores a las variables--------------------------
timer0_1ms = 0  'inicializa la base de tiempos
timer0_1ms_tiempo = 1  'mSeg., tiempo en que el led verde estara cambiando de estado
'------------------------------------Definicion de puertos------------------------------------------
ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
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, negado
PORTB.0 = 1  'led verde a off, negado
'------------------------------------Inicializacion de Interrupciones por TIMER0-----------------------------
OPTION_REG.T0CS = 0  'selecciona reloj interno
OPTION_REG.PSA = 0  'asigna el prescales al timer0
OPTION_REG.PS0 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1  'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0  'bits de la seleccion del factor de division,prescaler 16
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE habilita todas las interrupciones globales
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
TMR0 = 130  'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.TMR0IE = 1  'habilita las interrupciones del timer0
'------------------------------------rutinas del Programa----------------------
main:  'comienza el programa principal
'_________________Cambia de estado el led verde segun el valor de timer0_1ms_tiempo, en mSeg
If timer0_1ms >= timer0_1ms_tiempo Then  'control
Toggle led_verde  'invierte el estado del pin
timer0_1ms = 0  'inicializa la base de tiempos timer0_1ms
Endif
'_________________
Goto main  'impide que termine el programa principal
End  'es conveniente ponerlo siempre segun el manual
'--------------------------------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 timer0_1ms <= timer0_1ms_tiempo Then timer0_1ms = timer0_1ms + 1  'base de tiempos
TMR0 = 130  'recarga el registro del tiemr0 para que desborde cada 1mSeg.
INTCON.TMR0IF = 0  'borra el flag de desbordamiento del timer0
Resume  'activa las interrupciones y retorna al curso normal del programa antes del salto
'End                                              
« Última modificación: 19 de Junio de 2014, 04:46:50 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #161 en: 15 de Abril de 2007, 07:24:10 »
Usando los modulos del simulador:

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

Desconectado Resistencio

  • PIC12
  • **
  • Mensajes: 82
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #162 en: 15 de Abril de 2007, 18:39:51 »
Te sigo COS, no estas solo...excelente trabajo !!! Estos dias quiero, tratar de terminar el entrenador...me parece muy util y didactico...Gracias por compartirlo !!!

______________________________
"Justo a mi, me toco ser YO" QUINO

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #163 en: 16 de Abril de 2007, 10:34:10 »
Gracias Resistencio, si te refieres como "entrenador" a la EBasic, tengo la ultima version, no tienes mas que pedírmela.

PD. El Timer0 lo utilizo en este caso para controlar una base de tiempos, que me permite cambiar el estado de un pin de salida sin interferir en el flujo normal del programa, es una de las caracteristicas de las bases de tiempos tambien llamadas en otros lenguajes como Timer, por llamarlo de alguna manera, es la "multitarea del pobre".
« Última modificación: 12 de Junio de 2016, 16:17:43 por dogflu66 »
Saludos desde Granada, España.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #164 en: 16 de Abril de 2007, 15:15:20 »
Hola Carlos!

Dice mi ABANDONADISIMO robot hexapodo que el ejemplo del control de los servos le va a venir de perlas. :)

("solo" tengo que multiplicar por 19 el numero de servos a manejar) ;)

Saludos, y felicitaciones por el trabajo que estas realizando!
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


 

anything