Forum: Compiler & IDEs Problem mit dem Timer1


von klaus (Gast)


Lesenswert?

Hallo,

Ich habe ein Problem mit dem Timer1 und der Comparefunktion. Und zwar 
möchte eine Software Uart erstellen.

Hardware: Mega8, 8Mhz

Der Timer ist angestellt und läuft mit 1/52µs, dies funktioniert auch. 
Getestet durch ein toggelndes Bit im Überlaufinterrupt.

Durch die Hardware gegeben, erkenne ich den Empfang eines Byte mit dem 
externen Interrupt INT1.

Die Interrupt Routine INT1 sieht ungefähr so aus
1
void int1_isr(void)
2
{
3
unsigned int data1,data2;
4
5
data1=TCNT1; //aktuellen Timerwert einlesen
6
data2=timer1startwert+bitdauerhalbe; 
7
8
if(data1 <= data2) then data2=data1+bitdauerhalbe;
9
                   else data2=data1-bitdauerhalbe;
10
11
CompareWert1b = data2;   // weis grad nicht wie das compare register heisst
12
                          // hab aber das richtige benutzt im programm 
13
timer1bcompinterruptan();
14
extint1interruptaus();
15
}
so nun kommt das komische. nun sollte ja meiner meinung nach jedesmal 
wenn der timer1 am compare wert vorbeikommt, der compare interrupt 
auslösen. dies geschieht auch, aber nur wenn ich die if-schleife 
auskommentiere, getestet durch toggeln eines ausgangs im compare 
interrupt. die timmings passen zwar nicht aber löst jedenfalls aus, nur 
mit der aktiven if schleife nicht.
hat jemand einen plan warum das so ist?

mfg klaus

von holger (Gast)


Lesenswert?

>if(data1 <= data2) then data2=data1+bitdauerhalbe;

"then" gibt es in C nicht.

von klaus (Gast)


Lesenswert?

entschuldige ist das versehentlich reingeruscht. ich benutze nen 
grafischen editor, daher ist syntax richtig denk ich. als compiler den 
icc avr

von holger (Gast)


Lesenswert?

>ich benutze nen grafischen editor, daher ist syntax richtig denk ich.

Ist völlig wurscht was du da benutzt. "then" gibt es in C nicht.
Der Compiler wird dir da haufenweise Warnings/Errors anbieten.
Du kannst sie ignorieren, dann funktionierts halt nicht.

if(data1 <= data2) data2=data1+bitdauerhalbe;
              else data2=data1-bitdauerhalbe;

von Johannes M. (johnny-m)


Lesenswert?

klaus wrote:
> Die Interrupt Routine INT1 sieht ungefähr so aus
Mit ungefähren Angaben kann hier keiner was anfangen. Poste exakt 
das, was Du auch programmiert hast, und Dir kann vielleicht geholfen 
werden.

von klaus (Gast)


Lesenswert?

ich sags dann mal anders ich hab mich da verschrieben,ich hab im orignal 
kein then drin (hab den code aufm anderen pc und grad nicht greifbar 
daher konnt ich den nicht direkt posten), der compiler gibt keine 
warnungen und keine errors

von klaus (Gast)


Lesenswert?

wie grad geschrieben grad nicht greifbar aber von der logic des 
originals übereinstimmend.

von holger (Gast)


Lesenswert?

>wie grad geschrieben grad nicht greifbar aber von der logic des
>originals übereinstimmend.

Dein Code ist Schrott ! Beim nächsten mal postest du am besten
ein Suchbild mit Wald. Frage: Wo ist der Affe ? Wer findet ihn ?

Geh spielen man !

von klaus (Gast)


Lesenswert?

schlechten tag gehabt?

ich gebe zu das der code unvorteilhaft dargestellt ist, hab aber 
eigentlich nur gefragt: wenn  die if schleife aktiv ist, warum er dann 
nicht in den interrupt springt wenn sie aus ist,also ein fester wert 
gesetzt ist dann macht er es, alles andere tut, daher dachte ich das das 
so reicht.

anscheinend nicht aber holger das ist immer noch kein grund patzig zu 
werden!

von STK500-Besitzer (Gast)


Lesenswert?

>if schleife

Sowas gibt es nicht. Wenn dann ist es eine if-Abfrage - nur so am Rande.

>Die Interrupt Routine INT1 sieht ungefähr so aus

Äusserst schlechte Formulierung...

Mit dem, was du da gepostet hast, kann niemand (der halbwegs fachkundig 
ist) etwas anfangen.
Da kassiert man schnell Sprüche mit Kristallkugeln oder den Unmut von 
Leuten, die helfen wollen würden, wenn entsprechende Hilfestellungen zum 
Helfen gegeben sind. Dein Codefragment ist definitiv keine Hilfe.
Poste (am besten compilierbaren) Code und man kann dir helfen.
Ein parr Angaben zum Entwicklungssystem (sooo viele gibt es vermutlich 
nicht für den AVR) könnten auch unterstützende Maßnahmen sein.

>anscheinend nicht aber holger das ist immer noch kein grund patzig zu
>werden!

Holger hat sich zumindest bemüht, die zu helfen. Aber irgendwann ist 
auch des geduldigsten Menschen Geduld am Ende...

von klaus (Gast)


Lesenswert?

Hallo,

ich selber bin nun ausgeschlafen und gebe dem User  STK500-Besitzer voll 
kommen recht, was ich oben gepostet habe, ist so in der Form für 
"außenstehende" wohl kaum nachzuvollziehen.
Daher ziehe ich die Frage zurück.

Aber wenn holger postet ein "then" gibt es nicht in c, womit er auch 
recht hat. Und ich darauf hin antworte, das ich einen grafischen editor 
benutze und mir das dort hineingeruscht ist.
Zu antworten:
1
Ist völlig wurscht was du da benutzt. "then" gibt es in C nicht.
2
Der Compiler wird dir da haufenweise Warnings/Errors anbieten.
3
Du kannst sie ignorieren, dann funktionierts halt nicht.

Völlig überflüssig ist in meinen Augen. Bei einem grafischen editor 
(zumindest bei meinen, vllt. verstehe ich auch etwas anderes darunter) 
klicke ich auf "If-Abfrage erstellen" dannach klick auf das 
Bedingungsfeld gebe dort was ein, dannach auf das "then"(daher kommt der 
fehler das ich ein then miteingebaut hab, das seh ich halt immer auf 
meinem bildschirm hinter dem wörtchen if), ggf. dannach auf "else" und 
fertig. Das der Editor dann eine If-Abfrage ala
if (Bedingung)
  {
  }
draus macht versteht sich meiner Ansicht nach von selbst. Selbst wenn 
nicht, wie schon erwähnt gibt es haufenweise Warnings/Errors, und ich 
glaube man kann nicht davon ausgehen, das dieses Syntax Problem, das 
jemand der "mein timer toggelt im ... und es funktioniert"(im 
übertragenen sinne) schreibt nicht selbst in den griff bekommt. Von 
daher überflüssig die Aussage.

Und so wie Johannes sofort erkannt hat, ist das nicht mein orginal Code, 
und hat mich freundlich gebeten diesen zu Posten damit mir evtl. jemand 
helfen kann.
Reicht doch als Antwort!

Aber das was von holger gekommen ist, war mindestens genauso 
unvorteilhaft wie mein erstellungspost. Wobei ich mich damit nicht 
beschweren möchte das  er versucht hat mir zu helfen. Das "then" springt 
schon schnell als möglichen Fehler ins Auge.

Abschliessend möchte ich noch sagen, ich hoffe es ist ersichtlich 
geworden warum ich ihn patzig genannt habe, dies sollte kein 
persönlicher Angriff auf ihn oder jemanden anderen sein.

Und bitte legt jetzt nicht jedeswort von mir auf die Goldwaage, ich 
bezwecke mit diesem Posting nicht, das das hier ausartet.

Mfg Klaus

P.S.: von mir kann ein Moderator diesen Thread auch löschen, ist in der 
Form der gestellten Frage nicht nützlich.

von Passi (Gast)


Lesenswert?

du kannst auch im Datenblatt von Mega8 anschauen. dort Atmel gibt 
einigen anweisungen wie man Timer benutzen kann. es gibt auch einigen 
code bsp aber vosichtig es ist nich compatible mit aller compiler. oder 
schau mal im AVR GCC Tutorial

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.