www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik externer Interrupt Atmega8


Autor: Marco Schäfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
möchte meinen Atmega8 so programmieren,sodass er auf einen externes 
Signal reagiert. habe dazu folgendes Programm geschrieben:

.include "m8def.inc"
.cseg
.def akku = r16
.def zael = r18

rjmp start

.org INT1addr
rjmp taste

.org $2A

;Stack INIT

start:  ldi  akku,low(RAMEND)
    out  SPL,akku
    ldi akku,high(RAMEND)
    out SPL,akku

;Output INIT

    ldi akku,$0F
    out DDRB,akku

    clr zael          ;Register Zael löschen
    out PORTB,zael    ;Output PortB (PB0-PB3)

;Interrupt INIT (INT1)

    in   akku,MCUCR      ;lade MCUCR in akku
    sbr akku,1 << ISC11  ;Setzte ISC11
    sbr akku,1 << ISC10  ;Setzte ISC10
    out MCUCR,akku       ;Übertrage 00001100 ins MCUCR-Reg (steigende 
Flanke).
    in   akku,GICR       ;Lade GICR in akku
    sbr  akku,1 << INT1  ;Setzte INT1
    out GICR,akku        ;übertrage 10000000 ins GICR-Reg.
    sei                  ;Setzte das I-Bit

;Hauptprogramm

loop:    rjmp loop        ;Endlosschleife

;Unterprogramm

taste:  ldi akku,sreg      ;SREG in akku
  .
  .
  .
  reti        ;zurück nach loop

.exit

Habe mir schon einige Beträge bzw. Bücher zu diesem Thema angeschaut, 
nur leider kann ich meinen Fehler nicht erkennen. Nachdem Programmieren 
reagiert der ATMEGA einfach nicht auf den Interrupt... und kann mir von 
euch jemand verraten wie ich im AVR-Studio einen externen Interrupt beim 
deguggen simulieren kann?

Viele Grüße Marco

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin leider was asm angeht nicht so hundertpro bewandert aber ich 
habs mal schnell in AVR-Studio kopiert.
Da funktionierts bis auf ne kleine Fehlermeldung beim Interrupt 
(Stack-Pointer below start of RAM).

Interrupt kannst du im Studio simulieren indem du rechts in der I/O-View 
das external Interrupt öffnest, dann hast du in der Ansicht darunter 
alle Register. Im Register GIFR kannst du nun das Interrupt Flag INTF1 
setzen

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A propos Stack Pointer: Fällt mir grad auf, Du initialisierst zweimal 
SPL, aber nirgends SPH!

Autor: Marco Schäfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmals!
danke für die schnelle antwort. habe das Programm schon ausprobiert, 
aber das läuft auch nicht 100%.Die Interrupts reagieren auf irgendwas, 
nur nicht auf meine Trigger bzw. nur manchmal.habe vor meinen 
Interrupt-Eingang ein D-FlipFlop geschaltet.
@Roland
Kannst du mir auch sagen was diese Fehlermeldung bedeutet?
Bin was dieses Thema betrifft kompletter neueinsteiger!

schon mal vielen Dank,

LG Marco

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco Schäfer wrote:
> Kannst du mir auch sagen was diese Fehlermeldung bedeutet?
Genau das, was ich oben geschrieben habe: Dadurch, dass Du nur SPL setzt 
(und das mit dem Wert, der eigentlich in SPH gehört), legst Du den Stack 
mitten in den Registersatz! Dass dabei Müll rauskommt, ist 
vorprogrammiert...

RAMEND hat beim Mega8 den Wert 0x045F. Du schreibst das High-Byte 0x04 
in SPL, SPH ist 0. An der RAM-Adresse 0x04 liegt aber r4, das Du zwar 
nicht benutzt, aber Murks ist es trotzdem...

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes hats schon gesagt. Du hast das High Byte des Rams nicht 
initialisiert.

ldi  akku,low(RAMEND)
    out  SPL,akku
    ldi akku,high(RAMEND)
    out SPH,akku

so sollts gehen

Autor: Marco Schäfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank jetzt gehts,
hätte den Fehler wahrscheinlich noch tage gesucht ;) hatte mich wohl 
verschrieben!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ldi akku,sreg

Das ist auch sinnfrei.

Finde den Unterschied zwischen "ldi akku,sreg" und "in akku,sreg" 
heraus.

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.