www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik bin immernoch an probieren....... das klappt aber nicht! :((


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sage er lich: mache nie etwas, was du nicht verstehts.

Autor: Martin Kreiner (maart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Wegstabenverbuchsler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.







Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!
????????

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also am port D geht pind.0 - pind.8
ich habe beispielsweise im code pind.1 stehen...
reagiert aber trotzdem nur pind.8

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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...

Autor: Ludwig Wagner (lordludwig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sorry, sehe jetzt auch!
habe mit Target layout gemacht.. und da zeigt er wirklich PD8 an!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.



Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Formtapez war doch schon so nett ein komplettes Beispiel / fertiges 
Projekt vorzustellen in Bascom.

Beitrag "Drehzahlmesser 4 mal 7-segment mit 90S2313"

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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???

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> auf dem LCD : "17293"

habe jetzt den Funktionsgenerator am Pind.6 dran....
die Zahl ändert sich kein bisschen!
:((((((((((

Autor: Martin Kreiner (maart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und die Zahl "17293" wird immer exakt angezeigt? Obwohl an PD6 nichts 
angeschlossen ist? Merkwürdig.
Sonst sollte deine weitere Überlegung richtig sein.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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!  :((((

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> > 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 100 Herz müsstest du eine Ablesung von ca. 625 haben.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  $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, ...


Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$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

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> .....  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"
 ?????????

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Masseverbindung zwischen Mikrocontroller und FG hast du auch?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Masseverbindung zwischen Mikrocontroller und FG hast du auch?

"masse zwischen board und FG habe ich auch verbunden."

Autor: Branko Golubovic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie groß ist FG Ausgangspannung?
Du brauchst Amplitude von 0 bis 5V,minimal 0 bis 3V sonst reagiert 
ATmega nicht.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe Rechteck 10v PP
Reicht das???
Funzt nicht!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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???????

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?



Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Andre S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;)

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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??

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Optocoupler ist falsch angeschlossen. Der interne Pullup muss 
eingeschaltet sein.


  FG ----|R|---|>|-          |------- PD6
                   |        <
                   |         |
                   |         |
                  ---       ---

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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!

Autor: unsichtbarer WM-Rahul (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Tassilo Böhr (big_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin Kreiner (maart)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> 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.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Geduld hätte ich manchmal gerne, Karl Heinz... :-)

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl Heinz, Hut ab, das hätte ich schon aufgegeben.

Ja ja, OT, aber der mußte raus.

Autor: Tassilo Böhr (big_t)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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.


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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. :((

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@alex
Ich habe nach dem WIE gefragt und nicht ob du hast.
Dann gibt mal den Thread durch wo du dies gefunden hast.

Autor: Andre S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>damit ist der uC nicht mehr verwendbar.

Naja, man kann ihn schon noch wieder zum Leben erwecken, nur nicht per 
SPI.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Stell den mal auf 1 Mhz oder so ein. Ausgangsspannung 5 Volt

Welche spannung? rechteck? sinus? dreieck? mit negativer welle( 
rechteck)?

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Positive Rechteckspannung...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Positive Rechteckspannung...
> Rechteck, 5V


danke, werde ich mal probieren!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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!!!!)

Autor: Andre S. (dg2mmt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?!

Autor: dschedsche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...das ist dann wirklich ein ganz hartes Lehrgeld...

d.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ...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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du änderst dein Pgm völlig sinnlos

Warum? ich kann es erklähren, warum ich das so gemacht habe

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...das ist dann wirklich ein ganz hartes Lehrgeld.

d.

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann man los! Hast du das alte Programm wenigstens gesichert?

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 > 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Anderer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe ich nicht, warum man sich nicht damit beschäftigt??? So kann 
keine Software vernünftig funktionieren.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei hoher frequenz ändert sich das ganze viel zu schnell.
und ich glaube meine umrechnung stimmt nicht! :( weil UpM zur Frequenz 
GAR nicht passt

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Verstehe ich nicht, warum man sich nicht damit beschäftigt???

was mache ich denn schon seit monaten?

Autor: Anderer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Codes kopieren...und ändern

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.


Autor: Anderer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollt es nur nich so genau sagen.  Stimmt aber

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pssst, nicht vorsagen!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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       <----------------

Autor: vorbeigeschlendert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'...1000UpM sind ja beim 4-takt motor 4000 impulse pro minute...'
Wie kommst du darauf? Und vor allem: welche Impulse nimmst du denn ab?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Patrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
passt bei mir nicht! :(((

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

...

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
^^^----

das verdrängt er ja schon erfolgeich seit einigen monaten : >

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir einer bitte sagen, ob meine Berechnung überhaupt richtig ist?!
Paar posts höher

Autor: Rechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
....alles Falsch!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ....alles Falsch!

wo liegt denn der Fehler? 1000UpM sind keine 4000 impulse pro minute?
oder ist die Rechnung selbst falsch?

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
10000Upm sind 10000/60 Umdrehungen pro Sekunde.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm

Autor: Stevko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Anderer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau mal hier:

Beitrag "Drehzahlmesser 4 mal 7-segment mit 90S2313"


hier kannste weiter klauen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.