Falscher Fehler : Register must be in Range...

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Falscher Fehler : Register must be in Range...

      Hallo,
      ich wollte einen (funktionierenden) Code in eine lib verbannen damit der Simulator ruhiger wird.
      Obwohl er sich ohne murren im lib-Manager Compilieren läßt verweigert der Compiler im Programm die Ausführung.
      Kann ich ihn irgendwie "überreden"?

      Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 921500
      3. $hwstack = $40
      4. $swstack = $40
      5. $framesize = $100
      6. $eepleave
      7. $version 0 , 0 , 18
      8. $sim
      9. Dim A As Byte , Am As Byte , Ad(8) As Word
      10. $lib "Free_adc_4_v_t.lib" 'als .lbx will es auch nicht
      11. $external _a2_isr
      12. Config Adc = Free , Prescaler = 32 , Reference = Aref
      13. On Adcc _a2_isr Nosave
      14. Enable Adcc
      15. Enable Interrupts
      16. #if _sim = 1
      17. Config Timer2 = Timer , Prescale = 1
      18. On Timer2 _a2_isr Nosave
      19. Enable Timer2
      20. #endif
      21. Waitms 200
      22. Do
      23. A = A And 7
      24. Print Ad(a)
      25. Incr A
      26. Waitms 200
      27. Loop
      28. '(
      29. $asm
      30. 'Free_adc_4_v_t.lib
      31. 'Comment = Free Adc 0-3, 14 (für Vcc Berechnung), 8 (Interne Temperatur)
      32. 'Date = 16.01.21
      33. 'Libversion = 1.2.0
      34. ';Benötigt Dim Ad(6) as word , Am as Byte
      35. ';Verwendet R2,R3 und R15 dauerhaft
      36. '[_A2_ISR]
      37. _A2_isr: '22 31 73 Verwendet R2,R3,R15
      38. push r17 '2
      39. IN r17,sreg '1
      40. PUSH r17 '2
      41. inc r15
      42. mov r17,r15
      43. Cpi r17, 4 '1Leermessung zum Pegelausgleich
      44. brlo a2_e '1/2 'sh +2 '1/2
      45. in r17,adcl '2
      46. add r2,r17 '1
      47. in R17,ADCh '2
      48. adc r3,r17 '1
      49. mov r17,r15 '1
      50. Cpi r17, 43 '1
      51. brne a2_e '1/2
      52. lds r17,{am} '2
      53. cpi r17,5 '1
      54. brsh a2_s ;Temperatur nur /2
      55. lsr r3
      56. ror r2
      57. A2_s:
      58. lsr r3
      59. ror r2
      60. PUSH r26 '2
      61. PUSH r27 '2
      62. Loadadr Ad , X '2
      63. lsl r17
      64. add r26,r17
      65. st x+,r2 '2 '2
      66. st x,r3 '2 '2
      67. lsr r17
      68. inc r17
      69. sts {am},r17
      70. cpi r17,4
      71. brlo a2_z '<4 normaler Eingang
      72. brne a2_t '>4 Temperatur
      73. #if _sim = 0
      74. ldi r17, $4e 'Vcc, 14 füf Vbg
      75. #else
      76. ori r17,$40 ' nächster adc
      77. #endif
      78. rjmp a2_z
      79. A2_t:
      80. cpi r17,5 ' >5
      81. brne a2_n ' Von Vorn
      82. #if _sim = 0
      83. ldi r17, $C8 'Internal, 8 für Temperatur
      84. #else
      85. ori r17,$40 'int ref
      86. #endif
      87. rjmp a2_z
      88. A2_n:
      89. clr r17
      90. sts {am},r17
      91. A2_z:
      92. Out Admux , R17
      93. clr r2
      94. clr r3
      95. clr r15
      96. POP r27
      97. POP r26
      98. A2_e:
      99. POP r17
      100. Out Sreg , R17
      101. POP r17
      102. Reti 'urn
      103. $end Asm
      104. '[end]
      105. ')
      Display All
    • Wenn man in "AVR Instruction Set" nachblättert, gibt es für add und adc keine Einschränkung der Register. Es sind also für die Operation alle Register r0 bis r31 zulässig.

      Was mich etwas stutzig macht ist, dass du die Routine als ISR in die Lib verfrachtest.
      Und im Basfile die Routine mit $External angibst.

      Vielleicht kommt da der Compiler durcheinander.

      Versuche doch mal die Routine als Routine und nicht als ISR zu verwenden und checke mit dem Simulator ob das geht.
      Also einfach vom Hauptprogramm einen
      !CALL _A2_isr
      zu machen

      Und schau, ob die Berechnung dann geht.

      Kannst du mal angeben, welche Zeilen aus dem Post #1
      explizit in der lib stehen (einschl. Kommentaren etc. also 1:1 ?
    • Ohne das External fand er sie nicht.
      Alles von 39 bis 113 , außer 112. (39-45+113 ohne das führende ')
      Das Call zeigt das selbe verhalten: Ohne External Error61 ...label not found
      und mit Error 200 .Def not found (addk255) sowie Error 218 Register must be..
      Gerade fällt mir auf das er Zeile 26 und 27 zeigt. Das wäre jedoch lsl r3 und ror r2 :?:

      The post was edited 1 time, last by Pluto25 ().

    • Das hängt bestimmt wieder mit dem Compiler zusammen.
      Der Lib-Compiler meckert bei vielen Fehlern nicht und wie du siehst
      stören den nicht mal Basic-Anweisungen wie $End Asm.

      Ich hatte mir mal einen Wolf gesucht an einem Fehler in ner Lib.
      Lib-Compiler compilierte fehlerfrei. Code lief aber nicht, wenn ich die Routine in Basic eingebunden habe.
      Der Compiler hat da gemeckert.

      Ursache war dann, dass in der Lib eine Anweisung (unsinnigerweise) ganz links stehen musste.
      Da war ein Space davor und darum gings nicht.

      Kannst also mal versuchen alle Zeilen nach ganz links ohne Space davor.

      Dann würde ich offensichtliche Fehler wie $End Asm auch wirklich raus nehmen.

      Und dann könnten die REM's noch problematisch sein.
      In Assembler werden Kommentare mit ; eingeleitet.
    • Kannst du den Fehlertext nochmal hier rein stellen?
      (Copy paste)

      Ich glaube ich habe da den möglichen Fehler.

      Da war doch Fehler DEF not found?

      Ich weiß, dass diverse Namen/Bezeichner, die in Basic bekannt sind, nicht zwingend auch in der Lib bekannt sind.
      Um dem Compiler das klarzumachen, dass die Definition in Basic existiert, setzt man vor die Zeile ein Stern *

      Vielleicht liegts an den Zeilen, wo du ADCH und ADCL lesen versuchst.
    • Mitch64 wrote:

      *Basic: LoadAdr Ad,x
      Klar a_45_132ca9f5 Das hatten wir doch schonmal a_166_29aea317 a_67_e210de67
      Seid kanpp 2 Stunden versuche ich abwechselnd das Forum zu erreichen und den Code zu bereinigen.
      Die Baskom Kommentare ' scheinen ihn nicht zu stören (andesrum sehrwohl Bascom meckert über ; )
      Die Fehlermeldungen klingen so gar nicht nach Adressangaben dazu noch die Meldung über 4Fehler in zwei Zeilen die auch noch nicht mal das Loadaddr trafen. Normalerweise sind die Fehlermeldungen recht aufschlußreich.

      PS Das Register 15 scheint niemals benutzt zu werden . Die 2 und 3 werden bei Long-Operationen verwand. Deshalb brauchen die nicht gesichert zu werden.