Forum: Mikrocontroller und Digitale Elektronik Wie fängt man ein Problem an zu lösen ?


von Schüler und AVRNeuling (Gast)


Lesenswert?

Guten morgen,

gerade habe ich mein myAVR Board (Das mit dem LPT Anschluß) fertig 
zusammengelötet und ein wenig die einzelnen Beispiele probiert.

So, während es am Anfang überhaupt nicht geklappt hat, habe ich nun über 
Google, Eclipse AVR, gedit und dem ersten selbstgeschriebenen Make-File 
in Ubuntu 10.04 schon div. Beispiele hier aus der Codesammlung und von 
einigen Seiten im Internet übersetzt und auf dem Board eingespielt.

Dabei bin ich immer wieder auf Programme gestoßen, die nicht laufen, 
obwohl der Compiler keine Fehler meldet.

Auch die Sache mit den Sicherungen (oder sind die FUSES im AVR keine 
Sicherungen ?) habe ich hier mal als Suchwort eingegeben und da kam ja 
eine Menge raus, dass man falsch machen kann.

Wenn ich z.B. so einen I2C Entfernungsmesser von Robotikhardware den wir 
für die Schule auslesen sollen und die Entfernung über die USART 
Schnittstelle ausgeben sollen, auslesen will.

Wie fange ich die Sache an ?

#define am Anfang vom Quelltext ist schon klar und auch das irgendwo 
dann mal void main (void) kommt.

Wir sind zwar noch bei den Basics wie Datenregister und so und aber am 
Ende vom Schuljahr hat unser Dozent in der Berufschule gesagt, dass wir 
den I2C Bus drin haben wollen / sollen.

Irgendwie erschlägt mich das Tutorial mit speziellen Sachen wie Timer 
laden, ADC einstellen und so Sachen.

Aber wie fange ich ein Programm an ?
Welche Überlegungen muß ich anstellen um dann z.B. irgendwann so Sachen 
#include <lcd.c> #include <lcd.h> zu benutzen und ab wann brauche ich 
solche "ausgelagerten Funktionen" (Nicht hauen, habe ich irgendwo 
gelesen.)?

Entweder ist es weil ich schon seit 16 Uhr mit dem myAVR spiele und 
Teste oder ich habe da ein grundlegendes Problem der Planung und des 
Verständnis.

Helft mir da mal bitte auf den Pfad, dass ich irgendwann mal 
"normgerecht" also für jeden von euch hier verständlich, Programme 
machen kann.

Die nächste Woche soll laut Amazon der Kerningham Richie, der hier so 
oft als "Bibel für C" genannt wird kommen. Incl. dem Übungsbuch.

Bis dahin will ich aber soweit schon mal wissen, wie ich das C dann für 
den ATmega8 benutzen soll.

Jürgen

von Kein Name (Gast)


Lesenswert?

Gestern zusammen gelötet und Heute willst du schon programmieren können?

Wow. Soll ja Wunderkinder geben, die schon nach ein paar Wochen 
programmieren können - aber nach einen Tag?

Einfach mit irgendwelchen übersichtlichen Beispielen anfangen. Mit der 
Zeit kommt Routine und dann siehst du auch, wie du komplexe Aufgaben aus 
diesen Einzelteilen zusammensetzt.

Diese Verwirrung am Anfang ist ganz normal. Nicht irritieren lassen.

von Klaus W. (mfgkw)


Lesenswert?

Ich denke, vor allem muß man sich von der Vorstellung verabschieden, daß 
man sich etwas zusammenkopiert, laufen lässt und davon einen 
Erkenntnisgewinn hat.

Natürlich erleichtert es den Einstieg enorm, wenn man zumindest ein 
lauffähiges Beispiel irgendwoher hat und damit etwas blinken lassen 
kann.

Aber das ändert nichts daran, daß ein Verständnis für die Materie erst 
mit einiger Zeit und viel Mühe kommt.

Solange du am Tutorial scheiterst, brauchst du auch keine eigenen tollen 
Projekte anfangen - mit denen wirst du auch scheitern.
Bestenfalls erfreust du hier noch Sadisten wie mich, indem du eine 
peinliche Fragestunde über elementarste Grundlagen ablieferst, die vom 
allgemeinen Unterhaltungswert abgesehen vollkommen sinnlos ist.

Wenn du also wirklich mit Mikrocontrollern warm werden willst, musst du 
dich durchbeißen: lesen, probieren, Fehler suchen, probieren, lesen...

Wenn es wirklich hakt, ist es sicher gut zu fragen. Aber das hat keinen 
Sinn, solange man nicht selbst Zeit investiert. Damit würde man sich 
hier nur wie viele andere zum Narren machen.
Wenn man aber wirklich sich auf die Materie einlässt und nach Wegen 
sucht, wird einem hier sicher gerne weiter geholfen.

Also viel Spaß!

Schüler und AVRNeuling schrieb:
> Die nächste Woche soll laut Amazon der Kerningham Richie, der hier so
> oft als "Bibel für C" genannt wird kommen. Incl. dem Übungsbuch.

Das ist sicher sinnvoll.
Allerdings lernt man die Grundlagen damit wesentlich leichter erstmal am 
PC.
Da ist vieles einfacher, aber immer noch schwer genug.

Schüler und AVRNeuling schrieb:
> Aber wie fange ich ein Programm an ?

Typischerweise mit einem Primitivstprogram wie "Hello World". Und von 
dort aus dann mühsam vortasten...

Schüler und AVRNeuling schrieb:
> Dabei bin ich immer wieder auf Programme gestoßen, die nicht laufen,
> obwohl der Compiler keine Fehler meldet.

Damit ein Programm sinnvoll läuft, ist fehlerfreies Übersetzen eine 
notwendige Bedingung, aber keine hinreichende.

Schüler und AVRNeuling schrieb:
> Irgendwie erschlägt mich das Tutorial mit speziellen Sachen wie Timer
> laden, ADC einstellen und so Sachen.

Im Tutorial stehen eigentlich (fast) nur Sachen, die man wirklich 
dauernd braucht.
Nicht alles gleich, insofern kann man auch etwas auslassen. Aber 
irgendwann dann komischerweise doch...

Schüler und AVRNeuling schrieb:
> #define am Anfang vom Quelltext ist schon klar

Wirklich?
In den meisten Programmen fange ich NICHT mit einem #define an.
Wozu auch?

Schüler und AVRNeuling schrieb:
> Entweder ist es weil ich schon seit 16 Uhr mit dem myAVR spiele und
> Teste oder ich habe da ein grundlegendes Problem der Planung und des
> Verständnis.

Ein paar Stunden sind doch gar nichts :-)

von Klaus W. (mfgkw)


Lesenswert?

@ Kein Name (Gast) :
Bist du der bisherige Noname? :-)

Sehe ich genauso, du hast es nur kompakter formuliert.

von H.Joachim S. (crazyhorse)


Lesenswert?

Schon seit 16Uhr....das ist nicht wirklich lange :-)
Versuch als erstes zu verstehen, wie so ein Mikrocontroller überhaupt 
funktioniert. Die grundlegenden Sachen wie Befehlsabarbeitung, 
Datenmanipulation, Speicherbereiche und I/O-Ports. Dann kannst du dir 
die zusätzlichen Peripherieeinheiten wie Kommunikation, Timer und 
A/D-Wandler reinziehen. Stück für Stück. Erst weitermachen, wenn du 
einen Teil verstanden hast.
Ein C-Buch nutzt dir nicht wirklich viel, wenn du nicht verstehst, was 
tatsächlich passiert.
Nach wenigen Stunden kannst du dann eine LED blinken lassen oder an ein 
Terminalprogramm "Hello world" schicken.
Der Rest kommt dann, wenn du dran bleibst, von alleine.

von Sebastian M. (compressed)


Lesenswert?

step by step, das Tutorial hier im Forum durcharbeiten und dann das C 
Buch.

von Basics (Gast)


Lesenswert?

Evtl. fällt dir der Einstieg mit Bascom etwas leichter, ist aber hier 
etwas verpönt.. Mir passts jedenfalls.

von Noname (Gast)


Lesenswert?

@ Klaus Wachtler

>@ Kein Name (Gast) :
>Bist du der bisherige Noname? :-)

>Sehe ich genauso, du hast es nur kompakter formuliert.

Nein. Ist er nicht. Aber ich sehe es genauso wie ihr.

Der TO erinnert mich an meine Anfangszeit (vor gut 30 Jahren). Ein 
Wahnsinns Wust an Details, die sich nach ein paar Tagen, immer_ _noch 
nicht :-) zu einem Ganzen fügen wollte.
Dann eine konkrete Aufgabe. Irgendwie hat man von allem schonmal gehört 
und gelesen. Aber wenn man das selbst machen muss? Wie verbinde ich 
diese Teile? Wie zeichne ich einen Kreis. Bewege ein Sprite (C64). Das 
zergliedernde und synthetische Denken (lernen). Na gut. Ich denke das 
lag und liegt mir.
Und immer wieder ein schier unüberwindlich scheinender Berg an Details. 
USART geht nicht. Nach ein paar Tagen: Ach wie blöd. Parity war falsch. 
Interrupt will nicht: Falscher Vektor. Falsche Taste erkannt: Falsche 
boolsche Verknüpfungen. Und das noch und das noch und das noch, etcpp. 
Und Checksummen und Pull-Ups. Und immer wieder denselben Quelltext 
gelesen bis es mal Klick macht. Na gut. Wertestarrheit: Das muss doch 
aber gehen! Wieso geht das nicht?

Aber ich las schon immer gerne Science Fiction. Maschinen, Raumschiffe, 
Computer. Das lag mir. Hoffe es geht dem TO auch so. Wenn es Dich 
wirklich fasziniert dann wühlst Du Dich durch und das die Nächte durch. 
Wenn Du es nur lernen musst, weil es zum Unterricht gehört, dann wird es 
mühsam.

Du solltest das Tutorial durcharbeiten. Am besten parallel zum C Buch. 
Meine Meinung.

Also: Viel Spass und viel Erfolg.

von Schüler und AVRNeuling (Gast)


Lesenswert?

Danke für die Ermutigung.

Ich habe schon gedacht, bei mir wäre Irgendwas zurückgeblieben und ich 
würde einfache Sachen nicht verstehen ...

Die div. "Hello World !" Beispiele, mal mit einfach nur LED ein, for 
Schleife und LED aus sowie die schon komplexeren mit delay und so (Bei 
der Recherche zu diesem _delay_ms(ms) habe ich zum ersten Mal den Sinn 
der Fuses halbwegs kapiert ... (Google sei Dank und einem gewissen Mr. 
Pascal Stang von der Stanford Uni).

Auch die Sachen mit dem DDR und die Unterschiede zwischen PIN und PORT 
habe ich nun soweit kapiert.

Was ich aber noch nicht so richtig nachvollziehen kann ist die Vielfalt 
an Befehlen in C für ein und die dieselbe Sache.
Warum heißt es einmal pin_is_set(), dann PIN und in einem anderen 
Beispiel dann if PORT ... ?

PIN und PORT kriege ich vielleicht noch hin, weil einmal eine 8 Bit 
Integer für PORT zum Vergleich genommen wird und bei PIN nur ein PIN 
beschrieben ist.

Warum schreibt man aber pin_is_set() ?

So, nun lege ich mich aber mal wieder auf’s Ohr. Habe nur ein paar 
Stunden geschlafen und seit etwa 5 Uhr wieder am PC mit dem myAVR Board 
"gekämpft".

Jürgen

von Klaus W. (mfgkw)


Lesenswert?

Schüler und AVRNeuling schrieb:
> Warum schreibt man aber pin_is_set() ?

Einfach, weil es jemandem besser gefallen hat als die hier sonst übliche 
Bitfummelei mit Schieben und Maskieren.

Du kannst es ebenso machen, oder dir etwas anderes angewöhnen.

Bei MC-Programmierung muß man halt oft gezielt prüfen, ob ein bestimmtes 
Bit in einem Wert gesetzt ist oder man möchte so ein Bit setzen oder 
löschen.

Ob man das jetzt direkt mit C-Operatoren macht ( if( wert & ( 1 << 5 ) 
)... oder if( wert & 0b00100000 ... ) oder sich dieses hässliche 
Gefummel in eine Funktion packt, ist weitgehend Geschmackssache.
Je nach Fall kann das eine oder das andere sinnvoll sein.

(Ich tendiere meistens eher weniger zum Einen noch zum Andere, sondern 
zu Bitfeldern.)

Wie du es irgendwann mal machst, bleibt dir überlassen.
Eine Meinung dazu kannst du aber erst haben, wenn du mehrere Varianten 
probiert hast.

Ein Vorschlag für eine Übung, der HW-seitig sehr einfach ist und den ich 
aber noch nie in freier Wildbahn gesehen habe:
Du kannst doch mal "Hallo Welt" oder sowas mit einer LED als Morsecode 
ausgeben.
Das ist eigentlich nicht schwer, aber man kann viel darüber sinnieren, 
wie man ein Programm halbwegs elegant aufbaut.

von Wolfgang (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Ob man das jetzt direkt mit C-Operatoren macht ( if( wert & ( 1 << 5 )
> )... oder if( wert & 0b00100000 ... ) oder sich dieses hässliche
> Gefummel in eine Funktion packt, ist weitgehend Geschmackssache.

Das ist sicher nicht nur Geschmackssache, sondern hängt ganz 
entscheidend von den Anforderungen ab.
Die direkte Kodierung mit Werten ist sicher das Übelste, was man machen 
kann. Spätestens nach drei Tagen weiß man nicht mehr, wie die Werte vom 
Himmel gefallen sind. Wehe man möchte später irgendwelche Änderungen am 
Code machen und sei es nur, dass man eine I/O-Funktion auf einen anderen 
Pin legen möchte. Das sollten wegen des besseren Wartbarkeit des Codes 
also mindestens Konstanten sein, die über #define an zentraler Stelle 
definiert werden.
Ein echter Funktionsaufruf erzeugt wesentlich mehr Overhead, d.h. wenn 
die Geschwindigkeit wichtig ist, wird man das bei solchen elementaren 
Operationen besser lassen. Hier sind oft Makros sehr praktisch, die z.B. 
die Operation wie einen Funktionsaufruf aussehen lassen und tatsächlich 
einen kompakten oder schnellen Code erzeugen.
Und dann optimiert der Compiler je nach Einstellungen noch viele Dinge, 
so dass es oft auch gut ist, im List-File nachzusehen, welcher 
Assembler-Code aus dem C-Code erzeugt worden ist.

von Schüler und AVRNeuling (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Ein Vorschlag für eine Übung, der HW-seitig sehr einfach ist und den ich
> aber noch nie in freier Wildbahn gesehen habe:
> Du kannst doch mal "Hallo Welt" oder sowas mit einer LED als Morsecode
> ausgeben.
> Das ist eigentlich nicht schwer, aber man kann viel darüber sinnieren,
> wie man ein Programm halbwegs elegant aufbaut.

Das liest sich interessant ...
Den Morsecode habe ich nun aus Google mal als Tabelle ausgedruckt.

Die Sache mit den PIN, PORT und bit_is_set() Definitionen habe ich, so 
glaube ich, auch kapiert. Das hängt wohl auch noch von dem Alter der 
avrlibc ab. Irgendwo im AVR GCC Tutorial gibt es ein Kapitel, wo 
veraltete Aufrufe und Funktionen genannt werden. Mit Google habe ich da 
noch ein paar Stellen im Netz gefunden, wo Änderungen in der avrlibc 
aufgeführt sind.

Danach werde ich mir wohl angewöhnen müssen Ausgänge mit PORTB |= 
(1<<PB2); (Als Beispiel) zu setzen und mit PORTB &= ~(1<<PB2); (Als 
Beispiel) zurückzusetzen. Für die Abfrage dann eben statt bit_is_set() 
if (PORTB &= ~(1<<PB2);) ... usw.

Das scheint die gängige Definition in der neuesten avrLibc zu sein, die 
ich wohl mit #include <avr/io.h> am Anfang meines Programmes einbinden 
muss.

Um auf den "Hallo Welt" Vorschlag von Klaus Wachtler zurückzukommen ...

Das ist ja nach kurzem Nachdenken gar nicht so einfach ...
Eine LED An- und Auszuschalten ist leicht. Nur die Pausen und die 2 
verschiedenen Zeiten für Strich und Punkt (lang und kurz) für jeden Teil 
eines Buchstaben und die Pause zwischen den Buchstaben ... Als Anfänger, 
der ich bin wird Das eine Menge for-next Schleifen oder das Programm 
besteht fast 50:50 aus PORT und _delayms(ms) Anweisungen.

Es sei denn, ich finde nächste Woche beim Lesen des Kerningham Richie 
eine Möglichkeit, wie man Datenbausteine in C anlegt und dann einen 
Zeiger auf die einzelnen Datenwörter im Datenbaustein definiert, der 
nach und nach zwei for - next Schleifen einmal mit der Zeigerposition 
bedient und einmal den Zeitwert aus dem Datenwort ablaufen lässt. (Da 
sind wir in der Berufsschule dran. Indirekte Adressierung mit Step/7, 
deshalb "protze" ich hier so rum damit.)

Ich werde mich da mal ein wenig mehr mit beschäftigen ... Klingt 
wirklich interessant.

Jürgen

von Karl H. (kbuchegg)


Lesenswert?

Schüler und AVRNeuling schrieb:

> Die Sache mit den PIN, PORT und bit_is_set() Definitionen habe ich, so
> glaube ich, auch kapiert. Das hängt wohl auch noch von dem Alter der
> avrlibc ab.

Ich denke, dieser Aussage kann man zustimmen.
Der springende Punkt ist der, dass es für solche Pinabfragen direkt am 
µC spezielle Assembler-Instruktionen gibt, die besonders schnell 
ablaufen. Die wollte man in C auch verfügbar machen.
Schrieb man die kanonische C-Lösung, so waren frühere Compilerversionen 
nicht soweit, dass sie diese Abfragen auf diese speziellen Instruktionen 
optimieren konnten. Also hat man eben scshweren Herzens dafür spezielle 
'Funktionen' eingeführt, in denen man dem Compiler etwas half. Spätere 
Compilerversionen schafften aber dann diese Optimiereungen von sich aus, 
so dass diese dann alten Spezialfunktionen nicht mehr notwendig waren 
und man lieber wieder zurück auf Standard-C Mitteln ging.

> Danach werde ich mir wohl angewöhnen müssen Ausgänge mit PORTB |=
> (1<<PB2); (Als Beispiel) zu setzen und mit PORTB &= ~(1<<PB2); (Als
> Beispiel) zurückzusetzen. Für die Abfrage dann eben statt bit_is_set()
> if (PORTB &= ~(1<<PB2);) ... usw.

Das ist sicher keine schlechte Variante und nach kurzer Zeit geht das in 
Fleisch und Blut über.
UNd dann gibt es ja auch noch die Möglichkeit, dass man sich mit 
C-Sprachmitteln diese Syntax, wenn man sie denn als ekelhaft 
unübersichtlich empfindet, so zu verstecken, dass im eigentlichen 
Programmtext die Dinge so aufscheinen, dass man selber das gut lesen 
kann.

> Das scheint die gängige Definition in der neuesten avrLibc zu sein,

Diese Schreibweise hat eigentlich mit der avrLibc wenig zu tun.

   Variable |= ( 1 << Bitnummer );

ist ganz einfach ein C-Ausdruck, der in einer Variablen ein Bit setzt. 
Mehr gibt es dazu eigentlich nicht zu sagen. Das ist so wie 5 + 4 eben 9 
ergibt.

Dazu kommt, dass man in einem richtigen Programm dann ja sowieso nicht

   PORTB |= ( 1 << PB0 );

schreiben wird, sondern lieber

   SUMMER_PORT |= ( 1 << SUMMER_BIT );

um anzudeuten, dass hier ein Summer (und eben nicht die FLutlichtanlage) 
eingeschaltet werden soll. Mit ein wenig sonstiger Makro-Magie kann man 
das dann als C-Kundiger so hinkriegen, dass zwar im Programmtext steht

   TURN_ON( SUMMER );

und man hier noch einmel einen in Punkto Lesbarkeit drauflegt, ganz 
hinten aber vom Compiler genau derselbe Code generiert wird, wie im 
Falle von

   PORTB |= ( 1 << PB0 );

nur mit dem Unterschied, dass die letzte Variante vom menschlichen Leser 
eine Gedächtnisleistung erfordert, indem er sich merken muss, dass am 
Port B und dort wieder am Pin 0 der Summer hängt und daher diese Zeile 
wohl irgendwas mit dem Summer macht, während ich mir das bei

   TURN_ON( SUMMER );

das alles eben NICHT merken muss. Ich kann mich als menschlicher 
Programmierer ganz auf die Logik des Programms konzentrieren (warum wird 
da der Summer eingeschaltet? Ist es richtig, dass hier der Summer 
eingeschaltet wird oder wollte ich nicht eigentlich eher die grüne 
Fehler Led eingeschaltet haben?) und nicht so sehr auf die technischen 
Details.


> Das ist ja nach kurzem Nachdenken gar nicht so einfach ...
> Eine LED An- und Auszuschalten ist leicht. Nur die Pausen und die 2
> verschiedenen Zeiten für Strich und Punkt (lang und kurz) für jeden Teil
> eines Buchstaben und die Pause zwischen den Buchstaben ... Als Anfänger,
> der ich bin wird Das eine Menge for-next Schleifen oder das Programm
> besteht fast 50:50 aus PORT und _delayms(ms) Anweisungen.

Für einen Anfänger ist das ok.
Später wirst du dann Techniken kennenlernen, wie man das alles radikal 
vereinfachen kann. Zunächst mal durch den Einsatz von Arrays, dann wird 
eine struct dir eine bessere Programmstruktur geben und zu guter letzt 
wird ein Timer den _delay_ms ersetzen.
Aber: NIcht alles auf einmal!
zunächst musst du krabbeln lernen, ehe du zu gehen und laufen kommen 
kannst. Fahrradfahren kommt erst viel später.

Wenn du als 5-jähriger die Fläche eines Grundstücks bestimmen sollst, 
dann malst du dir ein Rechteck mit 5 Feldern Breite und 3 Feldern länge 
auf und zählst die.
Später dann, mit mehr wissen, lässt du das Aufzeichnen weg und ersetzt 
es dadurch, dass du 3 + 3 + 3 + 3 + 3 addierst (5 mal, weil die andere 
Seitenlänge eben 5 ist) und zum selben Ergebnis kommst. Und wieder etwas 
später hast du dann gelernt, dass du dieses wiederrum durch 5 * 3 
ersetzen kannst. Mit mehr Wissen verändern sich also auch die 
Lösungsmethoden für ein bestimmtes Problem. Aber: Dieses Wissen muss man 
erst mal haben und man muss es sicher beherrschen.


> Es sei denn, ich finde nächste Woche beim Lesen des Kerningham Richie
> eine Möglichkeit, wie man Datenbausteine in C anlegt und dann einen
> Zeiger auf die einzelnen Datenwörter im Datenbaustein definiert,


Vergiss das alles.
Du hast eine steile Lernkurve vor dir. Das geht nicht in ein paar 
Stunden. Eher Wochen bzw. Monate. Wenn ich Lehrlinge ausbilde, dann 
rechne ich damit, dass er ungefähr 1 Jahr braucht, ehe ich ihn zum 
industriellen Software-Entwickeln übernehmen kann, weil es eben so lange 
dauert, bis er zum einen sein Basishandwerk (die Programmiersprache) 
beherrscht als auch er eben die wichtigsten Algorithmen und Techniken 
lernen muss. Und mit 1 Jahr hast du noch lange nicht die Kurve zum Profi 
gekratzt. Wir bemessen die Lernzeit eines Software-Entwicklers in Jahren 
und nicht in Stunden.

von SPS-Programmierer (Gast)


Lesenswert?

Schüler und AVRNeuling schrieb:
> (Da sind wir in der Berufsschule dran. Indirekte Adressierung
> mit Step/7, deshalb "protze" ich hier so rum damit.)

Ganz wichtig:

SPS-"Programmiererei" ist etwas sehr spezielles, das sehr wenig mit 
Mikrocontrollern oder gar "ausgewachsenen" Computer zu vergleichen ist.

Erschwerend kommt dazu, dass bei Siemens (Step7) alles anderes ist, als 
beim Rest in der Branche. Es gibt so schöne, sinnvolle, IEC-Normen für 
die (etwas kranke) SPS-Welt. Nur hält sich Siemens nicht daran und 
bastelt seinen eigene Mist, der ziemlich krude ist und irgendwo in den 
60er Jahren stecken geblieben ist.

Du solltest da schon sehr trennen, zwischen Step7-Gelumpe und 
AVR-Mikrocontrollern. Beide machen in etwa das gleiche, aber sind 
grundverschieden. Ist so wie mit einer Schreibmaschine und einem 
Computer. Beide haben eine Tastatur, sind aber sehr, sehr 
unterschiedlich.

von Schüler und AVRNeuling (Gast)


Lesenswert?

Ich muß mich nochmal melden ...

Auf dem PC laufen nun die meisten meiner Programme, die ich mit dem 
Wissen aus den Büchern von Kerningham & Richie so schreibe.

Wenn ich aber ein Programm in etwa so:
1
/* Test 1 Hello World mit Befehlen aus dem AVR Tutorial */

und danach dann die (obligatorischen) Zeilen:
1
#ifndef 
2
#F_CPU = 36864000
3
4
#include <avr/io.h>
5
#include <avr/delay.h>
6
#include <avr/stdint.h>
7
8
uint8_t kurz = 10;  // 10 ms fuer einen Punkt
9
unit8_t lang = 20;  // 20 ms fuer einen Strich
10
uint8_t pause = 40; // 40 ms fuer die Pause zwischen den Zeichen
11
uint8_t zeit = 0; // Fuer die for - next Schleife um die Zeiten zu bilden

schreibe und dann versuche, das zu compilieren, also das Makefile 
ausführen lasse, kommt keine Hex - Datei dabei heraus.

Ich weiß schon, dass die Zeilen da oben noch kein Programm sind und auch 
noch keine main() Funktion existiert. Ich wollte eben nur mal antesten 
ob der Compiler meckert. Tut er aber auch nicht.

Gibt es eine Lösung, notfalls auch Windows und WinAVR wo man sehen kann 
ob da Etwas an Code entstanden ist ?

Achso: Mein System besteht aus Ubuntu 10.04, avr-libc 1.8.x und dazu 
passend avr-gcc, binutils, usw. aus dem Ubuntu Synaptic Repository.

Ich habe Eclipse AVR installiert und würde sagen, dass ich mich da in 
den letzten Wochen ganz gut eingearbeitet habe.

Schließlich will ich ja Klaus Wachtler noch in diesem Leben und sogar 
noch in diesem Jahr den "Hello World !" in Morsecode präsentieren.

Wenn es aber schon so anfängt, dass noch nicht einmal ein Teilprogramm 
richtig übersetzt wird, dann ist mein Problem wohl schon viel früher zu 
suchen.

Jürgen

von Thomas E. (thomase)


Lesenswert?

Schüler und AVRNeuling schrieb:
> und danach dann die (obligatorischen) Zeilen

Und was soll dieser Unsinn, daß du von fehlerhaften Zeilen erwartest, 
daß da irgendwas Sinnvolles bei raus kommt?

Schüler und AVRNeuling schrieb:
> Wenn es aber schon so anfängt, dass noch nicht einmal ein Teilprogramm
> richtig übersetzt wird
Was fängt an? Du hast noch gar nichts angefangen. Schreib' erstmal ein 
Programm.

mfg.

von Peter ⛄ W. (Firma: Huddel und Brassel Ltd.) (jaffel) Benutzerseite


Lesenswert?

Schüler und AVRNeuling schrieb:
> Ich wollte eben nur mal antesten
> ob der Compiler meckert. Tut er aber auch nicht.

Ich nehme doch mal an das du das ueber die shell machst. Poste doch mal 
Ein und Ausgabe

von W.S. (Gast)


Lesenswert?

Schüler und AVRNeuling schrieb:
> So, während es am Anfang überhaupt nicht geklappt hat, habe ich nun über
> Google, Eclipse AVR, gedit und dem ersten selbstgeschriebenen Make-File
> in Ubuntu 10.04 schon div. Beispiele hier..

Hmm... Du hantierst also mit selbstgeschriebenen Makefiles, Eclipse bis 
hin zu "Google".... herum. Meisterhaft!

Meine Ratschläge:
1. Lies das Manual zu dem von dir benutzten Chip, und zwar gründlich.
2. Lies dir ein Tutorial zum Programmieren im Allgemeinen und eins zum 
Schreiben von C-Programmen durch. Sowas findest du per Google.
3. Besorge dir einen der vielen kostenlosen C-Compiler für den PC und 
schreib erstmal ein klitzekleines Programm für deinen PC, z.B. eines, 
das die ersten 10 Primzahlen auf der Konsole ausgibt.
4. Dann erst mach dich daran, dein Programm für den uC zu konzipieren.
5. Mach erstmal ein Programm bestehend aus einer Quelle, für das man 
noch kein Makefile benötigt, sondern das man noch in einem Rutsch 
compiliert und gelinkt bekommt.

W.S.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.