PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega 32: Interrrupt bei fallender UND steigender Flanke?



electrofux
04.10.2006, 12:14
Hallo,

wir bauen mit Hilfe des mega 32 eine Motorsteuerung. Und zwar haben wir einen Inkrementalgeber der über zwei Leitungen pro Umdrehung insgesamt 500 Inkremente ausgibt. Die zwei Signale sind praktisch zwei um 90 Grad verschobene Pulswellen.
Dieser Inkrementalgeber wird dann von einem externen Motor angetrieben und wir möchten die im Mega32 ankommenden Inkremente benutzen, um einen anderen Schrittmotor, um genau die eingehende Anzahl an Inkrementen anzutreiben.
Dazu müssen wir als erstes die zwei Pulswellen in eine umwandeln (s.u.), die wir dann am Ausgang ausgeben können.

__--__--__-- Signal 1
-__--__--__- Signal 2

_-_-_-_-_-_- kombiniertes Signal am Ausgang


Und da beginnen die Fragen... :-k

Ich dachte mir das ganze so, daß bei beiden Signale jeweils bei steigender und fallender Flanke ein Interrupt ausgelöst wird und in der Interruptroutine dann der Ausgang getoggelt wird.

Allerdings weiss ich nicht wie und ob ich einen Interrupt so konfigurieren kann, daß er beide Flankenänderungen auslöst.
Oder muss ich praktisch vier Interrupts programmieren und geht das mit dem Mega32 überhaupt

Grüße
Markus Fuchs

Ratber
04.10.2006, 12:59
Wo ist Problem ?

Ich versuch erstmal ne kurze Antwort.


Der M32 hat 3 Externe Interupts (Int0-2)
Im Datenblatt unter "External Interrupts" ist alles beschrieben was du brauchst.
Also auch das MCUCR (MCU Control register) welches festlegt ob nur bei bestimmten flanken oder allen ein Int. ausgelöst wird.

Aus den Daten kannst du dir schnell alles zusammenstricken.

electrofux
04.10.2006, 14:00
Hallo,

danke für Deine Antwort. Ich hätte das Thema besser im Bascom Forum posten sollen. Mit Bascom kann ich ganz ok umgehen und habe auch eine funktionierende Motosteuerung programmiert. Aber bei den Register-geschichten im Datenblatt steige ich schnell aus.

So wie ich das sehe, kann ich den Interrupt nur entweder bei steigender oder fallender Flanke auslösen. In dem Fall bräuchte ich also 4 Interrupts (je zwei für eine Leitung) und deshalb ein anderes board oder eine Erweiterung, richtig? Ist denn die Vorgehensweise, um aus den zwei Pulswellen eine zu machen überhaupt der richtige Ansatz?

Gruß
Markus Fuchs

vajk
04.10.2006, 14:53
ich weiß ja nicht, was Bascom kann, aber die beiden INTs vom Mega32 können jeweils auf beide Flanken reagieren. Beim 128 können dies nur die oberen 4 (ohne Gewähr).

Ratber
04.10.2006, 15:10
@Electrofux


danke für Deine Antwort.

Dafür ist ein Forum ja da.



Ich hätte das Thema besser im Bascom Forum posten sollen.

Kann man immernoch dahin verschieben.
Kein Akt.
Sollen die faulen Moderatoren auch mal was tun *duckundwech* :mrgreen:



Aber bei den Register-geschichten im Datenblatt steige ich schnell aus.

Das ist halb so kompliziert wie es aussieht.
Klar,Bascom verleitet einen dazu sich es ganz bequem abnehmen zu lassen aber du wirst früher oder später noczh merken das es mit Bascom alleine nich ganz gehen wird.
Zb. ist die Timerunterstützung bei etlichen Controllermodellen noch recht klapprig so ds man dort schnell die Register per Hand setzt.

Zb. so (Codeschnipsel vom Attiny26)



........
Tccr1a = &B01010011
Tccr1b = &B10000101
Ocr1c = 255
........






So wie ich das sehe, kann ich den Interrupt nur entweder bei steigender oder fallender Flanke auslösen. In dem Fall bräuchte ich also 4 Interrupts (je zwei für eine Leitung).........

Nein du kannst mit besagtem Register jeden der Eingänge so beschalten das auf "jede" Flanke reagiert wird.



@Vajk

Ja,so ist auch mein Kenntnisstand.
Im Zweifelsfalle aber lade ich mir das aktuelle Datenblatt bei Atmel sofern ich es noch nicht habe und schaue einfach nach.
Dort steht eigentlich alles drinne was man zum jeweiligen controller wissen muß/kann/möchte usw.

Mag sein daß das Datenblatt für den einen oder anderen etwas trocken ist aber irgendwann kommt man nicht daran vorbei wenn die Projekte größer/Komplexer werden.

Bascom unterstützt wie gesagt nicht jeden Controller gleich.
Da muß man sich eben etwas anstrengen.

PicNick
04.10.2006, 15:42
@Ratber: Wenn du es zufällig weißt, sonst müßt ich es selbst austesten:
Klappt es, in der ISR-Routine die edge-direction umzuschalten ?

electrofux
04.10.2006, 15:50
@Ratber

Also sehe ich das richtig, daß ich mit asm auf dem mega32 einen Interrupt so konfigurieren kann, daß er sowohl bei einer ansteigenden als auch bei der folgenden absteigenden Flanke auslöst (hast Du einen Code Schnipsel)?Bascom liefert ja nur die Optionen Low Level, falling und rising. Eine "both"-option gibt es nicht.

@PicNick
Die edge routine umstellen wäre natürlich eine Möglichkeit, das muß ich austesten.

Grüße
Markus Fuchs

Ratber
04.10.2006, 16:06
@Picknick


Wenn du es zufällig weißt, sonst müßt ich es selbst austesten:
Klappt es, in der ISR-Routine die edge-direction umzuschalten ?

Die Situation hatte ich noch nicht.

Da es bei Registeränderungen innerhalb eine ISR immer etwas hakelig ist was die reaktionen des Controllers angeht kann ich nicht mal ansatzweise sagen ob es klappen könnte.

Mußte einfach mal probieren (Werd ich bei Gelegenheit auch tun)


@Electrofux

Zur Möglichkeit :

Ja,das geht wie gesagt.

Zum codeschnipsel:


Sorry aber ich habe mir wegen des oben angesprochenen Zustandes bei Bascom (Jeder Controller wird anders unterstützt) angewöhnt solche Sachen grundsätzlich in der dargestellten Weise zu erledigen (Register direkt setzen. ) so das ich dir nicht mit nem Schnipsel dienen kann der dir weiterhilft als das Beispiel da oben.

Also beim M32 zb. für Int0 die Bits 0 und 1 (ISC00 und ISC01) des MCUCR auf 1 und 0 um bei jedem Flankenwechsel einen Interrupt auszulösen.
(Datenblatt.Tabelle 35 beim Abschnitt External Interrupts)

Ich kann dir nur nochmal nahelegen dich näher mit dem Datenblatt auseinanderzusetzen.
Das ist enorm hilfreich und eröffnet mehr möglichkeiten als Bascom alleine.