Forum: Mikrocontroller und Digitale Elektronik Berechnung von ICR1


von ATmega8 programm (Gast)


Lesenswert?

Hallo,
hab keine Ahnung von dem Programm.
Welchen Wert bekomme ich wenn ICR1=0x08FF ist?
Mit Wert meinte ich Schrittweite.
Danka im voraus.

von Krapao (Gast)


Lesenswert?

Zur Berechnung der Schrittweite braucht man eine Angabe, in welchem 
Modus der Timer1 betrieben wird. Dann kann man die Schrittweite in 
Takten ausrechnen. Wenn man zusätzlich die Taktrate kennt, kann man die 
Schrittweite in (Milli-, Mikro-) Sekunden ausrechnen. Ohne die 
Zusatzangaben kann man nix ausrechnen.

von Karl H. (kbuchegg)


Lesenswert?

ATmega8 programm schrieb:
> Hallo,
> hab keine Ahnung von dem Programm.

Von welchem Programm

> Welchen Wert bekomme ich wenn ICR1=0x08FF ist?

Dann steht in ICR1 der Wert 0x08FF. Dezimal ist das 2303.

> Mit Wert meinte ich Schrittweite.
> Danka im voraus.

Gut, dass du der einzige bist, der ein Programm geschrieben hat oder 
analysiert. So wissen alle sofort, wovon du eigentlich redest.

von Achim M. (minifloat)


Lesenswert?

Hallo.
Ich habe keine Ahnung von meinem Auto.
Wie weit komme ich, wenn ich in den Tank hab ich 23,17L Benzin rein 
gefüllt habe?
Mit weit meinte ich die Kilometerzahl.

sorry, could not resist to say that...

Zeig mal dein Programm her! Dann sehen wir mal weiter. Welchen Prozessor 
benutzt du?

mfg mf

von wird wohl ein ATmega8 sein (Gast)


Lesenswert?

Mini Float schrieb:
> Welchen Prozessor
> benutzt du?

ATmega8 programm schrieb:

von Bernd (Gast)


Lesenswert?

Dazu hab ich auch eine Frage:

wenn ich:
ICR1 = 0xAFC8 (Dezimal 45000)
setzte, zählt der Timer nur bis 45000 und hört dann auf, oder zählt er 
auch weiter? Das ICR1-Register ist mir nach wie vor ein Rätsel, obwohl 
ich einige Beiträhe dazu gelesen habe.
Kann mir jmd genau sagen, wann man ihn braucht (nur für PWM oder 
allgemein für Timer zum zählen) ohne mir gleich an den Kopf zu werfen, 
es selber heraus zu finden. Danke

von Peter D. (peda)


Lesenswert?

ICR1 hat je nach Timermodus unterschiedliche Funktionen, siehe Tabelle 
im Datenblatt.

Ältere Timer-ICs hatten teilweise noch einen One-Shot-Modus.
Der AVR aber nicht. Du mußt also den Timer per Befehl abschalten, wenn 
Du es willst.
Vermeidet man aber, wenn möglich, da dadurch die Genauigkeit schlechter 
wird (Befehle kosten zusätzliche Zeit, die die Messung verfälscht).
Die gebräuchliche Methode sind daher durchlaufende Timer.

Ein Anhalten ist auch garnicht nötig, da man zusätzliche 
Compareinterrupts hat. Damit kann man dann Zeitdifferenzen präzise 
erzeugen.


Peter

von Karl H. (kbuchegg)


Lesenswert?

Und nochwas (weil man es immer wieder sieht)

ICR1 = 0xAFC8 (Dezimal 45000)

wenn du dir daneben sowieso 45000 dazuschreibst, weil diese Zahl als 
Dezimalzahl für dich eine bestimmte Bedeutung hat, die sich dir als 
Dezimalzahl erschliesst als Hexadezimalzahl aber nicht, dann schreib es 
halt um Gottes Willen gleich als Dezimalzahl in die Anweisung!

  ICR1 = 45000;
ist perfekt.

Ob du eine Zahl als Dezimalzahl, als Hexadezimalzahl als Binärzahl oder 
sonst irgendwie anders schreibst (zb als ASCII Code) ist eine Frage 
dessen, was im gegebenen Zusammenhang für dich als Programmierer das 
Klarste ist! Für den Compile bzw. für den µC ist das einfach nur eine 
Zahl, egal mit welcher Notation du sie schreibst. Du wählst die Notation 
(Dezimal, Hex, Binär) danach aus, was deiner Ansicht nach an dieser 
Codestelle die Absicht am besten rüberbringt.

   if( Sekunden == 60)
das versteht jeder sofort, worum es da geht. Denn jeder weiß, dass 60 
Sekunden genau 1 Minute sind.

Bei
  if( Sekunden == 0x3C)
werden wohl die meisten erst mal überlegen bzw. zum Taschenrechner 
greifen müssen um zu erkennen, dass 0x3C einfach nur die hexadezimale 
Schreibweise für 60 ist. D.h. du verlangst hier von deinem Leser einen 
zusätzlichen, völlig unnötigen Schritt, den er machen muss um die 
Absicht an dieser Stelle zu verstehen.
Die Schreibweise als Dezimalzahl ist an dieser Stelle daher die bei 
weitem natürlichere Schreibweise und wird daher bevorzugt.

Wenn du eine Zahl dadurch 'erklären' musst, indem du sie im Kommentar in 
einer anderen Schreibweise (andere Basis) hinschreibst, dann spar dir 
das und schreib sie halt gleich in der richtigen Basis.


Irgendwie scheint da die Meinung zu existieren, man können Zuweisungen 
an Register nur in Form von Hexadezimalzahelen machen. Registern werden 
Binärmuster zugewiesen! Diese Muster können durch Zahlen ausgedrückt 
werden. Und diese Zahlen kann man wiederrum in unterschiedlichen 
Notationen schreiben. Hex-, Dez-, Binär sind einfach nur verschiedene 
Schreibweisen. Nicht mehr! Da steckt sonst nichts dahinter.

von Bernd (Gast)


Lesenswert?

> Wenn du eine Zahl dadurch 'erklären' musst, indem du sie im Kommentar in
> einer anderen Schreibweise (andere Basis) hinschreibst, dann spar dir
> das und schreib sie halt gleich in der richtigen Basis.

Und du schreibst jetzt so eine lange Antwort, nur zu erklären, was ich 
schon lange weiß? Wieso machst du dir überhaupt so eine Mühe? Denn die 
ganze schei** hättest du dir sparen können, beantwortet tut es meine 
Frage ja nicht!
Mal ganz ehrlich, wenn der Sinn einer solchen Community besteht Leute 
gleich eins rein zu drücken, dann haben sie mit dir den richtigen 
gefunden, was??

von Karl H. (kbuchegg)


Lesenswert?

Bernd schrieb:
>> Wenn du eine Zahl dadurch 'erklären' musst, indem du sie im Kommentar in
>> einer anderen Schreibweise (andere Basis) hinschreibst, dann spar dir
>> das und schreib sie halt gleich in der richtigen Basis.
>
> Und du schreibst jetzt so eine lange Antwort, nur zu erklären, was ich
> schon lange weiß?


Warum schreibst du dann sowas?

ICR1 = 0xAFC8 (Dezimal 45000)

> Wieso machst du dir überhaupt so eine Mühe?

Weil ich denke, dass du einen Scheiss weißt.

> beantwortet tut es meine Frage ja nicht!
Deine Frage war schon längst beantwortet.

von spess53 (Gast)


Lesenswert?

Hi

>Und du schreibst jetzt so eine lange Antwort, nur zu erklären, was ich
>schon lange weiß?

Dein Code lässt das nicht vermuten.

>Mal ganz ehrlich, wenn der Sinn einer solchen Community besteht Leute
>gleich eins rein zu drücken, dann haben sie mit dir den richtigen
>gefunden, was??

Schlechten Tag gehabt?

Bei AVRs kann das ICRn-Register

1. Bei einem Pegelwechsel an ICPn den Zählerstand des Timers speichern. 
Gleichzeitig kann ein Interrupt ausgelöst werden.

und

2. als Topwert des Timers bei CTC und PWM fungieren. Damit bestimmt ICRn 
die Auflösung und Freqenz.

MfG Spess

von Bernd (Gast)


Lesenswert?

> Weil ich denke, dass du einen Scheiss weißt.
>
>> beantwortet tut es meine Frage ja nicht!
> Deine Frage war schon längst beantwortet.

An der Stelle Danke Herr Klugscheißer

von Bernd (Gast)


Lesenswert?

>
> Schlechten Tag gehabt?

Wie kommst du darauf? Mich stört es, wenn sich Leute meinen aufspielen 
zu müssen, mehr nicht.

von Bernd (Gast)


Lesenswert?

Bei AVRs kann das ICRn-Register
>
> 1. Bei einem Pegelwechsel an ICPn den Zählerstand des Timers speichern.
> Gleichzeitig kann ein Interrupt ausgelöst werden.
>
> und
>
> 2. als Topwert des Timers bei CTC und PWM fungieren. Damit bestimmt ICRn
> die Auflösung und Freqenz.
>
> MfG Spess

Ah, und danke für die Antwort.

von spess53 (Gast)


Lesenswert?

Hi

>Wie kommst du darauf? Mich stört es, wenn sich Leute meinen aufspielen
>zu müssen, mehr nicht.

Hat Karl-Heinz weder gemacht noch hat er es nötig.

MfG Spess

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.