mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts im Avr-Studio simulieren


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich mache grad meine ersten Schritte in der Assembler-Programmierung und 
hab da mal ne Frage zur Simulation im AVR-Studio 4.13:

Ich wollte mittels Taster einen ext.Interrupt erzeugen. Die 
entsprechenden Festlegungen in den Registern MCUCR, GIMSK hab ich 
festgelegt.
Das Problem:
Während der Simulation setze ich manuell das Häckchen für den zu 
drückenden Taster, der ja den Interrupt auslösen soll - aber nichts 
passiert!!
Erst wenn ich zusätzlich in der I/O View unter ext.Interrupts bei GIFR 
das INTF0-Bit setze funktionierts...

Hab ich was vergessen, oder muss das so sein??????


Für Antworten vielen Dank im voraus.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setzt du den Haken im PIN-Register oder im Portregister?

Ich würde mal den Haken im PINx Register setzen/löschen. Dan sollte der
IRQ theoretisch ausgelöst werden. Wie ist eigentlich die IRQ-Sense
definiert? (Steigende Flanke, fallende Flanke, Level, oder PinChange?)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin.

Wenn ich in der I/O-View meinen Port erweitere, sehe ich unten 3 
Reihen(PortB  DDRB  PinB). Die Markierung setze ich dann in der 
PinB-Reihe (an dem dafür vorgesehen Bit).

In MCUCR hab ich ne fallende Flanke eingestellt. Wobei der Interrupt 
auch nicht auslöst beim Wegnehmen der Markierung. Erst wenn ich ihn 
zwinge (Markierung des Flags in GIFR setzen) löst er den Int. aus.
"SEI" steht bei mir nach der Festlegung von MCUCR, etc.

???
Ich stelle mir jetzt die Frage, woher er wissen soll, dass ich mit dem 
expliziten Bit in PinB einen Interrupt auslösen möchte.
Könnte ich da noch ne Vereinbarung vergessen haben?
Oder sagt er sich, ich lös mal nen Int. aus, egal welcher Eingang sich 
ändert... Aber wie unterscheidet er dann zwischen INT0 und INT1 ?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab nochmal in meinen Tutorials gesucht und bin dabei auf PD2 und 
PD3 gestoßen. Habe meine Eingänge aber eigentlich auf B liegen - wenn 
ich jetzt in der Simulation in D die Bits 2/3 markiere, dann wird Int. 
ausgelöst!!!
Da merkt man halt, dass ich blutiger Anfänger bin...

ALLERDINGS funktioniert das Auslösen des Interrupts dann nur über 
PortD?!?!
Gibt es keine Möglichkeit, das über einen anderen Port zu machen???
Man ist da doch sehr eingeschränkt...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> für den zu drückenden Taster, der ja den Interrupt auslösen soll
Treten wir hier einfach mal einen Schritt zurück und halten fest:
Es ist grundsätzlich eine schlechte Idee, mechanische Schalter und 
Kontakte auf einen Interrupt zu legen. Die Dinger prellen, und du hast 
im Nu 20 Interrupts für einen Tastendruck...   :-/

> Da merkt man halt, dass ich blutiger Anfänger bin...
Ja, so ist es. Wenn du etwas weiter bist, wirst du für solche Aufgaben 
sowieso eine Entprellfunktion verwenden. Bei Tastern kommt es ja idR. 
nicht auf die Mikrosekunde an. Wichtiger ist, das 1 Tastendruck genau 1 
Aktion auslöst.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:

> ALLERDINGS funktioniert das Auslösen des Interrupts dann nur über
> PortD?!?!

An dieser Stelle wird es Zeit, dein Programm zu sehen um rauszufinden, 
was genau du machst.

> Gibt es keine Möglichkeit, das über einen anderen Port zu machen???
> Man ist da doch sehr eingeschränkt...

Wie Lothar schon sagte: Für Tasten gibt es bessere Methoden als einen 
Interrupt.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das man Tasten entprellen muss, hab ich schon gehört - sollte hier jetzt 
aber noch keine Rolle spielen.
Das Prog hat eigentlich ganz simple Fkt.
(4-Bit blinkendes Lauflicht)
Ist halt mein Einstieg in die Assemblerprogrammierung und wurde Stück 
für Stück erweitert.
Ist jetzt ein bissl umgeschrieben - so das in der Endlosschleife nicht 
nur geblinkt, sondern auch der Taster abgefragt wird. Den 
Interrupt-Handler hab ich drin gelassen. Wahrscheinlich sind par Sachen 
unschlüssig, da ich viel rumprobiere...

Hab festgestellt, dass ich ziemliche Probleme mit dem "Zeitgefühl" habe. 
Im Simulator dauern Warteschleifen, in denen er eben auf Eingaben nicht 
reagiert, immer ewig. In Wahrheit geht es ja schneller, das muss erst 
noch in mein Köpfchen rein...

Nichtsdestotrotz sollte ich mich eh mit Interrupts beschäftigen - daher 
bleibt die Frage: Ext. Int. sind nur über Bit 2/3 vom PortD möglich und 
nicht auf andere Ports anwendbar???

Desweiteren soll ich mich auch noch in Programmierung von Timer, 
Sleep-Modes, Watchdogs, Entprellung, I2C einlesen...
Also wenn jemand gute Einsteigerlektüre hat - immer her damit.


 

; Das ist ein testprogram
;
.NOLIST
.include "8515def.inc"
.LIST
;
.DEF vgl = r16
.DEF rota = r17    ;Register zum rotieren
.DEF temp1 = r18
.DEF w1 = r19    ;für Warteschleife
.DEF w2 = r20    ;für Warteschleife
;
.CSEG
.ORG 0000

rjmp start
rjmp int0_handler  ; IRQ0 Handler
.org INT1addr    ; IRQ1 Handler
     reti      

reset:
  ldi temp1, HIGH(RAMEND)    ;STACK einrichten
  out SPH, temp1        ;STACK einrichten
     ldi temp1, LOW(RAMEND)    ;STACK einrichten
   out SPL, temp1        ;STACK einrichten

  ldi temp1,(1<<ISC11)|(1<<ISC01)|(1<<ISC00) 
    ; INT1 auf fallende Flanke + INT0 auf steigende Flanke konfigurieren
  out MCUCR, temp1
   ldi temp1, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
     out GIMSK, temp1
 
  SEI              ;Interrupts sind zugelassen


  ldi rota, 0x01    ;Anfangswert für Rotation setzen (Bit0)
   ldi temp1, 0x0F    ;benötigten 4 pins Port B auf Ausgang
   out DDRB, temp1
  ldi temp1, 0x00
  out DDRD, temp1
   ldi temp1, 0xFF
   out PortD, temp1  ;interne Pull-Ups für Eingänge aktivieren
   ldi temp1, 0xF0
   out PortB, temp1
  
  

flash:            ;abwechselnd nur eine LED leuchten lassen
    out portB, rota
    ;rcall wait      ;Aufruf UP Warteschleife
    rcall rotat1
    ldi temp1, 0x00
    out portB, temp1
    ;rcall wait
    rjmp flash      ;und endlos weitermachen


rotat1:
    sbic PINB, 7    ;Wenn Portbit2=0 (Taster),dann überspringe,sonst 
    lsl rota      ;Rotation links
    sbrc rota, 4    ;überspring nächsten Befehl,solange 5.Bit "0" ist
    ldi rota, 0x01    ;und wieder in Ausgangssituation zurück
    ret


int0_handler:
    push temp1
    IN temp1, SREG
    PUSH temp1

    sbic PIND, 2    ;Wenn Portbit2=0 (Taster),dann überspringe,sonst 
    lsl rota      ;Rotation links
    sbrc rota, 4    ;überspring nächsten Befehl,solange 5.Bit "0" ist
    ldi rota, 0x01    ;und wieder in Ausgangssituation zurück
    
    pop temp1
    OUT SREG,temp1
    pop temp1
    RETI


wait:        ;Warteschleife
  ldi w1, 0x40  ;Zählvariable setzen
 m2: ldi w2, 0xFF
 m1: dec w2      ;runterzählen 1.Stufe
   brne m1    ;wenn z<>0 springe zur Marke 1.Stufe
  dec w1      ;runterzählen 2.Stufe
  brne m2      ;wenn z<>0 springe zur Marke 2.Stufe
  ret 


Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> Ext. Int. sind nur über Bit 2/3 vom PortD möglich und
> nicht auf andere Ports anwendbar???

jap

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du bist sicher, das du einen AT90S8515 und nicht einen ATMega8515 
hast?

Sonst würde das Include-File nicht passen.

MfG Spess

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@spess53

Ja, der alte ist vorhanden (aufn STK500-Board) :o)
Wobei ichs weniger verwende, da das AVR-Studio ja ne schöne 
Simulationsumgebung hat...

Vielen Dank für die Antworten und falls jemand zu den obigen Themen noch 
gute Tutorials hat - BITTE posten

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ACHTUNG WICHTIGER HINWEIS!

Bei neueren Controllern wird durch das Setzen eines Bits N im PINx
Register das Bit N im PORTx Register getoggelt!
Man darf wohl annehmen, dass sich der Simulator ähnlich verhält!

Also bitte meine Info nicht für In-Circuit-Debugging anwenden ;-)
Gilt aber nur für neuere Controller (siehe Datenblatt unter GPIOs)

Bei den xmegas haben die wenigstens separate register für's toggeln...

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.