![Zitat](images/misc/quote_icon.png)
Zitat von
Searcher
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
Lesezeichen