Sida 1 av 2
Programera roboten
Postat: 31 maj 2003, 01:54:04
av GeekJoan
Är det ingen som kan gör ett litet exempel på hur koden kan se ut till en simpel PIC, AVR robot, och skriva en enkel förklaring till den.
Bara nått enkelt eftersom det är en del som undrar.
Postat: 31 maj 2003, 19:52:39
av netbear
Här är koden till min lilla robot. Den är säker mycket klantigt skriven men den fungerar. Roboten kör omkring och navigerar med hjälp av en irdiod och en avstämd irmottagare. Formateringen av koden blev som den blev
Koden är för en pic16f84 eller möjligen pic16c84
Kod: Markera allt
;-- Skrivet av Björn Samvik <bjorn@samvik.com>
;-- http://www.net-bear.com
LIST P=16F84
INCLUDE "p16f84.inc"
__CONFIG _CP_OFF & _PWRTE_OFF & _XT_OSC & _WDT_OFF
;-- Define Information -------------------------
#define Motor1 portA, 2 ;Servo1
#define Motor2 portA, 3 ;Servo2
#define IRLed portA, 0 ;IR Diod
#define IRMot portB, 0 ;IR Mottagare
#define Led portA, 1 ;LED
;-- Variabler
CBLOCK 0x0C
temp
temp1
temp2
count
ENDC
;------------------------------------------------------
org 0x00
goto start
;-- Interupt sekvens
org 0x04
bsf LED
call wall
bcf LED
bcf INTCON, 1
retfie
;-- Programstart
start call init
mainloop call clearway
call forward
goto mainloop
;-- Ställer in portar m.m.
init movlw 0x00
movwf INTCON
bsf status, rp0 ;Väljer bank 1
movlw b'00000' ;Port A output
movwf trisA
movlw b'00000001'
movwf trisB
bsf OPTION_REG, 7 ;Pullup 1= off 0= on
bcf OPTION_REG, 6 ;edge 1=rasing 0=falling
bcf status, rp0 ;Bank 0
bcf Motor1
bcf Motor2 ;ser till att motorerna står still
bcf Led
movlw b'00010000' ;Ställer in interupt men aktiverar inte ännu
movwf INTCON
return
;-- Wall found undanmanöver
wall
movlw d'60'
movwf count
wallback call backward
decfsz count, 1
goto wallback
movlw d'110'
movwf count
wallright call right
decfsz count, 1
goto wallright
return
;-- Move Forward
forward
bsf motor1
bsf motor2
movlw d'2'
call ms
bcf motor1
bcf motor2
movlw d'30'
call ms
return
;-- Move Backward
backward
bsf motor1
bsf motor2
movlw d'4'
call ms
bcf motor1
bcf motor2
movlw d'30'
call ms
return
;-- Turn to the right
right
bsf motor1
movlw d'2'
call ms
bcf motor1
bsf motor2
movlw d'4'
call ms
bcf motor2
movlw d'30'
call ms
return
;-- Turn to the left
left
bsf motor2
movlw d'2'
call ms
bcf motor2
bsf motor1
movlw d'4'
call ms
bcf motor1
movlw d'30'
call ms
return
;-- Letar efter hinder...
clearway
bsf INTCON, 7 ;Tillåter interupt
call send_ir
bcf INTCON, 7 ;Stäng av interupt
return
;-- Skickar ir modulerat i 38 khz
send_ir
bsf IRLED
call delay
bcf IRLED
call delay
return
;-- Väntar i ca 13 microsekunder (38khz)
delay movlw d'7'
movwf temp
dloop decfsz temp, 1
goto dloop
return
;-- 0,5 * w = millisek; w = 2 = 1 millisek; w = 40 = 20 millisek
ms movwf temp1
msloop decfsz temp1, 1
goto ms2
return
;-- 0.5 ms
ms2 movlw d'164' ;1 + 2 for call
movwf temp2 ;1
msloop2 decfsz temp2, 1 ;1 + 1 * X
goto msloop2 ;2 * X
goto msloop ;2
end
Postat: 1 juni 2003, 12:22:00
av Johan
Det skulle vara intressant att veta vilket språk det är gjort i.. Det kanske bara är jag som inte vet det men jag är nyfiken
Postat: 1 juni 2003, 12:25:33
av strombom
Ser ut som assembler =) För PIC16F84, som man ser högst upp i koden...
/Johan
Postat: 1 juni 2003, 12:39:52
av Johan
Tack så mycket... Det står faktiskt bara vilken pic det är. Inte vilket språk. Fast det kunde jag ju kommit på om jag tänkt lite längre.. Vet ju att man programerar pics med assembler egentligen..
Postat: 1 juni 2003, 14:18:06
av GeekJoan
Och så en liten förklaring.
Postat: 1 juni 2003, 18:00:28
av Johan
Måste koden vara såhär avancerad?? Kan ingen göra ett super enkelt exempel på hur en kodsnutt till en BS kan se ut om man typ bara vill ha en motor som är konstant på eller nåt annat simpelt..
Postat: 1 juni 2003, 18:32:53
av EagleSpirit
Johan skrev:Måste koden vara såhär avancerad?? Kan ingen göra ett super enkelt exempel på hur en kodsnutt till en BS kan se ut om man typ bara vill ha en motor som är konstant på eller nåt annat simpelt..
Då måste du ha en kompilator som kostar några tusen.
Postat: 1 juni 2003, 18:43:46
av netbear
BasicStamp har jag aldrig programerat men jag vet att det finns konexempel m.m. om du letar lite på
www.robotshop.nu.
Och för alla er som har gissat på att det är assembler har rätt... glömde vist skriva det.
Enkel förklaring.
Bra att veta:
om det står "call nånting" betyder det att den ska hoppa till kodstycket som heter nånting. Dessa "rubriker" är de som står i första kolumnen. På något sätlle finns säkert "goto nånting" detta betyder i stort sett samma sak men i detta fallet så hoppar den inte tillbaka till det stället när den hittar return (eller nått sånt).
Första delen av programet är lite defentitioner m.m. för att göra det hela enklare.
Det egentliga programet börjar med
org 0x00
goto start
org 0x00
talar jag om för kompilatorn att jag vill att mitt program ska börja på pos 0. Egentligen ett onödigt steg men jag gör så av nån anledning
sen hoppar programmet till start rutinen. Därifrån anropas init "funktionen" som helt enkelt ställer in ut och ingångar m.m.
Därefter startar själva huvudloopen som är så enkel som att helt enkelt kolla om det finns några hinder. Om inte fortsätt framåt.
Funktionerna forward, backward, right, left kör helt enkelt servona så att roboten förflyttar sig. Eftersom min robot drivs av två rcservon måste de ha en puls var 20ms på mellan 1 och 2 ms beroende på riktning och hastighet. Därför behöver jag anropa dessa ganska ofta.
Funktionen clearway som helt eneklt kollar om det finns några hinder framför roboten fungerar som följer. pic16f84 stöder lite olika interupts. (alltså avbrott i programet när något specielt ska utföras.) I detta fallet aktiveras först interupt på port rb0 där min irmottagare är kopplad. Därefter skickas en irpuls. Om det skulle vara så att irpulsen reflekteras mot något och träffar irmottagaren så kommer en interupt att ske. I interupptsekvensen som alltid pörjar på pos 4 i programmet (se de första raderna efter org 0x00 goto start) finns lite kod som gör att roboten backar svänger och sen återgår till huvudloopen. Det glömde jag. När den hittar ett hinder så tänder den lysdioden också.
Ja det var en kort beskrivning om vad koden gör.
/Björn
Postat: 1 juni 2003, 18:58:41
av Johan
Måste man ha en dyr kompilator för en BasicStamp?? Då blir det ju jättedyrt att bygga en robot...
Postat: 1 juni 2003, 19:18:41
av EagleSpirit
Johan skrev:Måste man ha en dyr kompilator för en BasicStamp?? Då blir det ju jättedyrt att bygga en robot...
grejen med BasicStamp är att det sitter en kompilator i kretsen. Det är därför den kostar så mycket. Programmen man behöver är gratis och själva programmeraren sitter redan i kretsen. Det är bara att koppla den till COM porten i princip.
Kod på min lysdiodsnurra kanske kommer upp här
Postat: 1 juni 2003, 19:22:44
av Johan
Aha ok..
Postat: 1 juni 2003, 19:30:41
av EagleSpirit
netbear skrev:Här är koden till min lilla robot. Den är säker mycket klantigt skriven men den fungerar. Roboten kör omkring och navigerar med hjälp av en irdiod och en avstämd irmottagare. Formateringen av koden blev som den blev
Koden är för en pic16f84 eller möjligen pic16c84
Kod: Markera allt
;-- Skrivet av Björn Samvik <bjorn@samvik.com>
;-- http://www.net-bear.com
LIST P=16F84
INCLUDE "p16f84.inc"
__CONFIG _CP_OFF & _PWRTE_OFF & _XT_OSC & _WDT_OFF
;-- Define Information -------------------------
#define Motor1 portA, 2 ;Servo1
#define Motor2 portA, 3 ;Servo2
#define IRLed portA, 0 ;IR Diod
#define IRMot portB, 0 ;IR Mottagare
#define Led portA, 1 ;LED
;-- Variabler
CBLOCK 0x0C
temp
temp1
temp2
count
ENDC
hmm, jag visste inte att man kunde skriva #define. Kompilerar du i MPLab lr något annat program?
Jag brukar skriva t.ex:
alltså ger man register 18 ett enklare namn. När man skriver "irdiod" i programmet så menar man egentligen register 18.
Postat: 1 juni 2003, 19:43:05
av netbear
Jag kör med gpasm. (kör linux) Men jag tror att det funkar i mplab också...
/Björn
Postat: 1 juni 2003, 19:48:06
av Melker
Är inte #define för att definera konstanter och EQU för att definera register då?
I AVR-studio så är det ungefär så ialla fall, fast tvärtom. .def skriver man för register och .equ för konstanter.