Forum: Mikrocontroller und Digitale Elektronik Interrupt


von Reinhard Günzel (Gast)


Lesenswert?

Wie muss ich im asembler schreiben, dass mit zb. der pinc3 einen
Interrupt auslöst ,und das dan bei reti beendet? wer kann mit
weiterhelfen. Scheint für euch einfach für mich leider nicht, danke

von Andreas (Gast)


Lesenswert?

Meine Glaskugel sagt:

'reti'? Das kann kein PIC sein -> Da kann ich leider nicht direkt
helfen, sondern nur den Tip 'Datenblatt' bzw. Application Notes'
geben.

Andreas

von Andi (Gast)


Lesenswert?

Anscheinend gehts um einen AVR. Aber WELCHEN???
Du kannst nicht an jedem Pin bei Pegelwechsel einen Interrupt
festlegen, nur an denen INT0, INT1, INT2 oder PCINT
(Pin-Change-Interrupt, können nicht alle AVRs) steht.
Für genaueres mußt Du uns schon mitteilen welchen AVR (oder µC) Du hast
und was Du vorhast.

MfG
Andi

von ...HanneS... (Gast)


Lesenswert?

Und mal über den "Stackpointer" sachkundig machen, dessen
Initialisierung wird von Anfängern oft vergessen.

...

von dave (Gast)


Lesenswert?

Schritt 1:
 Wie Hannes sagt, Stackpointer initialisieren.
Schritt 2:
 Seinem "normalen" Programm(start) ein schönes Label geben, z.B.
init:
Schritt 3:
 Am Anfang des CODE (Befehle etc.) hinschreiben:
.cseg
.org 0
 rjmp init

Schritt 4:
 Im Datenblatt schauen, wo der InterruptVEKTOR des Interrupts ist,
oder wie dieser Vektor in der Include heißt. Dann fügste unter das rjmp
init diese Adresse ein:
.org 0x02

Schritt 5:
 Unter dieses .org kömmt ein Sprungbefehl zu deiner ISR
(InterruptServiceRoutine), die mit RETI abgeschlossen wird.

Schritt 6:
 Bevor du frägst, warum kein IRQ kommt: Schalte das I-Flag mit "sei"
ein.

dave

von Reinhard Günzel (Gast)


Lesenswert?

Vielen Dank ihr 4, andy und dave kommen meiner frage zimlich nahe. Ich
mus mit einer Taste einen Interrupt auslösen und eine Schleife
verlängern, bzw mit einer zweiten Taste diese dan verkürzen.Habe aber
keine Ahnung gehabt welche pin mann nehmen kann bzw wie ich dem pin
mitteile das er den interrupt auslösen darf. Ein AT 8515 ist es.Es ist
eben ein Problem, es so zu schreiben das der Asembler es auch
versteht.
in VB6 ist es doch was anderes.hi Danke

von ...HanneS... (Gast)


Lesenswert?

Mechanischer Taster am Int-Eingang gibt nur Probleme da mechanische
Taster prellen. Frage den Taster lieber in einem Timer-Interrupt ab.
Das hat auch noch nebenbei den Vorteil, dass jeder Eingang benutzt
werden kann. Suche mal im WIKI nach "entprellung", da erfährst du
mehr.

...

von gerd (Gast)


Lesenswert?

@Dave:
Mal ketzerisch: was platziert der Assembler/Programmer wohl an die
undefinierten Stellen, die mit .ORG übersprungen wurden? Es gibt schon
recht risikoreiche Methoden, ein Wort an die richtige Stelle zu
kriegen.

mfg
gerd

von ...HanneS... (Gast)


Lesenswert?

Da steht bei mir grundsätzlich RETI drin. Auch wenn einige Profis das
anders sehen.

(Das liegt aber auch daran, dass meine Eigenbau-ISP-Software nicht
wirklich Hex-Dateien lesen kann, sondern nur lineare Adressbereiche
ohne Lücken, beginnend bei 0.)

...

von dave (Gast)


Lesenswert?

Das mit dem RETI hab ich mir abgewöhnt, denn die AVR, bei denen der
Speicher mehr als 16kb? oder so hat, ist das Platz für ein RETI+NOP
oder halt ein JMP.

Natürlich kann der Assembler da was reinbaun, dazu musst du das ihm
aber auch sagen. Bei Segmentüberschreitungen wird auch gleich
gemäckert, sonst machste halt letzer Vektor + 4 ne .ORG.

Wie würde Herr Ketzer das machen G?

dave

von gerd (Gast)


Lesenswert?

Herr Ketzer empfiehlt, im Interrupt-Bereich auf die Verwendung von ORG
zu verzichten und sauber alle Ints mit einem RETI (ggfs. plus NOP)
abzuschließen. Bis auf wenige Ausnahmen löscht ein versehentliches
Anspringen eines Int wenigstens das zugehörige Flag (Ausnahme:
TX-Buffer-Empty-Int bei der SIO).

Aber ich bin da etwas missverstanden worden. Der Assembler platziert in
mit ORG übersprungene Zellen entweder Nullen (NOP) hin oder er gibt im
Hexfile eine neue Zeile mit entsprechend neu eingestellter Startadresse
aus. Die ISP-Software macht, wenn sie korrekt nach Intel-Hex-Definition
arbeitet, an dieser Stelle einen Sprung und programmiert die dazwischen
liegenden Zellen nicht. Nicht programmierte Zellen haben aber nach dem
Löschen des Flash den Inhalt FFFF. Merke also: man kann eine Zelle
nicht nicht programmieren! Besser ist daher der Verzicht auf ORG im
Int-Bereich, und dem Assembler zu sagen, was man gerne an die nicht
benötigten Stellen haben möchte.

So, jetzt habe ich meinen 40-Zeilen-Bonus fast schon verbraten.

mfg
gerd

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.