Interrupt

Gast
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
Gast
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
Gast
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
Gast
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
Gast
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.

...
Gast
@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
Gast
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.)

...
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.