PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Externe Interrupts beim Atmega32



Javik
21.11.2004, 18:38
Hi!
Ich hab hier nen ATmega32, den ich mit Bascom programmiere. Jetzt möchte ich, dass sobald an einem der 3 Externen Interrupt ports (INT0-2)
sobald der Zustand von High auf Low wechselt eine Unterrutine aufrufen, bei dem 3 Variablen verendert werden sollen...
Jetzt hab ich das Problem, dass ich diese Interrupts nicht also Falling definieren kann, da das laut Bascom ,ka warum, nicht geht... Die sind irgendwie immer auf Lowlvl gestellt ?! Warum ?? Wie kann ich das endern?
Plz HELP !!
Gruß Javik

21.11.2004, 19:45
Hallo Javik,
Bascom stellt Dir frei, ob der Int bei fallender oder steigender Flanke ausgelöst werden soll.
Habe keinen Mega32 zum testen....aber so sollte es doch klappen:

$crystal = 16000000
$regfile = "m32def.dat"
'-----------------------------------
Config Int0 = Falling 'extern. Interrupt Config
Config Int1 = Falling
Config Int2 = Falling
On Int0 Int0_routine
On Int1 Int1_routine
On Int2 Int2_routine
Enable Int0
Enable Int1
Enable Int2
Enable Interrupts
'-----------------------------------
Dim Variable_1 As Byte ' Variablen deklarieren
Dim Variable_2 As Byte
Dim Variable_3 As Byte
'-----------------------------------
Do 'Hauptprogramm

Loop
End
'-----------------------------------
Int0_routine: 'Interruptroutine 0
Incr Variable_1
If Variable_1 = 255 Then
Variable_1 = 0
End If
Return
'-----------------------------------
Int1_routine: 'Interruptroutine 1
Incr Variable_2
If Variable_2 = 255 Then
Variable_2 = 0
End If
Return
'-----------------------------------
Int2_routine: 'Interruptroutine 2
Incr Variable_3
If Variable_3 = 255 Then
Variable_3 = 0
End If
Return

Viele Grüße
Daniel

Javik
21.11.2004, 20:51
Ja, so hab ichs mir auch vorgestellt aber bei Bascom steht drin:



The MEGA has also INT0-INT3. These are always low level triggered so there is no need /possibility for configuration.
The number of interrupt pins depend on the used chip. Most chips only have int0 and int1.

und wenn ichs doch so hinschreib: Config Int0 = Falling
kommt beim compilieren dann der Fehler:
INT0-3 are always LOW Level triggered in the MEGA
Was sagst du dazu ?!?!
Javik

21.11.2004, 21:04
Hallo

Was passiert denn, wenn du das entsprechende Register direkt beschreibst.

z.B.:
MCUCR = 2

für INT0 bei fallender Flanke .

MFG
Dieter

Javik
22.11.2004, 19:22
Hi
Nein sry habs versucht, aber dann macht er gar keinen interrupt mehr...
Fällt dir noch was anderes dazu ein??
Gruß Javik

harryup
22.11.2004, 22:07
hi,

warum willst du denn die int's konfigurieren?
zitat: ...so there is no need /possibility for configuration
sie brauchen nicht konfiguriert werden, nur enablen und schon sollten die funzen.

gruss, harry

22.11.2004, 22:28
Hallo

Weil er auf die fallenden Flanke reagieren will und nicht auf die steigende, warum auch immer. Geht auf jeden Fall.

Probier mal das

Mcucr = 10
Gimsk = 224

für das

Config Int0 = Falling 'extern. Interrupt Config
Config Int1 = Falling
Config Int2 = Falling


Bei Bascom heißt das GICR anscheinend GIMSK , laut m32def.dat.

MFG
Dieter

harryup
23.11.2004, 08:59
hi nochmal,
klar, hab ich schon kapiert dass er auf die fallende flanke reagieren will.
geht ja auch, oder andersrum, ein low-level int kann nicht durch steigende flanken ausgelöst werden.
die int's sind von haus aus low-level getriggert, d.h. bei einem wechsel von high nach low wird erstmalig ausgelöst. ein low-level int löst aber immer wieder aus, solange der pin low bleibt. folglich muss als erstes in der int-routine der ausgelöste int disabled werden, dann kann der restliche code abgearbeitet werden.
gruss, harry

Dino Dieter
23.11.2004, 11:03
Hallo

Klar geht das so auch, aber ob das so der "richtige" Weg ist, lass ich mal offen.

Beim Mega 8 in Bascom bringt er die Fehler Meldung nicht, von daher tippe ich auf ein Problem in Bascom mit dem M32.

MFG
Dieter

Javik
23.11.2004, 14:09
Hi
@Harryup: du hast mein Problem erfasst ^^ er soll nur einmal die unterrutine durchgehen und dann erst wieder wenn das Signal von High auf Low wechselt...
Mit dem Disablen, wie funst des ? Weil dann wird der interrupt doch nur einmal ausgeführt und dann is er ja Disabled oder ?

Edit:
Wenn ich in dieser Int0 Intrrupt Routine ne Variable ändere, kann ich dann über die in einer Timer0 interruptroutine verfügen??
Gruß Javik

harryup
23.11.2004, 15:00
hi,
deine int0-routine muss so aussehen:

on int0 int0_isr

do
... ' dein code
if XYZ = 1 then
... ' hierhin den code, der bei aufruf von int0 abgearbeitet werden soll
enable int0 ' wieder enablen
end if
loop

int0_isr: ' kann natürlich auch anders heissen
disable int0
' hierhin was der int machen soll oder besser:
' nur 'ne variable setzen, damit der int nix sonst blockiert
XYZ = 1
return

so in der machart geht das ganz gut, der int0 blockiert halt nicht den programmlauf. je nach priorität der routine, die von int0 ausgelöst wird, kannst du die variable XYZ in deiner programmschleife halt ständig oder hin und wieder abfragen oder aus dem int0 direkt in ein sub springen, wie gesagt, je nach wichtig.

gruss, harry

harryup
23.11.2004, 15:04
ooops, nachdem die if XYZ =1 ... abgearbeitet wurde muss XYZ natürlich wieder genullt oder sonstwas werden, sonst wird der code immer wieder ausgeführt...
gruss, harry nochmal