Probleme mit vier Tastern

Hi Thomas,

danke für den Hinweis. Ich hatte nicht den Anspruch erhoben, auch bereits den Timer umzsetzen da ich nicht weiß ob wir mit dieser Idee bei Jens auf wohlgefallen stoßen. Schließlich wollte ich zunächst sein äußerst dubioses Tasten-Problem in den Griff bekommen :)

Grüße,
Markus
 
Hi,

danke für die guten Ratschläge. Ich habe das Problem gelöst. Jetzt bekomm ich aber ein weiteres Problem. Ich habe nun ein 16mhz quarz angeschlossen mit zwei 33pf Kondensatoren gegen Masse. Wenn ich das im Programm mit $Crystal = 16000000 einstelle, bekomm ich dubiose Werte:shout: . Ist das ein Timing Problem? Wenn ich den Takt auf 10 Mhz runterdrehe funktioniert das Programm. Ich finde das ist auch nicht Sinn der Sache, wenn ich den Prozessor langsamer laufen lasse. Hat noch jemand einen Ratschlag für mich bereit?

Gruß
Jens
 
Hi Jens,

kannst Du mir znächst mit wenigen Worten beschreiben, was denn un der Fehler war? Oder hat es einfach irgendwann plötzlich getan?

Dann zu Deiner Frage mit dem Quarz. Hast Du vorher auch schon einen extern Quarz dran gehabt oder hast Du den Mega mit internem Clock verwendet? Wie sind denn Deinen Fuses gesetzt?

Grüße,
Markus
 
Hi,

der Fehler war folgender...

Code:
Dim Halb As Byte

Bei jeder anderen Variable wie Bit, Byte, Integer, Word und String fielen andere Taster aus oder Taster, die vorher nicht funktionierten hatten ihre Funktion wiederbekommen.

Alles funktioniert seitdem ich folgendes eingegeben habe.

Code:
Dim Halb as Long

Bit, Byte Integer und String kann ich mir ja erklären aber was mit Long ist???
Naja... Ich aktzeptier es erstmal so.

Hatte erst den internen RC Oszilator genommen. Jetzt möchte Ich den externen 16Mhz Quarz benutzen. Jtags sind auf dem Fusebit H an und ich habe den Prozessor auf einen externen Quarz gestellt.

Gruß
Jens
 
Hi Jens,

ok und hmmmmm. Habe nur noch nicht begriffen, was Variablen hier für einen Einfluss auf das Auslesen der Tasten haben sollen. Irgendwas ist komisch, selbst wenn ich es nicht verstehe....


Grüße,
Markus
 
Hi Jens,

ok und hmmmmm. Habe nur noch nicht begriffen, was Variablen hier für einen Einfluss auf das Auslesen der Tasten haben sollen. Irgendwas ist komisch, selbst wenn ich es nicht verstehe....


Grüße,
Markus

Hi Markus,

tja... das mit den Variablen möchte ich auch ganz gerne begreifen. Ich hab das mit dem Quarz endlich hinbekommen (Jtags waren daran schuld). Aber irgendetwas ist mit den Variablen ist oberfaul.

Gruß Jens
 
Verhalten !?!?!?!?

Hallo Jens,

das doch sehr ominöse Verhalten Deines Codes hat mir keine Ruhe gelassen und ich habe mir erneut Deinen Code angesehen.

Ich komme mehr und mehr zu der Annahme, das wir es in Deinem Fall mit einem klassischen Speicherüberschreiber zu tun haben.

Hier zunächst die relevanten Codestellen:
Code:
Dim Ds1820 As Integer
Dim Halb As Byte
....
   Ds1820 = 1wread(9)

....

Halb = Ds1820 And 1

Erläuterung:
- Du definierst zwei Variablen. Integer und Byte. Integer ist im Speicher 2 Byte groß, Byte ist 1 Byte groß!
- In der Routine zum Auslesen des Temperatursensors liest Du 9 Byte mit der Funktion 1wread(9) in eine Variable die im Speicher nur 2 Byte groß ist!!!!
- Dabei wird neben dem Speicherplatz für die Variable Halb sicherlich auch noch anderer Speicherplatz überschrieben. Vermutlich auch der Speicherplatz in dem sich Debounce in Bit-Feldern die Zustände für die PIN's merkt.

Fazit: Das kann nicht funktionieren, tut es aber mit Randeffekten :eek: Das ist aber nur reiner Zufall!!!!

So, was ist passiet das es mit LONG funktioniert......
Ich nehme folgendes an:
Long ist im Gegensatz zu Integer zwei Byte größer da es im Speicher 4 Byte benötigt. Damit verschiebt sich Dein ganzes Speichergefüge vermutlich für Dich so positiv, dass die Routinen für debounce in einen Speicherbereich wandern der nicht mehr überschrieben wird.

Wie gesagt, aus meiner Sicht es es reiner Zufall, dass es überhaupt funktioniert und Du hast dringenden Handlungsbedarf, Deinen Code sauber zu bekommen und die Funktion richtig zu imlementieren. Entweder Du liest Byte für byte einzeln oder Du liest die 9 Byte in ein 9 Byte großes Array um danach die für Dich wichtigen Daten dort rauszuholen oder oder oder. Als Beispiel stelle ich Dir gerne meinen Code zur Verfügungen den ich für einen DS18S20 geschrieben habe und im Rahmen meinen Zisternenfüllstandsanzeige hier im Forum veröffentlicht habe.

Ein Weiterer Punkt ist mir aufgefallen den ich oben auch als Code-Schnipsel mit angefügt habe.
Mit "Halb = Ds1820 And 1" machst Du gleichzeitig eine Bitoperation auf einen Integer (2Byte) und castest ihn gleichzeitig auf ein Byte. Aus meiner Erfahrung mit BASCOM ist hier größte Vorsicht geboten da BASCOM verettete Operationen oft noch nicht sauber abarbeitet. Ich hatte hier schon die größten Probleme.
Also was tun?
Lösung 1: Zuerst verunden (in eine Hilfvariable) und dann caste
Code:
Temp_int_var = Ds1820 AND 1
Halb = Temp_int_var
Lösung 2: Zuerst Casten und dann verunden
Code:
Halb = Ds1820
Halb = Halb AND 1
Das würde ich mir an Deiner Stelle nochmal genau ansehen.

Also wie gesagt, für mich ist es aktuell ein großes WUNDER dass der Code überhaupt funktioniert hat weil unter den oben beschriebenen Bedingungen nur Datenmüll hätte herauskommen müssen.

Um hier aber weiter eine Antwort zu finden müsste man sich den Assembler Code ansehen den BASCOM produziert um dann genau zu wissen, wo was liegt und was wie wann überschrieben wird. Aber ich glaube das können wir uns nach der hier beschriebenen Analyse sparen!

Schönen Abend und viel Spass beim Umbauen Deiner Software :D

Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)