<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=31.19.166.87</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=31.19.166.87"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/31.19.166.87"/>
	<updated>2026-04-10T12:54:09Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64860</id>
		<title>Fahrradcomputer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64860"/>
		<updated>2012-03-09T10:46:53Z</updated>

		<summary type="html">&lt;p&gt;31.19.166.87: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Features =&lt;br /&gt;
&lt;br /&gt;
* Kilometerzähler                                                                                 &lt;br /&gt;
** Gesamtstrecke&lt;br /&gt;
** Tourstrecke &lt;br /&gt;
** Tagesstrecke&lt;br /&gt;
** Strecke seit der letzten Pause&lt;br /&gt;
* Geschwindigkeitsmessung&lt;br /&gt;
** Momentangeschwindigkeit&lt;br /&gt;
** Tourmittel&lt;br /&gt;
** Tagesmittel&lt;br /&gt;
** Mittel seit der letzten Pause&lt;br /&gt;
* Kurbeldrehzahl&lt;br /&gt;
* Temperatur                                                                              &lt;br /&gt;
* Uhrzeit&lt;br /&gt;
* Akkuspannungsüberwachung&lt;br /&gt;
* Pulsfrequenzmessung&lt;br /&gt;
* Vertikalgeschwindigkeit&lt;br /&gt;
* Lesen des NMEA-Outputs von GPS-Empfängern&lt;br /&gt;
* Logging der Daten im ser.Flash des Butterfly oder einer MMC.&lt;br /&gt;
* Kommunikation mit PC zum Datenauslesen&lt;br /&gt;
&lt;br /&gt;
Die Messung der Radumdrehung soll außer der Reedkontaktmethode auch über die Frequenz des [http://www.nabendynamo.de/detail.htm Schmidt-Nabendynamos] möglich sein.&lt;br /&gt;
&lt;br /&gt;
= Offene Punkte/Fragen =&lt;br /&gt;
&lt;br /&gt;
* Die Verwendung von printf aus der gcclib kostet 5k Flash und braucht manchmal etwas RAM. Dafür ist es bequem. Oder doch besser eine LowCost-Lösung?&lt;br /&gt;
&lt;br /&gt;
= Target =&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Butterfly|Butterfly]]&lt;br /&gt;
* [[ATmega]]* mit externem Display&lt;br /&gt;
* ATtiny* ohne Display&lt;br /&gt;
&lt;br /&gt;
= Funktionsdetails =&lt;br /&gt;
&lt;br /&gt;
== System Timer ==&lt;br /&gt;
&lt;br /&gt;
Der Timer2 erzeugt aus dem 38kHz-Oszillatortakt einen periodischen Interrupt im 1/4 Sekunden Abstand.&lt;br /&gt;
&lt;br /&gt;
== Menu ==&lt;br /&gt;
&lt;br /&gt;
Auswahl der Anzeige über Up/Down. Kurze Zeit wird die Funktion als Text angezeigt, danach der Zahlenwert.&lt;br /&gt;
Mit Left wird der Funktionstext erneut angezeigt.&lt;br /&gt;
Right führt zu einem ev. Submenü der Funktion.&lt;br /&gt;
&lt;br /&gt;
== Entfernungsmessung ==&lt;br /&gt;
&lt;br /&gt;
Der Radumfang wird in 1/256 Metern gespeichert. Dieser wird bei jeder Radumdrehung zum Gesamt(kilo)meterzähler addiert.&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt am Rad löst einen Interrupt aus. Zum Sonderfall &amp;quot;stehendes Rad und Reedkontakt geschlossen&amp;quot; siehe [http://www.mikrocontroller.net/topic/93779#812975 Forenbeitrag] von Thomas.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des SON als Tachogeber ===&lt;br /&gt;
&lt;br /&gt;
Frequenzbereich: 5 Hz - 200 Hz (geschätzt, muss noch gemessen werden). Schaltungsvorschlag zur Frequenzmessung des Nabendynamos und damit auch zur Geschwindigkeitsmessung: &lt;br /&gt;
&lt;br /&gt;
[[bild:son_diode.png|SON Frequenzmessung]]&lt;br /&gt;
&lt;br /&gt;
[[Media:son_diode.sch|EAGLE-Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsmessung ==&lt;br /&gt;
&lt;br /&gt;
Bei jedem Radinterrupt wird der Timer2 und die Systime ausgelesen.&lt;br /&gt;
Mit Timer2prescaler 32 ergibt sich eine Auflösung von 1/1024 Sekunden.&lt;br /&gt;
&lt;br /&gt;
Die maximale Geschwindigkeit wird mit 30 m/s festgelegt. Daraus folgt bei einem 20 Zoll Rad eine maximale Raddrehzahl von ca. 17 Hz (min. Peridendauer &amp;gt; 50ms). Die Körnigkeit der Messung liegt also bei der Maximalgeschwindigkeit so in der Gegend von 2%.&lt;br /&gt;
&lt;br /&gt;
Hallo. Bei 30 m/s fährst Du somit rund 108km /h; etwas gar viel für ein Velo. Mit dem Rennrad machst Du bergab maximal einen 70, somit reichen rund 20m/s als Maximalgeschwindigkeit :-)&lt;br /&gt;
&lt;br /&gt;
Kommentar von Magnetus:&lt;br /&gt;
&lt;br /&gt;
Ich habe in meiner Jugend auf meinem Rennrad bergab mal 98 km/h geschafft. Ein Spitzenwert von 108 km/h ist also gar nicht so abwegig.&lt;br /&gt;
&lt;br /&gt;
Kommentar von Joachim Drechsel:&lt;br /&gt;
&lt;br /&gt;
Fahrradtachos werden recht viel bei Motorrädern benutzt (klein, billig, genau).&lt;br /&gt;
Moderne Fahrradtachos haben daher einen Meßbereich bis 199 km/h oder darüber.&lt;br /&gt;
&lt;br /&gt;
== Kurbeldrehzahl ==&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt geht auch auf einen Interrupteingang.&lt;br /&gt;
&lt;br /&gt;
== Temperatur ==&lt;br /&gt;
&lt;br /&gt;
Der Butterfly hat einen NTC an einem Analogport.&lt;br /&gt;
&lt;br /&gt;
== Uhrzeit ==&lt;br /&gt;
&lt;br /&gt;
Die Uhrzeit wird nicht wie beim Butterfly-Demo in Sekunden-, Minuten- und Stundenvariablen sondern als 1/4-Sekundenzähler gespeichert. Soll die Uhrzeit angezeigt werden, wird eine Umrechnungsfunktion aufgerufen.&lt;br /&gt;
&lt;br /&gt;
== Vertikalgeschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Die absolute Höhe ist uninteressant.&lt;br /&gt;
Aus der Vertikalgeschwindigkeit kann die Steigung und die Steigleistung ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Wie bei den Variometern der Segel- und Drachenflieger wird die Ausgangsspannung eines Drucksensors differenziert.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnte man auch die Steigung direkt messen. Bob Pease schreibt in der Electronic Design September 2004, dass er sowas für seine Nepaltour gebaut hatte. Bergauf hätte es aber wg. des Gewackels nicht funktioniert (vermutlich fährt er ein gefedertes Mountainbike). Schaltungsdetails hat er kein angegeben, nur, dass er ein Öl-Fett-Gemisch als Dämpfer verwendet.&lt;br /&gt;
&lt;br /&gt;
Vielleicht kann man sowas auch nach dem Wasserwaagenprinzip bauen.&lt;br /&gt;
&lt;br /&gt;
Es wäre auch eine Alternative einen Beschleunigungssensor zu verwenden und den Ausgang durch Mittelwertbildung zu glätten. Hier können dann verschiedene Softwarefilter ohne großen Aufwand getestet werden.&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
Alle Daten werden in einer Reihe gespeichert.&lt;br /&gt;
Die Art des Eintrags wird anhand einer 4-bit ID bestimmt.&lt;br /&gt;
Dannach folgen 12 Bit Daten.&lt;br /&gt;
Die kleinste Zeiteinheit im Logging, die Logging Unit, ist 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
=== Timestamp ===&lt;br /&gt;
Die Timestamp enthält die Zeit in Vielfachen von 256 Logging Units.&lt;br /&gt;
&lt;br /&gt;
| ID | Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Deltatimestamp ===&lt;br /&gt;
Das ist kein eigener Loggingeintrag, sondern Teil der sich unregelmäßig ändernden Loggingeinträge, wie Temperatur oder Puls. Es werden die letzten 8 bit der Zeit in Logging Units gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Entfernung ===&lt;br /&gt;
Die Entfernungsdaten werden in einem festen Zeitintervall, der Logging Unit, gespeichert.&lt;br /&gt;
Sollte es zu Aussetzern kommen (z.&amp;amp;nbsp;B. weil das Fahrzeug steht), wird vor dem neuen Eintrag ein Timestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Entfernungsdifferenz |&lt;br /&gt;
&lt;br /&gt;
=== Trittfrequenz ===&lt;br /&gt;
Die Trittfrequenz wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Frequenz | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Temperatur ===&lt;br /&gt;
Die Temperatur wird normalerweise als Änderung gegenüber der vorhergehenden Temperatureintrag gespeichert. Gelegentlich wird die tatsächliche Temperatur ohne Deltatimestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Temperature | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
| ID | Temperatur |&lt;br /&gt;
&lt;br /&gt;
=== Puls ===&lt;br /&gt;
Der Puls wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Puls geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Puls | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
== GPS-Connection ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die NMEA-Daten eingelesen. Damit kann die Uhr gestellt werden und Position und Höhe mitgeloggt werden. Über die Geschwindigkeitsdaten kann die Kalibration des Raddurchmessers eingestellt bzw. überprüft werden. Die Höhendaten können den Luftdrucksensor unterstützen im Sinne eines Multisensor-Konzepts.&lt;br /&gt;
&lt;br /&gt;
== PC-Kommunikation ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die geloggten Daten auf den PC übertragen.&lt;br /&gt;
&lt;br /&gt;
Eventuell Kommunikation mit einem W-Lan oder BT Modul zu einem PC.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warnung:&#039;&#039;&#039; Das ist kein fertiger Radcomputer, sondern eine Diskussionsgrundlage für die Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[[Media:Radcomputer-0.0.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039;fertiger Radcomputer, Fragen an volkerblock at t-online.de&lt;br /&gt;
 &#039;mit timer1 capture (weil int0 und int1 besetzt durch die Anzeige)&lt;br /&gt;
 &#039;Volker Block 10.02.2008&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039; fahrradcapturecomfort.bas                 FAHRRADCOMPUTER MIT MYAVR AVR M8&lt;br /&gt;
 &#039;Eingang für das Poti (Radumfang) ist PC0&lt;br /&gt;
  &#039; Taster1 PORTB.0 wird durch ein Reedrelais (Schließer) ersetzt, betätigt durch einen Magneten&lt;br /&gt;
 &#039;am Vorderrad (Teil von altem Fahrradcomputer)&lt;br /&gt;
 &#039;taster2 PORTC.5 wählt die Anzeige aus, langer Tastendruck löscht den jeweiligen Wert&lt;br /&gt;
 &#039; zu Beginn kann mit dem Poti1 PORTC.0 der Radumfang eingegeben werden.&lt;br /&gt;
 &#039; 4 K Größe (Demo Version)wird ausgenutzt, es sind keine Erweiterungen möglich&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 3686400&lt;br /&gt;
 &#039;groß genug wählen, sonst Absturz&lt;br /&gt;
 $hwstack = 52                                               &#039; default use 32 for the hardware stack&lt;br /&gt;
 &lt;br /&gt;
 $swstack = 20                                               &#039; default use 10 for the SW stack&lt;br /&gt;
 &lt;br /&gt;
 $framesize = 60                                             &#039; default use 40 for the frame space&lt;br /&gt;
 &lt;br /&gt;
 On Icp1 Oncapture&lt;br /&gt;
 Dim Zaehlerdifferenz As Word , Gestartet As Byte , Signal As Byte , Zeit As Single , V As Single&lt;br /&gt;
 Dim Umfang As Single , Weg As Single , Wegkm As Single , Ad As Byte&lt;br /&gt;
 Dim Cap As Word , Capalt As Word , Z As Word&lt;br /&gt;
 Dim I As Word , D As Word&lt;br /&gt;
 Dim Watchdog1 As Word&lt;br /&gt;
 Dim Gesamtweg As Single , Gesamtwegkm As Single , Vmax As Single&lt;br /&gt;
 Dim Vmittel As Single , Gesamtzeit As Single , Gesamtzeitmin As Word&lt;br /&gt;
 Declare Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
 &#039;Zahlen formatieren mit n Nachkommastellen und g Gesamtstellen einschl Komma und Leerzeichen&lt;br /&gt;
 Ddrb = &amp;amp;B00001110&lt;br /&gt;
 Portb = &amp;amp;B11110001                                         &#039; portb.0 ist eingang&lt;br /&gt;
 Ddrc = &amp;amp;B00000000&lt;br /&gt;
 Portc = 255&lt;br /&gt;
 &lt;br /&gt;
 Admux = &amp;amp;B01100000 &#039;bit 7 u. 6 aref intern bit 5 nur 8 bit  3..0: adc0&lt;br /&gt;
 Adcsra = &amp;amp;B11100010 &#039; adcan start  frei  clock/4&lt;br /&gt;
 &lt;br /&gt;
 Tccr1a = &amp;amp;B00000000&lt;br /&gt;
 Tccr1b = &amp;amp;B11000101                                        &#039;bit 6=1 steigende flanke 3600 pro sekunde&lt;br /&gt;
 Timsk.ticie1 = 1  &#039;bit 5 capture interrupt ein&lt;br /&gt;
 Sreg.7 = 1        &#039; Interrrupts ein                                         &#039;kein Compare-Modus&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
  Lcd &amp;quot;Tempo: &amp;quot;&lt;br /&gt;
  Lowerline&lt;br /&gt;
  Lcd &amp;quot;Weg  :&amp;quot;&lt;br /&gt;
  Taster1 Alias Pinb.0&lt;br /&gt;
  Taster2 Alias Pinc.5&lt;br /&gt;
  Ledgruen Alias Portb.2&lt;br /&gt;
  Ledrot Alias Portb.3&lt;br /&gt;
  Speaker Alias Portb.5&lt;br /&gt;
         Weg = 0&lt;br /&gt;
         Cls&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = 0&lt;br /&gt;
        Do&lt;br /&gt;
                                     &#039;nur beim Start den Umfang lesen&lt;br /&gt;
                 Ad = Adch&lt;br /&gt;
                 Umfang = Ad / 255&lt;br /&gt;
                 Umfang = Umfang * 300&lt;br /&gt;
                 Home&lt;br /&gt;
                 Lcd &amp;quot;Umfang: &amp;quot; ; Fusing(umfang , &amp;quot;#.#&amp;quot;) ; &amp;quot; cm  &amp;quot;&lt;br /&gt;
                 Lowerline&lt;br /&gt;
                 Lcd &amp;quot;Poti1 drehen&amp;quot;&lt;br /&gt;
                 Waitms 20&lt;br /&gt;
                 Umfang = Umfang / 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Loop Until Zaehlerdifferenz &amp;gt; 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Z = 1&lt;br /&gt;
  Vmax = 0&lt;br /&gt;
  Watchdog1 = 0&lt;br /&gt;
   Cls&lt;br /&gt;
  Do&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        If Taster2 = 0 Then                                 &#039;kurzer Tastendruck schaltet Anzeige weiter&lt;br /&gt;
                     D = 0&lt;br /&gt;
                     Do&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     D = D + 1&lt;br /&gt;
                     Loop Until Taster2 = 1 Or D &amp;gt;= 30&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     If D &amp;lt; 30 Then&lt;br /&gt;
                     Z = Z + 1&lt;br /&gt;
                     Else&lt;br /&gt;
                     If Z = 1 Then Weg = 0                  &#039;langer Tastendruck löscht die Werte&lt;br /&gt;
                     If Z = 2 Then Gesamtweg = 0&lt;br /&gt;
                     If Z = 3 Then Vmax = 0&lt;br /&gt;
                       Do&lt;br /&gt;
                       Loop Until Taster2 = 1               &#039;gegen Prellen, sonst schaltet er weiter&lt;br /&gt;
                     End If&lt;br /&gt;
                     If Z &amp;gt; 4 Then Z = 1&lt;br /&gt;
                     Cls&lt;br /&gt;
 &lt;br /&gt;
        End If&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
      If Zeit &amp;gt; 0 Then V = Umfang / Zeit&lt;br /&gt;
        V = V * 3.6&lt;br /&gt;
       If V &amp;lt; 3 Then V = 0&lt;br /&gt;
       If V &amp;gt; 99 Then V = 0&lt;br /&gt;
       If V &amp;gt; Vmax Then Vmax = V&lt;br /&gt;
       If Gesamtzeit &amp;lt; 5 Then Vmax = 0                      &#039; Störimpulse beim Start werden so vermieden&lt;br /&gt;
 &lt;br /&gt;
        Watchdog1 = Watchdog1 + 1                             &#039;wenn keine Impulse mehr kommen, soll die Anzeige&lt;br /&gt;
                                                            &#039;nicht auf dem letzten Wert stehen bleiben&lt;br /&gt;
       If Watchdog1 &amp;gt; 40 Then V = 0                          &#039; sondern v=Null anzeigen&lt;br /&gt;
      Wegkm = Weg / 1000&lt;br /&gt;
      Gesamtwegkm = Gesamtweg / 1000&lt;br /&gt;
        Vmittel = Weg / Gesamtzeit&lt;br /&gt;
 &lt;br /&gt;
        Vmittel = Vmittel * 3.6&lt;br /&gt;
         &#039; Ledgruen = 1&lt;br /&gt;
 &lt;br /&gt;
          Home&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
           Lcd &amp;quot;Tempo :&amp;quot; ; Form(v , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
            Lowerline&lt;br /&gt;
            Select Case Z&lt;br /&gt;
            Case 1 : Lcd &amp;quot;Weg   :&amp;quot; ; Form(wegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 2 : Lcd &amp;quot;Gesamt:&amp;quot; ; Form(gesamtwegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 3 : Lcd &amp;quot;Max   :&amp;quot; ; Form(vmax , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
            Case 4 : Lcd &amp;quot;Mittel:&amp;quot; ; Form(vmittel , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
             End Select&lt;br /&gt;
            &#039; Ledgruen = 0&lt;br /&gt;
            Waitms 20                                       &#039;20&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Loop&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Oncapture:&lt;br /&gt;
       Cap = Capture1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = Cap - Capalt&lt;br /&gt;
 &lt;br /&gt;
       Capalt = Cap&lt;br /&gt;
         Zeit = Zaehlerdifferenz&lt;br /&gt;
       Zeit = Zeit / 3600&lt;br /&gt;
       If V &amp;gt; 0 Then&lt;br /&gt;
                  Gesamtzeit = Gesamtzeit + Zeit&lt;br /&gt;
 &lt;br /&gt;
                 Weg = Weg + Umfang&lt;br /&gt;
                 Gesamtweg = Gesamtweg + Umfang&lt;br /&gt;
         End If&lt;br /&gt;
      Gesamtzeitmin = Gesamtzeit / 60&lt;br /&gt;
       Watchdog1 = 0&lt;br /&gt;
       Ledrot = 1                                           &#039;Impulsanzeige&lt;br /&gt;
       Waitms 10&lt;br /&gt;
       Ledrot = 0&lt;br /&gt;
       &#039;Sound Speaker , 200 , 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Tifr.3 = 0                                          &#039; verhindert bei Prellen Mehrfachinterrupt&lt;br /&gt;
  Return&lt;br /&gt;
 &lt;br /&gt;
 Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
  Local S1 As String * 16&lt;br /&gt;
 &lt;br /&gt;
    If N = 1 Then S1 = Fusing(v1 , &amp;quot;#.#&amp;quot;)&lt;br /&gt;
    If N = 3 Then S1 = Fusing(v1 , &amp;quot;#.###&amp;quot;)&lt;br /&gt;
    S1 = &amp;quot;    &amp;quot; + S1&lt;br /&gt;
  Form = Right(s1 , G)&lt;br /&gt;
  End Function&lt;br /&gt;
 End&lt;br /&gt;
== In Arbeit ==&lt;br /&gt;
* Logging&lt;br /&gt;
* Xmodem Protoll zur Datenübertragung&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Sensordatenfilterung&lt;br /&gt;
* [[NMEA]]-Auswertung&lt;br /&gt;
* Stromverbrauch senken (siehe auch [[Ultra low power]])&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-1-79785.html Thread im Forum zur Seite]&lt;br /&gt;
*[[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
*[http://homepages.compuserve.de/SIGIBORST/ Fahrradcomputer mit Pulsmesser]&lt;br /&gt;
*[http://www.avrfreaks.net/Freaks/freakshow.php?keyword_is_id=1&amp;amp;keywords=10 Variometer] bei avrfreaks.net&lt;br /&gt;
*[http://www.circuitcellar.com/avr2004/DA1300.html Variometer-Altimeter for Free Flying] bei www.circuitcellar.com&lt;br /&gt;
*[[AVR Butterfly]]&lt;br /&gt;
&lt;br /&gt;
*http://veloace.sf.net Palm fahrradcomputer&lt;br /&gt;
*[http://thinksilicon.de/53/PDA-Fahrradtacho-VeloAce.html Palm Fahrradcomputer HowTo]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>31.19.166.87</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64859</id>
		<title>Fahrradcomputer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64859"/>
		<updated>2012-03-09T10:32:32Z</updated>

		<summary type="html">&lt;p&gt;31.19.166.87: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Features =&lt;br /&gt;
&lt;br /&gt;
* Kilometerzähler                                                                                 &lt;br /&gt;
** Gesamtstrecke&lt;br /&gt;
** Tourstrecke &lt;br /&gt;
** Tagesstrecke&lt;br /&gt;
** Strecke seit der letzten Pause&lt;br /&gt;
* Geschwindigkeitsmessung&lt;br /&gt;
** Momentangeschwindigkeit&lt;br /&gt;
** Tourmittel&lt;br /&gt;
** Tagesmittel&lt;br /&gt;
** Mittel seit der letzten Pause&lt;br /&gt;
* Kurbeldrehzahl&lt;br /&gt;
* Temperatur                                                                              &lt;br /&gt;
* Uhrzeit&lt;br /&gt;
* Akkuspannungsüberwachung&lt;br /&gt;
* Pulsfrequenzmessung&lt;br /&gt;
* Vertikalgeschwindigkeit&lt;br /&gt;
* Lesen des NMEA-Outputs von GPS-Empfängern&lt;br /&gt;
* Logging der Daten im ser.Flash des Butterfly oder einer MMC.&lt;br /&gt;
* Kommunikation mit PC zum Datenauslesen&lt;br /&gt;
&lt;br /&gt;
Die Messung der Radumdrehung soll außer der Reedkontaktmethode auch über die Frequenz des [http://www.nabendynamo.de/detail.htm Schmidt-Nabendynamos] möglich sein.&lt;br /&gt;
&lt;br /&gt;
= Offene Punkte/Fragen =&lt;br /&gt;
&lt;br /&gt;
* Die Verwendung von printf aus der gcclib kostet 5k Flash und braucht manchmal etwas RAM. Dafür ist es bequem. Oder doch besser eine LowCost-Lösung?&lt;br /&gt;
&lt;br /&gt;
= Target =&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Butterfly|Butterfly]]&lt;br /&gt;
* [[ATmega]]* mit externem Display&lt;br /&gt;
* ATtiny* ohne Display&lt;br /&gt;
&lt;br /&gt;
= Funktionsdetails =&lt;br /&gt;
&lt;br /&gt;
== System Timer ==&lt;br /&gt;
&lt;br /&gt;
Der Timer2 erzeugt aus dem 38kHz-Oszillatortakt einen periodischen Interrupt im 1/4 Sekunden Abstand.&lt;br /&gt;
&lt;br /&gt;
== Menu ==&lt;br /&gt;
&lt;br /&gt;
Auswahl der Anzeige über Up/Down. Kurze Zeit wird die Funktion als Text angezeigt, danach der Zahlenwert.&lt;br /&gt;
Mit Left wird der Funktionstext erneut angezeigt.&lt;br /&gt;
Right führt zu einem ev. Submenü der Funktion.&lt;br /&gt;
&lt;br /&gt;
== Entfernungsmessung ==&lt;br /&gt;
&lt;br /&gt;
Der Radumfang wird in 1/256 Metern gespeichert. Dieser wird bei jeder Radumdrehung zum Gesamt(kilo)meterzähler addiert.&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt am Rad löst einen Interrupt aus. Zum Sonderfall &amp;quot;stehendes Rad und Reedkontakt geschlossen&amp;quot; siehe [http://www.mikrocontroller.net/topic/93779#812975 Forenbeitrag] von Thomas.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des SON als Tachogeber ===&lt;br /&gt;
&lt;br /&gt;
Frequenzbereich: 5 Hz - 200 Hz (geschätzt, muss noch gemessen werden). Schaltungsvorschlag zur Frequenzmessung des Nabendynamos und damit auch zur Geschwindigkeitsmessung: &lt;br /&gt;
&lt;br /&gt;
[[bild:son_diode.png|SON Frequenzmessung]]&lt;br /&gt;
&lt;br /&gt;
[[Media:son_diode.sch|EAGLE-Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsmessung ==&lt;br /&gt;
&lt;br /&gt;
Bei jedem Radinterrupt wird der Timer2 und die Systime ausgelesen.&lt;br /&gt;
Mit Timer2prescaler 32 ergibt sich eine Auflösung von 1/1024 Sekunden.&lt;br /&gt;
&lt;br /&gt;
Die maximale Geschwindigkeit wird mit 30 m/s festgelegt. Daraus folgt bei einem 20 Zoll Rad eine maximale Raddrehzahl von ca. 17 Hz (min. Peridendauer &amp;gt; 50ms). Die Körnigkeit der Messung liegt also bei der Maximalgeschwindigkeit so in der Gegend von 2%.&lt;br /&gt;
&lt;br /&gt;
Hallo. Bei 30 m/s fährst Du somit rund 108km /h; etwas gar viel für ein Velo. Mit dem Rennrad machst Du bergab maximal einen 70, somit reichen rund 20m/s als Maximalgeschwindigkeit :-)&lt;br /&gt;
&lt;br /&gt;
Kommentar von Magnetus:&lt;br /&gt;
&lt;br /&gt;
Ich habe in meiner Jugend auf meinem Rennrad bergab mal 98 km/h geschafft. Ein Spitzenwert von 108 km/h ist also gar nicht so abwegig.&lt;br /&gt;
&lt;br /&gt;
Kommentar von Joachim Drechsel:&lt;br /&gt;
&lt;br /&gt;
Fahrradtachos werden recht viel bei Motorrädern benutzt (klein, billig, genau).&lt;br /&gt;
Moderne Fahrradtachos haben daher einen Meßbereich bis 199 km/h oder darüber.&lt;br /&gt;
&lt;br /&gt;
== Kurbeldrehzahl ==&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt geht auch auf einen Interrupteingang.&lt;br /&gt;
&lt;br /&gt;
== Temperatur ==&lt;br /&gt;
&lt;br /&gt;
Der Butterfly hat einen NTC an einem Analogport.&lt;br /&gt;
&lt;br /&gt;
== Uhrzeit ==&lt;br /&gt;
&lt;br /&gt;
Die Uhrzeit wird nicht wie beim Butterfly-Demo in Sekunden-, Minuten- und Stundenvariablen sondern als 1/4-Sekundenzähler gespeichert. Soll die Uhrzeit angezeigt werden, wird eine Umrechnungsfunktion aufgerufen.&lt;br /&gt;
&lt;br /&gt;
== Vertikalgeschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Die absolute Höhe ist uninteressant.&lt;br /&gt;
Aus der Vertikalgeschwindigkeit kann die Steigung und die Steigleistung ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Wie bei den Variometern der Segel- und Drachenflieger wird die Ausgangsspannung eines Drucksensors differenziert.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnte man auch die Steigung direkt messen. Bob Pease schreibt in der Electronic Design September 2004, dass er sowas für seine Nepaltour gebaut hatte. Bergauf hätte es aber wg. des Gewackels nicht funktioniert (vermutlich fährt er ein gefedertes Mountainbike). Schaltungsdetails hat er kein angegeben, nur, dass er ein Öl-Fett-Gemisch als Dämpfer verwendet.&lt;br /&gt;
&lt;br /&gt;
Vielleicht kann man sowas auch nach dem Wasserwaagenprinzip bauen.&lt;br /&gt;
&lt;br /&gt;
Es wäre auch eine Alternative einen Beschleunigungssensor zu verwenden und den Ausgang durch Mittelwertbildung zu glätten. Hier können dann verschiedene Softwarefilter ohne großen Aufwand getestet werden.&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
Alle Daten werden in einer Reihe gespeichert.&lt;br /&gt;
Die Art des Eintrags wird anhand einer 4-bit ID bestimmt.&lt;br /&gt;
Dannach folgen 12 Bit Daten.&lt;br /&gt;
Die kleinste Zeiteinheit im Logging, die Logging Unit, ist 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
=== Timestamp ===&lt;br /&gt;
Die Timestamp enthält die Zeit in Vielfachen von 256 Logging Units.&lt;br /&gt;
&lt;br /&gt;
| ID | Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Deltatimestamp ===&lt;br /&gt;
Das ist kein eigener Loggingeintrag, sondern Teil der sich unregelmäßig ändernden Loggingeinträge, wie Temperatur oder Puls. Es werden die letzten 8 bit der Zeit in Logging Units gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Entfernung ===&lt;br /&gt;
Die Entfernungsdaten werden in einem festen Zeitintervall, der Logging Unit, gespeichert.&lt;br /&gt;
Sollte es zu Aussetzern kommen (z.&amp;amp;nbsp;B. weil das Fahrzeug steht), wird vor dem neuen Eintrag ein Timestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Entfernungsdifferenz |&lt;br /&gt;
&lt;br /&gt;
=== Trittfrequenz ===&lt;br /&gt;
Die Trittfrequenz wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Frequenz | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Temperatur ===&lt;br /&gt;
Die Temperatur wird normalerweise als Änderung gegenüber der vorhergehenden Temperatureintrag gespeichert. Gelegentlich wird die tatsächliche Temperatur ohne Deltatimestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Temperature | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
| ID | Temperatur |&lt;br /&gt;
&lt;br /&gt;
=== Puls ===&lt;br /&gt;
Der Puls wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Puls geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Puls | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
== GPS-Connection ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die NMEA-Daten eingelesen. Damit kann die Uhr gestellt werden und Position und Höhe mitgeloggt werden. Über die Geschwindigkeitsdaten kann die Kalibration des Raddurchmessers eingestellt bzw. überprüft werden. Die Höhendaten können den Luftdrucksensor unterstützen im Sinne eines Multisensor-Konzepts.&lt;br /&gt;
&lt;br /&gt;
== PC-Kommunikation ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die geloggten Daten auf den PC übertragen.&lt;br /&gt;
&lt;br /&gt;
Eventuell Kommunikation mit einem W-Lan oder BT Modul zu einem PC.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warnung:&#039;&#039;&#039; Das ist kein fertiger Radcomputer, sondern eine Diskussionsgrundlage für die Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[[Media:Radcomputer-0.0.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039;fertiger Radcomputer, Fragen an volkerblock at t-online.de&lt;br /&gt;
 &#039;mit timer1 capture&lt;br /&gt;
 &#039;Volker Block 10.02.2008&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039; fahrradcapturecomfort.bas                 FAHRRADCOMPUTER MIT MYAVR AVR M8&lt;br /&gt;
 &#039;Eingang für das Poti (Radumfang) ist PC0&lt;br /&gt;
  &#039; Taster1 PORTB.0 wird durch ein Reedrelais (Schließer) ersetzt, betätigt durch einen Magneten&lt;br /&gt;
 &#039;am Vorderrad (Teil von altem Fahrradcomputer)&lt;br /&gt;
 &#039;taster2 PORTC.5 wählt die Anzeige aus, langer Tastendruck löscht den jeweiligen Wert&lt;br /&gt;
 &#039; zu Beginn kann mit dem Poti1 PORTC.0 der Radumfang eingegeben werden.&lt;br /&gt;
 &#039; 4 K Größe (Demo Version)wird ausgenutzt, es sind keine Erweiterungen möglich&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 3686400&lt;br /&gt;
 &#039;groß genug wählen, sonst Absturz&lt;br /&gt;
 $hwstack = 52                                               &#039; default use 32 for the hardware stack&lt;br /&gt;
 &lt;br /&gt;
 $swstack = 20                                               &#039; default use 10 for the SW stack&lt;br /&gt;
 &lt;br /&gt;
 $framesize = 60                                             &#039; default use 40 for the frame space&lt;br /&gt;
 &lt;br /&gt;
 On Icp1 Oncapture&lt;br /&gt;
 Dim Zaehlerdifferenz As Word , Gestartet As Byte , Signal As Byte , Zeit As Single , V As Single&lt;br /&gt;
 Dim Umfang As Single , Weg As Single , Wegkm As Single , Ad As Byte&lt;br /&gt;
 Dim Cap As Word , Capalt As Word , Z As Word&lt;br /&gt;
 Dim I As Word , D As Word&lt;br /&gt;
 Dim Watchdog1 As Word&lt;br /&gt;
 Dim Gesamtweg As Single , Gesamtwegkm As Single , Vmax As Single&lt;br /&gt;
 Dim Vmittel As Single , Gesamtzeit As Single , Gesamtzeitmin As Word&lt;br /&gt;
 Declare Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
 &#039;Zahlen formatieren mit n Nachkommastellen und g Gesamtstellen einschl Komma und Leerzeichen&lt;br /&gt;
 Ddrb = &amp;amp;B00001110&lt;br /&gt;
 Portb = &amp;amp;B11110001                                         &#039; portb.0 ist eingang&lt;br /&gt;
 Ddrc = &amp;amp;B00000000&lt;br /&gt;
 Portc = 255&lt;br /&gt;
 &lt;br /&gt;
 Admux = &amp;amp;B01100000 &#039;bit 7 u. 6 aref intern bit 5 nur 8 bit  3..0: adc0&lt;br /&gt;
 Adcsra = &amp;amp;B11100010 &#039; adcan start  frei  clock/4&lt;br /&gt;
 &lt;br /&gt;
 Tccr1a = &amp;amp;B00000000&lt;br /&gt;
 Tccr1b = &amp;amp;B11000101                                        &#039;bit 6=1 steigende flanke 3600 pro sekunde&lt;br /&gt;
 Timsk.ticie1 = 1  &#039;bit 5 capture interrupt ein&lt;br /&gt;
 Sreg.7 = 1        &#039; Interrrupts ein                                         &#039;kein Compare-Modus&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
  Lcd &amp;quot;Tempo: &amp;quot;&lt;br /&gt;
  Lowerline&lt;br /&gt;
  Lcd &amp;quot;Weg  :&amp;quot;&lt;br /&gt;
  Taster1 Alias Pinb.0&lt;br /&gt;
  Taster2 Alias Pinc.5&lt;br /&gt;
  Ledgruen Alias Portb.2&lt;br /&gt;
  Ledrot Alias Portb.3&lt;br /&gt;
  Speaker Alias Portb.5&lt;br /&gt;
         Weg = 0&lt;br /&gt;
         Cls&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = 0&lt;br /&gt;
        Do&lt;br /&gt;
                                     &#039;nur beim Start den Umfang lesen&lt;br /&gt;
                 Ad = Adch&lt;br /&gt;
                 Umfang = Ad / 255&lt;br /&gt;
                 Umfang = Umfang * 300&lt;br /&gt;
                 Home&lt;br /&gt;
                 Lcd &amp;quot;Umfang: &amp;quot; ; Fusing(umfang , &amp;quot;#.#&amp;quot;) ; &amp;quot; cm  &amp;quot;&lt;br /&gt;
                 Lowerline&lt;br /&gt;
                 Lcd &amp;quot;Poti1 drehen&amp;quot;&lt;br /&gt;
                 Waitms 20&lt;br /&gt;
                 Umfang = Umfang / 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Loop Until Zaehlerdifferenz &amp;gt; 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Z = 1&lt;br /&gt;
  Vmax = 0&lt;br /&gt;
  Watchdog1 = 0&lt;br /&gt;
   Cls&lt;br /&gt;
  Do&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        If Taster2 = 0 Then                                 &#039;kurzer Tastendruck schaltet Anzeige weiter&lt;br /&gt;
                     D = 0&lt;br /&gt;
                     Do&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     D = D + 1&lt;br /&gt;
                     Loop Until Taster2 = 1 Or D &amp;gt;= 30&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     If D &amp;lt; 30 Then&lt;br /&gt;
                     Z = Z + 1&lt;br /&gt;
                     Else&lt;br /&gt;
                     If Z = 1 Then Weg = 0                  &#039;langer Tastendruck löscht die Werte&lt;br /&gt;
                     If Z = 2 Then Gesamtweg = 0&lt;br /&gt;
                     If Z = 3 Then Vmax = 0&lt;br /&gt;
                       Do&lt;br /&gt;
                       Loop Until Taster2 = 1               &#039;gegen Prellen, sonst schaltet er weiter&lt;br /&gt;
                     End If&lt;br /&gt;
                     If Z &amp;gt; 4 Then Z = 1&lt;br /&gt;
                     Cls&lt;br /&gt;
 &lt;br /&gt;
        End If&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
      If Zeit &amp;gt; 0 Then V = Umfang / Zeit&lt;br /&gt;
        V = V * 3.6&lt;br /&gt;
       If V &amp;lt; 3 Then V = 0&lt;br /&gt;
       If V &amp;gt; 99 Then V = 0&lt;br /&gt;
       If V &amp;gt; Vmax Then Vmax = V&lt;br /&gt;
       If Gesamtzeit &amp;lt; 5 Then Vmax = 0                      &#039; Störimpulse beim Start werden so vermieden&lt;br /&gt;
 &lt;br /&gt;
        Watchdog1 = Watchdog1 + 1                             &#039;wenn keine Impulse mehr kommen, soll die Anzeige&lt;br /&gt;
                                                            &#039;nicht auf dem letzten Wert stehen bleiben&lt;br /&gt;
       If Watchdog1 &amp;gt; 40 Then V = 0                          &#039; sondern v=Null anzeigen&lt;br /&gt;
      Wegkm = Weg / 1000&lt;br /&gt;
      Gesamtwegkm = Gesamtweg / 1000&lt;br /&gt;
        Vmittel = Weg / Gesamtzeit&lt;br /&gt;
 &lt;br /&gt;
        Vmittel = Vmittel * 3.6&lt;br /&gt;
         &#039; Ledgruen = 1&lt;br /&gt;
 &lt;br /&gt;
          Home&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
           Lcd &amp;quot;Tempo :&amp;quot; ; Form(v , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
            Lowerline&lt;br /&gt;
            Select Case Z&lt;br /&gt;
            Case 1 : Lcd &amp;quot;Weg   :&amp;quot; ; Form(wegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 2 : Lcd &amp;quot;Gesamt:&amp;quot; ; Form(gesamtwegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 3 : Lcd &amp;quot;Max   :&amp;quot; ; Form(vmax , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
            Case 4 : Lcd &amp;quot;Mittel:&amp;quot; ; Form(vmittel , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
             End Select&lt;br /&gt;
            &#039; Ledgruen = 0&lt;br /&gt;
            Waitms 20                                       &#039;20&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Loop&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Oncapture:&lt;br /&gt;
       Cap = Capture1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = Cap - Capalt&lt;br /&gt;
 &lt;br /&gt;
       Capalt = Cap&lt;br /&gt;
         Zeit = Zaehlerdifferenz&lt;br /&gt;
       Zeit = Zeit / 3600&lt;br /&gt;
       If V &amp;gt; 0 Then&lt;br /&gt;
                  Gesamtzeit = Gesamtzeit + Zeit&lt;br /&gt;
 &lt;br /&gt;
                 Weg = Weg + Umfang&lt;br /&gt;
                 Gesamtweg = Gesamtweg + Umfang&lt;br /&gt;
         End If&lt;br /&gt;
      Gesamtzeitmin = Gesamtzeit / 60&lt;br /&gt;
       Watchdog1 = 0&lt;br /&gt;
       Ledrot = 1                                           &#039;Impulsanzeige&lt;br /&gt;
       Waitms 10&lt;br /&gt;
       Ledrot = 0&lt;br /&gt;
       &#039;Sound Speaker , 200 , 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Tifr.3 = 0                                          &#039; verhindert bei Prellen Mehrfachinterrupt&lt;br /&gt;
  Return&lt;br /&gt;
 &lt;br /&gt;
 Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
  Local S1 As String * 16&lt;br /&gt;
 &lt;br /&gt;
    If N = 1 Then S1 = Fusing(v1 , &amp;quot;#.#&amp;quot;)&lt;br /&gt;
    If N = 3 Then S1 = Fusing(v1 , &amp;quot;#.###&amp;quot;)&lt;br /&gt;
    S1 = &amp;quot;    &amp;quot; + S1&lt;br /&gt;
  Form = Right(s1 , G)&lt;br /&gt;
  End Function&lt;br /&gt;
 End&lt;br /&gt;
== In Arbeit ==&lt;br /&gt;
* Logging&lt;br /&gt;
* Xmodem Protoll zur Datenübertragung&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Sensordatenfilterung&lt;br /&gt;
* [[NMEA]]-Auswertung&lt;br /&gt;
* Stromverbrauch senken (siehe auch [[Ultra low power]])&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-1-79785.html Thread im Forum zur Seite]&lt;br /&gt;
*[[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
*[http://homepages.compuserve.de/SIGIBORST/ Fahrradcomputer mit Pulsmesser]&lt;br /&gt;
*[http://www.avrfreaks.net/Freaks/freakshow.php?keyword_is_id=1&amp;amp;keywords=10 Variometer] bei avrfreaks.net&lt;br /&gt;
*[http://www.circuitcellar.com/avr2004/DA1300.html Variometer-Altimeter for Free Flying] bei www.circuitcellar.com&lt;br /&gt;
*[[AVR Butterfly]]&lt;br /&gt;
&lt;br /&gt;
*http://veloace.sf.net Palm fahrradcomputer&lt;br /&gt;
*[http://thinksilicon.de/53/PDA-Fahrradtacho-VeloAce.html Palm Fahrradcomputer HowTo]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>31.19.166.87</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64854</id>
		<title>Fahrradcomputer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64854"/>
		<updated>2012-03-08T17:27:32Z</updated>

		<summary type="html">&lt;p&gt;31.19.166.87: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Features =&lt;br /&gt;
&lt;br /&gt;
* Kilometerzähler                                                                                 &lt;br /&gt;
** Gesamtstrecke&lt;br /&gt;
** Tourstrecke &lt;br /&gt;
** Tagesstrecke&lt;br /&gt;
** Strecke seit der letzten Pause&lt;br /&gt;
* Geschwindigkeitsmessung&lt;br /&gt;
** Momentangeschwindigkeit&lt;br /&gt;
** Tourmittel&lt;br /&gt;
** Tagesmittel&lt;br /&gt;
** Mittel seit der letzten Pause&lt;br /&gt;
* Kurbeldrehzahl&lt;br /&gt;
* Temperatur                                                                              &lt;br /&gt;
* Uhrzeit&lt;br /&gt;
* Akkuspannungsüberwachung&lt;br /&gt;
* Pulsfrequenzmessung&lt;br /&gt;
* Vertikalgeschwindigkeit&lt;br /&gt;
* Lesen des NMEA-Outputs von GPS-Empfängern&lt;br /&gt;
* Logging der Daten im ser.Flash des Butterfly oder einer MMC.&lt;br /&gt;
* Kommunikation mit PC zum Datenauslesen&lt;br /&gt;
&lt;br /&gt;
Die Messung der Radumdrehung soll außer der Reedkontaktmethode auch über die Frequenz des [http://www.nabendynamo.de/detail.htm Schmidt-Nabendynamos] möglich sein.&lt;br /&gt;
&lt;br /&gt;
= Offene Punkte/Fragen =&lt;br /&gt;
&lt;br /&gt;
* Die Verwendung von printf aus der gcclib kostet 5k Flash und braucht manchmal etwas RAM. Dafür ist es bequem. Oder doch besser eine LowCost-Lösung?&lt;br /&gt;
&lt;br /&gt;
= Target =&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Butterfly|Butterfly]]&lt;br /&gt;
* [[ATmega]]* mit externem Display&lt;br /&gt;
* ATtiny* ohne Display&lt;br /&gt;
&lt;br /&gt;
= Funktionsdetails =&lt;br /&gt;
&lt;br /&gt;
== System Timer ==&lt;br /&gt;
&lt;br /&gt;
Der Timer2 erzeugt aus dem 38kHz-Oszillatortakt einen periodischen Interrupt im 1/4 Sekunden Abstand.&lt;br /&gt;
&lt;br /&gt;
== Menu ==&lt;br /&gt;
&lt;br /&gt;
Auswahl der Anzeige über Up/Down. Kurze Zeit wird die Funktion als Text angezeigt, danach der Zahlenwert.&lt;br /&gt;
Mit Left wird der Funktionstext erneut angezeigt.&lt;br /&gt;
Right führt zu einem ev. Submenü der Funktion.&lt;br /&gt;
&lt;br /&gt;
== Entfernungsmessung ==&lt;br /&gt;
&lt;br /&gt;
Der Radumfang wird in 1/256 Metern gespeichert. Dieser wird bei jeder Radumdrehung zum Gesamt(kilo)meterzähler addiert.&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt am Rad löst einen Interrupt aus. Zum Sonderfall &amp;quot;stehendes Rad und Reedkontakt geschlossen&amp;quot; siehe [http://www.mikrocontroller.net/topic/93779#812975 Forenbeitrag] von Thomas.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des SON als Tachogeber ===&lt;br /&gt;
&lt;br /&gt;
Frequenzbereich: 5 Hz - 200 Hz (geschätzt, muss noch gemessen werden). Schaltungsvorschlag zur Frequenzmessung des Nabendynamos und damit auch zur Geschwindigkeitsmessung: &lt;br /&gt;
&lt;br /&gt;
[[bild:son_diode.png|SON Frequenzmessung]]&lt;br /&gt;
&lt;br /&gt;
[[Media:son_diode.sch|EAGLE-Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsmessung ==&lt;br /&gt;
&lt;br /&gt;
Bei jedem Radinterrupt wird der Timer2 und die Systime ausgelesen.&lt;br /&gt;
Mit Timer2prescaler 32 ergibt sich eine Auflösung von 1/1024 Sekunden.&lt;br /&gt;
&lt;br /&gt;
Die maximale Geschwindigkeit wird mit 30 m/s festgelegt. Daraus folgt bei einem 20 Zoll Rad eine maximale Raddrehzahl von ca. 17 Hz (min. Peridendauer &amp;gt; 50ms). Die Körnigkeit der Messung liegt also bei der Maximalgeschwindigkeit so in der Gegend von 2%.&lt;br /&gt;
&lt;br /&gt;
Hallo. Bei 30 m/s fährst Du somit rund 108km /h; etwas gar viel für ein Velo. Mit dem Rennrad machst Du bergab maximal einen 70, somit reichen rund 20m/s als Maximalgeschwindigkeit :-)&lt;br /&gt;
&lt;br /&gt;
Kommentar von Magnetus:&lt;br /&gt;
&lt;br /&gt;
Ich habe in meiner Jugend auf meinem Rennrad bergab mal 98 km/h geschafft. Ein Spitzenwert von 108 km/h ist also gar nicht so abwegig.&lt;br /&gt;
&lt;br /&gt;
== Kurbeldrehzahl ==&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt geht auch auf einen Interrupteingang.&lt;br /&gt;
&lt;br /&gt;
== Temperatur ==&lt;br /&gt;
&lt;br /&gt;
Der Butterfly hat einen NTC an einem Analogport.&lt;br /&gt;
&lt;br /&gt;
== Uhrzeit ==&lt;br /&gt;
&lt;br /&gt;
Die Uhrzeit wird nicht wie beim Butterfly-Demo in Sekunden-, Minuten- und Stundenvariablen sondern als 1/4-Sekundenzähler gespeichert. Soll die Uhrzeit angezeigt werden, wird eine Umrechnungsfunktion aufgerufen.&lt;br /&gt;
&lt;br /&gt;
== Vertikalgeschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Die absolute Höhe ist uninteressant.&lt;br /&gt;
Aus der Vertikalgeschwindigkeit kann die Steigung und die Steigleistung ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Wie bei den Variometern der Segel- und Drachenflieger wird die Ausgangsspannung eines Drucksensors differenziert.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnte man auch die Steigung direkt messen. Bob Pease schreibt in der Electronic Design September 2004, dass er sowas für seine Nepaltour gebaut hatte. Bergauf hätte es aber wg. des Gewackels nicht funktioniert (vermutlich fährt er ein gefedertes Mountainbike). Schaltungsdetails hat er kein angegeben, nur, dass er ein Öl-Fett-Gemisch als Dämpfer verwendet.&lt;br /&gt;
&lt;br /&gt;
Vielleicht kann man sowas auch nach dem Wasserwaagenprinzip bauen.&lt;br /&gt;
&lt;br /&gt;
Es wäre auch eine Alternative einen Beschleunigungssensor zu verwenden und den Ausgang durch Mittelwertbildung zu glätten. Hier können dann verschiedene Softwarefilter ohne großen Aufwand getestet werden.&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
Alle Daten werden in einer Reihe gespeichert.&lt;br /&gt;
Die Art des Eintrags wird anhand einer 4-bit ID bestimmt.&lt;br /&gt;
Dannach folgen 12 Bit Daten.&lt;br /&gt;
Die kleinste Zeiteinheit im Logging, die Logging Unit, ist 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
=== Timestamp ===&lt;br /&gt;
Die Timestamp enthält die Zeit in Vielfachen von 256 Logging Units.&lt;br /&gt;
&lt;br /&gt;
| ID | Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Deltatimestamp ===&lt;br /&gt;
Das ist kein eigener Loggingeintrag, sondern Teil der sich unregelmäßig ändernden Loggingeinträge, wie Temperatur oder Puls. Es werden die letzten 8 bit der Zeit in Logging Units gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Entfernung ===&lt;br /&gt;
Die Entfernungsdaten werden in einem festen Zeitintervall, der Logging Unit, gespeichert.&lt;br /&gt;
Sollte es zu Aussetzern kommen (z.&amp;amp;nbsp;B. weil das Fahrzeug steht), wird vor dem neuen Eintrag ein Timestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Entfernungsdifferenz |&lt;br /&gt;
&lt;br /&gt;
=== Trittfrequenz ===&lt;br /&gt;
Die Trittfrequenz wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Frequenz | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Temperatur ===&lt;br /&gt;
Die Temperatur wird normalerweise als Änderung gegenüber der vorhergehenden Temperatureintrag gespeichert. Gelegentlich wird die tatsächliche Temperatur ohne Deltatimestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Temperature | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
| ID | Temperatur |&lt;br /&gt;
&lt;br /&gt;
=== Puls ===&lt;br /&gt;
Der Puls wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Puls geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Puls | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
== GPS-Connection ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die NMEA-Daten eingelesen. Damit kann die Uhr gestellt werden und Position und Höhe mitgeloggt werden. Über die Geschwindigkeitsdaten kann die Kalibration des Raddurchmessers eingestellt bzw. überprüft werden. Die Höhendaten können den Luftdrucksensor unterstützen im Sinne eines Multisensor-Konzepts.&lt;br /&gt;
&lt;br /&gt;
== PC-Kommunikation ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die geloggten Daten auf den PC übertragen.&lt;br /&gt;
&lt;br /&gt;
Eventuell Kommunikation mit einem W-Lan oder BT Modul zu einem PC.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warnung:&#039;&#039;&#039; Das ist kein fertiger Radcomputer, sondern eine Diskussionsgrundlage für die Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[[Media:Radcomputer-0.0.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039;fertiger Radcomputer, Fragen an volkerblock at t-online.de&lt;br /&gt;
 &#039;mit timer1 capture&lt;br /&gt;
 &#039;Volker Block 10.02.2008&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039; fahrradcapturecomfort.bas                 FAHRRADCOMPUTER MIT MYAVR AVR M8&lt;br /&gt;
 &#039;Eingang für das Poti (Radumfang) ist PC0&lt;br /&gt;
  &#039; Taster1 PORTB.0 wird durch ein Reedrelais (Schließer) ersetzt, betätigt durch einen Magneten&lt;br /&gt;
 &#039;am Vorderrad (Teil von altem Fahrradcomputer)&lt;br /&gt;
 &#039;taster2 PORTC.5 wählt die Anzeige aus, langer Tastendruck löscht den jeweiligen Wert&lt;br /&gt;
 &#039; zu Beginn kann mit dem Poti1 PORTC.0 der Radumfang eingegeben werden.&lt;br /&gt;
 &#039; 4 K Größe (Demo Version)wird ausgenutzt, es sind keine Erweiterungen möglich&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 3686400&lt;br /&gt;
 &#039;groß genug wählen, sonst Absturz&lt;br /&gt;
 $hwstack = 52                                               &#039; default use 32 for the hardware stack&lt;br /&gt;
 &lt;br /&gt;
 $swstack = 20                                               &#039; default use 10 for the SW stack&lt;br /&gt;
 &lt;br /&gt;
 $framesize = 60                                             &#039; default use 40 for the frame space&lt;br /&gt;
 &lt;br /&gt;
 On Icp1 Oncapture&lt;br /&gt;
 Dim Zaehlerdifferenz As Word , Gestartet As Byte , Signal As Byte , Zeit As Single , V As Single&lt;br /&gt;
 Dim Umfang As Single , Weg As Single , Wegkm As Single , Ad As Byte&lt;br /&gt;
 Dim Cap As Word , Capalt As Word , Z As Word&lt;br /&gt;
 Dim I As Word , D As Word&lt;br /&gt;
 Dim Watchdog1 As Word&lt;br /&gt;
 Dim Gesamtweg As Single , Gesamtwegkm As Single , Vmax As Single&lt;br /&gt;
 Dim Vmittel As Single , Gesamtzeit As Single , Gesamtzeitmin As Word&lt;br /&gt;
 Declare Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
 &#039;Zahlen formatieren mit n Nachkommastellen und g Gesamtstellen einschl Komma und Leerzeichen&lt;br /&gt;
 Ddrb = &amp;amp;B00001110&lt;br /&gt;
 Portb = &amp;amp;B11110001                                         &#039; portb.0 ist eingang&lt;br /&gt;
 Ddrc = &amp;amp;B00000000&lt;br /&gt;
 Portc = 255&lt;br /&gt;
 &lt;br /&gt;
 Admux = &amp;amp;B01100000&lt;br /&gt;
 Adcsra = &amp;amp;B11100010&lt;br /&gt;
 &lt;br /&gt;
 Tccr1a = &amp;amp;B00000000&lt;br /&gt;
 Tccr1b = &amp;amp;B11000101                                        &#039;bit 6=1 steigende flanke 3600 pro sekunde&lt;br /&gt;
 Timsk.ticie1 = 1&lt;br /&gt;
 Sreg.7 = 1                                                 &#039;kein Compare-Modus&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
  Lcd &amp;quot;Tempo: &amp;quot;&lt;br /&gt;
  Lowerline&lt;br /&gt;
  Lcd &amp;quot;Weg  :&amp;quot;&lt;br /&gt;
  Taster1 Alias Pinb.0&lt;br /&gt;
  Taster2 Alias Pinc.5&lt;br /&gt;
  Ledgruen Alias Portb.2&lt;br /&gt;
  Ledrot Alias Portb.3&lt;br /&gt;
  Speaker Alias Portb.5&lt;br /&gt;
         Weg = 0&lt;br /&gt;
         Cls&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = 0&lt;br /&gt;
        Do&lt;br /&gt;
                                     &#039;nur beim Start den Umfang lesen&lt;br /&gt;
                 Ad = Adch&lt;br /&gt;
                 Umfang = Ad / 255&lt;br /&gt;
                 Umfang = Umfang * 300&lt;br /&gt;
                 Home&lt;br /&gt;
                 Lcd &amp;quot;Umfang: &amp;quot; ; Fusing(umfang , &amp;quot;#.#&amp;quot;) ; &amp;quot; cm  &amp;quot;&lt;br /&gt;
                 Lowerline&lt;br /&gt;
                 Lcd &amp;quot;Poti1 drehen&amp;quot;&lt;br /&gt;
                 Waitms 20&lt;br /&gt;
                 Umfang = Umfang / 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Loop Until Zaehlerdifferenz &amp;gt; 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Z = 1&lt;br /&gt;
  Vmax = 0&lt;br /&gt;
  Watchdog1 = 0&lt;br /&gt;
   Cls&lt;br /&gt;
  Do&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        If Taster2 = 0 Then                                 &#039;kurzer Tastendruck schaltet Anzeige weiter&lt;br /&gt;
                     D = 0&lt;br /&gt;
                     Do&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     D = D + 1&lt;br /&gt;
                     Loop Until Taster2 = 1 Or D &amp;gt;= 30&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     If D &amp;lt; 30 Then&lt;br /&gt;
                     Z = Z + 1&lt;br /&gt;
                     Else&lt;br /&gt;
                     If Z = 1 Then Weg = 0                  &#039;langer Tastendruck löscht die Werte&lt;br /&gt;
                     If Z = 2 Then Gesamtweg = 0&lt;br /&gt;
                     If Z = 3 Then Vmax = 0&lt;br /&gt;
                       Do&lt;br /&gt;
                       Loop Until Taster2 = 1               &#039;gegen Prellen, sonst schaltet er weiter&lt;br /&gt;
                     End If&lt;br /&gt;
                     If Z &amp;gt; 4 Then Z = 1&lt;br /&gt;
                     Cls&lt;br /&gt;
 &lt;br /&gt;
        End If&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
      If Zeit &amp;gt; 0 Then V = Umfang / Zeit&lt;br /&gt;
        V = V * 3.6&lt;br /&gt;
       If V &amp;lt; 3 Then V = 0&lt;br /&gt;
       If V &amp;gt; 99 Then V = 0&lt;br /&gt;
       If V &amp;gt; Vmax Then Vmax = V&lt;br /&gt;
       If Gesamtzeit &amp;lt; 5 Then Vmax = 0                      &#039; Störimpulse beim Start werden so vermieden&lt;br /&gt;
 &lt;br /&gt;
        Watchdog1 = Watchdog1 + 1                             &#039;wenn keine Impulse mehr kommen, soll die Anzeige&lt;br /&gt;
                                                            &#039;nicht auf dem letzten Wert stehen bleiben&lt;br /&gt;
       If Watchdog1 &amp;gt; 40 Then V = 0                          &#039; sondern v=Null anzeigen&lt;br /&gt;
      Wegkm = Weg / 1000&lt;br /&gt;
      Gesamtwegkm = Gesamtweg / 1000&lt;br /&gt;
        Vmittel = Weg / Gesamtzeit&lt;br /&gt;
 &lt;br /&gt;
        Vmittel = Vmittel * 3.6&lt;br /&gt;
         &#039; Ledgruen = 1&lt;br /&gt;
 &lt;br /&gt;
          Home&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
           Lcd &amp;quot;Tempo :&amp;quot; ; Form(v , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
            Lowerline&lt;br /&gt;
            Select Case Z&lt;br /&gt;
            Case 1 : Lcd &amp;quot;Weg   :&amp;quot; ; Form(wegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 2 : Lcd &amp;quot;Gesamt:&amp;quot; ; Form(gesamtwegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 3 : Lcd &amp;quot;Max   :&amp;quot; ; Form(vmax , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
            Case 4 : Lcd &amp;quot;Mittel:&amp;quot; ; Form(vmittel , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
             End Select&lt;br /&gt;
            &#039; Ledgruen = 0&lt;br /&gt;
            Waitms 20                                       &#039;20&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Loop&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Oncapture:&lt;br /&gt;
       Cap = Capture1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = Cap - Capalt&lt;br /&gt;
 &lt;br /&gt;
       Capalt = Cap&lt;br /&gt;
         Zeit = Zaehlerdifferenz&lt;br /&gt;
       Zeit = Zeit / 3600&lt;br /&gt;
       If V &amp;gt; 0 Then&lt;br /&gt;
                  Gesamtzeit = Gesamtzeit + Zeit&lt;br /&gt;
 &lt;br /&gt;
                 Weg = Weg + Umfang&lt;br /&gt;
                 Gesamtweg = Gesamtweg + Umfang&lt;br /&gt;
         End If&lt;br /&gt;
      Gesamtzeitmin = Gesamtzeit / 60&lt;br /&gt;
       Watchdog1 = 0&lt;br /&gt;
       Ledrot = 1                                           &#039;Impulsanzeige&lt;br /&gt;
       Waitms 10&lt;br /&gt;
       Ledrot = 0&lt;br /&gt;
       &#039;Sound Speaker , 200 , 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Tifr.3 = 0                                          &#039; verhindert bei Prellen Mehrfachinterrupt&lt;br /&gt;
  Return&lt;br /&gt;
 &lt;br /&gt;
 Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
  Local S1 As String * 16&lt;br /&gt;
 &lt;br /&gt;
    If N = 1 Then S1 = Fusing(v1 , &amp;quot;#.#&amp;quot;)&lt;br /&gt;
    If N = 3 Then S1 = Fusing(v1 , &amp;quot;#.###&amp;quot;)&lt;br /&gt;
    S1 = &amp;quot;    &amp;quot; + S1&lt;br /&gt;
  Form = Right(s1 , G)&lt;br /&gt;
  End Function&lt;br /&gt;
 End&lt;br /&gt;
== In Arbeit ==&lt;br /&gt;
* Logging&lt;br /&gt;
* Xmodem Protoll zur Datenübertragung&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Sensordatenfilterung&lt;br /&gt;
* [[NMEA]]-Auswertung&lt;br /&gt;
* Stromverbrauch senken (siehe auch [[Ultra low power]])&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-1-79785.html Thread im Forum zur Seite]&lt;br /&gt;
*[[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
*[http://homepages.compuserve.de/SIGIBORST/ Fahrradcomputer mit Pulsmesser]&lt;br /&gt;
*[http://www.avrfreaks.net/Freaks/freakshow.php?keyword_is_id=1&amp;amp;keywords=10 Variometer] bei avrfreaks.net&lt;br /&gt;
*[http://www.circuitcellar.com/avr2004/DA1300.html Variometer-Altimeter for Free Flying] bei www.circuitcellar.com&lt;br /&gt;
*[[AVR Butterfly]]&lt;br /&gt;
&lt;br /&gt;
*http://veloace.sf.net Palm fahrradcomputer&lt;br /&gt;
*[http://thinksilicon.de/53/PDA-Fahrradtacho-VeloAce.html Palm Fahrradcomputer HowTo]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>31.19.166.87</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64853</id>
		<title>Fahrradcomputer</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Fahrradcomputer&amp;diff=64853"/>
		<updated>2012-03-08T17:12:56Z</updated>

		<summary type="html">&lt;p&gt;31.19.166.87: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Features =&lt;br /&gt;
&lt;br /&gt;
* Kilometerzähler                                                                                 &lt;br /&gt;
** Gesamtstrecke&lt;br /&gt;
** Tourstrecke &lt;br /&gt;
** Tagesstrecke&lt;br /&gt;
** Strecke seit der letzten Pause&lt;br /&gt;
* Geschwindigkeitsmessung&lt;br /&gt;
** Momentangeschwindigkeit&lt;br /&gt;
** Tourmittel&lt;br /&gt;
** Tagesmittel&lt;br /&gt;
** Mittel seit der letzten Pause&lt;br /&gt;
* Kurbeldrehzahl&lt;br /&gt;
* Temperatur                                                                              &lt;br /&gt;
* Uhrzeit&lt;br /&gt;
* Akkuspannungsüberwachung&lt;br /&gt;
* Pulsfrequenzmessung&lt;br /&gt;
* Vertikalgeschwindigkeit&lt;br /&gt;
* Lesen des NMEA-Outputs von GPS-Empfängern&lt;br /&gt;
* Logging der Daten im ser.Flash des Butterfly oder einer MMC.&lt;br /&gt;
* Kommunikation mit PC zum Datenauslesen&lt;br /&gt;
&lt;br /&gt;
Die Messung der Radumdrehung soll außer der Reedkontaktmethode auch über die Frequenz des [http://www.nabendynamo.de/detail.htm Schmidt-Nabendynamos] möglich sein.&lt;br /&gt;
&lt;br /&gt;
= Offene Punkte/Fragen =&lt;br /&gt;
&lt;br /&gt;
* Die Verwendung von printf aus der gcclib kostet 5k Flash und braucht manchmal etwas RAM. Dafür ist es bequem. Oder doch besser eine LowCost-Lösung?&lt;br /&gt;
&lt;br /&gt;
= Target =&lt;br /&gt;
&lt;br /&gt;
* [[AVR_Butterfly|Butterfly]]&lt;br /&gt;
* [[ATmega]]* mit externem Display&lt;br /&gt;
* ATtiny* ohne Display&lt;br /&gt;
&lt;br /&gt;
= Funktionsdetails =&lt;br /&gt;
&lt;br /&gt;
== System Timer ==&lt;br /&gt;
&lt;br /&gt;
Der Timer2 erzeugt aus dem 38kHz-Oszillatortakt einen periodischen Interrupt im 1/4 Sekunden Abstand.&lt;br /&gt;
&lt;br /&gt;
== Menu ==&lt;br /&gt;
&lt;br /&gt;
Auswahl der Anzeige über Up/Down. Kurze Zeit wird die Funktion als Text angezeigt, danach der Zahlenwert.&lt;br /&gt;
Mit Left wird der Funktionstext erneut angezeigt.&lt;br /&gt;
Right führt zu einem ev. Submenü der Funktion.&lt;br /&gt;
&lt;br /&gt;
== Entfernungsmessung ==&lt;br /&gt;
&lt;br /&gt;
Der Radumfang wird in 1/256 Metern gespeichert. Dieser wird bei jeder Radumdrehung zum Gesamt(kilo)meterzähler addiert.&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt am Rad löst einen Interrupt aus. Zum Sonderfall &amp;quot;stehendes Rad und Reedkontakt geschlossen&amp;quot; siehe [http://www.mikrocontroller.net/topic/93779#812975 Forenbeitrag] von Thomas.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung des SON als Tachogeber ===&lt;br /&gt;
&lt;br /&gt;
Frequenzbereich: 5 Hz - 200 Hz (geschätzt, muss noch gemessen werden). Schaltungsvorschlag zur Frequenzmessung des Nabendynamos und damit auch zur Geschwindigkeitsmessung: &lt;br /&gt;
&lt;br /&gt;
[[bild:son_diode.png|SON Frequenzmessung]]&lt;br /&gt;
&lt;br /&gt;
[[Media:son_diode.sch|EAGLE-Schaltplan]]&lt;br /&gt;
&lt;br /&gt;
== Geschwindigkeitsmessung ==&lt;br /&gt;
&lt;br /&gt;
Bei jedem Radinterrupt wird der Timer2 und die Systime ausgelesen.&lt;br /&gt;
Mit Timer2prescaler 32 ergibt sich eine Auflösung von 1/1024 Sekunden.&lt;br /&gt;
&lt;br /&gt;
Die maximale Geschwindigkeit wird mit 30 m/s festgelegt. Daraus folgt bei einem 20 Zoll Rad eine maximale Raddrehzahl von ca. 17 Hz (min. Peridendauer &amp;gt; 50ms). Die Körnigkeit der Messung liegt also bei der Maximalgeschwindigkeit so in der Gegend von 2%.&lt;br /&gt;
&lt;br /&gt;
Hallo. Bei 30 m/s fährst Du somit rund 108km /h; etwas gar viel für ein Velo. Mit dem Rennrad machst Du bergab maximal einen 70, somit reichen rund 20m/s als Maximalgeschwindigkeit :-)&lt;br /&gt;
&lt;br /&gt;
Kommentar von Magnetus:&lt;br /&gt;
&lt;br /&gt;
Ich habe in meiner Jugend auf meinem Rennrad bergab mal 98 km/h geschafft. Ein Spitzenwert von 108 km/h ist also gar nicht so abwegig.&lt;br /&gt;
&lt;br /&gt;
== Kurbeldrehzahl ==&lt;br /&gt;
&lt;br /&gt;
Der Reedkontakt geht auch auf einen Interrupteingang.&lt;br /&gt;
&lt;br /&gt;
== Temperatur ==&lt;br /&gt;
&lt;br /&gt;
Der Butterfly hat einen NTC an einem Analogport.&lt;br /&gt;
&lt;br /&gt;
== Uhrzeit ==&lt;br /&gt;
&lt;br /&gt;
Die Uhrzeit wird nicht wie beim Butterfly-Demo in Sekunden-, Minuten- und Stundenvariablen sondern als 1/4-Sekundenzähler gespeichert. Soll die Uhrzeit angezeigt werden, wird eine Umrechnungsfunktion aufgerufen.&lt;br /&gt;
&lt;br /&gt;
== Vertikalgeschwindigkeit ==&lt;br /&gt;
&lt;br /&gt;
Die absolute Höhe ist uninteressant.&lt;br /&gt;
Aus der Vertikalgeschwindigkeit kann die Steigung und die Steigleistung ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Wie bei den Variometern der Segel- und Drachenflieger wird die Ausgangsspannung eines Drucksensors differenziert.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnte man auch die Steigung direkt messen. Bob Pease schreibt in der Electronic Design September 2004, dass er sowas für seine Nepaltour gebaut hatte. Bergauf hätte es aber wg. des Gewackels nicht funktioniert (vermutlich fährt er ein gefedertes Mountainbike). Schaltungsdetails hat er kein angegeben, nur, dass er ein Öl-Fett-Gemisch als Dämpfer verwendet.&lt;br /&gt;
&lt;br /&gt;
Vielleicht kann man sowas auch nach dem Wasserwaagenprinzip bauen.&lt;br /&gt;
&lt;br /&gt;
Es wäre auch eine Alternative einen Beschleunigungssensor zu verwenden und den Ausgang durch Mittelwertbildung zu glätten. Hier können dann verschiedene Softwarefilter ohne großen Aufwand getestet werden.&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
Alle Daten werden in einer Reihe gespeichert.&lt;br /&gt;
Die Art des Eintrags wird anhand einer 4-bit ID bestimmt.&lt;br /&gt;
Dannach folgen 12 Bit Daten.&lt;br /&gt;
Die kleinste Zeiteinheit im Logging, die Logging Unit, ist 2 Sekunden.&lt;br /&gt;
&lt;br /&gt;
=== Timestamp ===&lt;br /&gt;
Die Timestamp enthält die Zeit in Vielfachen von 256 Logging Units.&lt;br /&gt;
&lt;br /&gt;
| ID | Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Deltatimestamp ===&lt;br /&gt;
Das ist kein eigener Loggingeintrag, sondern Teil der sich unregelmäßig ändernden Loggingeinträge, wie Temperatur oder Puls. Es werden die letzten 8 bit der Zeit in Logging Units gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Entfernung ===&lt;br /&gt;
Die Entfernungsdaten werden in einem festen Zeitintervall, der Logging Unit, gespeichert.&lt;br /&gt;
Sollte es zu Aussetzern kommen (z.&amp;amp;nbsp;B. weil das Fahrzeug steht), wird vor dem neuen Eintrag ein Timestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Entfernungsdifferenz |&lt;br /&gt;
&lt;br /&gt;
=== Trittfrequenz ===&lt;br /&gt;
Die Trittfrequenz wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Frequenz | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
=== Temperatur ===&lt;br /&gt;
Die Temperatur wird normalerweise als Änderung gegenüber der vorhergehenden Temperatureintrag gespeichert. Gelegentlich wird die tatsächliche Temperatur ohne Deltatimestamp geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Temperature | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
| ID | Temperatur |&lt;br /&gt;
&lt;br /&gt;
=== Puls ===&lt;br /&gt;
Der Puls wird, wie die Temperatur, als Änderung gegenüber dem vorhergehenden Wert gespeichert. Gelegentlich wird der tatsächliche Puls geschrieben.&lt;br /&gt;
&lt;br /&gt;
| ID | Delta Puls | Delta Timestamp |&lt;br /&gt;
&lt;br /&gt;
== GPS-Connection ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die NMEA-Daten eingelesen. Damit kann die Uhr gestellt werden und Position und Höhe mitgeloggt werden. Über die Geschwindigkeitsdaten kann die Kalibration des Raddurchmessers eingestellt bzw. überprüft werden. Die Höhendaten können den Luftdrucksensor unterstützen im Sinne eines Multisensor-Konzepts.&lt;br /&gt;
&lt;br /&gt;
== PC-Kommunikation ==&lt;br /&gt;
&lt;br /&gt;
Über RS232 werden die geloggten Daten auf den PC übertragen.&lt;br /&gt;
&lt;br /&gt;
Eventuell Kommunikation mit einem W-Lan oder BT Modul zu einem PC.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warnung:&#039;&#039;&#039; Das ist kein fertiger Radcomputer, sondern eine Diskussionsgrundlage für die Entwicklung.&lt;br /&gt;
&lt;br /&gt;
[[Media:Radcomputer-0.0.tar.gz]]&lt;br /&gt;
&#039;Eingang für das Poti (Radumfang) ist PC0&lt;br /&gt;
&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039;fertiger Radcomputer, Fragen an volkerblock at t-online.de&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 &#039; fahrradcapturecomfort.bas                 FAHRRADCOMPUTER MIT MYAVR AVR M8&lt;br /&gt;
 &lt;br /&gt;
 &#039;mit timer1 capture&lt;br /&gt;
 &#039;Volker Block 10.02.2008&lt;br /&gt;
 &#039; Taster1 wird durch ein Reedrelais (Schließer) ersetzt, betätigt durch einen Magneten&lt;br /&gt;
 &#039;am Vorderrad (Teil von altem Fahrradcomputer)&lt;br /&gt;
 &#039;taster2 wählt die Anzeige aus, langer Tastendruck löscht den jeweiligen Wert&lt;br /&gt;
 &#039; zu Beginn kann mit dem Poti1 der Radumfang eingegeben werden.&lt;br /&gt;
 &#039; 4 K Größe (Demo Version)wird ausgenutzt, es sind keine Erweiterungen möglich&lt;br /&gt;
 &#039;--------------------------------------------------------------&lt;br /&gt;
 $regfile = &amp;quot;m8def.dat&amp;quot;&lt;br /&gt;
 $crystal = 3686400&lt;br /&gt;
 &#039;groß genug wählen, sonst Absturz&lt;br /&gt;
 $hwstack = 52                                               &#039; default use 32 for the hardware stack&lt;br /&gt;
 &lt;br /&gt;
 $swstack = 20                                               &#039; default use 10 for the SW stack&lt;br /&gt;
 &lt;br /&gt;
 $framesize = 60                                             &#039; default use 40 for the frame space&lt;br /&gt;
 &lt;br /&gt;
 On Icp1 Oncapture&lt;br /&gt;
 Dim Zaehlerdifferenz As Word , Gestartet As Byte , Signal As Byte , Zeit As Single , V As Single&lt;br /&gt;
 Dim Umfang As Single , Weg As Single , Wegkm As Single , Ad As Byte&lt;br /&gt;
 Dim Cap As Word , Capalt As Word , Z As Word&lt;br /&gt;
 Dim I As Word , D As Word&lt;br /&gt;
 Dim Watchdog1 As Word&lt;br /&gt;
 Dim Gesamtweg As Single , Gesamtwegkm As Single , Vmax As Single&lt;br /&gt;
 Dim Vmittel As Single , Gesamtzeit As Single , Gesamtzeitmin As Word&lt;br /&gt;
 Declare Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
 &#039;Zahlen formatieren mit n Nachkommastellen und g Gesamtstellen einschl Komma und Leerzeichen&lt;br /&gt;
 Ddrb = &amp;amp;B00001110&lt;br /&gt;
 Portb = &amp;amp;B11110001                                         &#039; portb.0 ist eingang&lt;br /&gt;
 Ddrc = &amp;amp;B00000000&lt;br /&gt;
 Portc = 255&lt;br /&gt;
 &lt;br /&gt;
 Admux = &amp;amp;B01100000&lt;br /&gt;
 Adcsra = &amp;amp;B11100010&lt;br /&gt;
 &lt;br /&gt;
 Tccr1a = &amp;amp;B00000000&lt;br /&gt;
 Tccr1b = &amp;amp;B11000101                                        &#039;bit 6=1 steigende flanke 3600 pro sekunde&lt;br /&gt;
 Timsk.ticie1 = 1&lt;br /&gt;
 Sreg.7 = 1                                                 &#039;kein Compare-Modus&lt;br /&gt;
 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cls&lt;br /&gt;
  Lcd &amp;quot;Tempo: &amp;quot;&lt;br /&gt;
  Lowerline&lt;br /&gt;
  Lcd &amp;quot;Weg  :&amp;quot;&lt;br /&gt;
  Taster1 Alias Pinb.0&lt;br /&gt;
  Taster2 Alias Pinc.5&lt;br /&gt;
  Ledgruen Alias Portb.2&lt;br /&gt;
  Ledrot Alias Portb.3&lt;br /&gt;
  Speaker Alias Portb.5&lt;br /&gt;
         Weg = 0&lt;br /&gt;
         Cls&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = 0&lt;br /&gt;
        Do&lt;br /&gt;
                                     &#039;nur beim Start den Umfang lesen&lt;br /&gt;
                 Ad = Adch&lt;br /&gt;
                 Umfang = Ad / 255&lt;br /&gt;
                 Umfang = Umfang * 300&lt;br /&gt;
                 Home&lt;br /&gt;
                 Lcd &amp;quot;Umfang: &amp;quot; ; Fusing(umfang , &amp;quot;#.#&amp;quot;) ; &amp;quot; cm  &amp;quot;&lt;br /&gt;
                 Lowerline&lt;br /&gt;
                 Lcd &amp;quot;Poti1 drehen&amp;quot;&lt;br /&gt;
                 Waitms 20&lt;br /&gt;
                 Umfang = Umfang / 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Loop Until Zaehlerdifferenz &amp;gt; 0&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Z = 1&lt;br /&gt;
  Vmax = 0&lt;br /&gt;
  Watchdog1 = 0&lt;br /&gt;
   Cls&lt;br /&gt;
  Do&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        If Taster2 = 0 Then                                 &#039;kurzer Tastendruck schaltet Anzeige weiter&lt;br /&gt;
                     D = 0&lt;br /&gt;
                     Do&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     D = D + 1&lt;br /&gt;
                     Loop Until Taster2 = 1 Or D &amp;gt;= 30&lt;br /&gt;
                      Waitms 20&lt;br /&gt;
                     If D &amp;lt; 30 Then&lt;br /&gt;
                     Z = Z + 1&lt;br /&gt;
                     Else&lt;br /&gt;
                     If Z = 1 Then Weg = 0                  &#039;langer Tastendruck löscht die Werte&lt;br /&gt;
                     If Z = 2 Then Gesamtweg = 0&lt;br /&gt;
                     If Z = 3 Then Vmax = 0&lt;br /&gt;
                       Do&lt;br /&gt;
                       Loop Until Taster2 = 1               &#039;gegen Prellen, sonst schaltet er weiter&lt;br /&gt;
                     End If&lt;br /&gt;
                     If Z &amp;gt; 4 Then Z = 1&lt;br /&gt;
                     Cls&lt;br /&gt;
 &lt;br /&gt;
        End If&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
      If Zeit &amp;gt; 0 Then V = Umfang / Zeit&lt;br /&gt;
        V = V * 3.6&lt;br /&gt;
       If V &amp;lt; 3 Then V = 0&lt;br /&gt;
       If V &amp;gt; 99 Then V = 0&lt;br /&gt;
       If V &amp;gt; Vmax Then Vmax = V&lt;br /&gt;
       If Gesamtzeit &amp;lt; 5 Then Vmax = 0                      &#039; Störimpulse beim Start werden so vermieden&lt;br /&gt;
 &lt;br /&gt;
        Watchdog1 = Watchdog1 + 1                             &#039;wenn keine Impulse mehr kommen, soll die Anzeige&lt;br /&gt;
                                                            &#039;nicht auf dem letzten Wert stehen bleiben&lt;br /&gt;
       If Watchdog1 &amp;gt; 40 Then V = 0                          &#039; sondern v=Null anzeigen&lt;br /&gt;
      Wegkm = Weg / 1000&lt;br /&gt;
      Gesamtwegkm = Gesamtweg / 1000&lt;br /&gt;
        Vmittel = Weg / Gesamtzeit&lt;br /&gt;
 &lt;br /&gt;
        Vmittel = Vmittel * 3.6&lt;br /&gt;
         &#039; Ledgruen = 1&lt;br /&gt;
 &lt;br /&gt;
          Home&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
           Lcd &amp;quot;Tempo :&amp;quot; ; Form(v , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
            Lowerline&lt;br /&gt;
            Select Case Z&lt;br /&gt;
            Case 1 : Lcd &amp;quot;Weg   :&amp;quot; ; Form(wegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 2 : Lcd &amp;quot;Gesamt:&amp;quot; ; Form(gesamtwegkm , 3 , 6) ; &amp;quot; km&amp;quot;&lt;br /&gt;
            Case 3 : Lcd &amp;quot;Max   :&amp;quot; ; Form(vmax , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
            Case 4 : Lcd &amp;quot;Mittel:&amp;quot; ; Form(vmittel , 1 , 4) ; &amp;quot; km/h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
             End Select&lt;br /&gt;
            &#039; Ledgruen = 0&lt;br /&gt;
            Waitms 20                                       &#039;20&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Loop&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Oncapture:&lt;br /&gt;
       Cap = Capture1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
       Zaehlerdifferenz = Cap - Capalt&lt;br /&gt;
 &lt;br /&gt;
       Capalt = Cap&lt;br /&gt;
         Zeit = Zaehlerdifferenz&lt;br /&gt;
       Zeit = Zeit / 3600&lt;br /&gt;
       If V &amp;gt; 0 Then&lt;br /&gt;
                  Gesamtzeit = Gesamtzeit + Zeit&lt;br /&gt;
 &lt;br /&gt;
                 Weg = Weg + Umfang&lt;br /&gt;
                 Gesamtweg = Gesamtweg + Umfang&lt;br /&gt;
         End If&lt;br /&gt;
      Gesamtzeitmin = Gesamtzeit / 60&lt;br /&gt;
       Watchdog1 = 0&lt;br /&gt;
       Ledrot = 1                                           &#039;Impulsanzeige&lt;br /&gt;
       Waitms 10&lt;br /&gt;
       Ledrot = 0&lt;br /&gt;
       &#039;Sound Speaker , 200 , 100&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        Tifr.3 = 0                                          &#039; verhindert bei Prellen Mehrfachinterrupt&lt;br /&gt;
  Return&lt;br /&gt;
 &lt;br /&gt;
 Function Form(v1 As Single , Byval N As Byte , Byval G As Byte) As String&lt;br /&gt;
  Local S1 As String * 16&lt;br /&gt;
 &lt;br /&gt;
    If N = 1 Then S1 = Fusing(v1 , &amp;quot;#.#&amp;quot;)&lt;br /&gt;
    If N = 3 Then S1 = Fusing(v1 , &amp;quot;#.###&amp;quot;)&lt;br /&gt;
    S1 = &amp;quot;    &amp;quot; + S1&lt;br /&gt;
  Form = Right(s1 , G)&lt;br /&gt;
  End Function&lt;br /&gt;
 End&lt;br /&gt;
== In Arbeit ==&lt;br /&gt;
* Logging&lt;br /&gt;
* Xmodem Protoll zur Datenübertragung&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Sensordatenfilterung&lt;br /&gt;
* [[NMEA]]-Auswertung&lt;br /&gt;
* Stromverbrauch senken (siehe auch [[Ultra low power]])&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
*[http://www.mikrocontroller.net/forum/read-1-79785.html Thread im Forum zur Seite]&lt;br /&gt;
*[[Pulsuhrempfänger mit AVR Butterfly]]&lt;br /&gt;
*[http://homepages.compuserve.de/SIGIBORST/ Fahrradcomputer mit Pulsmesser]&lt;br /&gt;
*[http://www.avrfreaks.net/Freaks/freakshow.php?keyword_is_id=1&amp;amp;keywords=10 Variometer] bei avrfreaks.net&lt;br /&gt;
*[http://www.circuitcellar.com/avr2004/DA1300.html Variometer-Altimeter for Free Flying] bei www.circuitcellar.com&lt;br /&gt;
*[[AVR Butterfly]]&lt;br /&gt;
&lt;br /&gt;
*http://veloace.sf.net Palm fahrradcomputer&lt;br /&gt;
*[http://thinksilicon.de/53/PDA-Fahrradtacho-VeloAce.html Palm Fahrradcomputer HowTo]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Projekte]]&lt;/div&gt;</summary>
		<author><name>31.19.166.87</name></author>
	</entry>
</feed>