Autor Tema: USART ATMEL SAM  (Leído 5304 veces)

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

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:USART ATMEL SAM
« Respuesta #15 en: 14 de Mayo de 2018, 16:05:20 »

¿ Has probado a desactivar la optimización en la compilación ?, con un objeto optimizado, incluso al nivel más bajo, el Debug puede hacer cosas raras, lo he sufrido y es de locos.

En última instancia, depura encendiendo un Led con un IF, eso no falla nunca, por muy optimizado que esté el objeto.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:USART ATMEL SAM
« Respuesta #16 en: 14 de Mayo de 2018, 16:12:45 »
Yo no conteste mas porque realmente no se porque estaba ocurriendo, la idea es ver si sin usar el debugger funciona, es decir que sea independiente de la computadora.

Porque suena a un error como del debugger ( en step funciona y corriendo no). La otra es ir directamente al foro del fabricante y exponer lo sucedido, allí alguien debería darte la solución. O darte aunque sea el porque no funciona.

Que va, no funciona en normal, solo parece funcionar (solo a medias) cuando vas paso por paso, llamada por llamada, si ejecutas la funcion entera o sin debugear no funciona.

Lo puse en el foro de atmel sam el mismo día que lo puse aquí también pero no ha contestado nadie.


¿ Has probado a desactivar la optimización en la compilación ?, con un objeto optimizado, incluso al nivel más bajo, el Debug puede hacer cosas raras, lo he sufrido y es de locos.

En última instancia, depura encendiendo un Led con un IF, eso no falla nunca, por muy optimizado que esté el objeto.

si si la optimización esta a nivel 0 en todas las pruebas, pero nada. Lo he probado con señales como leds y con contadores, pero nada.

En modo debug tampoco es que funcione bien, por que me pisa el buffer de recepción y se ejecuta cada 16 veces, pero por lo menos en debug si salta la interrupción de fin de envio. :?
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:USART ATMEL SAM
« Respuesta #17 en: 10 de Septiembre de 2018, 09:31:47 »
Lo escribo aqui para no abrir otro post,

he descubierto por que no funcionaba la uart y saltaban unas interrupciones que no eran, resulta que las librerias estan mal, que sorpresa  :5]

resulta que al usar la funcion "usart_async_register_callback" entras en el fichero hal_usart_async.c y aquí tenemos unas definiciones de las interrupciones:

enum usart_async_callback_type { USART_ASYNC_RXC_CB, USART_ASYNC_TXC_CB, USART_ASYNC_ERROR_CB };

pero luego esta función llama a "_usart_async_register_callback" la cual usa las definiciones de otro fichero:

enum _usart_async_callback_type { USART_ASYNC_BYTE_SENT, USART_ASYNC_RX_DONE, USART_ASYNC_TX_DONE, USART_ASYNC_ERROR };

Asi que claro al no estar definida la interrupción USART_ASYNC_BYTE_SENT en el primer fichero, al intentar usarla la guardabas en el espacio de USART_ASYNC_RX_DONE y cada vez que escribias la uart saltaba la interrupción de la recepción y pisaba el buffer.

Vuelvo a recalcar que a nadie se le ocurra utilizar estos micros hasta que microchip los meta en su sistema y arregle las librerias.

De todas formas la comunicación uart no me va bien, y es por que la interrupción del timer por lo visto tiene mas prioridad y hace que se corrompan los mensajes.
¿Alguien sabe como dar mas prioridad a la interrupción de la uart? no veo nada en las librerías para ajustar el orden de prioridades y en la hoja de datos tampoco solo dice:
See “Interrupt Priority Registers” in the relevant ARM documentation.

De verdad me quedo asombrado de lo mal que esta esto, es increíble.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:USART ATMEL SAM
« Respuesta #18 en: 10 de Septiembre de 2018, 10:36:26 »
Las prioridades son manejadas por el NVIC, con las funcines NVIC_xxxx dadas por CMSIS

https://www.keil.com/pack/doc/CMSIS/Core/html/group__NVIC__gr.html

Ahi vas a encontrar NVIC_SetPriority() que es lo que buscas..

Respecto a como lo hace el ASFv4, en la funcion _usart_async_init tenes que:

Código: C
  1. NVIC_DisableIRQ((IRQn_Type)_sercom_get_irq_num(hw));
  2.         NVIC_ClearPendingIRQ((IRQn_Type)_sercom_get_irq_num(hw));
  3.         NVIC_EnableIRQ((IRQn_Type)_sercom_get_irq_num(hw));

Obviamente el codigo puede cambiar, porque esto lo encontre para un SAM21, pero creo que deberia ser igual para todos. Tambien veo que en ningun momento asigna prioridad. En otras API como el de ST y de TI te proveen una funcion para modificar/habilitar/deshabilitar

PD: No encuentro donde estan definidos esa funcion sercom_get_irq_num(). Al menos en el codigo que encontre por internet

PD2:
Citar
ASF4 does not assign a specific priority to the IRQs, but instead uses the default priority as assigned by
the NVIC.
Different ARM cores have NVIC interrupt controllers with individual specifications and features.
Refer to the device data sheet and NVIC documentation for the ARM core being used in the selected
target device for more information on manipulating interrupt priorities and masking interrupts.

PD3:
http://asf.atmel.com/docs/latest/common.components.wifi.winc1500.wifi_serial_example.samd21_xplained_pro/html/group__asfdoc__sam0__system__interrupt__group.html

Por si te sirve
« Última modificación: 10 de Septiembre de 2018, 10:40:23 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re:USART ATMEL SAM
« Respuesta #19 en: 11 de Septiembre de 2018, 02:40:25 »
Hola Killer, gracias yo lo he arreglado usando las librerias del CMSIS:

Citar
Obviamente el codigo puede cambiar, porque esto lo encontre para un SAM21, pero creo que deberia ser igual para todos. Tambien veo que en ningun momento asigna prioridad. En otras API como el de ST y de TI te proveen una funcion para modificar/habilitar/deshabilitar

Exacto, la verdad es que no se como es posible lo mal que están estas librerías.

dejo por aquí como lo he cambiado por si ha alguien le sirve, es muy sencillo:

-segun https://www.keil.com/pack/doc/CMSIS/Core/html/group__NVIC__gr.html#ga5bb7f43ad92937c039dee3d36c3c2798 las interrupciones tienen por defecto el nivel mas alto posible, (0) (quitando las del nucleo que son negativas y mas altas), he buscado las interrupciones de los dos periferícos, usart0 y tc0 en la hoja de datos:
http://ds.arm.com/media/resources/db/chip/atmel/sams70/Atmel-11242-32-bit-Cortex-M7-Microcontroller-SAM-S70Q-SAM-S70N-SAM-S70J_Datasheet.pdf
(pag52)
y he visto que son la 24 y 13 y a la interrupción timer0 le he dado un nivel 1 para que la usart tenga prioridad con la función:
NVIC_SetPriority();

un Saludo y gracias, esperemos que no encuentre mas errores, de momento solo me ha funcionado correctamente el timer, las entradas salidas y el adc, todo lo demas he tenido o que crear los driver o modificarlos.


Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw


 

anything