Jackery IFA Fireplace
Mobile

[C] Ereignisse zählen und wieder löschen

Dshing

Lt. Commander
Registriert
Nov. 2007
Beiträge
1.436
Hi,
das wurde bestimmt schon oft gefragt, aber ich weiß nicht wonach ich suchen soll.

Also ich will bestimmte Ereignisse zählen, das geht bestimmt mit diesem ++ Befehl, nur ich weiß nicht wie.

Ich versuche den Code mal soweit zu schreiben wie ich mir das vorstelle und das wo ich nicht weiß wie man das schreibt schreib ich in Rot.
Code:
void  Counter (void){
uint8_t zeit;
zeit = TCNT0;        [COLOR="green"] //TCNT0 stammt aus einer anderen Funktion[/COLOR]
  if(zeit<10)
	{[COLOR="Red"]zähle i+1 angefangen bei 0[/COLOR];}
     return i;
}

int main(){
   while(1){

uint8_t x;
x= Counter ();
uint16_t s;
s=ADCWert();     [COLOR="green"] //ADCWert stammt aus einer anderen Funktion[/COLOR]
 
     if(s>34)
    {[COLOR="Red"]i wieder zurück auf 0 setzen[/COLOR];}
     else if(x=100)
     {"aktion";}
     else
     {"reaktion";}
}
}
 
i++ erhöht i um 1, i=0 setzt es wieder zurück. Wenn ich mir das so anschaue gibt es da aber noch mehr Probleme...
 
int i = 0;

dann rot 1:

i++;
oder i = i + i;

bei rot2:
i = 0;

???
 
Mike Lowrey schrieb:
int i = 0;

dann rot 1:

i++;
oder i = i + i;

bei rot2:
i = 0;

???

kannst ja nicht i in einer anderen funktion auf null setzen.
aber wie schon gesagt, da sind noch mehrere probleme

zumal "counter" atm noch nicht mal etwas übergibt -> int counter (void)

edit:

Code:
int  Counter (int a){
	uint8_t zeit;
	zeit = TCNT0;
	if(a=1)
		i=0;		
	if(zeit<10 && a != 1)
		return i++;
	a=0;
	

int main(){
	uint8_t x;
	uint16_t s;
	while(1){
		s=ADCWert();
		x= Counter ();
		if(s>34)
		{
			Counter(1);
			else if(x=100)
				{"aktion";}
			else
				{"reaktion";}
		}
}

so würd ichs jetzt machen. aber meine c skillz sind auch schon bisserl eingerostet ^^
also kein gewähr :D
 
Zuletzt bearbeitet:
chu_ schrieb:
Counter noch a übergebgen sonst passiert nix ;)

ne 1 als übergabeparameter müsste eigentlich reichen, afaik.
hab jetzt aber auhc keine c umgebung hier sonst würd ichs ebend probieren :D
 
ich würds so machen, aber weiß jetzt auch keinen anderen weg.
globale variablen nutz ich ungern und ich weiß jetzt auch nicht ob die in diesem fall auch so funktionieren würden.

einfach ausprobieren. trail and error is das stichwort :D
 
boah. Da stehen ja einen glatt die Haare zu Berge, bei dem Murks. Sorry.
1. Deine Counter()-Funktion hat nen Rückgabewert von Typ void, obwohl deine Main()-Funktion ein Typ uint8_t verlangt.
2. Ist das dein Ernst, dass TCNT0 und i globale Variablen sind?
3. Warum gibst du TCNT0 nicht einfach an die Funktion weiter?
4. Was soll diese Variable bewirken?
5. Was macht die ADCWert()-Funktion()?

Hier ist eine Abkapselung von Nöten.
Dein Counter muss in ein eigenständiges Modul und dort deklarierst du die Variablen so, sodass andere Module sie nicht direkt lesen können, sondern nur über eine Getter-Funktion. Eine Setter-Funktion innerhalb des Counter-Moduls wäre dann auch nicht schlecht.
 
@Whiz-zarD
Ja die Funktion sollte eigentlich kein void werden, hab ich mich verschreiben. Sollte eigentlich ein uint8_t anstatt void stehen.
TCNT0 liefert eine Variable und ADCWert() eine Funktion (die bisher noch keine konkreten Parameter hat) die aber nur gelesen werden können.
Das Problem ist das ich auch keine Globalen Variablen deklarieren kann (im Sinne von "dürfen" diesmal)
Aber ich hab überlegt und eigentlich müsste ich die Counter geschichte auch komplett in die main schleife holen können.
 
Dshing schrieb:
@Whiz-zarD
Das Problem ist das ich auch keine Globalen Variablen deklarieren kann (im Sinne von "dürfen" diesmal)

Das ist kein *Problem*, das ist ein Segen. ;) Den Begriff "globale Variable" solltest du möglichst schnell aus deinem Wortschatz streichen; führt nur zu Spaghetti-Code.

Vielleicht würde es auch helfen, wenn du einfach mal in ein paar kurzen Sätzen erklärst, was du mit deinem Code eigentlich erreichen möchtest. Dann könnten wir dir eventuell Ratschläge geben, die dich besser zum Ziel führen, als wenn wir hier versuchen, kleine Codeschnipsel zu korregieren.
 
2. Ist das dein Ernst, dass TCNT0 und i globale Variablen sind?
3. Warum gibst du TCNT0 nicht einfach an die Funktion weiter?
4. Was soll diese Variable bewirken?

Ich tipp mal stark drauf, dass TCNT0 iein Register eines µC anspricht. Und wie soll er das sonst lösen? Soll er jedes mal die Adresse schreiben??? Das wird außerdem keine Variable sondern eine Präprozessorkonstante sein.

Code:
else if(x=100)
     {"aktion";}
     else
     {"reaktion";}
...is jetzt auch nicht das beste, weil dann x auf 100 gesetzt wird, als Ergebnis der Operation 1 dort steht und IMMER aktion durchgeführt wird. Wenn du das willst, kannst es gleich schreiben und dir das if ersparen.

EDIT: Aber an deiner Stelle würd ich vor µC Programmierung erst mal anständig C lernen!!!
 
flopalko schrieb:
Ich tipp mal stark drauf, dass TCNT0 iein Register eines µC anspricht. Und wie soll er das sonst lösen? Soll er jedes mal die Adresse schreiben??? Das wird außerdem keine Variable sondern eine Präprozessorkonstante sein.

Naja, da steht als Kommenatar "TCNT0 stammt aus einer anderen Funktion".
Was für mich soviel heißt, dass er dynamische Daten in eine globale Variable speichert und diese Variable abfragt. Wenn das irgendein Register, und somit irgendeine Konstante ist, ok. Dann solle er dies aber auch als Kommentar schreiben.
Er hat den selben Kommentar ja auch bei der Funktion ADCWert() genommen, wobei einen klar sein sollte, dass dies eine Funktion ist.
Bei dem gruseligen Code, den man hier manchmal sieht, würde ich mich nicht darauf verlassen, dass großgeschriebene Bezeichner immer Konstanten sind.
 
Zuletzt bearbeitet:
Whiz-zarD schrieb:
Naja, da steht als Kommenatar "TCNT0 stammt aus einer anderen Funktion".
Was für mich soviel heißt, dass er dynamische Daten in eine globale Variable speichert und diese Variable abfragt. Wenn das irgendein Register, und somit irgendeine Konstante ist, ok. Dann solle er dies aber auch als Kommentar schreiben.
Er hat den selben Kommentar ja auch bei der Funktion ADCWert() genommen, wobei einen klar sein sollte, dass dies eine Funktion ist.
Bei dem gruseligen Code, den man hier manchmal sieht, würde ich mich nicht darauf verlassen, dass großgeschriebene Bezeichner immer Konstanten sind.
Also ich glaub nicht, dass der TE sooo dämlich ist, dass er eine globale Variable nennt, wie whs iein Register heißt. Ich tippe einfach stark darauf, dass er keine Ahnung hat was der Unterschied zwischen einen Präprozessorkonstanten und einer Variablen ist.

EDIT: So hab nachgeschaut. Es gibt zumindest AVR, wo das Timer/Counter Register des Timer 0 TCNT0 heißt. Somit glaub ich immer fester an meine Theorie.^^
 
Zuletzt bearbeitet:
flopalko schrieb:
EDIT: So hab nachgeschaut. Es gibt zumindest AVR, wo das Timer/Counter Register des Timer 0 TCNT0 heißt. Somit glaub ich immer fester an meine Theorie.^^
Mag sein ^^
Ich hab da wenig Ahnung von µControllern. Mich hatte nur der Kommentar sehr stutzig gemacht, da der Wert angeblich aus einer anderen Funktion stammen soll. Deswegen frag ich ja, ob das sein ernst ist, dass er eine globale Variable verwendet und was diese überhaupt bewirken soll.
Für mich wird es nicht klar, dass er dort einen Register ansprechen möchte. Hier wird auch nie ein µController erwähnt.
 
Zuletzt bearbeitet:
@Whiz-zarD: Naja wenn ich schon sowas seh mit einer Funktion ADCWert und dem TCNT0 denk ich halt sofort an µC. Vielleicht war er auch nur lustig und hat irgendwelche Sachen so benannt. Is wie gesagt nur eine Theorie, solang der TE nicht zurückschreibt.
Aber ich stimm dir vollkommen zu, dass zu wenig und auch (wie ich vermute) falsche Informationen als Kommentar stehen. Ich schreib zwar selbst eigentlich wenige Kommentare (vor allem bei µC Programmierung), aber erkläre wenigstens bei Fragen was ich wo wie machen wollt.

@TE: Es wäre also sehr sinnvoll, wenn du uns erklärst was genau du vorhast und vll deinen gesamten Source Code schickst, weil wir dann helfen können. Dürfte bei mir aber vermutlich bis morgen dauern, weil ich heute keine Zeit mehr hab da drüberzuschauen.
 
Hallo flopalko,
entschuldige, das ich dich so verärgert habe mit meiner "nicht Antwort".
Für mich war das Thema eigentlich schon vom Tisch mit der Feststellung, das man eine Variable nicht aus einer anderen Funktion heraus verändern kann. Ich hatte angenommen, dass der Befehl ++ um einiges mächtiger sein müsste, wenn man eine ganze Programmiersprache danach benennt, aber dem ist offensichtlich nicht so. (ich hab halt eine andere Denkweise als ihr informatiker)

Ok zu deinen Fragen. Ja es handelt sich um ein AVR und nein es ist keine Hausaufgabe.

Wenn du mir in Zukunft nicht mehr helfen willst, dann ist das deine Entscheidung, aber es ist ok. Ich denke ich bin eh nicht so der Typ dem man auf aggressive Weise helfen kann.

Zum Schluss noch eine Bitte für die Zukunft: Versucht es doch bitte erst mich über PN zu erreichen, bevor ihr mir eine E-Mail schickt.
 
Zurück
Oben