Nota
Nonostante l'uso di Atmel Studio non e' possibile effettuare il debug step by step del programma a meno che di non usare un debugger esterno (come Atmel ICE) del costo di circa 100 euro (esistono in vendita dei dispositivi tipo AVRISP Mkii che pero' risultano essere solo dei programmatori e non dei debuggers)
Negli STM32 con STLink invece si ha gia' a disposizione un programmatore debugger a basso costo (pochi euro)
----------------------------------------------------------
Atmel Studio 7 si puo' scaricare dal
seguente link
Si crea un progetto GCC C Executable
e si seleziona ATMega 328p
si va al menu Tools/External tools
Si aggiunge un nuovo tool editando Command ed argomenti con (si deve avere gia' installato Arduino IDE e si fa puntare alle directory)
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude
-C"C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -carduino -PCOM11 -b115200 -D -Uflash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
a questo punto si puo' editare main.c con il seguente codice (la programmazione avviene in C)
--------------------------------------
#define F_CPU 16000000UL //frequenza del processore
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB |= 0B00100000;
while (1)
{
PORTB |= 0B00100000;
_delay_ms(1000);
PORTB &= 0B11011111;
_delay_ms(500);
}
}
--------------------------------------
si compila con Build Solution (tasto F7) e si fa l'upload su Arduino Uno con Tools/Arduino Uno Bootloader
Ma cosa vuol dire il codice sopra riportato. Si fa riferimento al
Data Sheet di AVR Mega328p
DDRB (Data Direction Register= indica come settare le porte digitali (la sigla B indica le porte digitali da 8 a 13, C indica i pin analogici e D indica le porte digitali da 0 a 7) se in lettura od in scrittura
PORTB invece come settare o leggere la porta
DDRB |= 0B00100000; imposta la porta DDB5 come output (fa un OR sul valore della porta stessa con una maschera)
ma come mai proprio la porta DDB5....perche' nella Arduino Uno e' collegata al Pin D13 a cui e' collegato il led
dopo di cio' con PORTB (ed una serie di AND ed OR con una maschera binaria) viene settato il valore di DDB5 (e quindi del pin D13) a 0 ed 1
il corrispondente sketch Arduino e' ovviamente
--------------------------------------
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
--------------------------------------
una differenza evidente e' che il codice compilato Arduino IDE e' di 930 bytes mentre il codice C con Atmel Studio e' di soli 176 bytes