Hallo, bevor ich mit meiner Idee weiter mache, möchte ich erst mal wissen, ob es überhaupt möglich ist. Zu meinem Vorhaben Ich möchte wenn mein Attiny2313 ein Signal bekommt die Zeit anfangen zu die Zeit zu nehmen. nach dem zweiten Signal, soll er wieder bei null anfangen. mit der vorherigen Zeit soll er weiter rechnen. Beim nächsten Signal, soll wieder bei null angefangen werden zu zählen und mit der vorigen zeit gerechnet werden. Das Signal kommt von einem reifen beim Fahrrad, welches sich ja immer im kreis läuft und somit immer wieder ein signal gibt. dannn soll im prinzip für eine halbe umdrehung (welche ich mit der vorangeganengen zeit berechne) etwas gemacht werden. Ich habe mir angefangen anzusehen, wie man zeit stoppen kann, aber das scheint mir sehr kompliziert zu sein. Ich habe schon viele tutorials gemacht, aber trotzdem habe ich noch kein plan, wie das funktioniert. Jetzt wurde mir aber gesagt, dass das so nicht möglich ist, da der chip nur eins kann, also entweder zeit zählen, oder andere sachen machen. Das ist jetzt meine Frage, kann ich beides zusammen machen? Dann würde ich weiter lernen, ansonsten müsste ihc mir zunächst was anderes üerlegen. Chandler
Das ist ohne ohne Probleme möglich. Gerade beim Fahrrad kommen die Signal eher gemütlich, wenn man nicht viele Signale pro mm bekommt. Die Programmierung ist ggf. aber schon etwas schwieriger, weil das Mittel der Wahl hier Interrupts sind. Es geht hier sogar auch noch ohne, denn die Berechnung wird kaum so lange dauern, das bis dahin schon der nächste Puls kommen kann. Die eigentliche Zeitmessung (also das weiterzählen der Zeit) kann der Timer im µC übernehmen.
Chandler Bing schrieb: > Ich habe mir angefangen anzusehen, wie man zeit stoppen kann, aber das > scheint mir sehr kompliziert zu sein. Ich habe schon viele tutorials > gemacht, aber trotzdem habe ich noch kein plan, wie das funktioniert. Du nimmst einen Timer und lässt ihn einfach laufen. Zum Zeitpunkt des ersten Events speicherst du den aktuellen Timerwert. Zum Zeitpunkt des zweiten Events speicherst du auch den aktuellen Timerwert. Jetzt substrahierst du den ersten Wert vom zweiten und hast die Differnzzeit. Natürlich musst du dafür sorgen, dass dein Timer zwischen den beiden Events höchstens einmal überlaufen kann. Notfalls musst du den Wertebereich durch eine weitere Zählvariable erweitern. Das Thema wurde hier schon zigmal durchgekaut.
moin probiere es mal hiermit http://www.ladyada.net/make/spokepov/index.html ist glaube ich das was du suchst. mfg
Kannst du die Aufgabenstellung etwas konkreter beschreiben? Was genau soll mit der Zeit gemacht werden? Was ist das Ziel des "Projekts"? Das hört sich nämlich nach einem Fall für ein Input Capture an. Den Timer lässt du einfach durchlaufen und subtrahierst die Differenzen der beiden Messungen. Die Zeit dann noch zu halbieren, das ist nur eine Codezeile...
es gibt im Internet vermutlich gefühlte 1000 Projekter, welchen einen Fahrrad-Tacho mit eime Mikrocontroller vor/auf/nachbauen. Nach jedem Impuls wird "etwas gemacht" (ausgerechnet): aktuelle Geschwindigkeit, durchschnittliche Geschwindigkeit, gefahrene Strecke, und vieles andere mehr wie z.B. Uhrzeit, Kalorienverbrauch etc. Das ist doch von der Grundfunktion doch genau das was du brauchst, oder nicht? Schmeiss alles weg was du nicht brauchst, ergänze es mit deinen benötigten Funktionen, und schon "bist du fertig" ;-)
Ja, es gibt ein paar beispiele, wo so etwas ähnliches gemacht wird. Ich habe mir überlegt, erst einmal eine ganz normale uhr oder tachometer zu machen. Das ist (trotz der vielen beispiele) sehr schwierig für mich, da ich bis jetzt kein beispiel gefunden habe, wo NUR eine uhr programmiert wurde und mit erklärung, was in den einzelnen befehlen gemacht wird. trotzdem schonmal dank an die antworten
Chandler Bing schrieb: > Ich > habe mir überlegt, erst einmal eine ganz normale uhr oder tachometer zu > machen. Das schaffst du bestimmt. Trotzdem die Frage, was ist dein Fernziel? Falls du das Projekt nämlich gar nicht fürs Fahrrad brauchen solltest und an viel höhere Umdrehungsgeschwindigkeiten als 1/s gedacht ist, wirds nicht einfach...
Chandler Bing schrieb: > Ja, es gibt ein paar beispiele, wo so etwas ähnliches gemacht wird. Ich > habe mir überlegt, erst einmal eine ganz normale uhr oder tachometer zu > machen. Das ist (trotz der vielen beispiele) sehr schwierig für mich, da > ich bis jetzt kein beispiel gefunden habe, wo NUR eine uhr programmiert > wurde und mit erklärung, was in den einzelnen befehlen gemacht wird. dem Manne kann geholfen werden FAQ: Timer Allerdings: C solltest du zumindest in Grundzügen schon können. Und wie man aus einem regelmässigen Signal eine Uhr hochzieht, soviel Fantasie solltest du schon selber mitbringen. Ist ja auch nicht weiter schwer, die Zusammenhänge sind ja bekannt, wie sich Sekunden zu Minuten, Minuten zu Stunden etc. addieren.
Hi Ulrich schrieb: > Das ist ohne ohne Probleme möglich. Gerade beim Fahrrad kommen die > Signal eher gemütlich, wenn man nicht viele Signale pro mm bekommt. Vorsicht... Ja, die Signale kommen gemütlich, aber es ist entscheidend, wie lange sie dauern. Welchen Winkel vom Keis steht das Signal an ? Also 60 UPM = 1 U/Sek = 360° Impuls 2° = Impulsdauer 1/180 ~ 5mSek. Ist die Zykluszeit kleiner, dann ist pollen ok, aber da muss man auch sicher sein. Hier ist meiner Meinung die Impulserfassung per ISR angebracht. > Die Programmierung ist ggf. aber schon etwas schwieriger, weil das > Mittel der Wahl hier Interrupts sind. Es geht hier sogar auch noch ohne, > denn die Berechnung wird kaum so lange dauern, das bis dahin schon der > nächste Puls kommen kann. Wie in meiner Rechnung zu sehen ist 1 Sekunde für einen Controller eine Ewigkeit..... > Die eigentliche Zeitmessung (also das weiterzählen der Zeit) kann der > Timer im µC übernehmen. Richtig, der Timer ist das Maß der Dinge. Daher Datenblatt, Tutorial und Onlinehilfe zuzüglich Infos aus ähnlichen Problemfragen. Dann musst du dich ein wenig konzentrieren und dir die Mühe machen, alles auf dein Projekt zuzuschneiden. Wenn dir ein Zeittakt von einer mSek. reicht, dann lass den Timer diesen erzeugen und rechne im Programm die mSek. zusammen. Entscheidend ist auch deine Hardware. Wie hoch ist dein Controller getaktet, wie groß dein Programm. Ist es mit einer Hochsprache "C" oder "BASCOM" geschrieben, oder vielleicht sogar in Assembler ? Bei C oder BASCOM lässt sich die Zykluszeit nicht so einfach berechnen, wie in Assembler. Ob die Compiler die Info liefern weiß ich nicht, aber das sind bei Zeitkritischen Vorgängen halt auch ein paar Punkte, die beachtet werden müssen. Gruß oldmax
mh, habe jetzt ein Programm geschrieben, was eigentlich recht einfach sein sollte. sobald an PA0 ein Signal kommt, soll nach zwei sekunden für zwei sekunden an PB0 ein ausgang da sein. Allerdings bleibt der Ausgang die ganze Zeit an.
1 | |
2 | #define F_CPU 1000000UL
|
3 | #include <avr/io.h> |
4 | #include <avr/interrupt.h> |
5 | #include <math.h> |
6 | |
7 | //
|
8 | // der Timer wird mit 1Mhz getaktet. Vorteiler ist 8
|
9 | // d.h. der Timer läuft mit 125kHz und würde daher in 1 Sekunde
|
10 | // von 0 bis 124999 zaehlen.
|
11 | // Aber nach jeweils 256 Zaehlungen erfolgt ein Overflow.
|
12 | // Daher werden in 1 Sekunde 125000 / 256 = 488.28125 Overflows erzeugt
|
13 | // Oder anders ausgedrückt: 1 / 488.2815 = 0.002048
|
14 | // alle 0.002048 Sekunden erfolgt ein Overflow
|
15 | //
|
16 | |
17 | |
18 | |
19 | ISR( TIMER0_OVF_vect ) { |
20 | static uint8_t swTeiler = 0; |
21 | if(PINA == 0b00000001) { |
22 | swTeiler++; |
23 | if(swTeiler > 200 && swTeiler < 400) { |
24 | PORTB = 0b0000001; |
25 | }
|
26 | }
|
27 | |
28 | }
|
29 | |
30 | |
31 | int main() { |
32 | |
33 | DDRA = 0x00; |
34 | DDRB = 0xff; |
35 | PORTB = 0x00; |
36 | TCCR0B = (1<<CS01); |
37 | TIMSK |= (1<<TOIE0); |
38 | |
39 | |
40 | sei(); |
41 | while( 1 ) { |
42 | }
|
43 | }
|
Chandler Bing schrieb: > mh, > habe jetzt ein Programm geschrieben, was eigentlich recht einfach sein > sollte. > sobald an PA0 ein Signal kommt, Was ist dieses 'Signal'? Ein Portpin, den du auf Eingang geschaltet hast, der aber ansonsten von dir keinen Pegel aufgezwungen bekommt, ist NICHT automatisch 0! Ein offener Eingang fängt sich jedes dahergelaufene elektromagnetische Feld ein, das er kriegen kann! > if(PINA == 0b00000001) { Schreibs als if( PINA & (1 << PA0 ) ) Und ob das so schlau ist, den auf 1 abzufragen ist dahin gestellt. Normalerweise benutzt man Pullups und schliesst den Taster genau anders rum an, so dass der die Leitung auf 0 zieht, wenn er geschlossen wird. >Allerdings bleibt der Ausgang die ganze Zeit an. > PORTB = 0b0000001; Was hängt da drann, wie stellst du das fest? Ich werde das Gefühl nicht los, dass du im Grunde gerade versuchst den 25-ten Schritt vor dem ersten zu machen und du in Wirklichkeit mit der ganzen Sache rund um Eingänge/Ausgänge/Pullup noch auf Kriegsfuss stehst. Wenn das so ist, dann lass dir gesagt sein: du kannst diesen Schritt nicht überspringen. WEnn das nicht so sein sollte, dann entschuldige ich mich.
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.