Forum: Mikrocontroller und Digitale Elektronik ICP am ATMEGAx8, help me please, ich steh grad aufm Schlauch


von Hannes (Gast)


Lesenswert?

Hallo zusammen,

ich glaub bei mir hängt grad irgendwas.
Also der ICP ist ja ne feine Sache, schreibt mir den Zählerstand beim 
inputCaptueEvent in das dafür vorgesehene Register ICR1.
Nur wann genau ist diese Funktion akiv? Immer aktiv kann ja nicht sein, 
da man kann ja das ICR1-register auch als Counter-TOP auswählen kann, 
was zwangshalber über kurz oder lang mit Counter-TOP = 0 in 
Fehlfunktionen enden würde, da ja immer wieder das ICR1 register mit 
einem der Counterstände (der ja nur kleiner oder gleich ICR1 sein kann) 
überschrieben wird.
Also muss es ja irgendwo ein Bit geben, das den inputCapture 
daktiviert/aktiviert und genau dieses finde ich nicht?!


2. kleine Frage: kann ich den PinB0=ICP auslesen mit (PINB & (1<<PB0)) 
wenn der Pin als ICPin genutz wird?

vielen Dank und ein frohes Neujahr
Hannes

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hannes schrieb:

> Also muss es ja irgendwo ein Bit geben, das den inputCapture
> daktiviert/aktiviert und genau dieses finde ich nicht?!

TIMSK |= (1<<TICIE1);

Und an die entsprechende ISR denken
ISR(TIMER1_CAPT_vect)

Wenn die Events "lang" (> TCNT1 = 16-Bit) sein können, dann zusätzlich 
noch den Timer Overflow Interrupt benutzen.

In TCCR1B stellst du mit Bit ICES1 ein, welche Events am ICP-Pin zum 
Interrupt führen (fallende Flanke, steigende Flanke...)

> 2. kleine Frage: kann ich den PinB0=ICP auslesen mit (PINB & (1<<PB0))
> wenn der Pin als ICPin genutz wird?

Ausprobiert habe ich das nicht, denke aber das ist möglich.

von Leo B. (Gast)


Lesenswert?

Stefan B. schrieb:
> TIMSK |= (1<<TICIE1);

Damit aktiviere ich den interrupt, oder wird nur bei aktiviertem 
Interrupt auch das TCNT1-Register in ICR1 geladen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Leo B. schrieb:

> Damit aktiviere ich den interrupt,

Ja. Und als eine der ersten Aktionen im Interrupt liest man dann ICR1 
aus und/oder schaltet die zu detektierende Flanke um.

> oder wird nur bei aktiviertem
> Interrupt auch das TCNT1-Register in ICR1 geladen?

Nein. ICR1 wird automatisch mit dem TCNT1 Wert (Zeitstempel) des 
Ereignisse gefüllt ABER beim nächsten Ereignis überschrieben (daher 
"...eine der ersten Aktionen..."). Wenn du den ICP-Pin als Ausgabe-Pin 
benutzt, werden u.U. ebenfalls ICP-Ereignisse produziert.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Vielleicht kämpfst du mit der Doppelfunktion des ICR1 Registers.

Im Input Capture Modus liest man das Register ICR1.

In einigen der Waveform Generation Modi schreibt man ICR1 und definiert 
darüber die Wellenform.

Meiner Meinung nach - nicht ausprobiert - kann man nicht beide 
Funktionen zusammen nutzen. Nur entweder oder.

von Vuvuzelatus (Gast)


Lesenswert?

Datenblatt --> 16 bit Timer/Counter1
               --> Input Capture Unit
                   --> Input Capture Pin Source

Der dortige Satz, der die gesuchte Info enthält, ist:

"Note that the input of the noise canceler and edge detector is always 
enabled unless the Timer/Counter is set in a Waveform Generation mode 
that uses ICR1 to define TOP."

Auf deutsch: Das Input-Capture-Dingens ist immer eingeschaltet, außer in 
den WG-Betriebsarten, in denen der TOP-Wert im Register ICR1 erwartet 
wird.

von Hannes (Gast)


Lesenswert?

Schon fies diese verteckten Sätze... das ich sowas immer und immer 
wieder überlese. Grauenvoll!

Aber dann ists klar... also das "input-capturing" ist quasi immer an. 
Dann suche ich also auch vergebens das aktivierende bit...

Danke an ALLE!
lg Hannes

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.