Forum: Mikrocontroller und Digitale Elektronik ATtiny1614 (avr-1) TCD0 capture Input geht nicht


von Thomas L. (thomasnrw)


Lesenswert?

Hallo zusammen,

ich verzweifel so langsam und bin jetzt am Ende mit meinem Latein.

Was habe ich vor, zur Drehzahlermittlung würde ich gerne die 
Impulsabstände capturen. Hierzu war ich der Meinung Timer TCD verwenden 
zu können da TCA/B bereits anderweitig benutzt sind.
Nun ja, habe über das Eventsystem (EvSys) PA2 auf TCD_EV0 gekoppelt, 
bekomme auch mit jeder Flanke einen Trigger IRQ. Das CaptureA Register 
was mE dann die Zeitdifferenz beinhalten sollte ist aber IMMER 0.
Zudem kommt auch permanent (6uS) der Overflow IRQ wenn ich diesen 
freigebe.

// EvSys ASYNC-Channel0 PA2 Input auf TCD_EV0 Eingang koppeln
EVSYS.ASYNCCH0   = EVSYS_ASYNCCH0_PORTA_PIN2_gc; // Event from Pin PA2
EVSYS.ASYNCUSER6 = EVSYS_ASYNCUSER6_ASYNCCH0_gc; // TCD_EV0

Dann TCD initialisiert:
alternatic auch probiert
//TCD0.CTRLE = TCD_SYNC_bm;
//TCD0.CTRLE = TCD_SYNCEOC_bm;

// Capture Start bei steigender Flanke
TCD0.EVCTRLA = ( TCD_CFG_FILTER_gc | TCD_EDGE_RISE_HIGH_gc | 
TCD_ACTION_CAPTURE_gc | TCD_TRIGEI_bm );

TCD0.INTCTRL = ( TCD_TRIGA_bm ); // Trigger IRQ enable

TCD0.INPUTCTRLA = TCD_INPUTMODE_EDGETRIG_gc;
TCD0.DLYCTRL = ( TCD_DLYPRESC_DIV2_gc | TCD_DLYSEL_EVENT_gc );

while( (TCD0.STATUS & TCD_ENRDY_bm) == 0 ) {}
TCD0.CTRLA = ( TCD_CLKSEL_SYSCLK_gc | TCD_CNTPRES_DIV32_gc | 
TCD_ENABLE_bm );


IRQ Routine:
static volatile Cnt;
ISR( TCD0_TRIG_vect )
{
MP1_TOGGLE; / Testport für Oscar
Cnt  = TCD0.CAPTUREAL+1;
Cnt |= (TCD0.CAPTUREAH<<8);
TCD0.INTFLAGS = TCD_TRIGA_bm;
}



Hat wer einen Tipp was ich falsch mache ?
Würde mich sehr freuen.
Viele Grüße
Thomas

: Bearbeitet durch User
von Thomas L. (thomasnrw)


Lesenswert?

Schade, niemand einen Tipp ?

Habe natürlich noch ein paar Stunden investiert, leider ohne es zum 
Laufen zu bekommen.
Allerdings scheint mein Problem zu sein das der Timer erst gar nicht 
anläuft.
Direkt nach Initialisierung und enable mal in einer Dauerschleife das 
CaptureA Register ausgelesen, das ist immer 0. Auch ein zyklischer 
Softcapture mit:
TCD0.CTRLE = TCD_SCAPTUREA_bm;
bringt keinen Unterschied.

Hat wirklich keiner eine Idee ?
vg, Thomas

: Bearbeitet durch User
von Koblenz (Gast)


Lesenswert?

> Hat wer einen Tipp was ich falsch mache ?

Keine Ahnung. Ich simuliere solche Fälle mit dem Atmel Studio.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Thomas L. schrieb:
> Allerdings scheint mein Problem zu sein das der Timer erst gar nicht
> anläuft.

... dein problem ist rumlabern ohne was zu sagen.

wo wird der tmr initialisiert bzgl. clock source, äh? see data sheet 
page 227!

vielleicht mal die source vollständig hochladen, oder denkst du raten 
und copy&past, oder post-faktisch führt zur selbstwirksamkeit? bäh!


mt

von Gildo (Gast)


Lesenswert?

Apollo M. schrieb:

>
> ... dein problem ist rumlabern ohne was zu sagen.
>
> wo wird der tmr initialisiert bzgl. clock source, äh? see data sheet
> page 227!
>
> vielleicht mal die source vollständig hochladen, oder denkst du raten
> und copy&past, oder post-faktisch führt zur selbstwirksamkeit? bäh!

Warum haben dir Eltern & Lehrer nichts über die deutsche Rechtschreibung 
beigebracht? Findelkind? Kasper Hauser?

von thomasnrw (Gast)


Lesenswert?

Apollo M. schrieb:
> ... dein problem ist rumlabern ohne was zu sagen.
>
> wo wird der tmr initialisiert bzgl. clock source, äh? see data sheet
> page 227!
>
> vielleicht mal die source vollständig hochladen, oder denkst du raten
> und copy&past, oder post-faktisch führt zur selbstwirksamkeit? bäh!


Na sage mal, was ist denn mit Dir los ? bist Du der hiesige Haustroll ? 
unglaublich Dein Beitrag...

rumlabern ? wieso das ?

Timer init siehst Du in dem Code im Startbeitrag den ich beigefügt habe. 
Natürlich ist Deine Seitenangabe Angabe zum Datasheed völliger Blödsinn, 
überrascht mich aber auch nicht, passt gut zu Deinem Auftreten hier.

Was willst Du mit vollständigem Code ? das sind 10K im Compilat, denke 
nicht das dass zielführend ist.


Habe eine Frage zu einem Problem was ICH habe formuliert und den Code 
dazu auf das mE relevante beschränkt damit es übersichtlich bleibt. Das 
ich darauf eine so dämliche Antwort erhalte, damit habe ich nicht im 
Traum gerechnet. Hoffe nicht das dieses Niveau die Normalität in diesem 
Forum darstellt und Du wirklich nur ein Ausnahme Provokant bist.
Umgangsformen scheinst Du jedenfalls nie gelernt zu haben.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

thomasnrw schrieb:
> rumlabern ? wieso das ?
>
> Timer init siehst Du in dem Code im Startbeitrag den ich beigefügt habe.

... und wieder nur rumgelaber, schwachmate!

zu behindert um data sheet chapter 22.5.1 zu lesen?
tmr source clock?!
eine initialisierung die unvollständig ist ändert sich nicht von allein.


mt

von Thomas L. (thomasnrw)


Lesenswert?

das ist Dir wohl völlig egal, hauptsache beleidigen und rumtrollen ...

Thomas L. schrieb:
> while( (TCD0.STATUS & TCD_ENRDY_bm) == 0 ) {}
> TCD0.CTRLA = ( TCD_CLKSEL_SYSCLK_gc | TCD_CNTPRES_DIV32_gc |
> TCD_ENABLE_bm );

Du bist echt so geil :):)
Besonders gut gefällt mir das Du scheinbar NULL Ahnung von der Materie 
hast aber hier einen auf dicke Hose machst

: Bearbeitet durch User
von Thomas L. (thomasnrw)


Lesenswert?

@mt alias MajorTroll

jetzt biste sprachlos, völlig unnötige Mopperei Deinerseits, hat der 
Schwachmate doch die von Dir angemahnte Init des Timers gemacht und auch 
sogar im Eingangspost beschrieben.
Wenn Du nen Arsch in der Hose hättest wäre jetzt wohl eine 
Entschuldigung angebracht :)



Hilft mir aber alles nicht weiter, das eigentliche Problem besteht nach 
wie vor :(

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Thomas L. schrieb:
> Wenn Du nen Arsch in der Hose hättest wäre jetzt wohl eine
> Entschuldigung angebracht :)

Entschuldigung!


mt

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Thomas L. schrieb:
> TCD0.INPUTCTRLA = TCD_INPUTMODE_EDGETRIG_gc;
> TCD0.DLYCTRL = ( TCD_DLYPRESC_DIV2_gc | TCD_DLYSEL_EVENT_gc );

... ich kann das beschiebene problem erstmal bestätigen.
der simulator unter avs7 macht denke ich, mehr als einen fehler und 
hilft hier nicht weiter.

schon der tmr-d overflow interrupt ist vom timing falsch und lässt sicht 
auch nicht sinnvoll verändern.
daher baue ich jetzt mal die hw mit atmel ice auf und dann gehts weiter.

in der init sind fehler, aber das ändert nichts am beschriebenen 
problem.

beispiel:
TCD0.INPUTCTRLA = TCD_INPUTMODE_EDGETRIG_gc;
TCD0.DLYCTRL = ( TCD_DLYPRESC_DIV2_gc | TCD_DLYSEL_EVENT_gc );

kann ersatzlos gestrichen werden, da hierüber der zusammenhang progr. 
wird , wie der tmr-d ausgang sich verhalten soll bezogen auf den 
eingang.

while( (TCD0.STATUS & TCD_ENRDY_bm) == 0 ) {} eher so
while( (TCD0.STATUS & TCD_ENRDY_bm) == 0 ) {};

sonst steht die anweisung danach in der while loop, oder besser

while (!(TCD0.STATUS & TCD_ENRDY_bm));
while (!(TCD0.STATUS & TCD_ENRDY_bm)) {};
while (!(TCD0.STATUS & TCD_ENRDY_bm)) continue;


mt

: Bearbeitet durch User
von Thomas L. (thomasnrw)


Lesenswert?

jetzt bin ich baff :) aber auch freudig überrascht!
Respekt, damit hätte ich nicht gerechnet, es geht also auch anständig.


Mit dem Hinweis der beiden "überflüssigen" Einstellungen hast Du Recht, 
ich habe soviel "experimentiert" ...

Overflow IRQ kommt bei mir auch unmittelbar und wiederkehrend sobald ich 
diesen enable, alle 6.5uS (SysClk 20MHz)


Danke

: Bearbeitet durch User
von Thomas L. (thomasnrw)


Lesenswert?

Apollo M. schrieb:
> daher baue ich jetzt mal die hw mit atmel ice auf und dann gehts weiter.

kann ich hoffen das dazu noch eine Erleuchtung für mich kommt ?
Stehe jetzt so langsam vor der Entscheidung das anstelle mit TCD anders 
zu realisieren. Eine "ordentliche" Lösung mit TCD wäre mir allerdings 
lieber.

Viele Grüße
Thomas

von Robert (Gast)


Lesenswert?

Schau mal bei:
https://www.avrfreaks.net/forum/capture-tcd0-attiny
da hat jemand den Caputre-Compare mit TCD zum laufen gebracht, und damit 
hats auch bei mir geklappt.

Gruß

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.