Forum: Compiler & IDEs Timer1 läuft nicht richtig warum ?


von Alexander P. (tollerteppich)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche gerade den timer1 zum laufen zu bekommen. was mir aber 
nicht so wirklich gelingen will.

nun habe ich schon ausgibig gegoogelt und auch hier im forum geschaut 
konnte aber den fehler nicht identifizieren.

das kann nur irgendwas kleines sein wo ich nicht drauf komme.

geplant ist später ein relais was eine hupe einer alarmanlage steuert im 
1s takt ein und aus zu schalten ggf auch andere zeit intervalle.

ich hoff ihr könnt mir weiterhelfen

gruß alex

von g457 (Gast)


Lesenswert?

Du hast gleich zwei Todsünden begangen:

1. sagst Du uns nicht um welchen µC es sich handelt.
2. ist sowas hier..
1
TIMSK  = 0x10;      // 0b00100000, Überlaufinterrupt von Timer 1
2
           ^               ^^
 per se böse.

Auf 1. hin hab ich mir mal den m8 als 0815standardtestµC herangezogen - 
auf dem macht obige Zuweisung was ∗ganz∗ anderes - 0x10 aktiviert den 
TICIE1, das vermeintliche 0b00100000 vergnüngt sich mit dem OCIE1A. Du 
hast aber (nur) den OVERFLOW1-Handler implementiert, der würde bei 0x04 
(== _BV(TOIE1)) aktiv.

Ich hoffe es wurde klar worauf ich raus will.

von Alexander P. (tollerteppich)


Lesenswert?

g457 schrieb:
> Auf 1. hin hab ich mir mal den m8 als 0815standardtestµC herangezogen -
> auf dem macht obige Zuweisung was ∗ganz∗ anderes - 0x10 aktiviert den
> TICIE1, das vermeintliche 0b00100000 vergnüngt sich mit dem OCIE1A. Du
> hast aber (nur) den OVERFLOW1-Handler implementiert, der würde bei 0x04
> (== _BV(TOIE1)) aktiv.

öhm mein fehler hatte etwas herumprobiert ursprünglich war es natürlich 
0x20 also TICIE1.

aber mit TOIE1 also 0x04 läuft es bei mir auch net wie ich gerade 
getestet habe.

hatte im netz ne timer1 routine gesehen wo der OCIE1A an war... und 
ausprobiert aber hatte auch net geklappt...

ja ich hab einen Mega 8 :D der compiler vom myavr workpad hatte 
irgendwie probs mit dem header da hatte ich den gelöscht :D

von Karl H. (kbuchegg)


Lesenswert?

Alexander P. schrieb:
> g457 schrieb:
>> Auf 1. hin hab ich mir mal den m8 als 0815standardtestµC herangezogen -
>> auf dem macht obige Zuweisung was ∗ganz∗ anderes - 0x10 aktiviert den
>> TICIE1, das vermeintliche 0b00100000 vergnüngt sich mit dem OCIE1A. Du
>> hast aber (nur) den OVERFLOW1-Handler implementiert, der würde bei 0x04
>> (== _BV(TOIE1)) aktiv.
>
> öhm mein fehler hatte etwas herumprobiert ursprünglich war es natürlich
> 0x20 also TICIE1.
>
> aber mit TOIE1 also 0x04 läuft es bei mir auch net wie ich gerade
> getestet habe.

Der springende Punkt ist:
Es interessiert keinen, ob das 0x04 oder irgendwas anderes ist. Schreibs 
als

   TIMSK = ( 1 << TOIE1 );

dann brauchst du dich nicht darum kümmern, was das jetzt für eine Zahl 
ist. Und lesbarer ist es auch.

von Alexander P. (tollerteppich)


Angehängte Dateien:

Lesenswert?

lol sorry ich wusste ja nicht das ihr nicht mit zahlen umgehen könnt :D

habs mal geändert ohne erfolg...

von Karl H. (kbuchegg)


Lesenswert?

Alexander P. schrieb:
> lol sorry ich wusste ja nicht das ihr nicht mit zahlen umgehen könnt :D

Es geht ja nicht um Zahlen :-)
Warts ab, bis du das erste mal darauf reinfällst, dass du Zahlen 
geschrieben hast und auf einem anderen Prozessor sitzt das bewusste Bit 
an einer anderen Position :-)
Mit deiner Zahl fällst du gewaltig auf die Schnauze.
Mit der Konstanten-Schreibweise erledigt der Compiler die Anpassung.

Ausserdem seh ich nicht ein, warum ich erst einmal das Datenblatt zum 
Register studieren soll, um zu wissen was du da eigentlich einschaltest.

> habs mal geändert ohne erfolg...

Werd dir erst mal klar drüber, was eigentlich wirklich am Port B hängt 
und an welchem Pin dort.

Initialisieren tust du das komplette Port B als Eingang.
In der ISR schaltest du wie wild die Pullup Widerstände ein/aus.
Laut Kommentar hängt aber eine LED drann.
In der Hauptschleife machst du Pin Abfragen auf PINB, wobei Kommentar
und Abfrage nicht zusammenpassen.


Ja, was denn nun? Werd dir erst mal klar, wie du den Port B benutzen 
willst.
(Und dann verstreu nicht die Initialisierung über 3 Funktionen. Das 
kannst du durchaus als Hinweis nehmen)

von Alexander P. (tollerteppich)


Lesenswert?

das mit den funktionen war so gegeben in dem code beispiel vom workpad

den tip mit den konstanten schreibweise werde ich jetzt mal 
verinnerlichen :D

klar kann ich das ändern mit dem initialiesieren von ports hab ich schon 
immer so meine probleme gehabt aber es funktionierte ohne die relais 
steuerung auch net.

aber ich gucke mir das nochmal an kein ding ^^

wie kann ich denn einzelne pins als eingang und ausgang zuweisen ?

kann man auch nen pull down einschalten ? brauche ich für die relais 
wegen dem mosfed da muss 1= 5V sen und 0=0V

gruß alex

von Karl H. (kbuchegg)


Lesenswert?

Alexander P. schrieb:

> wie kann ich denn einzelne pins als eingang und ausgang zuweisen ?

Tu dir selbst einen Gefallen und lies die Tutorials

AVR-Tutorial
AVR-GCC-Tutorial

von Rolf Magnus (Gast)


Lesenswert?

Alexander P. schrieb:
> kann man auch nen pull down einschalten ? brauche ich für die relais
> wegen dem mosfed da muss 1= 5V sen und 0=0V

Wenn du damit einen Mosfet ansteuern willst, solltest du den Pin 
eigentlich gar nicht als Eingang einstellen.

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.