Enklare kodexempel på pic basic??

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 »

danei skrev:Nackdelen med en FET är väl priset.

Räkna lite på resistor så blir det bra. basströmen*Hf ska vara stärre än kolektorströmen.
Nu slog det slint eller nått, står helt still, hehe
kolektorströmmen får jag alltså räkna ut...? Jag mätte hela skiten jag har uppkopplad, en 84a o en 7 segments display, har 800 ohm motstånd vilket är rätt högt, när jag mätte drog den bara runt 4 mA... Blinkar dock fifty fifty som max då den tonar upp o ner, men det kommer ju aldrig överstiga 50mA, så det är väll bara säga att kolektorströmmen är 50mA...? Men vad är Hf?? Och när jag vet det, så kan jag ju inte räkna ut med nått spänningsfall som med lysdioder, hur gör jag då...?

Känner mig som en total nybörjare, hehe, gillar inte transistorer av nån anledning så har inte blivit av att jag lärt mi det så bra... Men det fick man igen nu! :shock:
danei
EF Sponsor
Inlägg: 27424
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

bas-emitter spänningen ligger på ca 0,7V
Hfe är transistorns förstärkning. Den hittar du i databladet.
Sen räknar du på samma sätt som med en diod.
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 »

Måste tyvärr fråga vidare, då det står Min hfe = 100, typical står det inget på, och max är 600...?
danei
EF Sponsor
Inlägg: 27424
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

räkna på min så är du säker
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 »

spänningsfallet blir alltså 4,3 volt
säg 100 mA för enkelhetens skull, den klarar ju det ändå, då blir det alltså 100mA/100 i Hfe = 1 mA i basström.

motståndet = spänningen / strömmen 4,3/0,001 = 4300, 4,3 kohm, låter det rimligt...?

Varför står det max o min på Hfe, är det för att transistorer är så oexakta från tillverkningen...?
evert2
Inlägg: 2182
Blev medlem: 18 april 2004, 22:47:56
Ort: Jönköping

Inlägg av evert2 »

japp...me´n ibland så finns det en "undersortering" av transistortyper..låt säga BC547....den finns variant A,B,C.....A har lägst förstärkning sen B och C har högst förstärkning (om det nu inte finns i variant D också :roll: ). Då kan spridningen vara t ex BC547A, hfe(min)=100, hfe(max)=300

För BC547B, hfe(min)=250, hfe(max)=450........Hänger du med?

Så om du nu tittar i ett datablad för HELA serien med både A,b och c-varianten så blir spridningen på hfe-värden stor. Då är det bra att kolla upp vilken variant man själv använder.... :)
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

hfe'n varierar också ganska kraftigt med både kollektorströmmen och med temperaturen. En halvering / fördubbling av hFE-värdet är ingen omöjlighet om man har trissan -50 respektive + 100 grader varm. Samma sak med kollektorströmmen, en vanlig småsignaltrissa burkar oftast peaka nånstans vid 10mA-trakten. Går man ner till bara ett par uA så kan hFE'n vara halverad.
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 »

Evert, okidoki, tyckte det lät lite konstigt med men nu förstår jag!
Matseng: inte mkt att tillägga, men tack för infon....

Sitter och käkar, ska kolla lite på det sen, tänkte testa sound-funktionen först...
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 »

Soundfunktionen va tuff! Får nog göra något mer avancerat med den senare, vad betyder "white tones"...?

Nu har jag iaf kopplat upp allt till att köra emd två displayer på labbplattan, men har kört fast nästan direkt.... :(

Som ni ser har jag gjort, som mullemeck lärde mig, en array för att enkelt kunna styra vilken siffra jag vill ha i en for-loop, men, det rör ihop sig när jag vill göra samma sak med vilken display som ska va tänd! Det ska va en etta för att displayen ska va jordad, iom transistorn.....
Men hur skriver jag? display(0) = high porta.0 osv ville tydligen inte funka...? Hur göra?

Kod: Markera allt

siffra VAR BYTE[10]
display VAR BYTE[2]

siffra(0) = %00111111
siffra(1) = %00000110
siffra(2) = %01011011
siffra(3) = %01001111
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

styrpinne för transistor1 hög
mata ut siffra på portb
vänta en stund
återställ båda till 0
styrpinne för transistor2 hög
mata ut siffra på portb
vänta en stund
återställ båda till 0
upprepa

Edit: Så klart, danei! :wink:
Senast redigerad av $tiff 21 december 2004, 11:00:58, redigerad totalt 1 gång.
danei
EF Sponsor
Inlägg: 27424
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

vänta lite innan du nollar.
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 »

Jo, $stiff, så långt är jag med, kanske va lite otydlig...

Om man gör en for loop, typ såhär

For tmp = 0 to 1
porta = display(tmp)
Pause 5
Next tmp

Men hur ska jag defnera display(0) samt display(1) sen, om jag skriver display VAR byte[2]... ? Jag kan ju inte göra riktigt som jag gjorde med led-arrayen...? Elller? Kanske kan skriva

display(0) = %01
display(1) = %10
Sen skriver jag ju bara porta = display(tmp) i For-loopen...
Eller måste jag ha med en hel byte...? Hur ska jag göra?
display(0) = high porta.0 osv verkar inte funka...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Du tangerar någon slag objekorienterad programmering nu, vilket PICBasic verkligen inte är. Man måste lära sig hantera variablerna på rätt sätt och ha koll på vilka operationer man kan utföra på dem.

Du kan antingen kopiera över en helt byte till PortA-registret, eller välja att sätta en bit i taget. Om du vill göra något mittemellan finns det de logiska operanderna att ta hjälp av.
Om du vill kopiera över en helt byte till portA kan du ju få problemet att resten av pinnarna styr en helt annan funktion än den du tänker ändra på.

Ta en titt på logiska operationer i PICBasic-manualen så kanske du hittar något passande.
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 »

Då sätter vi en bit i taget då, men jag vet fortfarande inte hur jag ska skriva när jag definerar tex display(0)...

Och porta.tmp ville ju inte heller funka...?

Blir ju problem om jag ska ha det i en forloop då för att växla mellan diplay ett o två....

EDIT:
Det funkade visst osm jag tänkte.... Vet dock inte om det funkar ifall man ska använda resterande pinnar på A som $tiff sa...

Gjorde bara så båda displayerna räknar likadant uppåt... Ska göra så räknaren kan räkna till 99 "på riktigt"....

Kod: Markera allt

DEFINE OSC 4
TRISB = 0
TRISA = 0
tmpa VAR BYTE
tmpb VAR BYTE
tmpc VAR BYTE
siffra VAR BYTE[10]
display VAR BYTE[2]

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

display(0) = %01
display(1) = %10

loop:
	For tmpa = 0 TO 9
		PORTB = siffra(tmpa)
		For tmpb = 0 TO 20
			For tmpc = 0 TO 1
				PORTA = display(tmpc)
				Pause 5
			Next tmpc
		Next tmpb
	Next tmpa
GoTo loop
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 »

Det gick... Men inte mycket mer....

Tänkte göra så den räknar sekunder uppåt, men den halkvar efter flera sekunder redan efter en minut!

Klarar inte picen av o hålla tempot eller var ligger felet...?

Bifogar koden. Insåg att jag tänkte lite fel då display inte behöver vara en variabel, ursäkta för allt onödigt tjat...

Kod: Markera allt

DEFINE OSC 4
TRISB = 0
TRISA = 0
tmpa VAR BYTE
tmpb VAR BYTE
tmpc VAR BYTE
tid VAR WORD
dis VAR BYTE
tiotal VAR BYTE
ental VAR BYTE

siffra VAR BYTE[10]
display VAR BYTE[2]

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

display(0) = %01
display(1) = %10

loop:
	For tiotal = 0 TO 5		
		For ental = 0 TO 9
			For tid = 0 TO 1000
				PORTB = siffra(ental)
				PORTA = display(0)
				PauseUs 500
				PORTB = siffra(tiotal)
				PORTA = display(1)
				PauseUs 500
			Next tid
		Next ental
	Next tiotal
GoTo loop
EDIT:
Det tog 127 minuter för den att räkna till 120 sekunder, mätte med klocka...
Då tog jag 127/120=0,94488, blir i milliesekunder 944,88, alltså 945, skrev in det i programkoden o nu stämmer det exakt med klockan!! Är det så man får göra eller? Tycker inte det borde behövas...

Sen funderade jag lite på om man ska ta 120/127=1,05833 = 1058 msn för att räkna ett steg på displayen... hmm Undertiden jag sitter här och skriver ser jag att picen halkat efter en aning under 7 minuter, så det kanske är denna uträkning som är rätt, ska tänka vidare... 1,058 sekunder för att räkna ett steg, då motsvarar alltså 1000 i programkoden 1058, då får man väll ta till lite räkneknep...hmm.... 1000/1058*1000=945,17, denna uträknning stämde alltså inte heller, då det måste bli lmindre än den översta... hur göra?

EDIT 2: Nu efter 17 och en halv minut har det halkat efter ganska exakt en sekund då det står 945 i koden, vore bättre om man kunde räkna fram sig till svaret än o testa sig fram.

EDIT 3: Inser att jag inte mätt fullt exakt med min klocka, men är ändå lite osäker på hur jag ska räkna, nu har jag mätt på 21 sekunder så nu borde det stämma lite bättre iaf...

EDIT 4: Nu fick jag det till 943,8 , när jag räknade enligt min andra metod ovan... Det känns ganska rimligt...
Senast redigerad av NSR_Martin 21 december 2004, 20:20:27, redigerad totalt 3 gånger.
Skriv svar