bin immernoch an probieren....... das klappt aber nicht! :((

Gast #435834
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.
Gast #435849
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.






#435855
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.

Gast #435858
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!
????????
Gast #435870
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...
Gast #435882
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...
#435901
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.


Gast #435908
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???
Gast #435930
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!  :((((
Gast #435932
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
#435937
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.
Gast #435940
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!
#435945
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, ...

#435958
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
#435965
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.
Gast #436247
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"
 ?????????
#436498
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.
Gast #436524
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???????
#436537
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?


#436540
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?
Gast #436694
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??
#436731
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.
Gast #436805
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!
#436920
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.

Gast #437102
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?!
Gast #437139
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?
Gast #437219
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?
#437235
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
#437246
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.

Gast #437249
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?
Gast #437272
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.
#437276
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
Gast #437287
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
#437292
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.
Gast #437304
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!!!!)
#437311
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.
Gast #437312
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 ?!
Gast #437315
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
#437322
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.
#437329
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.
Gast #437330
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?
#437338
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.
Gast #437340
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?
Gast #437348
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.
Gast #437349
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
Gast #437354
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?
Gast #437369
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.

Gast #437382
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 ;-)
Gast #437390
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
Gast #437407
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
Gast #437410
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?
Gast #438102
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren