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
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
> Hat wer einen Tipp was ich falsch mache ?
Keine Ahnung. Ich simuliere solche Fälle mit dem Atmel Studio.
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
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?
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.
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
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
@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 :(
Thomas L. schrieb: > Wenn Du nen Arsch in der Hose hättest wäre jetzt wohl eine > Entschuldigung angebracht :) Entschuldigung! mt
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.