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ę

Robię błąd w prostym programie

Moderatorzy: Jacek Bogusz, Moderatorzy

Awatar użytkownika
darecki23
-
-
Posty: 41
Rejestracja: 20 mar 2005, o 16:18
Lokalizacja: Szczecin

Robię błąd w prostym programie

Postautor: darecki23 » 8 kwie 2005, o 21:32

Piszę program w Avr asembler. Program jest prosty, ale robie jakiś błąd, którego nie widzę. Czy ktoś mogłby to sprawdzić?

Zmienne V,H,T od 0 do 90

;W=V+100*(H+100*T)
;pomocniczy rejestr R30
.def A1 = R16; A1 mlodszy bajt zmiennej A
.def A2 = R17; A2 starszy bajt zmiennej A
.def A3 = R18;
.def B1 = R19; B1 mlodszy bajt zmiennej B
.def B2 = R20; B2 starszy bajt zmiennej B
.def B3 = R21;
.def T = R25;
.def H = R26;
.def V = R27;
.def MSB = R2
.equ ccc = $45

zmienne:
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
oblicz_adres:
mul T,R30;
; w R1 mamy bardziej znaczacy bajt =5
; w R0 mniej znaczacy bajt =220
; R1 R0
; 101 11011100
; w sumie 10111011100 czyli 1500
mov A1,R0
mov A2,R1

add A1,H
adc A2,B2
mul A1,R30
mov B1,R0
mov B2,R1
mul A2,R30
mov A1,R0
mov A2,R1

ldi R29,0
add A1,B2
adc R23,R27
cpi R23,0
breq skok
ldi R29,1
add A2,R29
skok:
add B1,V

;Wynik znajduje sie w A2 - najstarszy bajt; A1 - mlodszy, B1 - najmlodszy
koniec:
rjmp koniec
Ostatnio zmieniony 9 kwie 2005, o 09:44 przez darecki23, łącznie zmieniany 1 raz.

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Re: Robię błąd w prostym programie

Postautor: gawel » 8 kwie 2005, o 22:25

Piszę program w Avr asembler. Program jest prosty........
;W=V+100*(H+100*T)
;pomocniczy rejestr R30
.def A1 = R16; A1 mlodszy bajt zmiennej A
.def A2 = R17; A2 starszy bajt zmiennej A
.def A3 = R18;
.def B1 = R19; B1 mlodszy bajt zmiennej B
.def B2 = R20; B2 starszy bajt zmiennej B
.def B3 = R21;
.def T = R25;
.def H = R26;
.def V = R27;
.def MSB = R2
.equ ccc = $45

zmienne:
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
oblicz_adres:
mul T,R30;
; w R1 mamy bardziej znaczacy bajt =5
; w R0 mniej znaczacy bajt =220
; R1 R0
; 101 11011100
; w sumie 10111011100 czyli 1500
Po pierwsze, to wynik tego mnożenia jest inny. R30=100 * R25=23 -> 2300 dec = 8FC hex
(ale to nie jest w kategorii błędu).
.........
mov A1,R0
mov A2,R1

add A1,H
adc A2,B2
Masz dodawanie 16-bitowe, ale rejestr B2 ma (przynajmniej w pokazanym fragmencie) niezainicjowaną zawartość i to należy traktować w kategorii błędu.

Dalej nie chciało mi się już patrzeć (też mogą być błędy).

Awatar użytkownika
darecki23
-
-
Posty: 41
Rejestracja: 20 mar 2005, o 16:18
Lokalizacja: Szczecin

Postautor: darecki23 » 9 kwie 2005, o 08:09

Dzieki, ale to niczego nie zmienia. Efekt jest taki, ze cos przeklamuje :(.

Dexter
-
-
Posty: 115
Rejestracja: 29 kwie 2003, o 21:38
Lokalizacja: Warszawa
Kontaktowanie:

Postautor: Dexter » 9 kwie 2005, o 11:54

Instrukcja LDI laduje STALA do rejestru. Ty probujesz zrobic cos dziwnego. LDI T,23 ?? Co to jest ? Nie mozesz zaladowac stalej do zmiennej w ten sposob ktory napisales. W procesorze jest 32 rejestry ogolnego przeznaczenia. Ale tylko 16 (R16-R31) wspolpracuje z instrukcja LDI.
UPDATE:
Ok teraz zauwazylem ze definiujesz te rejestry, zmylilo mnie pierwsze zdanie ze V,H,T to zmienne od 0 do 90.
Pozdro
Dexter

Awatar użytkownika
darecki23
-
-
Posty: 41
Rejestracja: 20 mar 2005, o 16:18
Lokalizacja: Szczecin

Postautor: darecki23 » 9 kwie 2005, o 11:58

To nie zmienna tylko zdefiniowany rejestr R25 zobacz na gorze .def T = R25.

LucASWw
-
-
Posty: 248
Rejestracja: 23 sie 2003, o 18:26
Lokalizacja: UK

Postautor: LucASWw » 9 kwie 2005, o 13:38

A nie zapomniałeś o flagach ALU?

Awatar użytkownika
darecki23
-
-
Posty: 41
Rejestracja: 20 mar 2005, o 16:18
Lokalizacja: Szczecin

Postautor: darecki23 » 9 kwie 2005, o 13:43

Ktoś potrafi to szybko i zgrabnie to napisać? To ulży moim cierpieniom . :566:

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 9 kwie 2005, o 13:48

-> darecki23
Nie chciało mi się szukać szmaty w twoim programie, łatwiej jest napisać swoją wersję.
Potrzebuję rejestru roboczego (nazwany jest acc).

;W=V+100*(H+100*T)
.def A1 = R16; A1 mlodszy bajt zmiennej A (wyniku)
.def A2 = R17; A2 średni bajt zmiennej A (wyniku)
.def A3 = R18; A3 najstarszy bajt zmiennej A (wyniku)
.def acc=r20
.def T = R25;
.def H = R26;
.def V = R27;

ldi T,23
ldi H,36
ldi V,47
ldi R30,100

; dla tak podanych wartości zmiennych wynik wynosi (jest 3-bajtowy):
; w=47+100*(36+100*23)=233647=390AF

mul t,r30
mov a1,r0
mov a2,r1
ldi a3,0
ldi acc,0
add a1,h
adc a2,acc
mul a1,r30
mov acc,a2
mov a1,r0
mov a2,r1
mul acc,r30
add a2,r0
adc a3,r1
add a1,v
ldi acc,0
adc a2,acc
adc a3,acc
;
; i masz w rejestrach A3=3 A2=90 A1=AF
koniec:
rjmp koniec

Zastanów się na powyższą wersją, swoją wersją i błęda sam znajdziesz.

Awatar użytkownika
darecki23
-
-
Posty: 41
Rejestracja: 20 mar 2005, o 16:18
Lokalizacja: Szczecin

Postautor: darecki23 » 9 kwie 2005, o 13:52

Wielkie dzieki. Zabieram się za analizowanie Twojego programu.

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 9 kwie 2005, o 22:35

Wielkie dzieki. Zabieram się za analizowanie Twojego programu.
Znalazłeś coś w swoim programie?

Awatar użytkownika
darecki23
-
-
Posty: 41
Rejestracja: 20 mar 2005, o 16:18
Lokalizacja: Szczecin

Postautor: darecki23 » 9 kwie 2005, o 22:38

Błąd polega na kolejności działania. Najpierw zrobiłem działania na starszym bajcie o poten na młodszym. Każdy wie, że robi się na odwrót. No ale pisałem to późnym wieczorem. Masz rację czasami łatwiej coś napisać od nowa niż szukać błędu.

Wróć do „Elektronika - tematy dowolne”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 175 gości