2020/04/18

Adaptación de Los Microcontroladores AVR de ATMEL a ATmega328p


En el 2012 Felipe Santiago Espinosa escribió un muy buen libro del tema y en 2017 lo compartió para que todos podamos leerlo. Cubre los micros atmega8 y atmega16, que son muy similares al que yo uso, ATmega328p.




Quería leerlo en la kindle pero se rompia al convertirlo y en algún momento le ofrecí que me pasara el documento original para convertirlo correctamente y compartirlo pero él prefirió no hacerlo. Como no estaba en ese momento en condiciones de leer fuera del horario de viaje, kindle, olvidé el asunto.

Ahora que he tenido que lidiar bastante con el ATmega328p para leer y escribir una PROM, estoy en mejores condiciones de estudiar el libro y de paso agregar la adaptación a ATmega328p. Esta lectura tambien me ha servido para decidir aspectos del Cooler para Switch, de próxima publicación y espero me sirva para diagnosticar una falla de comunicación serial con edu-ciaa-nxp.

Comprenderás que mi conocimiento está muy alejado del de Felipe, ciertas comparaciones y adaptaciones no las podré hacer, otras serán incompletas e incluso erradas, espero que poco.


No pienses que sé mucho o tengo mucha experiencia, cuando digo cosas como "Aunque el bit ADFR está en un diagrama del datasheet, el bit de free running es ADATE." no es que haya alguna vez usado free running, conceptualmente lo entiendo nada más y hasta ahí


Pude haber buscado "ATmega328p atmega8 differences", pero poco hubiese aprendido. Sin embargo al final sí lo busqué para ver de no haber malinterpretado nada.

No he estudiado el libro, no he leido con absoluta atención los temas generales de los cuales ya tengo conocimiento previo por haber leido a Tanenbaum, Hennessy & Patterson y haber cursado algunas materias, me he concentrado en las partes específicas AVR y más en las que pueda haber diferncia con ATmega328p.

Espero en algún momento hacer algunos de los ejercicios pues están muy buenos.


Muchos conceptos parecen corresponder a AVR core o Mega, así que quizás hay diferencias que se me escapan pues asumí que son comunes. No creo que haya hallado todo, para esa tarea se requiere la experiencia y conocimiento de alguien como el autor original.

El que haya hecho esto no implica que entienda todo ni mucho menos. Por ejemplo las partes de assembly las miré por arriba, siendo el dominio de este lenguaje una de mis deudas con la vida.

Ha sido una experiencia EXTREMADAMENTE instructiva, leer el libro y a la vez estar mirando la datasheet y adaptando, pero cuando iba por la página 50 de las 360 ya me quería matar, si no me creés, hacé la prueba. Como en casi todas si no todas mis notas publicadas, te recomiendo que en lugar de leer la nota lo hagas, la nota es para la gente más vaga y recordatorio de lo que he hecho. Lo interesante es que al haber terminado, no lo necesito más, o sea, si tuviera que repetir esta experiencia con otro libro y microcontrolador, he quedado mejor equipado mentalmente para no necesitar que correspondan.



Suficiente introducción, estos son mis hallazgos, siguiendo la siguiente nomenclatura:

[pXX] número de página sin tag, es por que corresponde a la extensión del texto a ATmega328p que es el objetivo inicial de todo esto. Las referencias al datasheet son a ATmega48A/PA/88A/PA/168A/PA/328/P 8271G–AVR–02/2013 que no es la última pero es la que tenía a mano, luego lo noté.

[pXX adaptación ] no digo que está mal, sólo que me despista, estoy acostumbrado a leer estos temas en inglés y no me molesta que en las traducciones se usen palabras de otros idiomas sin traducir, como cache, buffer, pipeline, stack, heap. Eso produce que al leer textos en español, ya sean nativos como este o traducidos, tenga momentos de pánico al no comprender alguna palabra.

[pXX actualización] si el libro fuera escrito ahora, habría que actualizar algunos datitos generalmente sin importancia

[pXX mi opinión] Ejemplos faltantes, no me puedo resistir, es mi manera de aprender.

[pXX errata] errorcitos de tipeo.


Sección 1.5.1 La Unidad Central de Procesamiento (CPU)

 

[p22 adaptación] segmentación es pipeline


Sección 1.5.4 Temporizador/Contador

 

[p26 errata] para programar la tarea cada VEZ que

Sección 1.6 Clasificación de los Microcontroladores 

 

[p29 actualización] 4, 8, 16, 32 y hasta 64 bits

[p29 mi opinión] ejemplo faltante de Pila, JVM

[p29 mi opinión] ejemplo faltante de Acumulador, la instrucción div de 8086


Sección 1.7 Criterios para la Selección de los Elementos de Procesamiento 

 

[p31 actualización] (costo de microcontrolador) 0.5 a 1000 u$s

Sección 2.1 Características Generales

 

[p36]
Memoria de código:  32KB.
Memoria de datos:  2KB.
Terminales para entrada/salida: 23.
Frecuencia máxima de trabajo: 20Mhz.
Voltaje de alimentación: de 1.8 a 5.5 V .
Temporizadores: 2 de 8 bits y 1 de 16 bits.
Canales PWM: 6.
Fuentes de interrupción: 23.
Interrupciones externas: 2.
Canales de conversión Analógico/Digital: 8 de 10 bits.
Reloj de tiempo real. NO TIENE.
Interfaz SPI Maestro/Esclavo.
Transmisor/Receptor Universal Síncrono/Asíncrono (USART).
Interfaz serial de dos hilos.
Programación “In System”.
Oscilador interno configurable.
Watchdog timer. 


[p36] ATmega328p está disponible en los encapsulados 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF y es pin compatible con ATmega8 al menos para 28-pin PDIP-

[p37] El ATmega8 y el ATmega328p incluyen 3 puertos, 2 de 8 bits y 1 de 7 bits

2.3 Memoria de programa 

 

[p40] 32KB de Flash, rango hasta 0x7FF

[p40] 23 fuentes de interrupción

[p41] Vectores de interrupción [datasheet p65 TAble 12-6]


2.4 Memoria de datos 

 

[p43] Figura 2.8 [datasheet p18 Figure 8-3]

2.4.1 Espacio de SRAM 

 

[p43] concluye en 0x08ff, tiene además 150 Registros Extendidos de I/O(que no sé lo que son) y 2048 de propósito general.

2.4.1.1 Registros I/O 

 

[p44] actualizar figura 2.9


2.4.2 Espacio de EEPROM 

 

[p48] EEPROM mide 1KB

[p49] existe EEAR9 por pasar de direccionar 512B a 1024B


2.6 Sistema de Interrupciones 

 

[p57] 10 interrupciones por temporizadores, una por watchdog

[p58 mi opinión] al comparar las direcciones de ATmega8 vs ATmega16 diria que las direcciones ocupan un byte y dos respectivamente.

2.7 Inicialización del Sistema (reset) 

 

[p61] ATmega328p tiene un handler de interrupción específico para WDT

[p61] ATmega328p no tiene reset por JTAG.

[p62] El registro MCUCSR es MCUSR.

2.8 Reloj del Sistema 

 

[p64 - p70] Las tablas de ajustes para los diversos clocks me superan, ver [datasheet p26].

2.9 Modos de Bajo Consumo de Energía

[p70] Comparte los modos de sleep de ATmega16.

[p72] Los bits de SE y SM[2:0] están en el registro SMCR[3:0] en 0x33 [datasheet p43].


3.1 Repertorio de instrucciones 

 

[p75] Para la ISA de ATMEL entiendo que existen "familias" tal como se vé en acá, así que toda esta sección ATmega328p corresponde a ATmega16 por ser de la misma familia, Enhanced Core with up to 128K ("AVR5", "AVR5.1").

4.1 Interrupciones Externas 

 

[p119-127] Acá hay varios temas, como tengo muy poca experiencia con interrupciones en general y no hice ninguna prueba, tomalo con precaución.
Por un lado, ATmega328p tiene dos interrupciones externas como ATmega8 y los registros están un poco cambiados.

Por el otro, ATmega328p soporta generar interrupciones a partir de prácticamente todos los pines [datasheet p71], agrupadas por puertos.

Una vez generada tenés que determinar cuál fué concretamente el pin que la generó. Acá hay una buena explicación.


4.1.1 Configuración de las Interrupciones Externas 

 

[p120] Los bits de MCUCR[3:0] de las interrupciones externas estan en EICRA[3:0] [ datasheet p 72]


4.1.2 Habilitación y Estado de las Interrupciones Externas

 


[p121] Los bits de GICR[7:6] están en EIMSK[1:0] [datasheet 73]

[p121] Los bits de GIFR[7:6] están en EIFR[1:0] [datasheet 73]


4.2 Temporizadores 

 

Parece que el tiempo no es lo mío, sólo pongo lo más evidente pero sin intentar desarrolla lo que implica.

4.2.3    Pre-escalador



[p133] No existe registro SFIOR ni bits PSR2 o PSR10, quizás sea CLKPR, pero no sé en qué me estoy basando.


4.2.5 Registros Compartidos por los Temporizadores

 


[p134 - 162] Varios registros como TIFR, TIMSK, TCCRx están duplicados o triplicados con A y B o 0-2.


4.1.3 Organización y Registros del Temporizador 2



[p144] ASSR tiene los bits movidos


4.3.1 Generación de PWM con los Microcontroladores AVR



[p155] para los modos PWM no hallé la info para llenar la tabla 4.17


5.1.4 El ADC de un AVR 

 

[p176] Aunque el bit ADFR está en un diagrama del datasheet, el bit de free running es ADATE.


5.1.5 Registros para el Manejo del ADC



[p178] ADTSx de SFIOR está en ADCSRA y B

[p186] AMCE de SFIOR está en ADCSRB

6.1 Comunicación Serial a través de la USART

 

Toda esta sección parece ser compatible pero los registros y los bits tiene los nombres muy levemente cambiados, por lo general tienen un cero, como si los del ATmega8/16 estuvieran pensados para ser únicos y los de ATmega328p para tener múltiples puertos, salvo que tiene uno solo.


6.1.4 Registros para el Manejo de la USART



[p200] Dice que el registro UBRRH comparte su dirección UCSRC. En ATmega328p son registros separados y con nombres UBRR0H y UCSR0C.

7.1.1 Registro para el Manejo del WDT 

 

[p252] El registro WDTCR es WDTCSR, tiene el WDIF (interrupt flag) y WDIE (interrupt enable) debido a que según lo visto en página 57 se puede disparar una interrupción con el WDT y un bit de prescaler extra, WDP3.

7.2.1 Organización de la Memoria Flash 

 

[p254] Las páginas de la memoria Flash de ATmega328p son de 64 words, tal como ATmega16.

[p255] La tabla 7.2 para ATmega328p es [datasheet p282 table 27-13]

[p255] El registro GICR[1:0] es MCUCR[1:0]


7.2.3.2 Capacidades para Leer-Mientras-Escribe 


[p260] La tabla 7.5 para ATmega328p es [datasheet p282 table 27-14]

7.2.3.3 Escritura y Borrado en la Memoria Flash


[P262] El registro SPMCR es SPMCSR


7.2.3.4 Direccionamiento de la Flash para Autoprogramación


[p265] En la tabla debe corresponder a ATmega16

7.3 Bits de Configuración y Seguridad

 

[268] La tabla 7.9 es [datasheet 288 Table 28-8]

[268] La tabla 7.10 es [datasheet 288 Table 28-9]

7.4.2 La Interfaz JTAG y los Mecanismos para la Depuración en un AVR

[270] ATmega328p no tiene JTAG


Y eso es todo amigues.

No hay comentarios:

Publicar un comentario