witam
Mam maly problem z ASM w AVR
Potrzebuje w pamieci RAM umiescic ciag bajtow (okolo 100).
i odczytac pokoleji (z tym nie ma problemu)
jak i wybrane tylko np od 3 do 7 bajtu(i tu jest problem )
Czy moglby ktos mnie naprowadzic jak to zrobic ?
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj siępamiec w avr
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
Wydaje mi sie, ze tak:
gdy czytasz wszystkie bajty (powiedzmy 100: 0...99) to zaczynasz od zerowego i w warunku zakonczenia petli masz 100 - pierwszy bajt ktory nia ma byc czytany. Gdy chcesz od 3 do 7 to zaczynasz od 3. a w warunku zakonczenia petli wpisujesz 8. Mozesz to zrobic modyfikujac lekko to co juz masz. Czy problem tkwi w czyms innym?
gdy czytasz wszystkie bajty (powiedzmy 100: 0...99) to zaczynasz od zerowego i w warunku zakonczenia petli masz 100 - pierwszy bajt ktory nia ma byc czytany. Gdy chcesz od 3 do 7 to zaczynasz od 3. a w warunku zakonczenia petli wpisujesz 8. Mozesz to zrobic modyfikujac lekko to co juz masz. Czy problem tkwi w czyms innym?
Istotny fragment:
.dseg
table: .byte 100
kompilator przydzieli w pamięci obszar 100 bajtów pamięci RAM na zmienną. Jeżeli zmienna ma być umieszczona w pamięci zewnętrznej RAM po dyrektywie .dseg należy dać dyrektywę .org z określeniem podstawy adresowej pamięci RAM.
Dane z pamięci można pobrać na kilka sposobów:
lds r16,table ; jako table[0]
lds r16,table+56 ; jako table[56]
lub
ldi zl,low(table)
ldi zh,high(table) ; po tych instrukcja rejestr z zawiera adres zmiennej table
ld r16,z ; pobranie table[0]
ewentualnie
ld r16,z+
odczytanie kolejnych bajtów od indeksu x /x-jako konkretna liczba/ mażna zrobić następująco:
ld zl,low(table+x)
ld zh,high(table+x)
ld r16,z+
ld r16,z+
ld r16,z+
ld r16,z+
ld r16,z+
oczywiście te instrukcje można zrobić w pętli zliczając ilość wykonanych cylki.
.dseg
table: .byte 100
kompilator przydzieli w pamięci obszar 100 bajtów pamięci RAM na zmienną. Jeżeli zmienna ma być umieszczona w pamięci zewnętrznej RAM po dyrektywie .dseg należy dać dyrektywę .org z określeniem podstawy adresowej pamięci RAM.
Dane z pamięci można pobrać na kilka sposobów:
lds r16,table ; jako table[0]
lds r16,table+56 ; jako table[56]
lub
ldi zl,low(table)
ldi zh,high(table) ; po tych instrukcja rejestr z zawiera adres zmiennej table
ld r16,z ; pobranie table[0]
ewentualnie
ld r16,z+
odczytanie kolejnych bajtów od indeksu x /x-jako konkretna liczba/ mażna zrobić następująco:
ld zl,low(table+x)
ld zh,high(table+x)
ld r16,z+
ld r16,z+
ld r16,z+
ld r16,z+
ld r16,z+
oczywiście te instrukcje można zrobić w pętli zliczając ilość wykonanych cylki.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 17 gości