-         

Ergebnis 1 bis 6 von 6

Thema: Byte mit Nosave hochzählen lassen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.05.2007
    Beiträge
    177

    Byte mit Nosave hochzählen lassen

    Anzeige

    Hallo,

    ich möchte in einer Interruptroutine mit Nosave eine Bytevariable mit incr hochzählen, welche Register muss ich sichern?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,
    Am besten erstmal einfach compilieren, und dann zB. mit AVR-Studio das Hexfile öffnen, und schauen welche Register verwendet wurden !

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.05.2007
    Beiträge
    177
    AVR Studio habe ich nicht auf dem Rechner, und will es jetzt auch nicht unbedingt aufspielen, wäre schon, wenn jemand die Register im Hinterkopf hätte und sie mal kurz schreiben könnte.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    wird so pauschal leider nicht gehen, da Bascom intern
    die Register verwaltet werden. Der Weg übers Studio wird der
    einfachere sein
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo Rohbotiker,

    probier 'mal dies. Getestet für das Hochzählen einer Word-Variable.
    Code:
    Tim1_isr:                                         'NOSAVE
    $asm
      push r24                                        'total 15 cycles
      PUSH r25
      PUSH r26
      PUSH r27
      push r30
      push r31
      IN r24,SREG
      PUSH r24
    $end Asm
      Timer1 = Startwert
      Incr Word_var
    $asm
      POP r24                                         'always necessary
      Out Sreg , R24
      pop r31
      pop r30
      POP r27
      POP r26
      POP r25
      POP r24
    $end Asm
    Return
    Gruß Dirk

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.03.2004
    Beiträge
    185
    Hallo Dirk,

    Deine Methode ist sehr heikel. Auch wenn Du mit AVR Studio die Register geprüft hast, weist Du nicht was Bascom in anderen Versionen zwischen "$end Asm" und "$asm" mit den Registern anstellt.

    Darum gilt: Programmiere jede NoSave ISR immer(!!) durchgängig in ASM. Bei komplexen Aufgaben in der ISR nur ein Flag setzen und in der Main das Flag abarbeiten.

    Hier mal der angefragte Code für die Byte Variable Zaehler:
    Code:
    isr_Zaehler:
    $asm
       PUSH   R24                 'save used registers
       IN r24, SREG
       PUSH R24
    
       LDS     R24,{Zaehler}
       SUBI    R24,&HFF           'Incr Zaehler
       STS {Zaehler},R24
    
    
       POP R24                    'get content of SREG
       !OUT SREG, R24
       POP R24
    $end Asm
    Return
    Hinweis: In ASM gibt es ADD mit einer Konstanten nur für Word (ADIW), deshalb SUBI.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •