PDA

View Full Version : Help: how to assign assorted pins to one byte variable



Heckler
- 5th March 2011, 16:18
I'm sure this is a case of "can't see the forest for the trees". I have searched and read but can not for the life of me understand the following:

I am designing a project for a Boy Scout electronics merit badge. I need to keep the circut wiring simple, therefore I want to use the pins of the 16F690 PIC as they are physically oriented on the PIC package.

I want to use A1,A2,C0,C1,C2,B4,B5,B6 as the column of an 8x8 led matrix.
How do I assign those unrelated pins to one 8 bit variable?
I think it must have something to do with the use of ALIASES??

Thanks in advance. I think there must be some thick fog in the old gray matter.
(and the fact that I only dabble in programming)

Heckler
- 5th March 2011, 22:11
Anybody??

Or is it not possible??

Mabie I should elaborate...

I would hope it is possible to define which PIC pins are assigned to a column (or row for that matter) and in what order. Then just do a "CASE" type lookup of the various elements of whatever I want to display on the 8x8 LED matrix, and write them to the 8 bit Alias that is connected to the display.

If It is not possible... then does one just have to individually set or clear each pin in the 8 bit word and then "turn on" the corresponding row or column to light up that part of whatever I want to display?

I understand how to do it if I were to use the 8 bits sequentially of a given 8 bit port, like PortA, but I want to "mix and match" which pins represent each of the 8 bits and then define an Alias that I can write the code to.

Any help would be greatly appreciated.
(I wish the PBP manual had more real world examples, hint to ME labs for their next printing)

ofuzzy1
- 6th March 2011, 01:32
Congrats on your Efforts of working on your Eagle Scout !!

You know it would help if I really read the question, the following is how I did an INPUT from a DIP Switch.

I did this using a 12f683 -- needed the _MCR working otherwise GPIO.3 would of been handy.
12f683 has 6 I/O pins



DIP_ = (gpio & $07) + (GPIO.4 * $08) ' Read GPIO.0.1.2.4 & MAKE IT BCD /hex4


I was going to give you the code, but since it is for your Eagle project I will give you HINTS. :rolleyes:
** If you are stumped then message me and I will gladly give you the code - you can do it in 3 lines **

HINTS
0. Store the final value you want in a BYTE VAR ... LED_OUT
1. Extract the bits for each part using LED_OUT & %00000011 .... ???
2. Shift the result up or down to where you need them; using ">>" [hint use parentheses to keep things tidy]



PORTx= LED_OUT & %00000011 .... ???

Heckler
- 6th March 2011, 03:12
NO, NO!!

I am the one TEACHING the electronics merit badge. I have been doing electronics for many years as a hobby AND I work in electronics (mostly microwave communications)

Alas, I am not the greatest programmer... I would love to spend more time programming and playing with the PIC micro's. But I have a day job and kids...

The merit badge just requires the Scouts to build a simple electronic project. I really want to expose them to the wonderful world of microcontrollers. I realize they won't be able to understand all the programming at this point. But, if I can get them to heat up a soldering iron and build a neat scrolling text "necerchief slide" they might just get hooked on electronics and even a great career. I do plan on explaining the basics of the program, though.

I need to keep the wiring simple... so I want to just use 8 pins on each side of the 16f690 in the order they come off the chip. So I need to be able to write an 8 bit word to the 8 somewhat unrelated port pins (as detailed above).

Thanks for your reply... I will take time to decipher your hints...

Question: does your suggestions apply to writing out to the pins as well as reading in from the pins? Please, more detail if possible.

And others... please chime in here:o I need all the help I can get.

I have not recieved the 8x8 LED matrix yet or I would post my schematic. I just need to figure out if it is possible to write an 8bit word to 8 mixed pins at one time.

Thanks

ofuzzy1
- 6th March 2011, 06:03
Heckler, bless your heart.
Like I said, it would help if I read a bit better --- should go to bed.

Since your the Teacher then here: :o

Question: does your suggestions apply to writing out to the pins as well as reading in from the pins
From the same pins? Yes, you would read what you set AND any INPUTs -- all assuming the TRIS[a,b,c] are set properly
If you need to write to other pins and maintain the LEDs then see
"OTHER_PIN_STATES"

Yes, these will write directly to the ports. :)

Using this order for what you want displayed in a byte
A1,A2,C0,C1,C2,B4,B5,B6

And the final value is stored in the LED_OUT a VAR BYTE

You will need to take care of the TRIS registers.



PortA = (LED_OUT & %00000011) << 1 ' get bits a1, a2 and shift UP 1 to PORTA.1.2
PortC = (LED_OUT & %00011100) >> 2 ' get bits C0,C1,C2 and shift DOWN 2 to PORTC.0.1.2
PortB = (LED_OUT & %11100000) >> 1 ' get bits B4,B5,B6 and shift DOWN 1 to PORTB.4.5.6


"OTHER_PIN_STATES"
If you need to keep other pins 'On or off' then use


PortB = OTHER_PIN_STATES + (LED_OUT & %11100000) >> 1


Input would be the the reverse.
Try this for an INPUT
Using this order
A1,A2,C0,C1,C2,B4,B5,B6


KEY_8x8 = ((PortA & $06) >> 1) + ((PortC & $07) << 2) + ((PortB & $70) << 1)
or
KEY_8x8 = (PortA & %00000110) >> + ((PortC & %00000111) << 2) + ((PortB & %01110000) << 1)

PortA.1.2 are extracted and shifted down one to bits %xxxxxxAA
PortC.0.1.2 are extracted and shifted to up two bits %xxxxBBBxx
PortB.4.5.6 are extracted and shifted to up one bit %CCCxxxxxx


OTHER hints be sure to set the -- I keep forgetting then spending to much time finding that goof.



' setup the registers and IO PINS
'— COMPARATOR CONTROL REGISTER -- choose the correct one for your chip :o)
CMCON = $07 'CMCON — COMPARATOR CONTROL REGISTER ALL DIGITAL
'or
' CMCON0 = $07 'ALL DIGITAL 12f683 & chips with a2d — COMPARATOR CONTROL REGISTER
'
' ADCON1 = %01100000 ' Set a2d convert at clk/6 [slowest]
' ADCON1 = %00000000 ' Set a2d convert at clk/2 [fastest]
ANSEL = %00000000 ' AN0/RA0 as analog input 1=ANALOG
ADCON0 = %00000000 ' .7=10bits left justify result!! / .0 1=a2d ON


and Pull-up the _MCLR PIN !!!!

sean-h
- 6th March 2011, 11:19
What about this?



YourByte var byte
YourByte=Value you set

portA.1 = YourByte.Bit0
portA.2 = YourByte.Bit1
PortC.0 = YourByte.Bit2
PortC.1 = YourByte.Bit3
PortC.2 = YourByte.Bit4
PortB.4 = YourByte.Bit5
PortB.5 = YourByte.Bit6
PortB.6 = YourByte.Bit7


Cheers

Sean.

rsocor01
- 6th March 2011, 11:55
I need to keep the wiring simple... so I want to just use 8 pins on each side of the 16f690 in the order they come off the chip. So I need to be able to write an 8 bit word to the 8 somewhat unrelated port pins (as detailed above).

Hmmm, why don't you use 8 pins from the same port (ex: PORTB.0, PORTB.1, ...., PORTB.7) and practice your wiring skills. If you are trying to etch a board, it is not that difficult to do if you use the right techniques.

ofuzzy1
- 6th March 2011, 18:38
What about this?



YourByte var byte
YourByte=Value you set

portA.1 = YourByte.Bit0
portA.2 = YourByte.Bit1
PortC.0 = YourByte.Bit2
PortC.1 = YourByte.Bit3
PortC.2 = YourByte.Bit4
PortB.4 = YourByte.Bit5
PortB.5 = YourByte.Bit6
PortB.6 = YourByte.Bit7


Cheers

Sean.


Now that was to easy! Dooh!

I was wondering this morning how to do the .bit thing ;)

Heckler
- 6th March 2011, 23:38
I guess the real answer is... NO. There is no way in PBP to define a Variable Aliase that represents the mixed pins of different ports, and then be able to write one word to that aliase and have it go out to the pins. Similar to what you can do with a statement like...


PortC = % 10101010

Comments to each of the posters in order of reply...

@ ofuzzy1: Thanks for your persistance... I figured it may come down to brute force programming and shifting / and-ing of bits to get them all set.

@ sean-h: That looks clean... I wonder if it is any slower or faster than fuzzy's method?

@ rsocor01: Initially I was planning on using "stripboard or veroboard" so I wanted to minimize the wiring and cutting of traces. I may actually end up making a PCB board and if that is the case I'll surely just use Port C that has all 8 bits.

thanks everyone...

This is why I REALLY, REALLY wish that the PBP manual had more "real world" examples. Many of the code syntax definitions are so bare that it is hard to understand the use of them.

I guess if the manual was TOO GOOD there would be no need for a GREAT forum like this one.

The Scout Camp is this July... I will be putting together the project in the next few months and when I get it done I'll come back here and post code and pictures.

Here are a couple of excellent examples I have found:

http://www.instructables.com/id/Mini-8x8-LED-matrix-Christmas-display-with-built-i/

Watch the youtube video!

http://tinkerlog.com/howto/64pixels/


Others... please post more ideas if you have them:D