Guten Tag,
ich versuche gerade den Einstieg in den Assembler der AVRs zu finden.
Mit C habe ich da schon einiges gemacht, aber man will sich ja
weiterentwickeln...
Als Entwicklungsumgebung nutze ich AVRStudio 4 (Service Pack 2). Zum
ersten Testen verwende ich folgenden Assembler-Code (aus dem Buch
"Günter Schmitt:
Mikrocomputertechnik mit Controllern der Atmel-RISC-Familie" mit
leichten Abwandlungen):
1 | ; k2p1.asm Bild 2-2 Dualzähler als Taktteiler
|
2 | ; Seite 67
|
3 | ; PORTB: Ausgabe LED PB0 = Takt / 10 PB 7 = Takt / 1280
|
4 | ; PORTD: -
|
5 | .NOLIST ;
|
6 | .INCLUDE <m16def.inc> ; Deklarationen für ATmega16
|
7 | .LIST ;
|
8 | .DEF akku = r16 ; Arbeitsregister
|
9 | .CSEG ; Programm-Flash
|
10 | RESET: rjmp start ; Reset-Einsprung
|
11 | .ORG INT_VECTORS_SIZE ; Interrupteingänge übergehen
|
12 | start: ldi akku,LOW(RAMEND); Stapelzeiger
|
13 | out SPL,akku ; anlegen
|
14 | ldi akku,HIGH(RAMEND);
|
15 | out SPH,akku ;
|
16 | ser akku ; akku <- $ff
|
17 | out DDRB,akku ; PortB ist Ausgang
|
18 | out DDRD,akku ; PortD leuchtet!
|
19 | out PORTD,akku ;
|
20 | clr akku ; Zähler löschen
|
21 | ; Taktteile: 5 Takte Low / 5 Takte High gibt Takt / 10
|
22 | loop: out PORTB,akku ; 1 Takt: Zähler ausgeben
|
23 | inc akku ; 1 Takt: Zähler erhöhen
|
24 | nop ; 1 Takt: Verlängerte Schleife
|
25 | rjmp loop ; 2 Takte: Schleife
|
26 | .EXIT ; Ende des Quelltextes
|
Die Assemblierung funktioniert fehlerfrei, auch die Simulation im
AVR-Studio macht genau das, was ich auch erwartet habe. Allerdings ist
der ATmega16 nach dem Hochladen des Quelltextes völlig stumm. Von den
Fuses gehe ich aus, daß sie stimmen, weil in C unter AVR-Studio
erstellte Programme direkt laufen.
Die Assembler-Optionen sind wie default (außer daß er er noch zusätzlich
ein "list-file" erstellt), also:
- AVR-Assembler Version 2
- Intel Intellec 8 (Intel hex)
So langsam gehen mir die Ideen aus, was man noch ausprobieren könnte
oder was ich nicht beachtet haben könnte, deshalb wäre ich für eine
diesbezügliche Hilfe sehr dankbar.
Viele Grüße
Nicolas