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

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #405 en: 30 de Mayo de 2008, 12:55:47 »
hola amigo dogfluu66,

modifique algo tu programa, para que funcionase con pic16F877A, puse como comentario la parte de la temperatura y cambie algunas entradas, pero hay partes que no comprendo, por el lcd no me muestra nada, simule mediante el modulo de led los puertos que interviene, a modo de chivato, SDA=RB.1;SCL=RB4; tambien cambie los led amarillo vede: Led amarillo RB.4;led verde RB.5; S1=RA.4; S2=RA.5.

para el chip
En bloque de definicion de puertos "ADCON1 = 0x07 " tiene que ver con el registro del converson analogico digital del oscilador interno en el canal AN7 es cierto eso.

Hseropen que hace esto
Hserout que hace esto

puedes ayudarme o darme un consejo




Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #406 en: 30 de Mayo de 2008, 20:38:13 »
ADCON1 = 0x07 es un registro que obedece a una tabla que hay en el datasheet del Pic. Con el, según lo que permite la tabla, se configura el modo de trabajo de los pines del puerto "A" y "E". Estos pin se pueden configurar como pin digitales o pin analógicos. Si se configuran como pin digitales estos podrán ser entradas o salidas digitales (I/O) y si se configura como analógicos solo podrán funcionar como entradas analógicas, para ser asignadas al modulo comparador y tambien al modulo ADC.

ADCON1 = 0x07, indica al micro que todo el puerto "A" y "E" trabajará como digital, por lo tanto solo tomara dos valores posibles 0 o 5 voltios.
TRISA.4=1, configuramos el pin RA4 como entrada, y más adelante lo configuraremos analógico.

ADCON1 = 0x00 , indica que todo el puerto "A" y "E" trabajará como entradas analógicas antes de hacer una lectura analógica.

ADCIN 4, adc_4  'Lee el valor de la entrada analógica (RA4) y lo guarda en la variable adc_4 (una variable no es más que una posición o varias posiciones consecutivas según el número de bytes que ocupa en la memoria de datos), ADCIN es una funciona y ya se encarga de programar la mayoría de los registros del modulo ADC con una configuración básica estándar para que nos funcione sin problemas.

ADCON1 = 0x07  'Los pin PORTA y PORTE como I/O, después de una lectura volvemos a configurar los pin del puerto "A" y "E" como digitales.



Como puede verse en la imagen no es posible configurara los pin del puerto "A" y "E" de una forma arbitraria. Creo que la forma mas sencilla es la que te indico.
« Última modificación: 17 de Abril de 2011, 09:36:09 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #407 en: 30 de Mayo de 2008, 20:45:21 »
HSEROPEN 4800, configura el modulo USART para que trabaje a una velocidad de 4800Baudios, en realidad esto será el puerto RS232.

HSEROUT, con este comando enviamos los datos al modulo USART para que los codifique en forma de BIT serie, que son a su vez convertidos por el driver RS232 a tensiones precisamente tipo RS232 (+12V y -12V).

Y si no recuerdo mal, hay un pin del puerto A (RA4) que como salida solo suministra valor 0, ya que como solo trabaja como colector abierto, por lo que no se puede utilizar para controlar el LCD, si antes no se le coloca una resistencia de pull-up.
« Última modificación: 31 de Mayo de 2008, 07:29:55 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #408 en: 30 de Mayo de 2008, 20:53:35 »
Y para terminar de resolver las dudas descárgate el esquema siguiente que es especial para el 16F877, el cual esta totalmente probado.
Si utilizas la configuración del esquema seguro que te funcionara el display y el puerto I2C.

http://www.freewebs.com/glafebre/miguelito.htm
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #409 en: 30 de Mayo de 2008, 20:56:55 »
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #410 en: 31 de Mayo de 2008, 09:06:01 »
o aquí más rápido:

http://www.4shared.com/file/1694958/a5c96550/bot_miguelito_robot_siguelineas.html

Hola dogflu66,
he mirado el enlace, es un proyecto muy trabajado y de muchas horas metidas, ademas esta muy bien documentado. Porcierto con que software fueron hechos los esquematicos electricos, en la revista elektor muchos estan echos con este tipo de dibujos, imagino que sera el mismo software.

Ayer noche revise de nuevo el otro programa, el que muestra la fecha y la hora en en display y pulsando S1 trasfiere la hora al reloj, esta fechado 12/6 by Cos.Ese programa si que mostraba la hora lo que no funcinaba era la modificacion del reloj, el otro que me pasaste, el de la temperatura y reloj le seguire quitando cosas, el RS232 no lo usare.

Tan solo dejare el PIC16f877A con el DS1307 conectado por I2C, que me muestre la hora, la fecha, el dia de la semana, el mes por display y tambien lo del reprogramado del reloj. eso de pulsar los dos a la vez es una buena idea, pero como evitas los rebotes.

Despues quiero añadirle una rutina, para que el reloj se reprograme solito en los cambios de horario de sosticios, no se si lo hara el propio SD1307, y por ultimo quiero poder ponerle varias alarmas programables, recordatorios, cumpleaños, creo que necesitare ponerle una memoria.

Respecto a la memoria, tu la pondrias por I2C tambien.


un saludete,
 si tienes algun consejo, te lo agradeceria.




« Última modificación: 31 de Mayo de 2008, 09:10:33 por pajaro »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #411 en: 31 de Mayo de 2008, 12:10:13 »

Respecto a la memoria, tu la pondrias por I2C tambien.


No es necesario utilizar la memoria E2prom, el PIC16F877 ya tiene una interna.

Con respecto a lo de más echare un vistazo al programa para refrescar la memoria y te cuento.
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #412 en: 01 de Junio de 2008, 09:14:12 »
Hola,

tengo 2 pregunta como hace para que dectecte una tecla pulsada?
 y el tiempo que ha sido pulsada?.

En el programa "2" define una variable S1_on como bit pero no comprendo, imagino que s1_on=1 activo y s1_on=0 desactivo pero como se activa esa variables y quien la activa o que proceso la actica

"If s1 = 1 And s1_on = 1 And s2_on = 0 Then  'detecta tecla S1"

pulsamos s1 nosotros, pero quien activa la variable S1_on


Pudes sacarme de dudas.

un saludo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #413 en: 01 de Junio de 2008, 15:12:40 »
Para entenderlo habría que plantearse como si el programa funcionara por eventos (que no lo es pero intento simularlo). Al pulsar una tecla se supone que no debe de estar pulsada la otra, por lo menos dentro de la rutina de ajuste. Cuando una tecla se pulsa dentro de las condiciones adecuadas la rutina marca esa tecla como pulsada, para que se active la rutina timer de esa tecla impidiendo que se repita esa rutina hasta pasado cierto tiempo, a un que se mantenga pulsada la tecla o se produzca el efecto rebote. Hay muchas formas de lograr esto y esta es una, en la siguiente versión de programa que te dejo que no esta publicada esta mas optimizado el sistema. Pero lo mejor para tener un buen tacto en las teclas es hacer la lectura de las mismas en el vector de interrupciones. Al utilizar timer para el control de las teclas se consigue un buen tacto y un nivel de fallo muy bajo también, pero mediante interrupciones es el mejor sistema. Lo principal es que según valla el programa creciendo en longitud se mantenga un “tacto” adecuado.
“tacto” podríamos traducirlo como agradable al ser pulsada, ósea que responda sin demoras, si pulsas rápido responde rápido y si pulsas lento responde lento.

Resumiendo, s1_on, la activa la misma rutina que se debe de ejecutar cuando se pulsa esa tecla, pero siempre que el timer1_ms (contador o demora) asociado a esa tecla lo permita.

Otra aclaración, timer1_ms es una base de tiempos o contador que se incrementa cada 1ms. Si sustituyéramos el timer1_ms por un WaitMs provocaremos una parada del programa, mientras que las demoras por bases de tiempos solo bloquean una rutina en concreto del programa permitiendo que el resto de rutinas se ejecuten normalmente. Arriesgando mucho podríamos decir que es una simulación muy tosca de multitarea pero que nos da unos resultados magníficos. A la vista queda cuando estamos haciendo los ajustes los segundos se siguen incrementando a su tiempo, el parpadeo del digito seleccionado para ajustar también sigue parpadeando sin hacer cosas raras, he incluso incrementamos su valor, se enciende el led de la tecla pulsada, y todo parece que se haga al mismo tiempo.

« Última modificación: 01 de Junio de 2008, 15:19:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #414 en: 01 de Junio de 2008, 15:27:41 »
Hola dogflu66,

Revisando el programa en la parte del rtc cuando llegas a la parte de leer y escribir dato creo que esta erroneo se escribe con 0xD0 y se lee con 0xD1

i2cwrite sda, scl, 0xD0, Addr, Data
i2clead sda, scl, 0xD1, Addr, Data

estan cambiados.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #415 en: 01 de Junio de 2008, 15:32:49 »
Pues lo miro, seria un error grave. El programa lo tengo funcionando ahora mismo y no observo fallos.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #416 en: 01 de Junio de 2008, 15:38:33 »
Hola dogflu66,

Revisando el programa en la parte del rtc cuando llegas a la parte de leer y escribir dato creo que esta erroneo se escribe con 0xD0 y se lee con 0xD1

i2cwrite sda, scl, 0xD0, Addr, Data
i2clead sda, scl, 0xD1, Addr, Data

estan cambiados.

Todo lo tengo con 0xD0, y no observo fallos. Tendría que repasar el datasheet.
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #417 en: 01 de Junio de 2008, 16:56:26 »
Pues lo miro, seria un error grave. El programa lo tengo funcionando ahora mismo y no observo fallos.

Hola dogflu66,

mira en la linea 165 y 168 del txt anterior

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #418 en: 01 de Junio de 2008, 18:34:05 »
Ya hice memoria, hace tanto tiempo que no me acordaba el por qué da lo mismo utilizar 0xD1 o 0xD0, es que el BIT menos significativo la función I2CWrite lo pone de forma automáticamente a 0 y la función I2CREAD lo pone a 1. Da lo mismo el valor de este ultimo BIT, el compilador lo rescribe según el caso. Ya tuvimos una polémica parecida con la función del ADC, puedes programar los registros del modulo ADC para hacer lecturas de 8Bit, pero deforma automática al usar la función ADCIN lo reprograma para trabajar a 10bit, por eso hay por el índice una función especial para trabajar a 8bit con el ADC.

De todas formas buen detalle, me has obligado a repasar el datasheet del RTC... :wink:


Nota: Actualmente la selección de 8bit o 10bit del adc es de forma automática. Si se usa una variable de lectura del ADC de 8bit el ADC se confiugra a 8Bit y si se usa una variable doble el ADC se configura a 10bit, se entiende que siempre que se usen las funciones integradas en el sistema del ADC.
« Última modificación: 17 de Abril de 2011, 11:00:24 por dogflu66 »
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #419 en: 01 de Junio de 2008, 23:42:18 »
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.


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


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

« Última modificación: 02 de Junio de 2008, 07:34:23 por pajaro »