Hallo!
Ich habe mir wie im folgenden Code zu sehen eine Interrupt-Routine
gebaut die eine LED blinken lasen soll. Die timer1: Funktion
funktioniert auch, habe ich mal in der loop Schleife mit nem delay
getestet. Ich nutze den atmega8. Ich nutze den Timer1 (16bit) bei einem
Takt von 1MHz und einem Vorteielr von 8. Dadurch komme ich per Rechnung
auf eine halbe Sekunde. Aber die LED blinkt nicht...was habe ich nicht
beachtet?
Sollte man das nicht auch in irgendwelche register schreiben? ;)
[avrasm]
lds r16, 0x4e
ori r16, 0b00000010 ;set CS11 (teiler8)
lds r16, 0x59
ori r16, 0b00000100 ;activate timer1
[/avrsam]
Martin Fischer schrieb:> lds r16, 0x4e> ori r16, 0b00000010 ;set CS11 (teiler8)>> lds r16, 0x59> ori r16, 0b00000100 ;activate timer1
Muß das nicht auch in so ein komisches 0x Register geschrieben werden.
Bin gespannt, wer die ganzen Hex-Zahlen aufdröselt. Sowas kann man auch
mit Registernamen und Bitnamen schreiben und mit viel mehr Kommentaren
versehen.
adenin schrieb:> Sollte man das nicht auch in irgendwelche register schreiben? ;)
[avrasm]
>
lds r16, 0x4e
ori r16, 0b00000010 ;set CS11 (teiler8)
lds r16, 0x59
ori r16, 0b00000100 ;activate timer1
Ja eben.
lds r16, 0x4e ;kopiere geheimnissvolles SFRegister des unbekannten
AVR ins Arbeitsregister
ori r16,0b0000_0100 ;Setze geheimnisvolles Bit 2
->>> STS r16, 0x4e ; schreibe geänderten Registerinhalt wieder ins
geheimnisvolle SFRegister des unbekannten AVR zurück
[/avrsam]
;-)
Ich schrieb:> des unbekannten> AVR ins Arbeitsregister
Ich sagte was von einem atmega8
DAnke du, jetzt leuchtet sie schonmal, aber warum blinkt sie nicht? ;(
Oliver schrieb:> Jetzt spielst du mal Prozessor, und gehst Schritt für Schritt durch, was> nach einem Reset passiert. Das Programm fängt bei Adresse 0 an...
Oliver
Martin Fischer schrieb:> ja? bei mir (wenn ich prozessor bin) funktioniert alles?
Oliver möchte, daß du dir deutlich machst, was bei dir an Adresse 0
steht. Was steht bei dir an Adresse 0? An 8 steht ein Interrupt Vektor.
Martin Fischer schrieb:> Ich kann keine Registernamen nutzen weil ich mit avr-as compiliere
Davon
.include "tn2313def.inc"
schon mal was gehört?
Lies erst einmal das Tutorial.......
Martin Fischer schrieb:> Toll. Habe ich, trotzdem kein blinken...
.
> timer1:> eor r16, 0x08> out 0x18, r16> reti
Wie genau soll das funktionieren? eor geht doch nur mit zwei Registern.
Macht der Assembler da keine Fehlerausgabe?
Martin Fischer schrieb:> Geht net. Bei avr-as geht das net!
glaub ich dir nicht.
Wo hast du denn den avr-as her? Damit man sich die Installation mal
ansehen kann. Auf irgend einem Subverzeichnis gibt es da mit SIcherheit
Include Dateien, in denen die Symbole für deinen µC definiert sind.
So hat das doch keinen Sinn. Das ist doch ausser fehleranfällig nur noch
fehleranfällig. Abgesehen davon, dass man im Code überhaupt nichts
sieht, weil man jedes Bit einzeln überprüfen müsste.
Martin Fischer schrieb:> Geht net. Bei avr-as geht das net!
Klar geht das:
http://ccrma.stanford.edu/planetccrma/man/man1/avr-as.1.html
Dort ist beschrieben:
-I dir
Add directory dir to the search list for ".include"
directives.
Also?
Lerne erst einmal, wie der Assembler richtig installiert und bedient
wird.
Danach liest Du das Datenblatt von dem AVR richtig durch, danach das
gute Tutorial das er hier im Forum gibt.
Und erst dann(!), solltest Du hier wieder Deine Problemchen posten.
Tja, warum nur passt der Link zum Rest des Theeads?
Dein Programm will nicht, und du hast ein Problem. Sonst niemand. Also
nimmst du entweder die Hinweise hier an, und versuchst rauszufinden, was
bei deiner Installation fehlt bzw. was du falsch machst, oder du lässt
es. Denn ganz ehrlich, ob deine LED nun blinkt oder nicht, ist dem Rest
der Welt ziemlich egal.
Oliver
Geht es noch um die Fehlersuche?
Loki schrieb:> Martin Fischer schrieb:>> Toll. Habe ich, trotzdem kein blinken...> .>> timer1:>> eor r16, 0x08>> out 0x18, r16>> reti>> Wie genau soll das funktionieren? eor geht doch nur mit zwei Registern.> Macht der Assembler da keine Fehlerausgabe?
Hallo Linuxer,
def.inc-Dateien kriegt nur wenn man das Studio mit seinen tools
(schlappe 400 MB, wenn ich mich richtig erinnere) im Windoof
installiert. In Wine habe ich das noch nicht versucht, wäre aber ein
echtes Wunder, wenn es auch da drunter installierbar wäre.
Das hat mich unter Linux so geärgert, dass ich meinen eigenen Assembler
mit sämtlichen verfügbaren def.inc ausgestattet habe. Den gibt es auch
für 64-Bit-Linux und der braucht diese Quatschdateien dann nicht mehr.
Einfach gavrasm nehmen, dann ist das Problem wie weggeblasen.
gerd
Martin Fischer schrieb:> Ic hhabe doch schon mein Toolchain gesendet, da sind die net mit drin!!
Du hast einen völlig nutzlosen link geposted, der auf eine
Registrierungseite bei Atmel zeigt.
Die toolchain nutzt die avrlibc. Für die gibt es eine wunderbare Doku.
Darin findet sich au.a das Kapitel:
http://www.nongnu.org/avr-libc/user-manual/assembler.html
Lesen, nachdenken, verstehen, und alles wird gut.
Oliver
Mein Code hatte funktioniert, ich hatte die LED am Falschen Port dran ^^
Nur noch eine Frage..wie mache ich es in ASM dass man die Overflows
Zählt und dann erst beim 10. Die LED toggelt?
In c geht das mit einer if...else anweisung, aber in ASM? Ich habe
nochnicht so die erfahrung mit ASM, kann mir jemand nen Tip geben?
Martin Fischer schrieb:> In c geht das mit einer if...else anweisung, aber in ASM? Ich habe> nochnicht so die erfahrung mit ASM, kann mir jemand nen Tip geben?
Naja, einfach mal überlegen wie der uC rauskriegen kann, dass der
Overflow x mal stattgefunden hat.
Tip: Register vom einem gesetzten Startwert runterzählen, (INC Rn)
Bei Null die gewünschte Aktion ausführen usw....
Such dir also mal die Befehle, die das Z-Flag auswerten.
Im "sauberen" Programmierstil zählt die ISR nur die Variable (Register)
runter. Der Rest kommt in die Loop.
Da es sich aber hier um keine zeitkritische Aktion handelt, kann sogar
die ganze Auswertlogik mit in die ISR. Aber nur hier in deinem Fall.
gerd schrieb:> Einfach gavrasm nehmen, dann ist das Problem wie weggeblasen.
Danke, den kannte ich noch nicht.
Ich verwende den Assembler avra - und zwar unter Linux und (sofern ich
mal mit Windows arbeiten muss) auch unter Windows. Es ist ein
vollwertiger Assembler, weitgehend kompatibel zum Original von Atmel,
und voll makrofähig (kann da sogar mehr als das Original).
Wenn mir Include-Dateien fehlen, finde ich sie meistens im Netz.
Notfalls auch im Monster-Paket Atmel-Studio, das ich aber zum
Programmieren nicht verwende. Atmel hat zwar schon vor zwei Jahren
versprochen, die Includes einzeln verfügbar zu machen, aber zuletzt
geschrieben, dass sie leider noch nicht dazu gekommen sind. Scheint
schon sehr kompliziert zu sein. :-(
Das ist die Include Datei für den Mega8 (aus dem AVR Studio 4).
Sieh zu, dass du die mit deinem Assembler zum Laufen kriegst, auch wenn
du an der Syntax das ein oder andere anpassen musst.
so etwas
1
out 0x18, r16
ist doch Quatsch erster Güte!
Das musst du doch selber sehen, dass das sinnlos ist, so zu arbeiten und
das es da einen gravierenden Unterschied zu
1
out PORTB, r16
in der Lesbarkeit und Wartbarkeit und damit dem Potential Fehler zu
machen gibt.
Wundert mich eigentlich, dass du dir noch nicht selbst ein paar
Definements für die von dir verwendeten Register gemacht hast. Sogar
dazu warst du zu faul. Statt dessen nimmst du lieber Chaos in Kauf.
Du musst noch viel lernen, was die Organisation der Programmier-Arbeit
anlangt. Wer zu faul ist, die 5 Minuten zu investieren, die er benötigt
um sich wenigstens ein bisschen zu organisieren, wird mit stundenlangem
Fehlersuchen "belohnt".
Organisier dich. Denn auf Dauer wirst du hier keine bzw. kaum Hilfe
bekommen. Niemand hier hat nämlich Lust, bei dann etwas größeren
Programmen erst mal all deine Hex-Zahlen mittels Tabelle in die
entsprechenden Register zurückzubennen, nur um dann endlich nach einer
halben Stunde mit der Analyse anfangen zu können, wo du das falsche
Register erwischt hast. So wichtig ist es den meisten dann nicht, ob bei
dir eine LED blinkt oder nicht, dass sie sich diese Strafarbeit
freiwillig antun würden. So ein Programm würde ich meinem ärgsten Feind
nicht zumuten.