Forum: Compiler & IDEs Timer1-PWM Init Unterprogramm


von Brocken Sei (Gast)


Lesenswert?

Ich habe ein Unterprogramm für HW PWM geschrieben, damit ich mir die 
Namen der einzelnen Bits nicht merken muss.
Jetzt habe ich kompiliert und er spuckt mir folgende Fehlermeldung aus:

Description
comparison with string literal results in unspecified behavior
1
void PWM_INIT_Timer1(unsigned short Bit_Modus, char Inverted_NotInverted1a[10], char Inverted_NotInverted1b[20], unsigned short Prescaler);
2
3
void PWM_INIT_Timer1(unsigned short Bit_Modus, char Inverted_NotInverted1a[10], char Inverted_NotInverted1b[20], unsigned short Prescaler)
4
{
5
  TCCR1A = 0;
6
  TCCR1B = 0;
7
  
8
  if(Bit_Modus == 8)
9
    TCCR1A |= (1<<WGM10);
10
    
11
  else if(Bit_Modus == 9)
12
        TCCR1A |= (1<<WGM11);
13
        
14
  else if(Bit_Modus == 10)
15
        TCCR1A |= (1<<WGM11) | (1<<WGM10);
16
      
17
  if(Inverted_NotInverted1a == "Inverted")
18
    TCCR1A |= (1<<COM1A1);
19
  
20
  if(Inverted_NotInverted1a == "NotInverted")
21
    TCCR1A |= (1<<COM1A1) | (COM1A0);
22
    
23
  if(Inverted_NotInverted1b == "Inverted")
24
    TCCR1A |= (1<<COM1B1);
25
  
26
  if(Inverted_NotInverted1b == "NotInverted")
27
    TCCR1A |= (1<<COM1B1) | (COM1B0);
28
  
29
  if(Prescaler == 8)
30
    TCCR1B |= (1<<CS11);
31
  
32
  if(Prescaler == 64)
33
    TCCR1B |= (1<<CS10) | (1<<CS11);
34
35
  if(Prescaler == 256)
36
    TCCR1B |= (1<<CS12);
37
  
38
  if(Prescaler == 1024)
39
    TCCR1B |= (1<<CS10) |(1<<CS12);
40
}

Ich weiß zwar was damit gemeint ist aber kann ich das denn so lassen 
ohne weiters?

Gruß Bro

von Karl H. (kbuchegg)


Lesenswert?

Brocken Sei schrieb:

> Ich weiß zwar was damit gemeint ist aber kann ich das denn so lassen
> ohne weiters?

Nein
Besorg dir endlich ein Buch und lies über Stringverarbeitung nach!
http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F


> Ich weiß zwar was damit gemeint ist
Das glaub ich nicht! Sonst würdest du den 2ten Teil deiner Frage gar 
nicht mehr stellen.

von Floh (Gast)


Lesenswert?

Brocken Sei schrieb:
> Ich habe ein Unterprogramm für HW PWM geschrieben, damit ich mir die
> Namen der einzelnen Bits nicht merken muss.

Wenn man keine Probleme hat, macht man sich welche :-)
PWM einmal einstellen, und es passt.
Dafür braucht man dann keine Spezialfunktion, die aus irgendwelchen 
Strings rauslesen soll, was du einstellen willst.
Nur meine Meinung. :-)

von Karl H. (kbuchegg)


Lesenswert?

Floh schrieb:
> Brocken Sei schrieb:
>> Ich habe ein Unterprogramm für HW PWM geschrieben, damit ich mir die
>> Namen der einzelnen Bits nicht merken muss.
>
> Wenn man keine Probleme hat, macht man sich welche :-)
> PWM einmal einstellen, und es passt.
> Dafür braucht man dann keine Spezialfunktion, die aus irgendwelchen
> Strings rauslesen soll, was du einstellen willst.
> Nur meine Meinung. :-)

Und wenn schon, dann nimmt man dazu keine Strings her.
Meine Zusatzmeinung.

von Brocken Sei (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> besorg dir endlich ein Buch und lies über Stringverarbeitung nach!
Ich habe dieses Tutorial schon durchgemacht
http://www.tutorials.at/c/c-oder-cplusplus.html
und habe 4 Jahre lang C# Programmiert. Ich weiß zwar dass C# OO ist aber 
trotzdem habe ich schon Erfahrungen gemacht, also bitte hör endlich auf 
mir falsche Sachen einzureden, es hat nicht sehr viel Sinn mir ein Buch 
zu kaufen, da such ich lieber was aus dem Internet, da findet man genug 
Hilfen. Und ich schreibe nicht nur Beiträge in Foren, sondern Stichwort 
Googlen reicht ganz bestimmt. Aber danke für den Vorschlag Karl, auch 
wenns nicht sehr geholfen hat.

Floh schrieb:
> Wenn man keine Probleme hat, macht man sich welche :-)
> PWM einmal einstellen, und es passt.
> Dafür braucht man dann keine Spezialfunktion, die aus irgendwelchen
> Strings rauslesen soll, was du einstellen willst.
> Nur meine Meinung. :-)

Vielleicht hast du ja recht, das machen viele andere auch so und stützen 
das mit deinem Argument, aber ich bin leider einer der anderen Sorte.

Gruß Bro

von Karl H. (kbuchegg)


Lesenswert?

Brocken Sei schrieb:
> Karl heinz Buchegger schrieb:
>> besorg dir endlich ein Buch und lies über Stringverarbeitung nach!
> Ich habe dieses Tutorial schon durchgemacht
> http://www.tutorials.at/c/c-oder-cplusplus.html
> und habe 4 Jahre lang C# Programmiert.

Und?

Ich kann auch ein bischen Italienisch. Aber deswegen kann ich noch lange 
kein Spanisch. Auch wenn beides romanische Sprachen sind und ihre 
Wurzeln im Latein haben.

Leg endlich deinen Stolz ab und akzeptiere, dass du bei C mehr oder 
weniger wieder bei 0 anfangen musst. Ansonsten wirst du Schiffbruch 
erleiden.

> trotzdem habe ich schon Erfahrungen gemacht, also bitte hör endlich auf
> mir falsche Sachen einzureden, es hat nicht sehr viel Sinn mir ein Buch
> zu kaufen, da such ich lieber was aus dem Internet, da findet man genug
> Hilfen.

Genau das ist der Irrtum.
In C gibts es unzählige kleine Fallen, die dir das Genick brechen 
können.

> Und ich schreibe nicht nur Beiträge in Foren, sondern Stichwort
> Googlen reicht ganz bestimmt. Aber danke für den Vorschlag Karl, auch
> wenns nicht sehr geholfen hat.

Ach. Dann ist also der Link darauf, wie Stringverarbeitung in C wirklich 
funktioniert nicht besonders hilfreich? Zugegeben, das ist die absolut 
notwendige Kurzform. Aber wenn du damit Schwierigkeiten hast zeigt das 
eigentlich nur eines: Du brauchst mehr als alles andere endlich 
vernünftige Literatur, die dich systematisch in C einarbeitet.

Hast du den Link wenigstens gelesen?


> also bitte hör endlich auf mir falsche Sachen einzureden

Nicht ich bin es, der auf dem Holzweg ist.

von Peter (Gast)


Lesenswert?

Brocken Sei schrieb:
> char Inverted_NotInverted1a[10],

wie willst du denn in 10 Zeichen "NotInverted" reinbekommen? Lies dir 
wenigsten mal den abschnitt mit enums aus dem C buch durch. Es macht 
wirklich kein sinn soetwas mit string zu erledigen.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Brocken Sei schrieb:
>> char Inverted_NotInverted1a[10],
>
> wie willst du denn in 10 Zeichen "NotInverted" reinbekommen?

Sein Glück ist es, dass diese 10 an dieser Stelle nicht das machen, was 
man gemein hin denkt. Die 10 sind hier nur syntaktischer Zucker ohne 
weitere Auswirkungen. Für den Compiler steht hier ....
1
void PWM_INIT_Timer1(unsigned short Bit_Modus,
2
                     char * Inverted_NotInverted1a,
3
                     char * Inverted_NotInverted1b,
4
                     unsigned short Prescaler)

... nur in einer etwas anderen Schreibweise.

von Brocken Sei (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Du brauchst mehr als alles andere endlich
> vernünftige Literatur, die dich systematisch in C einarbeitet.

Also wenn ich eins in meiner -ich nenns mal so- Techniker Karriere 
gelernt habe, dann ist es folgendes: Ich kann es entweder über den 
systematischen Weg machen wie das auch bei Schulen unterrichtet wird und 
wie du mir gesagt hast, oder ich mache es wie ich es hobbymäßig immer 
mache einmal hier, einmal da. Glaub mir es kommt bei beiden das selbe 
Ergebnis heraus, außer dass ich bei deiner Theorie (Ich steh natürlich 
voll und ganz auf deiner Seite) 10mal länger brauche und nicht alles 
lerne was ich brauche und bei meiner löse ich effizient das Problem. 
Natürlich geht das eine oder andere wichtige Detail verloren aber 
deshalb gibt es ja das Forum.
Da ich hobbymäßig eher meine Methode vorziehe und ich kein Informatiker 
bin der wieklich auf höchster Ebene rein softwaremäßige Probleme löst, 
würde ich sagen da ich noch eher jung bin und noch in der Ausbildung, 
dass ich bei meiner Theorie bleibe.
Und außerdem wenn ich ein Buch kaufen würde wüsste ich nicht welches, da 
werden zwar welche empfohlen aber wie oft habe ich ein empfohlenes Buch 
gekauft und es war für die Katz.

Gruß Bro

von Brocken Sei (Gast)


Lesenswert?

Peter schrieb:
> wie willst du denn in 10 Zeichen "NotInverted" reinbekommen?

Hey das habe ich gemacht nachdem ich 20 reingetan habe, reiner Zufall 
dass ich das falsche reingepostet habe, sry.

Peter schrieb:
> Es macht
> wirklich kein sinn soetwas mit string zu erledigen.

Ja ich überleg auch schon einen Umweg über Makros zu machen, aber ich 
überlege nur ob das gehen kann(keine Antworten zu dieser These 
erwünscht).

Gruß Bro

von Karl H. (kbuchegg)


Lesenswert?

Brocken Sei schrieb:

> Also wenn ich eins in meiner -ich nenns mal so- Techniker Karriere
> gelernt habe, dann ist es folgendes: Ich kann es entweder über den
> systematischen Weg machen wie das auch bei Schulen unterrichtet wird und
> wie du mir gesagt hast, oder ich mache es wie ich es hobbymäßig immer
> mache einmal hier, einmal da. Glaub mir es kommt bei beiden das selbe
> Ergebnis heraus

Glaube mir. Das tut es nicht.
So wie du das machst, kommt nur riesengroßer Unsinn heraus. Wie zb der 
Code den du oben geschrieben hast.

>, außer dass ich bei deiner Theorie (Ich steh natürlich
> voll und ganz auf deiner Seite) 10mal länger brauche und nicht alles
> lerne was ich brauche und bei meiner löse ich effizient das Problem.

Bei deiner löst du überhaupt kein Problem. Siehe oben.
Das da oben ist nicht nur ein klein wenig falsch. Das ist grundlegend 
falsch.

> Natürlich geht das eine oder andere wichtige Detail verloren aber
> deshalb gibt es ja das Forum.

Das ist grundsätzlich richtig. Nur geht es dabei eben nicht um 'das eine 
oder andere kleine Detail', es geht um Grundlagen! Hast du es jetzt 
kapiert? Dein Fehler ist einer von der grundlegenden Natur! Das ist ein 
Basiswissenfehler! Das hat nichts mit iregdnwelchen Details zu tun! Das 
ist so wie wenn du beim Integrieren laufend Punkt-vor-Strichrechnung 
falsch machst. Der Fehler kann einmal passieren, aber wenn er ständig 
passiert, dann hat derjenige der ihn macht, offenbar ein grundlegendes 
Problem mit einfachster Mathematik. Da hat es dann auch keinen Sinn 
mehr, wenn in einem Forum nach irgendwelchen Besonderheiten beim 
Integrieren gefragt wird. Zuerst muss Basiswissen Mathematik her!

Und bei dir muss Basiswissen C her.

Wer
1
  if(Inverted_NotInverted1a == "Inverted")
schreibt, macht nicht einen kleinen Flüchtigkeitsfehler. Er hat einen 
riesengroßen Bock geschossen! Jetzt kapiert?
Und das Gemeine an der ganzen Sache ist das, wenn man die Funktion 
testet, und mit den richtig ausgewählten Parametern aufruft, dann kann 
es sogar so aussehen als ob alles in Ordnung und korrekt wäre. Klingt 
widersinnig, ist aber so. So ist C! Es gibt jede Menge kleine Fallen, 
die du nicht einmal siehst, wenn du davor stehst.

> Und außerdem wenn ich ein Buch kaufen würde wüsste ich nicht welches, da
> werden zwar welche empfohlen aber wie oft habe ich ein empfohlenes Buch
> gekauft und es war für die Katz.

Kernighan & Ritchie
Programmieren in C

Die Bibel schlechthin.

Ausserdem gibts dann noch online ein paar Bücher:
http://openbook.galileocomputing.de/c_von_a_bis_z/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.