Enklare kodexempel på pic basic??
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Okej, med analog/digital omvandlare läser man av det direkt eller? Det tar mao inte tid o mäta...?
Kan du rekomendera nån sådan krets? Som helst ska gå o programera med JDM programerare eller nån annan enkel programerare man kan bygga själv...
Hur är det med den PIC16F877A som finns på kjell & co....?
Den verkar ju ha mssa skoj...
Men går det att programera med JDM?
Kan du rekomendera nån sådan krets? Som helst ska gå o programera med JDM programerare eller nån annan enkel programerare man kan bygga själv...
Hur är det med den PIC16F877A som finns på kjell & co....?
Den verkar ju ha mssa skoj...
Kod: Markera allt
A/D
Typ EPROM RAM EEPROM I/O kanaler PWM Timer
PIC16F877 8K×14 368×8 256×8 33 5 2 3+WDT
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Hmm, kom på att jag råkar fylla år på onsdag, kan ju önska mig en vettig programerare då.
Vad tror ni om denna?
http://www.kjell.com/content/templates/ ... 00,7445000
Eller har ni nån annan bra att rekomendera?
Vad tror ni om denna?
http://www.kjell.com/content/templates/ ... 00,7445000
Eller har ni nån annan bra att rekomendera?
i flera pic-modeller finns det inbyggda A/D konverterare, men det tar alltid lite tid att omvandla om man inte har Flash A/D konverterare men de kostar multum.
Men de som finns i pic:en är med all sannolikhet mycket snabbare än pot kommandot, och så finns det inbyggda kommando i picbasic för att använda dessa.
Men de som finns i pic:en är med all sannolikhet mycket snabbare än pot kommandot, och så finns det inbyggda kommando i picbasic för att använda dessa.
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
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
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
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Lyfter tråden igen efter nästan ett halvår, picprogramerandet rann ut i sanden för mig eftersom jag inte hade nått vettigt o göra, nu har jag fått ur tummen o börjat igen, har tre projekt pågång, mc larm, väckarklocka och ledsnurra, så nu har jag nått o göra, men, minnet är inte toppen så lite uppfriskning av minnet när det gäller programering krävs.
Håller på o bygger ett rinnande ljus / knightrider med 8 st lysdioder, ska såsmåningom va svans med... men nu vill det inte funka riktigt, kompilera går bra, men sen när jag kopplar upp det o kör igång är det mest dött...
Här är koden
Vad som skulle tänkas kunna va fel är ju led-arrayen, kan man göra så som jag gjort? Hur gör man bäst annars?
Håller på o bygger ett rinnande ljus / knightrider med 8 st lysdioder, ska såsmåningom va svans med... men nu vill det inte funka riktigt, kompilera går bra, men sen när jag kopplar upp det o kör igång är det mest dött...
Här är koden
Kod: Markera allt
define osc 4
trisb = 0
tmp var byte
svans var byte
led var byte[8]
led(0) = portb.0
led(1) = portb.1
led(2) = portb.2
led(3) = portb.3
led(4) = portb.4
led(5) = portb.5
led(6) = portb.6
led(7) = portb.7
portb = 0
svans = 3
loop:
For tmp = 0 to 7 step 1
led(tmp) = 1
pause 200
led(tmp) = 0
next tmp
For tmp = 7 to 0 step -1
led(tmp) = 1
pause 200
led(tmp) = 0
next tmp
goto loop
end
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Smart tänkt! Så borde det ju bli, såklart.
Nu är bara frågan hur man kommer runt problemet...? Funkar det att skriva led(0) var portb.0...?
Nope, det gör det inte, "variable already an alias"...
Jag kanske har tänkt helt fel? Måste man gör på nått helt annat sätt eller är det bara jag som gjort nått mindre fel som går o rätta till...?
Nu är bara frågan hur man kommer runt problemet...? Funkar det att skriva led(0) var portb.0...?
Nope, det gör det inte, "variable already an alias"...
Jag kanske har tänkt helt fel? Måste man gör på nått helt annat sätt eller är det bara jag som gjort nått mindre fel som går o rätta till...?
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Det stora problemet med din "knightrider" är att den är sååå mycket enklare att fixa i assembler... 
> vad innebär bit-shifta?
Du ser !
Om du hade kört lite assembler först så hade det varit självklart...
Kolla upp RRF och RLF instruktionerna i databladet. De är "bit-rotates",
men principen är densamma...

> vad innebär bit-shifta?
Du ser !

Om du hade kört lite assembler först så hade det varit självklart...
Kolla upp RRF och RLF instruktionerna i databladet. De är "bit-rotates",
men principen är densamma...
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
verkar alltså inte som det går o lösa det helsa som jag ville, får väll fundera ut nått nytt...
Problemet är att jag vill kunna ha flera lysdioder tända sammtidigt i en array, skulle bara en va tänd åt gången vorde det inga problem, se första sidan...
Sodjan, du har inte lust o slänga ihop en liten exempelkod på rinnande ljus skrivet i assambler? Så man får en känsla för hur assambler ser ut...
Vet du nån bra hemsida där man kan läsa om och lära sig assambler?
Problemet är att jag vill kunna ha flera lysdioder tända sammtidigt i en array, skulle bara en va tänd åt gången vorde det inga problem, se första sidan...
Sodjan, du har inte lust o slänga ihop en liten exempelkod på rinnande ljus skrivet i assambler? Så man får en känsla för hur assambler ser ut...
Vet du nån bra hemsida där man kan läsa om och lära sig assambler?
App app! Inte ge upp. ;P
Testa det här då:
Annars är ju faktiskt assembler ett bra sätt att lära känna hårdvaran också.
Jag föredrar C med Inline assembler för större projekt. Har man koll på sin kompilator behöver det inte skilja mycket mellan ASM och C.
Mvh
speakman
Testa det här då:
Kod: Markera allt
define osc 4
tmp var byte
trisb = 0
portb = 0
loop:
For tmp = 0 to 7 step 1
portb = 2^tmp
pause 200
next tmp
For tmp = 7 to 0 step -1
portb = 2^tmp
pause 200
next tmp
goto loop
end
Jag föredrar C med Inline assembler för större projekt. Har man koll på sin kompilator behöver det inte skilja mycket mellan ASM och C.
Mvh
speakman