Dobrý den,
Postavil jsem celý můj projekt podle této stránky: http://pier.own.cz/index.php?text=3-robot-stopar (je zde i technická dokumentace a vše potřebné, i s videem).
A teď už zbývá naprogramovat procesor, což se mi nezdá zrovna jednoduché.
V plné funkci se mi podařilo zprovoznit displej a né úplně všechny chody :( zvlásť ty chody s infradiodami.
Pokud jste někdo zkušený programátor ASM tak mi pls pomozte, pač já už jsem v koncích :( ...
Díky moc !
MOJE VERZE:
;**********************************************************************
;Program pro sledování čáry
;**********************************************************************
;*********** INICIALIZACE *********************************************
;**********************************************************************
;----- Definiční soubor Atmega8 -----
.include "m8def.inc"
;----- Pojmenování registrů -----
.def Temp = R16
.def Delay1 = R17
.def Delay2 = R18
.def Delay3 = R19
;----- Nastavení portů a registrů
RESET: ldi Temp,0b00000001 ; nastavuje všechny bity v Temp na 0
out DDRB,Temp ; nastavuje port B jako vstupní
ldi Temp,0b11101111
out DDRC,Temp ; nastavuje port C jako výstupní
ldi Temp,0b11111111
out DDRD,Temp ; nastavuje port D jako výstupní
ser Delay1
ser Delay2
ser Delay3
;*********** Inicializace zásobníku
ldi Temp,LOW(RAMEND)
out SPL,Temp
ldi Temp,HIGH(RAMEND)
out SPH,Temp
;**********************************************************************
;*********** HLAVNÍ PROGRAM *******************************************
;**********************************************************************
;----------------------------------------------------------------------
;------------ HLAVNÍ NABÍDKA FUNKCÍ -----------------------------------
;----- Funkce 1 - Demo ----------
MENU: ldi Temp,0b01111001 ; do Temp binarni kod pro 1 na disp
out PORTD,Temp ; zobrazení 1 na disp
sbic PINB,0x6
rjmp JEDNA
rjmp MENU
JEDNA: sbis PINB,0x6
rjmp MENU2
;-----
sbis PINB,0x7
rjmp DEMO
;-----
rjmp JEDNA
;----- Funkce 2 - Sledování čáry ----------
MENU2: ldi Temp,0b00100100 ; do Temp binarni kod pro 2 na disp
out PORTD,Temp ; zobrazení 2 na disp
sbic PINB,0x6
rjmp DVA
rjmp MENU2
DVA: sbis PINB,0x6
rjmp MENU3
;-----
sbis PINB,0x7
rjmp LINE
;-----
rjmp DVA
;----- Funkce 3 - ukázka detekce překážek infrasenzorem ----------
MENU3: ldi Temp,0b00110000 ; do Temp binarni kod pro 3 na disp
out PORTD,Temp ; zobrazení 3 na disp
sbic PINB,0x6
rjmp TRI
rjmp MENU3
TRI: sbis PINB,0x6
rjmp MENU4
;-----
sbis PINB,0x7
rjmp FCE1
;-----
rjmp TRI
;----- Funkce 4 - ukázka detekce překážek tykadly ----------
MENU4: ldi Temp,0b00011001 ; do Temp binarni kod pro 4 na disp
out PORTD,Temp ; zobrazení 4 na disp
sbic PINB,0x6
rjmp CTYR
rjmp MENU4
CTYR: sbis PINB,0x6
rjmp MENU5
;-----
sbis PINB,0x7
rjmp FCE2
;-----
rjmp CTYR
;----- Funkce 5 - náhodná jízda ----------
MENU5: ldi Temp,0b00010010 ; do Temp binarni kod pro 5 na disp
out PORTD,Temp ; zobrazení 5 na disp
sbic PINB,0x6
rjmp PET
rjmp MENU5
PET: sbis PINB,0x6
rjmp MENU6
;-----
sbis PINB,0x7
rjmp NAHOD
;-----
rjmp PET
;----- Funkce 6 - náhodná jízda ----------
MENU6: ldi Temp,0b00000010 ; do Temp binarni kod pro 6 na disp
out PORTD,Temp ; zobrazení 6 na disp
sbic PINB,0x6
rjmp SEST
rjmp MENU6
SEST: sbis PINB,0x6
rjmp MENU
;-----
sbis PINB,0x7
rjmp LINE2
;-----
rjmp SEST
;----------------------------------------------------------------------
;------------ FUNKCE UKÁZKOVÁ JÍZDA -----------------------------------
DEMO: rcall DLY2S
ldi Temp,0b01111001 ; do Temp binarni kod pro 1 na disp
out PORTD,Temp ; zobrazení 1 na disp
rcall VPRAVO
rjmp STOP
rcall VPRED
rcall VPRED
rcall VPRED
rcall STOOS
rcall VPRED
rcall VPRED
rcall VPRED
rcall STOOS
rcall TRISTA
rcall VZAD
rcall VZAD
rcall STOOS
rcall VZAD
rcall VZAD
rcall STOOS
rcall VPRAJ
rcall VPRAJ
rcall VLEJ
rcall VLEJ
rcall VPRAJ
rcall VPRAJ
rcall VLEJ
rcall VLEJ
rcall VPRAJ
rcall VPRAJ
rcall VLEJ
rcall VLEJ
rcall VPRAJ
rcall VPRAJ
rcall VLEJ
rcall VLEJ
rcall VPRED
rcall VPRED
rcall VLEVO
rcall VPRED
rcall VPRED
rcall TRISTA
STOP: rjmp STOP
;----------------------------------------------------------------------
;------------ FUNKCE SLEDOVÁNÍ ČÁRY -----------------------------------
LINE: rcall DLY2S
ldi Temp,0b00100100 ; do Temp binarni kod pro 2 na disp
out PORTD,Temp ; zobrazení 2 na disp
;----- Levé kolo ----------
LEVE: cbi PORTC,1 ; *** 0 na motor 1
;-----
sbic PINB,0x1 ; načtení levého čidla
rjmp PRAVE
;-----
sbi PORTC,1 ; *** 1 na motor 1
sbi PORTC,5 ; ir led
ldi Delay1,37 ;1
DLY1: dec Delay1 ;1
brne DLY1 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp OBJET
sbis PINB,0x4
rjmp OBJET2
cbi PORTC,5 ; ir led
ldi Delay1,32
DLY2: dec Delay1
brne DLY2
sbi PORTC,5 ; ir led
ldi Delay1,37 ;1
DLY11: dec Delay1 ;1
brne DLY11 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp OBJET
cbi PORTC,5 ; ir led
ldi Delay1,32
DLY22: dec Delay1
brne DLY22
;----- Pravé kolo ----------
PRAVE: cbi PORTC,3 ; *** 0 na motor 2
;-----
sbic PINB,0x2 ; načtení pravého čidla
rjmp LEVE ;
;-----
sbi PORTC,3 ; *** 1 na motor 2
sbi PORTC,5 ; ir led
ldi Delay1,37 ;1
DLY3: dec Delay1 ;1
brne DLY3 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp OBJET
cbi PORTC,5 ; ir led
ldi Delay1,32
DLY4: dec Delay1
brne DLY4
sbi PORTC,5 ; ir led
ldi Delay1,37 ;1
DLY33: dec Delay1 ;1
brne DLY33 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp OBJET
cbi PORTC,5 ; ir led
ldi Delay1,31
DLY44: dec Delay1
brne DLY44
nop
rjmp LEVE ; smyčka jízda
OBJET2: cbi PORTC,1
cbi PORTC,3
rcall VZADK
rjmp OBJET
;------------------
OBJET: cbi PORTC,0 ; objížděcí manévr
cbi PORTC,1
cbi PORTC,2
cbi PORTC,3
rcall VPRAVO
rcall VPRED
rcall VPRED
rcall VPRED
rcall VLEVO
rcall VPRED
rcall VPRED
rcall VPRED
rcall VPRED
rcall VLEVO
cbi PORTC,0
cbi PORTC,1
cbi PORTC,2
cbi PORTC,3
;-----
sbi PORTC,1
sbi PORTC,3
LOOP4: sbic PINB,0x1 ; nalezena čára?
rjmp NUL
rjmp LOOP4
NUL: cbi PORTC,0
cbi PORTC,1
cbi PORTC,2
cbi PORTC,3
rcall VPRAVO2
rjmp LEVE ; pokračování ve sledování čáry
;----------------------------------------------------------------------
;------------ FUNKCE - UKÁZKA DETEKCE PŘEKÁŽKY INFRASENZOREM ----------
FCE1: rcall DLY2S
ldi Temp,0b00110000 ; do Temp binarni kod pro 3 na disp
out PORTD,Temp ; zobrazení 3 na disp
;----- Levé kolo ----------
LEVE1: cbi PORTC,1 ; *** 0 na motor 1
sbi PORTC,1 ; *** 1 na motor 1
rcall DLY
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLY5: dec Delay1 ;1
brne DLY5 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJ
cbi PORTC,5 ; ir led
ldi Delay1,32
DLY6: dec Delay1
brne DLY6
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLY55: dec Delay1 ;1
brne DLY55 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJ
cbi PORTC,5 ; ir led
ldi Delay1,32
DLY66: dec Delay1
brne DLY66
;----- Pravé kolo ----------
cbi PORTC,3 ; *** 0 na motor 2
sbi PORTC,3 ; *** 1 na motor 2
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLY7: dec Delay1 ;1
brne DLY7 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJ
cbi PORTC,5 ; ir led
ldi Delay1,32
DLY8: dec Delay1
brne DLY8
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLY77: dec Delay1 ;1
brne DLY77 ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJ
cbi PORTC,5 ; ir led
ldi Delay1,31
DLY88: dec Delay1
brne DLY88
nop
rjmp LEVE1 ; smyčka jízda
STUJ: cbi PORTC,1
cbi PORTC,3
rjmp STUJ
;----------------------------------------------------------------------
;------------ FUNKCE - UKÁZKA DETEKCE PŘEKÁŽKY INFRASENZOREM ----------
FCE2: rcall DLY2S
ldi Temp,0b00011001 ; do Temp binarni kod pro 4 na disp
out PORTD,Temp ; zobrazení 4 na disp
OPAK: sbi PORTC,1
sbi PORTC,3
sbis PINB,0x4
rjmp STUJC
sbis PINB,0x5
rjmp STUJC
rjmp OPAK
STUJC: cbi PORTC,1
cbi PORTC,3
rcall VZADK
rjmp STUJ
;----------------------------------------------------------------------
;------------ FUNKCE - NÁHODNÁ JÍZDA ----------
NAHOD: rcall DLY2S
ldi Temp,0b00010010 ; do Temp binarni kod pro 5 na disp
out PORTD,Temp ; zobrazení 5 na disp
;----- Levé kolo ----------
LEVE2: cbi PORTC,0
cbi PORTC,1 ; *** 0 na motor 1
sbi PORTC,1 ; *** 1 na motor 1
sbis PINB,0x4
rjmp STUJL
sbi PORTC,5 ; ir led
sbi PORTB,0 ; ir led
ldi Delay1,36 ;1
DLYA: dec Delay1 ;1
brne DLYA ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJO
cbi PORTC,5 ; ir led
cbi PORTB,0 ; ir led
ldi Delay1,32
DLYB: dec Delay1
brne DLYB
sbi PORTC,5 ; ir led
sbi PORTB,0 ; ir led
ldi Delay1,36 ;1
DLYAA: dec Delay1 ;1
brne DLYAA ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJO
cbi PORTC,5 ; ir led
cbi PORTB,0 ; ir led
ldi Delay1,32
DLYBB: dec Delay1
brne DLYBB
;----- Pravé kolo ----------
cbi PORTC,3 ; *** 0 na motor 2
sbi PORTC,3 ; *** 1 na motor 2
sbis PINB,0x5
rjmp STUJL
sbi PORTC,5 ; ir led
sbi PORTB,0 ; ir led
ldi Delay1,36 ;1
DLYC: dec Delay1 ;1
brne DLYC ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJO
cbi PORTC,5 ; ir led
cbi PORTB,0 ; ir led
ldi Delay1,32
DLYD: dec Delay1
brne DLYD
sbi PORTC,5 ; ir led
sbi PORTB,0 ; ir led
ldi Delay1,36 ;1
DLYCC: dec Delay1 ;1
brne DLYCC ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp STUJO
cbi PORTC,5 ; ir led
cbi PORTB,0 ; ir led
ldi Delay1,31
DLYDD: dec Delay1
brne DLYDD
nop
rjmp LEVE2 ; smyčka jízda
STUJO: cbi PORTC,1
cbi PORTC,3
rcall VPRAVO3
rjmp LEVE2
STUJL: cbi PORTC,0
cbi PORTC,1
cbi PORTC,3
rcall VZADK
rcall VPRAVO3
rjmp LEVE2
OTOC: cbi PORTC,1
cbi PORTC,0 ; *** 0 na motor 1 ------------------------
sbi PORTC,0 ; *** 1 na motor 1
sbis PINB,0x4
rjmp STUJL
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLYM: dec Delay1 ;1
brne DLYM ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp LEVE2
cbi PORTC,5 ; ir led
ldi Delay1,32
DLYN: dec Delay1
brne DLYN
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLYMM: dec Delay1 ;1
brne DLYMM ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp LEVE2
cbi PORTC,5 ; ir led
ldi Delay1,32
DLYNN: dec Delay1
brne DLYNN
;----- Pravé kolo ----------
cbi PORTC,3 ; *** 0 na motor 2
sbi PORTC,3 ; *** 1 na motor 2
sbis PINB,0x5
rjmp STUJL
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLYO: dec Delay1 ;1
brne DLYO ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp LEVE2
cbi PORTC,5 ; ir led
ldi Delay1,32
DLYP: dec Delay1
brne DLYP
sbi PORTC,5 ; ir led
ldi Delay1,36 ;1
DLYOO: dec Delay1 ;1
brne DLYOO ;2
sbis PINC,0x4 ; kontrola IR přijímače
rjmp LEVE2
cbi PORTC,5 ; ir led
ldi Delay1,31
DLYPP: dec Delay1
brne DLYPP
nop
rjmp OTOC ; smyčka jízda
;----------------------------------------------------------------------
;------------ FUNKCE SLEDOVÁNÍ ČÁRY -----------------------------------
LINE2: rcall DLY2S
ldi Temp,0b00000010 ; do Temp binarni kod pro 6 na disp
out PORTD,Temp ; zobrazení 6 na disp
;----- Levé kolo ----------
LEVE4: cbi PORTC,1 ; *** 0 na motor 1
;-----
sbic PINB,0x1 ; načtení levého čidla
rjmp PRAVE4
;-----
sbi PORTC,1 ; *** 1 na motor 1
;----- Pravé kolo ----------
PRAVE4: cbi PORTC,3 ; *** 0 na motor 2
;-----
sbic PINB,0x2 ; načtení pravého čidla
rjmp LEVE4 ;
;-----
sbi PORTC,3 ; *** 1 na motor 2
rjmp LEVE4 ; smyčka jízda
;*********************************************************************
;*********************************************************************
;********** PODPROGRAMY **********************************************
;*********************************************************************
;*********************************************************************
;----- Podprogram zpoždění 2s ----------
DLY2S: ldi Temp,0b01111111 ; do Temp binarni kod pro . na disp
out PORTD,Temp ; zobrazí .
dec Delay1
brne DLY2S
ldi Delay1,100 ; dává do R16 konstantu 16
dec Delay2
brne DLY2S
dec Delay3
brne DLY2S
ret
DLY: ldi Delay1,50
ldi Delay2,0
DECR: dec Delay1
brne DECR
dec Delay2
brne DECR
ret
;----- Podprogram otočení o 90° vpravo ----------
VPRAVO: ser Delay1
ser Delay2
ldi Delay3,4
LOOP: cbi PORTC,0
cbi PORTC,3
sbi PORTC,0
sbi PORTC,3
dec Delay1
brne LOOP
dec Delay2
brne LOOP
dec Delay3
brne LOOP
nop ; doladění 90°
nop
nop
nop
nop
nop
nop
nop
cbi PORTC,0
cbi PORTC,3
ret
;----- Podprogram otočení o 90° vpravo 2 - menší úhel ----------
VPRAVO2: ser Delay1
ser Delay2
ldi Delay3,3
LOOP10: cbi PORTC,0
cbi PORTC,3
sbi PORTC,0
sbi PORTC,3
dec Delay1
brne LOOP10
dec Delay2
brne LOOP10
dec Delay3
brne LOOP10
nop ; doladění 90°
nop
nop
nop
nop
nop
nop
nop
cbi PORTC,0
cbi PORTC,3
ret
;----- Podprogram otočení o 90° vpravo 3 - 30° ----------
VPRAVO3: ser Delay1
ser Delay2
ldi Delay3,1
LOOP11: cbi PORTC,0
cbi PORTC,3
sbi PORTC,0
sbi PORTC,3
dec Delay1
brne LOOP11
dec Delay2
brne LOOP11
dec Delay3
brne LOOP11
nop ; doladění 90°
nop
nop
nop
nop
nop
nop
nop
cbi PORTC,0
cbi PORTC,3
ret
;----- Podprogram otočení o 90° vlevo ----------
VLEVO: ser Delay1
ser Delay2
ldi Delay3,4
LOOP2: cbi PORTC,1
cbi PORTC,2
sbi PORTC,1
sbi PORTC,2
dec Delay1
brne LOOP2
dec Delay2
brne LOOP2
dec Delay3
brne LOOP2
nop ; doladění 90°
nop
nop
nop
nop
nop
nop
cbi PORTC,1
cbi PORTC,2
ret
;----- Podprogram kroku vpřed ----------
VPRED: ser Delay1
ser Delay2
ldi Delay3,6
LOOP3: cbi PORTC,1
cbi PORTC,3
sbi PORTC,1
sbi PORTC,3
dec Delay1
brne LOOP3
dec Delay2
brne LOOP3
dec Delay3
brne LOOP3
cbi PORTC,1
cbi PORTC,3
ret
;----- Podprogram kroku vzad ----------
VZAD: ser Delay1
ser Delay2
ldi Delay3,10
LOOP5: cbi PORTC,0
cbi PORTC,2
sbi PORTC,0
sbi PORTC,2
dec Delay1
brne LOOP5
dec Delay2
brne LOOP5
dec Delay3
brne LOOP5
cbi PORTC,0
cbi PORTC,2
ret
;----- Podprogram otočky o 180° doprava ----------
STOOS: rcall VPRAVO
rcall VPRAVO
ret
;----- Podprogram otočky o 360° doprava ----------
TRISTA: rcall VPRAVO
rcall VPRAVO
rcall VPRAVO
rcall VPRAVO
ret
;----- Podprogram otočení o 90° vpravo jednim kolem ----------
VPRAJ: ser Delay1
ser Delay2
ldi Delay3,10
LOOP6: cbi PORTC,0
cbi PORTC,3
sbi PORTC,3
dec Delay1
brne LOOP6
dec Delay2
brne LOOP6
dec Delay3
brne LOOP6
nop ; doladění 90°
nop
nop
nop
nop
nop
nop
cbi PORTC,0
cbi PORTC,3
ret
;----- Podprogram otočení o 90° vlevo jednim kolem ----------
VLEJ: ser Delay1
ser Delay2
ldi Delay3,10
LOOP7: cbi PORTC,1
cbi PORTC,3
sbi PORTC,1
dec Delay1
brne LOOP7
dec Delay2
brne LOOP7
dec Delay3
brne LOOP7
nop ; doladění 90°
nop
nop
nop
nop
nop
nop
cbi PORTC,1
cbi PORTC,3
ret
;----- Podprogram malého kroku vzad ----------
VZADK: ser Delay1
ser Delay2
ldi Delay3,5
LOOP9: cbi PORTC,0
cbi PORTC,2
sbi PORTC,0
sbi PORTC,2
dec Delay1
brne LOOP9
dec Delay2
brne LOOP9
dec Delay3
brne LOOP9
cbi PORTC,0
cbi PORTC,2
ret