Forum: Mikrocontroller und Digitale Elektronik Zeitmessen und Berechnung gleichzeitig Attiny2313


von Chandler B. (chandler)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Esoteriker (Gast)


Lesenswert?

moin
probiere es mal hiermit
http://www.ladyada.net/make/spokepov/index.html

ist glaube ich das was du suchst.
mfg

von Martin (Gast)


Lesenswert?

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...

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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" ;-)

von Chandler B. (chandler)


Lesenswert?

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

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von oldmax (Gast)


Lesenswert?

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

von Chandler B. (chandler)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.