Hallo in die Runde, ich habe es mal vor ein paar Jahren geschafft, mit Bascom + Mega8 mir einen SPI-Sniffer zu basteln. (sogar nur mit dem internen Oszillator ;-) Da das aber schon so lange her ist und ich fast wieder als DAU da stehe, habe ich ein paar Grundsatzfragen.... Ich wollte mit einem ATTiny13 im Prinzip ein Fahrradtacho-Signal in der Geschwindigkeit reduzieren. (nicht einfach teilen) 28 Zoll Tacho <--> 20 Zoll Reifen Verhältnis Takt bzw. Time IN:OUT 10:7 Hier die Eckdaten: (grobe Werte, können später noch abweichen) Puls-Pause Verhältnis --> 200:1 (Reedkontakt mit 1x Magnet) Frequenz min max Input 0,5 10 Hz Output 0,35 7 Hz Zeiten Puls 100 2000 ms Pause 0,5 10 ms Da der ATTiny13 nur einen Timer hat, kann ich Hardware PWM vergessen. Ich dachte mir, den Timer mit <1ms laufen zu lassen und über einen externen Interrupt (steigende Flanke) einen Zähler(IN) zu starten, der die Timer-Überläufe mit zählt. Beim nächsten Interrupt (fallende Flanke) wird der Zähler gestoppt und der Wert zur weiteren Verarbeitung zwischengespeichert. Jetzt mit dem nächsten Interrupt (steigende Flanke) wieder Zähler(IN) bei Null starten. So dachte ich mir die Erfassung vom Eingangssignal. Ausgangssignal läuft mit einem anderen Zähler(OUT) über den gleichen Timer. Max.Wert für den Zähler(OUT) wäre der wischengespeicherte Wert+43% für die Pulslänge. Pulspause 0,5% der vorher durchlaufenden Pulslänge. Max.Wert für den Zähler wird bei jeden Puls neu eingelesen. Jetzt meine Fragen dazu: Lässt sich das so in Bascom realisieren? Geht das evtl. anders einfacher bzw. macht das so Sinn? Kann ich innerhalb des Programmlaufs überhaupt das Interrupt-Register für steigende- / fallende Flanke umschalten? Ich hoffe auf die eine oder andere Antwort oder einen Link, falls es das so schon geben sollte....DANKE Gruß Jens
:
Bearbeitet durch User
Also bei 10 Hz schläft der AVR ja ein.... Einfach dem Timer laufen lassen und im Interrupt die Flanke lesen und evtl. den Ausgang umschalten....
Joe F. schrieb: > und den tacho kann man nicht einfach auf 20" einstellen? Das wäre ein doofer Tacho bei dem das nicht geht .....
Max D. schrieb: > Also bei 10 Hz schläft der AVR ja ein.... > Einfach dem Timer laufen lassen und im Interrupt die Flanke lesen und > evtl. den Ausgang umschalten.... Wie jetzt, ohne externen Interrupt und den Eingang pollen? @ Joe F. ich wollte es erst schreiben....aber JA, Tacho lässt sich NICHT umstellen (daher --> im Prinzip). Gruß Jens
Jens T. schrieb: > Fahrradtacho-Signal in der Geschwindigkeit reduzieren. > 28 Zoll Tacho <--> 20 Zoll Reifen > Verhältnis Takt bzw. Time IN:OUT 10:7 Jens Tester schrieb: > aber JA, Tacho lässt sich NICHT > umstellen (daher --> im Prinzip). Teile und doch bitte die Marke von diesem Tacho mit damit hier keiner auf die Idee kommt sich so ein Müll zukaufen. Seit wann gibt so ein Schrott denn ? Schon die ersten E-Tachos waren Flexibel zu Justieren. Oder willst du dich vielleicht doch noch um entscheiden? Deine Angaben + Tiny13 Wunsch hört sich nämlich eher nach eBike Turing Chip an....
Marc D. schrieb: > Deine Angaben + Tiny13 Wunsch hört sich nämlich eher > nach eBike Turing Chip an.... Fast richtig, Antrieb soll in einem Liegerad verwendet werden und eine Anpassung auf 20" ist bei verschiedenen Antrieben nicht so ohne weiteres zu machen. "eBike Tuning" wollte ich (eigentlich) nicht schreiben, ist damit zwar möglich aber nicht MEIN Ziel! (auch wenn, ändert ja nichts an meinem Problem ;-) Gruß Jens
Jens Tester schrieb: > Fast richtig, Antrieb soll in einem Liegerad verwendet werden und eine > Anpassung auf 20" ist bei verschiedenen Antrieben nicht so ohne weiteres > zu machen. Was? Ein Tacho, der vom Antrieb abhängt? Was ist das denn für ein Schrott? Ein Tacho sollte nur vom Rad abhängig sein, an dem er hängt und den Radumfang oder Raddurchmesser sollte man vorgeben können.
Jens T. schrieb: > Ich wollte mit einem ATTiny13 im Prinzip ein Fahrradtacho-Signal in der > Geschwindigkeit reduzieren. Jens Tester schrieb: > @ Joe F. > > ich wollte es erst schreiben....aber JA, Tacho lässt sich NICHT > umstellen (daher --> im Prinzip). Jens Tester schrieb: > Fast richtig, Antrieb soll in einem Liegerad verwendet werden und eine > Anpassung auf 20" ist bei verschiedenen Antrieben nicht so ohne weiteres > zu machen. > > "eBike Tuning" wollte ich (eigentlich) nicht schreiben, ist damit zwar > möglich aber nicht MEIN Ziel! > (auch wenn, ändert ja nichts an meinem Problem ;-) Was denn nun? Es macht echt keinen Spaß hier heiteres "um was geht es denn eigentlich" zu veranstalten. Einen Fahrradtacho könnte man durch einfaches Weglassen von Pulsen "überlisten". Aber es handelt sich ja offenbar nicht um einen Fahrradtacho. Trotzdem gibt es die Chance, dass auch dein Gerät durch einfaches Weglassen von Pulsen zufriedenstellend arbeitet. Dies könnte man komplett ohne Mikrocontroller, durch einen einfachen Decade-Counter und einem Transistor realisieren. Wo liegt denn dein Problem, einfach zu sagen, ich möchte an meinem E-Bike Antrieb Marke Soundso Modell Soundso, mit dem ich eh nur auf Privatgeländen unterwegs bin, rumbasteln. Mit diesen Informationen wäre dir leichter zu helfen.
:
Bearbeitet durch User
> Wo liegt denn dein Problem, einfach zu sagen,
Vielliecht ist er Hersteller des Fahrzeuges und braucht nun einen
Workaround für ein verbocktes Konzept.
Also mit 10 Hz und einem 1:200 Verhältnis hat man etwa 0,5 ms schmale pulse. Tastet man das mit 5 kHz ab ist man auf der sicheren Seite. Also timer so einstellen, dass er mit 5 kHz feuert. Dann über einen gewissen Zeitraum Flanken zählen und im nächsten Zeitsegment die reduzierte Frequenz abgeben.
@Joe F.
ich hätte auch schreiben können:
Ich habe einen Bosch Classic Pedelec Antrieb aus einem 28" Rad in einem
20" Liegerad eingebaut.
Antrieb funktioniert und unterstützt lt. Tacho bis 25km/h.
Lt. GPS-Tacho fahre ich aber nur 18km/h.
Was kann ich jetzt machen ???
>Mit diesen Informationen wäre dir leichter zu helfen.
Da ich einen aus meiner Sicht passenden Lösungsansatz habe, hatte ich
die dafür relevanten Eckdaten genannt !!!
Gruß
Jens
Dadurch, dass man immer weniger sendet als empfängt könnte man sogar das ganze noch weiter eindampfen: Solange kein Puls kam sendet man auch nichts. Wenn man jetzt zwei Pulse hatte so bestimmt man die Zeit dazwischen (in Timerticks zählen, spart umrechnung) und gibt dann den ersten Puls auf den Ausgang und nach 0,7 * Zeit (evtl. mit fixedpoint-arithmetik optimieren) den nächsten. Dann gibt es zwei Möglichkeiten; Es gab in der Zwischenzeit noch einen Puls -> gut, man stellt die Zeit als neue Pause ein oder es gab keinen -> man wartet bis einer kommt (und noch etwas länger, man will ja längere Pausen). Wenn der "Empfänger" dumm ist, dann kann die aktive Zeit in einem Puls immer gleichlang lassen und nur die Pausen anpassen, ansonsten muss man halt noch die Pausen mit strecken...
Max D. schrieb: > ....gibt dann den ersten Puls auf den Ausgang und nach 0,7 * Zeit.....den >nächsten. Du meinst vermutlich 1,43 * Zeit ? Ob das so leichter zu programmieren wäre? >Wenn der "Empfänger" dumm ist, dann kann die aktive Zeit in einem Puls >immer gleichlang lassen und nur die Pausen anpassen,.... So etwas ähnliches hatte ich mir auch schon überlegt, aber wenn ich schon die Pulslänge richtig hin bekomme, sollte eine angepasste Pausenzeit auch noch mit drin sein ;-) Gruß Jens
Max D. schrieb: > Solange kein Puls kam sendet man auch nichts. Und spätestens hier wird's untrivial. Ab wann 'steht' das fahrrad, und rollt nicht mehr sehr langsam?
Jens T. schrieb: > So etwas ähnliches hatte ich mir auch schon überlegt, aber wenn ich > schon die Pulslänge richtig hin bekomme, sollte eine angepasste > Pausenzeit auch noch mit drin sein ;-) Hast du es denn schon ausprobiert? Ich würde fast darauf wetten, dass die Empfänger sich um die Pulszeit einen feuchten Kehrricht scheren. Die zählen einfach Pulse pro Zeiteinheit bzw. sie messen die Zeit zwischen 2 Pulsen, wobei da sehr wahrscheinlich noch eine Mittelwertbildung drinnen sein wird, die Ausreisser (falls aus irgendeinem Grund mal ein Puls fehlen sollte) nicht gleich ins Desaster führen. Aber mehr würde ich da als Arbeitshypothese nicht erwarten. D.h. unter Umständen reicht es völlig aus, wenn du per Polling die Pulse erkennst, und dann einfach für 10 erkannte Pulse nur 7 weitergibst. Du lässt einfach zb jeden 3., 6. und 10. Puls unter den Tisch fallen. Sowas ist schnell programmiert und ausgetestet. Wenn es nicht funktioniert, dann kann man immer noch etwas aufwändigeres machen. Aber erst mal den simplen Ansatz.
:
Bearbeitet durch User
ich würde ja einfach 7 magnete an das rad montieren (ca. alle 51.4 grad) und dieses signal mit einem decade counter durch 10 teilen ;-) dahinter monoflop - wenn nötig.
:
Bearbeitet durch User
Joe F. schrieb: > Und spätestens hier wird's untrivial. Ab wann 'steht' das fahrrad, und > rollt nicht mehr sehr langsam? Das ist egal. Hier geht es nur um "das erste mal" nachdem der Strom dran kam. Das Ausrollen übernimmt der Teil mit dem "auf den nächsten Puls warten"...
@Joe F. >Ab wann 'steht' das fahrrad, und rollt nicht mehr sehr langsam? Unter 4km/h --> über 2s Pulslänge würde ich einfach kein Signal mehr aus geben. @Karl Heinz >Hast du es denn schon ausprobiert? Nee, leider noch nicht....aber gute Idee, zum testen einfach jeden 3ten Puls unterdrücken und schauen, was passiert. Das sollte ich die nächsten 1-2Wochen :-( hin bekommen..... Gruß Jens
Jens T. schrieb: > zum testen einfach jeden 3ten > Puls unterdrücken und schauen, was passiert. Ja, und wenn das funktioniert, dann in Alternativen denken. 3 von 10 Pulsen unterdrücken geht ebenfalls sehr einfach mit einem Decade Counter + 3 Dioden + Transistor (falls dir die 7 Magnete nicht gefallen, die das Ausgangssignal sehr gleichmäßig machen würden...).
:
Bearbeitet durch User
Hallo, ich hab heute vor der Arbeit mal kurz mit einem Magneten "per Hand" testen können: links - l rechts - r pause - # l-r-l-r-l-r-l-r-l-r- --> 15-16km/h l-r-l-#-r-l-r-#-l-r-l-#-r-l-r- --> 10-13km/h Werte zwischen 10-13km/h waren mehrmals für ca. 1-2s zu sehen und sprangen sonst zwischen 6 - 58km/h. --> größere Schwankungen in der Pausenlänge werden anscheinend toleriert :-) Daraus ergibt sich noch eine Möglichkeit: Pulslänge aus der Wechselspannung von Nabendynamo ableiten 1. Zeit einer Halbwelle ermitteln und daraus Pulslänge errechnen 2. Puls ausgeben 3. nach Pulsende auf neue Halbwelle warten und mit 1. weiter Vorteil: (für mich) leichter zu programmieren kein Reedkontakt/Magnet mehr nötig Nachteil: die Pulspause schwankt mit +- 1/2 der Periodendauer vom Dynamo (vermutlich Egal) weiteres Kabel zum Dynamo Schaltungsaufwand für ein passendes Signal zum AVR evtl. Masse-/ Potentialprobleme Gruß Jens
Hallo nur so mal als Idee wie verhält sich der Regler wenn du z.B. abwechselnd jeden 4. und 3. Impuls einfach auslässt? Sven
@Sven, per Hand getestet scheint es zu funktionieren :-) (siehe weiter oben) Guter Hinweis, so einfach "krumme" Teilungsverhältnisse erzeugen zu können. Wenn ich mein altes SDK500 Board zum laufen bekommen sollte, kommt das mit auf meine ToDo-Liste. Gruß Jens
Hallo, als Dateianhang hier mein erster Versuch, ein Eingangssignal halbwegs unverändert einzulesen und wieder auszugeben. Auf einem STK500-Board getestet, hat das blinken einer LED am Ausgang nicht wirklich viel mit den Schaltvorgängen an einen Taster zu tun. (ohne Entprellung) :-(( Heute ist schon etwas spät, ich schreibe morgen, wie ich mir das mit dem Programmablauf gedacht hatte. Gruß Jens
Hallo, ich habe noch mal über den Code nachgedacht...ich werde den Code noch mal anpassen und nur auf steigende Flanke auswerten. Dann dürfte es vermutlich auch keine Probleme mit prellendem Taster geben. Ich melde mich dann nochmal. Gruß Jens
Hab dasselbe gaubt um vom Ford Tachogeber auf Opel Senator digitaltacho zu kommen, auch mitm 2313. Den Int/Timer für das Messen der Periodendauer verwendet, und in der Hauptschleife den Ausgang mit "waitms x" gesetzt, wobei X nen Wert ist der aus Periodendauer mal Faktor besteht. Ca 10 Bascomzeilen, läuft 1A.
DJShadowman schrieb: > waitms x" gesetzt, wobei X nen Wert ist > der aus Periodendauer mal Faktor besteht. Vergleiche mal die Codegröße von:
1 | _delay_ms(20); |
zu
1 | volatile uint8_t Delaytime = 20; |
2 | _delay_ms(Delaytime); |
Hallo, DJShadowman schrieb: > ....in der Hauptschleife den Ausgang mit "waitms x" gesetzt.... Ist hier für mich nicht brauchbar da "wait" die Interrupts blockiert!!! Nach Umstellung auf steigende Flanke funktioniert es jetzt wie erwartet. --> geänderter Code im Anhang Ein paar Änderungen sind noch nötig, bis ich das im Pedelec testen kann. Soweit der aktuelle Stand..... Ich melde mich, wenn es wieder was neues gibt. Gruß Jens
:
Bearbeitet durch User
Hallo, ich musste den Code noch etwas anpassen und das Prellen vom Reedkontakt abfangen. Jetzt funktioniert es wie vorgesehen, Danke an die eine oder andere Anregung. Falls es jemand interessiert, die Zeit der Pulspause (Low-Signal) braucht nicht variabel sein, ich habe sie auf ca. 10ms fest eingestellt. Gruß Jens
Jens T. schrieb: > Hallo, > > DJShadowman schrieb: >> ....in der Hauptschleife den Ausgang mit "waitms x" gesetzt.... > > Ist hier für mich nicht brauchbar da "wait" die Interrupts blockiert!!! > Ne wieso, wait ist auch nur ne reihe nops im generierten Code, der Intterupt läuft wunderbat weiter. Egal ob über Timer oder extern. Habs ja selbst 1a am laufen bei ner Schaltung um nen Tacho für nen 6 Zylinder an nem 4 Zylinder Motor zu betreiben.
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.