Czmu nie dziala ten kod? (AVR asm)

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
ODPOWIEDZ
Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Czmu nie dziala ten kod? (AVR asm)

Post autor: Amugilap » 27 maja 2012, 23:41

Hej!
Probuje sklecic kod obslugujacy klawiature 4x4 pod debugerem wydaje mi sie ze chodzi a po wgraniu do proca lipa, gdzie popelnilem blad?

Kod: Zaznacz cały

.include "m8515def.inc"


.def acc = r16
.def keyval = r20
.def pushed = r21

.macro dodaj4
inc keyval
inc keyval
inc keyval
inc keyval
.endm

.cseg
; stos
;----------------
ldi acc,low(ramend)
out spl,acc
ldi acc,high(ramend)
out sph,acc
;----------------
;konfiguracja portow we/wy klawiatury
ldi acc,0b00001111 ;PA4-PA7wejscia, PA0-PA3 wyjscia 
out ddra,acc
ldi acc,0b00001111
;out porta,acc
;konfiguracja portow wyjscia led
ldi acc,0b11111111 ;PD0-PD7 wyjscia 
out ddrd,acc
ldi acc,0b11111111 ;ustawienie 1(PD0-PD7)
out portd,acc
;-----------------------------------
;-------------glowna petla-----------------------
main:

rcall getkey
rcall wyswietl

rjmp main
;------------koniec glownej petli----------------
;----------------
getkey: ;
ldi keyval,0
ldi pushed,0


ldi acc,0b00000001
out porta,acc
rcall skan_kolumn
cpi pushed,1
breq getkey_end

ldi acc,0b00000010
out porta,acc
dodaj4 
rcall skan_kolumn
cpi pushed,1
breq getkey_end

ldi acc,0b00000100
out porta,acc
dodaj4 
rcall skan_kolumn
cpi pushed,1
breq getkey_end

ldi acc,0b00001000
out porta,acc
dodaj4 
rcall skan_kolumn
cpi pushed,1
breq getkey_end

getkey_end:
ret

;------
;procedura ktora kolumna
skan_kolumn:
;inc keyval
sbic pina,pina4
rjmp wcisniety
inc keyval
sbic pina,pina5
rjmp wcisniety
inc keyval
sbic pina,pina6
rjmp wcisniety
inc keyval
sbic pina,pina7
rjmp wcisniety
ldi keyval,0
ret
wcisniety:
inc keyval
ldi pushed,1
ret

;-----wyswietla stan keyval na led
wyswietl:
in acc,keyval
com acc
out portd,acc
ret

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 28 maja 2012, 0:24

Ok znalazlem kilka bledow, przepisze go jeszcze raz, nie zawracajcie sobie nim glowy.

Coś ciągle mam nie tak, np w ponizszym programie po zwarciu PA z PC0 ciagle pala mi sie diody, wydawalo mi sie ze powinny gasnac w takim przypadku

Kod: Zaznacz cały

.include "m8515def.inc"

.def acc = r16

.cseg

ldi acc,0b11111111 ;wyjscie
out ddra,acc
ldi acc,0b00000000
out porta,acc

ldi acc,0b11111111 ;diody
out ddrd,acc
ldi acc,0b01111111 
out portd,acc

ldi acc,0b00000000  ;wejscie
out ddrc,acc
ldi acc,0b11111111
out portc,acc

main:
sbis portc,pinc0  
rjmp main
ldi acc,0b01110000 ;nawet po zwarciu dowolnego portu PA z PC0 uruchmia się ten wariant
                             ;a przeciez na PA mam 0
out portd,acc  	;zapal diody

rjmp main

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 28 maja 2012, 12:38

Nie mama dzisiaj czasu na dyskusję, ale błąd masz w instrukcji
sbis .
Zmień na

Kod: Zaznacz cały

main:
sbis pinc,0 
rjmp main 

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 28 maja 2012, 14:55

Ok mam juz dzialajacą wersję kodu ale czegoś do konca nie rozumiem:

Kod: Zaznacz cały

.include "m8515def.inc"

.def acc = r16

.cseg
ldi acc,0b11111111 ;diody
out ddrd,acc
ldi acc,0b01111111 
out portd,acc

ldi acc,0b11110000  ;wyjscie/wejscie
out ddrc,acc
ldi acc,0b00001111 ;pull-up na wejsciu
out portc,acc

main:
sbis pinc,0
rjmp zapal
ldi acc,0b11111111
out portd,acc
rjmp main
zapal:
ldi acc,0b01110000
out portd,acc
rjmp main
W tym przypadku podanie na wejscie stanu niskiego powoduje zapalenie sie diod zgodnie z oczekiwaniami. dlaczego program nie chce dzialac gdy wejscie aktywuje sie stanem wysokim? Wydawalo mi sie ze to tez powinno dzialać

Kod: Zaznacz cały

.include "m8515def.inc"

.def acc = r16

.cseg
ldi acc,0b11111111 ;diody
out ddrd,acc
ldi acc,0b01111111 
out portd,acc

ldi acc,0b11110000  ;wyjscie/wejscie
out ddrc,acc
ldi acc,0b11110000 ; stan wysoki na wyjsciu
out portc,acc

main:
sbic pinc,0         ; zmieniony warunek
rjmp zapal
ldi acc,0b11111111
out portd,acc
rjmp main
zapal:
ldi acc,0b01110000
out portd,acc

rjmp main
Kod wg mnie rownowazny ale diody pala sie caly czas, niezaleznie czy wysoki stan na wyjsciu jest zwarty z PC0 czy nie. Podejzewam ze z tego samego powodu ne dziala moj program do obslugi klawiatury matrycowej bo tam tez mialem aktywowanie stanem wysokim. Bardzo mnie ciekawi czemu tak sie dzieje, jak macie pomysly to prosze o oswiecenie.

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 29 maja 2012, 0:39

A w stanie spoczynku "fizycznie " jaki stan wymuszasz na wejściu PINC.0 ( nóżka 21)?
Musi to być stan niski.

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 29 maja 2012, 6:20

Myslalem ze ustawienie pull up rezystora na 0 daje pull down, oczywiscie tak nie jest i po podlaczeniu wejscia przez 10k do masy wszystko dziala jak trzeba. Mystery solved, dzieki :)

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 29 maja 2012, 12:15

Czemu sobie komplikujesz układ?
Włącz wewnętrzny pull-up na kolumnie, a przyciski niech zwierają do masy ustalonej na wierszu.

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 29 maja 2012, 12:30

Uklad zrobie tak jak piszesz, bo w druga strone faktycznie nie ma sensu. Chcialem sie tylko z czystej ciekawosci dowiedziec czemu nie chcialo dzialac w druga strone :)

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 29 maja 2012, 22:12

Bo przeważnie wejścia podciągnięte są do plusa, nie do masy.

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 30 maja 2012, 12:15

A z jakiego źródła korzystasz w czasie nauki ASM ??

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 30 maja 2012, 12:38

Dwu tomowa "Sztuka programowania mikrokontrolerow AVR" A. Pawluczuka Chyba najlepsza ksiązka do asemblera jaka kiedykolwiek widzialem. Uczac sie asemblera 8086 na tak dobra ksiazke nie udalo mi sie trafic. Perelka i czysta przyjemność. Polecam wszystkim!

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 30 maja 2012, 16:50

Jak by ktoś potrzebowal to dzialajacy kod:
Porty wejscia aktywowane są stanem niskim ale mimo to warto dac dodatkowe rezystory
podciagajace 10k bo bez tego uklad zachowuje sie jakoś niepewnie.

Kod: Zaznacz cały

.include "m8515def.inc"


.def acc = r16
.def keyval = r20
.def keyvalc =r21
.def pushed = r22

.macro dodaj4
inc keyval
inc keyval
inc keyval
inc keyval
.endm

.cseg
;inicjalizacja stosu
;----------------
ldi acc,low(ramend)
out spl,acc
ldi acc,high(ramend)
out sph,acc
;----------------
;konfiguracja portow we/wy klawiatury
ldi acc,0b00001111 ;PC4-PC7wejscia, PC0-PC3 wyjscia 
out ddrc,acc
ldi acc,0b11110000 ;ustawienie 1(PC4-PC7), 0(PC0-PC3)
out portc,acc
;konfiguracja portow wyjscia led
ldi acc,0b11111111 ;PD0-PD7 wyjscia 
out ddrd,acc
ldi acc,0b11111111 ;ustawienie 1(PD0-PD7)
out portd,acc
;-----------------------------------
;-------------glowna petla-----------------------
main:

rcall getkey
rcall wyswietl

rjmp main
;------------koniec glownej petli----------------
;----------------
getkey: ;procedura umieszcza kod przycisku
;w keyval,klawiatura podlaczona do portu C
ldi keyval,0
ldi pushed,0


ldi acc,0b11111110
out portc,acc
rcall skan_kolumn
cpi pushed,1
breq getkey_end

ldi acc,0b11111101
out portc,acc
ldi keyval,4 
rcall skan_kolumn
cpi pushed,1
breq getkey_end

ldi acc,0b11111011
out portc,acc
ldi keyval,8
rcall skan_kolumn
cpi pushed,1
breq getkey_end

ldi acc,0b11110111
out portc,acc
ldi keyval,12
rcall skan_kolumn
cpi pushed,1
breq getkey_end
ldi keyval,0

getkey_end:
ret

;------
;procedura okreslajaca ktora kolumna
skan_kolumn:
ldi keyvalc,0
sbis pinc,4
rjmp wcisniety
inc keyvalc
sbis pinc,5
rjmp wcisniety
inc keyvalc
sbis pinc,6
rjmp wcisniety
inc keyvalc
sbis pinc,7
rjmp wcisniety
ldi keyvalc,0
ret
wcisniety:
inc keyvalc
ldi pushed,1
add keyval,keyvalc
ret

;-----wyswietla stan keyval na led
wyswietl:
mov acc,keyval
com acc
out portd,acc
ret

ODPOWIEDZ