Enklare kodexempel på pic basic??

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

sätt trisB.3 till 0 kanske?
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

Tackar, där hade vi felet! Klantigt av mig.

Det tar lite tid o läsa av värdet på poten, kan man snabba upp avläsningshatigheten...? Tex genom att ha mindre konding eller så? Nu har ag en 0,47 uF konding och poten är på 47K ohm...
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg av mullemeck »

ja det borde gå att ha mindre kondensator, men då får man samtidigt ha större motstånd.

en annan tanke kan vara att gå över till en pic med inbyggd A/D omvandlare.
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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...

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
Men går det att programera med JDM?
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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?
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg av mullemeck »

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.
Användarvisningsbild
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:

Inlägg av bengt-re »

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
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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

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
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?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Fylls inte din array med värdet på varje pinne, istället för adressen dit?

Mvh
speakman
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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...?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Jag är totalt okunnig i PIC Basic. Tänkte bara lite logiskt. :)
Gissningsvis får du nog skriva portb.0 = 1 helt enkelt.
Men bäst hade nog varit att bit-shifta hela portb istället. Men hur det går till i Basic har jag inte den blekaste om.

Mvh
speakman
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

vad innebär bit-shifta?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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...
Användarvisningsbild
NSR_Martin
Inlägg: 358
Blev medlem: 30 november 2003, 13:37:31
Ort: Jönköping
Kontakt:

Inlägg av NSR_Martin »

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?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

App app! Inte ge upp. ;P
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
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
Skriv svar