Sida 2 av 2

Postat: 12 maj 2005, 23:51:06
av mrhedin
Tjenare!

Tack för alla tips & svar. Nu har jag kommit en bra bit påväg och är övertygad om att det kommer att fungera tillslut.

Jag har nu sprungit in i ett annat problem som jag skulle vilja ha hjälp med från en vänlig själ.


Jag har ett tal under 10 som jag vill få ut PORTB. Därifrån går det sedan 4 sladdar till en 4511 och vidare ut på en 4x7 segments LED.
Problemet jag har är att jag vill bara skriva talet på ben 0-3 på PORTB. Jag driver nämligen transistorer på ben 4-7 på PORTB vilken LED som skall visa siffran.

Som jag skrivit nu så verkar det som att talet snor alla 8 utgångsbenen på PORTB och transistorerna dras därför inte.

PORTB = digit1 ; skickar ut talet till porten, snor den hela porten?
PORTB.7 = 1 ; detta funkar inte, transistorn drar inte
pause 500
PORTB.7 = 0
osv för de olika LED:arna

Hur skall jag skriva i PicBasic för att detta skall funka?
Skulle bli jättetacksam för lite hjälp =)

Postat: 13 maj 2005, 00:07:40
av sodjan
Alla "tal" är 8 bitars binära tal (normalt)
När man skriver till en port, skrivs alltid alla 8 bitar.

> PORTB = digit1

Om digit1 = 10 (decimalt antar jag), så kommer PORTB att blir 00001010 oavsett vad det var tidigare.

> PORTB.7 = 1 ; detta funkar inte, transistorn drar inte

Har du något instrument som du kan kolla om du får "hög" på RB7 ?
Att transistorn inte "drar", behöver inte betyda att kommandot i sig inte fungerar... :-)

Om du enbart vill skriva till några bitar i porten, får du först läsa porten och sedan med lite logiska operationer ändra vissa bitar för att sedan skriva tillbaka resultatet. Låter krångligare än vad det är... :-)
Man måste även se till att inte något interrupt kan gå in emellan och ställa till det, men om du inte använder interrupt så är det inget problem.

Postat: 13 maj 2005, 00:27:51
av mrhedin
Det går alltså inte att tala om för programmet att den bara skall skriva ett tal till de första fyra pinnarna?

Finns det inget likadant som man med "anyvar = PORTB & $0f" bara läser på de fyra första pinnarna och sparar det i anyvar?

Postat: 13 maj 2005, 00:43:38
av sodjan
Jag har aldrig använt PicBasic, men från dina exempel skulle jag tänka mig att något som det här skulle kunna fungera :

anyvar = PORTB & $F0 ; läs port B och sätt bit 0-3 = 0.
anyvar = anyvar <or> digit1 ; Jag vet inte vilket tecken som är "or" i PicBasic. Sätt anyvar bit 0-3 enligt digit1.
PORTB = anyvar ; Skriv till sist tillbaka anyvar till PORTB.

Alltså, det gäller att se till att "bevara" värdet av bit 4-7.

Postat: 13 maj 2005, 08:09:45
av bengt-re
I basic micro som är rätt lik kan mad adressera halva portar som portb.nib0 för de först fyra bitarna.

Postat: 13 maj 2005, 09:24:43
av sodjan
Både läsning och skrivning till porten ?
I så fall innhåller väll runtime koden någon maskning liknande den jag föreslog, antar jag.

Om det var mitt projekt skulle jag kasta ut Basic genom fönstret och programmera "på riktigt" i assembler... :-)

Postat: 14 maj 2005, 19:25:34
av mrhedin
Tjena!

Det börjar lösa sig. Hitiils funkar 16F84A och PicBasic alldeles utmärkt för er som tvekar.

Jag fick ett tips tidigt om att mäta pulserna med PULSIN vilket var ett mycket bra tips. (Tackar så mycket Forsgren). Det passar perfekt för den sorts pulser som brytarspetsen ger ifrån sig.

Nästa problem att bara skriva 4 bitar till en port, löste jag genom att helt enkelt skriva till PORTA istället som bara har 4 bitar. Det är lätt å köra fast ibland.

Postat: 15 maj 2005, 01:02:55
av mrhedin
Alldeles nu rullade de första RPM:en ut på mina displayer med en ruskig precision. Programmeringen är löst, med hjälp av PicBasic och 16F84A, och era tips givetvis! =)

Nu är det dags för nästa steg i produktionen...