Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

21/06/2011 #1


Problema comunicacion 2x16f877a+1Pc mediante SPI
Hola a todos, creo que este hilo es el correspondiente al tema que voy a tratar.

Bueno, estoy diseñando un circuito para comunicar mediante SPI dos 16f877a y luego, mediante el USART conectar uno de los dos al Pc.

Las herramientas que utilizo son. Pic Simulator Ide + Proteus 7.7 Sp2.

Despues de investigar durante casi una semana y aprender mas o menos como funciona el SPI me puse a la tarea y he conseguido configurando en modo manual con el PSI los registros correspondientes para una comunicacion Maestro-> Esclavo sin problemas, lo de modo manual me refiero a que el PSI ya tiene unos comandos para hacer las configuraciones más rápidas y sin tanto código, por ejemplo para escribir/leer de la eeprom existen dos caminos, el primero en modo "manual" modificando los registros a mano y el segundo con un simple Read/Write.

Bien, pues lo que quiero conseguir es que uno de los pics esté haciendo un trabajo y le mande la info al otro pic que será el que esté conectado al Pc, en raras ocasiones, el pic conectado al Pc deberá enviar datos al otro pic para realizar modificaciones.

Por ahora, como ya he dicho, he conseguido crear un for...next ( de 0 a 255 ) y enviarlo al esclavo mediante SPI recibiendolo sin problemas configurando el SPI a mano, los problemas que tengo con esto son los siguientes:

1.- No sé cuando el transmisor termina de enviar un byte para poder mandar el siguiente ( por ahora hago un WaitMs 1 )

2.- Sólo puedo enviar datos del maestro al esclavo. Pero mediante un par de pines puedo "apañar" algo para ir cambiando el sentido de las transmisiones

El mayor problema que tengo al configurar el SPI mediante las rutinas del PSI es que el mismo PSI no tiene emulador de SPI ( si lo tiene de USART y de I2C ) entonces voy un poco a ciegas con el proteus
Los errores que me dá el proteus es que tengo una contención en la línea SCK, me dice que las dos están como salidas en los dos pics, supongo que el PSI al trabajar sólo con I2C, las memorias siempre estarán en modo esclavo, supongo porque no encuentro la manera de cambiar el pin SCK para que sea entrada a no ser que lo haga en manual. También he tenido la idea de: Si funciona bien en manual, pues pongo el maestro en manual y el esclavo en auto o al revés, pero nada, no funca.

Espero haberme explicado bien porque creo que me he liado un poco.. jeje

Alguien podría hecharme una manita para comunicar 2 pics mediante SPI con el Pic simulator Ide?? ( todo el rollo resumido en una pregunta.. )

Adjunto un archivo el cual contiene dos carpetas.
SPI-Manual , es el que he conseguido hacer funcionar sin problemas

SPI- SpiPrepare , es el que quiero hacer funcionar pero no lo consigo ( he probado de todo )
aqui tambien hay un esquema de un ejemplo me encontré por ahí, lamentablemente sólo tengo los HEX y no puedo ver el programa.


Saludos! y perdón por el rollo.
21/06/2011 #2
Moderador

Avatar de Chico3001

Desafortunadamente SPI no soporta control de flujo, asi que la unica manera de que el maestro sepa que el esclavo recibio un dato es que el esclavo retransmita un dato de confirmacion o le envie un pulso por medio de algun otro pin digital....

En cuanto a la transmision el manual trae un ejemplo que creo que es lo que buscas:

Código:
LOOP BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
BRA LOOP ;No
MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
MOVWF RXDATA ;Save in user RAM, if data is meaningful
MOVF TXDATA, W ;W reg = contents of TXDATA
MOVWF SSPBUF ;New data to xmit
21/06/2011 #3


Hola Chico3001, gracias por la respuesta, he leído el datasheet del 16f877a varias veces, así conseguí enviar datos configurando los registros a mano.
El problema que tengo es que con los comandos del PSI ( picsimulatoride ) no puedo transmitir, en el proteus pongo el SPI debugger en modo moitor y sólo veo que se activa la lína de de SS pero datos no salen.
Los comandos que utilizo en el PSI son los siguentes ( según el manual ):

Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
Define SPI_CS_REG = PORTA
Define SPI_CS_BIT = 2

luego hay que poner

SpiPrepare

y para enviar datos

SpiCsOn
SpiSend [datos]
SpiCsOff

esto sería del maestro, en el esclavo debería de poner el pin SCK como input pero no sé como, he probado con TRIS y nada, ni caso.
El proteus me dá error en los nets SCK y SDO(maestro)->SDI(esclavo).

En el caso de que consiga enviar un byte y recibirlo ya inventaría algo para saber que el dato ya ha llegado como por ejemplo como tú dices, activar un pin digital o retransmitir el dato.

Saludos
21/06/2011 #4
Moderador

Avatar de Chico3001

Desafortunadamente ya tiene un rato que no agarro los PICs.. y ni te comento del Pic simulator.. deja muevo el tema al foro de microcontroladores para ver si alli hay mejores respuestas..
21/06/2011 #5


ok, seguiré investigando a ver si consigo algo. Me dá mucha rabia que en todos los sitios que se habla del SPI comentan que es muy fácil de implementar... y yo no puedo... grrr :(

Saludos
23/06/2011 #6


Si se puede hacer una comunicacion escritura/lectura. Yo despues de estudiar bastante este modulo (SPI) mas o menos lo comprendo bien. Te explico a ver si asi te resuelve la duda.

El maestro (uno de los 2 pics) es el que envia la señal CLK, es la señal que gobierna el envio y recepcion de los bits.

Cuando el maestro envia algo al esclavo utiliza el SDO (en el esclavo seria el SDI, debes conectar los pines cruzados). El maestro se encarga se crear la señal de CLK.

Pero y ahora cuando el esclavo desea enviar algo al maestro?? Pues en este caso el esclavo debe escribir (antes de la transmision) en el SSPBUF (buffer de envio 8bits). Ahora el maestro debe enviar algo, da lo mismo si son datos importantes como si son datos nulos. Entonces el maestro volvera a activar el CLK y a su vez el esclavo empezara a mandar datos por el SDO (y el maestro recibirlos por el SDI), una vez ocurre esto, en el maestro se activa un bit SSPSTAT.BF, tambien se activa una interrupcion SSPIF cuando se completa una transmision (ya sea recibido como enviado).

Otra cosa importante a tener en cuenta es que la transmision puede ser simultanea, es decir, que cuando el maestro envia el esclavo recibe y el esclavo envia y recibe el maestro, todo esto en el mismo instante.

Maestro<---->Esclavo

Para no complicarte mucho usa las librerias que traiga tu compilador, en el datasheet te vienen muchos datos, ejemplos y demas.

Otra cosa importante es que debes activar el pin SS en el esclavo y conectarlo a algun pin del maestro (tambien debes controlar este pin para activar/desactivar las transferencias entre ellos).
25/06/2011 #7


Hola Merlinz, más o menos lo entiendo y según he aprendido del datasheet la comunicacion puede ser al mismo tiempo, la unica condición es activar el pin SS del esclavo, así se podría tener un maestro y tantos esclavos como quieras, el maestro activa el SS del esclavo del que quiere comunicarse y mientras la línea SS esté activa puede haber transmisión de maestro a esclavo y de esclavo a maestro, luego se cerraría la línea SS y se activaría la de otro esclavo.
La diferencia entre esclavo y maestro, como bien dices, es que es el maestro el que pone el reloj en marcha para las comunicaciones, con esto, se puede deducir que un 2º esclavo tendría en el SSPBUF los datos a enviar al maestro a la espera a que su linea SS sea activada y así sucesivamente.

Ahora la práctica ( simulada, claro.. jeje )
Utilizo el SPI Debugger del proteus, el cual me dice que el maestro sí que envia datos ( es un contador for...next desde 1 hasta 255, el cual en cada vuelta envía el valor de la variable ), es una prueba bastante sencilla, pues bien, tengo 2 simulaciones, la 1º es en la que configuro el SPI en manual, quiero decir que configurando todos los bits correspondientes SCK,SDO,SDI y CS luego, en el for...next simplemente pongo SSPBUF=a y hago un waitms 1 que luego más adelante corregiré ( pondré una comprobación de los flags ), en la parte esclavo, configuro los bits SCK,SDO y SDI, el SS no lo configuro, lo dejo como está, entonces, en el SPI debugger puedo ver como el maestro vá enviando tramas de 8 bits y el esclavo se las devuelve ( no entiendo bien porque lo hace ) pero lo que sí sé es que en el esclavo puedo recuperar el valor de la variable a una velocidad tremenda.

En la 2º simulación utilizo las rutinas del compilador ( el PSI ), configuro con define las lineas en el maestro de SCK,SDO,SDI y CS y en el esclavo lo mismo, SCK,SDO,SDI y la de SS la dejo sin configurar ya que no he encontrado nada en la ayuda del compilador para configurar la linea SS, bien, pues según el SPI debugger, el maestro envía tramas de 1 bit ( la variable que envío es de tipo byte ) y el esclavo siempre respone con ceros.

Al principio tenía el problema ( según el proteus ) de logic contention en varias lineas que según investigé el problema era que tenía la misma linea como entrada o salida en los dos pic's, una vez solucionado eso, cambiando el estado de los pines como entradas o salidas encuentro este problema el cual no entiendo muy bien.

Lo que quiero o más bien, lo que deseo, es utilizar las rutinas del compilador ya que es mucho más facil a la hora de organizar el código y tambien me ahorraría muchas lineas al no tener que realizar comprobaciones ( por ahora estoy usando un 55% de los recursos del pic y me falta medio programa )

Adjunto una imagen.

Me dá la mosca a mi que el problema puede estar en la trama de envío, cuando en la 1º simulacion envia 8 bits si que vá y ahora, como solo envía 1 bit no vá... mmm.. dá mucho que pensar...

saludos y gracias.
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (94,5 KB (Kilobytes), 30 visitas)
25/06/2011 #8


No se que compilador usas, yo uso el mikroC y trae funciones para el SPI, como SPI_Write, SPI_Read y SPI_Init, es mas sencillo que hacer tu mismo las funciones manualmente, pero tambien te puedes crear tus propias funciones que hagan la misma funcion, pero es mas facil usar las que ya estan hechas.

El hardware de SPI trabaja siempre con 8bits, si deseas solo trabajar con 1bit debes seguir mandando los 8bits pero solo usar uno.

Digamos que cuando tu intercambias datos entre maestro y esclavo los buffers se van remplazando, una vez completado el envio ya tienes los nuevos datos disponibles en SSPBUF.

Para configurar el SS (unicamente el del esclavo ya que el maestro tienes que poner un pin manualmente). Necesitas cambiar los bits del SSPCON SSPM3:SSPM0 a 0100 (yo lo estoy mirando en el datasheet del 18f4550 puede que cambie algo).

Pero creo que no es necesario usar el SS, si solo tienes un esclavo puedes desactivarlo poniendo los bits del SSPM a 0101, el SS se usaria en caso de que fuesen varios esclavos.

Si quieres que te sea mas sencillo utiliza el osciloscopio del isis, captura la trama de los bits SCK SDO SDI y te sera mas sencillo entenderlo, yo probe el debugger de spi pero no lo llege a entender ni tampoco me puse a mirarlo.
25/06/2011 #9


Hola de nuevo, utilizo el Pic Simulator Ide ( PSI ), también tengo el protonIde y el MicroCodeStudio Plus. En el protonIde no sé como seleccionar el pic, siempre me aparece el 16f628a y en microcode no encuentro nada en la ayuda acerca del SPI. Asi que empecé a aprender con el PSI y ahí me he quedado.

Lo de los bits del SSPM también lo he visto en el datasheet del 16f877a, en el maestro los pongo a 0000 y en el esclavo ( por ahora sólo utilizo uno ) he probado con 0100 ( sin SS ) y con 0101 ( con SS ).

Según el datasheet ésta combinación corresponde a:
SSPM3:SSPM0
0101: SPI modo esclavo, reloj = pin SCK, control SS pin desactivado, se puede usar como I/O
0100: Spi modo escalvo, reloj = pin SCK, control SS pin activado

0011: SPI modo maestro. reloj = TMR2 / 2
0010: SPI modo maestro. reloj = FOsc/64
0001: SPI modo maestro. reloj = FOsc/16
0000: SPI modo maestro. reloj = FOsc/4.

Lo del SPI Debugger más o menos lo entiendo, tiene 3 modos: Monitor, Esclavo o Maestro.
En modo monitor simplemente te muestra los datos que fluyen entre las lineas indicandote la dirección de los datos y cuando se activa o desactiva el SS, es necesario tambien conectar el pin de SCK.
En modo maestro o esclavo funciona como un dispositivo independiente.
Sería como el oscilador pero en vez de ver las "rayas" verías los datos en sí.

El compilador: el PSI tiene unas rutinas para configurar el MSSP, en modo SPI o en modo I2C, según lo que vayas a utilizar, lo malo es que sólo tiene emulador de I2C y no de SPI así que utilizo el proteus.

Según leo en el datasheet, antes de activar el MSSP ( sspcon.sspen=1 ) tienes que configurar los pines como entradas o salidas, eso en manual, pero si utilizo las rutinas del compilador con SpiPrepare se configuran todos los pines y creo que ahí está el problema, porque ahí es donde me daba el error de contención lógica ya que el pin SCK del maestro está como salida y el del escalvo también cosa que debería de ser el esclavo como entrada. No comprendo el error que me dá el proteus porque en el esclavo configuro los registros para que sea esclavo y al poner SpiPrepare debería de detectarlo, de todas maneras como no le configuro el pin de CS no debería de generar señal de reloj.

Lo mas curioso es que sé que el esclavo recibe datos ya que en la interrupción PIR1.SSPIF le pongo un toggle RD6 ( que cambie el estado del pin rd6 ), eso lo puse para comprobar visualmente que entra en la interrupción y de hecho sí que entra pero al leer el registro de SSPBUF ya sea con SPIReceive [var] ( rutina del compilador ) o [var] = SSPBUF siempre está a 0 y es donde me pierdo.
Bueno, tengo que decir que realmente no sé si recibe o no los datos, pero lo que sí sé seguro es que la interrupción se genera ( pir1.sspif ), ahora, la pregunta del millón es:
¿Por que se genera la interrupción? por que han llegado datos? donde están? o se genera porque se activa el pin de SCK??


saludos
25/06/2011 #10


Si esta a 0 puede ser que no reciba datos, o bien el maestro no envia, o el esclavo no recibe, por los pines que no estan bien configurados por ejemplo.

Es por eso que te digo que uses en el proteus isis el osciloscopio, asi veras si se mandan datos/reciben, si ves que no se envian datos por SDI o SDO ya sabes cual de los 2 es el que no envia, y si ambos envian ya sabes que el problema es de la recepcion (pin puesto como salida en vez de entrada por ejemplo).
26/06/2011 #11


Bueno, creo que ya sé donde está el problema, gracias a ti Merlinz por aconsejarme el uso del osciloscopio... como no se me había ocurrido antes?? jeje..

Te explico, he creado un proyecto nuevo en proteus, le pongo un 16f877a y el osculoscopio conectado de la siguiente manera:

Pin CS -> Canal A
Pin SCK -> Canal B
Pin SDI -> Canal C
Pin SDO -> Canal D

Bien, pues si observamos el osciloscopio vemos como se cumplen las reglas de transmisión:

- Se activa la línea de CS , línea amarilla del oscloscipio ( el estado en idle es en high y se activa en low )

- Se activa la línea SCK, linea azul

y e aquí el problema

-Transmite por SDI ???, línea roja

mmm... aquí pasa algo raro, serán las rutinas del compilador?? porque si configuro el MSSP a mano si que transmite por SDO, la línea verde.

El código es éste, bien sencillo ( no se como ponerlo denro de una caja ):

Define CLOCK_FREQUENCY = 4

AllDigital


Define SPI_SCK_REG = PORTC
Define SPI_SCK_BIT = 3
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 5
Define SPI_CS_REG = PORTE
Define SPI_CS_BIT = 2

SSPCON.SSPM3 = 0
SSPCON.SSPM2 = 0
SSPCON.SSPM1 = 0
SSPCON.SSPM0 = 0

SPIPrepare

Dim a As Byte
Dim b As Byte

Hseropen 9600
loop:

For a = 1 To 255
SPICSOn
SPISend a
SPICSOff
Hserout #a, " - ", CrLf
WaitMs 500
Next a

Goto loop


End

-----

A ver si alguien lo pudiese comprobar, el código está en Pic Simulator IDE 6.91.


Os pongo las imagenes, donde Dibujo es con las rutinas del compilador ( spiprepare y demás ) y dibujo1 es con el MSSP configurado a mano.

Saludos
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (104,1 KB (Kilobytes), 22 visitas)
Tipo de Archivo: jpg Dibujo1.JPG (119,5 KB (Kilobytes), 16 visitas)
26/06/2011 #12


En la primera imagen has puesto el SDI como salida y deberia ser al reves, como entrada (I) de input. El SDO es de salida (O) output. No se si esto influira, yo creia que los pines no se podian cambiar, al ser un modulo hardware. Quiza el problema es que tu compilador las funciones que has puesto spisend y las demas son por software, y estas mezclando funciones de software con las de hardware.

Con funciones de software me refiero a funciones que se hacen manualmente cambiando el estado de los pines y poniendo los delays... Pero te recomiendo usar el modulo por hardware, asi te aseguras de usar poco codigo, es mas fiable, no le influyen las interrupciones...
26/06/2011 #14


A eso me refiero, yo no lo he puesto, supongo que lo configurará el comando SpiPrepare por eso me ha sorprendido ver la línea de sdi transmitiendo, si te fijas en el codigo que he puesto más arriba verás las directivas:
Define SPI_SDI_REG = PORTC
Define SPI_SDI_BIT = 4

El codigo está bien, lo que no sé es porque lo hace al revés ¿...?
Si lo hago en manual, configurando los bits a mano si que envía SDO y recive SDI.
Lo del tema de configurar mediante hard o soft ya lo estuve buscando e hice unas pruebas con USART, ahí si que no falla ya sea por hard o por soft.

Saludos!

Por cierto, muchas gracias mecatrodatos por el cursillo, ahora mismo voy a ello a ver si consigo algo, pero el problema no es que no sepa manejar el MSSP el problema, según hemos comentado parece ser del compilador que se lía con los pines del pic.. jeje.. de todas maneras muchisimas gracias.

---

Añado:
Acabo de leer el tutorial del otro hilo, voy a ver si mediante ese ejemplo puedo sacar algo en claro.

Si ejecuto la simulación en proteus veo que tiene el mismo problema que tenía yo al principio, contención lógica, en este caso es en la línea SDI del maestro contra SDO del esclavo. Por eso el cuadrito de información ( el que se pone en rojo y en azul según el estado lógico ) se pone en amarillo y se ojeas el "logical netlist view" verás que es el net llamado SDI, adjunto una imagen. Aunque cabe decir que la simulación funciona.

Por cierto, interesante proyecto el que se habla en ese hilo, yo estoy trabajando en algo parecido, un ordenador de a bordo para el auto para controlar el A/C ( eléctrico ), sensores de temperatura, sensor de RPM, cuenta kilómetros y si todo sale bien, como espero, utilizar un celular gsm para una alarma y por último ( la ginda del pastel, jeje ) poner un módulo GPS el cual me enviaría los datos de geolocalización del auto.

Es un proyecto a muy largo plazo, cada cosa que aprendo por el camino la experimento aparte y luego se la añado al proyecto principal, y como se puede observar, para poder controlar todo eso me es necesario dos pic's los cuales tienen que estar pasandose datos el uno al otro mediante SPI y el USART dejarlo para conectar un ordenador portatil y ver toda la información en pantalla mediante un programa en Visual Basic 6.

Saludos
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (98,9 KB (Kilobytes), 13 visitas)
26/06/2011 #15


En el datasheet viene:

• SDI is automatically controlled by the SPI module
• SDO must have TRISC<7> bit cleared
• SCK (Master mode) must have TRISB<1> bit
cleared
• SCK (Slave mode) must have TRISB<1> bit set
• SS must have TRISA<5> bit set

Esta claro que estas usando la libreria por software ya que el SDI lo controla el modulo SPI automaticamente.
Como te digo mejor que uses el modulo por hardware, por software posiblementen no funcione la interrupcion, usaras un 20% mas de codigo, y ademas estaras desperdiciando un modulo ya creado.
26/06/2011 #16


Gracias por la info Merlinz, he rebuscado en la ayuda del compilador y no especifica si es por software o por hardware, en el caso de USART si que tengo varios comandos para manejarlo mediante soft o hard, quiero decir que en USART si que está diferenciado pero en el MSSP sólo pone unos comandos, que visto lo visto tiene que ser por soft a la fuerza ya que con las directivas puedo cambiar los pines de SDO/SDI... etc...

Eso que dices está en la sección 9.3.3 Enabling SPI I/O ( pág 75 ) del datasheet.

De hecho lo que es extraño es que sí que funciona la interrupción pero cuando leo el SSPBUF de cualquier manera, ya sea mediante el comando SPIReceive o asignando el valor de SSPBUF a una variable siempre está a cero.

Si realmente el Pic Simulator Ide utiliza el MSSP mediante software no me vale para el proyecto final ya que el TMR2 ( que es el que utilizaría el MSSP mediante soft ) ya lo utilizo para otras cosas.

Seguré probando un poco más a ver si doy con la solución y si no pues cogeré otro camino.

Saludos!

He investigado un poco más y he intentado utilizar el MSSP configurando los registros yo mismo, así me aseguro de que es por hard y no por soft. La sorpresa en la imagen adjunta, funciona a las mil maravillas, pero por ahora con el spi debugger y un osciloscopio, en él se pueden ver los diferentes canales:
Canal A -> CS
Canal B -> SCK
Canal C -> SDI
Canal D -> SDO

y el código es el siguiente, mucho menos del que esperaba y mucho menos que utilizando las rutinas del compilador pero es un poco más lioso:

Define CLOCK_FREQUENCY = 4

AllDigital

Config RC4 = Input
Config RC5 = Output
Config RC3 = Output
Config RE2 = Output

Symbol cs = RE2
High cs
SSPSTAT = %10000000
SSPCON = %00100000

Dim a As Byte

loop:

For a = 0 To 255
Low cs
SSPBUF = a
While SSPSTAT.BF = 0
Wend
High cs
WaitMs 500
Next a

Goto loop
End

----

En el código se puede observar que primero configuro las entradas y salidas como corresponden luego activo la línea de CS, atención al SCK que idle en el maestro es low y en el spi debugger es High, si no hago así en vez de seguir la cuenta del for...next salen otros numeros, luego entro el en bucle y apago la linea cd CS, para indicar al esclavo que voy a transmitir ( aquí se podría utilizar cualquier cosa para seleccionar un esclavo cualquiera ), lleno el bufer con el valor de 'a' y espero hasta que llene el buffer, en el datasheet pone que es sólo para recepción, luego vuelvo a activar CS, espero medio segundo y empiezo de nuevo.


Saludos
Imágenes Adjuntas
Tipo de Archivo: jpg Dibujo.JPG (115,5 KB (Kilobytes), 8 visitas)
31/01/2013 #17


Estimados,

Soy erick, Les voy a hacer una pregunta nada que ver en respecto a lo que puede ser comunicacion entre dos pic tanto maestro como esclavo. Pero si en el ambito de comunicacion SPI... Resulta que tambien utilizo PSI para la familia de los 18fxxxx, en mi proyecto estoy tratando de hacer una comunicacion entre una memoria y el microcontrolador 18f4550, pero al realizar la programacion para la cual estoy recien acostumbrando y aprendiendo me arroja error para la siguiente linea de programacion_:

Define SPI_SDO_REG = 7

indicandome el siguiente mensaje ivalid value of parameter, que en traduccion seria algo asi como el valor del parametro es invalido.

entonces acurro a ustedes si es que me pueden iluminar la ampolleta y resolver este dilema.

la programacion completa es esta:

Código:
AllDigital

Define SPI_CS_REG = PORTC
Define SPI_CS_BIT = 0
Define SPI_SCK_REG = PORTB
Define SPI_SCK_BIT = 1
Define SPI_SDI_REG = PORTB
Define SPI_SDI_BIT = 0
Define SPI_SDO_REG = PORTC
Define SPI_SDO_REG = 7
SPIPrepare

Define LCD_BITS = 8
Define LCD_DREG = PORTD
Define LCD_DBIT = 0
Define LCD_RSREG = PORTE
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTE
Define LCD_RWBIT = 1
Define LCD_EREG = PORTE
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
Lcdinit

Dim addr As Byte
Dim data As Byte

For addr = 0 To 10
    data = 200 - addr
    SPICSOn
    SPISend 0x06
    SPICSOff
    SPICSOn
    SPISend 0x02
    SPISend addr
    SPISend data
    SPICSOff
    Lcdcmdout LcdClear
    Lcdout "write to eeprom"
    Lcdcmdout LcdLine2Home
    Lcdout "(", #addr, ")=", #data
    WaitMs 500
    
Next addr
PD... Asi es el ejemplo fue extraido desde los ejemplos de oshonsoft
31/01/2013 #18
Moderador

Avatar de D@rkbytes

El error debe ser porque están repetidas estas definiciones...
Define SPI_SDO_REG = PORTC
Define SPI_SDO_REG = 7

Primero se le da el valor PORTC, y luego se repite pero con el valor 7

Haz la prueba eliminando la segunda.

Suerte.
31/01/2013 #19


D@rkbytes dijo: Ver Mensaje
El error debe ser porque están repetidas estas definiciones...
Define SPI_SDO_REG = PORTC
Define SPI_SDO_REG = 7

Primero se le da el valor PORTC, y luego se repite pero con el valor 7

Haz la prueba eliminando la segunda.

Suerte.
Estimado Estimado, Muchas gracias por aclararme ese pto.. Ni por revisar 10 veces que sucedia no me di cuenta, un millo de gracias por responder te ganaste un
Haaa y me funciono Gracias.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.