Zitat von
MagicWSmoke
Das macht zwar am hier gezeigten Beispiel keine Probleme, aber ansonsten führt GIFR.INTF0 = 1 dazu, dass intern das Register gelesen, das Bit gesetzt und somit mit dem Originalregisterinhalt ver-odert und zurückgeschrieben wird.
Dies führt bei einem Flag-Register zum Löschen aller anderen gesetzten Flags, bei mehreren Interrupt-Ereignissen will man das natürlich nicht.
Das wäre ja eine üble Falle. Zumindest in der Bascom Version 2.0.5.0 sieht es nicht so aus. Hab dazu ein kleines Programm gemacht, compiliert und die hex-Datei mit ReAVR disassemblieren lassen. Relevante ASM Befehle unten im Code.
Weder bei Gifr.intf0 = 1, Gifr = Bits(intf0) oder Set Gifr.intf0 wird Gifr geladen.
Gifr = Gifr Or &B01000000 muß man aber vermeiden
Code:
'###############################################################################
'IDE: BASCOM-AVR Demoversion 2.0.5.0
'###############################################################################
$regfile = "attiny45.dat"
$framesize = 32 'default?
$swstack = 32 'default?
$hwstack = 34 'default?
$crystal = 8000000
!nop 'nop zum code auffinden in ASM
Gifr.intf0 = 1
!nop
Gifr = Bits(intf0)
!nop
Set Gifr.intf0
!nop
Gifr = Gifr Or &B01000000
!nop
End
ASM von ReAVR V3.2.0
nop 'Gifr.intf0 = 1
ldi r24,k40
out p3A,r24 '3A ist Adresse von GIFR im ATtiny45
nop 'Gifr = Bits(intf0)
ldi r24,k40
out p3A,r24
nop 'Set Gifr.intf0
ldi r24,k40
out p3A,r24
nop 'Gifr = Gifr Or &B01000000
in r24,p3A
ori r24,k40
out p3A,r24
nop
Gruß
Searcher
Lesezeichen