Zitat Zitat von Searcher Beitrag anzeigen
Code:
  sbi gifr, pcif                                            'löschen Interrupt Flag

'### Mit Bascom assembliert und dann mit ReAVR von ja-tools zum Überprüfen
'### disassembliert zeigte, daß aus der SBI Zeile ohne Warnung Folgendes entstand
'### und dabei r23 verändert wurde.
'###
'###   lds        r23,(p3A+0x20)        ; io register
'###   ori        r23,k20
'###   sts        (p3A+0x20),r23        ; io register
'###
'### OK, SBI kann nicht auf das GIFR im ATTiny25 zugreifen, da das Register außerhalb
'### des Adressbereiches von SBI liegt.
'###
'### In einer ISR, die keine Register sichert kann die Änderung von r23 OHNE Warnung
'### aber fatal werden. Bei zeitkritischen Routinen können außerdem die zusätzlichen
'### Takte des Ersatzcodes noch graue Haare wachsen lassen wenn man von dem Austausch
'### zunächst nichts mitbekommt - Programm läuft ja eigentlich.
Was mir gerade bewußt geworden ist. Diese Zeilen
Code:
lds        r23,(p3A+0x20)        ; io register
ori        r23,k20
sts        (p3A+0x20),r23        ; io register
die Bascom statt dem "sbi gifr, pcif" eingesetzt hat, löschen nicht nur das PCI-Flag, sondern alle Interrupt Flags im GIFR. Übel! Das "ori" ist gut um in anderen Registern Bits zu setzen aber gar nicht gut um ausgewählte Interrupt Flags zu löschen.

Gruß
Searcher