Interrupt funktioniert nicht

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  13:28:59      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


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:

\fed\mixonT_max = (2^16-1)*V / f_CPU

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 ]


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 10 Beiträge verfasst
© x sparkkelsputz        Besucher : 182396097   Heute : 3293    Gestern : 7548    Online : 754        25.11.2024    13:28
8 Besucher in den letzten 60 Sekunden        alle 7.50 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0261900424957