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

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #420 en: 02 de Junio de 2008, 07:01:15 »
Hola dogflu66.

tengo una pregunta, de la rutina del programa 2.

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 
------------------------------
PIE1.TMR1IE = 1     para que lo volvemos a encender?para que lo apagamos antes? no comprendo, perdona mi ignorancia.


La función I2C es una emulación por Soft, no utiliza el modulo, por lo tanto tiene que medir tiempos muy exactos, si no deshabilitamos las interrupciones estos tiempos se ven truncados, y por lo tanto fallara esta función.

PD. Esta en el manual. Siempre que se utilicen funciones que necesitan medir tiempo hay que deshabilitar las interrupciones, unas funciones sencillamente no funcionaran y otras por ejemplo waitms o waitus se ven aumentados sus tiempos.
« Última modificación: 02 de Junio de 2008, 17:28:43 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #421 en: 02 de Junio de 2008, 17:50:53 »
otra cosita:

aux_4l = reg(i) And %00001111
la variable que guarda el nible bajo es igual al resultado de hacer una and logica del  registro numero "i" es decir "reg(i)" y el numero binario 0111 0000,

¿por que ese numero binario? en algunos otros tambien? cambia, tiene que ver con el registro del DS1307


 si la variable "i" toma valores desde 0 hasta 6, la parte baja del nible lo comprendo, pero la baja
 la parte alta nos va ha dar siempre 0. Tomamos por ejemplo i=1 seria:

0000 0001 --> reg(1)
0111 0000  -->%01110000
------------
000000000 --> aux_4h=0000

aux_4h = ShiftRight(aux_4h, 4)
con esto lo desplamos el nible alto a derecha, 4 posiciones a la derecha, si fuera 0111 0000 seria 0000 0111, pero como da todo ceros  seguira siendo cero.

La conversion del nible alto a bajo no se deberia de hacer antes?
antes de la and logica asi se evitaria que fuera cero

Como te dije hace tiempo de esto.
Al leer los registros, todos tienen una longitud fija si no recuerdo mal, y al tener estos los BIT de configuración en la parte más significativa del dato leído, hay que eliminar el valor de configuración del registro antes de poder operar con él. Puede que con alguno de ellos en concreto no sea necesario hacer esta operación, pero supongo que cuando lo puse fue por no dejar el hueco en la rutina. Puede que con alguno de ellos se produzca una operación redundante, pero eso se puede tomar como capricho del programador. De todas formas siempre puedes hacer la prueba cambiando la línea de sitio y así experimentas que es lo que pasa. Pero también tienes que tener en cuenta que actualmente funciona el programa.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #422 en: 02 de Junio de 2008, 18:07:03 »
otra cosilla

reg(i) = (aux_4h * 10) + aux_4l 

con esto haces: el registro numero "i" le igualamos el valor del nible alto multiplicado por 10 y le sumamos el nible bajo.

yo creo que el nible alto estaba en binario, salio como resultado de una and logica del registro numero "i" con el numero
 binario 0000 1111.
 no entiendo como multiplicas un numero binario por un numero decimal, a no ser que el aux_4h sea decimal.


ejemplo i=1

aux_4h = reg(i) And %01110000  parte del nible alto

aux_4H= 0000 0001 and 0111 0000 se queda con la parte alta

0000 0001
0111 0000
--------------
0000 0000 --> aux_4h   si se queda con la parte alta simpre sera cero ya que
                                    "i" toma valores de 0 a 6 situandose simpre en el nible bajo



aux_4l = reg(i) And %00001111

aux_4l= 0000 0001 and 0000 1111 = 0000 0001   solo almacena los 4 primeros seria 0001 aux_4l =0001


aplicamos:

reg(i) = (aux_4h * 10) + aux_4l   siendo aux_4l simpre binario

reg (i)=(0*10)+dato binario

reg (i)= aux_4l en binario

para poner un dato BCD "0101" a binario seria (0*23)+(1*22)+(0*21)+(1*20)

esto sera (0*8 )+(1*4)+(0*2)+1*1)  => 0+4+0+1 => 4+1 => 5 en decimal


I2CRead sda, scl, 0xd0, i, reg(i) yo prefiero poner para "I2CRead" 0xD1 pero bueno


estamos leyendo las direciones correlativas del 0 al 6 con el valor de"i" ademas estamos leyendo correlativamente los registros del 0 al 6 del nible bajo.

amigo dogflus66 podrias corregirme, y aclarme   esta dudas.


 gracias

Bueno con respecto a mezclar números binarios con decimales, pues no es correcto lo que piensas. Que algunos números aparezcan en el programa como nomenclatura binaria solo es por ser mas gráficos o si quieres es una forma de remarcar que hay BIT que tienen un significado concreto. En realidad todos los números, ya sean en el sistema que elija el programador, son traducidos por el compilador a binario. El uso de un sistema u otro de representación en el programa fuente no es mas que por hacer más comprensible el código "aux_4l = reg(i) And %00001111" esto para mí tiene significado, pero esto otro no "aux_4l = reg(i) And 15" (este ejemplo es muy simple ya que 1111 = F = 15) y sin embargo el resultado será el mismo.
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #423 en: 04 de Junio de 2008, 12:07:35 »
hola dogflu,

El programa adaptado del 16f88 al 16f877A, se deberian de cambiar los pines: el porta.7 y el porta.6 correspondientes del led amarillo, y el pulsador S1, a mi no me da ningun error ni nigun warnig, pero lo debemos cambiar para poder pulsar boton y ver el led amarillo.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #424 en: 04 de Junio de 2008, 12:12:37 »
hola, dogflu66

Crees que seria posible simular el programa 2, el adaptado al 16f87A, en proteus 7?
La simulación por software no le sera impedimento verdad, para proteus?
 
un cordial saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #425 en: 05 de Junio de 2008, 18:39:52 »
hola dogflu,

El programa adaptado del 16f88 al 16f877A, se deberian de cambiar los pines: el porta.7 y el porta.6 correspondientes del led amarillo, y el pulsador S1, a mi no me da ningun error ni nigun warnig, pero lo debemos cambiar para poder pulsar boton y ver el led amarillo.

Tienes razón, el compilador ahí debería dar error,  :?
Tienes que cambiar esos pin por otros.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #426 en: 05 de Junio de 2008, 18:44:14 »
hola, dogflu66

Crees que seria posible simular el programa 2, el adaptado al 16f87A, en proteus 7?
La simulación por software no le sera impedimento verdad, para proteus?
 
un cordial saludo

Hasta ahora no he usado proteus para simular los PIC, pero si he enviado programas compilados con el compilador Basic del PSI a algunos amigos que me los pidieron ya que con otros lenguajes Basic no lograron hacerlos andar en proteus, y sin embargo todos los compilados con este lenguaje si funcionaron correctamente... :-)
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #427 en: 18 de Junio de 2008, 08:45:56 »
hola,
 Dogflu66 , podrias decirme si es posible utilizar un pic por ejemplo el 16F877A con el protocolo i2c y el protocolo spi, a la vez es decir, con un ds1307 y una mmc. los pines del sda cinciden con el sdi y el scl con el sck.

es posible utilizar ambos protocolos?

confio que me puedas ayudar.

un cordial saludo.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #428 en: 18 de Junio de 2008, 13:36:56 »
yo diría, leyendo su hoja de datos, que no es posible:

9.0 MASTER SYNCHRONOUS SERIAL PORT (MSSP) MODULE
The Master Synchronous Serial Port (MSSP) module is a serial interface, useful for communicating with other peripheral or microcontroller devices. These peripheral devices may be serial EEPROMs, shift registers, display drivers, A/D converters, etc. The MSSP module can operate in one of two modes:
• Serial Peripheral Interface (SPI)
• Inter-Integrated Circuit (I2C)
Figure 9-1 shows a block diagram for the SPI mode, while Figure 9-5 and Figure 9-9 show the block diagrams for the two different I2C modes of operation.
(página 65).

no sé si mediante programación se pueden simultanear a la velocidad suficiente a tus necesidades...

un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #429 en: 18 de Junio de 2008, 19:12:20 »
Pues como te dice xocas06 usando el modulo directamente no, puedes programar el modulo por ejemplo para spi y el i2c lo puedes simular por soft. De todas formas este tipo de simulaciones requieren tiempos muy exactos por lo que se desconectan las interrupciones dejando cualquier otra cosa fuera de juego, es decir, solo uno de los dos a la vez. Posiblemente se pueda conseguir usar el modulo con los dos protocolos en la misma placa utilizando algún circuito que los conmute, pero estaríamos en las mismas, no podrías usar los dos al mismo tiempo. De todas formas si no necesitas usarlos al mismo tiempo la emulación por soft da buenos resultados.

Tengo pendiente la construcción de unas rutinas que usen el modulo en modo spi y i2c pero por el momento para esto falta tiempo todavía.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #430 en: 22 de Junio de 2008, 19:25:50 »
MODULO CCP1 EN MODO PWM:

El modulo CCP1 del PIC16F88 como ya hemos visto puede trabajar en distintos modos, en esta ocasión practicaremos utilizándolo en el modo PWM, en este modo puede generar una serie de frecuencias a las que si procede podremos variar el duty cycle, esto quiere decir que podremos elegir el tiempo en el que la señal se mantendrá a nivel alto con respecto al estado bajo. Si el duty cycle lo mantenemos al 50% obtendremos una señal de onda cuadrada de una frecuencia elegida previamente. Y por supuesto el margen de frecuencias al que podremos trabajar una vez conocida las limitaciones del modulo queda  sujeto a la frecuencia de trabajo del Pic.

El modulo se puede utilizar como generador de frecuencias dentro de un margen determinado, pero en este caso lo voy a utilizar como control de potencia por modulación del ancho de pulso, y para esto lo programare con una frecuencia fija que no variara de valor durante todo el proceso, he iré variando el duty cycle de la señal (duty cycle  es igual al tiempo en el que está la señal a estado alto) y, como consecuencia de esta variación conseguiremos distinta luminosidad en el LCD.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #431 en: 22 de Junio de 2008, 19:26:18 »
El modulo trabajando en modo pwm acapara el timer2 del PIC, de este timer se utiliza el prescaler y su registro interno como contador. En PR2 (8Bit) establecemos el periodo de la frecuencia de trabajo elegida, cuando el valor del registro del timer2 es igual al del PR2 el pin de salida del modulo CCP pasa a valor 1 y se reinicia el contador del timer2. Al mismo tiempo el PIC hace una copia del registro de 10Bit CCPR1L+CCP1CON5:4 al registro CCPR1H+2Bit, y en este mismo momento, el contador del timer2 es concatenado con dos BIT internos para pasar a tener una longitud de 10Bit. Cuando este contador contiene el mismo valor del registro CCP1H+2Bit, el pin del modulo pasa a estado bajo y se borra el registro del timer2 otra vez, iniciándose de nuevo todo el ciclo completo indefinidamente. En el registro CCP1L+CCP1CON5:4 previamente se ha cargado el valor del duty cycle.

El modulo una vez programado y como ultimo paso activado el Timer2 queda indefinidamente trabajando, ya que los valores de sus registros de configuración no son modificados en el proceso. Y por supuesto se puede apagar o volver a activar al igual que cambiar su configuración, todo en tiempo de ejecución.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #432 en: 22 de Junio de 2008, 19:26:45 »
Como hemos visto el registro que controla el duty cycle tiene una longitud de 10Bit, por lo que podemos decir que tendremos una resolución máxima de 10Bit. En realidad esta resolución solo se dará siempre que trabajemos en un estrecho margen de frecuencias, este margen está determinada por el Clock del oscilador del Pic, el prescaler del timer2 y la frecuencia elegida para ser generada. El valor del duty cycle no podrá ser mayor al 100% (expresado en %), en el caso de ser superior el modulo no funcionara correctamente quedando su salida siempre a nivel alto. Por esto es necesario calcular el valor máximo (100%) a cargar en el registro de control del duty cycle para de esta forma no sobrepasar nunca ese valor y, que en el mejor de los casos nunca será superior a 1023.

La salida del modulo CCP1 del PIC16F88 es configurable, esto quiere decir que se puede elegir entre dos posibles pin, RB0 y RB3, se elige uno u otro a través del registro de configuración de BIT (fuses) del micro.   
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #433 en: 22 de Junio de 2008, 19:36:05 »
IMAGEN 1:

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #434 en: 22 de Junio de 2008, 19:38:02 »
IMAGEN 2:


Saludos desde Granada, España.