Håller med - jag vet att det är som att svära i kyrkan, men någon högnivåtolk och lösa picar är ett billigare och bättre val samt ger dig friheten att flytta din kod mellan olika kretsar beroende på vilka krav du har för dina projekt.
Basic Micro har en skaplig basictok som är rätt kraftfull om man behöver komma igång snabbt. Du kan ju se ett exempel på robbotprogram skrivet i den koden om du vill få en överblick:
CPU = 16F876
MHZ = 20
CONFIG 16250
; För Pic16f876, robotprogram för robot med ultraljudsmätare och tvåradig
lcd-display
; Fjärrkontroll Sony-tv fjärr.
; Tvåradig LCD-kopplad på port B
; Servon utan stopplägen på A0 och A1
; IR-mottagarmodul för 38kHz på C5
; SRF04 ultraljudsmodul på C6 och C7
; Av Bengt Rehnström,
rov@chello.se
trisc=$FF ;port C ingångar för ir-sensor och SRF04
trisa=%00111100 ;A0 och A1 utgångar
trisb=$00 ;port B utgångar för LCD
AN2 con 2 ;AN2
clk con 2 ;Hastigheten för A/D-omvandlaren 1/16 clk
adsetup con %10000000 ;port a analog
dsetup con %10000110 ;port a digital
volt var word ;Matningsspänningen
i var byte ;räknare
i1 var byte ;räknare
i2 var byte ;räknare
i3 var nib ;räknare
temp var word
time var word(12) ;tiden för pulserna vid ir-mottagning
test var word
index var nib
kod var word ;Fjärrkontrollkoden
kod2 var byte
mellan var bit(12) ;Mellanlargrar resultatet vid ir-mottagning
range var word ;avstånd ifrån SRF04
leta var word
letalåg var word
letai var byte
prog var byte(11) ;programet för minneskörning
low a0
low a1
low a2
lcdwrite b7\b5\b6,portb.nib0,[initlcd1,initlcd2,twoline,clear,home,scr]
pause 100
lcdwrite b7\b5\b6,portb.nib0,["Sonarbot"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["By:
rov@chello.se"]
pause 1500
main
adin an2,clk,adsetup,volt ; Läser in matningsspänningen
adcon1=dsetup ; Kopplar tillbaka till digitalmode
volt=volt/5 ;omvandlar spänningen till decivolt
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Stand still...."]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Kraft:",dec volt,"dV"]
repeat
pulsin c5,0,test
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
pulsin c5,0,time(8)
pulsin c5,0,time(9)
pulsin c5,0,time(10)
pulsin c5,0,time(11)
kod=0 ;avkodar pulslängden till ettor och nollor
for i =0 to 11
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then main
next
kod.bit0=mellan(0) ;sätter de åtta lsb av koden till variabeln kod
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
if kod=129 then gosub fram ;2
if kod=135 then gosub back ;8
if kod=133 then gosub höger ;6
if kod=131 then gosub vänster ;4
if kod=130 then gosub mjukhöger ;3
if kod=128 then gosub mjukvänster ;1
if kod=132 then goto sonar ;5
if kod=139 then goto race ;Enter
if kod=227 then goto öppen ;Exit
if kod=134 then gosub backvänster ;7
if kod=136 then gosub backhöger ;9
if kod=137 then gosub wee ;0
if kod=149 then goto program ;Power
if kod=144 then goto prog3 ;ch+
goto main
program ;Power på fjärren, låter dig programera 10 rörelser
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Programeringmode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg 1"]
i2=1
prog1
repeat
pulsin c5,0,test
until test>2100
pulsin c5,0,time(0) ;läser in de elva bitarna i RC5-koden
pulsin c5,0,time(1)
pulsin c5,0,time(2)
pulsin c5,0,time(3)
pulsin c5,0,time(4)
pulsin c5,0,time(5)
pulsin c5,0,time(6)
pulsin c5,0,time(7)
pulsin c5,0,time(8)
pulsin c5,0,time(9)
pulsin c5,0,time(10)
pulsin c5,0,time(11)
kod=0
for i =0 to 11
if time(i)>550 and time(i)<750 then
mellan(i)=0
else
mellan(i)=1
endif
if time(i)<550 or time(i)>1500 then prog1
next
kod.bit0=mellan(0)
kod.bit1=mellan(1)
kod.bit2=mellan(2)
kod.bit3=mellan(3)
kod.bit4=mellan(4)
kod.bit5=mellan(5)
kod.bit6=mellan(6)
kod.bit7=mellan(7)
prog(i2)=kod
;gosub wee ; Roboten hoppar till för att visa att programeringen "tagit"
pause 100 ; Väntar så att man inte dubbeltrycker kommandon
i2=i2+1
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Programeringmode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg:",dec (i2-1),"/10"]
if i2>9 then goto prog3
goto prog1
prog3
for i2=1 to 10
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Utfor program"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Progsteg:",dec i2,"/10"]
for i1=1 to 5
if prog(i2)=129 then gosub fram ;2 på fjärren
if prog(i2)=135 then gosub back ;8 på fjärren
if prog(i2)=133 then gosub höger ;6 på fjärren
if prog(i2)=131 then gosub vänster ;4 på fjärren
if prog(i2)=130 then gosub mjukhöger ;3 på fjärren
if prog(i2)=128 then gosub mjukvänster ;1 på fjärren
if prog(i2)=134 then gosub backvänster ;7 på fjärren
if prog(i2)=136 then gosub backhöger ;9 på fjärren
if prog(i2)=137 then gosub wee ;0 på fjärren
next
next
goto main
race ;ENTER på fjärren
pulsout c6,20
pulsin c7,1,range
range=range/60 ;Ger avståndet i cm
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Racemode"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range,"cm"]
pause 6
if range<30 then
gosub back
gosub vänster
gosub vänster
gosub vänster
gosub vänster
gosub vänster
gosub back
gosub vänster
gosub vänster
gosub fram
gosub mjukvänster
gosub mjukvänster
gosub fram
gosub mjukvänster
endif
if range<35 then gosub vänster
if range<100 and range>90 then gosub mjukvänster
if range<120 and range>110 then gosub mjukhöger
gosub fram
gosub fram
pause 20
pulsin c5,0,test
if test>2100 and test<3000 then goto main
goto race
öppen ; EXIT på fjärren, letar efter öppna ytor
range=100
leta=0
letai=0
for i2=1 to 17
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Rundletar:",dec range]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["steg:",dec i2,"/17"]
pulsout c6,20 ; trigga SRF04
pulsin c7,1,range ; Läsa avståndet
pause 7
gosub höger
range=range/60
if range>leta then
leta=range
letai=i2
endif
if range>250 then goto öppen2
if range<20 then ;back om varvet inte är fritt
gosub back
gosub back
endif
next
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Snurra tillbaka"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,[dec (17-letai)," steg"]
for i2=1 to (17-letai) ; snurra tillbaka till det stället där avståndet var
störst
gosub vänster
pulsin c5,0,test
if test>2100 and test<3000 then goto main
next
öppen2
repeat
gosub fram
pulsout c6,20
pulsin c7,1,range
range=range/60
pause 10
pulsin c5,0,test
if test>2100 and test<3000 then goto main
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Lallar fram"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Range:",dec range,"cm"]
until range<35
pulsin c5,0,test
if test>2100 and test<3000 then goto main
goto öppen
sonar ; 5 an på fjärren
pulsout c6,20 ; Triggar SRF04
pulsin c7,1,range ; Läser in avståndet
range=range/60 ; Omvandlar avståndet till cm
pause 17
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Letar mig runt"]
lcdwrite b7\b5\b6,portb.nib0,[scrram+$40]
lcdwrite b7\b5\b6,portb.nib0,["Avstand:",dec range,"cm"]
if range<10 then
gosub back
gosub back
gosub backvänster
gosub vänster
endif
if range<15 and range>9 then gosub backvänster
if range<20 and range>14 then gosub vänster
if range<30 and range>19 then gosub fram
if range<50 and range>29 then gosub mjukvänster
if range<60 and range>49 then gosub fram
if range<70 and range>59 then gosub mjukhöger
if range>69 then gosub fram
if range>150 and range<160 then gosub mjukvänster
pause 30
pulsin c5,0,test
if test>2100 and test<3000 then ; återvända till main om någon knapp trycks
in på fjärren
goto main
endif
goto sonar
;---RÖRELSESUBRUTINER---
;-----------------------
wee ; 0 an på fjärren, får robboten att hoppa till lite
lcdwrite b7\b5\b6,portb.nib0,[clear,home,scr]
lcdwrite b7\b5\b6,portb.nib0,["Hoppsan !"]
pause 6
for i=1 to 5
pulsout a0,2000
pause 5
pulsout a1,1000
pause 5
next
for i=1 to 5
pulsout a0,1000
pause 5
pulsout a1,2000
pause 5
next
return
stanna ; Stå still bara
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,1515
pause 6
next
return
back ; kör rakt bakåt
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,2000
pause 6
next
return
fram ; Kör framåt
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1000
pause 6
next
return
vänster ; sväng vänster med "saxade" motorer
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,1000
pause 6
next
return
höger ; sväng höger med "saxade" motorer
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,2000
pause 6
next
return
mjukhöger ; sväng höger med en stoppad motor
for i=1 to 10
pulsout a0,2000
pause 6
pulsout a1,1515
pause 6
next
return
mjukvänster ; sväng vänster med en stoppad motor
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,1000
pause 6
next
return
backvänster ; backa vänster med en stoppad motor
for i=1 to 10
pulsout a0,1000
pause 6
pulsout a1,1515
pause 6
next
return
backhöger ; backa höger med en stoppad motor
for i=1 to 10
pulsout a0,1515
pause 6
pulsout a1,2000
pause 6
next
return
End