program

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
ATmega
Příspěvky: 16
Registrován: 18 bře 2010, 00:00

program

#1 Příspěvek od ATmega »

cafte chcem sa spytat na tento program...ci je to dobre urobene, ked chcem pomocou toho ovladat led?teda pomocou klavesnice si chcem prepinat svetla, popr mi prosim poradte ako by sa to dalo lepsie urobit

.include "m16def.inc"

.equ stlpec1 = PINA0
.equ stlpec2 = PINA1
.equ stlpec3 = PINA2
.equ stlpec4 = PINA3
.equ svetlo1 = PINB0
.equ svetlo2 = PINB1
.equ svetlo3 = PINB2
.equ svetlo4 = PINB3

.def hodnota_klav = r16
.def temp = r17
.def flags = r18
.equ klaves = PORTA
.equ svetla = PORTB
.equ stlacenie = 0

key_init:
ldi Temp,0b11111111
out svetla, Temp
ldi hodnota_klav,0b11110000 ;Make Cols as i/p
out DDRA, hodnota_klav ;and Rows as o/p nastavi ako vystup ak je 1 a ak 0 tak ako vstup
ldi hodnota_klav,0b00001111 ;Enable pullups na jednotke pripojeny pull up rezistor
out klaves, hodnota_klav ;on columns

inicializacia_zasobniku:
ldi Temp,LOW(RAMEND)
out SPL, Temp
LDI Temp, HIGH(RAMEND)
out SPH, Temp

get_key:
ldi hodnota_klav,0b00000000 ;Scanning Row1
ldi temp,0b01111111 ;Make Row1 low
out klaves,temp ;Send to PortA
rcall citaj_stlpce ;Read Columns

sbrc flags,stlacenie ;If key pressed (flag,indikator-ukazovatel)
rjmp done ;Exit the routine

ldi hodnota_klav,0b00000100 ;Scanning Row2
ldi temp,0b10111111 ;Make Row2 Low port nemozme adresovat priamo
out klaves,temp ;Send to keyport
rcall citaj_stlpce ;Read Columns

sbrc flags,stlacenie ;If key pressed
rjmp done ;Exit from routine

ldi hodnota_klav,0b00001000 ;Scanning Row3
ldi temp,0b11011111 ;Make Row3 Low
out klaves,temp ;Send to keyport
rcall citaj_stlpce ;Read columns

sbrc flags,stlacenie ;If key pressed
rjmp done ;Exit the routine

ldi hodnota_klav,0b00001100 ;Scanning Row4
ldi temp,0b11101111 ;Make Row4 Low
out klaves,temp ;send to keyport
rcall citaj_stlpce ;Read columns

done:
ret

citaj_stlpce:

cbr flags, (1<<stlacenie) ;Clear status flag-stavový indikátor(ukazovatel)
;<<posunie lavy operand o tolko bitov vlavo, kolko je urcenych pravym operandom
sbic PINA, stlpec1 ;Check COL1
rjmp dalsi_stlpec ;Go to COL2 if not low, ked nie je povoleny

hold:
sbis PINA, stlpec1 ;Wait for key release- cakanie na uvolnenie
rjmp hold

sbr flags, (1<<stlacenie) ;Set status flag
ret ;key 1 pressed

dalsi_stlpec:

sbic PINA,stlpec2 ;Check COL2
rjmp dalsi_stlpec1 ;Goto COL3 if not low

hold1:
sbis PINA, stlpec2 ;Wait for key release, cakanie na uvolnenie klavesy
rjmp hold1
inc hodnota_klav ;Key 2 pressed
sbr flags,(1<<stlacenie) ;Set status flag nastavi status register
ret

dalsi_stlpec1:
sbic PINA, stlpec3 ;Check COL3
rjmp dalsi_stlpec2 ;Goto COL4 if no pressed

hold2:
sbis PINA, stlpec3 ;Wait for key release
rjmp hold2
inc hodnota_klav ;Key 3 pressed
inc hodnota_klav
sbr flags, (1<<stlacenie) ;Set status flag
ret
dalsi_stlpec2:

sbic PINA, stlpec4 ;Check COL4
rjmp exit ;Exit if not low

hold3:
sbis PINA, stlpec4 ;Wait for key release
rjmp hold3
inc hodnota_klav ;Key 4 Pressed
inc hodnota_klav
inc hodnota_klav
sbr flags, (1<<stlacenie) ;Set status flag
ret

LED:
in r20, klaves
bst r20, 1
bld Temp, 1
bst r20, 2
bld Temp, 2
bst r20, 3
bld Temp, 3
bst r20, 4
bld Temp, 4
out svetla, Temp
ret

exit:
clr hodnota_klav ;reset keyval
cbr flags, (1<<stlacenie) ;No Key Pressed
ret
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#2 Příspěvek od ZdenekHQ »

Kdybys to vlákno pojmenoval třeba KONEV, vyjde to nastejno...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
ATmega
Příspěvky: 16
Registrován: 18 bře 2010, 00:00

#3 Příspěvek od ATmega »

ZdenekHQ píše:Kdybys to vlákno pojmenoval třeba KONEV, vyjde to nastejno...



to ja viem...ale ci je ten program dobre?ten koniec som si neni isty ci bude fongovat spravne...som zaciatocnik
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#4 Příspěvek od AB1 »

to ja viem...ale ci je ten program dobre?

Není dobře.
Chybí mi tam hlavní smyčka.
A v tomto místě podteče zásobník (RET bez CALL)

Kód: Vybrat vše

done:
ret
Uživatelský avatar
ATmega
Příspěvky: 16
Registrován: 18 bře 2010, 00:00

#5 Příspěvek od ATmega »

AB1 píše:
to ja viem...ale ci je ten program dobre?

Není dobře.
Chybí mi tam hlavní smyčka.
A v tomto místě podteče zásobník (RET bez CALL)

Kód: Vybrat vše

done:
ret



hm a to ma byt na konci asi takto, nie?a ber to s nadhladom pls, som len zaciatocnik
:lol:


LED:
in r20, klaves
bst r20, 1
bld Temp, 1
bst r20, 2
bld Temp, 2
bst r20, 3
bld Temp, 3
bst r20, 4
bld Temp, 4
out svetla, Temp
rcall done
Uživatelský avatar
ATmega
Příspěvky: 16
Registrován: 18 bře 2010, 00:00

#6 Příspěvek od ATmega »

inac dik vsimol som si tam este jednu chybu, jak mam tie nastavenia riadkov, tam ma to okdazuje na "done" a tam musim dat "rjmp LED" a "done" dam potom na koniec programu...lebo ono to tam je ale tak v strede to "done" :lol:
Uživatelský avatar
ATmega
Příspěvky: 16
Registrován: 18 bře 2010, 00:00

#7 Příspěvek od ATmega »

ATmega píše:inac dik vsimol som si tam este jednu chybu, jak mam tie nastavenia riadkov, tam ma to okdazuje na "done" a tam musim dat "rjmp LED" a "done" dam potom na koniec programu...lebo ono to tam je ale tak v strede to "done" :lol:


ja to nemam zatial na com odskusat vies...
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#8 Příspěvek od AB1 »

To, co jsi tu napsal není program, je to jenom kolekce podprogramů.

Aby z toho byl program, musíš tam za řádek

Kód: Vybrat vše

 out SPH, Temp

dát hlavní smyčku, něco jako toto:

Kód: Vybrat vše

Main:
      rcall get_key              ;přečti klávesnici
      cpi   hodnota_klav,1       ;stisknuto 1?
      brne  L1                   ;jestli ne, jdi na L1
      ; co se má udělat pokud byla stisknuta klávesa 1
      ;

L1:
      cpi   hodnota_klav,2
      brne  L2
      ; co se má udělat pokud byla stisknuta klávesa 2
      ;

L2:
      ;atd, atd

      rjmp Main

Asi by bylo nejlepší koupit nějakou knihu a začít od blikající ledky.
Nebo pokud chceš jenom kopírovat z internetu, tak si musíš vybírat fungující programy.
Uživatelský avatar
ATmega
Příspěvky: 16
Registrován: 18 bře 2010, 00:00

#9 Příspěvek od ATmega »

dik moc, sak ja mam aj knihy, len cas tlaci...rozblikat ledky uz viem :lol:
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“