|
|
View previous topic :: View next topic |
Author |
Message |
ablincon
Joined: 20 Jan 2018 Posts: 2 Location: Aguascalientes
|
i have to simulate a multiplexer with 6 inputs and 1 output |
Posted: Sat Jan 20, 2018 7:23 pm |
|
|
What i am trying to do is to develop a multiplexer, i have 4 inputs and 2 modifiers with 4 combinations: 0&0,1&0,0&1,1&1. So with every combination there is one output, with the 4 inputs A, B, C and D if the led is turned on, with 0&0 if i activate the switch of A the led is going to turn off and so on.
Code: |
#include "C:\Users\abrah\Documents\ea.h"
#FUSES INTRC_IO //Oscilador Interno y tanto RA6 como RA7 son I/O
#FUSES NOWDT //Watch Dog Timer apagado
#FUSES PUT //Power Up Timer activado
#FUSES NOBROWNOUT //Reset ante variaciones de VCC desactivado
#FUSES NOIESO //Switch del oscilador en el encendido apagado
#FUSES NOFCMEN //detector de falla del oscilador principal apagado
#FUSES NOSTVREN //reset por desborde del stack desactivado
#FUSES NOLVP //Programación en baja tensión desactivada
#FUSES NOPROTECT //Protección contra lectura de la FLASH desactivada
#FUSES NOCPD //Protección de la EEPROM desactivada
#define A PIN_A0//set the pins
#define B PIN_A1
#define C PIN_A2
#define D PIN_A3
#define S1 PIN_B5
#define S2 PIN_B6
#define LD1 PIN_D2
int Sw1=0;//it states that Sw1 is 0 in the begining
int Sw2=0;
int Ai=0;
int Bi=0;
int Ci=0;
int Di=0;
//I am using pic 184550
//I want the multiplexer to change if the S inputs change
void main()
{
Sw1=input (S1);//Sw1 is an input
Sw2=input (S2);
Ai=input(A);//input
Bi=input(B);
Ci=input(C);
Di=input(D);
while(true)
{
if ((Sw1==0)&(Sw2==0)&(Ai==0))//if port b5, b6 and a0 is 0
output_high (LD1);//led turns on
if(input(PIN_A0)==1){//if input a0 (switch) is 1
output_toggle(PIN_D2);//output d2 led turns off
}
{
if ((Sw1==1)&(Sw2==0)&(Bi==0))
output_high (LD1);
if (input(PIN_A1)==1){
output_toggle(PIN_D2);
}
{
if ((Sw1==0)&(Sw2==1)&(Ci==0))
output_high (LD1);
if (input(PIN_A2)==1) {
output_toggle(PIN_D2);
}
{
if ((Sw1==1)&(Sw2==1)&(Di==0))
output_high (LD1);
if (input(PIN_A3)==1) {
output_toggle(PIN_D2);
}
delay_ms(500);
}
}
}
}
}
|
//what do i need to do for you to copy/paste the program _________________ hey i just want to learn
Last edited by ablincon on Sun Jan 21, 2018 10:29 am; edited 5 times in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Sat Jan 20, 2018 9:41 pm |
|
|
When posting for help, you need to supply a complete program that has the PIC header, fuses, etc. It needs to be able to be 'copy/pasted/compiled' so that we can test on our computers.
Also you should add //comments to your code. Usually most lines need some kind of comment to describe what action is to taken, what a variable is used for, etc. You'll notice in the examples that CCS supplies, often there's a paragraph at the beginning of the program that explains the basic operation of the program.
Also be aware that switches tied to input pins require some for of debouncing or filtering (say a .1mfd cap across the contacts) to ensure proper operation.
Jay |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Sun Jan 21, 2018 6:38 am |
|
|
much better !
couple more edits though..
1) add indentation for the conitional IF (....)
something like...
if (input(PIN_A3)==1) {
output_toggle(PIN_D2);
}
the braces {} show what is to happen
the indented line of code, keeps it visually organized
both of these make it easier to spot silly typing mistakes.
2) add a delay at the end of the main() loop,say delay_ms(500);. This gives the overall program a +-1/2 second timing.
...
check pins
do tests
control LEDs
delay
...back to check pins
Also returns are not needed
and you still need a processor include as the first list
like ...#include <18f46k22.h>
unless it's in the .h
#include "C:\Users\abrah\Documents\ea.h"
If so, you should add a comment which PIC you're using.While you know now what it is,we don't and maybe that PIC doesnt have those PINs, or fuses. We also can't copy/paste/compile.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Sun Jan 21, 2018 9:34 am |
|
|
It's perhaps worth separating the tasks. Also there is the question of whether you want the multiplexer to change if the S inputs change?. As shown they are read once at the start, when normally they need to be tested every time round the loop. You then confuse things by testing these at the start, and performing actions based on these values, and yet also testing inputs separately, using the pin names, rather than the defines. Use the defines. Not actually quite sure of what you really want to do (a multiplexer would just duplicate the selected input to the output), but an approach like:
Code: |
//headers omitted
int8 S; //Since the inputs are always read before this is used,
//it does not need to be initialised.
void main()
{
while (TRUE)
{ //assuming the switches really do need to update every loop
S=input (S1) & input(S2)*2;
//S now has a number 0 to 3, reflecting the four possible combinations
//of S1 & S2
switch (S) {
case 0b00:
//Both S1 and S2 low
output_bit(LD1, input(A)); //copy the A input to the output
break;
case 0b01:
//S1 high S2 low
output_bit(LD1,input(B)); //copy the B input to the output
break;
case 0b10:
//S2 high and S1 low
output_bit(LD1, input(C)); //copy the C input to the output
break;
case 0b11:
//Both S1 & S2 high
output_bit(LD1,input(D)); //copy the D input to the output
break;
}
}
}
|
This is a multiplexer mirroring the pin selected by the pattern on S1/S2 to LD1. |
|
|
ablincon
Joined: 20 Jan 2018 Posts: 2 Location: Aguascalientes
|
|
Posted: Sun Jan 21, 2018 10:31 am |
|
|
Ttelmah wrote: | It's perhaps worth separating the tasks. Also there is the question of whether you want the multiplexer to change if the S inputs change?. As shown they are read once at the start, when normally they need to be tested every time round the loop. You then confuse things by testing these at the start, and performing actions based on these values, and yet also testing inputs separately, using the pin names, rather than the defines. Use the defines. Not actually quite sure of what you really want to do (a multiplexer would just duplicate the selected input to the output), but an approach like:
Code: |
//headers omitted
int8 S; //Since the inputs are always read before this is used,
//it does not need to be initialised.
void main()
{
while (TRUE)
{ //assuming the switches really do need to update every loop
S=input (S1) & input(S2)*2;
//S now has a number 0 to 3, reflecting the four possible combinations
//of S1 & S2
switch (S) {
case 0b00:
//Both S1 and S2 low
output_bit(LD1, input(A)); //copy the A input to the output
break;
case 0b01:
//S1 high S2 low
output_bit(LD1,input(B)); //copy the B input to the output
break;
case 0b10:
//S2 high and S1 low
output_bit(LD1, input(C)); //copy the C input to the output
break;
case 0b11:
//Both S1 & S2 high
output_bit(LD1,input(D)); //copy the D input to the output
break;
}
}
}
|
This is a multiplexer mirroring the pin selected by the pattern on S1/S2 to LD1. |
Yes i want the multiplexer to change if the S inputs change _________________ hey i just want to learn |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Sun Jan 21, 2018 12:04 pm |
|
|
Slightly puzzled, since 6 inputs would require a minimum of 3 address bits. Your example shows just two, and only four input pins. However the approach I posted will work for any number of inputs. Just read the third input pin and multiply this by 4, then make the case lines be for '0b000' etc.. |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
|
Posted: Mon Jan 22, 2018 5:37 am |
|
|
Ttelmah wrote: | Slightly puzzled, since 6 inputs would require a minimum of 3 address bits. Your example shows just two, and only four input pins. |
Yes, but don't take the 6 inputs quite so literally. It's clear that what the poster meant was six "inputs": four actual inputs and two address/select lines. What he's after is a simple 4:1 mux, but doesn't, yet, quite know the naming conventions of such things. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Mon Jan 22, 2018 5:54 am |
|
|
Well, that is what I posted, so hopefully he will find it does what is needed. |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
|
Posted: Mon Jan 22, 2018 6:06 am |
|
|
It's interesting that we get two simulations of MSI logic functions in quick succession. Coincidence? probably, but maybe not... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Mon Jan 22, 2018 6:50 am |
|
|
Have to agree. Probably a particular course, where the teacher starts by trying to show the students that you can simulate almost any simple logic with a micro-controller. |
|
|
johnmarti42
Joined: 21 Jan 2018 Posts: 3
|
what this is for S=input (S1) & input(S2)*2; |
Posted: Thu Jan 25, 2018 8:10 am |
|
|
ablincon wrote: | Ttelmah wrote: | It's perhaps worth separating the tasks. Also there is the question of whether you want the multiplexer to change if the S inputs change?. As shown they are read once at the start, when normally they need to be tested every time round the loop. You then confuse things by testing these at the start, and performing actions based on these values, and yet also testing inputs separately, using the pin names, rather than the defines. Use the defines. Not actually quite sure of what you really want to do (a multiplexer would just duplicate the selected input to the output), but an approach like:
Code: |
//headers omitted
int8 S; //Since the inputs are always read before this is used,
//it does not need to be initialised.
void main()
{
while (TRUE)
{ //assuming the switches really do need to update every loop
S=input (S1) & input(S2)*2;
//S now has a number 0 to 3, reflecting the four possible combinations
//of S1 & S2
switch (S) {
case 0b00:
//Both S1 and S2 low
output_bit(LD1, input(A)); //copy the A input to the output
break;
case 0b01:
//S1 high S2 low
output_bit(LD1,input(B)); //copy the B input to the output
break;
case 0b10:
//S2 high and S1 low
output_bit(LD1, input(C)); //copy the C input to the output
break;
case 0b11:
//Both S1 & S2 high
output_bit(LD1,input(D)); //copy the D input to the output
break;
}
}
}
|
This is a multiplexer mirroring the pin selected by the pattern on S1/S2 to LD1. |
Yes i want the multiplexer to change if the S inputs change |
what the *2 function is for? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Thu Jan 25, 2018 8:35 am |
|
|
I'm creating a value from 0 to 3, from the 'binary' values from the two inputs.
The input from S2, needs to either be shifted or multiplied by two to move it to the next bit. The compiler is smart and will replace *2, with a shift, so you end or with a two bit value, with the value read from S1 in the bottom bit, and S2 in the next bit.
Remember this needs S1, and S2 #defined as shown in the original post, or to match whatever pins you want, or it won't work/compile. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|