Was alles setzt das Err Flag`?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Pluto25 schrieb:

      Die 115 sind gängig , 128k gehen auch bei 256k gibt der Bascom Output auf,
      Ich hatte mit der Baudrate nicht gemeint, dass man so noch erhöhen sollte. Sondern die Baudrate verringern.
      9600 Baud bis 38400 Baud sollte doch auch reichen.

      Pluto25 schrieb:

      Immer noch die Err Auswertung. Es soll dann kommen wenn ein gerät nicht vorhanden ist oder nicht richtig reagiert jedoch nicht solange alles stimmt.
      Du meinst das ERR-Flag soll gesetzt werden, wenn ein Fehler auftritt. Und sonst nicht!

      Aber es wird ein Grund geben, wenn das Flag gesetzt wird.
      Vielleicht wird das Register irgendwo (versehentlich) benutzt?
      Das Err-Flag ist ja nichts anderes an Bit 2 und Register r6.
      Vielleicht verpasst das Programm aber wegen Laufzeiten das Ack-Flag.

      Pluto25 schrieb:

      Der Code Explorer ist soweit fröhlich. Er meldet nur das altbekannte "Out of Bonds"
      Eine Fehleranzeige, auch wenn sie altbekannt ist, sollte ein Programmierer nicht ignorieren. Fehlern (und auch Warnungen) nachzugehen und beseitigen ist immer eine gute Taktik!
      Den Fehler bekommst du weg, wenn du bei bei den Arrays _base mit angibst.

      Also anstatt
      Loadadr Ubuf , X
      solltest du schreiben
      Loadadr Ubuf(_base) , X

      _Base ist der 1. Index vom Array. Egal ob das Array bei Index 1 oder bei 0 beginnt.

      Oder schreibe anstatt
      Dim C As Byte At Ubuf Overlay

      so:
      Dim C As Byte At Ubuf(_base) Overlay

      Mal einen gut gemeinten Tip:

      Schreibe mal den Code sauber. Damit meine ich,
      • Die Stacks ordentlich angeben (nicht überlappend und jeder ausreichend groß)
      • Alle verwendeten Register in der ISR sichern und wieder herstellen.
      • Keine Rückgabewerte von der ISR per Register, sondern über eine globale Variable.
      • Korrigiere die Array-Angaben mit _base, dass keine Fehler mehr im Code-Explorer angezeigt werden.

      Wenn jetzt der Tiny zu klein werden sollte wegen zu geringem SRAM, dann nimm was größeres, bis du die Fehlerursache eindeutig gefunden und beseitigt hast.
      Den Code dann bitte auch mal Posten.

      Dann kannst du versuchen, schrittweise wieder zurück zu gehen.
      Damit meine ich jetzt eigentlich nur den Stack verkleinern. Überlappungen vermeiden.
      Vielleicht muss es ja auch nicht unbedingt der Tiny13 sein, oder?
    • Mitch64 schrieb:

      überlappenden Stacks
      und vielen ander Hinweise, die ein gutes Programm ausmachen.
      Dafür ein Like an @Mitch64 :thumbup:

      @Pluto25
      es ist ja schön, wenn du Grenzen austestest, aber vor dem rennen muss man laufen lernen.
      Ich verfolge den Thread mit großem Interesse, den Tips von Mitch64 brauche ich aber nichts mehr hinzufügen, deshalb schreibe ich hier nichts.
      Doch: Hör drauf :D
    • Mitch64 schrieb:

      Vielleicht muss es ja auch nicht unbedingt der Tiny13 sein
      Er lag aber doch so gelangweilt hier rum :sleeping: .
      Das mit dem sauberen Code hatte ich ja im 85 ohne Änderung. a_166_29aea317 ;(
      Bei der Baudrate dachte ich :wo er doch nichts anderes tut kann er auch schneller zuhören. Bei 9600 spürt man schon die Laufzeit.
      Ich habs nun nochmal mit eine vollen Sequenz durch dem Simulator geschickt.
      Man darf die "to" Variable innerhalb der Schleife nicht verändern. a_45_132ca9f5
      Da B in 73 (For B = 1 To C) war das Problem. Es in durch Zeile 57 (For A = 0 To B) noch in Gebrauch.

      Michael schrieb:

      Doch: Hör drauf
      Hatte ich ja versucht nur half es nicht.
    • Michael schrieb:

      aber vor dem rennen muss man laufen lernen.
      Schön gesagt! Und danke für den Like. Bekommt man ja nicht alle Tage von einem Admin.


      Pluto25 schrieb:

      Er lag aber doch so gelangweilt hier rum
      Man wählt einen Controller nach Kriterien, die für eine Anwendung nötig sind.
      Eins wäre der SRAM. Deswegen versuchst du vermutlich den Stack wegzuoptimieren.
      Dabei muss man aber wissen, welcher Stack in welche Richtung wächst, und was danach liegt.


      Pluto25 schrieb:

      Bei 9600 spürt man schon die Laufzeit.
      Deswegen habe ich ja bis 38400 Baud vorgeschlagen.
      Dabei gilt aber immer, je höher die Baudrate, umso zeitkritischer wird es. Vor allem, wenn man einen Takt hat, mit dem man nicht auf 0% Fehlerrate kommt.

      Ich habe noch was kritisches an deinem Code entdeckt:

      BASCOM-Quellcode

      1. Do
      2. If R21 = 1 Then '6/5
      3. '#if _sim = 0
      4. Print #1 , Ustr '; Chr(uein)
      5. '#endif
      6. 'Err = 0 '3
      7. B = R22 - 1 '6
      8. For A = 0 To B '12/9
      In zeile 2 fragst du direkt ein Register ab. Sowas kann ins Auge gehen. Welche Register werden denn vom Compiler benutzt, um diese If-Anweisung umzusetzen?

      Dann gibst du mit Print einen String in Zeile 4 aus. Das ist in sofern bedenklich, dass da intern eine ganze Menge an Routinen durchlaufen werden.
      Und die könnten das Register r22 verändern.
      Und genau das Register nimmst du dann in Zeile 8 als Endwert für den Zähler.
      Ich würde das als äußerst bedenklich bezeichnen.

      Je länger ich in deinen Code studiere, um so mehr finde ich, wo etwas schief laufen könnte.

      Aber angeblich haste ja jetzt den Fehler.
    • Mitch64 schrieb:

      Was wird da eingelesen?
      Sequenzen für ein I2C Gerät z.b.
      W D0 00 S R D1 07 S
      um Uhrzeit und Datum aus einer Rtc zu lesen. Oder
      W7C ACA8 8C88 S
      = Locate 2,1 bei einen Lcd mit Pcf
      Kennt da jemand die richtigen Anweisungen für den LCD Treiber HD44780?
      Mit Adresse 40-4F erreiche ich immer nur die erste Zelle der zweiten Zeile,
      während 0-F die erste Zeile richtig localisiert ?
    • Wenn ich dich recht verstehe, dann sendet der PC eine textuelle Anweisung an den Controller.
      Der PCInt-Pin ist also der RxD-Eingang.

      Also du sendest vom PC etwas an den Controller, und der soll das auf dem I2C-Bis ausgeben.
      Und mit einem Lese-Kommando liest du dann wieder.

      Und der I2C sendet nix von sich aus, verhält sich also wie ein Slave. Korrekt?

      Warum konfigurierst du nicht einen Pin als RxD Eingang, so wie du es auch für den TxD gemacht hast?
      Auch für das Wandeln von Hex in Binärwert bietet Bascom eine Function Namens HexVal() an.
      Warum hast du diese nicht genommen?

      Also wenn meine Annahme mit der Funktion von deinem Umsetzer stimmt,
      dann könntest du doch ganz einfach vorgehen.

      PC sendet z.B. die Adresse zum Schreiben.
      Ist das Byte angekommen, wird es auf den I2C-Bus ausgegeben.
      Dann wird das Ack och Nack von I2C-Bus gelesen und via TxD an den PC gesendet.

      Der entscheidet dann, wie es weiter geht, also je nach Ack/NAK, werden dann Datenbytes gesendet.

      Beim Lesen läuft es ähnlich ab

      Also es ist ein Byte-Byte Transfer. Und nicht eine ganze Sequenz (Anweisung) auf einmal
      Das wäre mal ein Konzept, wo sich nichts in die Haare kriegt von I2C und serieller Schnittstelle.
      Da dürfte dann auch die Baudrate keine Rolle spielen und auch mit 9600 Baud funktionieren.

      So fällt dann auch dein riesiger Buffer mit 53 Byte weg und du kannst vernünfitige Stackwerte setzen.
      Das sollte auch mit deinem tiny13 funktionieren.

      Das mal als Anregung.
    • Mitch64 schrieb:

      Warum hast du diese nicht genommen?
      Die brauchte zu viel Flash, zu lange , passende Variablen und gibt nicht immer zweistellig aus.

      Mitch64 schrieb:

      Also es ist ein Byte-Byte Transfer.
      Das würde vermutlich auch funktionieren. Ursprünglich bin ich davon ausgegangen das die I2C Geräte keine beliebig langen Pausen zwischen zwei Bytes mögen. Aber das scheint ihnen völlig egal zu sein.
      Im Moment hänge ich noch an den Lcd Befehlen. Dann kommt der pingelige AM dran, mal sehen wie der auf einzel Bytes reagiert.

      Mitch64 schrieb:

      Beim Lesen läuft es ähnlich ab
      Das braucht nicht viel buffer und gibt die Bytes schon einzeln ab (da es erheblich mehr als die Buffergröße sein können , jedoch nur max 256)