Leider gelöschter Text! :o(
Tschuldigung! *autsch -> das muss ja ausgerechnet mir passieren* *heul*
Gruß Florian
Druckbare Version
Leider gelöschter Text! :o(
Tschuldigung! *autsch -> das muss ja ausgerechnet mir passieren* *heul*
Gruß Florian
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*
Hi Eric!Zitat:
Mein Quelcode:
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:Der Befehl wird allerdings nur zur Leserlichkeit genutzt, er wird deshalb nicht im Speicher des AVRs abgelegt!Code:.def temp = r16
Nutzt Du eigentlich das AVR-Studio von ATMEL?
Wenn ja, dann brauchst Du nureinfügen, es liegt in dem Programm bereits vor!Code:.include "2313def.inc"
Die Zeile mit dem .org ist nicht ganz richtig, da hat sich ein kleiner Fehler eingeschummelt!
Es muss wie folgt heißen:Den ersten Interrupt bezeichnet man meistens als "reset", das ist aber kein Fehler!Code:.org 0x000
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:Dann musst Du erst die Ports des AVR einrichten (Eingang oder Ausgang?) und dann die Interrupts aktivieren:Code:ldi temp , RAMEND
out SP , temp
Nur alle Interrupts global zu aktivieren reicht nicht aus, Du musst auch noch vorher die externen Interrupts einstellen!Code:ldi temp, 0b00001010
out MCUCR, temp
ldi temp, 0b11000000
out GIMSK, temp
sei
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:Den selben Fehler hast Du dann auch noch in der Interruptroutine gemacht:Code:ldi temp , 4
out PORTD , temp
Code:ldi temp, 5
out PORTD , temp
reti
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?
Jetzt funktionierts perfekt! Hab das mit dem MCUCR und GIMSK vorher im Datenblatt garnich realisiert :-k Jetzt is mir aber alles klar. Nochmals vielen dank. Ich werd jetzt versuchen einen Würfel zu basteln. Mal schaun ob ichs schaff O:)
garnich realisiert wollt ich schreiben :-b
achja, coole smilies =D>
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*
Ja, da hast Du recht, ich habe in der Eile etwas völlig anderes gelesen! ;o)Zitat:
Zitat von eric101
Das freut mich zu hören! :o)Zitat:
Zitat von eric101
Das ist eine recht schwierige Aufgabe!Zitat:
Zitat von eric101
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)
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 8-[
Ja, das kann und wird klappen, davon bin ich überzeugt, allerdings ist es dann keine "richtige Zufallszahl", zumindest nicht im herkömmlichen Sinne!
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 8-[