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 er lich: mache nie etwas, was du nicht verstehts.
> 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! ????????
>Und ich hab dir in einem anderen Post einen Stufenplan
entwickelt, der dich in ganz einfachen Schritten zum
Ziel führen würde.
welcher post ist das?
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...
also am port D geht pind.0 - pind.8 ich habe beispielsweise im code pind.1 stehen... reagiert aber trotzdem nur pind.8
> 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
> sorry, sehe jetzt auch!
habe mit Target layout gemacht.. und da zeigt er wirklich PD8 an!
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.
Hi, Formtapez war doch schon so nett ein komplettes Beispiel / fertiges Projekt vorzustellen in Bascom. Beitrag "Drehzahlmesser 4 mal 7-segment mit 90S2313"
> 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???
> auf dem LCD : "17293"
habe jetzt den Funktionsgenerator am Pind.6 dran....
die Zahl ändert sich kein bisschen!
:((((((((((
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!
Bei 100 Herz müsstest du eine Ablesung von ca. 625 haben.
> $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, ...
$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 On Icp1 Oncapture 'Interrupt-Routine Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising Enable Icp1 'Capture-Interrupt freigeben Enable Interrupts 'Interrupts global freigeben Cls Main: 'Hauptschleife Goto Main Oncapture: 'Timer1-Capture Dim W3 As Long 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
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"
?????????
Masseverbindung zwischen Mikrocontroller und FG hast du auch?
> Masseverbindung zwischen Mikrocontroller und FG hast du auch?
"masse zwischen board und FG habe ich auch verbunden."
Und wie groß ist FG Ausgangspannung? Du brauchst Amplitude von 0 bis 5V,minimal 0 bis 3V sonst reagiert ATmega nicht.
Ich habe Rechteck 10v PP Reicht das??? Funzt nicht!
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?
Ich sehe gerade die vielen Satzzeichen und kann es mir einfach nicht verkneifen: http://sockenseite.de/__oneclick_uploads/2006/10/ausruf.html Mal drüber nachdenken. ;)
> 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??
Der Optocoupler ist falsch angeschlossen. Der interne Pullup muss eingeschaltet sein. FG ----|R|---|>|- |------- PD6 | < | | | | --- ---
> 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?
Ist denn mittlerweile raus, ob das Eingangspin überhaupt noch funktioniert? Bevor das nicht klar ist, nützt uns auch ein Video vom LCD nix... Tassilo
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.
Deine Geduld hätte ich manchmal gerne, Karl Heinz... :-)
> 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?
@ Karl Heinz, Hut ab, das hätte ich schon aufgegeben. Ja ja, OT, aber der mußte raus.
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
> 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
>> 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. :((
@alex Ich habe nach dem WIE gefragt und nicht ob du hast. Dann gibt mal den Thread durch wo du dies gefunden hast.
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.
>damit ist der uC nicht mehr verwendbar.
Naja, man kann ihn schon noch wieder zum Leben erwecken, nur nicht per
SPI.
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
> Stell den mal auf 1 Mhz oder so ein. Ausgangsspannung 5 Volt
Welche spannung? rechteck? sinus? dreieck? mit negativer welle(
rechteck)?
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.
> Positive Rechteckspannung... > Rechteck, 5V danke, werde ich mal probieren!
> 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... d.
> ...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.
soooo :)))) $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 Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising Dim W3 As Long Dim U As Single Enable Icp1 Enable Interrupts Cls Locate 1 , 1 Lcd "UpM" Oncapture: Disable Interrupts W3 = Timer1 Timer1 = 0 Enable Interrupts Do U = -134.6153 * W3 U = W3 + 8942.3027 Lcd U Locate 2 , 1 Waitms 60 Loop klappt nicht! 1000 UpM - 59 8000 UpM - 7 habe für k -134,6153 ---------d 8942,3027 display VOLLGESCHRIEBEN! unlesbar :( Anzeige formatieren? aber wie?
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.
> Du änderst dein Pgm völlig sinnlos
Warum? ich kann es erklähren, warum ich das so gemacht habe
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?
...das ist dann wirklich ein ganz hartes Lehrgeld. d.
Dann man los! Hast du das alte Programm wenigstens gesichert?
@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.
hab das programm etwas bearbeitet. es wird "UpM" umd die Drehlazhl (zwar eine falsche) in der 1. zeile angezeigt :( 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 Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising Dim W3 As Long Dim U As Single Enable Icp1 Enable Interrupts Oncapture: Disable Interrupts W3 = Timer1 Timer1 = 0 Enable Interrupts Cls Locate 1 , 1 Lcd "UpM" U = -134.6153 * W3 U = W3 + 8942.3027 Lcd U Locate 2 , 1 Return
> Lcd U > Locate 2 , 1 erst schreibst du den errechneten Wert aufs Display, danach setzt du den Cursor. Das geht zumindest das erste Mal schief. MW
> 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?
Verstehe ich nicht, warum man sich nicht damit beschäftigt??? So kann keine Software vernünftig funktionieren.
bei hoher frequenz ändert sich das ganze viel zu schnell. und ich glaube meine umrechnung stimmt nicht! :( weil UpM zur Frequenz GAR nicht passt
> Verstehe ich nicht, warum man sich nicht damit beschäftigt???
was mache ich denn schon seit monaten?
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.
Wollt es nur nich so genau sagen. Stimmt aber
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?
'...1000UpM sind ja beim 4-takt motor 4000 impulse pro minute...' Wie kommst du darauf? Und vor allem: welche Impulse nimmst du denn ab?
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.
...
^^^---- das verdrängt er ja schon erfolgeich seit einigen monaten : >
Kann mir einer bitte sagen, ob meine Berechnung überhaupt richtig ist?! Paar posts höher
> ....alles Falsch!
wo liegt denn der Fehler? 1000UpM sind keine 4000 impulse pro minute?
oder ist die Rechnung selbst falsch?
10000Upm sind 10000/60 Umdrehungen pro Sekunde.
> 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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.