Tach,
ich beherrsche Bascom recht gut aber möchte auch endlich mal in C
reinkommen.
Die meisten höheren Funktionen in Bascom nutze ich kaum sondern arbeite
manuell mit den Registern, für PWM, Uart, SPI, I2C usw.. Von der Seite
also erstmal kein Problem, ich bin da kein Neuling was AVR angeht.
Teilweise bin ich da näher dran am µC als der Kollege, den man als
absoluten C-Profi was µC angeht bezeichnen kann.
Ansonsten hab ich keine Programmierkenntnisse. Ich hab es mal mit Java
auf Android versucht, mit einem Buch das angeblich gut sein soll.
Nachdem ich nach 2-3 Kapiteln immer noch nicht kapiert hab was das soll,
hab ich aufgegeben.
Teilweise kann ich C schon lesen (Inspirationen aus Beispielcode holen)
aber vieles ist da für mich noch im Dunkeln.
Welche Herangehensweise würdet Ihr da empfehlen?
- C wirklich von der Pike auf wäre mir zu heftig. Ich habe mal vor
Jahren "die C-Bibel" angefangen (weiß den Titel nicht mehr aber ist wohl
das Standardwerk) und recht flott wieder in die Ecke befördert. So genau
kann und will ich es nicht wissen.
- Tutorials für µC richten sich oft an Anfänger, der ich auf µC-Ebene
nunmal nicht bin. Erst recht, wenn man wie so oft empfohlen C auf dem PC
schon beherrscht. Das ist genau falsch rum für mich.
Hat jemand einen heissen Tipp, wie ich mich mit diesen Vorkenntnissen am
einfachsten in C auf µC einarbeiten kann?
Gruß,
C-Lerner (zukünftig, hoffentlich)
C-Lerner schrieb:> - C wirklich von der Pike auf wäre mir zu heftig. Ich habe mal vor> Jahren "die C-Bibel" angefangen (weiß den Titel nicht mehr aber ist wohl> das Standardwerk) und recht flott wieder in die Ecke befördert. So genau> kann und will ich es nicht wissen.
Ohje. Nichts für ungut aber C ist eine Sprache bei der man genau wissen
muss, was man da tut. Somit ist ein Buch eigentlich ein Muss. Klar kann
man C auch mit Learnig-By-Doing lernen, dann muss man sich allerdings
auf einiges gefasst machen und sehr frustresistent sein. Versteh mich
nicht falsch C ist eine (nach meiner Meinung) tolle und mächtige
Sprache, die eigentlich einfach ist. Es ist irgendwie seltsam immer
wieder zu sehen, wie Anfänger mit den einfachsten Sachen in C haben, die
aber aus der Sicht eines Fortgeschrittenen völlig lächerlich sind (z.B.
Zeiger). Vielleicht muss man sich erst mal in C rein denken und dann
klappt es? Es lohnt sich auf jeden Fall aber den traditionellen Weg mit
dem Buch sollte man schon gehen.
C-Lerner schrieb:> Ansonsten hab ich keine Programmierkenntnisse. Ich hab es mal mit Java> auf Android versucht, mit einem Buch das angeblich gut sein soll.> Nachdem ich nach 2-3 Kapiteln immer noch nicht kapiert hab was das soll,> hab ich aufgegeben.
Das plus...
> Welche Herangehensweise würdet Ihr da empfehlen?> - C wirklich von der Pike auf wäre mir zu heftig. Ich habe mal vor> Jahren "die C-Bibel" angefangen (weiß den Titel nicht mehr aber ist wohl> das Standardwerk) und recht flott wieder in die Ecke befördert. So genau> kann und will ich es nicht wissen.
... das deutet drauf hin dass du's nicht richtig willst. Ergo musst du
es lassen, ansonsten hast du keinen Erfolg. Bitte versteh's nicht
falsch. Aber du musst schon das "volle Programm" können - aber nicht von
Anfang an. Für dich scheint es so zu sein, als ob du glaubst dass du
gleich voll durchsteigen musst. Das ist falsch. Man tastet sich ran.
> - Tutorials für µC richten sich oft an Anfänger, der ich auf µC-Ebene> nunmal nicht bin. Erst recht, wenn man wie so oft empfohlen C auf dem PC> schon beherrscht. Das ist genau falsch rum für mich.
Kommt auf das Tutorial an - ich persönlich habe nicht irgendwelche
Tutorials genommen, sondern die Beispiele die bei den DevKits dabei
waren. Gelernt hab ich auf nem 8051er in Assembler, kannte den Käfer
also sehr genau. Später hab ich mir dann den Ruck mit C gegeben und
Bücher gekauft, die den entsprechenden Compiler behandelt haben. Hier
war es dann so, dass ich mir eigene Aufgaben gesetzt hab. Angefangen wie
bei Assembler auch mit beispielsweise Timer-Interrupt und LED blinken
lassen, dann UART-Kommunikation, etc. "Automatisch" hinzu kommen dann
irgendwann die Pointer (beispielsweise bei Textausgaben auf LCD) und
ähnliches. Sprich eben nicht trocken nach Tutorial oder C-Bibel, sondern
nach konkretem Anwendungsfall. Die Beispiele der Devkits habe ich mir
bzgl der Struktur angesehen und einfach "erweitert", was auch einen
gewissen Lerneffekt bietet. Ist man dann allem begegnet (Pointer,
struct, union, enum, etc.) und hat es auch verstanden(!), dann fallen
automatisch komplexere Programme hinten raus, z.B. über verkette Listen
gesteuerte Menüs, etc.
> Hat jemand einen heissen Tipp, wie ich mich mit diesen Vorkenntnissen am> einfachsten in C auf µC einarbeiten kann?
Setz dir am Anfang kleine Aufgaben, beispielsweise kleine
Bascom-Programme in C nachbauen. Du wirst automatisch bei der einen oder
anderen Sache stolpern und gezwungen sein, dich schlau zu machen, sei es
über ein Buch, eine Website oder sonstwie. Lernen wirst du, weil du ja
die Aufgabe lösen willst.
Ralf
Hallo,
C ist ja eigentlich eine recht magere Sprache, die aber mit einem
Rasiermesser ohne Griff zu vergleichen ist. Die Vielseitigkeit kommt
erst über die libraries. Ein Buch (zum Nachschlagen) ist sicher
erforderlich. Aber vieles, was für andere Platformen erforderlich ist,
wird eigentlich auf Microprozessoren nie gebraucht. Ich habe noch nie
printf, scanf und Konsorten auf einem uc benutzt. Zu verstehen wie
Pointer funktionieren etc ist aber ein absolutes muss, da man sonst
weder mit arrays noch mit text strings etc klar kommt.
Englischkenntnisse sollten auch vorhanden sein.
Ich würde mir ein Projekt aussuchen, dass über meine Fähigkeiten
hinausgeht, Beispiele suchen, fleissig googlen, probieren, nachlesen,
und mich dann freuen, dass ich es geschafft habe!
Gruss
Reiner
Am besten besorgst du dir einen fertigen C-Code für ein einfaches
Projekt (z.B. LED-Steuerung) und versuchst, den nach deinem Geschnack
umzuschreiben und dabei zu verstehen.
Ein einfaches C-Buch dazu als Ergänzung ist sicher nicht verkehrt
(Bücherei).
Vielleicht einfach mit dem Atmel AVR-Studio4 anfangen (kannst du
kostenlos downloaden).
Was für einen Progger benutzt du?
Ach ja, und nicht von C-Profis ins Bockshorn jagen lassen, jeder fängt
mal an und die Programmiersprache C kocht auch nur mit Wasser.
Ob man als Hobby-Programmierer C in der tiefsten Tiefe seiner
Möglichkeiten benutzen können muss, wage ich zu bezweifeln.
Wie man die einzelnen Register im Datenblatt ausfindig macht für die
gewünschten Anwendungen (z.B. PWM-Ausgabe, ...) weißt du?
Am einfachsten ist es wohl, für die Grundlagen, die man direkt
übertragen kann, die Syntax zu lernen. Schleifen, Bedingungen,
Variablen, Arrays und Funktionen gibt es in BASCOM (sicher) auch. Also
würde ich erstmal nur damit arbeiten, damit deren C-Syntax sicher sitzt.
Damit kann man schon größere Programme schreiben und später, wenn man es
sicher beherrscht, darauf aufbauen.
HerrBert schrieb:> Ach ja, und nicht von C-Profis ins Bockshorn jagen lassen, jeder> fängt mal an und die Programmiersprache C kocht auch nur mit Wasser.
Oh ja, das hatte ich vergessen:
Vieles, was sog. C-Profis als smart ansehen (absolute Unverständlichkeit
des Codes) wird in anderen Programmiersprachen zu recht als absolut
schlechter Prigrammierstil angesehen.
Das grösste Problem mit solchem Code ist aber, dass man trotzdem
verstehen muss, was diese "smart assholes" mit ihren Konstrukten
erreichen wollen.
Gruss
Reiner
C-Lerner schrieb:> ich beherrsche Bascom recht gut aber möchte auch endlich mal in C> reinkommen.
Warum C?
> Die meisten höheren Funktionen in Bascom nutze ich kaum sondern arbeite> manuell mit den Registern
Dann wäre eigentlich Assembler der logische Ausweg aus der
BASCOM-Misere. Sonst bist du irgendwann auch bloß wieder in der
Situation, daß es mit C nicht mehr weiter geht, wo mit Asm noch was
ginge...
> Ansonsten hab ich keine Programmierkenntnisse.
Das ist immer schlecht. Die logische Struktur von Programmen zu
erarbeiten, ist unabhängig von der Sprache. Wer angeblich nur eine
Sprache kann, kann in Wirklichkeit meist gar keine. Er hat nämlich den
gedanklichen Schritt zur Abstraktion von Problemen nicht bewältigt,
sondern denkt in ausschließlich den Kategorien "seiner"
Programmiersprache. Und das oftmals auch noch in dem eingeschränkten
Bereich dessen, was er wirklich davon beherrscht...
> Ich hab es mal mit Java> auf Android versucht, mit einem Buch das angeblich gut sein soll.> Nachdem ich nach 2-3 Kapiteln immer noch nicht kapiert hab was das soll,> hab ich aufgegeben.
Nun ja, Java ist eine objektorientierte Sprache. Sich das Verständnis
der OO-Paradigmen zu erarbeiten (das kann man nicht wirklich lernen, man
muß es sich erarbeiten) ist etwas anderes als rein prozedurale
Programmierung zu verstehen.
Wenn man aber Assembler kann und sieht, wie es auf dieser Ebene
umgesetzt wird, hilft das erheblich dabei, die Paradigmen zu verstehen
und den ansonsten inhaltsleeren abstrakten Begriffen einen materiellen
Sinn zu verleihen.
> Teilweise kann ich C schon lesen
Das ist immer gut. Blöd nur, das C vielfach als "write only"-Sprache
verwendet wird. Das liegt aber nur indirekt an C selber, weil es quasi
unlesbare Konstrukte erlaubt. Am Ende Schuld sind die C-Programmierer,
denn nirgendwo im C-Standard steht, daß man unleserlich schreiben
muss.
> - C wirklich von der Pike auf wäre mir zu heftig.
Dann hast du bereits verloren. Deine C-Kenntnisse werden dann
(bestenfalls) auch nur den Stand deiner BASCOM-Kenntnisse erreichen:
Kenntnis von ein paar grundlegende Deklarationen und Kontrollstrukturen
und das war's.
Wenn du dich mit der Hardware der AVRs (I/O-Register usw.) schon
einigermaßen auskennst, brauchst du vor allem ein ganz normales C-Buch.
Der Klassiker ist das Buch Kernighan und Ritchie. Es ist nicht sehr
aufgeblasen, so dass du es in relativ kurzer Zeit Zeit durchgearbeitet
bekommst. Der einzige Nachteil besteht darin, dass das Buch nicht den
aktuellen Standard (C11), sondern C89 beschreibt, was aber auch kein
großes Problem darstellt, da die neueren Features nicht allzu zahlreich
sind und auch nicht zwingend benötigt werden.
Hier im Forum wurde auch schon dieses neuere Buch empfohlen:
http://knking.com/books/c2/index.html
Ich kenne es nicht, es ist auch bei Weitem nicht so schlank wie der K&R,
aber von der Beschreibung, dem Inhaltsverzeicnis und dem, was die Leute
im Netz darüber schreiben, macht es einen guten Eindruck.
Die AVR-GCC-Spezifika (bspw. das Schreiben von Interrupthandlern, das
Einbinden von Assembler in C-programme usw.) lernst du in den
einschlägigen Tutorials hier aus mikrocontroller.net oder in der
AVR-Libc-Dokumentation:
http://www.nongnu.org/avr-libc/user-manual/index.html
Noch ein Tipp: Es gibt (nicht nur hier) zwei Parteien, die sich beim
Theme C immer wieder in die Haare geraten. Die einen finden C Klasse,
die anderen verteufeln es. Das Beste ist, du machst dir selbst ein Bild
davon. Zurückkehren zu Bascom kannst du anschließend immer noch.
Der eigentliche Witz am Programmieren ist nicht die Programmiersprache.
Es ist die Denkweise und die Art ein Problem in (Quell-)Text fassen zu
können.
Ein Peter Dannegger oder ein Karl-Heinz Buchegger wird ein Problem
garantiert effizienter in Code umsetzen können als jeder Anfänger. Egal,
welches Buch der gelesen hat. Die beiden werden das aber auch mit Bascom
besser können oder mit Assembler oder mit sonstwas. Denn sie werden das
Problem anders analysieren und umsetzen. Und warum? Ganz einfach: weil
sie schon zigtausend Fehler gemacht und daraus gelernt haben. Denn
lernen kann man nur, wenn man etwas übt. Wieder und wieder.
Hier mal eine kurze Abhandlung über diese Denkweise und Irrwege:
Beitrag "Zahlenschloss - Fehler"
Ein Tipp von mir: vergiss die Funktion wait() oder delay() spätestens
einen Monat, nachdem du sie das erste Mal verwendet hast.
Reiner schrieb:> Oh ja, das hatte ich vergessen:> Vieles, was sog. C-Profis als smart ansehen (absolute Unverständlichkeit> des Codes) wird in anderen Programmiersprachen zu recht als absolut> schlechter Prigrammierstil angesehen.> Das grösste Problem mit solchem Code ist aber, dass man trotzdem> verstehen muss, was diese "smart assholes" mit ihren Konstrukten> erreichen wollen.
Naja solche Aussagen kommen meistens von Leuten die von Codeoptimierung
nicht viel Ahnung haben. ASM, C und C++ bieten halt einfach sehr viel
Möglichkeiten den Progammablauf deutlich schneller zu machen, was oft zu
lasten der Lesbarkeit geht. Vorallem C++ Templates sind ein grandioses
Konstrukt aber furchtbar zum Lesen, wenn sie wirklich intensiv genutzt
werden.
Also nicht immer gleich ärgern, wenn ein Code schwierig zu lesen ist.
Wirkliche Profis wissen schon was sie tun. Blöd nur, dass es selten auch
ausreichend dokumentiert ist ;)
TB schrieb:>> Naja solche Aussagen kommen meistens von Leuten die von Codeoptimierung> nicht viel Ahnung haben. ASM, C und C++ bieten halt einfach sehr viel> Möglichkeiten den Progammablauf deutlich schneller zu machen, was oft zu> lasten der Lesbarkeit geht. Vorallem C++ Templates sind ein grandioses> Konstrukt aber furchtbar zum Lesen, wenn sie wirklich intensiv genutzt> werden.>> Also nicht immer gleich ärgern, wenn ein Code schwierig zu lesen ist.
Nee, nicht ärgern, nur amüsieren.
Nach 40 Berufsjahren nach dem Studium in der IT im Bereich
Programmierung, Systementwicklung und Produktverantwortung kann man das
nicht wissen.
Vor allem wenn man solch antiquierte Sprachen wie PL1, COBOL, FORTRAN,
TOTAL, IDL, SQL, C, C++ und viele ASM-Dialekte von Mainframes gelernt
und verwendet hat. Die Nerds, die nicht lesbar programmiert haben, habe
ich, falls sie beratungsresistent waren, gefeuert. Lesbarkeit,
Rechtschreibung und Dokumentation geht vor.
Gruss
Reiner
Kannst du Englisch. Wärst du bereit ein englisches Buch zu lesen? Denn
auf Englisch wirst du viel mehr dazu finden.
Tutorials, wie du schon sagtest, sind meist für Anfänger und/oder nicht
sonderlich gut geschrieben.
Anhand eines Beispielcodes lassen sich leicht Implementierungen erlernen
und schnell kopieren, aber grundlegende Prinzipien eher weniger. Auch
das Grundlegende Verständnis bleibt dabei hin und wieder auf der
Strecke.
Ich würde dir zu einem Buch raten.
Da du schon programmieren kannst würde ich dir auch nicht zu einem
Anfängerbuch raten.
Ich selbst konnte sehr gut programmieren, habe den C Syntax etwas an der
Uni gelernt, und habe richtig C mit einem andwendungsbasierten Buch für
PIC24http://www.amazon.com/Programming-16-Bit-PIC-Microcontrollers-Second/dp/1856178706/ref=sr_1_1?s=books&ie=UTF8&qid=1405872302&sr=1-1&keywords=learning+to+fly+the+pic24
(zusammen mit der dazugehörigen Entwicklungsplatform in Soft- und
Hardware) gelernt. Ich fand den Weg sehr effizient, einfach und
erfolgreich.
Daher wäre meine Empfehlung:
Schau mal nach Büchern für AVR (oder vielleicht andere uC falls du
umsteigen willst, was die Sache noch interessanter und lebendiger macht
und es vermutlich auch bessere Literatur gibt als für den 'alten' AVR)
die Grundlegende C Kenntnisse vorraussetzen, dennoch kurz und knapp
darauf eingehen, aber deren primäres Ziel weniger die Programmiersprache
ist (denn programmieren kannst du schon, der Syntax ist in C halt
anders) sondern die Implementierung spezieller Funktionen (an der dann
auch gerne C spezielle Eigenschaften erläutert und benutzt werden).
Ich würde auf der englischen Amazon Seite mal die Bücher anschauen und
die Reviews lesen. Wenn ein paar sagen, dass nur Basics dran kommen,
dann würde ich das Buch meiden. Sagen ein paar, dass es für Beginners
ungeeignet ist, dann würde ich mich dafür mehr interessieren.