www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt


Autor: Reinhard Günzel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

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

...

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard Günzel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

...

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.