Enklare kodexempel på pic basic??
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
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ä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.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Tack så väldigt mycket matseng!!
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....
Kodade ihop ett reaktionstest som matseng beskrev, funkade kanon! kom ner på 200 ms som snabbast

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

Kodade ihop ett reaktionstest som matseng beskrev, funkade kanon! kom ner på 200 ms som snabbast

- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
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....?
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...?
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
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...?
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!
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!
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
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
7-segments får bli när jag kommer hem från jobbet, börjar 2, slutar 6...
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
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
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
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.

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.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
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...
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?
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
Kan man göra hela grejjen på nått smidigare sätt kanske?
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
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
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.
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
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...
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...
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Hmm, läste lite om PWM och knåpade ihop denna kod:
Men det funkar inget vidare, lysdioden bara blinkar på/av...
YEAH-HAAA
Lyckan är total!!
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
PORTB.1 = 1
loop:
PWM PORTB.0,127,100
PORTB.0 = 1
Pause 500
GoTo loop
YEAH-HAAA
Lyckan är total!!

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
- NSR_Martin
- Inlägg: 358
- Blev medlem: 30 november 2003, 13:37:31
- Ort: Jönköping
- Kontakt:
Kan man lungt säga
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...
Stort tack till er, utan er hade jag förmodligen fortfarande suttit här med min blinkande lysdiod
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...



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