Autor |
Interrupt funktioniert nicht |
|
|
|
|
BID = 488655
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
|
bin gerade dabei mein 2. kleines programm zu schreiben, und habe da folgendes porglem:
ich möchte den INT1 nutzen (attiny2313)
dazu habe ich folgenden code geschrieben:
.include "2313def.inc"
.def temp = r17
ldi temp, RAMEND ; Stackpointer initialisieren
out SPL, temp
ldi r21, 0b00000000 ;Low löst INT1 aus
out MCUCR, r21
ldi r21, 0b10000000 ;INT1 erlauben
out GIMSK, r21
sei
ldi r16, 0b11111111 ;Datenrichtung B
out DDRB, r16
ldi r16, 0b00010111 ;Datenrichtung D
out DDRD, r16
wenn ich den "sei" befehl weglasse läuft das programm an, erst wenn ich diesen befehl einfüge tritt mein problem auf.
das Porg. springt nach der zeile in der "datenrichtung B" steht zurück zur zeile in der "low löst INT1 aus" steht.
d.h. ich komme gar nicht zum eigentlichen programm, dieser kommt erst weiter unten (habe ich jezt nicht mit eingefügt)
kann mir jemand sagen warum das passiert?
_________________
|
|
BID = 488675
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Moin,
Es fehlen die Interruptvektoren.
Weiterhin löst mit dieser Einstellung ein Low am INT1-Pin ein IRQ aus, d.h. wenn nach sei ein low anliegt, hoppst der sofort nach 0x0002 und arbeitet dort weiter.
Er wird auch immer weiter machen, weil dort keine erneute Sprunganweisung (reti oder rjmp <ISR-Adresse>) steht.
Also, pack die gesamte Interruptvektorenliste rein, und zwar angefangen bei 0x0000.
Weiterhin sollte sei erst ausgeführt werden, wenn alles initialisiert ist, also wenn der Prozessor soweit ist, ISR auszuführen.
sei kommt hier also viel zu früh!
_________________
|
|
BID = 488687
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
danke, habs jezt geändert und funktioniert!
sorry, dass ich mit solchen anfängerfragen nerve, aber wie gesagt das ist erst mein 2. prog.
_________________
|
BID = 488694
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Freut mich,
und schön, dass es noch Leute gibt, die Assembler für AVR lernen .
Das ist das sinnvollste um anzufangen.
_________________
|
BID = 488947
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
ja ich tu mein bestes.
wenn man mal ein bisschen reingefunden hat dann machts spass
_________________
|
BID = 489734
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
jetzt hätte ich noch eine andere frage.
ich möchte zu einer bestimmten zeit eine led blinken lassen.
diese soll vor sich hin blinken.
das programm soll in dieser zeit andere sachen erledigen.
erst durch einen befehl soll das blinken beendet werden.
wie kann ich also einen pin dazu bringen abwechselnd ein high und low auszuspucken, und gleichzeitig andere sachen im programm machen?
_________________
|
BID = 489751
Morgoth Schreibmaschine
Beiträge: 2930 Wohnort: Rockenhausen (Pfalz)
|
Timer-Interrupt, und dann in ne Mini-Sprungtabelle, wo der Ausgang getoggelt wird.
Da der Timer höchstens 16Bit groß ist, und der Prescaler auch endlich... musst du eventuell noch ne Zählschleife dazubasteln.
Wenn du ne hinreichend kleine Taktfrequenz hast, und/oder das blinken ziemlich flott sein darf, dann kannst du das auch komplett über den Timer lösen. Das wäre dann quasi ne extrem langsame PWM
_________________
Es irrt der Mensch solang er strebt
[ Diese Nachricht wurde geändert von: Morgoth am 10 Jan 2008 15:50 ]
|
BID = 489775
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin,
Morgoth hats ja schon beschrieben,
Angenommene Taktfrequenz von f_CPU[Hz] und einem 16-Bit-Timer ergibt eine maximale Periodendauer(T[s]) von:
Sind für 16MHz gerndet etwas mehr als 4s Periodendauer.
Dafür muss der Vorteiler auf 1024 gestellt werden.
Sonst greift man, wie ebenfalls erwähnt, auf ne softwaremäßifge Erweiterung, zurück.
Timer entsprechend den Angaben im Datenblatt initialisieren.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 10 Jan 2008 17:38 ]
|