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!

    • Was alles setzt das Err Flag`?

      Hallo,
      bisher habe ich das Err nur zur I2C Geräte Prüfung benutzt. Jedoch wird es auch von was anderem? gesetzt. Obwohl alle Daten korrekt eingelesen wurden ist Err = 1 . Soweit ich weiß wird es gesetzt wenn ein erwachtetes Ack nicht erfolgt. Auch bei Stack Überschneidungen? Oder Interrupts bei SW-Uart Sendungen?
    • Pluto25 schrieb:

      wird es gesetzt wenn ein erwachtetes Ack nicht erfolgt.
      Wann hat es sich denn schlafen gelegt :D . Das Wort heisst "erwartetes".
      Das aber nur mal am Rand.

      Laut Bascom-Hilfe wird das ERR-Flag nur bei I2C, 1Wire, $Framesize, $Serialinput, Hexval, Val, Open, Bccall und Pulsin gesetzt.
      Kann aber sein, dass ich noch etwas vergessen habe.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • djmsc schrieb:

      $Framesize,
      Vermutlich, er findet es wohl nicht lustig das sich die Stacks überlagern. Läst sich das irgendwie abschalten?
      Das passiert mitten im i2c Verkehr so das mir dortige Fehler evt entgehen.

      Mitch64 schrieb:

      Kann es sein, dass Bascom das Flag nur setzt und nicht löscht?
      Macht es , beim I2C-Find wird es ausgewertet ohne extra zurückgesetzt zu werden. ( Ein err = 0 vorher half auch nicht. ) Seltsamer weise passiert es nicht immer. Vieleicht habt Ihr eine Idee?

      Quellcode

      1. 'Uart 2 I2C Umsetzer
      2. 'Protokoll: w-Write , r-Read und s-Stop
      3. 'alle Werte HEX (zweistellig),kein oder beliegiger Trenner (<asc48)
      4. 'CrLf als end
      5. 'max 48 Zeichen
      6. 'wA0000000010203040506070809101112131415s
      7. $regfile = "attiny13.dat"
      8. $crystal = 9600000
      9. $hwstack = 8
      10. $swstack = 0
      11. $framesize = 0
      12. '$sim
      13. Config Base = 0
      14. Open "COMb.4:115200,8,n,2" For Output As #1
      15. On Pcint0 P_isr Nosave
      16. Pcmsk = $08 'Nur b.3
      17. Gimsk = $20 'Nur PCint
      18. Config Sda = Portb.2
      19. Config Scl = Portb.1
      20. I2cinit
      21. 'Config I2cdelay = 10
      22. Const Ub = 20
      23. 'Dim Uein(R22) As Byte , Uneu (R21) As Byte
      24. Dim A As Byte , B As Byte
      25. Dim Ubuf(49) As Byte
      26. 'Dim Hexstr As String * 2 At Ubuf Overlay
      27. Dim C As Byte At Ubuf Overlay
      28. Dim D As Byte At Ubuf + 1 Overlay
      29. Dim Ustr As String * 48 At Ubuf Overlay
      30. Declare Sub I2chex
      31. Declare Sub Hex2byte
      32. Enable Interrupts
      33. For A = 0 To 63
      34. Readeeprom B , A
      35. Printbin #1 , B
      36. Next
      37. Print #1,
      38. Do
      39. If R21 = 1 Then '6/5
      40. Print #1 , Ustr '; Chr(uein)
      41. Err = 0 '3
      42. B = R22 - 1 '10/7
      43. For A = 0 To B
      44. If Ubuf(a) = $53 Then ' (s)top '11/10
      45. #if _sim = 0
      46. I2cstop
      47. #endif
      48. Elseif Ubuf(a) = $57 Then '10 (w)rite
      49. I2cstart '80
      50. Incr A '6
      51. I2chex
      52. Elseif Ubuf(a) = $52 Then '11 (r)ead
      53. I2cstart
      54. Incr A
      55. I2chex
      56. Incr A
      57. Hex2byte
      58. For B = 2 To C
      59. I2crbyte D , Ack
      60. Printbin #1 , D
      61. Next
      62. I2crbyte D , Nack
      63. Printbin #1 , D
      64. Else
      65. I2chex
      66. End If
      67. Next '9
      68. If Err = 0 Then
      69. Print #1 , "-Ack"
      70. Else
      71. Print #1 , "-Nak"
      72. End If
      73. R22 = 0
      74. R21 = 0
      75. End If
      76. Loop
      77. End
      78. Sub Hex2byte '3
      79. !lds r18 ,{a} '2 Lade buffer zeiger
      80. Loadadr Ubuf , X '1 Bufferadresse holen
      81. !add r26,r18 '1 Zeiger addieren
      82. !Ld R16 , X '2 Inhalt holen
      83. !cpi r16,$40 '1 Vergleiche $40
      84. !Brlo Ihexl '2/1 wenn kleiner zu ihexl
      85. !Subi r16,247 '1 addiere 9
      86. !Ihexl:
      87. !andi r16,$f '1 and $F
      88. !Swap R16 '1 Nibbles tauschen (shift left 4)
      89. !inc r26 '1 Zeiger erhöhen
      90. !Ld R17 , X '2 Inhalt holen
      91. !cpi r17,$40 '1
      92. !Brlo Ihexh '2/1
      93. !Subi r17,247
      94. !Ihexh:
      95. !andi r17,$f '1
      96. !add r16,r17 '1
      97. !inc r18 'Subi r18,254 '1 addiere 2
      98. !sts {a},r18 '2
      99. !sts {c},r16 '2
      100. End Sub '#34
      101. Sub I2chex '3
      102. Hex2byte
      103. I2cwbyte C 'Hexval(hexstr) '736
      104. End Sub '4
      105. P_isr: '55 / 2 nosave
      106. !Sbic pinb,3 '2 if b.3=0 überspringe nächsten Befehl
      107. !jmp Ist1 ' gehe zum ende
      108. !PUSH r16 '2 verwendete Register sichern
      109. !IN r16,sreg '1
      110. !PUSH r16 '2
      111. !PUSH r17 '2 Wartezähler
      112. !PUSH r24 '2 RxByte
      113. !PUSH r26 '2 bitzähler/Adresse
      114. !PUSH r27 '2 Adresse High?? # 17
      115. Gimsk = 0 '2 pcint stop
      116. !set '1 T=1 für Bitset r24
      117. !clr r24 '1 leeren da nur 1 gefüllt wird
      118. !ldi r16,ub '1 lds r16,{ub} (wenn byte)
      119. !ldi r26,8 '1 #3
      120. Lopx:
      121. !LSr r24 '1
      122. !dec r26 '1
      123. !ldi r17,255 '1
      124. Lop0:
      125. !inc r17 '1
      126. !cpse r16,r17 '1 /2
      127. !jmp lop0 '2
      128. !Sbic pinb,3 '2
      129. !bld r24,7 '1 #5/6 b=0 10b=1
      130. !cpi r26,0 '1
      131. !brne lopx '2/1 #10/11
      132. Loadadr Ubuf , X '1 Array Adresse holen
      133. !add r26,r22 '1 index addieren
      134. !CPI r24,10 '1 lf empfangen?
      135. !BRne Isr_1 '2 wenn nicht weiter zu isr1
      136. !ldi r21,1 '1
      137. !clr r16
      138. '!inc r26 '1
      139. !st x,r16 '2 nullbyte für Uinstr (incl CrLf)
      140. !jmp fertig '
      141. Isr_1:
      142. !CPI r22,44 '1 Vergleiche mit 44
      143. !BRsh fertig '2/1 Wenn >= zu Isr:1
      144. !cpi r24,$30 '1 vergleiche mit $30
      145. !BRlo fertig '2/1 Wenn < zu fertig
      146. !cpi r24,$60 '1 vergleiche mit $60
      147. !BRlo gros '2/1 Wenn < zu gros
      148. !ANDI r24,$df '1 erzeuge Großbuchstaben
      149. Gros:
      150. !ST x,r24 '2 RxByte speichern
      151. !inc r22 '1 incr r17 (Uein)
      152. Fertig:
      153. Gimsk = $20 '2 'pcint frei
      154. !POP r27 '2 verwendete Register wieder herstellen
      155. !POP r26 '2
      156. !POP r24 '2
      157. !POP r17 '2
      158. !POP r16 '2
      159. !OUT SREG,r16 '1
      160. !POP r16 '2
      161. Ist1: '# 10 wenn 1
      162. Return '#132
      Alles anzeigen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      Seltsamer weise passiert es nicht immer. Vieleicht habt Ihr eine Idee?
      Ich finde die Stackwerte mit 0 ungewöhnlich.
      Auf die Schnelle sehe ich aber auch nicht, wo da was auf Frame oder SWStack kommt.


      Pluto25 schrieb:

      P_isr: '55 / 2 nosave
      !Sbic pinb,3 '2 if b.3=0 überspringe nächsten Befehl
      !jmp Ist1 ' gehe zum ende
      Wenn die Prüfung SBIC ein Flag ändert, musst du vorher das Statusregister sichern.

      Das kann man mit dem Simulator prüfen.

      Edit:
      Außerdem verwendest du r21 und r22 in der ISR, ohne sie zu sichern/wiederherzustellen.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Mitch64 ()

    • Mitch64 schrieb:

      wo da was auf Frame oder SWStack kommt.
      Die Sub(2) sowie Print und i2c Befehle (je 8) nutzen ihn gemeinsam aufeinander bis zu 12 Byte. Sub(2) in Sub (nochmal 2) und dann noch i2c (8) - zusammen 12. Damit überschreiben sie den Buffer. Das ist jedoch kein reales Problem da ich bisher noch keine Leseanfrage mit 48 Zeichen stellen brauchte. Beim Schreiben ergibt sich das Problem nicht.

      Mitch64 schrieb:

      Wenn die Prüfung SBIC ein Flag ändert
      Ja sowas könnte ungeahnte Probleme verursachen, glücklicherweise braucht Sbig keine Flags.

      Eigendlich sollte die Sonnenbrille eine 8 werden. a_27_b277ca12

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      Gimsk = $20 'Nur PCint
      Diese Anweisung verändert r23, was auch nicht gesichert wird in der ISR.

      Die anderen habe icg oben in #6 schon genannt.
      Korrigiere das erst mal und probier.
      Vielleicht ist noch mehr.


      Pluto25 schrieb:

      Die Sub(2) sowie Print und i2c Befehle (je nutzen ihn gemeinsam aufeinander bis zu 12 Byte.
      Das kapiere ich nicht.
      SWStack ist 0 und Framesize ist auch 0.
      Wie können die dann 12 Byte gemeinsam benutzen?
    • Mitch64 schrieb:

      verwendest du r21 und r22
      Die werden nicht gebraucht, so kann ich Ram sparen. Bei 23 bin ich unentschlossen - Es würde in jedem Fall crashen ihn anzusprechen wärend er mit dem i2c Gerät spricht.

      Mitch64 schrieb:

      Wie können die dann 12 Byte gemeinsam benutzen?
      Er ist klug genug die Rücksprungadressen der Subs nicht zu überschreiben solange sie gebraucht werden. Sind sie erledigt nutzt er diese Zellen wieder.

      Mitch64 schrieb:

      Korrigiere das erst mal
      Genau, eigendlich müste ich nur das Reg,16 und 20 sichern - wieder ein paar Byte (16) mehr Flash
    • Mitch64 schrieb:

      Und dein Programm nicht läuft?
      Es läuft gut, alleine durch die Sammelmeldung "err" ist unklar ob das I2c Gerät ein Problem hatte wodurch ein weiteres lesen nötig wäre falls man es genau wissen will.
      Möglicherweise versteifen wir und hier zu sehr auf die Stacks. Es scheint auch von den Geräten abzuhängen oder vom Timing ? Bei der RTC werden nur 10 Bytes noch mit Ack bestätigt während alle 64 korrekt ankommen, bei dem At sinds 12 obwohl sicher 73 korrekt sind. Die Stacks (über)füllen sich schon beim ersten.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pluto25 ()

    • Mitch64 schrieb:

      damit du einen Absturz merkst.
      Der PC bekommt seine Frage und die Daten zurück. Käme nichts wäre es klar. Auch hat es keine Plausibilitätsprüfung, so das er alles was kommt weiterschickt, natürlich mit "Nak" als Antwort, wenn kein Gerät antwortet. Gäbe es Abstürze käme gar nichts oder Müll zurück.
      Hat man eine Chance die Acks (bzw fehlenden Ack) mit einem Scope zu sehen?
    • Ich habe es nun mit einem tiny85 versucht mit dem selben Ergebnis. Auch große Stacks, das Sichern aller Register und die Verwendung normaler Variablen haben keinen Unterschied gemacht. Es liegt auch nicht an den I2C Geräten. Die Ausgabe Err anstelle des empfangenen Bytes zeigte immer 0. Der Fehler muß irgendwo zwischen dem letzten Durchlauf (nach Stop ist Err auch noch 0) und dem Print außerhalb der Schleife liegen. Und das irgendwie Adressabhängig. (A0 max 12, D0 max 10 und 7C auch maximal 10)
    • Pluto25 schrieb:

      Ich habe es nun mit einem tiny85 versucht mit dem selben Ergebnis. Auch große Stacks, das Sichern aller Register und die Verwendung normaler Variablen haben keinen Unterschied gemacht. Es liegt auch nicht an den I2C Geräten. Die Ausgabe Err anstelle des empfangenen Bytes zeigte immer 0. Der Fehler muß irgendwo zwischen dem letzten Durchlauf (nach Stop ist Err auch noch 0) und dem Print außerhalb der Schleife liegen. Und das irgendwie Adressabhängig. (A0 max 12, D0 max 10 und 7C auch maximal 10)
      Zeig doch mal, wie dein Code aktuell aussieht.

      Edit:
      und sag auch nochmal, was konkret Probleme macht.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()

    • Der 85 ist wieder im Lager . Hier der letzte im Tiny 13.

      Quellcode

      1. 'Uart 2 I2C Umsetzer
      2. 'Protokoll: w-Write , r-Read und s-Stop
      3. 'alle Werte HEX (zweistellig),kein oder beliegiger Trenner (<asc48)
      4. 'CrLf als end
      5. 'max 48 Zeichen
      6. 'wA0000000010203040506070809101112131415s
      7. $regfile = "attiny13.dat"
      8. $crystal = 9600000
      9. $hwstack = 8
      10. $swstack = 0
      11. $framesize = 0
      12. '$sim
      13. Config Base = 0
      14. Open "COMb.4:115200,8,n,2" For Output As #1
      15. On Pcint0 P_isr Nosave
      16. Pcmsk = $08 'Nur b.3
      17. Gimsk = $20 'Nur PCint
      18. Config Sda = Portb.2
      19. Config Scl = Portb.1
      20. I2cinit
      21. 'Config I2cdelay = 100
      22. 'Baud 256 128 115 57,6 56 38,2 28,8 19,2 14,4 9,6 4,8 2,4 1,2
      23. '9,6M 6 18 20 44 45 68 92 140 188 - (nur 20 getestet)
      24. '8Mhz 5 14 16 36 37 56 76 116 156 237 - - -
      25. '4Mhz - 5 6 16 17 26 36 56 76 116 237 - -
      26. '2Mhz - - - 6 6 12 16 26 36 56 116 237 -
      27. '1Mhz - - - - - - 6 11 16 26 56 116 237
      28. 'Dim Ub As Byte : Ub = 20
      29. Const Ub = 20
      30. 'Dim Uein(R22) As Byte , Uneu (R21) As Byte
      31. Dim A As Byte , B As Byte
      32. Dim Ubuf(53) As Byte
      33. 'Dim Hexstr As String * 2 At Ubuf Overlay
      34. Dim C As Byte At Ubuf Overlay
      35. Dim D As Byte At Ubuf + 1 Overlay
      36. Dim Ustr As String * 52 At Ubuf Overlay
      37. Declare Sub I2chex
      38. Declare Sub Hex2byte
      39. Enable Interrupts
      40. For A = 0 To 63
      41. Readeeprom B , A
      42. Printbin #1 , B
      43. Next
      44. Print #1,
      45. Do
      46. If R21 = 1 Then '6/5
      47. '#if _sim = 0
      48. Print #1 , Ustr '; Chr(uein)
      49. '#endif
      50. 'Err = 0 '3
      51. B = R22 - 1 '6
      52. For A = 0 To B '12/9
      53. If Ubuf(a) = $53 Then ' (s)top '11/10
      54. #if _sim = 0
      55. I2cstop '177
      56. R15 = Err '4
      57. #endif
      58. Elseif Ubuf(a) = $57 Then '10 (w)rite
      59. I2cstart '173
      60. Incr A '6
      61. I2chex '1357
      62. Elseif Ubuf(a) = $52 Then '11 (r)ead
      63. I2cstart '173
      64. Incr A
      65. I2chex '1078
      66. Incr A '6
      67. Hex2byte '31
      68. For B = 1 To C '12
      69. I2crbyte D , Ack
      70. Printbin #1 , D
      71. Next
      72. I2crbyte D , Nack '1128
      73. Printbin #1 , D '925
      74. Else '2
      75. I2chex '1178
      76. End If
      77. Next '9
      78. If R15 = 0 Then '5 If Err = 0
      79. Print #1 , "-Ack" '5569
      80. Else
      81. Print #1 , "-Nak"
      82. End If
      83. R22 = 0 '1
      84. R21 = 0 '1
      85. End If
      86. Loop '2
      87. End
      88. Sub Hex2byte '3 Hexval(hexstr) '736
      89. !lds r18 ,{a} '2 Lade buffer zeiger
      90. Loadadr Ubuf , X '1 Bufferadresse holen
      91. !add r26,r18 '1 Zeiger addieren
      92. !Ld R16 , X '2 Inhalt holen
      93. !cpi r16,$40 '1 Vergleiche $40
      94. !Brlo Ihexl '2/1 wenn kleiner zu ihexl
      95. !Subi r16,247 '1 addiere 9
      96. !Ihexl:
      97. !andi r16,$f '1 and $F
      98. !Swap R16 '1 Nibbles tauschen (shift left 4)
      99. !inc r26 '1 Zeiger erhöhen
      100. !Ld R17 , X '2 Inhalt holen
      101. !cpi r17,$40 '1
      102. !Brlo Ihexh '2/1
      103. !Subi r17,247
      104. !Ihexh:
      105. !andi r17,$f '1
      106. !add r16,r17 '1
      107. !inc r18 'Subi r18,254 '1 addiere 2
      108. !sts {a},r18 '2
      109. !sts {c},r16 '2
      110. End Sub '#31
      111. Sub I2chex '3
      112. Hex2byte
      113. I2cwbyte C 'Hexval(hexstr) '736
      114. R15 = Err
      115. End Sub '4
      116. P_isr: '55 7µs / 2 nosave
      117. !Sbic pinb,3 '2 if b.3=0 überspringe nächsten Befehl
      118. !jmp Ist1 ' gehe zum ende
      119. !PUSH r16 '2 verwendete Register sichern
      120. !IN r16,sreg '1
      121. !PUSH r16 '2
      122. ' !PUSH r17 '2 Wartezähler
      123. ' !PUSH r24 '2 RxByte
      124. ' !PUSH r26 '2 bitzähler/Adresse
      125. ' !PUSH r27 '2 Adresse High?? # 17
      126. !clr r24
      127. ' !STs $3b,r24
      128. 'Gimsk = 0 '2 pcint stop
      129. !set '1 T=1 für Bitset r24
      130. '!clr r24 '1 leeren da nur 1 gefüllt wird
      131. !ldi r16,ub '1 lds r16,{ub} (wenn byte)
      132. !ldi r26,8 '1 #3
      133. Lopx:
      134. !LSr r24 '1
      135. !dec r26 '1
      136. !ldi r17,255 '1
      137. Lop0:
      138. !inc r17 '1
      139. !cpse r16,r17 '1 /2
      140. !jmp lop0 '2
      141. !Sbic pinb,3 '2
      142. !bld r24,7 '1 #5/6 b=0 10b=1
      143. !cpi r26,0 '1
      144. !brne lopx '2/1 #10/11
      145. Loadadr Ubuf , X '1 Array Adresse holen
      146. !add r26,r22 '1 index addieren
      147. !CPI r24,10 '1 lf empfangen?
      148. !BRne Isr_1 '2 wenn nicht weiter zu isr1
      149. !ldi r21,1 '1
      150. !clr r16
      151. '!inc r26 '1
      152. !st x,r16 '2 nullbyte für Uinstr (incl CrLf)
      153. !jmp fertig '
      154. Isr_1:
      155. !CPI r22,52 '1 Vergleiche mit 44
      156. !BRsh fertig '2/1 Wenn >= zu Isr:1
      157. !cpi r24,$30 '1 vergleiche mit $30
      158. !BRlo fertig '2/1 Wenn < zu fertig
      159. !cpi r24,$60 '1 vergleiche mit $60
      160. !BRlo gros '2/1 Wenn < zu gros
      161. !ANDI r24,$df '1 erzeuge Großbuchstaben
      162. Gros:
      163. !ST x,r24 '2 RxByte speichern
      164. !inc r22 '1 incr r17 (Uein)
      165. Fertig:
      166. ' Gimsk = $20 '2 'pcint frei
      167. ' !POP r27 '2 verwendete Register wieder herstellen
      168. ' !POP r26 '2
      169. ' !POP r24 '2
      170. ' !POP r17 '2
      171. !POP r16 '2
      172. !OUT SREG,r16 '1
      173. !POP r16 '2
      174. Ist1: '# 10 wenn 1
      175. Return '#132
      Alles anzeigen
      Durch dem Umweg über R15 funktioniert es wie gewollt. Es ist eigendlich nur noch das unbehagen ein Problem nicht gefunden sondern umgangen zu haben. Als die Zeile 83 noch "if Err =0" hieß gab es immer -Nak (Err=1) aus wenn eine Abfrage (z.B. W D0 00 S R A1 0F S) mehr als 10(12) Bytes ausgeben sollte.
    • Ich weiß jetzt ja noch immer nicht, wo jetzt das Problem ist.

      Eines ist aber auch klar.
      Rückgabewerte von einer ISR per Register finde ich keine gute Idee (Ich weiß du denkst anders - wieder ein Takt gespart).

      Du weist ja nicht, wenn wenn dein Programm ab Zeile 58 am arbeiten ist, ob dann wieder ein Interrupt auftritt und das Register wieder ändert.

      Auch die überlappenden Stacks sind nicht zu empfehlen, wenn man nicht GANZ GENAU WEIS was man tut.
      Auch hast du noch immer Register in der ISR in Verwendung, die nicht gesichert werden.

      Du missachtest meiner Meinung nach eigentlich jede Regel, damit ein Programm sauber arbeiten kann.

      Was sagt eigentlich dein Codeexplorer zu deinem Programm bezüglich Fehler (Ich weiß, er kompilierts ja. Was der Codeexplorer meint ist dir wurscht?)?

      Auch 115200 Baud mit einem SoftwareUart bei einem Takt von 9,6MHz zu nehmen ist für mich nicht nachvollziehbar.
      Schließlich ist die Baudrate ja Zeitkritisch.

      Also wo ist jetzt dein Problem?
    • Mitch64 schrieb:

      Du weist ja nicht, wenn wenn dein Programm ab Zeile 58 am arbeiten ist
      Dann schmiert er in jedem Fall ab. Das ist dann der Fall wenn der Pc eine Weitere Anweisung erteilt ohne vorher das Ergebniss abzuwarten. Hatte ich gestern beim LCD. Die Anweisungen einer Zeile überschreiten den Buffer. Also mehrfach senden. Kein Problem wenn auch das Ok abgewartet wird. Dazu ist mir noch keine gute Lösung eingefallen. Da alles über Software läuft kann er nicht gleichzeitig Uart und I2C Anweisungen ausführen. Die Isr sperren würde jedoch unvollständige Anweisungen verursachen die dann auch zu unbrauchbaren Ergebnissen führen.
      Deine ganzen Bedenken waren beim 85 nicht mit den selben Auswirkungen

      Mitch64 schrieb:

      Was der Codeexplorer meint ist dir wurscht?)?

      Auch 115200 Baud mit einem SoftwareUart
      Ja,er geht bei mir nicht , aber ich werden mal nachschauen.
      Die 115 sind gängig , 128k gehen auch bei 256k gibt der Bascom Output auf, aber die sind auch weniger gängig. Im Augenblick brauchen die I2C länger als der Uart. Wenns zu langsam wird kann ich immer noch auf 256K hoch. Da ist ja keine Main Loop die während des Empfangs noch was wichtiges zu erledigen hätte. Und den I2C Geräten ist es egal wie lang die Zeit zwischen zwei Bytes ist die sie senden sollen.

      Mitch64 schrieb:

      Also wo ist jetzt dein Problem?
      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. Zur Zeit funktioniert es gut genug Geräte zu finden aber es meldet auch (nicht vorhandenen)Fehler wenn diese mehr als 10 Daten senden.

      Der Code Explorer ist soweit fröhlich. Er meldet nur das altbekannte "Out of Bonds"