
tinyAVR1-Controller ATtiny3216
Rainer
hat einige tinyAVR-Controller mit UPDI-Programmierschnittstelle
mitgebracht, darunter auch den ATtin3216 aus der tinyAVR 1-Serie. Diese
großen Brüder des ATtiny202 besitzen u.a. auch einen echten DA-Wandler,
der mich besonders interessiert. Jetzt habe ich den Chip auf eine
Adapterplatine gelötet und die ersten Tests gestartet. Zur ersten
Orientierung habe ich die Startversuche für den Tiny202
wiederholt. Fast alles konnte ich einfach kopieren, übersetzen, brennen
und erfolgreich testen. Auch hier läuft der Controller mit 20/6 MHz =
3,33 MHz. Ich musste nur das Kommando zum Aufruf des PYUPDI anpassen
und dort den neuen Chip eintragen:
C:\Users\User\pyupdi.py -d tiny3216 -c COM4 -b 115200 -f $(TargetDir)$(TargetName).hex
USART0
Eine kleine Änderung betrifft die serielle Schnittstelle. TXD liegt
jetzt an PB2 und RXD an PB3. Bis auf diesen Unterschied
funktioniert das Programm wie bisher.
/*
* GccApplication5.c
*
* Created: 09.09.2020 12:24:56
* Author : User
* DAC ATtiny3216
*/
#include <avr/io.h>
#define F_CPU 3333333
#define USART0_BAUD_RATE(BAUD_RATE) ((float)(F_CPU * 64 / (16 * (float)BAUD_RATE)) + 0.5)
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
void USART0_init(void);
void USART0_sendChar(char c);
void USART0_sendString(char *str);
void USART0_init(void)
{
PORTB.DIRSET = 0x04; //TXD an PB2
PORTA.DIRCLR = 0x08; //RXD an PB3
USART0.BAUD = (uint16_t)USART0_BAUD_RATE(9600);
USART0.CTRLB |= USART_TXEN_bm;
}
void USART0_sendChar(char c)
{
while (!(USART0.STATUS & USART_DREIF_bm))
{
;
}
USART0.TXDATAL = c;
}
void USART0_sendString(char *str)
{
for(size_t i = 0; i < strlen(str); i++)
{
USART0_sendChar(str[i]);
}
}
int main(void)
{
USART0_init();
while (1)
{
USART0_sendString("TXD an PA6 \r\n");
_delay_ms(500);
}
}
DAC0
Und nun zum DA-Wandler. Man muss ihn eigentlich nur einschalten und
dann in das 8-Bit-DATA-Register schreiben. Die vielseitigen
Referenzeinstellungen ab 0,55 V gibt es nicht nur für den AD-Wandler,
sondern auch für den DA-Wandler. Im Beispiel stellte ich einen
Endbereich von 2,5 V ein. Das Programm erzeugt ein Sägezahnsignal. Man
findet es an PA6. Offensichtlich hat der Controller einen
Pufferverstärker nach dem eigentlichen DA-Wandler, denn bei
unterschiedlichen Belastungen ändert sich die Spannung nicht, solange
man unter 25 mA bleibt. Zum Test habe ich gleich mal einen großen
Lautsprecher mit einem Vorwiderstand von 100 Ohm angeschlossen. Dabei
entsteht ein recht lauter Ton. Man könnte den DA-Wandler also sogar als
kleinen Audioverstärker einsetzen.
int main(void)
{
VREF.CTRLA = VREF_DAC0REFSEL_2V5_gc;
DAC0.CTRLA = 0x41;
DAC0.DATA = 255; //DA an PA6
char n = 0;
while (1)
{
n++;
DAC0.DATA =n;
_delay_us(10);
}
}