Programera roboten

Robot, CNC, Pneumatik, Hydraulik, mm
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10672
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Programera roboten

Inlägg 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.
netbear
Inlägg: 116
Blev medlem: 27 maj 2003, 21:52:29
Ort: Karlskrona
Kontakt:

Inlägg 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

Johan
Inlägg: 151
Blev medlem: 28 maj 2003, 19:22:03
Ort: Kåhög, Göteborg
Kontakt:

Inlägg 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 :)
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Ser ut som assembler =) För PIC16F84, som man ser högst upp i koden...

/Johan
Johan
Inlägg: 151
Blev medlem: 28 maj 2003, 19:22:03
Ort: Kåhög, Göteborg
Kontakt:

Inlägg 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..
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10672
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Inlägg av GeekJoan »

Och så en liten förklaring.
Johan
Inlägg: 151
Blev medlem: 28 maj 2003, 19:22:03
Ort: Kåhög, Göteborg
Kontakt:

Inlägg 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..
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg 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.
netbear
Inlägg: 116
Blev medlem: 27 maj 2003, 21:52:29
Ort: Karlskrona
Kontakt:

Inlägg 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
Johan
Inlägg: 151
Blev medlem: 28 maj 2003, 19:22:03
Ort: Kåhög, Göteborg
Kontakt:

Inlägg av Johan »

Måste man ha en dyr kompilator för en BasicStamp?? Då blir det ju jättedyrt att bygga en robot...
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg 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
Johan
Inlägg: 151
Blev medlem: 28 maj 2003, 19:22:03
Ort: Kåhög, Göteborg
Kontakt:

Inlägg av Johan »

Aha ok..
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg 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:

Kod: Markera allt

irdiod      EQU         0x18
alltså ger man register 18 ett enklare namn. När man skriver "irdiod" i programmet så menar man egentligen register 18.
netbear
Inlägg: 116
Blev medlem: 27 maj 2003, 21:52:29
Ort: Karlskrona
Kontakt:

Inlägg av netbear »

Jag kör med gpasm. (kör linux) Men jag tror att det funkar i mplab också...

/Björn
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg 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.
Skriv svar