mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega8: Pinabfrage nach ext. Interrupt


Autor: Thomas_v2.1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich mache gerade mein erstes Projekt mit einem ATMega8 und habe da grad
ein Problem:
Ich habe einen Schalter an GND mit Pull-Up Widerstand 10k an + an den
INT1-Pin des Controllers angeschlossen. Den Interrupt habe ich auf
fallende Flanke konfiguriert. In dieser Interrupt-Routine macht der µC
etwas anderes, bis der Schalter wieder geöffnet ist.
Bei Betätigung des Schalters komme ich auch in meinen Interrupt, nur
leider nicht wieder heraus. Komischerweise funktioniert das im
AVR-Simulator korrekt.
Hier mal die Auszüge aus meinem Programm:

  ldi temp, 0xf0    ; PD0-PD3 als Eingänge
  out DDRD, temp

; Interrupt-Routine
isr_ext1:
  cli  ; Interrupts ausschalten
loop:
  sbic PORTD, 3  ; wenn Schalter geöffnet, Routine verlassen
  rjmp ende_isr
 ...was anderes machen...
  rjmp loop
ende_isr:
  reti

Der Schalter müsste natürlich noch entprellt werden, aber selbst so
komme ich aus dem Interrupt nicht mehr raus. Hab ich was übersehen?

Danke,
Thomas

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ersetze mal sbic PORTD, 3
durch sbi*s* PORTD ,3

Du fragst auf gelöschtes Bit - also "0"(Taste gedrückt) - ab, willst
aber bei "1"(Taste losgelassen) zum RETI.

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quatsch !! (ist schon früh)

Weiß jetzt auch nicht mehr...............

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannste noch etwas mehr quelltext von dir geben? inits und irq-vectors
und soviel du geben willst ;)

das cli kannste weglassen.. bei einer isr wird das i-flag immer
gelöscht...

dave

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOL....

==> noch nen fehler: das register ist PINd und nicht PORTd... PORTd
==> PORTd ist eigentlich da immer 0... kannste lange probieren

bei aktivierten eingängen kannste ne 1 in das port-register schreiben
und dann werden die pullups aktiviert... also... mach als init:

  ldi temp, 0xf0    ; PD0-PD3 als Eingänge
  out DDRD, temp
  ldi temp, 0x0f    ; pullups für eingänge aktiviern
  out PORTD, temp

und:
  sbic PIND, 3  ; wenn Schalter geöffnet, Routine verlassen
  rjmp ende_isr

Autor: Thomas_v2.1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aua danke, da hatte ich aber was auf den Augen...
Auf jedenfall funktioniert es mit dem PIND bei den Eingängen jetzt.
Bin halt etwas 8051 verwöhnt denn da gibt es diese Unterscheidung
zwischen Ein- und Ausgabe ja nicht. Aber so hat halt jeder Controller
seine Vor und Nachteile.

Thomas

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.