lunedì 12 agosto 2019

Arduino Uno blink con Atmel Studio 7

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

Nessun commento:

Posta un commento

Frane da drone con rete UNET

Alla ricerca di immagini di training gia' pronte per reti neurali mi sono imbattuto nel CAS Landslide Database (scaricabile da  https://...