-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: interrupt

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37

    interrupt

    Anzeige

    Leider gelöschter Text! :o(
    Tschuldigung! *autsch -> das muss ja ausgerechnet mir passieren* *heul*

    Gruß Florian

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    Shit!
    Habe gerade einen ganz gravierenden Fehler gemacht!
    Ich habe auf edit anstatt auf zitat gedrückt!
    Bitte verzeihe mir Eric!
    Könntest Du mir Deine Frage nochmals posten, dann werde ich den Text wieder umändern! *auf die Stirn hau*

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    Mein Quelcode:
    Hi Eric!
    Ich finde es ersteinmal sehr schön, dass Du die ASM-Sprache auserwählt hast! *g*
    Da Du Dich ja nicht quelen (bzw. quälen) sollst, werde ich Dir helfen! :o)

    Als erstes ein kleiner Tipp!
    Ich bezeichne die Register immer mit Namen, damit ich sie besser auseinander halten kann, was ganz besonders wichtig bei großen Programmen ist!

    Das erste Register nennt man meistens temp, temporäres Register, da es meistens das Hauptarbeitsregister ist.
    Du kannst z.B. das Register r16 in temp umbenennen, indem Du folgende Zeile unter die Includes einfügst:
    Code:
    .def temp = r16
    Der Befehl wird allerdings nur zur Leserlichkeit genutzt, er wird deshalb nicht im Speicher des AVRs abgelegt!

    Nutzt Du eigentlich das AVR-Studio von ATMEL?
    Wenn ja, dann brauchst Du nur
    Code:
    .include "2313def.inc"
    einfügen, es liegt in dem Programm bereits vor!

    Die Zeile mit dem .org ist nicht ganz richtig, da hat sich ein kleiner Fehler eingeschummelt!
    Es muss wie folgt heißen:
    Code:
    .org 0x000
    Den ersten Interrupt bezeichnet man meistens als "reset", das ist aber kein Fehler!

    Der IRQ0-Handler ist richtig, würde ich allerdings anders benennen, da es ein weig zu lang ist (für meinen Geschmack), kannst Du aber auch so lassen!

    Nun kommst das fehlerhafte Label! ;o)
    Für gewöhnlich initalisiert man als erstes den Stack, der beim 2313 ist allerdings so klein, dass man nicht in LOW- und HIGH-Byte unterteilen muss:
    Code:
    ldi temp , RAMEND
    out SP , temp
    Dann musst Du erst die Ports des AVR einrichten (Eingang oder Ausgang?) und dann die Interrupts aktivieren:
    Code:
    ldi temp, 0b00001010
    out MCUCR, temp
    
    ldi temp, 0b11000000
    out GIMSK, temp
    
    sei
    Nur alle Interrupts global zu aktivieren reicht nicht aus, Du musst auch noch vorher die externen Interrupts einstellen!

    Nun hast Du bei dem nächsten Block noch den Fehler gemacht, dass Du die Konstante 4 versucht hast dierekt in PORTD zu laden, dass musst Du allerdings über einen Umweg machen:
    Code:
    ldi temp , 4
    out PORTD , temp
    Den selben Fehler hast Du dann auch noch in der Interruptroutine gemacht:
    Code:
    ldi temp, 5
    out PORTD , temp
    reti

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    kein Problem Florian und danke für die Tips!
    Ich kann deine Antwort ja unten lesen. Ich werds gleich mal ausprobieren und morgen sagen obs geklappt hat. Den Befehl sbi PORTD, 4 kann ich doch so ausführen, da die 4 in der include datei doch als PB4 definiert ist und dieses bit will ich ja setzen und nicht die konstante 4 rein laden. Seh ich das so richtig?

    Meine Frage war:
    Also ich hab mir vor einer Woche meinen ersten mikrocontroller gekauft und zwar einen at90s2313 und bis jetzt komm ich auch ganz gut damit klar, nur leider weiss ich nicht genau wie ich einen interrupt richtig programmier. Ich hab mir das so vorgestellt:

    .include "C:\Dokumente und Einstellungen\eric\Desktop\asm\2313def.inc"

    .cseg
    .org 0000
    rjmp prg
    rjmp interrupt

    prg: sei
    ldi r16, ramend
    out spl, r16
    start: sbi PORTD, 4
    rjmp start

    interrupt: cbi PORTD, 4
    sbi PORTD, 5
    reti

    wenn ich jetzt an int0, also PIN6 einen pegelwechsel hab müsste dann ja auch das bit 5 von Portd gesetzt werden, aber als ich während der kontroller lief 5V an int0 angelegt habe ist nichts passiert.
    was genau hab ich falsch gemacht?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    Jetzt funktionierts perfekt! Hab das mit dem MCUCR und GIMSK vorher im Datenblatt garnich realisiert Jetzt is mir aber alles klar. Nochmals vielen dank. Ich werd jetzt versuchen einen Würfel zu basteln. Mal schaun ob ichs schaff

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    garnich realisiert wollt ich schreiben
    achja, coole smilies =D>

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    Hi Eric!
    Danke, dass Du mir verziehen hast, ich war gestern so in Eile, dass ich doch glatt den falschen Knopf gedrückt habe! *schmunzel*

    Zitat Zitat von eric101
    Den Befehl sbi PORTD, 4 kann ich doch so ausführen, da die 4 in der include datei doch als PB4 definiert ist und dieses bit will ich ja setzen und nicht die konstante 4 rein laden. Seh ich das so richtig?
    Ja, da hast Du recht, ich habe in der Eile etwas völlig anderes gelesen! ;o)

    Zitat Zitat von eric101
    Jetzt funktionierts perfekt!
    Das freut mich zu hören! :o)

    Zitat Zitat von eric101
    Ich werd jetzt versuchen einen Würfel zu basteln. Mal schaun ob ichs schaff O:)
    Das ist eine recht schwierige Aufgabe!
    Wie willst Du die Zufallszahlen generieren?
    Eine Möglichkeit wäre über einen Taster die gedrückte Zeit zu messen, bzw. ein Register im gedrücktem Zustand incrementieren zu lassen, dann hat man die Zufallszahl! ;o)
    Muss man leider etwas schummeln! *lol*

    Viel Erfolg weiterhin! :o)

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    ich hab mir gedacht ich lass einen zähler einfach dauerhaft durchlaufen, so schnell wie möglich und im moment des tastendrucks speicher ich die momentanzahl mit hilfe eines interrupts und danach soll der würfel immer langsamer werden und schließlich auf der vorher gemerkten zahl stehen bleiben. Das könnte doch klappen

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    Ja, das kann und wird klappen, davon bin ich überzeugt, allerdings ist es dann keine "richtige Zufallszahl", zumindest nicht im herkömmlichen Sinne!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    hey, hab den Würfel hinbekommen! hab aber das ganze wochende gebraucht, aber jetzt schauts dafür auch richtig gut aus! Als nächstes mach ich mich jetzt an eine gescheite Experementierplatine. Die nächsten Fragen folgen bestimmt

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •