Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
18.03.2002, 19:46
Onkel Dittmeyer



Moin

Folgendes Problem:
Ich hab mit nem Assembler (AVR 3.2) folgendes erstellt (ganz simples Programm für nen 2313'er)Quellcode:
.INCLUDE "D:\Atmel\Projekte\Assembler Files\2313def.inc"
.def reg = R16
.def reg2= R17
.def reg3= R18
.CSEG
.ORG 0000
SEI
RJMP main
RJMP Interupt {hier ist der Jump an den Interrupt Vektor 1 (Pegelanstieg an Port D)}
main:
LDI reg, 0xFF
OUT DDRB, reg {setzen der I/O Flag von PORT B auf input}
LDI reg2, 0x00
OUT DDRD, reg2 {setzen der I/O Flag von PORT D auf output}
OUT PORTB, reg {alle LED's einschalten}
Interupt:
LDI reg, 0b11110111
OUT PORTB, reg {alle LED's aus bis auf eine}
RETI

Also ich habs erstmal ohne Stapel gemacht weil dannach ja kein Unterprogramm oder Ähnliches folgt.
Das Programm schaltet erstmal alle LED's an PORT B an und _sollte_ bei Pegeländerung (in meinem Fall druck auf Taster) an PIN D reagieren und alle LED's bis auf eine ausschalten.
Das Problem ist jetzt, dass der Interrupt nicht anspricht. Es verhält sich so als wenn ich den PIN B per Polling abfrage?!
Ich hab schon in verschiedenen Tutorials nachgeschaut aber dort steht es genau so beschrieben!
Weiß einer was ich falsch mache?

MfG

--

zum Seitenanfang zum Seitenende Profil || Suche
001
18.03.2002, 21:42
Kriz



Das ist ein Fall für Retro (Technik) und WareWolf (Assembler)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
002
18.03.2002, 23:20
[fragless]Spirit



ich hab zwar keine ahnung von atmel und deiner entwicklungsumgebung aber muss man nicht (wie bei der 8051 familie) irgendwo den interrupt initialisieren (InterruptEnable und so zeug)?

--

Jeder der Rechtschreibsfehler findet darf
... 1.) diese behalten
... 2.) sie sich merken damit er sie nicht selber macht
... 3.) Microsoft verklagen, weil deren Rechtschreibprüfung versagt hat
Co-Programmer & Mapper for Paroxysm - Alien Encounters

zum Seitenanfang zum Seitenende Profil || Suche
003
19.03.2002, 08:16
WareWolf



hmm, mir sagt der 2313 ´er auch nichts. Aber das oben gezeigte, wird wohl nicht der gesamte Code sein. Irgendwo musst du ja den Interruptvektor noch auf die eigene Routine verbiegen und kurzzeitig hierzu die Interrupts sperren (CLI bei 80x86). Vielleicht hast du dann ja nur vergessen, die Int wieder zuzulassen (?)

/E
mich wundert sowieso dieser manuelle RJMP an den Interrupt, der ist doch wohl unnötig..
E/

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW


Dieser Beitrag wurde am 19.03.2002 um 08:38 von WareWolf bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
19.03.2002, 15:09
Onkel Dittmeyer



Ja den hab ich auch schonmal weggelassen aber dann ging gar nix mehr ;)
Versteht ich auch nicht so ganz.
Also auf dem Datenblatt von dem 2313 steht dass der Int-Vektor 1 an adresse 0001 ist und ich hab ja den origin mit dem .org festgsetzt. Dann kommt das Hauptprogramm.
Dann kommt an zweiter stelle der Interrupt. (is ja dann Adresse 0001)
Interrupt enable is übrigens "SEI" bei dem 2313 und das hab ich gleich als erstes gemacht. (geht auch nicht wenn ich es ins "main" packe)
Naja, ok wenn keiner ne Idee hat werd ich noch ein bisschen rumprobieren oder zur Not ein Polling machen (hab net so kurze Impulse dass das nicht gehen würde)
Ok aber thx für die Ideen.

--


Dieser Beitrag wurde am 19.03.2002 um 15:09 von [dP]ThEpOpE bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
19.03.2002, 16:09
WareWolf



wenn deine Angabe "(Adresse 0001) ist die Adresse des Interrupts" stimmt, und dabei die physikalische Speicheradresse 0001 gemeint ist hast du Glück gehabt, dass das Prog nicht abgeschmiert ist. Denn so wie es aussieht, läuft dein main Programm im Interrupt, was wohl nicht im Sinne des Erfinders ist. Denn der Rjmp main liegt m.E. genau auf dieser Adresse 1 und da das Ganze zufällig mit einem RETI endet ist das Glück perfekt.
Ab welcher Adresse beginnt denn die Programmausführung? Kann eigentlich gar nicht Adresse 0000 sein, wenn bei 0001 schon der INT beginnt ausser ein absoluter Sprungbefehl wäre nur 1 Byte groß...

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
006
19.03.2002, 16:15
Onkel Dittmeyer



Nein pass auf du hast das falsch verstanden:
Das main liegt in dem Fall auf nicht auf 0001 weil davor SEI steht und das nur den Interrupt enabled. Wenn ichs in das main packe macht es keinen Unterscheid deswegen hab ich es dahin gepackt.
Und doch das Programm fängt bei 0000 an es steht so im Datenblatt von dem Prozessor.

[edit]
Ahhh alles klar es geht jetzt!
War nur ein reiner Synthax Fehler: (hattest recht mit den RJMP's)
habe folgendes gemachtQuellcode:
.org 0000
main: LDI reg, 0x00
OUT PORTB, reg
int1: LDI reg2, 0xFF
OUT PORTB, reg2

--


Dieser Beitrag wurde am 19.03.2002 um 16:18 von [dP]ThEpOpE bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
19.03.2002, 16:53
WareWolf



ist mir trotzdem noch schleierhaft...wenn der Proz bei 0000 anfängt, beginnt er ja mit dem SEI, der Befehl ist vermutlich 1Byte lang, also steht an Adresse 0001 jetzt RJMP MAIN und genau dies soll ja die Interruptadresse sein (??) das kollidiert doch.

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
008
19.03.2002, 17:12
Onkel Dittmeyer



Nee moment, der Befehl zählt nicht zu diesen "direkten Anweisungen" für Adresse 0000
Ich glaube das gehört zur Initialisierung?!
Also da kenn ich mich noch nicht so mit aus!
Egal hauptsache es läuft =)

--


Dieser Beitrag wurde am 19.03.2002 um 17:14 von [dP]ThEpOpE bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
19.03.2002, 17:15
Retro



Als saubere programmierung kann man das aber nichtmehr bezeichnen. Logischer weise ist es so wie WareWolf sagt, aber mir liegen auch keine Daten zu deinem 2313'er vor...

P.S.: Es kann natürlich auch auf die geschwindigkeit gehen.

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
010
19.03.2002, 17:23
Onkel Dittmeyer



Ja ich weiß habs jetzt geändert und in die Initialisierung gepackt.
Da wars auch ursprünglich aber ich hab halt ein wenig probiert als es nun nicht ging. Geht also trotzdem noch

--

zum Seitenanfang zum Seitenende Profil || Suche