Enklare kodexempel på pic basic??

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
danei
EF Sponsor
Inlägg: 27426
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Jag skulle gissa på att det finns något komando för det. Men det kan inte jag. Men vad man alltid kan göra är en lop som tänder och släcker dioden om vartannnat. Dvs. blinka tex 100gåner per sekund.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

2) (Pseduokod översätt till basic själv)

' Tänd en lysdiod med halv styrka i 1 sekund
' 250 varv * (2 + 2 mS) = 1000 mS = 1 sekund
Loopa 250 varv
Tänd lysdiod
Vänta 2 mS
Släck lysdiod
Vänta 2 mS
Slutloop
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

1A) Gör en reaktionstidstestare

Använd 1 knapp och åtta lysdioder

*Börja med att släcka alla lysdioder
*Vänta i en slumpvald tid mellan 3 och 10 sekunder (det finns säkert nån randdom-funktion i basicen)
*Tänd lysdioderna en efter en med lagom tid emellan dom. Kanske 100 mS är lagom.
*Kolla efter varje tändning om knappen är nedtryckt och frys värdet i 3 sekunder innan programmet börjar om igen.
*Kolla också om knappen är nedtryckt direkt efter den slumpvalda fördröjningen. Är den det är är det en tjuvstart och programmet börjar om på en gång.


1B) Gör ett Pong-spel

Använd två knappar och åtta (eller fler lysdioder)

*Låt lysdioden vandra åt höger med en viss hastighet.
*Om högra knappen trycks ner INNAN den sista lysdioden är tänd så sätt lysdioden till den första igen
*Om högra knappen trycks ner när den sista lysdioden är tänd så börjar lysdioden att gå åt andra hållet och det är vänsters tur att tycka på knappen på motsvarande sätt.
* Varje gång lysdioden har vänder rikning så minska på variabeln som håller reda på hastigheten lite så att det går snabbare och snabbare vid varje studs.
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 »

Tack så väldigt mycket matseng!! :D
Första koden du skrev funkade kanon!

De andra två spelen du skrev om ska jag helt klart testa! verkar roliga! Bra och lärorik utmaning med...


Nu har jag gjort en 2-mode ljuseffekt mojäng, först är det knightrider, trycker man på en knapp blir det rinnande ljus iställe, har dock lite småproblem kvar att lösa, och koden känns inte ens det minsta optimerad.... :lol:


Kodade ihop ett reaktionstest som matseng beskrev, funkade kanon! kom ner på 200 ms som snabbast :shock:
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 »

Nu har jag försökt göra en blinkande lysdiod, där lystiden ställs in med hjälp av en tryckknapp, tanken är att lysdioden ska vara tänd lika länge i varje blink som man höll in knappen senaste gången.

Men det funkar inte, det blinkar, men när jag trycker på knappen så blir det lite slumpmässigt....?

Kod: Markera allt

DEFINE OSC 4
TRISB.0 = 0
TRISB.4 = 1
TRISA = 0
tid VAR BYTE

PORTA.0 = 0
PORTA.1 = 1

tatid:
IF PORTB.4 = 1 Then
	tid = 0
	RCTime PORTB.4,1,tid
EndIF

loop2:
	IF PORTB.4 = 1 Then
		GoTo tatid
	EndIF
	
	PORTB.0 = 1
	Pause tid
	PORTB.0 = 0
	Pause 500
GoTo loop2

End
Sen tänkte jag som nästa projekt att driva en 7 segments LED-display, finns det nån färdig funktion för det? man kunde ju tex skriva ut binärt på några lysdioder osv...

Eller får man göra själv? kan man deginera en etta på displayern såhär?
led1 VAR portab.0 = 0,portb.1 = 1,portb.2 = 1
osv...?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

RCTime kan som mest räkna 2,56 ms långa perioder med en byte som variabel i 4 MHz. Byt till en word så kommer du upp i drygt 0,655 s som maxtid iaf...

Sen bör du kanske inte kolla om knappen är nedtryckt direkt efter att du mätt tiden på knapptryckningen, om du skulle hålla den nere längre än maxtiden.

Det finns inga färdiga kommando för segmentdisplayer vad jag vet. Men det är ju busenekelt att fixa själv (kankse just därför?). Eftersom det är just sju segment blir det utmärkt att spara en siffras grafik i en byte (8 bit), där varje bit (utom en) motsvarar ett segment. Om du dessutom har segmentet kopplat till en enda port så kan du sen bara slänga ut denna byte direkt till porten!
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 »

Tack för snabb och bra hjälp!


Typ såhär menar du...? Nått är fortfrande fel, antingen blinkar den superkort eller så hänger sig lyset...
EDIT: har testat både med och utan konding på2,2 uf över knappen, ingen skilnlad... kan ju testa med större konding men lyset borde ju ändå inte kunna hänga sig för att knappen studsar

Kod: Markera allt

DEFINE OSC 4
TRISB.0 = 0
TRISB.4 = 1
TRISA = 0
tid VAR WORD

PORTA.0 = 0
PORTA.1 = 1

tid = 5

tatid:
IF PORTB.4 = 1 Then
	tid = 0
	RCTime PORTB.4,1,tid
EndIF

overtid:
IF PORTB.4 = 1 Then
	PORTB.0 = 1
	Pause 100
	GoTo overtid
EndIF

loop2:
	IF PORTB.4 = 1 Then
		GoTo tatid
	EndIF
	
	PORTB.0 = 1
	Pause (tid * 10)
	PORTB.0 = 0
	Pause 500
GoTo loop2

End
7-segments får bli när jag kommer hem från jobbet, börjar 2, slutar 6...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

varför
PORTA.0 = 0
PORTA.1 = 1
?

Jag tycker det är dax att du ska börja döpa din a I/O istället för att kör med det något förvirrance PORTX.Y.
Hur har du kopplat? ASCII-pinout! :)
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 »

För att jag inte orkar koppla om, hehe, när jag gjorde knightridern hade jag ju två grupper som hade dom utgångarna för att styra vilken grupp som ska va tänd, istället för o sitta o koppla om hela tiden när man testar sig fram anpassar jag koden efter hur det är uppkopplat :shock:

Döpa dom? hur då menar du?
Typ
led1 VAR portb.0
grupp1 VAR porta.0
osv?


Nu är jag iaf hemma efter en hård dag på jobbet (och skolan, går i ettan...)
Så nu ska jag väll slänga i mig lite mat så får vi se om jag börjar pilla o försöker få till nån kod till att driva 7-segments display.
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 »

håller på med en lysdiod som ska tändas sakta, sen släckas sakta,... Såhär ser koden ut

EDIT: portb.1 tänder jag bara för att ha en referens till hur mkt portb.0 lyser...

Kod: Markera allt

DEFINE OSC 4
tmp VAR BYTE
tid VAR BYTE
TRISB = 0
PORTB.1 = 1

loop:
	For tid = 0 TO 1000 STEP 2
		For tmp = 0 TO 20
			PORTB.0 = 1
			PauseUs (tid)
			PORTB.0 = 0
			PauseUs (1000 - tid)
		Next tmp
	Next tid
	
	PORTB.0 = 1
	Pause 250
	
	For tid = 1000 TO 0 STEP -2
		For tmp = 0 TO 20
			PORTB.0 = 1
			PauseUs (tid)
			PORTB.0 = 0
			PauseUs (1000 - tid)
		Next tmp
	Next tid
	
	Pause 250
	
GoTo loop
Det funkar, nästan, som ni ser vill jag att den ska stanna släkt och även stanna tänd 250ms.... men när den fade'at ner till lägsta, så blir det ett hopp mellan det och släkt, likadant när den ska gå från max upp-fade'ad till helt tänd, varför? Hur kommer man runt problemet? Och hur sjutton räknar man ut hur lång tid det kommer ta för den att tändas?? skulle väll tippa på att det tar nånstans mellan 250 och 500 ms nu....

Kan man göra hela grejjen på nått smidigare sätt kanske?
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Kod: Markera allt

  For tid = 0 TO 1000 STEP 2 
      For tmp = 0 TO 20 
         PORTB.0 = 1 
         PauseUs (tid) 
         PORTB.0 = 0 
         PauseUs (1000 - tid) 
      Next tmp 
   Next tid 
Varje innervarv i loopen tar ju tid+1000-tid uS = 1000 uS dvs 1mS

Tmp-loopen kör 21 varv så det blir totalt 21 mS där. Sedan så upprepas dessa 21 mS 500 ggr i tid-loopen = så det borde bli 10.5 sekunder.

Så om det tar mellan 250 och 500 mS så har antingen du mätt fel, jag räknat fel, eller så är PauseUs fullständigt åtskogen galen.
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 »

Har med fått det till 10 sek ungefär, men det är helt åt skogen, så dåligt ögonmått har jag inte, det är MAX en sekund iaf.... svårt o säga...

Ingen som vet nått annat sätt man kan åstakomma vad jag försökt med? Känns som mitt sätt inte är det bästa...

Kan "hacket" ha nått med att göra att en 4 mhz pic bara klarar 20 mikrosekunder som minst? stog nått om det på http://microengineeringlabs.com/resources/pbpmanual/ , vet dock inte om jag fattade riktigt rätt, det stog under PauseUs...
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, läste lite om PWM och knåpade ihop denna kod:

Kod: Markera allt

DEFINE OSC 4
TRISB = 0
PORTB.1 = 1

loop:
	PWM PORTB.0,127,100
	PORTB.0 = 1
	Pause 500
GoTo loop
Men det funkar inget vidare, lysdioden bara blinkar på/av...



YEAH-HAAA
Lyckan är total!! :D
Lyckades, vad som va problemet med den förra koden jag skrev, den utan PWM, va att tid va definerad som byte, inte som word, vilket krävs iom att det blir stort tal.... Så nu la jag ihop det med 7-segments räknare!!
Stort tack till mullemeck som hjälpte mig med 7-segments räknaren för det första, här kommer koden om nån är intresserad...

EDIT: Vad som händer är alltså att först tänds siffra ett sakta, släks sedan sakta ner och sen tänd siffra 2 sakta, osv osv...

Kod: Markera allt

DEFINE OSC 4
TRISB = 0
tmpa VAR BYTE
tmpb VAR BYTE
tid VAR WORD
siffra VAR BYTE[10]

siffra(0) = %00111111
siffra(1) = %00000110
siffra(2) = %01011011
siffra(3) = %01001111
siffra(4) = %01100110
siffra(5) = %01101101
siffra(6) = %01111101
siffra(7) = %00000111
siffra(8) = %01111111
siffra(9) = %01100111

loop:
	For tmpa = 0 TO 9
		
		For tid = 0 TO 1000 STEP 4
			For tmpb = 0 TO 5
				PORTB = siffra(tmpa)
				PauseUs (tid)
				PORTB = 0
				PauseUs (1000 - tid)
			Next tmpb
		Next tid			
		
		PORTB = siffra(tmpa)
		Pause 250
		
		For tid = 1000 TO 0 STEP -4
			For tmpb = 0 TO 5
				PORTB = siffra(tmpa)
				PauseUs (tid)
				PORTB = 0
				PauseUs (1000 - tid)
			Next tmpb
		Next tid		
		
	Next tmpa

GoTo loop

End
evert2
Inlägg: 2182
Blev medlem: 18 april 2004, 22:47:56
Ort: Jönköping

Inlägg av evert2 »

Grattis, det går ju fraamåt :tumupp:
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 »

Kan man lungt säga :shock: Känns inte som det va längesedan man satt och va överlycklig över att kunna få en lysdiod o blinka så fort man ville... :lol: Stort tack till er, utan er hade jag förmodligen fortfarande suttit här med min blinkande lysdiod :roll:

Finns det nått användbart inom picbasic som jag missat och kanske borde lära mig...? Har hört talas om både interupts och PWM, nån som har lust att förklara vad det används till....?

Nu är det väll två olika mål som ligger närmast, dels att göra knightrider med svans, och kunna styra 2 st 7 segments LED displayer...
Skriv svar