Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2024, o 12:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 65 ]  Przejdź na stronę 1, 2, 3  Następna strona
Autor Wiadomość
PostNapisane: 9 wrz 2014, o 15:19 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam kolegów zrobiłem komety i inne bajery - prościutkie na tych diodach w gruncie rzeczy w Asemblerze ale mam jeden problem tj: niekiedy (nie jest to regularne) blokują mi się wszystkie diody tzn kilka kolorów innych niż pozostałe i zmiana kolorów ani drgnie :( W 99% chodzi o kolor czerwony do 100 PWM chodzi jako tako a potem blokuje wszystko - co to może być. Napięcia oki Zielone i niebieskie diody są do 255 czasy ok w wyświetlaniu tylko jak występuje czerwony kolor to kicha - jak pisałem wyżej - dzięki



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2014, o 15:27 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

No no - ale rozumiem, że to pytanie do jasnowidza tak ? ;) bo kto może bez kodu domyślić się gdzie zrobiłeś w nim babola ? :(

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 wrz 2014, o 15:53 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2014, o 15:11 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam mam jeszcze jedno pytanie jak w asemblerze AVR wpisać do pamięci (komórek) fhlash dane z poziomu Bascoma ?- dzieki



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 15:30 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Dzięk koledzy zmobilizowaliście mnie do myślenia, także poradziłem sobie - temat zamknięty :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 16:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Maciek 222 napisał(a):
Dzięk koledzy zmobilizowaliście mnie do myślenia, także poradziłem sobie - temat zamknięty :)


Bardzo się cieszymy ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 17:39 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Także jak liczyć to tylko na siebie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2014, o 18:17 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Maciek 222 napisał(a):
Także jak liczyć to tylko na siebie :)

Może nie na siebie ale to jest forum poświęcone językowi C i w większości sa tu (chyba) hobbysci, wiec mało jest tu raczej osób (choć zaznaczam że mogę się mylić) które coś ogarniaja z assemblera. Wiec i szansa ze ktoś pomoże jest mniejsza, aczkolwiek masz teraz satysfakcję ze dałeś rade sam;-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2014, o 09:36 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Dzięki bardzo możliwe że pomyliłem działy fakt - dzięki a Ty nie piszesz w asm/bascom?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 wrz 2014, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

A pochwal się jak brzmi rozwiązanie!

Jeśli o mnie chodzi to chętnie pomogę w miarę możliwości przy asm, ale równie chetnie zobaczę trochę komentarzy przy blokach kodu oraz jakieś przyjaźniejsze aliasy rejestrów.

Co do samego podprogramu - możesz zmienić w nim wszystkie jmp-y na rjmp-y. Uszczupli to nieco program i przyspieszy jego działanie o 1 takt procka na każdego jmp-a :)

Wysłane z mojego GT-S7710



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 16:31 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam dzięki za odp :) moje rozwiązanie okazało się bardzo proste na 80 do ew. 120 wszystko było oki ale na 240 pojawiły się zakłócenia z poradnika Mirka wiem że spada napięcie ale myślałem że jeśli świecą wszystkie diody a tu się okazało że czerwona chyba najwięcej "żre" i podłączyłem napięcie z drugiej strony i ciekawa sprawa ?? jak nie podłącze - to działa dobrze a jak drugi - podłącze to kaszana . Myśle że występują jakieś różnice potencjałów.

Mam jeszcze jedno pytanie: jak w asm. wrzycać jakieś dane do komórek flash i potem je wyciągać.
aha (może zaśmiecam forum moimi pytaniami nowicjusza i P.Mirek się wkurzy :) to jeśli możesz napisz na prywatną pocztę prochmac@vp.pl - dzięki

------------------------ [ Dodano po: 4 minutach ]

sorry powinno być " jak nie podłącze minusa to działa dobrze a jak drugi minus podłącze ... "
aha sorry a co to są """ aliasy rejestrów""" ja piszę w bascom i asm dopiero zaczynam zabawę (no i mam 50+ lat trochę ciężko mi to idzie :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 17:26 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Maciek 222 napisał(a):
jak w asm. wrzycać jakieś dane do komórek flash i potem je wyciągać.

W czasie pracy programu? Pobieżne przejrzenie noty wskazuje że to chyba nie takie proste. Np. dla procków z bootsektorem programowanie może się odbywać tylko z obszaru bootsektora, a zapis odbywa się całą stroną pamięci (nie ma możliwości zapisania np. tylko jednej komórki).
Nie chodziło ci czasem o EEPROM?

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 17:53 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam tak - w czasie działania programu - jak np zmieniam komórkę np: a tzn w Bascomie a=a+1
a w asm odczytuje - lds r18, {a} i ewentualnie zapisuje w asm - [sts {a},r18 (oczywiscie deklaruje tą komórkę np w Basco DIM a AS byte ) to sie wszystko zgadza ale ja chcę {a} - to wartość komórki a - rozumiem i teraz jak odczytać do następnie komórki czyli a+1, a+2 itp. czyli nie zwiększać komórki a tylko odczytać następną komórkę i ewentualnie wpisać do następnej komórki (FLASH nie EPROM



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 18:52 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Zmienne rezydują w RAM nie we FLASH. Pamięć FLASH jest pamięcią stałą.
Dostęp do kolejnych komórek RAM masz przez adresowanie pośrednie. Można skorzystać z jednego z trzech rejestrów X, Y albo Z. Na rejestr X skladają się rejestry r26 i r 27, na Y r28 i r29, na Z r30 i r31. Młodszy bajt adresu zmiennej ładuje się do rejestru o numerze parzystym, starszy bajt do rej. o nr. nieparzystym (są do tego odpowiednie makra). Potem intrukcja load albo store indirect post incemented (albo predecremented) np.
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 04:40 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam dzięki za odp. (te rejesttry znam -dzięki) tzn że w trakcie działania programu nic nie można zmieniać w pamięci flash??

ldi ZL,low (ledy17*2) ;adres tabeli w pamięci programu data ledy
ldi ZH,high (ledy17*2)
LPM R17,z+

ledy17: (te dane są we flash - chyba )
data 1,5,7,10 itp
- rozumiem, że dane z ledy17 są pobierane ale zmienić oraz zapisać ponownie do tych samych komórek nie można ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 08:41 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Teoretycznie niby można, ale ograniczenia tej pamieci to raczej uniemożliwiają.
Właściwie po co to, co byś chciał uzyskać?

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 09:03 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Bawię się LED-ami WS2812B i w żaden sposób nie mogę wpać na to jak zrobić żeby do komórek powpisywać jakie Ledy mają się zapalać i potem wszystko dopiero wyświetlić. Teraz robie to na wait-ach tzn najpierw wyznaczam położenie (niech będzie komet :) ) - wyświetlam, - potem 2 komet wyświetlam itp Niestety mimo małych czasów widać mruganie (tzn drugie położenie kasuje wyświetlenie pierwszego położenia) kurcze trochę zawile tłumacze :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 09:59 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Robisz to wszystko na buforsze w RAM! Jeśli we FLASH masz wcześniej przygotowany np. pattern komety czy innego efektu to najpierw kopiujesz to do RAM w odpowiednie miejsce bufora z ewentualnym miksowaniem kolorów. Jak wszystko jest gotowe to cały bufor wysyłasz do diodek. Wtedy nie ma żadnego migania.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 10:15 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

hehe łatwo powiedzieć ale własnie jak kopiuje?? jak wrzucam z flahsa do RAM i od której komórki w atmega 328 jest RAM - nie bardzo rozumiem



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 10:42 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

A jest Ci w ogóle potrzebna ta wiedza? Jak potrzebujesz adres zmiennej (czy stałej) to korzystasz z makr high(zmienna) i low(zmienna) i chyba wystarczy? Jedynie coś mi się kojarzy, że dostęp do komórki pamięci usytuowanej we FLASH wymaga podwojenia adresu, tak jak w przykładzie pod tym opisem: http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_LPM.html

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 14:07 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Chyba nie bardzo mnie rozumiesz W jaki sposób kopiuje to RAM-u?? i skąd mam wiedzieć od jakiej komórki wyrzucać wszstko na LED-y Muszę zmieniać te komórki kopiować do RAM-u i wyrzucać na LED-y tego nie rozumiem co to KOPIOWAĆ DO RAM- u?? - sorry ale uczę się :(

ja mam takie coś:

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 15:11 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Rzeczywiście. A obejrzałeś te poradniki, o których wspomniałem? https://www.youtube.com/playlist?list=PLtXXWLsA5QNi9bhuG5DT1T3jwua5p-vkv Mirek wszystko pięknie omawia, co prawda na podstawie języka C, ale idea jest niezależna od języka. Jestem pewien, że jak je obejrzysz to wiele Ci się wyjaśni.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 15:32 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Oczywiście mam je wszystkie :) ale niestety zacząłem zabawę z BASCOM-em i już nie mam głowy zmieniać języka na C wolę się uczyć asm z dodatkami Bascoma



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2014, o 07:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Nie robiłem jeszcze magic ledów, a że ostatnio nie mam czasu przysiąść na spokojnie do forum, ciężko mi pomóc Ci chwilowo od strony algorytmicznej.

Aliasy rejestrów to takie ich zastępcze nazwy, które łatwiej zapamiętać i rozróżnić zwłaszcza osobom trzecim patrzącym na kod. Definiuje się je tak:

.def IloscDiodReg = r16

I od tego momentu zamiast pisać r16 możesz operować przyjaźniejszą nazwą. Oczywiście możesz nadać każdemu rejestrowi więcej niż jeden alias i używać ich naprzemiennie. Na przykład jeśli używasz rejestru r16 w jednej części programu jako liczby diod to tam odnosisz się do niego poprzez IloscDiodReg, a w innym miejscu, powiedzmy, rejestr ten przechowuje bajt odebrany z jakiegoś urządzenia. Tam odnosisz się do niego przez inną nazwę, np. RejestrOdebranegoBajtu (też wcześniej zadeklarowaną). Daje to tyle, że kod wygląda milej dla oka :)

Wysłane z mojego GT-S7710


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2014, o 15:02 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam dzięki za odp no tak jasne - trochę Cię nie zrozumiałemnt. tych Alia-sów :) masz rację. Ja piszę w Bascom-ie i Aemblerze i dlatego to tak wygląda - dla siębie daje odpowiednie nazwy zmiennych, które są definiowane w Bascomie. - postaram się poprawić a przynajmniej dać komentarze co i jak.
Ale powiedz mi bo nie mogę sobie z tym poradzić w jaki sposób w asemblerze wpisać coś do pamięci RAM (tzn kazać PC wpisać :) jakiś np. ciąd liczb a potem je stamtąd wysłać na LEDY - poprostu odczytać

jest LDS ale ona odczytuje 1 komórkę
jest
ldi ZL,low (Ledy14*2)
ldi ZH,high (Ledy14*2)

LPM R17,Z+
ldi r19,8

ale LPM R17,Z+ odczytuje mi dane z DATA 1,2,3 ...........

i gdze wogóle jest pamięć RAM - jak się wpisuje i odczytuje ciągi liczb !!!
- dzięki

P.S chcę poprostu coś wpisać do komórek, zmienić jakieś liczby, wpisać cały pakiet np 255 komórek do RAM i potem na diody -z jakiś konkretnych komórek - doczytałem się że w czasie pracy programu nie można zmieniać komórek w pam. Flash ??? - jedną się da napewno - program wyżej ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2014, o 17:36 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Może poczytaj sobie to: http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/avr/help/avr_memory_organization.htm
i może jeszcze to: http://avrhelp.mcselec.com/index.html?mixing_asm_and_basic.htm


Autor postu otrzymał pochwałę

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 15:05 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam oki dzięki helpa mam po polsku i tam mam wstawki asmblerowe - nie mogę zrozumieć czy RAM zaczyna się od komórki 0 do (w zajeżności od ilości RAM ) a z angielski u mnie krucho :( w jako sposób napisać żeby AVR wrzucał do RAM-u??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 18:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Hm... Od czego by tu zacząć :)

Po pierwsze: jeśli chcesz zgłębić wiedzę o asemblerze w avr, a kiepsko u Ciebie z angielskim, to polecam książkę Jarosława Dolińskiego "Mikrokontrolery AVR w praktyce".

Po drugie: zapomnij o wpisywaniu czegokolwiek do pamięci Flash w trakcie działania programu. Tego się nie robi (a jeśli mamy działać "jak Pan Bóg przykazał", to przyjmijmy, że po prostu się nie da). Nie robi się tego po pierwsze dlatego, że pamięć Flash jest pamięcią, w której siedzi praktycznie tylko treść samego programu - instrukcje do wykonania dla procesora. Po drugie dlatego, że pamięć Flash można zapisać jedynie około 10 000 razy, więc gdyby tak cały czas na niej dokonywać operacji zapisu, szybko byśmy ją zdewastowali.

Pamięcią dostępną dla operacji dziejących się podczas wykonywania programu, swego rodzaju obszarem roboczym jest pamięć RAM. Brudnopis - który można "piłować" do woli, a operacje zapisu/odczytu są w miarę szybkie.
Dlatego pozostańmy przy RAM-ie.


Jako że pamięć RAM i Flash to dwie osobne bazy o nieco innej naturze, należy pamiętać, że każda z nich ma własną przestrzeń adresową. Pamięć RAM nie zaczyna się od któregoś tam adresu pamięci Flash ani odwrotnie.

Dlatego kiedy zaczynasz pisać swój kod, wpisujesz gdzieś na początku dyrektywę np. ".cseg 0" czy ".cseg 0x0000" etc. Oznacza to, że od tego miejsca w kodzie wszystkie składniki kodu zaczną być zapisywane w pamięci Flash (cseg = code segment), począwszy od adresu 0 (ale uwaga! to jest adres we Flash, nie mający nic wspólnego z RAM).
Jeśli chcesz zająć (lub "zarezerwować" coby brzmiało ładniej :D) trochę pamięci RAM, musisz się "przełączyć na ten tryb" poprzez dyrektywę ".dseg". Proponuję wydzielić sobie trochę miejsca na początku lub na końcu kodu - tak, żeby łatwo Ci było tam zajrzeć i napisać od nowej linii: .dseg 0x60

Czemu 0x60 a nie 0x00? W niższych od 0x60 adresach siedzą informacje m.in. o rejestrach we/wy, więc powinniśmy zostawić je w spokoju. Natomiast od 0x60 w górę można śmiało zapisywać informacje.

Jeśli potrzebujesz, powiedzmy, 10-bajtowej przestrzeni w pamięci RAM, to z powodzeniem możesz to zrobić tak:
.dseg 0x60 ; od tej pory mozemy rezerwowac sobie miejsce w ramie
MojeDane: ; tutaj definiujemy etykiete wskazujaca na adres w ktorym "znajduje sie" nasz kod, w tym wypadku MojeDane = 0x60
.byte 10 ; rezerwujemy 10 bajtow (kolejna rezerwacja zostanie zapoczatkowana od adresu MojeDane+10)

A teraz wisienka na torcie - czyli jak operować taką przestrzenią, skoro już ją mamy :)

Oczywiście operuje na niej nasz program, czyli kod zapisany w pamięci Flash, a zatem wracamy z powrotem do naszego kodu zawartego w .cseg i tam dokonujemy operacji takich jak np.:

sts MojeDane, r16 ; zapisanie do komorki 0x60 wartosci rejestru r16
sts MojeDane + 1, r20 ; zapisanie do komorki ram 0x61 wartosci rejestru r20
lds r16, MojeDane ; wczytanie do rejestru r16 wartosci przechowywanej w komorce ram 0x60
lds r18, MojeDane + 6 ; wczytanie do r18 wartosci przechowywanej w komorce ram o adresie 0x66
itd.

Dwie powyższe instrukcje wystarczą do prostego wpisywania i wyciągania bajtów z pamięci RAM. Zapomnij o używaniu instrukcji LPM, która (jak podpowiada jej nazwa Load Program Memory) zajmuje się odczytem z pamięci Flash.
Żeby jednak bardziej zautomatyzować swój program, można posłużyć się specjalnymi rejestrami, tzw. X, Y i Z (które tak naprawdę są parami rejestrów kolejno: 26 i 27, 28 i 29, 30 i 31). Rejestry są czymś na kształt wskaźników z języków wysokiego poziomu, tj. potrafią jakby wskazywać na dane miejsca, a także skakać po nich w sposób uporządkowany. Jednym z takich skoków jest inkrementacja i dekrementacja - czyli dokonujesz operacji na tym rejestrze, a potem on sam przeskakuje na kolejny adres. Stąd już bardzo niedaleko do zbudowania jakiejś ładnej pętli :)

Żeby użyć takiego rejestru "wskaźnikowego", trzeba mu najpierw nadać wartość, czyli adres początku naszego 10-bajtowego bloku. Weźmy dla przykładu Y-greka. A zatem słynne już:
ldi YH, HIGH(MojeDane)
ldi YL, LOW(MojeDane)

Od tej pory Y wskazuje na 0x60. Następnie możemy dokonać jakiejś operacji na nim, np. zapisu lub odczytu. Odpowiednikami wcześniej wspomnianych sts i lds są tutaj st i ld. A zatem:

st Y, r16 ; zapisanie do Y (czyli 0x60) wartosci r16
ld r16, Y ; pobranie do r16 zawartosci Y (czyli 0x60)

st Y+, r16 ; zapisanie do Y (czyli 0x60) wartosci r16 i przeskoczenie Y na 0x61
ld r16, Y+ ; pobranie do r16 zawartosci Y i przeskoczenie na 0x62

(Przy dekrementacji trzeba pamiętać, że występuje ona zawsze przed operacją)
st -Y, r16 ; najpierw przeskoczenie Y o jeden w dol (z powrotem na 0x61) i potem zapisanie r16 do nowego Y
ld r16, -Y ; najpierw przeskok Y na 0x60, a potem zaladowanie do r16 wartosci spod nowego Y



To tak w dużym skrócie :D

Mam nadzieję, że się przyda. Gdybyś jednak przemógł się trochę do angielskiego lub jeśli znasz niemiecki, to bardzo dobry jest blog Gerharda Schmidta: http://www.avr-asm-tutorial.net/avr_en/ ... index.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2014, o 15:28 
Offline
Użytkownik

Dołączył(a): 20 lip 2013
Posty: 70
Pomógł: 0

Witam dzięki bardzo za rozjaśnienie mi tego wszystkiego - poprostu nie umiałem poukładać sobie tego w głowie - dzięki i szacun :) (jesteś może nauczycielem ?? )
i jeszcze jedno małe pytanko - sorry

""Jako że pamięć RAM i Flash to dwie osobne bazy o nieco innej naturze, należy
pamiętać, że każda z nich ma własną przestrzeń adresową.""

i teraz

""Jeśli potrzebujesz, powiedzmy, 10-bajtowej przestrzeni w pamięci RAM, to z
powodzeniem możesz to zrobić tak:
.dseg 0x60 ; od tej pory mozemy rezerwowac sobie miejsce w ramie
MojeDane: ; tutaj definiujemy etykiete wskazujaca na adres w ktorym "znajduje sie" """

Rozumiem że kompilator wie gdzie w tym procku jest pamięć RAM a gdzie flash po mnemonikach"

.cseg 255 - dziesiętnie :)
dane:
od tego miejsca (komórka 0) wrzuca wszystko do pamięci flash (

.dseg 1024 - dziesiętnie [[ od komórki 1024 lub ewentualnie 0??? od początku pamięci RAM? tak??
danie2:

czyli jak mamy pamięc RAM w np. Atmega 328 - 2048 B to zacznie wpisywać dane od 2048-1024 w RAM-ie a jak napiszę :
.dseg 0 to zacznie wpisywać od zerowej komórki pamięci RAM ??

- ale chyba w RAM-ie są też rejestry i stos?? Czy w pisanu np BASCOM/ASM też można zarezerwować tak pamięć, a kompilator wszystko sobie poukłada (mówie o instrukcjach w Basco-mie?

- dzięki jeszcze raz bardzo mi to pomogło :)

------------------------ [ Dodano po: 42 minutach ]

$asm

.dseg 100
Mojedane : .byte 100

nie wiem dlaczego ale kompilator wskazuje mi błędy :( w tych 2 liniach??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2014, o 17:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Maciek 222 napisał(a):
Rozumiem że kompilator wie gdzie w tym procku jest pamięć RAM a gdzie flash po mnemonikach"

Wie.

Maciek 222 napisał(a):
.cseg 255 - dziesiętnie
dane:
od tego miejsca (komórka 0) wrzuca wszystko do pamięci flash

Wrzuca do pamięci flash, ale nie począwszy od komórki 0, tylko komórki 255. Ale musisz pamiętać, że kiedy mikrokontroler zaczyna pracę, startuje z wykonywaniem rozkazów od adresu 0. Powinno się więc zaczynać instrukcje od dyrektywy .cseg 0 (przynajmniej w początkach przygody z programowaniem, w programach nieużywających przerwań). A więc proponuję .cseg 0 zamiast .cseg 255.

Jeśli natomiast chcesz stworzyć jakąś "zmienną" w pamięci flash, to nie pisz dodatkowego .cseg, tylko jak już jesteś w bloku cseg, to (jeśli nie jest to mega długi kod) na końcu wszystkich instrukcji stwórz sobie etykiety i rezerwację bajtów.

Maciek 222 napisał(a):
.dseg 1024 - dziesiętnie [[ od komórki 1024 lub ewentualnie 0??? od początku pamięci RAM? tak??
danie2:

czyli jak mamy pamięc RAM w np. Atmega 328 - 2048 B to zacznie wpisywać dane od 2048-1024 w RAM-ie a jak napiszę :

Od 1024. Ale nie 2048-1024, tylko prędzej 0+1024 :) Liczymy od początku, nie od końca pamięci. Ale zaczynaj sobie zawsze od 60 hex czyli 96 dziesiętnie.

Maciek 222 napisał(a):
- ale chyba w RAM-ie są też rejestry i stos?? Czy w pisanu np BASCOM/ASM też można zarezerwować tak pamięć, a kompilator wszystko sobie poukłada (mówie o instrukcjach w Basco-mie?

Niestety nie programuję w ogóle w Bascomie i go nie znam.
Owszem są rejestry i stos, ale rejestry są poniżej 0x60 (czyli 96 dziesiętnie; chociaż lepiej jeszcze się upewnij, np. z noty pdf, czy dla atmega328 jest to 0x60, dla atmega32 i atmega8 na pewno tak), a stos jest na samym końcu pamięci RAM i narasta od ostatniej komórki pamięci w dół.
Jeśli jednak programujesz w czystym asm, to sam kontrolujesz stos.

Cytuj:
.dseg 100
Mojedane : .byte 100

Nie wiem, czy piszesz to jako jakąś wstawkę czy jako czysty asm. A przede wszystkim nie wiem, jakiego środowiska używasz i jakie konkretnie błędy Ci wyskakują.

Spróbuj może:
.dseg 0x60
Mojedane:
.byte 100

Wszystko w osobnych liniach, dwukropek zaraz przy nazwie etykiety i wartość hex przy dseg.
Jednak bez komunikatów o błędach można tylko gdybać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 65 ]  Przejdź na stronę 1, 2, 3  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO