PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Allgemeiner C-Programmier-Thread (Atmega8)



frank669
12.10.2008, 23:18
Hi, um es kurz zu sagen, ich habe Probleme bei der Programierung von C, deswegen habe ich mal so einen Thread gestartet, hoffentlich könnt ihr mir helfen. Ist doch sicherlich besser als immer wieder einen neuen aufzumachen. Also fange ich gleichmal an:

1.) Was ist ein Interrupt und wozu ist ein Flag da?

Das war es erstmal, Lg, Frank

Felix.
12.10.2008, 23:40
interrupt = unterbrechen

also bei einem definierten ereignis (zb durch einen timer ausgelöst) unterbricht der controller seinen programmablauf an der stelle wo er grad ist, macht das was er bei einem interrupt tun soll, um dann wieder zurück an die stelle zu springen an der er unterbrochen wurde.beispiel: ein controller kann zum beispiel in seinem normalen programmablauf unterbrochen werden, wenn er über die uart schnittstelle ein zeichen empfangen soll. dann rbaucht man nich ständig abfragen ob denn nun ein zeichen empfangen werden kann.

einen flag kann man nutzen um zu kennzeichnen, dass ein bestimmtes ereignis eingetreten ist und dieses dann später nutzen. beispiel: in einen texteditor wird in dem fall dass der benutzer eine änderung am text vornimmt ein flag gesetzt, dass der text geändert wurde. wenn der benutzer den editor schließt wird überprüft ob der flag gesetzt wurde und wenn ja wird gefragt ob der benutzer die änderungen speichern will.

ps: wem der text zu unformatiert is hat sozusagen pech. diese infos könnte man sich auch aus dem netz ziehn, stellen also eine freiwillige leistung dar. beschwerden daher bitte an meinen sekretär dev/null richten ;)

thewulf00
13.10.2008, 07:59
@Frank:
Das steht alles im Wiki beschrieben. Wozu sollen wir das Rad immer wieder neu erklären?

oberallgeier
13.10.2008, 08:39
Hi, sry falls der Titel ein bisschen abwertend klingt ...Abwertend? Der erste Teil ist ziemlich nichtssagend allgemein und der zweite Teil ist total nichtssagend. Vielleicht überlegst Du Dir das nächste Mal, ob DU auf so einen Titel antworten würdest.

Ich muss thewulf00 schon zustimmen. Hier mal das, was Du durch Suchen selbst rausfinden hättest können. Lesen musst Du es selbst.
https://www.roboternetz.de/wissen/index.php/C-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://www.schellong.de/c.htm
http://www.galileocomputing.de/openbook/c_von_a_bis_z/
http://de.wikipedia.org/wiki/Flag_(Informatik)
Wenn Du das durch hast, hast Du vermutlich keine Probleme mehr beim Programmieren in C.

Noch etwas. C gehört zu den Sprachen mit so ziemlich der höchsten Informationsdichte in den Ausdrücken - da ist es angesagt, sich sehr präzise auszudrücken und ohne (Syntax- und) Rechtschreibfehler zu schreiben - mindestens im Codeteil. Daher die etwas polemische Bemerkung zu

... Probleme bei der Programierung von C ...C wurde schon Anfang der 70er des letzten Jahrhunderts programmiert. Du kannst natürlich die Programmierung von C vorantreiben. Aber vermutlich willst Du (blos) in C programmieren.

frank669
13.10.2008, 11:39
Hi, habe den Thread mal ein bisschen umgeändert!

@Felix. Danke für die Beispiele hast mich ziemlich weiter gebracht.

@oberallgeier: Coole Links, mache kannte ich noch gar nicht.

Zuletzt noch, darf ich trotzdem weiter fragen hier herein schreiben wenn ich etwas nicht verstanden hab?

Lg, Frank

fhs
13.10.2008, 12:11
@ Frank:

... darf ich trotzdem weiter fragen hier herein schreiben wenn ich etwas nicht verstanden hab?
natürlich darfst Du fragen, aber Deine Fragen sollten wesentlich spezifischer sein als die in Deinem ersten Posting; denn sonst kannst Du kaum Resonanz erwarten. Nicht zu wissen, was Interrupts sind, hat wenig mit C-Programmierung zu tun, da es um Grundlagenwissen geht, das für andere Programmiersprachen (bei Mikrocontrollern) ebenso relevant ist.

@ Joe:

C gehört zu den Sprachen mit so ziemlich der höchsten Informationsdichte in den Ausdrücken
Klar, wird aber von APL, das ich in den 80ern mal kurz benutzt und inzwischen komplett vergessen habe, um Größenordnungen übertroffen; siehe z.B.: http://catpad.net/michael/apl/

Viele Grüße

Fred

oberallgeier
13.10.2008, 13:11
C ... wird aber von APL, das ich ... kurz benutzt habe ...Hmmmm - wegen der Kürze des Codes kann man APL wohl auch de facto garnicht lange benutzen *gggg* (Sieht aber prächtig nach mathematischen Operatoren aus). Im Ernst: ich hatte davon gehört, aber hatte es noch nie gelesen. Da lobe ich mir doch noch eher LISP, von dem ich ein paar Jahre später ein paar wenige hundert Seiten Code für (m)eine AutoCAD-Anwendung geschrieben hatte.

@frank669
... habe den Thread mal ein bisschen umgeändert ...Umbenannt ! - - - ? ? in der Hoffnung, dass ALLE Ratsuchenden hier drüber fallen ? Irgendwie raff ich das einfach nicht.

Felix.
13.10.2008, 13:39
na die idee is ja garnich soo schlecht. wenn jemand ne frage hat stellt er sie hier rein. dann hat man alles schön zentral und nen anfänger kann diesen thread lesen und dadurch evtl fragen vermeiden.
an eric steven raymonds regeln hält sich hier eh keiner und wird auch niemals jemand tun. das is eher was für profiforen ;)

frank669
15.10.2008, 19:36
Moin, ich bin es mal wieder,

@Felix, so habe ich es eigentlich auch gedacht, das jeder "Anfänger" hier fragen kann. (Was sind Eric raymonds regeln?)

Mich würde jetzt mal interessieren warum man #define verwendet wenn man auch const variablen verwenden kann?!

Lg, Frank

McJenso
15.10.2008, 20:31
Hallo,

wenn du mit #define etwas definierst, ist das keine Variable. Es ist eine Anweisung für den Präprozessor (http://de.wikipedia.org/wiki/Pr%C3%A4prozessor). Dieser sucht den Code vor dem (darum Prä) übersetzen nach dem Begriff ab und setzt für den Begriff den definierten Wert ein.
z.B.
#define ZWEI 2

i = x + ZWEI;

hieraus wird
i = x + 2;

Danach wird der Code übersetzt.

Konstanten sind Variable mit allen ihren Eigenschaften. Der Wert der Variable wird an eine Speicherstelle geschrieben. Wird die Variable im Programm verwendet, muss ihr Wert i.d.R. aus dem Speicher geladen werden. Auf diesen Speicher gibt es auch einen Zeiger (http://de.wikipedia.org/wiki/Zeiger_(Informatik)) , den man im Programm benutzen kann.


Gruß

Jens

frank669
15.10.2008, 20:51
Okay, Danke für die schnelle Antwort

Frank

keinplanII
16.10.2008, 15:58
Moin,

ich fange gerade mit der C-Programmierung an, und versuche mich aktuell an einem Programm zur Bestimmung von Pi. Leider hat sich ein (Syntax-)Fehler eingeschlichen, den ich nicht ausfindig machen kann. Das ist das Programm:



#include <stdio.h> // Dies ist ein Programm das Pi bestimmt. Es werden Zufälligen Punkte in einem quadrat von 1x1 FE
#include <time.h> // erstellt. Gleichzeitig werden die Punkte näher als 1 zum Ursprung gemessen. Das Verhältnis
#include <stdlib.h> // zur Gesammtanzahl wird mit vier multipliziert,
#include <math.h> // da hier nur ein Viertelkreis betrachtet wird. Und
// Und man erhält Pi
#define rand() (a=a*1103515245+12345, a&0x2710)
#define srand(r) a=r

unsigned long int a=1;

int main(void)
{

int Zaehler, Anzahl, Zaehlerb; // Zähler zählt die Durchläufe, Anzahl gibt die Anzahl der durchläufe an,
float c, b; // Zahlerb zählt die Punkte näher als 1 zum Uhrsprung. a und b bezeichnen die
double s,k,d; // Koordinaten im Quadrat, s den Abstand zum Ursprung. x wird für den
int x=10000; // Zufallsgenerator benötigt

srand(time(NULL));
printf("Dies ist ein Programm zur Bestimmung von Pi\n");
printf("Geben Sie die Anzahl der Durchläufe an:");
scanf("%d",&Anzahl);
do {

srand(time(NULL));
c=rand();
c/=x;
b=rand();
b/=x; // Teil durch x für einen Wert zwischen 0 und 1.
Zaehler++;
d=c*c+b*b;
k=double sqrt(d);
if(k<=1){Zaehlerb++;}

}while(Zaehler<=Anzahl);
s=Zaehlerb/Anzahl;
s*=4;

Printf("\nBei der Betimmung ist für Pi folgender Wert herrausgekommen: %f",s);

return(0);

}


Das sind die Meldung, die mir der C-Compiler ausgibt:

/tmp/cc1CJaLB.o: In function `main':
Bestimmung_Pi2.c:(.text+0x10b): undefined reference to `sqrt'
Bestimmung_Pi2.c:(.text+0x16d): undefined reference to `Printf'
collect2: ld gab 1 als Ende-Status zurück

Ich hoffe ihr könnt mir weiterhelfen,

mfg Arthur

fhs
16.10.2008, 16:16
Hallo Arthur,

1. der Compiler stößt sich an Deiner Zeile "double sqrt(d); ". Wenn Du ein explizites Typecasting vornehmen willst, müsstest Du "(double)sqrt(..)" schreiben, sonst einfach nur "sqrt(..)". Gibt "sqrt" nach Deiner "math.h" denn nicht sowieso schon einen "double" Wert zurück?
2. C ist "case sensitive": "Printf"!="printf".
3. Ansonsten habe ich mir Dein Program nicht angesehen.
4. Wenn Du hier Fehlermeldungen nennst, schreibe bitte dazu, welchen Compiler Du einsetzt!
5. Bei avr-gcc ist "double" gleich "float".

Gruß

Fred

radbruch
16.10.2008, 18:12
Hallo

Die Idee eines endlosen C-Problem-Thread halte ich für Unsinn weil dann alle Infos im Nirwana des Forums verschwinden. Der Grund dafür ist die Suchfunktion die zwar die Stichworte im Thread findet, aber die dazugehörige Seite nicht anzeigt.

Viel besser finde ich kurze Threads mit eindeutigem Betreff und ein paar Antworten. Die werden mit der Suche auf jeden Fall gefunden.

Gruß

mic

keinplanII
16.10.2008, 21:51
Abend,

ich habe das "double" in Klammern gesetzt und "printf" korrigiert, trotzdem spuckt er mir folgende Fehlermeldung aus:

/tmp/ccBEcJIn.o: In function `main':
Bestimmung_Pi2.c:(.text+0x10b): undefined reference to `sqrt'
collect2: ld gab 1 als Ende-Status zurück

den genauen kompiler kann ich jetzt nicht nennen, es ist aber der, welcher bei ubuntu linux standartmäßig über den befehl cc angesprochen wird.

Vielen Dank im vorraus,

mfg Arhtur

fhs
17.10.2008, 06:55
Hallo Arthur,
http://ubuntuforums.org/showthread.php?t=78478
Gruß

Fred

sast
17.10.2008, 08:04
Hi Arhtur,

wenn du mit sqrt arbeitest, solltest du in den Compiler Optionen -lm mit aufnehmen. Damit wird dann die Math Library mit eingebunden.

sast

keinplanII
17.10.2008, 11:37
Moin,

das Programm liefert mir zwar immer noch nicht PI, aber zumindest ist die Syntax jetzt in Ordnung. Vielen Dank für die Hilfe.


mfg Arthur

oberallgeier
17.10.2008, 12:20
... das Programm liefert mir zwar immer noch nicht PI ...Wahrscheinlich rechnet es noch immer. Ist das dieses Programm, das PI auf 100 Seiten Druckpapier genau rechnet ?


... aber zumindest ist die Syntax jetzt in Ordnung ...Ich verstehe das so, dass der Compiler nicht meckert.

Weiter viel Erfolg.

keinplanII
17.10.2008, 17:00
moin,

nein, das Programm ist es nicht. Falls du Langeweile hast, kannst du dir den Quelltext ja mal anschauen. es streut bliebig Punkte in einem Quadrat von 1*1 FE, und zählt dann die, die innerhalb einer LE zum Ursprung liegt um dann Pi zu berechnen.

mfg, Arthur

oberallgeier
17.10.2008, 17:09
... es streut bliebig Punkte ... um dann Pi zu berechnen ...Puhhh - das ist ja witzig. Beinahe eine Monte-Carlo-Methode. Du rechnest also die Längen der verschiedenen Radien von Deinen Zufallspunkten, nimmst dann nur die mit der Länge 1 (+delta) - bzw. deren Koordinaten. Dann rechnest Du vermutlich den Umfang als Summe aller Verbindungsstrecken der paarig nächstgelegenen Punkte - usf. Klingt etwas aufwendig - da ich doch hauptsächlich Nieten ziehe bei diesem Zahlenlotto. Wärs nicht einfachr, nach dem ersten Treffer nur noch Punkte in der Umgebung des Treffers zu streuen?