Startprobleme Atmel Studio6.1 / Arduino

Hallo Forum,

Habe mir seit kurzem das Arduino Uno besorgt aber ich habe große Probleme den Microcontroller mit dem Atmel Studi 6.1 unter C zu programmieren. =(
Habe mir das "Visual Micro (http://visualmicro.codeplex.com/) un das Arduino IDE (http://arduino.cc/en/main/software#.UxG01YWa9VU) heruntergeladen.
Jetzt die Frage an euch Experten, wie kann ich einen C-Code mit einem Compiler in die Sprache von Arduino umwandeln um ihn anschließend an den Controller zu übertragen? Welche Einstellungen sind zu machen?
Habe mich im Intenet bereits umgesehen aber auf deutscher Sprache habe ich leider nicht passendes gefunden? Habtihr einen Tipp?
Vielen Dank schon im Voraus!!!

Probiers damit ist für den Einstieg einfacher :wink:

Danke für die Antwort, aber wie schon gesagt, ich möchte gerne das Adruino IDE vermeiden, da der Code leicht vom C-Code abweicht.

Hallo,

na dann lass doch einfach die Arduino IDE links liegen und programmiere nur mit Atmel Studio.

Ich vermute aber Du möchtest die Bsp. Sketche und Librarys die für die Arduino IDE existieren im Atmel Studio verwenden? Ja das funktioniert so nicht. Du müßtest alle Arduino eigenen Befehle/Funktionen abändern die nicht in der normalen Atmel-Welt
existieren.

Du kannst aber genau solche Librarys in der Atmel Welt finden. Einfach Tante Google befragen oder im "µC Nachbarforum" umsehen. Auf der Seite von Atmel gibts auch Bsp., könnte aber sein die sind sogar nur in Asembler verfügbar.

Danke schon mal für die rasche Antwort.
Habe im Internet gefunden, dass es möglich sein müsste, normalen C-Code zu schreiben und diesen dann mit einem Compiler und den passenden libraries in demn gwünschten "Arduino-Code" umzuwandeln. (zb http://www.engblaze.com/tutorial-using-atmel-studio-6-with-arduino-projects/). Lieg ich falsch?
Meine Englischkenntnisse sind leider nicht die besten.... Vielleicht wäre es ja möglich, dass jemand den Artikel zb auf Deutsch "übersetzt"....

Hubert_ABC:
Vielleicht wäre es ja möglich, dass jemand den Artikel zb auf Deutsch "übersetzt"....

Vielleicht wäre es ja möglich, dass Du möglichst konkret und detailliert beschreibst, was Du mit Deinem UNO-Board eigentlich vorhast?!

In der Arduino-IDE programmierst Du in C++.
Der Compiler ist "AVR GCC" und die Standard-Library die "AVR libc".
Also erstmal genau dasselbe wie bei Atmel Studio.

Atmel Studio ist ein Profi-Werkzeug für Mikrocontroller-Profis mit Grundlagen- und Fachkenntnissen.
Und die Arduino-Software ist ein Werkzeug für Hobbyisten ohne einschlägige Fachkenntnisse.

Wenn Du ein Profiwerkzeug nicht bedienen kannst und Dir die einschlägigen Fachkenntnisse (und sogar Englisch) vollkommen abgehen, was willst Du mit dem Profiwerkzeug machen, das mit dem Hobbywerkzeug nicht machbar ist?

jurs:
In der Arduino-IDE programmierst Du in C++.

Wird nicht eigentlich in C programmiert und nur bei bestimmten Sachen ein Teil der Erweiterung (C++) verwendet?

hi,

ich denke, hubert hat im ersten post einigermaßen beschrieben, wo das problem liegt.
atmel studio ist ja wirklich nicht unbedingt einfach zu bedienen. die arduino-IDE ist da viel freundlicher. anscheinend hat er einen C-code, den er jetzt gern mit der arduino-IDE benützen möchte. und das geht natürlich nicht ohne weiteres. fängt ja schon mit main <> setup,loop an.

lieg' ich da richtig, hubert? falls ja, welchen code hast Du?

kennt jemand ein gutes, deutsches anfängertutorial für's atmel studio?

gruß stefan

Hubert_ABC:
Danke für die Antwort, aber wie schon gesagt, ich möchte gerne das Adruino IDE vermeiden, da der Code leicht vom C-Code abweicht.

C ist C. Arduino IDE versteht hardwarespezifische Funktionen die in Arduinospezifischen Bibliotehken enthalten sind.
Natürlich kannst Du statt pinWrite() direkt auf die Ports des Controllers zugreifen aber ich Frage Dich wieso?

Du schreibst ja selbst dauend Funktionen (oder solltest schreiben) die mehrere oder viele Funktionen zusammenfassen. Willst Du auch solche Funktionen nicht verwenden?

Ich verstehe Dein nichtverwenden wollen der Arduino IDE nicht. Kannst Du das mal näher erklähren?

Grüße Uwe

"Powerprojekte mit Arduino und C" geht sehr schön darauf ein, jedoch nicht wirklich hilfreich für blutige Anfänger! Dort wird detailliert beschrieben, wie das mit dem Programmer etc funktioniert. Aber ich glaube der Bootloader vom Arduino kann dabei nicht genutzt werden, bzw. dessen USB Schnittstelle.

@Edith:
Ich denke ich kann mir vorstellen, warum er die IDE meiden möchte. Etwa die gleichen Absichten habe ich ebenfalls. Das Problem ist, man macht sich von der IDE abhängig aufgrund der vielen StandardArduino Libs.

Es geht ihm wohl eher darum, "richtig" einen µC zu programmieren. Das heißt aber auch im, dass er auf dauer sich die ganzen Libs zum Teil selber schreiben muss für so einige Sachen.

Eisebaer:
anscheinend hat er einen C-code, den er jetzt gern mit der arduino-IDE benützen möchte. und das geht natürlich nicht ohne weiteres. fängt ja schon mit main <> setup,loop an.

Ach?
Ohne "setup" und "loop" kann die Arduino-IDE kein Programm kompilieren?
Und mit "main" geht nix?
Und ohne die Nutzung von Arduino-Komfortfunktionen auch nicht?

Na dann kopiere Dir mal folgendes kleine Testprogramm in Deine Arduino IDE:

#include <avr/io.h>
#include <uart.h>
#include <util/delay.h>

#define BAUD 9600L // Baud rate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)

/* 
 * USART Initialization (Datasheet page 178)
 */
void uart_init(void)
{
	/* Set baud rate */
	UBRR0H = UBRR_VAL >> 8;
	UBRR0L = UBRR_VAL & 0xFF;
	/* Enable receiver and transmitter */
	UCSR0B |= (1<<TXEN0);
	/* Set frame format: 8data, 2stop bit */
	UCSR0C |= (1<<USBS0)|(3<<UCSZ00);}
 
/*
 * Sending Frames with 5 to 8 Data Bit (Datasheet page 179)
 */
void uart_putc( unsigned char data )
{
	/* Wait for empty transmit buffer */
	while ( !( UCSR0A & (1<<UDRE0)) );
	/* Put data into buffer, sends the data */
	UDR0 = data;
}
 
/*
 * Sending strings
 */
void uart_puts( char *s )
{
	/* while *s != '\0' so unequally "string-end characters (terminator) */
	while (*s)
	{
		uart_putc(*s);
		s++;
	}
}
 
int main(void)
{
    uart_init();
    while(1)
    {
	uart_puts("Hallo\r\n");
        _delay_ms(1000);
    }
}

Das ist ein C-Programm mit "main", aber ohne "setup" und ohne "loop" und ohne alle Arduino-Annehmlichkeiten.

Und das kann Deine Arduino-IDE nicht zu einem lauffähigen Programm übersetzen?

Wenn es ihm um die Programmierung von Microcontroller geht dann ist Arduino der falsche Platz. Da wäre ein Microcontroler Forum oder ein Tutorial oder Buch richtig.
Ohne Englischkenntnisse sehe ich da dunkelgrau weil bei Microcontrollerprogrammierung ohne Vereinfachungen a la Arduino man den Microkontroller sehr viel genauer kennen muß und darum das Datenblatt großteils kenen muß. Das Datenblatt gibt es nur in englisch (ausgenommen einige in Russisch, Chinesisch oder Japanisch).

@ Hubert_ABC
Wenn Du einen Microcontroller ohne Arduino Umgebung programmieren willst mußt Du englisch lernen.

Grüße Uwe

hi,

also bei mir kann er nicht kompilieren. liegt aber eher daran, daß Du andere libraries benutzt.

daß es ohne setup und loop nicht geht, hab' ich aus der fehlermeldung geschlossen, die man bei "leerer" ide beim kompilieren bekommt. in der main.h werden die beiden ja aufgerufen. wenn es sie dann nicht gibt...

gruß stefan

Eisebaer:
also bei mir kann er nicht kompilieren. liegt aber eher daran, daß Du andere libraries benutzt.

Das ist keine "andere Library", das ist die normale AVR libc, die mit jeder Arduino-Software mitgeliefert wird.

Andere Libraries könnten höchstens zutreffen, wenn Du einen anderen Controller als Atmega einsetzt, z.B. einen DUE. Für UNO, MEGA etc. sollte der Code problemlos durchlaufen. Du kannst die include-Zeilen für die Libraries sogar weglassen, bis auf die Zeile

#include <util/delay.h>

Die müßte drinbleiben, oder Du müßtest auch die delay-Zeile weiter unten im Programm weglöschen.

Welche Arduino-Version, welches Board und auf welcher Plattform nutzt Du denn die Arduino-Software, dass der Code bei Dir nicht kompiliert?

hi,

richtig, jurs, ich hatte noch den atmega8 eingestellt.

gruß stefan

Eisebaer:
richtig, jurs, ich hatte noch den atmega8 eingestellt.

Wenn man hardwarenah programmiert, läuft ein Programm natürlich nur auf der Hardware, für die es programmiert wurde.

Das obige "Testprogramm mit main()-Funktion" läuft z.B. bei einem "UNO" oder "MEGA" Board, oder auch anderen Boards mit Atmega328 und Atmega168 Controller, weil diese Boards alle dieselben Serial-Register haben, die auf gleiche Weise angesteuert werden.

Eine solch starke Hardwareabstraktion wie bei der Arduino-Software gibt es bei der "direkten" Programmierung von Mikrocontrollern nicht. Sobald ein Controller andere Register hat, muß er auch anders programmiert werden.

Der Nachteil der Hardware-Abstraktion durch Arduino-Komfortfunktionen liegt am Ende bei der Effektivität und Dateigröße. Schau Dir z.B. mal an, auf wie wenige Bytes das obige Demoprogramm zusammenkompiliert wird, das wird, wenn man es stattdessen arduinomäßig mit Arduino "Serial" Objekt und die Arduino "delay" Funktion programmiert wohl ca. achtmal so groß werden.

hi,

verschiedene mCs, verschiedene register, das sit schon klar. allerdings hätte ich angenommen, daß der mega8 und der mega328 kompatibel sind. naja, ist wohl nicht so...

gruß stefan

Eisebaer:
verschiedene mCs, verschiedene register, das sit schon klar. allerdings hätte ich angenommen, daß der mega8 und der mega328 kompatibel sind. naja, ist wohl nicht so...

Nein, so ganz kompatibel sind die nicht.

Wenn man eine Quellcodedatei für verschiedene Controller kompatibel machen möchte, funktioniert aber auch das, und zwar über "bedingte Kompilierung". Man könnte z.B. testen, ob in einer bestimmten Boarddefinition ein Register mit einem bestimmten Namen enthalten ist, und abhängig davon dann verschiedene Codes machen. Prinzipieller aufbau:

#ifdef (Symbol)
  // hier der Code, falls das Symbol definiert ist
#else
  // hier der Code, falls das NICHT zutrifft
#endif

Ich habe z.B. mal auf das Vorhandensein eines Registers des Atmega8 getestet (UBRRH) und abhängig vom Ergebnis werden die beiden Funktionen uart_init und uart_putc so oder anders kompiliert.

Ich kann hier bei mir mangels Atmega8-Board allerdings nur testen, dass der Code fehlerfrei mit der Boardeinstellung Atmega8 kompiliert werden kann und nicht, ob es auch mit der seriellen Schnittstelle funktioniert.

#include <avr/io.h>
#include <uart.h>
#include <util/delay.h>

#define BAUD 9600L // Baud rate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)

#ifdef UBRRH   // es existiert ein UBRRH Register, z.B. Atmega8
void uart_init(void)
{
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
 
  UCSRB |= (1<<TXEN);  // UART TX einschalten
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
} 

void uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)));  /* warten bis Senden moeglich */
    UDR = c;                      /* sende Zeichen */
}

#else // sonst z.B. Atmega328, Atmega2560
/* 
 * USART Initialization (Datasheet page 178)
 */
void uart_init(void)
{
	/* Set baud rate */
	UBRR0H = UBRR_VAL >> 8;
	UBRR0L = UBRR_VAL & 0xFF;
	/* Enable receiver and transmitter */
	UCSR0B |= (1<<TXEN0);
	/* Set frame format: 8data, 2stop bit */
	UCSR0C |= (1<<USBS0)|(3<<UCSZ00);
}

/*
 * Sending Frames with 5 to 8 Data Bit (Datasheet page 179)
 */
void uart_putc( unsigned char data )
{
	/* Wait for empty transmit buffer */
	while ( !( UCSR0A & (1<<UDRE0)) );
	/* Put data into buffer, sends the data */
	UDR0 = data;
}
#endif
 
 
/*
 * Sending strings
 */
void uart_puts( char *s )
{
	/* while *s != '\0' so unequally "string-end characters (terminator) */
	while (*s)
	{
		uart_putc(*s);
		s++;
	}
}
 
int main(void)
{
    uart_init();
    while(1)
    {
	uart_puts("Hallo\r\n");
        _delay_ms(1000);
    }
}

Auf diese Art könnte man den Code auch noch an weitere andere Controller anpassen, indem man einfach immer neue Abschnitte mit bedingter Kompilierung einfügt, die abhängig vom Board und seinen Eigenschaften und Registern, einen anderen Code für bestimmte Funktionen erzeugen.

Danke für eure raschen Antworten bzw. dem Interesse mir zu helfen und anderen hilfsreiche Infos zu geben!!! Ich weis ich bin ein Anfänger bei Atmel / Arduino/ Atmel Studio. Habe nämlich bis vor kurzem Pic in Assembler programmiert. Jetzt der Umstieg ist nicht so ohne, wie ich sehe...
Welche Literatur (deutsch, Englisch,...) zum Arduino ist zu empfehlen? Hat jemand Erfahrungen?
Kann jemand von euch, schrittweise erklären wie man mit Atmel Studio 6.1 einen Quellcode compiliert und diesen auf den Arduino Uno überträgt. Das wäre super und ich kann mir gut vorstellen auch andere wären sehr danbar!!! Habe nämlich gesehen mit dem Visual Micro kann ICH nur die Standardbeispiele auf den Controller übertragen. Sobald ich aber Werte (zb Delay) abändere und compiliere und diesen neuen Code übertragen möchte ändert sich leider nichts. Was mache ich falsch?
Habt Rücksicht auf mich, wenn ich fragen stelle, auch wenn sie für einige "logisch" sind, aber es gibt auch andere die es noch lernen müssen. jeder hat man klein angefangen und hat auch "dumme" Fragen gestellt... wie heißt es so schön, "es gibt nur dumme Antworten und keine dummen Fragen"...
Was die geposteten C-Programme angehen, muss ich erst noch testen, mein Arduino ist nicht 24h mit dabei :slight_smile:

@jurs:
Wie ich verstanden habe, hat Arduino ein eigenes C, denn eigene Befehle sind leicht abgeändert vom Standard-C. Lieg ich dabei falsch? Bezug auf User " sschultesolter".
In reinem C sieht zb alleine das setzen eines Ausgangspins auf Low oder High für den Anfänger sehr "interessant" aus, durch die Bibliotheken der Arduino IDE dagegen übersichtlich , trotzdem ist beides C !
Was die Englischkenntnisse betrifft, muss man es nicht unbedingt "dramatisieren". Zwischen verstehen und "verstehen" ist ein Unterschied.

@Eisebaer:
Ja, du hast mich verstanden!!! Den C-Code was ich schreibe, möchte ich auch für andere Controller verwenden (für alle "Besserwisser": Ein Blick ins jeweilige Datenblatt für die Registeraufteilung und die Portsbelegung und...darf nicht fehlen). Die Frage " kennt jemand ein gutes, deutsches anfängertutorial für's atmel studio" wurde noch nicht beantwortet.

@uwefed:
Kann ich also mit dem Arduino IDE auch z-B. den Befehl "digitalWrite(13, HIGH)" anders schreiben, dass er bei jedem C-Compiler verstanden wird? In reinem C sieht zb alleine das setzen eines Ausgangspins auf Low oder High für den Anfänger sehr "interessant" aus, durch die Bibliotheken der Arduino IDE dagegen übersichtlich , trotzdem ist beides C !
Was die Englischkenntnisse betrifft, muss man es nicht unbedingt "dramatisieren". Zwischen verstehen und "verstehen" ist ein Unterschied.

@sschultesolter:
Danke für die Literaturempfehlung. "Das Problem ist, man macht sich von der IDE abhängig aufgrund der vielen StandardArduino Libs", da kann ich dir nur recht geben.

Hubert_ABC:
Wie ich verstanden habe, hat Arduino ein eigenes C, denn eigene Befehle sind leicht abgeändert vom Standard-C. Lieg ich dabei falsch?

Ja. Das ist immer noch normales C/C++ und alles was man in Standard C machen kann geht auch auf dem Arduino. Du musst hier die reine C Syntax und die verwendeten Libraries unterscheiden. Nur weil Arduino seine eigenen Libs hat ist das kein anderes C.

Die IDE kapselt lediglich viele Sachen in eigenen Klassen und Funktionen, so dass sie vor allem für Anfänger einfacher werden. Das ist oft ganz praktisch, hat aber auch manchmal seine Nachteile, z.B. Performance oder Code-Größe. Manchmal fehlt auch einfach die Funktionalität und Flexibilität der AVR libc. Da kann man dann Abwägen ob man die Arduino Sprachmittel verwendet, oder nicht. Man kann auch die Arduino Sachen und die Standard AVR Mittel kombinieren.

Die Vorteile von Atmel Studio (oder Visual Studio Pro + Visual Micro) liegt auch wo anders. Nämlich, dass man einfach eine richtige IDE hat, die Dinge wie Autovervollständigung, Code zusammenklappen, bessere Suchfunktionen, eine Liste mit den Funktionen etc. hat. Die Arbeit ist damit wesentlich komfortabler als mit der Arduino "IDE".