PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bordcomputer für Benzin-Roller



TomEdl
30.11.2008, 17:10
Hallo!

Ich möchte hier mein in Planung befindliches Projekt vorstellen. Es geht um die Realisierung eines Bordcomputers für einen Benzin-Roller. Der Roller ist im Prinzip ähnlich wie so ein kleiner Akku-Roller, hat nur im Gegensatz zu diesem einen kleinen Kolbenmotorantrieb (vom Hubraum her in etwa so wie eine kleine Motorsäge). Er ist zwar für den Straßenverkehr zugelassen, wird aber nur auf Privatgrund eingesetzt (damit fallen die STVO-Fragen weg).

Hier sind mal die Schaltpläne:
Blockschaltbild:
http://img91.imageshack.us/img91/7195/praesentationblockfi2.png
Spannungsversorgung:
http://img88.imageshack.us/img88/4750/praesentationversorgungjn1.png
µC:
http://img91.imageshack.us/img91/1606/praesentationucux5.png

Einige Fragen sind noch für mich zu klären, deshalb wende ich mich hier im Forum an euch. Es geht um folgendes:
1.) Nach Abschalten der Zündung (=Spannungsversorgung) sollen verschiedene Daten (Kilometerstand, Fahrzeit und ähnliches) in das interne EEPROM des AtMega8 geschrieben werden. Um die Versorgung des µCs zu puffern habe ich mir einen 1F/5,5V-Goldcap gekauft. Doch wie binde ich diesen am Besten ein? Außerdem habe ich eine Abschaltung des LCD-Displays über den Transistor T1 vorgesehen, wenn der Interrupt für "POWER-FAIL" kommt. Ist dies sinvoll?

2.) Die beiden Ports AIN0 und AIN1 sind nach meiner Planung für das erkennen des Spannungsausfalls zuständig. Wenn die Spannung an AIN0 kleiner ist als an AIN1 (4,2V) wird ein Interrupt ausgelöst. Ist dies so realisierbar.

3.) Kann die Diode D4 (im Versorgungs-Schaltplan) weggelassen werden, wenn ich den Abgriff für für R1/D5 vor D1 mache?

4.) Hab ich was generelles falsch gemacht?

Die Drehzahlerfassung erfolgt über das Reed-Relais K1. Dieses ist mit C3 (100nF KerKo) entprellt. Aufgrund der maximalen Geschwindigkeit des Rollers von ca. 25km/h (er fährt zwar schneller, aber das Ding ist dann relativ scher zu halten) und des Raddurchmessers von 30cm denke ich, dass ein Reed-Kontakt da schon mitkommt. Die Berechnung der Drehzahl habe ich mir wie folgt vorgestellt: Es werden nicht die Impule pro Sekunde gezählt, sondern die Zeit, die zwischen zwei Impulsen vergeht. Das sollte wesentlich schneller in der Berechnung sein, als die andere Methode.
Auf dem Display (4x16 Zeichen) sollen angezeigt werden:
* Geschwindigkeit
* Tages/Tourkilometer
* Gesamtkilometerstand
* Durchschnittsgeschwindigkeit
* Betriebszeit seit "Zündung Ein"
* Gesamtbetriebszeit
Die Navigation erfolgt über 4 Cursor-Tasten plus einer Enter-Taste. Damit lassen sich dann verschiedene Menüs anwählen.

Ich hoffe, ihr findet mein Projekt interessant und könnt mir Antworten auf meien Fragen geben, dafür gleich mal vielen Dank im Vorraus!

Freundliche Grüße aus Österreich,
Thomas

TomEdl
18.12.2008, 20:05
Hallo!

Ich habe nun ein wenig weitergeplant.

Der Abgriff für "POWER-FAIL" ist nun über einen Spannungsteiler und A/D-Wandler realisiert werden - womit sich auch die Möglichkeit ergibt, die Bordspannung über das Display anzeigen zu lassen. Die Pufferung der +5V hält mein Freund (hauptberuflich Elektroniker) für genügen, um ins EEPROM zu schreiben.
Ansonsten haben sich nur unwesentliche Dinge verändert.

Lg
Thomas

T.J.
18.12.2008, 22:05
gefällt, gefällt ;)

damaltor
05.01.2009, 17:09
Hallo TomEdl,

die kleine blaue Taste die du angeklickt hast, dient dazu einen Beitrag an die Moderatoren zu melden, wenn er unpassenden Inhalt hat. Ich denke aber nicht, dass du deinen beitrag gelöscht haben möchtest, oder? ;)

Euch allen noch ein frohes neues.

damaltor

TomEdl
05.01.2009, 17:14
Hallo Freunde der Mikrocontroller!

Noch steht der Roller meines Nachbarn nicht in meinem Bastelkeller aber das kommt die nächsten Tage noch. Inzwischen hab ich mal mit im gesprochen und so nebenbei teilte er mir mit, dass im Leerlauf der Scheinwerfer stark in der Helligkeit nachlässt. Jetzt wird mir wohl nichts anderes übrig bleiben als nachzumessen, gar fällt die Spannung unter 8V ab! Eventuell ist auch ein 6V-Bordnetz verwendet worden, dann wirds besonders schwierig. Wenn die oben gennanten Fälle eintreten, werd ich wohl den Bordcomputer über einen Akku fahren müssen. Die LEDs zur Unterbodenbleuchtung fallen dann natürlich weg.

Ich werd jetzt mal beginnen an der Dokumentation und am Quelltext zu schreiben, wenn ich fertig bin stelle ich beides hier zur Diskussion rein. Sollte dann die nächsten Tage der Roller bei mir im Keller stehen gehts ans Löten und an den Einbau. Aber bis dahin wird wohl noch ein klein wenig zeit vergehen... O:)

Mit freundlichen Grüßen aus Österreich
Thomas

TomEdl
05.01.2009, 19:28
Hallo TomEdl,

die kleine blaue Taste die du angeklickt hast, dient dazu einen Beitrag an die Moderatoren zu melden, wenn er unpassenden Inhalt hat. Ich denke aber nicht, dass du deinen beitrag gelöscht haben möchtest, oder? ;)

Euch allen noch ein frohes neues.

damaltor
Hallo damaltor!

Da ich versehentlich einen Doppelpost abgesetzt habe, wollte einen der doppelten Beiträge löschen. Anscheinend habe ich beim rumprobieren den "Beitrag melden"-Button erwischt. Tut mir leid, ich hoffe, dir damit keine allzu großen Umstände gemacht zu haben. Trotzdem würde ich dich bitten, den Beitrag zu löschen, da der selbe Text (sogar mit Bild) ja im darauffolgenden Beitrag steht.

Mit freundlichen Grüßen
Thomas

damaltor
05.01.2009, 20:13
alles klar, das hab ich übersehn. der beitrag ist gelöscht.

du kannst einen beitrag nur löschen, wenn er der letzte im thread ist (und dir gehört). dann ist oben rechts ein kleines kreuz.

viel spaß noch

TomEdl
05.01.2009, 20:20
alles klar, das hab ich übersehn. der beitrag ist gelöscht.

du kannst einen beitrag nur löschen, wenn er der letzte im thread ist (und dir gehört). dann ist oben rechts ein kleines kreuz.

viel spaß noch
Vielen Dank für die Löschung und den Hinweis! ;)

Mit freundlichen Grüßen
Thomas

TomEdl
07.01.2009, 16:46
Hallo!

Es hat sich viel getan, die Software ist schon zur Hälfte fertig und ich habe den Bau der Hardware schon vorbereitet.

Softwaretechnisch stellen sich mir noch einige Probleme, die ich aber sicher auch noch in nächster Zeit lösen werde. Der Flash ist schon zu 41% belegt, jetzt kommen aber noch die Masken für die LCD-Ausgabe - dieser Teil wird wohl auch noch den restlichen freier Speicher fressen, da ich draufgekommen bin, dass die Masken einen relativ großen Programmteil darstellen und auch sehr aufwändig und komplex zu programmieren sind (die erste Maske ist aber schon relativ fertig - d. h. das Grundgerüst steht schon).

Bei der Berechnung der Geschwindigkeit bin ich mir allerdings noch nicht ganz sicher. Laut meinen (schlechten) mathematischen Kenntnissen, kann ich dazu diese Formel verwenden:
v [m/s] = Zeit für eine Radumdrehung [s] / Radumfang [m]
Allerdings bin ich mir nicht sicher, ob das ganze nicht andersrum richtig ist, kann da mal bitte mehr drüberschauen?

Desweiteren habe ich beim Rumspielen mit dem Simulator irgendwie die Ports auf dem Bildschirm "Hardware simulation" verstellt, jetzt Initialisiert er das LCD nicht mehr richtig. Hat irgendjemand eine Ahnung wie man das wieder herstellen kann?

Jetzt fehlen nur noch die Ausgabemasken mit den Tasterabfragen, die Routine für das Lesen aus dem EEPROM, die Routine für das Speichern ins EEPROM, das Startbild, die Störungstexte und die Ansteuerung der Status-LEDs. Heute werd ich das ganze wohl nicht mehr schaffen (ich muss außerdem heute noch etwas lernen, morgen ist Test), allerdings bin ich mir sicher, dass ich Anfang nächster Woche ein ganzes Stück weiter bin. Es ist noch zu sagen, dass ich nicht die ganze Software am Stück schreibe, sondern das ich auch zwischendurch mal beginne, die Hardware zu bauen. So wird einem nicht langweilig ;).

Ich halte euch trotzdem weiter auf dem Laufendem!

MfG
Thomas

PS: Achja, es würde mich sehr freuen, wenn ich ein paar Meinungen von anderen Leuten hier bekommen würde, das motiviert ungemein. Können ja auch Hinweise oder Tipps sein, ich bin mir sicher, dass mir das ziemlich helfen würde. Leider ist in diesem Thread ja nicht gerade sehr viel los, irgendwie etwas eintönig, immer mit sich selbst zu reden. Vielleicht ist mein Projekt ja nun doch nicht so interessant....


;)

Vitis
07.01.2009, 18:26
also am LCD würd ich DB0-DB3 und RW nicht unbedingt auf ne
PWM legen ... ich denk das geht schief mit der Ansteuerung.

Was für LED willste denn verwenden?
Der BD139 kann als Dauerstrom 1,5A ab laut DB,
das wären dann 15mA maximal je LED ... schau mal ob du
nicht eher was in FET machen möchtest u.U.

Und dann ist da noch ...
wenn Du die LEDs mit ihren 1,5A auch noch über den
7805 ziehst maust Du den am Besten in der Winterzeit
unter Deinen Sitz, dann hast gleich nen schönen
Eierwärmer ... 7V x 1,5A gibt dann 10,5W an Heizleistung
den der abgeben muss. Ergo entweder Schaltregler
oder die LEDs vom 12V Bordnetz aus versorgen.

TomEdl
07.01.2009, 18:37
also am LCD würd ich DB0-DB3 und RW nicht unbedingt auf ne
PWM legen ... ich denk das geht schief mit der Ansteuerung.

Inzwischen liegen alle diese Anhschlüsse auf GND, vorher war dies aber nicht für eine PWM gedacht, sondern um das Display abzuschalten (nur weil der PIN PWM unterstützt muss ich sie ja nicht verwenden ;) ). Inzwischen mache ich das softwaremäßig.



Was für LED willste denn verwenden?
Der BD139 kann als Dauerstrom 1,5A ab laut DB,
das wären dann 15mA maximal je LED ... schau mal ob du
nicht eher was in FET machen möchtest u.U.
Es ist leider noch nicht ganz sicher, ob überhaupt LED's eingesetzt werden. Nach Aussagen vom Besitzer des Fahrzeuges scheint die Lichtmaschine den Geist aufgegeben zu haben, falls der Fall wirklich eintritt, spar ich mir die LEDs und betreibe den Bordcomputer lediglich mit Batterie.

MfG
Thomas

Vitis
07.01.2009, 18:40
Und dann ist da noch ...
wenn Du die LEDs mit ihren 1,5A auch noch über den
7805 ziehst maust Du den am Besten in der Winterzeit
unter Deinen Sitz, dann hast gleich nen schönen
Eierwärmer ... 7V x 1,5A gibt dann 10,5W an Heizleistung
den der abgeben muss. Ergo entweder Schaltregler
oder die LEDs vom 12V Bordnetz aus versorgen.

wenn die LiMa wirklich im Eimer ist kommste um das Austauschen nicht
herum, weil n Benzinroller halt Strom braucht, mindestens für die
Zündung, das Tagfahrlicht ist ja auch pflicht nicht zu vergessen und
das braucht ebenfalls elektrischen Strom, ergo, nix geht ohne
LiMa in welcher Form auch immer.

TomEdl
07.01.2009, 18:55
Deshalb fallen die LED's ja warscheinlich eh weg. Das sind momentan die geringsten Gedanken die ich mir mache. Mehr Probleme macht momentan die Software, bzw. der Simulator.

Der Roller funktioniert auch ohne Lichtmaschine. Eine Motorsäge hat doch auch keine LiMa, oder?

MfG
Thomas

Vitis
07.01.2009, 19:02
er hat ne Induktionsspule und nen Magneten auf der Kurbelwelle ...
Irgendwo macht auch die Kettensäge Strom oder verrat mir mal
wo der Zündfunke her kommen soll? Feuerstein?

TomEdl
07.01.2009, 19:05
er hat ne Induktionsspule und nen Magneten auf der Kurbelwelle ...
Irgendwo macht auch die Kettensäge Strom oder verrat mir mal
wo der Zündfunke her kommen soll? Feuerstein?
Wir sprachen ja von Lichtmaschine. Und genau in diesem Roller ist eine Art Kettensägenmotor drin.

Aber lassen wir uns nicht darüber streiten, das wäre ja sinnlos.

MfG
Thomas

patti16
07.01.2009, 20:01
ein Roller funktioniert ja auch nur mit einer Batterie ohne Generator sonst geht der auch aus.

Vitis
07.01.2009, 20:25
also ... n 2takter Benziner hat eine Zündkerze, oder?
Die Zündkerze braucht zum Zünden einen elektrischen Impuls, oder?
Was passiert wenn a) keine Batterie da ist und b) der
Stromerzeuger tot ist? ¿ na, wer weiß es ??????
Und was passiert wenn c) eine Batterie angeschlossen ist
nach einiger Zeit wenn der Motor immer schön Strom zieht
zum Zünden und die Batterie nicht nachgeladen wird????

Kettensägen haben keine LiMa dran, das wird irgendwo direkt
am Motor gemacht, da hängt n Magnet und Spulen dran
um Strom zu erzeugen ... kenn ich noch von Anno wasweisich
vom MoFa ... kennt das hier noch wer?

Ja richtig, war auch ein Zweitakter 1:50 Gemisch.

Und auch da gab es schon das Phänomen, dass auf einmal die
Mühle nicht mehr lief weil da ne Spule hin war
(oder jemand den Zündkerzenstecker geklaut hat ... war auch
mal so ne Mode)

TomEdl
07.01.2009, 20:30
Das ist kein Mofa und auch kein Moped, sondern das Ding ist ein Selbstbau. Wer weiß was da alles drin ist.
Aber hier gehts ja nicht um die Motoren, sondern um meinen Bordcomputer. Also können wir bitte diese Diskussion sein lassen?

MfG
Thomas

locked
07.01.2009, 21:41
Hallo Thomas,



Laut meinen (schlechten) mathematischen Kenntnissen, kann ich dazu diese Formel verwenden:
v [m/s] = Zeit für eine Radumdrehung [s] / Radumfang [m]
Allerdings bin ich mir nicht sicher, ob das ganze nicht andersrum richtig ist, kann da mal bitte mehr drüberschauen?

Wie du bereits selber bewiesen hast, ist diese Formel falsch, vergleiche doch einfach nur die Einheiten:

Geschwindigkeit, wie du richtig geschriebne hast, hat die SI Einheit „m/s“
Deine Formel dividiert aber die Zeit pro Radumdrehung [s] durch den Radumfang [m], was als Einheit des Ergebnisses „s/m“ zur folge hätte. Rein in Einheiten ausgedrückt würde die Gleichung also m/s = s/m ergeben, was irgendwie ein Widerspruch wäre ;-)

Zum Schaltplan allgemein kann ich nur empfehlen, da es sich um eine automotive Anwendung handelt, eine richtige Resetschaltung für den Mikroprozessor, wie in der Atmel application note empfohlen, zu verwenden. Im einfachsten Fall sollte ein R-C-D Kombination am RST Pin reichen. Eine Diode sollte man deshalb verwenden, da der RST Pin keine ESD Schutzdiode gegen die Versorgungsspannung, aufgrund der Hochvoltprogrammierung, intern besitzt.
Andernfalls kann ich dir jetzt schon versprechen, dass sich der Mikroprozessor durch Zündfunkeninduktionen ua. vermutlich des Öfteren unerwartet resetieren wird.

Freundliche Grüße, ebenfalls aus Österreich ;-)

Vitis
07.01.2009, 21:43
ich streite nicht, es geht um die
Spannungsversorgung seiner Gesamtkonstruktion
und somit ums Projekt 8-[ [-(

TomEdl
07.01.2009, 22:01
Hallo Thomas,



Laut meinen (schlechten) mathematischen Kenntnissen, kann ich dazu diese Formel verwenden:
v [m/s] = Zeit für eine Radumdrehung [s] / Radumfang [m]
Allerdings bin ich mir nicht sicher, ob das ganze nicht andersrum richtig ist, kann da mal bitte mehr drüberschauen?

Wie du bereits selber bewiesen hast, ist diese Formel falsch, vergleiche doch einfach nur die Einheiten:

Geschwindigkeit, wie du richtig geschriebne hast, hat die SI Einheit „m/s“
Deine Formel dividiert aber die Zeit pro Radumdrehung [s] durch den Radumfang [m], was als Einheit des Ergebnisses „s/m“ zur folge hätte. Rein in Einheiten ausgedrückt würde die Gleichung also m/s = s/m ergeben, was irgendwie ein Widerspruch wäre ;-)

Dachte ich mir doch! ;)


Hallo Thomas,
Zum Schaltplan allgemein kann ich nur empfehlen, da es sich um eine automotive Anwendung handelt, eine richtige Resetschaltung für den Mikroprozessor, wie in der Atmel application note empfohlen, zu verwenden. Im einfachsten Fall sollte ein R-C-D Kombination am RST Pin reichen. Eine Diode sollte man deshalb verwenden, da der RST Pin keine ESD Schutzdiode gegen die Versorgungsspannung, aufgrund der Hochvoltprogrammierung, intern besitzt.
Andernfalls kann ich dir jetzt schon versprechen, dass sich der Mikroprozessor durch Zündfunkeninduktionen ua. vermutlich des Öfteren unerwartet resetieren wird.

Es wird sowieso alles auf Batteriebetrieb hinauslaufen, trotzdem danke für deine Ausführungen. Ich denke, eine R-C-D-Kombination kann trotzdem nicht schaden (nagut, das D könntem an bei reinem Batteriebetrieb weglassen, es sind dann ja keine Induktivitäten im Spiel).

Bei der Software bin ich bereits um einiges weitergekommen, inzwischen sind schon 61% vom Programmspeicher voll. Es fehlen nur noch die Routinen für das Lesen und Speichern aus/in den EEPROM, die Störungsmeldungen und eine Maske. Außerdem müssen noch einige Werte geändert werden, zum Beispiel habe ich den Radumfang noch nicht (jetzt steht halt noch ein ausgedachter Wert drin, der so ungefähr hinkommen könnte).


ich streite nicht, es geht um die
Spannungsversorgung seiner Gesamtkonstruktion
und somit ums Projekt
Sry, ich bin momentan wohl etwas gereizt. Naja, was soll man sagen, die Schule geht halt wieder los.... :D


Freundliche Grüße, ebenfalls aus Österreich
Von wo genau, wenn man fragen darf? ;)

MfG
Thomas
;)
;)

locked
08.01.2009, 23:45
Hallo Thomas,

nun, ich würde Sagen, es sind keine offensichtlichen Induktivitäten im Spiel. Induktivitäten, wenn auch absolut unerwünscht, träten in jeder Schaltung, bedingt durch das Layout - oder die Verkabelung im Allgemeinen - immer auf, wodurch man sich prinzipiell immer etwas induziert werden kann.
Abgesehen von Induktionen, spielt auch die kapazitive Einstreuung, speziell bei hohen Spannungen und Frequenzen, eine nicht zu verachtende Rolle. Eingekoppelte Ströme können durchaus den Prozessor resetieren, oder in seiner Programmausführung beeinflussen, was mir bei einem Wechselrichter passiert ist.
Beide Phänomene träten in deiner Anwendung sehr deutlich auf, da ein Zündfunken ein massives elektromagnetisches Feld abstrahlt, welches unter umständen auch in einigen zehn Metern Entfernung, im Radio, durch ein „klacksen“ hörbar ist.
Davon ist auch ein batteriebetriebenes Gerät nicht sicher, auch wenn dessen Masse nicht mit dem Fahrzeug verbunden wird.
Inwiefern nun dass tatsächlich eine Auswirkung auf deine Schaltung hat, kannst du erst im Betreib feststellen, will damit aber nur Sagen, dass es nicht unwahrscheinlich ist, wie ich aus eigener Erfahrung feststellen musste.
Vorbeugen ist besser als Nachsicht ;)

Mit freundlichen Grüßen
Roland

TomEdl
11.01.2009, 18:03
Hallo!

Ich werde mal eine R-C-L-Kombination vorsehen, kostet ja nicht die Welt und Roland hat überzeugende Argumente in seinem letzten Beitrag geliefert. ;)

Inzwischen ist die Software schon relativ fertig, ich hab sie mal in den Anhang gepackt.

Folgende Zeilen machen mir noch etwas Gedanken:


'EEPROM LESEN
Readeeprom Kmges , 10
Readeeprom Kmtag , 20

Passen die beiden Variablen an die dafür vorgesehenen Stellen im EEPROM auch sicher hinein oder überschneiden sie sich? Der Simulator sagt zwar, dass es sich ausgeht aber ich trau ihm nicht so recht.



Toggle Stat_timer0
If Stat_timer0 = 1 Then Start Timer0 Else Stop Timer0

Tut der das wirklich?

Es fehlen noch:
* Ansteuerung der Status-LEDs
* Stromsparmodus (kommt nur, wenn ich die Schaltung per Batterie versorge)
* Störungstexte + Abfragen (kommen aber erst in V2.0)
* Eventuelle Menü-Erweiterungen

Die Hardware ist noch nicht fertiggestellt, der Roller steht noch immer nicht in meinem Keller. Aus diesem Grund habe ich auch noch keine Spannungsmessungen am Bordnetz durchführen können, welche über die Spannungsversorgung des Bordcomputers entscheiden.

MfG
Thomas

TomEdl
14.01.2009, 20:51
Hallo!

Nun habe ich begonnen an der Hardware zu arbeiten. Als erstes werde ich das Frontmodul für die Lenkermontage fertigen. Dieses wird aus Sperrholzplatten gefertigt und dann per zwei Schrauben am Lenker befestigt. Folgendes Bild verdeutlicht dies:
http://img232.imageshack.us/my.php?image=bild01ai9.jpg

Am Vorderrad werden Reed-Schalter und Magnet befestigt. Allererst wollte ich diese Komponenten am Hinterrad montieren, dann viel mir aber die Metallhalterung mit dem Loch am Vorderrad auf - dort lässt es sich natürlich einfacher montieren.
http://img232.imageshack.us/my.php?image=bild02hx6.jpg

An der Software sind noch einige Änderungen vorzunehmen. Zum Beispiel springt der v-Wert nicht auf 0 sondern bleibt auf dem letzten vorhandenen Wert stehen. Außerdem sind noch einige Abfragen zu ergänzen.

Gruß
Thomas

TomEdl
25.01.2009, 12:50
Hallo!

Die Hardware ist komplett fertig, bis auf einige Feinheiten. Allerdings macht mir die Software einige Probleme. Das Display läuft, ich kann auch schon durch die Menüs blättern und verschiedene Funktionen aufrufen. Allerdings tut sich puunkto Geschwindigkeit/Kilometerstand absolut gar nichts. Messungen haben ergeben, dass der Reed-Kontakt Int0 gegen Masse zieht (wie vorgesehen), aber anscheinend kein Interrupt ausgelöst wird, beziehnungsweise, es wird nicht in die Interruptroutine gesprungen. Weiters wäre eventuell noch ein Fehler in der Interruptroutine denkbar, besonders, was das Starten von Timer0 betrifft habe ich Zweifel, ob ich das wirklich richtig gelöst habe.

Zum Testen habe ich den Code etwas reduziert, die Tastenentprellung und einige Menüs wurden entfernt. Dies ist der Code, der momentan am AVR in Betrieb ist:


'Name:.............Bordcomputer
'Version:..........1.0a
'Datum:............11.01.2009
'Autor:............Thomas Edlinger
'---------------------------------
'Beschreibung: Bordcomputer
' Ausgabemasken: 0 | Grundbild
' 1 | Hauptmenü
' 2 | Einstellungen 1
' 3 | Einstellungen 2
' 4 | Status
' 5 | Störungstexte


$regfile = "m8def.dat"
$crystal = 1000000


'KONFIGURATION EINGÄNGE
Config Pind.2 = Input
Config Pind.3 = Input
Config Pinb.6 = Input
Config Pinb.7 = Input
Config Pind.5 = Input
Config Pinb.0 = Input
Config Pinc.0 = Input


'KONFIGURATION AUSGÄNGE
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.4 = Output
Config Portc.5 = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.2 = Output
Config Portc.1 = Output
Config Portb.2 = Output
Config Portb.1 = Output


'PULLUPS EINSCHALTEN
Portd.2 = 1
Portd.3 = 1
Portb.6 = 1
Portb.7 = 1
Portd.5 = 1
Portb.0 = 1


'VERGABE ALIAS-ADRESSEN
T_auf Alias Pind.3
T_ab Alias Pinb.6
T_links Alias Pinb.7
T_rechts Alias Pind.5
T_enter Alias Pinb.0
D1_betrieb Alias Portd.0
D2_busy Alias Portd.1
D3_stoerung Alias Portd.4



'VARIABLEN
Dim Adc_wert As Word
Dim Spg As Single
Dim Stat_timer0 As Bit
Dim Time_umdrehung_n As Long
Dim Time_umdrehung_ms As Long
Dim Time_umdrehung_s As Single
Dim Radumfang As Single
Dim V_meter_sekunde As Single
Dim V_kmh As Single
Dim Kmges As Single
Dim Kmtag As Single
Dim Spg_ausgabe As String * 5
Dim V_meter_sekunde_ausgabe As String * 4
Dim V_kmh_ausgabe As String * 4
Dim Kmges_ausgabe As String * 7
Dim Kmtag_ausgabe As String * 7
Dim Radumfang_ausgabe As String * 7
Dim Ausgabemaske As Byte
Dim Status As Bit
Dim Status_nr As Byte
Dim Auswahl As Byte
Dim Sparmodus As Bit
Radumfang = 0.628


'KONSTANTEN
Const Adc_faktor = 0.017578
Const V_faktor = 3.6


'KONFIGURATION INT0
Config Int0 = Falling
On Int0 Int0_isr


'KONFIGURATION ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'KONFIGURATION TIMER0
Config Timer0 = Timer , Prescale = 8
Timer0 = 131
On Timer0 Timer0_isr
Enable Timer0
Stop Timer0


'KONFIGURATION LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portb.2 , Rs = Portc.5 , E = Portc.4
Config Lcd = 16 * 4
Config Lcdbus = 4
Waitms 100
Initlcd
Waitms 100


'EEPROM LESEN
Readeeprom Kmges , 16
Readeeprom Kmtag , 32


'STARTBILD
Rem noch nicht ganz fertiggestellt
Cls
Locate 1 , 1
Wait 2
Lcd "Willkommen!"
Wait 2
Locate 2 , 1
Lcd "Bordcomputer"
Wait 2
Locate 3 , 1
Lcd "V1.0"
Wait 2
Locate 4 , 1
Lcd "(c) TE"
Wait 2
Cls


'### HAUPTSCHLEIFE ###
Do

'ADC auslesen
Adc_wert = Getadc(0)
'ADC-Wert in Spannung umwandeln
Spg = Adc_wert * Adc_faktor
'Sub aufrufen, wenn Versorgungsspannung abfällt
If Spg < 9 Then Gosub Power_fail

'Berechnung Geschwindigkeit
Time_umdrehung_s = Time_umdrehung_ms * 1000
V_meter_sekunde = Radumfang / Time_umdrehung_s
V_kmh = V_meter_sekunde * V_faktor

'Umwandlung Werte für LCD
Spg_ausgabe = Fusing(spg , "##.##")
V_meter_sekunde_ausgabe = Fusing(v_meter_sekunde , "##.#")
V_kmh_ausgabe = Fusing(v_kmh , "##.#")
Kmges_ausgabe = Fusing(kmges , "####.##")
Kmtag_ausgabe = Fusing(kmtag , "####.##")
Radumfang_ausgabe = Fusing(radumfang , "#.####")

'Ausgabe Lcd
Select Case Ausgabemaske
Case 0 : Gosub Maske0
Case 1 : Gosub Maske1
Case 2 : Gosub Maske2
Case 3 : Gosub Maske3
Case 4 : Gosub Maske4
Case 5 : Gosub Maske5
End Select

'Abfragen Störungen usw.
'Abfrage Versorgungsspannung
If Spg < 10 Then
Status = 1
Status_nr = 1
End If

Loop


'### SUBS ###
Int0_isr:

Time_umdrehung_n = Time_umdrehung_ms
Time_umdrehung_n = 0
Toggle Stat_timer0
If Stat_timer0 = 1 Then Start Timer0 Else Stop Timer0
Kmges = Kmges + Radumfang
Kmtag = Kmtag + Radumfang

Return


Timer0_isr:

Timer0 = 131
Incr Time_umdrehung_n

Return


Power_fail:

Writeeeprom Kmges , 16
Writeeeprom Kmtag , 32
Powerdown

Return


'MASKEN
Maske0:

'Ausgabe Geschwindigkeit
Locate 1 , 1
Lcd V_kmh_ausgabe ; "km/h"
Locate 1 , 10
Lcd V_meter_sekunde_ausgabe ; "m/s"
'Ausgabe Tageskilometerstand
Locate 2 , 1
Lcd Kmtag_ausgabe ; "km"
'Ausgabe Gesamtkilometerstand
Locate 3 , 1
Lcd Kmges_ausgabe ; "km"
'Ausgabe Spg
Locate 4 , 1
Lcd Spg_ausgabe ; "V"
'Ausgabe Status
Locate 4 , 9
If Status = 0 Then Lcd "OK" Else Lcd "Stoerung"

'Tasterabfrage
If T_enter = 0 Then
Ausgabemaske = 1
Cls
End If

'----------
Locate 4 , 12
Lcd Stat_timer0
'----------

Return


Maske1:

'Ausgabe Hauptmenü
Locate 1 , 3
Lcd "Grundbild"
Locate 2 , 3
Lcd "Einst. 1"
Locate 3 , 3
Lcd "Einst. 2"
Locate 4 , 3
Lcd "Status"

'Abfrage Taster
If T_auf = 0 Then
Decr Auswahl
Cls
End If
If T_ab = 0 Then
Incr Auswahl
Cls
End If

If Auswahl = 4 Then Auswahl = 0
If Auswahl = 0 Then
Locate 1 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 0
Cls
End If
Elseif Auswahl = 1 Then
Locate 2 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 2
Cls
End If
Elseif Auswahl = 2 Then
Locate 3 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 3
Cls
End If
Elseif Auswahl = 3 Then
Locate 4 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 4
Cls
End If
End If

Return


Maske2:

'Ausgabe Einstellungen1
Locate 1 , 3
Lcd "Reset Km-Tag"
Locate 2 , 3
Lcd "Sparmodus:"
Locate 2 , 12
Lcd Sparmodus
Locate 3 , 3
Lcd "Km. speichern"
Locate 4 , 3
Lcd "Zurück"

'Abfrage Taster
If T_auf = 0 Then
Decr Auswahl
Cls
End If
If T_ab = 0 Then
Incr Auswahl
Cls
End If

If Auswahl = 4 Then Auswahl = 0
If Auswahl = 0 Then
Locate 1 , 1
Lcd "+"
If T_enter = 0 Then
Kmtag = 0
Cls
End If
Elseif Auswahl = 1 Then
Locate 2 , 1
Lcd "+"
If T_enter = 0 Then
If Sparmodus = 0 Then Sparmodus = 1 Else Sparmodus = 0
Cls
End If
Elseif Auswahl = 2 Then
Locate 3 , 1
Lcd "+"
If T_enter = 0 Then
Gosub Power_fail
Cls
End If
Elseif Auswahl = 3 Then
Locate 4 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 1
Cls
End If
End If


Return


Maske3:

'Ausgabe Einstellungen2
Locate 1 , 3
Lcd "u="
Locate 1 , 5
Lcd Radumfang_ausgabe ; "m"
Locate 2 , 3
Lcd "Reserviert"
Locate 2 , 12
Lcd Sparmodus
Locate 3 , 3
Lcd "Reserviert"
Locate 4 , 3
Lcd "Zurück"

'Abfrage Taster
If T_auf = 0 Then
Decr Auswahl
Cls
End If
If T_ab = 0 Then
Incr Auswahl
Cls
End If

If Auswahl = 4 Then Auswahl = 0
If Auswahl = 0 Then
Locate 1 , 1
Lcd "+"
If T_links = 0 Then Radumfang = Radumfang - 0.001
If T_rechts = 0 Then Radumfang = Radumfang + 0.001
Elseif Auswahl = 1 Then
Locate 2 , 1
Lcd "+"
If T_enter = 0 Then Lcd "RESERVIERT"
Elseif Auswahl = 2 Then
Locate 3 , 1
Lcd "+"
If T_enter = 0 Then Lcd "RESERVIERT"
Elseif Auswahl = 3 Then
Locate 4 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 1
Cls
End If
End If

Return


Maske4:

'Ausgabe Status
Locate 1 , 1
If Status = 0 Then Lcd "System OK" Else Lcd "Störung"
Locate 2 , 1
Lcd Status_nr
Locate 3 , 3
Lcd "Störung quit"
Locate 4 , 3
Lcd "Zurück"

'Abfrage Taster
If T_auf = 0 Then
Decr Auswahl
Cls
End If
If T_ab = 0 Then
Incr Auswahl
Cls
End If

If Auswahl = 3 Then Auswahl = 0
If Auswahl = 0 Then
Locate 3 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 5
Cls
End If
Elseif Auswahl = 1 Then
Locate 4 , 1
Lcd "+"
If T_enter = 0 Then
Ausgabemaske = 1
Cls
End If
End If

Return


Maske5:

'Ausgabe Störungstexte
Locate 1 , 1
Lcd "Störungstexte"
Locate 2 , 1
Lcd "werden nicht"
Locate 3 , 1
Lcd "unterstützt!"
Locate 4 , 1
Lcd "Warte auf v1.1"

'Tasterabfrage
If T_enter = 0 Then
Waitms 20
If T_enter = 0 Then
Ausgabemaske = 4
Status = 0
Status_nr = 0
Cls
End If
End If

Return


End


In der Interruptroutine "Int0_isr" werden erst einmal die Daten an Variablen übergeben, dann wird "Stat_timer0" getoggelt. Die anschließende Abfrage startet oder stoppt Timer0. Genau hier habe ich meine Zweifel. Wird der Timer wirklich gestartet/gestoppt?.

Danke für die Hilfe
Thomas

TomEdl
25.01.2009, 20:09
So, ich habe mir nun das Problem mal genauer angesehen. Zuerst tat sich beim Bewegen des Rollers gar nichts, dann ging ich ins Menü und betätigte die Auswahl "Reset Km-Tag". Anschließend zeigte mir das Display im Grundbild 00.00km an, wo hingegen vorher ein negatives Vorzeichen davorstand. Nun zählte er bei der Radumdrehung die Radumdrehung dazu - funktioniert soweit. Jedoch änderte sich am Gesamtkilometerstand nichts. Ich habe dann per PC den Wert vom Tageskilometerstand in die Position des Gesamtkilometerstandes im EEPROM kopiert - nun zählen beide Kilometerzähler hoch. Anscheinend hatte das negative Vorzeichen irgendwas am addieren der Werte verhindert. (?)

Jedoch bleibt das Problem bestehen, dass ich keine Geschwindigkeit angezeigt bekomme - weder in km/h noch in m/s. Ich habe den Code daraufhin etwas umgeschrieben, was jedoch keinerlei Wirkung zeigte. Allerdings weiß ich jetzt sicher, dass die Interruptroutine bei jeder Radumdrehung zuverlässig angezeigt wird - sonst würde sich ja der Kilometerstand nicht ändern.

Könnte jemand mal kurz den Code durchsehen, speziell die Bereiche
+ Int0_isr
+ Timer0_isr [/list]
+ Berechnung der Geschwindigkeit in der Main-Loop
+ Umwandlung der Werte für die Ausgabe (ebenfalls Main-Loop).

Vielleicht übersehe ich ja die ganze Zeit etwas.

Vielen Dank für eure Mithilfe,
Thomas
;)