Programera roboten
Programera roboten
Ä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.
Bara nått enkelt eftersom det är en del som undrar.
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
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
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
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
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
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
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.Johan skrev:Måste man ha en dyr kompilator för en BasicStamp?? Då blir det ju jättedyrt att bygga en robot...
Kod på min lysdiodsnurra kanske kommer upp här
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
hmm, jag visste inte att man kunde skriva #define. Kompilerar du i MPLab lr något annat program?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
Jag brukar skriva t.ex:
Kod: Markera allt
irdiod EQU 0x18