Autor Tema: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)  (Leído 39615 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« en: 19 de Junio de 2008, 15:28:08 »
hola amigos.

necesito vuestra ayuda, desde hace varias semanas llevo con el DS1307 y el pic16F877A lo intento programar en PSI el Circuito lo monte en Proteus 7.

tengo dos problemas:

1º el SPI tarda mucho, pero mucho mucho, en empezar a simular y eso que los tiempos son en segundos.

el programa hace que si el RB1=0 carga los datos en los registros del ds1307 es decir inicializa los registros
con unos valores, lee los  valores del registro del ds1307, y los plasma en el lcd, creo que hay algunos errores en el codigo, pero por lo menos deberia de mostrar algo en el lcd y no lo hace.

el programa es este:

'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTD  'el bus de datos sera el puerto A
Define LCD_DBIT = 4  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de nrol RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 1000  'Tiempo de espera despues de ejecutar un comand 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, solo se ejecuta una vez en mSeg.
'-----------------------------------Puerto I2C-----------------------------------------------------
Symbol sda = PORTC.4  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTC.3  'asignamos nombre al pin que hara de SCL del puerto I2C
'***********************************DEFINICION DE VARIABLES**************************************
'--------------------------------------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
'------------------------------------------ASIGNACIONES------------------------------------------
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------
'ADCON1 = 0x07  'Los pin PORTA como I/O
'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
TRISC = 0x00
TRISD = 0x00
TRISE = 0x00
TRISA.4 = 1  'como entrada (RA4, adc)
TRISB.1 = 1  'como entrada (RA6, tecla S1)
TRISB.2 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTC.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit 1  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "16f88LCD_RTC/I2C"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I2C"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
Lcdcmdout LcdClear
'-------------------------------------inicializacion del reloj-------------------------------------
'-------------------Aqui escribimos los valores para cargar al RTC---------------------------------
If RB1 = 0 Then  'si la tecla S1 esta pulsada pasaremos los datos al reloj
I2CWrite sda, scl, 0xd0, 0, 0x00  'segundos, escrito en hex, porque coincide en este caso con BCD del RTC
I2CWrite sda, scl, 0xd0, 1, 0x59  'minutos
I2CWrite sda, scl, 0xd0, 2, 0x23  'horas
I2CWrite sda, scl, 0xd0, 3, 0x01  'dia de la semana
I2CWrite sda, scl, 0xd0, 4, 0x31  'dia del mes
I2CWrite sda, scl, 0xd0, 5, 0x12  'mes
I2CWrite sda, scl, 0xd0, 6, 0x06  'año
I2CWrite sda, scl, 0xd0, 7, 0x10  'salida a 1hz
Endif
'--------------------------------------Main Programa-----------------------------------------------
main:
Gosub print_lcd  'actualiza la hora
WaitMs 100  'pausa de 100mSeg.
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
print_lcd:  'lee la hora del RTC, la pasa a decimal y la envia al lcd
i = 0
While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
I2CRead sda, scl, 0xd1, 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 %11110000  'minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %10110000  'horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %11110000  'dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %11110000  'dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %11110000  '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
Lcdcmdout LcdLine1Home  'cursor del lcd a la izquierda en la linea 1
If reg(2) < 10 Then Lcdout "0"  'si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2), ":"  'escribe la hora y el separador
If reg(1) < 10 Then Lcdout "0"  'si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1), ":"  'escribe los minutos y el separador
If reg(0) < 10 Then Lcdout "0"  'si segundos es inferior a 10 escribe el cerodelante
Lcdout #reg(0)  'escribe los segundos
Lcdcmdout LcdLine2Home  'cursor del lcd a la izquierda en la linea 2
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"
Lcdout "/"  'escribe separador
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 y el separador
If reg(5) < 10 Then Lcdout "0"  'si mes es inferior a 10 escribe cero
Lcdout #reg(5), "/"  'escribe el mes, separador y los dos primeros digitos del año de 4 digitos
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
Return                                           
End               

-------------

el segundo problema es la simulacion del programa en proteus, el LCD me ta dando la lata no se si es por el refresco, o por las famosas resistencias, lo que si que se, es que en el debug del i2c se ve como escribe, bueno yo creo que escribe, me que me sacaran de dudas.

hay alguna forma de poner el archivo *.bas del SPI dentro del Proteus7 y seguir la ejecucuin de instruciones.


Me gustaria que alguen me ayudase , si fuese algun moderador mejor,
llevo muchas semanas con esto y no se que ocurre, entre los retrasos del SPI y los problemas con el LCD de proteus, entre las resistencais pull-up y los warning, ya no se que hago mal.


gracias, por su calaboracion.


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #1 en: 21 de Junio de 2008, 08:45:26 »
Prueba a dejar el mensaje en el foro de simuladores a ver si allí te responden.
Saludos desde Granada, España.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #2 en: 23 de Junio de 2008, 13:18:02 »
hola

como diría jack el destripador y determinado componente del Foro por el que tengo gran estima: vayamos por partes...

parte 1
programación en pic simulator ide (psi a partir de ahora) y simulación también en psi... tus problemas con los tiempos. bueno, siempre que uses el lcd serás un buen candidato al aburrimiento. para corregirlo, modifica el valor de las siguientes líneas:
Define LCD_COMMANDUS = 2000   'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50   'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 1  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
para que tengan un valor bajo. por defecto estos valores están en 5000, 100 y 100 y la configuración que te muestro es la utilizada por el amigo dogflu66, observa el valor entre paréntesis ya que será el valor a usar para la compilación final.

usa lo siguiente después de la declaración del lcd: Define SIMULATION_WAITMS_VALUE = 1 este valor determina el valor de todos los WaitMs usados en el programa, y su valor puede estar entre 1 y 10 si no recuerdo mal. no olvides eliminarla o convertirla a comentario en la compilación final

para la simulación del i2c no cuentas con un ds1307 pero si con una memoria eeprom que te permite simular la escritura y lectura de datos.

parte 2
programación en psi y simulación en proteus... tate, ojo con las sorpresas, que como las meigas (brujas) en mi pueblo, habelas hailas y el ejemplo ya lo has podido ver con los lcd de 4 bits y que no se corrigen de todo usando 8 bits. sigo sin saber el porque, pero para mi al menos es un buen aliciente para no mezclar ambos.

en cualquier caso ni proteus ni el simulador del psi sustituyen a la practica y haciendo una pequeña búsqueda en el Foro verás cuanta gente lo corrobora. cosas que no funcionan en proteus si lo hacen en circuito, y al contrario...

por otra parte, conociendo las limitaciones o incompatilibilidades que puedan existir entre psi y proteus, contaremos con la enorme ventaja de poder simular ciertos circuitos, entre ellos el reloj con ds1307... y lcd a 8 bits, claro, porque hacerlo funcionar a 4 bits personalmente he desistido.

un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #3 en: 23 de Junio de 2008, 13:21:44 »
bueno, y ahora entramos en materia...

ummmm... veamos... i2c, ds1307, proteus y psi = conocimientos nulos sobre los dos primeros jaja y básicos sobre psi (que tanto me gustó en un principio pero que finalmente no termina de convencerme)
¿y por donde empiezo? bueno, recurriendo a los que saben, claro está.
ds1307: su hoja de datos, un excelente artículo de RedPic en su web: http://picmania.garcia-cuervo.com/Proyectos_AUX_RTC.php y una búsqueda en el Foro que me proporciona lectura para un rato.
psi - i2c: lectura-repaso del manual para conocer-entender su funcionamiento y comandos con sus correspondientes parámetros. ver archivo de ejemplo que escribe datos a una memoria eeprom para su posterior lectura...y que simulo sin problemas en psi... ah!, pues no parece tan difícil esto.
volvamos a los que saben del tema: lectura -obligada- de algunos post de dogflu66. para empezar:

http://www.todopic.com.ar/foros/index.php?topic=14917.msg95975#msg95975

prestando atención:
PD: Recuerdo que los registros del RTC DS1307 se programan y se leen en BCD.

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.

hago un pequeño inciso. a pesar de que tal como indica dogflu66 i2cwrite y i2cread controlan el valor del bit menos significativo poniéndolo a 0 o a 1, yo prefiero indicárselo a mano ya que no se si esta es una propiedad del psi o de todos los compiladores en general y de esta forma ya tengo la costumbre.
viendo la hoja de datos del ds1307, la figura 2 de la página 3 observo que: 'The real time clock registers are located in address locations 00h to 07h. The RAM registers are located in address locations 08h to 3Fh'.
y en la forma siguiente:
00h --> segundos
01h --> minutos
02h --> horas
03h --> día semana (1=domingo...7=sábado)
04h --> día mes
05h --> mes
06h --> año
07h --> control
esto viene a cuenta de que al principio no me funcionaba como era debido porque no teniendo la intención de usar el día de la semana almacenaba en esa posición un dato incorrecto. una vez que me dí cuenta, guardé todos y cada uno de los datos aunque después solo muestro los que me interesan.

para continuar, aunque pendiente de relectura: http://www.todopic.com.ar/foros/index.php?topic=14917.msg103916#msg103916

el siguiente paso es ponerme ya manos a la obra

un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #4 en: 23 de Junio de 2008, 13:28:24 »
por fin el programa y la simulación en proteus... funcionando...

Código: [Seleccionar]
'Pic 16f84A
Define CONF_WORD = 0x3ff1
Define CLOCK_FREQUENCY = 4

'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 8  'indicamos que el bus de datos del lcd sera de 8bit
Define LCD_DREG = PORTB  'el bus de datos sera el puerto B
Define LCD_DBIT = 0  '(0/4) indiferente en bus de 8 bits
Define LCD_RSREG = PORTA  'el bit RS está en el puerto A
Define LCD_RSBIT = 0  'se usa RA0 RS
Define LCD_EREG = PORTA  'el bit E está en el puerto A
Define LCD_EBIT = 1  'se usa RA1 para E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.

Lcdinit

'-----------------------------------Puerto I2C-----------------------------------------------------
Symbol sda = PORTA.2  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTA.3  'asignamos nombre al pin que hara de SCL del puerto I2C
'***********************************DEFINICION DE VARIABLES**************************************

'--------------------------------------Variables Programa----------------------------------------
Dim addr(7) As Byte
Dim data As Byte
Dim escribe As Byte

Dim sec As Byte
Dim min As Byte
Dim hour As Byte
Dim day As Byte
Dim daym As Byte
Dim month As Byte
Dim year As Byte
Dim d_hi As Byte
Dim d_lo As Byte

WaitMs 1000

'bucle que escribe los datos iniciales en DS1307
For addr = 0 To 6
escribe = LookUp(0x00, 0x15, 0x16, 0x01, 0x22, 0x06, 0x08), addr
I2CWrite sda, scl, 0xd0, addr, escribe  'escribe los datos al DS1307
Next addr

'bucle para lectura de datos desde el DS1307
loop:
addr = 0
I2CRead sda, scl, 0xd1, addr, sec
addr = 1
I2CRead sda, scl, 0xd1, addr, min
addr = 2
I2CRead sda, scl, 0xd1, addr, hour
addr = 3
I2CRead sda, scl, 0xd1, addr, daym
addr = 4
I2CRead sda, scl, 0xd1, addr, day
addr = 5
I2CRead sda, scl, 0xd1, addr, month
addr = 6
I2CRead sda, scl, 0xd1, addr, year

'escribimos resultado en el lcd
Lcdcmdout LcdClear
Lcdout " Hora: "
data = hour
Gosub print
Lcdout "."
data = min
Gosub print
Lcdout "."
data = sec
Gosub print
Lcdcmdout LcdLine2Home
Lcdout "Fecha: "
data = day
Gosub print
Lcdout "/"
data = month
Gosub print
Lcdout "/0", #year

WaitMs 100
Goto loop

End                                               

'subrutina de conversión
print:
d_hi = data / 16
d_lo = data Mod 16
If d_hi < 10 Then
Lcdout #d_hi
Else
Lcdout "X"
Endif
If d_lo < 10 Then
Lcdout #d_lo
Else
Lcdout "X"
Endif
Return                                           



uso un pic 16f84a por motivos de sencillez y para evitarme andar configurando los registros del 16f877a (tu no olvides hacerlo) y por los motivos antes explicados, un lcd de 8 bits.

la forma de conversión de los datos es diferente a la que usa el amigo dogflu66 y la he tomado de un ejemplo que tienes en la web de psi (http://www.oshonsoft.com/picexamples.html - EXAMPLE 9: I2C communication with PCF8583 real time clock). creo que entre la explicación tan detallada de dogflu66 y esta otra versión, te quedará claro su funcionamiento.

para terminar, si tu intención es llevar a cabo el proyecto que mencionas aquí:
http://www.todopic.com.ar/foros/index.php?topic=22218.msg175377#msg175377 yo en tu lugar lo iría desglosando en porciones más pequeñas para que su resolución me fuera más factible.
también me plantearía seriamente si psi es el lenguaje más adecuado para llevarlo a término y sobre todo -sobre todo- empezaría por construirme o comprarme un pequeño entrenador que me permitiera verificar las cosas en la práctica. si te lo quieres construir en el Foro encontrarás varias opciones y una buena opción de compra podría ser esta: http://www.futurlec.com/PICDevBoard.shtml o esta: http://www.futurlec.com/PIC16F877_Controller.shtml a mi entender muy económicas

un saludo
« Última modificación: 23 de Junio de 2008, 13:41:07 por xocas06 »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #5 en: 26 de Junio de 2008, 05:31:01 »
'------------------------------------------ASIGNACIONES------------------------------------------
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------

ALLDIGITAL 'DEFINE QUE LAS ENTRADAS SERAN DE TIPO I/O

'ADCON1 = 0x07  'Los pin PORTA como I/O
'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
TRISC = 0x00
TRISD = 0x00
TRISE = 0x00
TRISA.4 = 1  'como entrada (RA4, adc)
TRISB.1 = 1  'como entrada (RA6, tecla S1)
TRISB.2 = 1  'como entrada (RA5, tecla S2)
PORTB.3 = 1  'luz lcd a on (RB3)
PORTC.7 = 1  'led amarillo a off
PORTB.0 = 1  'led verde a off
'**************************************Inicio Programa*********************************************



En el programa que dejas de ejemplo no defines como deben de trabajar los pin del micro.
Si no sabes hacerlo (ya te lo indique en otro post)  puedes utilizar el comando abreviado ALLDIGITAL.
Si no indicas como trabajaran los pin, el micro (digital o analogico) trabajara en modo analogico. En esto no tiene
nada que ver el compilador, ya que es como el micro viene programado de casa.

Hay que tener cuidado cuando se utiliza el Basic de psi, ya que como otros lenguajes orientados a lo profesional no hace lo que no se le dice, cosa que se agradece mucho.

ALLDIGITAL 'DEFINE QUE LAS ENTRADAS SERAN DE TIPO I/O, ósea digitales.

Con TRISx se le indica al compilador que un pin o bloque de pin de un puerto determinado trabajará como entrada o salida, pero no indica si trabajara en modo digital o modo analógico. Y otro tema muy importante a tener en cuenta a parte de configurar correctamente los modulos del pic es configurar los fuses del registro de arranque del pic.

Y como ultimo la utilización de un simulador por un principiante debe de ir siempre supervisada por un profesor, ya que los simuladores hacen verdaderas salvajadas que lo único que hacen es echar la moral del principiante por los suelos.
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #6 en: 17 de Julio de 2008, 20:17:15 »
hola amigo dogflu66

yo sigo con esto del reloj erre que erre.

-----------------------
En el programa que dejas de ejemplo no defines como deben de trabajar los pin del micro.
Si no sabes hacerlo (ya te lo indique en otro post)  puedes utilizar el comando abreviado ALLDIGITAL.
Si no indicas como trabajaran los pin, el micro (digital o analogico) trabajara en modo analogico. En esto no tiene
nada que ver el compilador, ya que es como el micro viene programado de casa.

Hay que tener cuidado cuando se utiliza el Basic de psi, ya que como otros lenguajes orientados a lo profesional no hace lo que no se le dice, cosa que se agradece mucho.

ALLDIGITAL 'DEFINE QUE LAS ENTRADAS SERAN DE TIPO I/O, ósea digitales.

Con TRISx se le indica al compilador que un pin o bloque de pin de un puerto determinado trabajará como entrada o salida, pero no indica si trabajara en modo digital o modo analógico. Y otro tema muy importante a tener en cuenta a parte de configurar correctamente los modulos del pic es configurar los fuses del registro de arranque del pic.

Y como ultimo la utilización de un simulador por un principiante debe de ir siempre supervisada por un profesor, ya que los simuladores hacen verdaderas salvajadas que lo único que hacen es echar la moral del principiante por los suelos.

-------------------------------
lo que he puesto en rojo, te refieres...: los fuses, es lo que lleva el tipo de cristal, la frecuencia , lo que viene a llamarse en el psi configuracion del bit lo que suele ir en cabecera verdad.


un saludo.




Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #7 en: 17 de Julio de 2008, 22:19:58 »
amigo xocas06


Código: [Seleccionar]
'Pic 16f84A
Define CONF_WORD = 0x3ff1 ' configuras la palabra
Define CLOCK_FREQUENCY = 4 'configuras la frecuencia
'---->¿ambos los sacas del define bit verdad?

'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 8  'indicamos que el bus de datos del lcd sera de 8bit
Define LCD_DREG = PORTB  'el bus de datos sera el puerto B
Define LCD_DBIT = 0  '(0/4) indiferente en bus de 8 bits
Define LCD_RSREG = PORTA  'el bit RS está en el puerto A
Define LCD_RSBIT = 0  'se usa RA0 RS
Define LCD_EREG = PORTA  'el bit E está en el puerto A
Define LCD_EBIT = 1  'se usa RA1 para E
Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 100  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 100  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'------------------------------------------------------
'----->¿porque usas 8 bit en vez de 4?

Lcdinit 0 ' ----->no pones nada (sera cero)

'-----------------------------------Puerto I2C-----------------------------------------------------
Symbol sda = PORTA.2  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTA.3  'asignamos nombre al pin que hara de SCL del puerto I2C
'***********************************DEFINICION DE VARIABLES**************************************

'--------------------------------------Variables Programa----------------------------------------
'------variables del I2C---------??
Dim addr(7) As Byte '-----> registro de control SQW/OUT generar onda cuadrada o un vector de 7 elementos
Dim data As Byte ' datos del i2c
Dim escribe As Byte ' para la duncion lookup

'------varibles del DS1307----(esto es el valor de los registros)-----------------------
Dim sec As Byte 'segundos
Dim min As Byte 'minutos
Dim hour As Byte 'hora (como difieres de 12 o 24 se que hay un reg para eso)
Dim day As Byte ' dia de la semana(L M X J V S D)
Dim daym As Byte '? dia del mes (como sabes si es 30, 31, 28,29)
Dim month As Byte' meses Enero ..Febr. Mar..
Dim year As Byte ' Año (En que formato 2000, 02)

'----------------parte alta y baja--------
Dim d_hi As Byte
Dim d_lo As Byte

WaitMs 1000

'bucle que escribe los datos iniciales en DS1307
For addr = 0 To 6
escribe = LookUp(0x00, 0x15, 0x16, 0x01, 0x22, 0x06, 0x08), addr
I2CWrite sda, scl, 0xd0, addr, escribe  'escribe los datos al DS1307
Next addr

'bucle para lectura de datos desde el DS1307
'------------------------
loop:
addr = 0
I2CRead sda, scl, 0xd1, addr, sec
addr = 1
I2CRead sda, scl, 0xd1, addr, min
addr = 2
I2CRead sda, scl, 0xd1, addr, hour
addr = 3
I2CRead sda, scl, 0xd1, addr, daym
addr = 4
I2CRead sda, scl, 0xd1, addr, day
addr = 5
I2CRead sda, scl, 0xd1, addr, month
addr = 6
I2CRead sda, scl, 0xd1, addr, year
'-----------esto loop: sepodia haber escrito -----
'como para la carga de datos iniciales--me ronda esa duda

'---------parte de sacar datos por el LCD----
'escribimos resultado en el lcd
Lcdcmdout LcdClear ' limpia lcd
Lcdout " Hora: " 'saca por display en linea 1 "hora:"
data = hour  '---->que hace aqui me pierdo iguala una variable a otra...me pierdo..
Gosub print   '--->y llama a yna funcion..me pierdo..
Lcdout "."      'saca punto por lcd para separar algo
data = min
Gosub print
Lcdout "."
data = sec
Gosub print
Lcdcmdout LcdLine2Home  ' se posiciona en la segunda linea
Lcdout "Fecha: "
data = day
Gosub print
Lcdout "/"
data = month
Gosub print
Lcdout "/0", #year

WaitMs 100
Goto loop

End                                               

'subrutina de conversión (conversion de que)
print:
d_hi = data / 16 ' parte alta de algo (d_hi era un byte) no entiendo
d_lo = data Mod 16 ' parte baja de algo.....
If d_hi < 10 Then 'para que sirve...me pierdo..
Lcdout #d_hi
Else
Lcdout "X"  ' y esto que es sacas ...algo se me escapa..
Endif
If d_lo < 10 Then
Lcdout #d_lo
Else
Lcdout "X"
Endif
Return                                           



uso un pic 16f84a por motivos de sencillez y para evitarme andar configurando los registros del 16f877a (tu no olvides hacerlo) y por los motivos antes explicados, un lcd de 8 bits.


-------------------------
a que registros te refierres a los de configuracion de bit del PSI y lo de usar 8 bit en vez de 4, que es eso ....de que motivos antes emcionados ...algo se me escapa..
---------------



la forma de conversión de los datos es diferente a la que usa el amigo dogflu66 y la he tomado de un ejemplo que tienes en la web de psi (http://www.oshonsoft.com/picexamples.html - EXAMPLE 9: I2C communication with PCF8583 real time clock). creo que entre la explicación tan detallada de dogflu66 y esta otra versión, te quedará claro su funcionamiento.
---------------------

lo del funcionamineto del I2C es sencillo para escribir en I2C: I2CWrite sda, scl, 0xd0, addr, dato
para leer I2CRead sda, scl, 0xd1, addr, dato

yo vi el ejeplo que viene con la version el del i2c ,

--------------------------------------------------------------------------------------------------------------------------
Dim addr As Word  'variable for storing EEPROM byte address
Dim data As Byte  'variable for storing EEPROM byte data

Symbol sda = PORTC.2  'nickname for SDA pin
Symbol scl = PORTC.3  'nickname for SCL pin

For addr = 0 To 31  'the first 32 bytes will be written
   data = 255 - addr  'set the data byte to be written
   I2CWrite sda, scl, 0xa0, addr, data  'perform I2C write operation to serial EEPROM
   WaitMs 1  'small delay interval
Next addr
-----------------------------------------------------------------------------------------------------------------------------
si pero como consigues escribir cadenas o palabras, como las troceas o lo hace solo el programa, imagina que quieres escribir una palabra o una brase enuna memoria 24cl.. como lo haces..(esto es otra duda)

bueno como decia..

el sda y scl lo fijamos nosotros segun el pic ¿es asi no? en unos esta en un ouerto y en otro en otro.
La direcion de escritura o lectura(0xD0 o 0xD1) dependen del dispositivo que queramos aceder
addr es la direcccion a escribir o leer y data es el dato a escribir o leer.
puedes corregirme si me equivoco, te lo agradeceria

--------------


para terminar, si tu intención es llevar a cabo el proyecto que mencionas aquí:
http://www.todopic.com.ar/foros/index.php?topic=22218.msg175377#msg175377 yo en tu lugar lo iría desglosando en porciones más pequeñas para que su resolución me fuera más factible.

la verdad es que si, esa es mi intencion, pero mas que un proyecto parece una carrera de salto de obtaculos.
he encontradado alguna barreras, por ejemplo el chip receptor de radio, me gustaria que fuese de esos de bajo consumo que tienen auto scan, en vez de ruletita analogica para el cambio de las emisoras, tienen botones, ademas si se destripan llevan pocas cosas, condensadores de lenteja, 3 pulsadores, 3 o4 resistencias,3 transistores, 5o 6 resistencias, conector de audio, una bobina y el chip  D7088
data  http://www.datasheetcatalog.com/datasheets_pdf/D/7/0/8/D7088.shtml

como esas radios de propaganda que suelen dar como esta

http://www.sz-wholesale.com/shenzhen_China_products/FM-Auto-Scan-Radio_1.htm   --->modelo TDC1465

----------------------
 
también me plantearía seriamente si psi es el lenguaje más adecuado para llevarlo a término y sobre todo -sobre todo- empezaría por construirme o comprarme un pequeño entrenador que me permitiera verificar las cosas en la práctica. si te lo quieres construir en el Foro encontrarás varias opciones y una buena opción de compra podría ser esta: http://www.futurlec.com/PICDevBoard.shtml o esta: http://www.futurlec.com/PIC16F877_Controller.shtml a mi entender muy económicas

con respecto al lenguaje... pos no se amigo, el basic parece facil, elegi PSI porque pudes programar y ver o probar si funciona, el proteus pareceun buen simulador lo malo es que no deje meterle el el *.bas ,estado con el miKroe y el proton se parecen .y el PBP tambien pero no comprendo su su forma de interfece, yo programe antes en c con el 8051 y pareceia facil, su ventanica en ms-2 pero el proteus parece bueno para la simulacion pero hay componentes que no tiene (D7088 fm reciver y el ISD51xx  chip coder voice) y alguno errores que muchas veces no comprendes..

lo bueno, es algo que tu puedas simular y probar sin tener que montar o comprar componentes que los tiempos estan caros,
de todas formas conservo mis 2 placas blancas, las famosas GL-12 de montajes de pueba.ahora ando buscado un lcd de 20x2, 20x4 haber si lo reciclo de algun sitio pero si me comprase uno, seria alfanumerico y de los que tienen luz.

ademas lo de programar cucachas con el t20-se en algunos ordanadores da problemas (por ejemplo portatiles) por ahi tengo u pos de un programador multi puerto (puerto paralelo - Serie -usb ) tambien en proyecto. No se, si en este foro o en otro.

bueno amigo no me quiero liar os agradezco a todos los consejos , seran muy bien recibidos, el saber no ocupa lugar..nos han dicho siempre..

un saludo, si puedes ayudarme en algo te lo agredeceria..el programa lo comente con mis dudas pudes revisarlo gracias..

un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #8 en: 18 de Julio de 2008, 16:55:03 »
vayamos por partes...

-. Define CONF_WORD = 0x3ff1 es el resultado de configurar los fuses en 'opciones/configuration bits'
-. Define CLOCK_FREQUENCY = 4 - me gusta indicarle siempre las cosas para mayor claridad

-. uso 8 bits para poder simularlo en proteus - y hemos hablado antes de esto...
-. lcdinit admite varios valores y muestra un cursor en función de ello

-. tanto a la hora de introducir o leer datos del ds1307 tienes que tener muy en cuenta su orden correspondiente en 00H..07H para que las cosas vayan bien. simplemente te doy la idea de como hacerlo...

-. a la variable data se le va asignando el valor leído (hora...etc) y llama a 'print' para hacer la conversión ya que el valor está en formato bcd. las 'x' en el lcd denotarían un valor fuera de límites. te muestro esta opción como alternativa a la mostrada por dogflu66... y te recomiendo una atención detallada a su forma de hacerlo porque aprenderás cosas muy interesantes sobre como actúar sobre puertos, registros, periféricos y un largo etcétera.

-. un 16f877a está cargado de entradas analógicas, comparadores, registros por aquí y por allá para configurar y a mi que no me gusta dejar cosas al azar me pareció demasiado trabajo en aquel momento y como ejemplo incluso más claro opté por el 16f84a

-. ya dediqué demasiado tiempo tratando de que un lcd de 4bits de un programa compilado desde psi me funcione en proteus -motivos antes mencionados- en la práctica sé que funciona y con cualquier otro compilador también en proteus... ni un segundo más de mi tiempo

-. i2c es un puerto de comunicación síncrono -no recuerdo donde está pero hay en el Foro un estupendo artículo de RedPic obre ello... te invito a buscarlo- y consultes luego de leerlo

-. si el pic tiene i2c por hardware lógicamente lo usaremos siempre que sea posible.

-. si psi es el lenguaje más adecuado... bueno, también tengo derecho a decir tonterias... no se si lo es o no... dependerá quién esté al teclado

y para terminar, y como opinión muy personal, cuando lleves el proyecto a la práctica verás de que poco te ha servido el simulador por software.

un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #9 en: 18 de Julio de 2008, 18:59:03 »
Ya te lo dijo todo xocas06, no tengo nada que añadir.

PD: Wait = Pause = Delay => kk, Simulador = kk^2
Saludos desde Granada, España.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #10 en: 18 de Julio de 2008, 20:02:23 »
Ya te lo dijo todo xocas06, no tengo nada que añadir.

PD: Wait = Pause = Delay => kk, Simulador = kk^2

hola.
dogflu66 me intentas decir que el simulador no es el adecuado,
 
un saludo.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #11 en: 18 de Julio de 2008, 20:14:01 »
vayamos por partes...

-. Define CONF_WORD = 0x3ff1 es el resultado de configurar los fuses en 'opciones/configuration bits'
-. Define CLOCK_FREQUENCY = 4 - me gusta indicarle siempre las cosas para mayor claridad

-. uso 8 bits para poder simularlo en proteus - y hemos hablado antes de esto...
-. lcdinit admite varios valores y muestra un cursor en función de ello

-. tanto a la hora de introducir o leer datos del ds1307 tienes que tener muy en cuenta su orden correspondiente en 00H..07H para que las cosas vayan bien. simplemente te doy la idea de como hacerlo...

-. a la variable data se le va asignando el valor leído (hora...etc) y llama a 'print' para hacer la conversión ya que el valor está en formato bcd. las 'x' en el lcd denotarían un valor fuera de límites. te muestro esta opción como alternativa a la mostrada por dogflu66... y te recomiendo una atención detallada a su forma de hacerlo porque aprenderás cosas muy interesantes sobre como actúar sobre puertos, registros, periféricos y un largo etcétera.

-. un 16f877a está cargado de entradas analógicas, comparadores, registros por aquí y por allá para configurar y a mi que no me gusta dejar cosas al azar me pareció demasiado trabajo en aquel momento y como ejemplo incluso más claro opté por el 16f84a

-. ya dediqué demasiado tiempo tratando de que un lcd de 4bits de un programa compilado desde psi me funcione en proteus -motivos antes mencionados- en la práctica sé que funciona y con cualquier otro compilador también en proteus... ni un segundo más de mi tiempo

-. i2c es un puerto de comunicación síncrono -no recuerdo donde está pero hay en el Foro un estupendo artículo de RedPic obre ello... te invito a buscarlo- y consultes luego de leerlo

-. si el pic tiene i2c por hardware lógicamente lo usaremos siempre que sea posible.

-. si psi es el lenguaje más adecuado... bueno, también tengo derecho a decir tonterias... no se si lo es o no... dependerá quién esté al teclado

y para terminar, y como opinión muy personal, cuando lleves el proyecto a la práctica verás de que poco te ha servido el simulador por software.

un saludo



hola Xocas06

entre lineas creo haber visto que  el proteus tiene un problema cuando el bus de datos es de 4 bit,
¿es eso cierto?
si esto es asi, cual es el modo de solucionarlo.

antes en el post, dices que dedicaste tiempo en ello, si lo solucionaste me lo podias contar.

un saludo



Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #12 en: 19 de Julio de 2008, 10:23:01 »
entre lineas creo haber visto que  el proteus tiene un problema cuando el bus de datos es de 4 bit,
¿es eso cierto?
si esto es asi, cual es el modo de solucionarlo.

antes en el post, dices que dedicaste tiempo en ello, si lo solucionaste me lo podias contar.

creo que la primera vez que te contesté a esta pregunta fue en el subforo de Isis y desde entonces volví a hacerlo alguna vez más pero lo haremos de nuevo para dar ya por terminada esta parte al menos.
proteus no muestra el menor problema con lcd a 4bits si uso proton, mikrobasik o pbp y creo que tampoco lo muestra en assembler o ccs pero no funciona en psi y aún usando una configuración de 8bits tiene sus problemas.
le dediqué algún tiempo a tratar de saber el porqué -repasa mis respuestas en los diferentes lugares que has tratado de encontrar una solución a este tema- pero como resulta que -en principio- no me preocupa que psi no me funcione bien con proteus, o proteus con psi pues he decidido que no le dedico más de mi tiempo. si tu o alguien sabe o llega a saber el porque siempre será bueno que lo comparta.

la configuración que te he dado de lcd 4bits funciona perfectamente en la práctica, así que ni un segundo más de mi tiempo a esta relación psi-proteus-lcd de 4bits

un saludo

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #13 en: 20 de Julio de 2008, 07:04:04 »
que suerte tenemos en este Foro de que haya gente así: compartiendo esfuerzo y conocimiento... no dejes de leerlo amigo pajaro

un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: DS1307 - Pic16F877A - Proteus 7 - PSI (Problemas)
« Respuesta #14 en: 20 de Julio de 2008, 08:20:51 »
Ya te lo dijo todo xocas06, no tengo nada que añadir.

PD: Wait = Pause = Delay => kk, Simulador = kk^2

hola.
dogflu66 me intentas decir que el simulador no es el adecuado,
 
un saludo.

Cualquier simulador por soft = KK.
Saludos desde Granada, España.


 

anything