Geeignete Literatur für C und µC?

Ich versuche gerade mein erstes richtiges Projekt mit Atmel Studio ohne Arduino IDE. Möchte als Lernbeispiel meine Equinox einmal in C schreiben.

Was ich bislang am laufen bekommen habe in meinem Programm [0]UART Umlenkung von stdout/stdin, damit auch die formatierte Ausgabe über die Konsole unterstützt wird. Nur Spielerei und wird später wieder entfernt, spart derzeit einige kleinere Funktionen zur Darstellung (LeadingZero/LeadingSpace ...) [0]DS3231 Das Auslesen und Schreiben der RTC Uhr. Die Temperaturausgabe derzeit nicht mit eingebaut, da diese später keine Rolle spielen wird. [0]Interuptgesteuerte Uhr Die Uhr läuft autark und wird nur zu bestimmten Zeiten vom DS3231 synchronisiert [0]WS2812B Hier habe ich die Libary von cpldcpu https://github.com/cpldcpu/light_ws2812 welche sich auf das wesentliche konzentriert. Enthält nur das nötigste. FastLed/Adafruit sind da hingegen relativ überladen an Funktionen.

Die ersten Fadinganimationen sahen soweit schon ganz gut aus.

Nun jedoch eine Frage. Kennt jemand ein geeignetes C Buch im Bezug auf µC, hauptsächlich bezogen auf die Atmega und Attiny Familie bezogen. Leider ist das mikrocontroller.net AVR GCC Tutorial nicht so umfangreich wie erhofft.

Ich suche hier kein Buch, was C/C++ allgmein behandelt. Da habe ich 2 Nachschlagewerke von rumliegen, womit man Leute töten kann ]:D

Ein Buch, was in die Richtung geht, besitzte ich bereits etwas länger "Powerprojekte mit Arduino und C". Ansich ist der Aufbau für mich okay. Es wird hier lediglich ein Arduino Dev Board genommen, programmiert aber ohne die IDE. Nachteil, das Buch hat nicht so viele interessante Projekte wie gedacht. Des weiteren wird hier mehr oder weniger Dual auf beide DevIDEs eingegangen (AS6 und CodeVision). Ich nutze nur die AS6 in der neusten Version.

Wichtig wären mir hier vorallem ein Projektorientierter aufbau wie es in dem Buch auch der Fall ist.

Dir gefallen auch die Bällchen?? ;) ;) ;)

Leider kann ich Dir bei deiner Frage nicht helfen. Grüße Uwe

uwefed: Dir gefallen auch die Bällchen?? ;) ;) ;)

:stuck_out_tongue_closed_eyes: Musste ich einfach mal anwenden ;)

Auch wenn doppelte Zeilenhöhe oben und unten nicht optimal ist für das, gäbe ja auch zur list.

Wie man Projekte angeht und Code strukturiert steht in C Büchern oder sprachspezifischen Büchern nicht drin. Ich finde “Code Complete” von McConnel auf dem Gebiet sehr gut.

Was C angeht finde ich Kernighan / Ritchie nach wie vor praktisch.

Ansonsten: Datenblätter und Application Notes lesen und code anderer Leute lesen. Im Mikrocontroller.net und bei den AVRFreaks ist man da etwas versierter wie in der Arduino Community. Und wenn alles nicht hilft: stackoverflow.com ist die allwissende Müllhalde.

Weiterhin willst Du irgendwann verstehen wie make Files oder sconstruct Files funktionieren (ich bevorzuge sconstruct).

In meinem Arduino Lernpaket trete ich nicht nur das Blinken mit Leuchtdioden breit sondern auch wie der komplette Build Prozess der IDE im Detail abläuft, wie man Projekte angeht und wie man Performance optimiert. Das findest Du zwar auch alles viel ausführlicher in der oben genannten Literatur, aber in meinem Buch geht das kürzer und direkter auf den Arudino ein. (Soviel Eigenwerbung muß sein :wink:

-Udo

hallo, ich bin nicht sicher, wie umfangreich das Lehrbuch oder Tutorial sein soll, das du suchst, aber ich persönlich finde dieses Online-Manual genial, es enthält nicht nur Referenzen zu den Befehlen mit Beispielen, sondern sogar ein Tutorial:

http://www.cplusplus.com/reference/cstdio/stdin/?kw=stdin

http://www.cplusplus.com/doc/tutorial/

Kernighan+Ritchie als Erfinder von C sind ntl eine unübertreffliche Quelle, aber dieses Standardwerk ist schon ein Wälzer, mit dem man fast ein Schiff versenken kann ... :drooling_face:

ps, Arduino-spezifische Literatur ist ntl auch perfekt, so habe ich ursprünglich auch meinen Schnelleinstieg gemacht.

Hallo,

ich hoffe das trifft Deine Vorstellungen - ist allerdings in Englisch : Arduino Microcontroller Processing for Everyone! Part II , Stephen F.Barrett

Gibts auch als " Sicherheitskopie-Download" - wenn Du Infos brauchst - PN Ich glaube link zu posten widerspricht den Forenregeln.

Gruß olmuk

olmuk: Hallo,

ich hoffe das trifft Deine Vorstellungen - ist allerdings in Englisch : Arduino Microcontroller Processing for Everyone! Part II , Stephen F.Barrett

:drooling_face:

HaWe: hallo, ich bin nicht sicher, wie umfangreich das Lehrbuch oder Tutorial sein soll, das du suchst, aber ich persönlich finde dieses Online-Manual genial, es enthält nicht nur Referenzen zu den Befehlen mit Beispielen, sondern sogar ein Tutorial:

http://www.cplusplus.com/reference/cstdio/stdin/?kw=stdin

http://www.cplusplus.com/doc/tutorial/

Kernighan+Ritchie als Erfinder von C sind ntl eine unübertreffliche Quelle, aber dieses Standardwerk ist schon ein Wälzer, mit dem man fast ein Schiff versenken kann ... :drooling_face:

ps, Arduino-spezifische Literatur ist ntl auch perfekt, so habe ich ursprünglich auch meinen Schnelleinstieg gemacht.

Die Referenzseite kenne ich. Jedoch nicht das was ich suche. Als Arduino spezifische Literatur habe ich das Kochbuch und wie geschrieben Powerprojekte mit Arduino und C bereits.

Wobei von der Idee ist das Kochbuch schon ganz ordentlich aufgebaut. Es geht um einzelne Probleme, und wie sie gelöst werden. Leider zu Arduino spezifisch. Es wird nicht auf Register oä. eingegangen.

Hier mal ein Beispiel, wie das Buch gestrickt sein kann. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

Zuerst einmal die Defenition, dann eine Übersicht, was an Registern hier eine Rolle spielt. Ähnliches ist es in Arduino Powerprojekte auch gelöst. Wenn man weiß wonach man suchen muss, findet man sowas auch für andere Atmel Controller in der DB

Die Register-Beschreibung steht wie gesagt alles in Datenblättern. Es gibt Tutorials, die das etwas aufbereiten, aber an den Datenblättern führt kein Weg vorbei. Auch weil es da zwischen Atmega328 und Atmega2560 an manchen Stellen Unterschiede gibt und die ATtinys da oft ganz anders sind.

Die Seite ist auch gut: http://maxembedded.com/category/microcontrollers-2/atmel-avr/

Bücher über Software Engineering sind meistens allgemein, da das nicht Sprach-spezifisch ist.

helf mir mal bei der Antwort :drooling_face:

olmuk, Bücher als eBooks halte ich meist als sinnfrei. Auf dem zweiten Bildschirm die Datei offen zu lassen finde ich störend. Ein Buch ist da mM nach immer besser. Das einzige, was meist nervt ist, dass man dann halt Beispiele abtippen muss. Aber dadruch lernt man auch.

Alternativ bieten die meisten Bücher eine CD an, wo die Sketche hinterlegt sind oder bieten diese online passend an.

:drooling_face: ← Halte da nichts von bzgl. “Sicherheitskopien”

@Serenfly: Natürlich geht kein Weg an den Registern vorbei. Das habe ich aber auch garnicht gesagt :wink: Jedoch ist es hilfreich, wenn man einen Anhaltspunkt hat. Mir ist es wichtig, dass ich meine Dateien für 2-3 MCU aufbaue. Mehr setze ich nicht ein. Das wären Atmega328P sowie Attiny44/84, Attiny45/85. Was noch dazu kommt in Zukunft wäre eine Attiny mit Hardware-UART.

Ich sagte nicht, dass an den Registern kein Weg vorbei führt, sondern an den Datenblättern der jeweiligen Prozessoren.

Die Bücher und auch Tutorials sind meistens auf einen Prozessor zugeschnitten. Manchmal ist das auch der Atmega8 und Derivate, die sich z.B. von den neueren Prozessoren dadurch unterscheiden dass die Timer ein gemeinsames TIMSK Register haben.

Die Grundlagen sind dabei gleich. Wenn man das einmal verstanden hat, kann man das auch anpassen. Aber die Details sind jeweils etwas anderes und beim Attiny gibt es wie gesagt sogar recht große Unterschiede zu den AVRs.

Hups, ich habe gerade Datenblätter mit Registern vertauscht.

Wegen den Büchern. Richtig, häufig taucht da der Atmega8 auf. Bei dem Arduino Powerprojekte finde ich es gut, dass es für 2 Atmegas gezeigt wird. Immer auch der vergleich, welche Register dort dann gewählt werden müssen.

Da die meisten Tutorials auf Atmega8 oder ähnliich berufen, musste ich schon ein paar Anpassung für den 328P machen. Das Anpassen ist aber nicht das Problem dabei.

Ich gebe Dir recht das ein Buch daneben besser ist. Ausserdem sollen auch die Autoren Ihren Lohn bekommen. Werfe doch trotzdem mal ein Blick hinein - für mich ist das Buch obwohl Arduino bezogen doch auch nah am Atmega 328.

Gruss olmuk

Hab mir die Seiten mal ganz schnell überflogen. Irgendwie weiß ich noch nicht, was ich davon halten soll. Mal wird auf die Ports direkt zugriffen, teils wird aber auch noch viel Arduino Functions genutzt (digitalWrite, loop, setup, …)

Mal kurz hier ein Code Beispiel für die UART Schnittstelle, was ich genau vorhabe

/* main.h */
#ifndef MAIN_H_
#define MAIN_H_

#define F_CPU 16000000UL
#define UART_BAUD 9600

#include <avr/io.h>
#include "uart.h"

#endif /* MAIN_H_ */
/* main.c */
#include "main.h"

int main(void)
{
	uart_init(F_CPU, UART_BAUD);
	printf("Programm gestartet...\n\n");
	
	while (1)
	{
		static uint8_t lastSecond;
		if(lastSecond != second())
		{
		lastSecond = second();
		printf("%2i:%02i:%02i\n", hour(), minute(), second());
		}
	}
}
/* uart.h */
#ifndef UART_H_
#define UART_H_

#include <stdio.h>	// FILE
#include <avr/io.h>

//Initialisiert UART gegebener Oszillatorfrequenz und Baudrate
void uart_init(uint32_t freq, uint32_t baud);

//Sendet 1 Byte an UART
int8_t uart_putchar(char, FILE* STREAM);

//Empfaengt 1 Byte vom UART
int8_t uart_getchar(FILE *stream);

#endif /* UART_H_ */
/* uart.c */
#include "uart.h"

FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);

void uart_init(uint32_t freq, uint32_t baud)
{
	if ((freq / 16L / baud - 1) > 30)
	{
		UBRR0L = (unsigned char)(freq /16L / baud - 1);
		UBRR0H = (unsigned char)((freq / 16L / baud - 1) >> 8);
		UCSR0A = 0;
	}
	else
	{
		//Falls Teilerwert zu klein => Rundungsfehler
		//Daher doppelte Rate waehlen
		UBRR0L = (unsigned char)(freq / 8L / baud - 1);
		UBRR0H = (unsigned char)((freq / 8L / baud - 1) >> 8);
		UCSR0A = (1 << U2X0);
	}
	
	UCSR0B = UCSR0B | (1 << TXEN0) | (1 << RXEN0);
	UCSR0C = UCSR0C | (1 << UMSEL01) | (1 << UCSZ01) |
	(1 << UCSZ00);
	
	stdout = stdin = &mystdout;
}

//Sendet 1 Byte an UART
int8_t uart_putchar(char data, FILE* stream)
{
	while (!(UCSR0A & (1 << UDRE0)));
	UDR0 = (char)data;
	return 0;
}

//Empfaengt 1 Byte vom UART
int8_t uart_getchar(FILE *STREAM)
{
	while (!(UCSR0A & (1 << RXC0)));
	return (UDR0);
}