Umstieg auf C ==> Literatur gesucht

Im Unterforum Erfahrungsaustausch - Beschreibung: Fragen und Antworten von User zu User zu allen elektrischen und elektronischen Geräten

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 11 2024  23:35:41      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Erfahrungsaustausch        Erfahrungsaustausch : 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
Zur Homepage von Steppenwolf
 

  


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

 

  

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Und wenn es ein Buch über C sein soll:
"Programmieren in C" von Kernighan & Ritchie

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
Zur Homepage von Steppenwolf

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
Zur Homepage von Steppenwolf

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
Zur Homepage von Steppenwolf

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
Zur Homepage von Steppenwolf


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
Zur Homepage von Steppenwolf



_________________
Meine Projekte:
http://mauerer.m.googlepages.com

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
Zur Homepage von Steppenwolf

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 ]


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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