fiuba-labo-de-micro-miercoles / 2019-2c-trabajo-practico-Pochoclera

2019-2c-trabajo-practico-nv created by GitHub Classroom
0 stars 0 forks source link

Consulta sobre comunicacion SPI #3

Open ndirenzo opened 4 years ago

ndirenzo commented 4 years ago

Hola, como están?

Subimos un código con el nombre "Bluetooth.asm" a la carpeta "codigo". Este archivo contiene lo que es hasta ahora la comunicación por Bluetooth a través de la USART, es decir, las habilitaciones y configuraciones de la misma posibilitando la conexión con el modulo HC-06 por medio de interrupciones. La aplicación android que creamos envía un 1 o un 0 y el micro interpreta esta información prendiendo o apagando un led. La consulta sobre esta parte seria confirmar si lo que hicimos es correcto. Vale aclarar que el programa fue probado y funciona. Por otro lado, el código también contiene un principio de configuración de la comunicación SPI con lo que estamos teniendo problemas para entender. La rutina SPI_MasterInit setea MISO y SCK como salida, que es el clock que sera enviado al SLAVE. Luego, se habilita el SPI, se configura al micro como MASTER, se setea la velocidad del reloj (que no sabemos bien cual tiene que ser) y se selecciona el modo 1 de operación. Acá vienen la preguntas: 1- ¿Es correcta esa configuración? 2- ¿Con que criterio elegir la velocidad del clock? 3- ¿El pin #cs(negado) del MAX6675 corresponde al #ss(negado) del micro? 3- Según entendemos el MAX6675 envía la información en 16 bits y comienza con el envio a partir de una bajada en el pin #cs(negado) y la finaliza con una subida de este ultimo. Esta bajada y subida del pin, ¿debe hacerse a mano con el micro, no? 4- ¿Como logramos captar 16 bits cuando el registro que guarda lo recibido en el micro tiene 8 bits? Vimos un código en internet que realizaba el clock a mano, es decir habilitando el clock, poniendo un delay y posteriormente desabilitandolo, de forma de generar un pulso. Si hacemos eso seria posible contar cuantos clocks pasaron para así cuando transcurran 8 guardar en un registro y seguir con la otra tanda. Pero no creemos que sea una buena manera ni tampoco sabemos bien como implementarla. Adjunto la hoja de datos del MAX6675 y aclaro que estamos utilizando un atmel2560.

Gracias y disculpen las molestias.

MAX6675.pdf

Saludos.

fbaglivo commented 4 years ago

Hola!

1- ¿Es correcta esa configuración?

Por que usan el modo 1 y no el 0?

2- ¿Con que criterio elegir la velocidad del clock?

Cada periferico especifica un rango de frecuencia para el clock. En este caso te da una frecuencia maxima de 4.3MHz

3- ¿El pin #cs(negado) del MAX6675 corresponde al #ss(negado) del micro?

No necesariamente.

• SS/OC1B/PCINT2 – Port B, Bit 2
SS: Slave select input. When the SPI is enabled as a slave, this pin is configured as an input regardless of the setting of
DDB2. As a slave, the SPI is activated when this pin is driven low. When the SPI is enabled as a master, the data direction
of this pin is controlled by DDB2. When the pin is forced by the SPI to be an input, the pull-up can still be controlled by the
PORTB2 bit.
OC1B, output compare match output: The PB2 pin can serve as an external output for the Timer/Counter1 compare match
B. The PB2 pin has to be configured as an output (DDB2 set (one)) to serve this function. The OC1B pin is also the output
pin for the PWM mode timer function.
PCINT2: Pin change interrupt source 2. The PB2 pin can serve as an external interrupt source.

3- Según entendemos el MAX6675 envía la información en 16 bits y comienza con el envio a partir de una bajada en el pin #cs(negado) y la finaliza con una subida de este ultimo. Esta bajada y subida del pin, ¿debe hacerse a mano con el micro, no?

Si

4- ¿Como logramos captar 16 bits cuando el registro que guarda lo recibido en el micro tiene 8 bits? Vimos un código en internet que realizaba el clock a mano, es decir habilitando el clock, poniendo un delay y posteriormente desestabilizando, de forma de generar un pulso. Si hacemos eso seria posible contar cuantos clocks pasaron para así cuando transcurran 8 guardar en un registro y seguir con la otra tanda. Pero no creemos que sea una buena manera ni tampoco sabemos bien como implementarla.

Deberías probar haciendo dos veces in IN del SPDR, esperando que se haya terminado una recepción. Algo así:

SPI_MasterReceive:

        ldi temp, 0x00
                ; Habilito la lectura poniendo en 0 #CS (negado)
        ldi temp, ~(1<<DDB0)   
        out DDRB, temp
        call    SPI_Receive
                ; Guardo el el dato que vuelve en R16
        mov R17,16                  
                call    SPI_Receive

        ret

SPI_Receive:
              ; Wait for reception complete
              sbis SPSR,SPIF
              rjmp SPI_Receive
             ; Read received data and return
             in r16,SPDR

            ret
ndirenzo commented 4 years ago

Hola

Por que usan el modo 1 y no el 0?

No estamos seguros del modo que debemos elegir, pero nos decantamos por el 1 ya que leimos en la hoja de datos lo siguiente "...Read the 16 output bits on the falling edge of the clock...". Aunque si se observan las imagenes que da la hoja de datos al final pareceria que el dato se envia en el flanco ascendente...

Deberías probar haciendo dos veces in IN del SPDR, esperando que se haya terminado una recepción. Algo así:

Lo voy a probar!

Para poder probar que se hace una lectura correcta hay alguna forma mas directa que no sea tener que pasar por la aplicación bluetooth? Es decir, yo quisiera saber si estoy recibiendo los datos bien pero la única forma que encuentro es programando la aplicación bluetooth para que reciba los datos de temperatura que el micro le envía. Me parece que por este camino es difícil saber que parte estaria fallando, si es la aplicación bluetooth, la transmisión por USART o la recepción por SPI.

Saludos!

fbaglivo commented 4 years ago

Hola! Fijate que desde la compu el bluetooth debe abrir un puerto COM, por lo que podes recibir datos con algun software (PuTTy, Hiperterminal,etc)

fbaglivo commented 4 years ago

Pudieron? Necesitan una mano?

ndirenzo commented 4 years ago

Hola! Pudimos pero no utilizamos el registro SPDR si no que generamos el clock a mano y fuimos leyendo bit a bit. El miércoles hablando con Arias llegamos a la conclusión de que la medición de temperatura debe estar controlada por un timer.

El problema que estamos teniendo ahora es que la interrupción del timer está interfiriendo con la interrupción por bluetooth que genera el encendido de un led. Es decir, cuando queremos prender el led desde el celular no lo hace, pero si desactivamos la interrupción por timer si lo hace.

Dejamos el código entero en la carpeta de códigos y si podes mirarlo buenísimo!

Saludos

rarias commented 4 years ago

Aclaro lo de "la medición de temperatura debe estar controlada por un timer": Un timer debe generar una interrupción cada 1 segundo. Cuando se produce la interrupción, se lee el sensor de temperatura (termocupla conectada al MAX6675 que se lee x SPI desde el micro, moviendo los puertos "a manopla"). La temperatura leída se guarda en una posión de RAM (eventualmente se guardan las últimas 8 lecturas y se promedia). Main() o quien lo desee, puede leer siempre (en cualquier momento) el valor de temperatura actualizado, accediendo a la variable en RAM.

rarias commented 4 years ago

Respecto al código, entiendo que se refieren a éste: https://github.com/fiuba-labo-de-micro-miercoles/2019-2c-trabajo-practico-Pochoclera/blob/master/codigo/USART%20%2B%20SPI%20V2.asm El cual a simple vista tiene un error feo: rjmp HERE de la línea 50 va a la línea 31 y vuelve a inicializar los periféricos, habilitar la global, etc. Esto está terriblemente mal.

ndirenzo commented 4 years ago

Hola! El código al que nos referiamos es este: https://github.com/fiuba-labo-de-micro-miercoles/2019-2c-trabajo-practico-Pochoclera/blob/master/codigo/PochocleraV1.asm. Si no me equivoco, lo que comentas del HERE esta corregido allí. Saludos!