Umstieg auf C ==> Literatur gesucht Im Unterforum Erfahrungsaustausch - Beschreibung: Fragen und Antworten von User zu User zu allen elektrischen und elektronischen Geräten
Autor |
Umstieg auf C ==> Literatur gesucht |
|
|
|
|
BID = 455938
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
|
Hallihallo zusammen,
ich bin gerade dabei, mich an C heranzutasten. Insbesondere sollen AVRs in dieser Sprache programmiert werden.
Als Compiler benutze ich AVRstudio mit WinAVR zusammen.
Hab jetzt ein bisschen ausprobiert und muss sagen, dass das ja eine grauenhafte Sprache ist... In Basic ging immer alles schön und schnell, und nun muss man Symbole auf der Tastatur suchen, die man noch nie gesehen hat... Und alles wird doppelt so lang Aber egal, wan wird sich dran gewöhnen
Bis jetzt hab ich es nicht fertiggebracht, auch nur einen Taster auszuwerten und eine LED anzusteuern, ich war noch nie mit C konfrontiert und das Ganze erscheint mir reichlich abstrakt.
Ein Buch soll deshalb Abhilfe schaffen. Es soll die Grundlagen von C und den Syntax erläutern und aufzeigen. Optimal wäre es, wenn das Buch gleich noch mit AVRs und evtl. sogar mit WinAVR harmonieren würde...
Gibt es da etwas brauchbares, oder soll man alles im Netz zusammenkratzen?
Wie habt ihr euren Einstieg in C mit Bezug auf AVRs gemacht? "Woher weiss man, wie es geht"?
Herzlichen Gruss und Danke
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com |
|
BID = 455940
Benedikt Inventar
Beiträge: 6241
|
|
BID = 455942
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Wundert mich, dass jemand so über eine richtige Sprache spricht, der bis jetzt nur in Basic programmiert hat...
Google ist aber auch hier dein Freund; es gibt so viele C-Referenzen etc. da wundert mich, dass du nichts gufunden hast.
Speziell auf AVRs bezogen gibt es dann noch das AVR-C-Tutorial von mikrocontroller.net
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial)
Prinzipiell ist C recht einfach, es die Sprache hat nur ca. 30 Schlüsselwörter, das lernt man schnell; vermutlich schneller als die ganzen Basickrüppeleien .
Als kleines Beispiel mal folgendes:
#include <avr/io.h> //in Linux
#include <avr\io.h> //in Windows (1)
int main(void) //(2)
{
DDRD |= 1<<PD2; //PORTD2 ist Ausgang 3
PORTD |= 1<<PD2; //und Ausgang auf High schalten 4
while(1); //5
return(0); //6
};
Erklärung:
1: Einbindung der IO-Adressen und anderer µC-spezifischer Konstanten; damit lassen sich IO-Adressen wie Variablen nutzen
2: main() ist die Stelle, die angesprungen wird, nachdem der µC initialisiert wurde
3: DDRD: ein Bit setzen -> koresp. Pin wird Ausgang (DDRD wird wie eine Variable angesprochen.)
4: PORTD: ein Bit setzen -> koresp. Pin wird High
5: Endlosschleife
6: return (ist guter Stil, auch wenn die Schleife darüber bereits die Abarbeitung stoppt. return(0) ist eigentlich hier unwichtig, aber normalerweise gibt das Programm einen Kode zurück, wenn es sich beendet, und wenn dies 0 ist, heißt es, dass kein Fehler auftrat.
_________________
|
BID = 455944
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Klar, das Microcontroller-Tutorial kenn ich.
Nur: Dort wird vielmehr die Verwendung eines AVR erklärt. Das kann ich ja (also welches Register was macht und wie was funktioniert). Das ist ja kein Problem für mich.
Ich hab Mühe mit dem Syntax itself... z.B. der Aufbau von For-Schleifen, If, elseif, while etc. etc. Im Microcontroller-Tutorial ist dies halt nicht der Schwerpunkt und dementsprechend mühsam zu finden.
Unterdessen blinkt aber auch meine LED
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
|
BID = 455946
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ja, die Syntax kann mal ja an jedem beliebigen Tutorial lernen.
http://home.fhtw-berlin.de/~junghans/cref/master_index.html
Da steht vieles. Es gibt aber tausend andere.
For-Schleife:
for(Startwert;Bedingung;Operation);
Beispiel:
for(i=0;i<10;i++)...
Macht folgendes:
i ist anfangs 0, die Schleife wird solange wiederholt, bis die Bedingung unwahr wird (z.b. wenn i größer gleich 10 ist) und die Operation gibt an, was mit i gemacht werden soll: i++ heißt: erst Schliefe durchlaufen, dann i um 1 erhöhen (postinkrement). ++i heißt: erst i inkremetieren, dann Schleife durchlaufen (ergo: Schlife beginnt nicht bei 0 sondern bei 1). Hier kann man auch andere Sachen schreiben, z.b. einen Intervall festlegen:
for(i=0;i<=10;i+=2)...
Hier wird i immer um 2 erhöht.
Es geht auch:
for(;i<=10;i+=3)...
hier wird fpr i der Wert genommen, der bereits drinsteht. Wenn i z.b. vorher 2 war, dann geht es bei 2 los. Vorsicht: kann Programm zum Absturz bringen! wenn man nicht genau weiß, was man tut. Daher am besten immer mit i=0 definieren.
for(i=100;i!=0;i--)
{
if(i==20) break;
};
Ist ein blödes Beispiel, aber zeigt die Funktion von break. Break beendet die Schleife vorzeitig. (kann man manchmal brauchen)
Auch vorsichtig musst du bei den = sein:
a=b; //in a steht jetzt b
if(a=b) // ist falsch. auf Gleichheit prüfen mit
if(a==b) ...
Aber das lernt man. Find ich übrigens gut von dir
Edit: Verzeiht mir ein paar ganz blöde Fehler. Bin grad in Eile...
_________________
[ Diese Nachricht wurde geändert von: DonComi am 8 Sep 2007 15:14 ]
|
BID = 455971
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Hui, danke dafür!
Aber das ischt doch bescheurt... wieso reicht nich ein Gleichzeichen? Wieso muss es i++ und nicht einfach i+ etc. sein?.... Grrrr ich werd noch wahnsinnig...
Danke!
Gruss
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
|
BID = 455978
Benedikt Inventar
Beiträge: 6241
|
Zitat :
Steppenwolf hat am 8 Sep 2007 16:36 geschrieben :
|
Aber das ischt doch bescheurt... wieso reicht nich ein Gleichzeichen?
|
Weil dass dann der Zuweisungsoperator ist. Solche Sachen wie
if (i=1)
{}
funktionieren auch, allerdings macht es etwas anderes als das was der Programmierer vorhatte. i wird der Wert 1 zugewiesen, und das ist immer wahr. Es gibt nicht ohne Grund Wettbewerbe, wer den am schwersten zu lesenden C Coder schreibt...
Zitat :
|
Wieso muss es i++ und nicht einfach i+ etc. sein?.... Grrrr ich werd noch wahnsinnig...
|
Mach es doch ganz einfach: Nutze erstmal keine Kurzschreibweisen, sondern die Langform.
Also anstelle i++; einfach i=i+1; usw.
Und noch ein Hinweis vorneweg: Der Compiler rechnet standardmäßig alles als int, also in diesem Fall 16bit.
char x;
int y;
y=x*256;
funktioniert daher.
int x;
long y;
y=x*256;
funktioniert nicht, da x*256 als 16bit gerechnet wird, es daher zu einem Überlauf kommen kann, und erst nachher in long (32bit) umgewandelt wird.
|
BID = 456088
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
"Moin",
Stimmt, nutze erstmal die gewöhnlichen Formen. Es gibt viele Möglichkeiten in C/C++ die gleichen Sachen zu machen:
i++;
i+=1;
i=i+1;
und so weiter. Die Kurzformen sind einfach angenehm und man weiß sofort, was los ist (manchmal aber auch garnicht...)
Beispielsweise solche Sachen wie
a=(c&b)?100:200;
ist gleichbedeutend wie:
if(c&b) a=100; else a=200;
sind so Sachen, die es Programmiern abentuerlich machen, Kodes anderer zu verstehen
_________________
|
BID = 456091
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Hehe, ich finde diesen Kauderwelsch ganz interessant, dass sich sowas durchsetzen konnte
Den Compiler find ich auch cool, mit diesen "Optimierungsstufen"... In der höchsten Stufe presst er die Sache ja recht ordentlich zusammen...(verglichen zu Bascom Basic ) Ist die Funktion des Codes dann auch bei komplexeren Programmen gewährleistet, oder fällt die Sache bei hohen "Optimierungen" auseinander?
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
|
BID = 456096
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Es gibt beim avr-gcc (den benutzt du, auch wenn du es vermutlich nicht wusstest ) 5 Optimierungsstufen, nementlich O0-O3 und Os. O0 bis O3 optimieren verschiedene Dinge, Os optimiert speziell auf kompakten Kode.
Aber nicht immer ist Os das beste, auch wenn es meist den kürzesten Kode erzeugt.
Du kannst dir das mal im Listing anschauen, per linux mit avr-objdump oder mit Avr-Studio indem du festlegst, dass ein Listingfile erzeugt wird. Da stehen dann alle Assemblerbefehle drin.
Warum sich diese merkwürdigen Sachen bei C durchgesetzt haben? kA, aber mir sind die tausendmal lieber als diese Krüppelbefehle in Basic...
Und bedenke, was mit diesen Sprachen schon gemacht wurde. Da kommt Basic nicht mit.
ußerdem vereinfacht das auch vieles. Wie schon erwähnt. Ein Beispiel:
Dim i as Byte
Dim a as Byte
i = 100
If i = 100 Then
a = 10
Else
a = 20
End if
---
unsigned char i=100,a;
if(i==100) a=10; else a=20;
--
Ok, blödes Beispiel, aber beide Male wird das Gleiche getan. Und was sieht besser aus?
Vorallem hat man damit die Grundlagen für C++ gelegt, welche einfach abartig stark ist gegenüber Basic. Operatorenüberladung, Vererbung und so weiter. Starke Entwicklung.
Sicher, ein guter Compiler würde aus dem Basickode etwas ähnlichlanges wie der C-Compiler erzeugen, aber der Quelltext muss ja auch aussehen
Übrigens:
Bei for, if und noch weiteren kannst du den ersten Befehl ohne { und } machen:
for(a=0;a<10;a++) printdezimal(a);
soll jedoch mehr als nur eine Sache gemacht werden, muss eingeklammert werden: (Blöcke)
for(a=0;a<10;a++)
{
blabla;
blalba;
};
Diese Blockstrukturen sind auch so eine schöne Sache. Aber das wirst du alles noch merken
Auch der Präprozessor ist genial.
Edit:
Aso, merken kannst du dir auch, dass Zeilenumbrüche nichts bedeuten, du kannst dein Programm auch in eine Zeile quetschen. Zumindest bei einer Variante von Basic kann ich mich daran erinnern, dass man explizit angeben musste, dass der Ausdruck noch in der nächsten Zeile weitergeht:
Funtion blabla(byref a as Byte) &_
As Integer
in C total bescheiden:
int blabla(char *byte){tu was; return(wert);
};
Das ist dem Compiler wurst.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 9 Sep 2007 2:08 ]
|
BID = 456097
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Zitat :
DonComi hat am 9 Sep 2007 02:02 geschrieben :
|
Es gibt beim avr-gcc (den benutzt du, auch wenn du es vermutlich nicht wusstest )
|
ich darf doch bitten...
Joojoo, mal schauen, wie sich das bei mir entwickeln wird
Herzlichen Gruss und danke
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
|
BID = 456098
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Aso, sry, sowas soll niemals meinerseits böse gemeint sein. Damit will ich nur an jene erinnern, die das mal entwickelt haben. Oft soll es ja nur klappen, egal wie, das geht dann soweit, dass man nichtmal den Namen der binutils zu gesicht bekommt, die in Wirklichkeit das meiste machen. Das wollte ich mit dem avr-gcc sagen
Also, meinerseits viel Lernerfolg, und wenn du Fagen hast und keine Antworten findest - ich werde zumindest versuchen, zu helfen.
_________________
|
BID = 456140
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
|
BID = 456178
faustian.spirit Schreibmaschine
Beiträge: 1388 Wohnort: Dortmund
|
BASIC ist ja auch das Horrorbeispiel einer kontextsensitiven Grammatik.
Und Kernighan&Ritchie ist schlicht das Standardwerk, da es von denen stammt, die die Sprache verd...nochmal erfunden haben. Ausserdem ist es gut zu lesen und enthält Übungen.
|
BID = 457874
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Huch, schon geht die Fragerei los
Ich hab eine Variable, die heisst "hilfe". Sie wird vor der Main-Routine deklariert. (8Bit unsigned)
Zu beginn der Main-Schleife wird dieser Variable der Wert 1 zugeordnet:
hilfe=1;
In der Interruptroutine vom UART-Empfang(welche ausgeführt wird (LED toggelt), wird der Variable der Wert 2 zugewiesen:
hilfe=2;
In einer Endlosschleife, welche nach der Interruptroutine wieder ausgeführt wird, steht:
if(hilfe ==2)
{
[Toggle eine LED]
}
Nur... Diese IF-Routine wird nie ausgeführt... Nicht mal im Simulator vom AVRstudio!... Was geht da falsch? Wenn ich von Beginn an der Variable den Wert 2 zuweise, dann wird die IF-Routine ausgeführt...
Im Simulator ändert die Variable zwar den Wert, er wird 2, doch die IF-Schleife wird nicht ausgeführt, obwohl die Variable den Wert 2 hat...
Die Simulator-Ergebnisse decken sich auch mit der Realität.
Was übersehe ich?
Herzlichen Gruss und Danke
Edit: Habs... Stichwort "volatile"...
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
[ Diese Nachricht wurde geändert von: Steppenwolf am 17 Sep 2007 14:34 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 21 Beiträge verfasst © x sparkkelsputz Besucher : 182420882 Heute : 5380 Gestern : 7490 Online : 490 28.11.2024 23:35 1 Besucher in den letzten 60 Sekunden alle 60.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0496490001678
|