Hallo zusammen,
Blieb bei meinem Projekt grad bei SRAM hängen.
Zunächst mal möchte ich sagen, das ich das SRAM zum ersten mal nutze.
Hab bis jetzt alles mit Registern gemacht. Aber da meine Projekte immer
umfangreicher werden, muss ich nun das SRAM benützen, um etwas Übersicht
zu gewinnnen.
Zur Frage:
Spielt generell es ein Rolle WO ich die Assemblerdirektive;
.dseg
count: .BYTE 1
im Code selbst hinschreibe?
Also ich meine nicht direkt im Code, sondern dort wo ich die Register
deklariere also Am Ganz am Anfang, oder erst am Schluss?
Ich hab bei den ersten Versionen, das Codesegment ganz am Anfang
deklariert, dann hat aber das Programm nicht mehr Funktioniert.
Hab ich es entfernt ging wieder alles wunderbar.
Schreibe ich es am Schluss funktioniert alles wie gewünscht, waber warum
ist das SO? Oder mache ich sonst was verkehrt.
Mein Code (der Funktionsfähige =)
Lukas G. schrieb:> Spielt generell es ein Rolle WO ich die Assemblerdirektive;>> .dseg> count: .BYTE 1>> im Code selbst hinschreibe?
Vom Prinzip her ist es wurscht.
Alles was unter .dseg kommt wird gesammelt und dem SRAM zugewiesen (in
der Reihenfolge in der es von oben nach unten auftaucht)
Alles was unter .csef definiert wird, wird genaso gesammelt und dem
Flash zugewiesen (wieder von oben nach unten).
.dseg bzw. .cseg sind also so ähnlich wie Umschalter, die bestimmen
wohin das Nachfolgende gehört. Entweder SRAM oder Flash.
> Also ich meine nicht direkt im Code, sondern dort wo ich die Register> deklariere also Am Ganz am Anfang, oder erst am Schluss?
Die Register definierst du sowieso nicht. Die gibt es schon. Was du
vereinbarst, das sind andere Namen für die Register. Da geht es aber
nicht darum, dass dafür irgendwelcher Code generiert werden soll oder
dass irgendwelche Speicherreservierungen im SRAM gemacht werden sollen,
sondern es geht einzig und alleine um eine Vereinabarung zwischen dir
und dem Assembler-Übersetzungspogramm "Hör mal. Wenn ich in Zukunft
'hamstibamsti' schreibe, dann meine ich damit das Register r18". Das
kann daher stehen wo es will, solange es nur vor der ersten Verwendung
des somit neu bekannt gemachten Namens passiert.
> Ich hab bei den ersten Versionen, das Codesegment ganz am Anfang> deklariert, dann hat aber das Programm nicht mehr Funktioniert.
Was jetzt. Codesegment (.cseg) oder Datensegment (.dseg). Wenn weder das
eine noch das andere angegeben ist, dann ist automatisch das Codesegment
erst mal das 'aktive Segment'.
> Schreibe ich es am Schluss funktioniert alles wie gewünscht, waber warum> ist das SO?
Weil du irgendeinen Fehler gemacht hast. Dann kann man aber nicht
eruieren, wenn du die Version zeigst, die dann letzten Endes
funktioniert.
Hallo,
.dseg ist das Datensegment, also der Ram. Kannst Du prinzipiell an
beliebige Stelle schreiben, Du mußt nur daran denken, wieder auf .cseg
(Codesegmeht) zu schalten, bevor Du wieder mit Programmcode schreibst.
Bei mir landen die .dseg-Sachen auch bei den Registerdefinitionen, vor
dem Begin der Vektoren steht dann generll bei mir
.cseg
;Vektoren
.org 0x0000
rjmp configurations
.org 0x0001
rjmp int_1
.org 0x0009
rjmp timer0_overflow
um bei Deinem Progarmm zu bleiben.
Gruß aus Berlin
Michael
Ich glaub ich weis vo der Hund begraben liegt.
.cseg
Muss ich also in demfall anwenden wie .nolist & .list
Habs gerade ausprobiert, und es hat Funktioniert!
Komischerweise steht davon im Tutorial nichts. Aber dort ist .dseg ja
auch am Schluss...
Besten dank für die Hilfe
mfg Lukas
Hallo,
Karl Heinz war wieder ausführlicher sehe ich gerade.
Ein Tipp von mir ganz allgemein:
verfalle nicht in den Trend, wenig tippen zu wollen.
Dann über lieber den Umgang nit Ctrl-c/ctrl-v, also kopieren/einfügen.
.equ PD = PORTD
.equ DD = DDRD
.equ PB = PORTB
.equ DB = DDRB
wenn schon, dann bei Deinem Programm:
.equ KEY_PORT = PORTD
.equ KEY_DDR = DDRD
.equ KEY_PIN = PIND
.equ LED_PORT = PORTB
.equ LED_DDR = DDRB
.equ LED_PIN = PB0
...
ldi t1,0x00 ;PortD als Eingang
out KEY_DDR,t1
ldi t1,0xFF ;Pullups PortD aktivieren
out KEY_PORT,t1
ldi t1,0xFF ;PortB als Ausgang
out LED_DDR,t1
ldi t1,0xFF ;PortB Pullups deaktiviert
out LED_PORT,t1
...
sts count,z1
cbi LED_PORT,LED_PIN
w_1:
clr z2
w_2:
cpi z2,10
breq w_3
rjmp w_2
w_3:
sbi LED_PORT,LED_PIN
clr z3 ; Impulszähler auf null setzen
clr stat
Ich habe nur eine Beispielstelle genommen.
Wenn Du jetzt die LED statt an PB0 an PC2 hängst, muß Du nur
.equ LED_PORT = PORTB
.equ LED_DDR = DDRB
.equ LED_PIN = PB0
in
.equ LED_PORT = PORTC
.equ LED_DDR = DDRC
.equ LED_PIN = PC2
"Spechende Namen" sind eine sehr praktische Hilfe, wenn man was ändern
will oder nach 2 Jahren wieder in das Programm schaut.
Gruß aus Berlin
Michael
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.