Hallo! ich bin immernoch an meinem Drehzahlmesser...
Habe den LCD am port B
Lege erstmal impuls vom Funktionsgenerator an.
es kommt NUR Quatsch raus... wie mache ich das????
BIIIITTTTTTTTTTTTEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!
$regfile = "m16def.dat"
$crystal = 16000000
Config Pind.1 = Input
Portd.1 = 1
Dim Impulse As Byte
Dim V As Long
Dim W As Long
Dim W1 As Long
Dim W2 As Long
Dim W3 As Long
Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
On Ovf1 Ontvf1
On Icp1 Oncapture
Enable Icp1
Enable Ovf1
Enable Interrupts
Main:
V = 0
W3 = 0
Impulse = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "Drehzahl"
Locate 2 , 1
Lcd V
Lcd " UpM "
Tcnt1l = 0
Tcnt1h = 0
Do
Loop
End
Oncapture:
Disable Icp1
Disable Ovf1
W3 = Timer1
Timer1 = 0
W2 = W2 + W3
Incr Impulse
If Impulse = 6 Then
W1 = W2 * 3472
W = W1 / 60
V = 600000000 / W
Locate 2 , 1
Lcd V
Lcd " UpM "
W = 0
W2 = 0
W3 = 0
V = 0
Impulse = 0
Else
End If
Enable Icp1
Enable Ovf1
Return
Ontvf1:
Disable Icp1
Disable Ovf1
V = 0
Locate 2 , 1
Lcd V
Lcd " UpM "
W = 0
W2 = 0
V = 0
Enable Icp1
Enable Ovf1
Timer1 = 0
Return
ich sage ehrlich, ich habe das programm einfach kopiert, und habe
versucht es zu ändern....
es klappt einfach nicht.
> Ich sage erlich: mache nie etwas, was du nicht verstehts.
Nun ja, er hat ja verstanden wie er den Code kopiert ;-) Kleiner Scherz!
@Alex: WAS genau funktioniert denn jetzt nicht?
bin immernoch an probieren....... das klappt aber nicht! :((
Probier doch mal "sprechende" Betreffs zu (er)finden .....
Und dann probierst du mal, eine genauere Fehlermeldung zu artikulieren.
"Habe den LCD am port B ... Lege erstmal impuls vom Funktionsgenerator
an.
es kommt NUR Quatsch raus... wie mache ich das???? ich sage ehrlich, ich
habe das programm einfach kopiert, und habe versucht es zu ändern.... es
klappt einfach nicht."
Was klappt nicht?
:: Das Kopieren des Programms? --> Diskette kaputt.
:: Das Ändern des Programms? --> Compiler kaputt.
:: Das Einlesen der Messdaten? --> Meßwertgeber kaputt.
:: Die Ausgabe am LCD? --> LCD kaputt.
> ich sage ehrlich, ich habe das programm einfach kopiert, und habe> versucht es zu ändern....
Und ich hab dir in einem anderen Post einen Stufenplan
entwickelt, der dich in ganz einfachen Schritten zum
Ziel führen würde.
Ganz ehrlich: Programme schreiben ist (noch) nichts für dich.
VIelleicht in ein paar Jahren.
Also els erstes:
es ist ja pin 1 vom port D als eingeng definiert: " Config Pind.1 =
Input
Portd.1 = 1"
nun ist es so, dass nicht der pin 1, sondern PIn 8 beim Mega 16 auf den
Impuls überhaupt reagiert....
dann: am LCD ist schon "Drehzahl" und "UpM" zu erkennen, aber als Zahl
habe ich was von 1463485 UpM zu sehen, und das bei 100!!! Hz.
Das passt doch nicht!
????????
Was ist denn bitteschön "Pin 8"? Ein (8-Bit-) Port am Mega 16 hat Pins
von 0 bis 7. Der "erste" Pin an einem Port ist der mit der Nummer 0,
dann kommt der "zweite" mit der Nummer 1 usw. Wenn Du den "ersten" Pin
als Eingang programmieren willst, musst Du etwas in der Art "Config
Pind.0 = Input" (kenne mich mit Bascom nicht aus...) schreiben, und
nicht Pind.1...
> welcher post ist das?
Es reicht doch wohl schon, wenn ich dir aus der BASCOM
Doku die Dinger raussuche, die du brauchst. Soll ich
jetzt auch noch deine anderen Postings durchsuchen?
Sachen gibts.
> Es reicht doch wohl schon, wenn ich dir aus der BASCOM
Doku die Dinger raussuche
wenn du das mal machen würdest...
ich bin schon echt viel zu müde. am besten würde ich jedes mal das ganze
mal mit dem Hammer bearbeiten, aber hat viel geld gekostet, und ist auch
etwas schade... das ganze.
ich kapiere das einfach nicht.
etwas zu lesen.. habe ich noch mindestens 30 begriffe, die ich genauso
nicht verstehe, und dann will ich schon wieder zum Hammer greifen...
Alex wrote:
> also am port D geht pind.0 - pind.8> ich habe beispielsweise im code pind.1 stehen...> reagiert aber trotzdem nur pind.8
zeig mir mal am mega16 den pind.8, da bin ich mal gespannt :D
Du weist, was ein Capture macht?
Capture: Der Timer zählt alleine vor sich hin. Wenn an einem
bestimmten Pin (dem Capture-Eingang) ein Ereignis eintritt,
dann passieren mehrere Dinge: Zum einen wird der aktuelle
Zählerstand des Timers in ein spezielles Register kopiert,
zum anderen, wenn erlaubt, wird eine Capture-Interrupt
Funktion aufgerufen.
Wie ist dein Timer konfiguriert:
Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising
Aha. Wir reden vom Timer 1
Mal schnell ins Datenblatt vom Mega16 geschaut: Bei einem
Mega16 kann ein Capture am Pin mit der Bezeichnung ICP1
durchgeführt werden. ICP1 liegt bei einem Mega16 auf dem Pin
PD6
Weiters ist der Capture Eingang so konfiguriert, dass er als
Ereignis eine steigende Flanke (Rising) akzeptiert. Jede
steigende Flanke am Pin PD6 Pin löst also einen Capture aus.
Vergiss doch einfach mal die ganze komplizierte Abarbeitung
im Capture Interrupt und schau einfach mal nach wie weit
der Timer vom Auftreten eines Capture bis zum nächsten
zählen konnte.
Oncapture:
W3 = Timer1
Timer1 = 0
Locate 2 , 1
Lcd W3
Return
Wenn du jetzt 100 Hz an PD6 anlegst, kriegst du da eine
Zahl heraus. Änderst du auf 200 Hz halbiert sich diese Zahl.
Legst du nur 50 Hz an, verdoppelt sich die Zahl.
Jetzt die Aufgabe an dich: Kannst du erklären, wie diese
Zahl zustande kommt? Den genauen Rechenweg!
Wenn du das erklären kannst, ist der weitere Weg zu einem
Frequenzmesser und damit zu einem Drehzahlmesser nicht mehr
schwer.
Und ja: Das ist genau das, was ich dir in einem anderen Post
auch schon mal empfohlen habe: stufenweises vorgehen! Auch
Rom ist nicht an einem Tag erbaut worden.
> Jetzt die Aufgabe an dich: Kannst du erklären, wie diese
Zahl zustande kommt? Den genauen Rechenweg!
Kann ich leider nicht :(((
Alles was ich verstehe, dass diese Zahl so wie der ADC-wert zu stande
kommt.
also sie ist halt da, nur du und der COntroller weiss, was das bedeutet.
:)
habe mal kurz ausprobiert:
$regfile = "m16def.dat"
$crystal = 16000000
Config Pind.6 = Input
Portd.6 = 1
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising
Cls
Dim W3 As Long
W3 = Timer1
Timer1 = 0
Locate 2 , 1
Lcd W3
Return
auf dem LCD : "17293"
am PD6 ist nichts angeschlossen!
kann ich jetzt mit dieser Zahl wie mit meinem ADC wert, als ich
temperaturmesser programmiert habe arbeiten?
also es ist ja eigentlich egal, was sie bedeutet, ich kann die Zahl bei
100 Hz gucken, und dann bei 1 kHz ablesen, und das ganze dann in UpM
umwandeln.
wie ADC wert zu °C!
kann man das so machen? oder ist da noch was???
Und die Zahl "17293" wird immer exakt angezeigt? Obwohl an PD6 nichts
angeschlossen ist? Merkwürdig.
Sonst sollte deine weitere Überlegung richtig sein.
> Und die Zahl "17293" wird immer exakt angezeigt? Obwohl an PD6 nichts
angeschlossen ist? Merkwürdig.
ja, sie ändert sich nicht . :(((
habe jetzt funktionsgenerator am PD6 dran... sie ändert sich mit der
Frequenz auch nicht! :((((
Verbesserungsvorschläge:
1. selbstsprechende Variablennamen vergeben
2. warum wird in jeder interruptroutine beide Ints disabled und wieder
freigegeben? (wg. LEDs ?) Dann werden aber einige Ints verpasst.
3. LCD Ausgabe raus aus den Interruptroutinen und in Main verlagern.
MW
Konzentrier dich erst mal darauf, dass sich die Zahl ändert.
Die muss sich ändern!
Nochmal ins Datenblatt geschaut: Beim Mega16 liegt der
Capture Eingang für den Timer1 am Pin PD6. Das ist der Pin
mit der Nummer: 20. Am DIL Gehäuse rechts unten in der Ecke.
>> > Jetzt die Aufgabe an dich: Kannst du erklären, wie diese>> Zahl zustande kommt? Den genauen Rechenweg!>> Kann ich leider nicht :(((
Darauf kommen wir nochmal zu sprechen.
Das solltest du nämlich schon können. Das
ist trivial.
Aber erst mal musst du da bei verschiedenen
Frequenzen unterschiedliche Werte kriegen.
> Beim Mega16 liegt der Capture Eingang für den Timer1 am Pin PD6.
ja, es passiert aber nichts.....
komme morgen wieder!
Danke erstmal.. die Zahl ändert sich nicht....
und das ist schon der Punkt... schon ganz am Anfang, wo es noch alles
funktionieren MUSS, klappt nicht... warum auch immer....
und da vergeht schon die ganze Laune!
> $regfile = "m16def.dat"> $crystal = 16000000>> Config Pind.6 = Input> Portd.6 = 1>> Config Lcd = 20 * 4> Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,> Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4>> Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising>> Cls>> Dim W3 As Long> W3 = Timer1> Timer1 = 0> Locate 2 , 1> Lcd W3> Return
Das ist aber nicht das, was ich vorgeschlagen habe!
Wo ist den hier bitte der Capture Interrupt?
Pass doch ein bischen auf! Mit sinnlosem Code
zusammen kopieren kommst du nicht weiter. Wenn du
das bis jetzt nicht kapiert hast, ...
Du musst unbedingt kontrolliert arbeiten. Das heißt erst überlegen, was
schief gehen könnte. Und da du nicht schnallst, was dein Programm
eigentlich macht, musst du alles von vorn step-by-step kontrollieren.
Z.B erst Hardware -> kommt dein Signal überhaupt ordnungsmäß am Pin an?
Wenn ja -> an welchem?
Wenn das geht, schreib doch mal ein Impulszähler Progrämmchen.
Da du ja nen FG(Funktionsgenerator) hast, gib doch mal 5Hz an deinen
Pin. Und da dein Display ja geht (soweit ich das in Erinnerung hab),
lässt du ein paar Pixel oder nen Schriftzug bei 5V am Eingangspin
leuchten. Liegen 0V am Eingangspin, lässt du den Schriftzug
verschwinden.
Mach das mal. Mühsam ernährt sich das Eichhörnchen. Aber nur selten
funktionieren kopierte Sachen zu 100%. N bisschen anpassen muss man sie
immer. Und sei es, dass man die Sache ggf. ausbaut.
> ..... Disable Interrupts 'nötig für Auslesen von Cap1
W3 = Timer1 'Wert sichern
Timer1 = 0 'Timer-Reset
Locate 2 , 1
Lcd W3
Enable Interrupts 'Interrupts wieder aktivieren
Return
hmmmm, habe da was mit 314, die sich nicht ändern.... :(
liegt das vllt daran, dass ich ein Koax kabel habe? 50 Ohm.
masse zwischen board und FG habe ich auch verbunden.
Ich gehe mit dem "Heissem" Draht auf PD6 also auf pin 20 vom Controller.
LCD: "314 "unlesbares zeichen" b"
?????????
Wenn Du die 10 V_pp direkt an den AVR angelegt hast, kannste den AVR
wahrscheinlich wegschmeißen! Der darf maximal -0,5 V bis VCC + 0,5 V an
den Eingängen.
mit 10V wirst du den Pin gekillt haben, kein Wunder das da nichts mehr
reagiert.
Les dir mal das Datenblatt durch wie hoch die Spannung sein darf die man
dem ATM16 zumuten darf. Danach suchst du mal nach Port schützen im
Forum.
> Wenn Du die 10 V_pp direkt an den AVR angelegt hast, kannste den AVR> wahrscheinlich wegschmeißen!
Häng mal einen Taster an den Pin und überprüfe mit einem
Testprogram ob der Pin noch tut:
Taster nach GND schalten.
Program: Pullup-Einschalten und den Zustand des Pins auf
auf dem LCD ausgeben. Wenn du dann den Taster drückst
soll sich die Ausgabe am LCD ändern. Zur Kontrolle ob
dein Pgm richtig ist, mal probeweise auch einen anderen
Pin (von dem du weist, dass er noch geht) hernehmen.
ich schalte mit dem Optokoppler die 5 V!!!!
also am pin sind höchstens 5 V!
mancmal kann man auf dem LCD was erkennen, aber meistens eine 6 stellige
zahl, und noch unlesbare zeichen dazu!!!!!!!!
was kann man gegen wutanfälle machen???????
> was kann man gegen wutanfälle machen???????
systematisch an die Dinge rangehen. kleine Schritte
machen. Jeden Schritt austesten. Erst dann wenn dieser
Schritt klappt sich um den nächsten kümmern.
Wie genau ist der Optokoppler verschaltet?
Wenn du an den Optokoppler die 10V anschliest und
das oben grade angesprochene Testverfahren mit Taster
und Testprogram durchführst, klappt das dann?
> mancmal kann man auf dem LCD was erkennen, aber meistens eine> 6 stellige zahl, und noch unlesbare zeichen dazu!!!!!!!!
Da sollte eigentlich ständig eine Zahl sichtbar sein. Die
letzte Stelle (Einer) wird nicht ganz ruhig stehen, aber
alles davor sollte schon in Ordnung sein.
Die unlesbaren Zeichen sind allerdings seltsam. Die werden
nirgendwo ausgegeben. Also ist die Frage, wo kommen sie her?
> Wie genau ist der Optokoppler verschaltet?
Der optokoppler ist am FG angeschlossen (wo die LED ist natürlich).
Schaltet auch durch. Frequenz abhängig!
Dann hat er noch 2 anschlüsse.
an ein von den habe ich 5V angelegt. der andere ist mit PD6 geschaltet.
Schritt für schrutt sagst du?
Das ist doch schon der aller erste Schritt, dass ich diese Zahl auf dem
LCD sehe.... soll die 3, 4, 5, 6 stellig sein??
> Das ist doch schon der aller erste Schritt, dass ich diese Zahl auf dem> LCD sehe.... soll die 3, 4, 5, 6 stellig sein??
Nein.
Der erste Schritt ist nachzuschauen ob der Optokoppler in seiner
Beschaltung am Eingang überhaupt etwas bewirkt (*)
Erst wenn das sichergestellt ist, gehts weiter.
Deine Schritte sind noch viel zu gross.
In der Verarbeitungskette:
Eingabe - Verarbeitung - Ausgabe
muss man im Fehlerfall jedes einzelne Glied untersuchen.
Du glaubst gar nicht wieviele Leute stundenlang im Abschnitt
'Verarbeitung' nach Fehlern suchen und nie auf die Idee kommen
sich mal die Eingabe bzw. Ausgabe anzusehen. Dabei ist es
eine alten Binsenweisheit: Garbage in - Garbage out (auf
Deutsch: Wenn man Müll hineinstopft kommt auch wieder Müll
raus)
(*) zb macht man das dadurch, dass man sich das Pin Register
mal ausgeben lässt. Man lässt man den Opkoppler durchschalten
und schaut nach welche Ausgabe sich ergibt. Danach lässt
man den Opkoppler sperren und schaut nach ob sich an der
Ausgabe was ändert. Danach überlegt man, ob diese Änderung
bzw. der Ausgabewert logisch begründet werden kann und wenn
ja wie. Und erst dann, wenn man all dies verstanden hat, geht
man weiter zum nächsten Schritt.
> Der Optocoupler ist falsch angeschlossen. Der interne Pullup muss
eingeschaltet sein.
jetzt bin ich ganz verwirrt!
Damit timer funktioniert, muss man an den Pin + V raugeben, oder die
masse?
also ich meine schalten!
R2 ist der Vorwiderstand für die LED.
R3 ist der interne Pull-Up-Widerstand des AVR.
Kriegst du das so hin?
(Ich hab einfach irgendeinen Optokoppler benutzt.)
> Damit timer funktioniert, muss man an den Pin + V raugeben, oder die> masse?> also ich meine schalten!
Sowohl, als auch.
Der Eingang muss bei einer gewollten logischen 1 auf 5V liegen
und er muss bei einer gewollten logischen 0 auf Masse liegen.
Und jetzt schaun wir uns mal deine ursprüngliche Schaltung an.
Der Transistor im Optokoppler ist nichts anderes als ein
Schalter, der einen Stromkreis entweder schliest oder öffnet
(durch das Licht das von der LED auf den Transistor fällt,
aber das ist erstmal uninteressant. Wichtig ist nur, dass
das im Prinzip ein Schalter ist).
Wenn also Licht auf den Transistor fällt, ist der Schalter
geschlossen. Also so
o 5v
|
|
+---------o-------+--------------o Eingang vom µC
In dem Fall liegt am Eingang wunderbar 5V an, der µC
akzeptiert das als eine 1
Jetzt schalten wir mal das Licht im Optokoppler aus. Der
Transistor öffnet, der Schalter ist offen:
o 5v \
| \
| \
+---------o +--------------o Eingang vom µC
Hoppla. Was ist jetzt? Jetzt hängt der Eingang des µC in
der Luft. In der Luft hängen ist aber nicht dasselbe wie
den Eingang auf Masse legen. Wenn der Eingang in der
Luft hängt fängt sich der µC alle möglichen Frequenzen
aus der Luft ein. Das Stück Draht am Eingang wirkt dabei
sogar noch als Antenne.
Also so gehts nicht. Wir brauchen definierte Pegel.
Wenn der Schalter geschlossen (oder offen) ist, dann
wollen wir eine Verbindung (muss keine direkte Verbindung
sein, kann auch über einen Widerstand geführt sein) mit
5V. In der anderen Schalterstellung wollen wir eine
Verbindung mit Masse.
Die Schaltung, so wie Rahul das aufgezeichnet hat, macht
genau das.
Wenn der Schalter offen ist, dann ist der Eingang über den
Widerstand rechts (den sog. Pull-up Widerstand) mit 5V
verbunden. Am Eingang wird eine logische 1 erkannt.
Wird der Schalter im OK geschlossen, so wird der Eingang
mit Masse verbunden. Er ist über den Widerstand immer noch
mit 5V verbunden. Nur: Der Weg nach Masse ist für die
Elektronen sehr viel attraktiver, da müssen sie sich nicht
durch einen Widerstand quetschen. Nach Masse ist kein Widerstand
und daher herrscht am Eingang ein 0 Pegel (und es fliest ein
kleiner Strom direkt von 5V durch den Widerstand zur Masse).
Übrigens: Der Pull-Up Widerstand, falls du es noch nicht
bemerkt hast, ist bereits in deinen AVR mit eingebaut, weil
man diesen Fall oft hat: Am Eingang muss ein Schalter her,
* der ist entweder geschlossen. In diesem Fall stellt der
Schalter die direkte Verbindung nach Masse her
* oder er ist offen. In diesem Fall stellt der Widerstand
die Verbindung nach 5V her.
Den Pull-Up Widerstand muss man nur aktivieren.
es fällt mit nichts mehr ein. ein Kollege von mir kann vielleicht das
programm in C schreiben, damit ich sehe, ob das ganze Hardwaremässig
überhaupt funktioniert.
Komme sonst überhaupt nicht weiter!
Schon alles probiert, auf dem LCD nur komische zeichen.... MÜLL...
Kann man in Basic ein C-Programm importieren?
Also, dass ein Teil des Programms in C geschrieben ist?!
Grosse hilfe hier!
WARUM?
WARUM?
WARUM?
es MUSS funktionieren!
wo kann das problem denn noch liegen?
LCD funktioniert, am PD6 ist der signal 0/1 f=100 hz!
$regfile = "m16def.dat"
$crystal = 16000000
Config Pind.6 = Input
Portd.6 = 0
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
On Icp1 Oncapture
'Interrupt-Routine
Config Timer1 = Timer , Prescale = 255 , Capture Edge = Rising
Enable Icp1
Enable Interrupts
Cls
Main:
Goto Main
Oncapture:
Dim W3 As Long
Disable Interrupts
W3 = Timer1
Timer1 = 0
Locate 1 , 1
Lcd W3
Enable Interrupts
Return
LCD eine Zahl die sich kaum ablesen lässt, weil sie sich sehr schnell
verändert.
dazu noch unlesbare zeichen!
Wie kann ich denn noch erklähren???
Soll ich ein Video machen, oder wie?
Mal eine einfache Frage Alex: Hast du der Variablen "W3" mal manuell
eine feste Zahl zugeordnet und kontrolliert, ob diese auch zuverlässig
auf dem LCD angezeigt wird?
>> Config Pind.6 = Input> Portd.6 = 0
Warum hast du denn den PullUp Widerstand wieder abgeschaltet?
> Grosse hilfe hier!
Dazu liegt mir was auf der Zunge, aber das sag ich jetzt
noch nicht.
> Warum hast du denn den PullUp Widerstand wieder abgeschaltet?
wo genau??
ich habe jetzt den widerstand als pull up!
bin ein Stück weiter gekommen.
Mein programm fängd an bei 70 Hz zu spinnen! bis 70Hz, funktioniert
alles tatsächlich!
nach 70 hz, bekomme ich diesen müll auf dem display.
noch was, mein ext. Quarz ist NICHT aktiviert. ich weiss nicht wie das
geht. habe schon mal probiert, Controller was hinüber. jetzt möchte ich
das nicht nochmal machen!
Kann das die Ursache sein?
Ich bin jetzt nicht so der BASCOM-Experte, aber für mich sieht's so aus,
daß bei jedem Impuls ein LCD-Beschreiben ausgelöst wird. Wenn nun der
nächsten Impuls kommt, bevor die LCD-Routine fertig ist, kommt Murks
raus (in diesem Fall liegt die Grenze scheinbar bei 70Hz bzw. rund
15ms).
Tassilo
>> Warum hast du denn den PullUp Widerstand wieder abgeschaltet?>> wo genau??
Na hier:
Portd.6 = 0
Sei mir nicht böse, aber du bestätigst exakt das Vorurteil
das hier gegen BASCOM Programmierer gehegt wird: Keine
Ahnung von der Hardware und wie sie funktioniert, aber
programmieren wollen.
> ich habe jetzt den widerstand als pull up!
Du hast also einen externen PullUp Widerstand
dran. OK. Dann kannst du natürlich den im AVR
eingebauten abschalten.
> mein ext. Quarz ist NICHT aktiviert
Warum lügst du dann deinen BASCOM Compiler an?
> $crystal = 16000000
Da steht dein Mega16 arbeitet mit 16Mhz.
Wenn du keinen externen Quarz hast, dann
läuft der aber mit 1Mhz und nicht mit 16.
>> Ich bin jetzt nicht so der BASCOM-Experte, aber für mich sieht's so aus,>> daß bei jedem Impuls ein LCD-Beschreiben ausgelöst wird.>> nein
Was heist da 'nein'.
Natürlich wird bei jedem Impuls ein Neubeschreiben des
LCD gemacht. Beim Auftreten eines Impulses am Capture
Pin des Timers wird der Capture Interrupt ausgelöst
der seinerseits wiederrum die Funktion Oncapture aufruft.
In dieser Funktion wird der Timerwert ausgelesen und am
LCD ausgegeben. Ergo: Wenn ein Impuls auftritt, wird
eine LCD Ausgabe gemacht.
Du arbeitest jetzt schon so lange an diesem Pgm und hast
immer noch nicht den geringsten Schimmer davon, wie das
eigentlich funktioniert oder funktionieren sollte.
> Was heist da 'nein'.
sorry habe was anderes gemeint.
habe nochmal versucht quarze zu aktivieren....
geht wieder nichts..
kann man den Controller noch retten, oder kommt jetzt alles komplett ins
mülleimer?
HI
wie hast du den externen Quarz an den Prozessor angeschlossen?
wie gehst du denn vor um den externe Quarz zu aktivieren?
was funktioniert den nun nicht mehr?
@ Patrik
ja, quarz ist angeschlossen.
habe beim pony prog nach irgendeinem Theard hier im Forum die Häckhen
gestellt!
jetzt geht NICHTS mehr.. nicht lesen, schreiben, löschen.. nichts. :((
Tja, sieht so aus als hättest du den Tipp nur halb gelesen. Vor dem
setzen von Fuses muss man erst die aktuellen Fuse-Einstellungen aus dem
uC auslesen. Vermutlich sind jetzt alle Fuses gelöscht und damit ist der
uC nicht mehr verwendbar.
Wieso Pony?
Im BASCOM kann man auch wunderbar die Fusebits umstellen.
Jede Wette, dass du den µC mit Pony auf externen Oszillator
gestellt hast. Geht bei Pony ganz leicht, da es die Fusebits
umgedreht anzeigt.
Da du sowieso eine Funktionsgenerator da hast.
Stell den mal auf 1 Mhz oder so ein. Ausgangsspannung
5 Volt häng den Funktionsgenerator so wie er ist an
den Pin XTAL1. Der 'tote' µC sollte sich wieder melden.
Aber zurück zum Problem:
Tassilo hat schon recht. Könnte durchaus sein, dass die LCD
Routine schon zuviel Zeit in der Interrupt Funktion verbrutzelt.
Ist aber kein Problem: Das Updaten der Anzeige muss da halt raus.
Kann aber durchaus in der Hauptschleife passieren.
Das geht dann so (Ich hab mal rund um die Zahl ein paar *
ausgeben lassen, damit man erkennen kann, wo die eigentliche
Zahl anfängt und wo sie aufhört
$regfile = "m16def.dat"
$crystal = 1000000
Config Pind.6 = Input
Portd.6 = 0
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
On Icp1 Oncapture 'Interrupt-Routine
Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising
Dim W3 As Long
Enable Icp1 'Capture-Interrupt freigeben
Enable Interrupts 'Interrupts global freigeben
Cls
Main:
Locate 2 , 1
Lcd "*"
Lcd W3
Lcd "*"
Goto Main
Oncapture: 'Timer1-Capture
Disable Interrupts 'nötig für Auslesen von Cap1
W3 = Timer1 'Wert sichern
Timer1 = 0 'Timer-Reset
Enable Interrupts 'Interrupts wieder aktivieren
Return
"und damit ist der uC nicht mehr verwendbar".
Vielleicht sucht er sich dann ein neues Hobby.
Wer mit so viel Hilfe wie hier im Forum (speziell Karl Heinz) nicht
weiter kommt sollte sich wirklich nach etwas anderem umsehen.
Auch ich war damals (als ich mit dem Programmieren anfing) froh ,
jemanden zu haben, den man bei Problemen fragen konnte, aber in diesem
Fall scheint es mir, liegt gar keine intrinsische Motivation vor.
Tips und Vorschläge werden ignoriert, Code wird wild ohne jegliches
Verständnis zusammengebaut und wenn es dann nicht funktioniert wird
Hilfffffffffeeeeeeeeeeeeeeeee!!!!!!!!!!!!! Es geht nix!!!!!!!!
gebrüllt.
Selbst wenn die Software dann doch mal gehen sollte, wird er spätestens
bei der nächsten Aufgabe wieder die selben Probleme bekommen.
Sorry, musste mal raus
Tom
Rechteck, 5V
In der Digital-Technik gibt es nur Rechteck-Schwingungen.
Und was keine Rechteck ist, wird zu einem Rechteck gemacht.
Schliesslich will man nur 2 Zustände haben: eintweder ein
oder aus. Das gilt auch für Spannungen: Entweder die Spannung
ist da, oder sie ist nicht da. So langsam ansteigende Spannungen
wie bei einem Sägezahn oder einem Dreieck, sind in der
Digitaltechnik ein Graus -> werden sofort zu einem Rechteck
umgeformt.
> Das geht dann so (Ich hab mal rund um die Zahl ein paar * ausgeben lassen
Oha!!!!!!!!! das funktioniert!!!!!!!! ich glaube es nicht!
Jetzt kann ich ja schon diesen Wert in UpM umwandeln.. wie ADC-Wert in
°C ! oder??? ( Karl heinz weiss was ich meine, er hat es mir auch
beigebracht!!!!)
Na dann: herzlichen Glückwunsch zur funktionierenden Schaltung.
Wenn du jetzt auch weißt was welcher Teil deiner Schaltung und was
welcher Teil deines Programms macht, dann hast du es auch wirklich
verstanden.
Wenn nicht, ist jetzt genau der Zeitpunkt sich das klar zu machen.
Denn nur dann hast du aus diesem Projekt auch wirklich was gelernt und
nicht nur wild irgendwas zusammengestöpselt, das jetzt durch Zufall
sogar funktioniert.
unzählige fragen, die nach einer antwort suchen. eine antwort die wieder
eine neue frage aufwerfen wird und die naechste antwort, wieder die
nachste frage und so weiter und so weiter. doch ist es am ende nicht
immer wieder die gleiche frage? und immer wieder die gleiche antwort ?!
ich will ja nicht zu nahe treten, aber der lerneffekt ist nicht grad
besonders groß, wenn man sich alles nur vor die füsse werfen lässt. dann
nimmt man sich halt mal ein paar unzählige stunden und fängt an sich
reinzuarbeiten, damit man überhaupt weiss womit man es zu tun hat. und
wenn man vor einem problem steht bringt es am allerwenigsten direkt
hilfe zu holen. ich hab auch schon drei tage oder mehr an einem schei...
problem gehangen. wenn man dann aber nach drei tagen auf des rätsels
lösung gekommen ist, ist das erfolgserlebnis umso größer, weil man
alleine was auf die beine bekommen hat. außerdem hat man es dann (in den
meisten fällen) auch wirklich verstanden.
(ich schreib verdammt oft "man" - man)
in diesem sinne - learning by doing
> ich hab auch schon drei tage oder mehr an einem schei...> problem gehangen.
Die längste Zeit, die ich an einem Code geknobelt habe:
10 Jahre!
Das war ein Solid Modeller den ich 1989 in einem Buch
(Solid Modelling - Mäntylä) gefunden habe. Ich hab 10
Jahre gebraucht um ihn zumindest zum Teil lauffähig zu
kriegen (und das Problem lag nicht bei mir :-)
Nach 10 Jahren hab ichs dann eingesehen, dass sich das
zwar theoretisch in dem Buch alles super liest, in der
Praxis aber nicht funktioniert und hab grosse Teile
weggeschmissen.
Natürlich hab ich nicht ununterbrochen die 10 Jahre
daran gearbeitet. Aber in Summe werden da schon 1
bis 1.5 Jahre zusammengekommen sein.
> ...das ist dann wirklich ein ganz hartes Lehrgeld...
Es hat mich geschult auf Kleinigkeiten, wie etwa Rundungsfehler
in Floating Point Arithmetik, zu achten. Ausserdem habe ich
eine Menge über Debugging-Techniken gelernt. Mein graphischer
Debugger, der auch mit halb zerstörten und zerschossenen
CAD Datenstrukturen (Stichwort: Winged-Edge-Datastructure)
klarkommt, hat mir später manch guten Dienst erwiesen.
Ich mag nicht mehr.
Du änderst dein Pgm völlig sinnlos und ganz offensichtlich
ohne zu verstehen, was da vorher dort stand und was das bedeutet
hat.
Viel Glück.
Nein, das kannst du nicht.
Vor einer halben Stunde hab ich dir den Tip gegeben
( und ausprogrammiert ), dass die LCD Anzeige aus
der Interrupt Funktion raus muss. Und was tust du:
Du setzt sie wieder rein. Schlimmer noch: Du baust
auch noch eine Endlosschleife in die Interrupt Funktion
mit hinein und als ob das nicht schon alles wäre
lässt du den µC im Interrupt auch noch warten.
Wie gesagt: Viel Glück.
Dim W3 As Long
Dim U As Single
'hier wird ja U defeniert, was nachher für UpM ausgebe stehen soll
Enable Icp1
Enable Interrupts
Cls
Locate 1 , 1
Lcd "UpM"
'hier soll lcd auf der erster zeile UpM anzeigen
Oncapture:
Disable Interrupts
W3 = Timer1
Timer1 = 0
Enable Interrupts
'das soll ja so bleiben
Do
'mit do & loop bin ich mir nicht so sicher
U = -134.6153 * W3
U = W3 + 8942.3027
'hier wird ja k & d mit W3 vom Zähler zusammengerechnet
Lcd U
Locate 2 , 1
Waitms 60
'das ist dann die Ausgabe an die 2. zeile
Loop
denkfehler?
@alex
wie kommst du auf die Zahl -134.6153
und aehm was ist 8942.3027
@alle anderen (sind da noch welche)
Eigentlich müssten wir Fragen und er Antwortet. So lange wir Antworten
wird Alex nie verstehen, was er da macht.
> wie kommst du auf die Zahl -134.6153 und aehm was ist 8942.3027
so... rechnung:
1000 Upm = 59 *k +d
8000 Upm = 7 *k+d
8000-1000= (7*k+d)-(59*k+d)
7000 = -52 k
k = -134,6153
d= 1000 - 59*(-134,6153)
d= 8942,3027
richtig?
Der Code wird verändert?
1. Code wird kopiert
2. Code funktioniert (Judihui)
3. Code wird verändert (funktioniert nicht aus unerklärlichen Gründen)
4. Code wird ins Forum kopiert (mit vielen !)
5. Code wird durch einen Forum Benutzer korrigiert und wieder gepostet.
6. siehe Punkt 1.
Du beschäftigst Dich seit Monaten?
Dann erkläre uns in drei Sätzen was dieser Code der Reihe nach
bewerkstelligt.
Lcd "Unverständlich"
Cls
Locate 2 , 2
ausgabe auf dem display :Unverständlich.
display löschen
position: 2. zeile, 2 zeichen
;)
löst mein problem aber nicht!
ist meine Umrechnung denn richtig?
Jetzt bin ich paff. Weshalb schreibst du dann in deinem Code folgendes:
Cls
Locate 1 , 1
Lcd "UpM"
U = -134.6153 * W3
U = W3 + 8942.3027
Lcd U
Locate 2 , 1 <----------------
also nachdem ich mich nach dem
'... BIIIITTTTTTTTTTTTEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!!!!!!!!!!...'
im OP ausgeklingt hatte hab ich mir die Diskussion heute doch nochmal
durchgelesen.... köstlich ;-)
und (auch wenn ich nicht der erste bin) ich ziehe meinen Hut vor Karl
Heinz!
mal schauen wie die Soap weitergeht ;-)
Ich probiere mich jetzt auch mal mit dem Rechnen:
Frequenz 1.000.000 Hz
Timervorteiler 256
Timertakt 3906,25 Hz
bei 1000 rpm hast du 16,67 Ints pro Sekunde. Das heist, der Timer steht
irgendwo bei 234 (3906/16...)
Versuch erst mal den Timer mit Vorteiler 64 laufen zu lassen. Der
Timertakt beträgt dann 15625.
Entspräche einen Timerwert bei 1000 rpm 937. Bei 100 rpm 9370. Bei 8000
rpm irgendwas bei 117.
Ich hoffe, ich hab nicht einen Rechenfehler gemacht. Aber mit diesen
gemessenen Werten kannst du auf die Drehzahl schließen (errechnen). Ich
hoffe es hilft.
MW
P.S.
bei einem Prescaler von 64 hat jeder Timertick eine Länge von 64 µs.
Multipliziere das Capture Register mit 64 µs hast du eine Zeit. Die * 60
ist die Zeit pro Minute 1/T =F.
MW
1000UpM sind ja beim 4-takt motor 4000 impulse pro minute.
also 4000/60 = 66.6 impulse pro sekunde.
also ist die frequenz 66.6 Hz. richtig?
bei 66 Hz zeigt der Zähler oder was das auch immer ist wert von 59
das selbe bei 8000Upm gerechnet, gemessen, abgeguckt - wert = 7
dann kann auch die rechnung nach dieser formel:
U = W3 * k + d
U- Upm , W3- wert vom Zähler , k+d 2 variablen.
1000 Upm = 59 *k +d
8000 Upm = 7 *k+d
8000-1000= (7*k+d)-(59*k+d)
7000 = -52 k
k = -134,6153
d= 1000 - 59*(-134,6153)
d= 8942,3027
alles falsch?
impulse vom Zündkabel.
um den mittleren kabel von der Zündspule paar wicklungen.. das reicht
schon für den optokoppler.
ich meine es sind 4000 zündimpulse pro minute, oder?
Alex wrote:
> passt bei mir nicht! :(((
Er soll ja nicht "passen".
Vielmehr sollst Du ihn analysieren und verstehen, damit Du evtl.
brauchbare Algorithmen in Deinen Code übernehmen kannst.
...
> 10000Upm sind 10000/60 Umdrehungen pro Sekunde.
ich frage nach der Anzahl der Zündimpulse.
bei 4-zylinder motor sind ja 4 zündimpulse pro umdrehung.
wieder falsch?
Alex, nicht für ungut aber lass es bleiben oder lies Dich endlich mal in
die Materie ein!
Mein Kumpel hat einen 8-Zylinder, der müßte nach Deiner Rechnung 8x pro
Umdrehung zünden. Man! das gäbe eine Kurbelwelle wie ein Korkenzieher.
4-Takt = Ansaugen - Verdichten - Verbrennen - Ausstoßen
(pro Takt 0,5 Umdr.)
--> 2 Zündimpulse/Umdrehung bei 4 Zylindern
(wobei manche noch mal nachzünden)
verstanden?
Hole Dir ein Oszi oder Impulszähler und schaue nach wieviel Impulse Du
bei 1500 1/min hast.
... und der Rest ist eh für die Katz
Gruß
Stevko