|
|
View previous topic :: View next topic |
Author |
Message |
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 13, 2011 1:28 pm |
|
|
Thought also of another version, which may optimize a little bit the code.
Code: |
while(1)
{
result = read_adc();
// printf("%u \n\r", result);
if ((result>240) && (temp != 0 )) { //neutral
temp = 0;
display_digit(temp);}
else if ((result<40) && (temp != 1 )){ ///1st gear
temp = 1;
display_digit(temp);}
else if ((result<80) && (temp != 2 )){ //2nd gear
temp = 2;
display_digit(temp);}
else if ((result<120 ) && (temp != 3 )){ //3rd gear
temp = 3;
display_digit(temp);}
else if ((result< 160 ) && (temp != 4 )){ //4th gear
temp = 4;
display_digit(temp);}
else if ((result< 200 ) && (temp != 5 )){ //5th gear
temp = 5;
display_digit(temp);}
else { //6th gear
temp = 6;
display_digit(temp);}
delay_ms(1000);
}
}
|
I changed the check from just
(result < x) to
(result < x) && (temp != 0 ))
This way, i think, if after a loop, there is still the same gear, i guess, there is no point to call the routine, since the gear number remains the same on the display.
I really need your help guys.
I believe the code is close to be regarded as complete with all the information you provided..please don't get back on me now :(
a) if this change in the code an optimization or not necessary?
b) the read_adc takes values from 0 to 255 or 0 to 1023.
c) why the c3 pin remains on, until gear is selected? so according to the gear it either turns off or remains on.
Looking forward to hearing from you. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Thu Oct 13, 2011 1:40 pm |
|
|
You might like to post your entire program,instead of 'bits and pieces' as it's too hard to follow.
The ADC is a 10 bit device,though 8 are probably fine for your application.
If C3 is also used for any internal peripherals(SPI, UART,etc.), those should be disabled so that C3 will only be used as an I/O pin. |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 13, 2011 1:45 pm |
|
|
you are right the code so far is
Code: | #include <16F506.h>
#fuses INTRC_IO, IOSC4, NOWDT
#use delay(clock = 4M)
#use rs232(baud=9600, xmit=PIN_C3)
//===============================
void display_digit(val);
void main()
{
int8 result,temp;
setup_adc_ports(AN0_AN2);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(10);
while(1)
{
result = read_adc();
// printf("%u \n\r", result);
if (result>240){
temp = 0;
display_digit(temp);}
else if (result<40){
temp = 1;
display_digit(temp);}
else if (result<80){
temp = 2;
display_digit(temp);}
else if (result<120 ){
temp = 3;
display_digit(temp);}
else if (result< 160 ){
temp = 4;
display_digit(temp);}
else if (result< 200 ){
temp = 5;
display_digit(temp);}
else {
temp = 6;
display_digit(temp);}
delay_ms(1000);
}
}
int8 dbits[7] = {63,12,91,94,108,118,119};
void display_digit(int8 val) {
int8 itemp;
if (val>6) return; //Impossible to display
itemp=dbits[val];
if (itemp & 64) {
//Here extra bit on B1 needs to go on
output_high(PIN_B1);
}
else {
output_low(PIN_B1); //else off
}
output_c(itemp & 63); //send other six bits;
} |
and I'm considering the change that i mentioned above. |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 13, 2011 8:05 pm |
|
|
just an update with my "amateur" soldered circuit..
|
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Mon Oct 17, 2011 6:11 pm |
|
|
If anyone is aware of hardware stuff.
Can the LM324 be omitted? Along with the two resistors?
and lead the signal directly to the pic?? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Tue Oct 18, 2011 5:19 am |
|
|
Since we don't know what the 'speed sensor' is, I'd leave the LM324 in. It's configured as a voltage follower which does severals functions for you.
1) provides a low impedence input to the ADC.
2) offers a layer of protection to the PIC ADC
3) limits the Vin to +5 if the sensor produces more
4) has 3 more opamps available for other 'features' as your project grows(they all do !).
Suggestions regarding your boardlayout
1) use a socket for the LM324,in fact all chips.It doesn't cost much these days and allows you to easily change them if required.Power failure,new PIC,etc.
2) bolt the LM7805 to the perfboard with a nut and bolt,adding a small heatsink.while maybe not required in this circuit,it's good practice to keep the regulator as cool as possible.
3) download one of the free PCB design programs(I use ExpressPCB) do try several 'layouts' of the project.That way you can figure out the best layout for easy 'solder stiching' of traces,jumpers,switches,LEDs,etc.even with simple PIC projects, I use it to get a great layout without a 'mess of wires' underneath.Yes, it takes time to learn,but once you get used to it,you'll actually save time in the final building stage.
4) make a test setup of a couple of those white 'breadboards'.I've used them for decades and know that if the circuit works in them, it'll work in the real world as a 'solder stitched' perfboard or a real PCB.Typically I have the power supply,PIC and LCD on one board with external peripherals(RTC, Vinculum,RS232) on the other.Even an 18F4550 at 24MHz works fine. |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Wed Oct 19, 2011 8:38 pm |
|
|
Thank you very much for your advice. It is really useful.
I was told to notice the cooling part of 7805 from another party as well. I guess it is quite important.
I've installed express pcb but not yet keen with it. I need further practice.
Also, can you please tell me what a "breadboard" is? I find this term second time within a day searching around forums. |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Sun Oct 23, 2011 9:03 am |
|
|
can someone explain to me what is the use of mclr,
and if it is necessary or good idea to connect it to the circuit..? |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 27, 2011 9:38 am |
|
|
got at last a programer,
wrote the program on the pic, all segments come on when they are supposed to apart from segment f...
with the old pic with the preinstalled program segment f comes on as well..
potential pic failure? |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 27, 2011 10:02 am |
|
|
segment f is powered from pic16f506 pin c5/t0ckl |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Thu Oct 27, 2011 11:47 am |
|
|
Breadboard refers to any of the 'white, solderless' boards that allow you to connect PICs and parts with small jumper wires(22ga solid) without soldering. Great tool for building and testing new circuits. I've found that any circuit that works on them, will work on 'perfboard' (like you have ) or a real PCB. The nice thing is it's very,very easy to change pinouts,add chips, change resistors, etc. Typically I have two,one as a long term test setup, the other for making changes. That way I don't have to rewire one board and mess things up. If you can get 10 conductor, 22ga solid wire as a cable,you'll have all 10 colours, making it easier to wire things up.
If the LED display works with the old PIC and program, then you probably have a code issue. Perhaps the segment table( dbits(....) ) is NOT correct, and so not turning on the 'f' segment. Consult the LEDs datasheet for pinout, compare to the PIC I/O pins you've used. A simple truth table will give you the proper bit setting for whatever 'number' or 'digit' you want.
MCLR is the master clear pin. Usually pulled high with a 10K resistor with a normally open push button to ground. Pressing the button and releasing it will cause the PIC to restart the program. On some newer PICs( NOT all), you can 'reuse' this pin for an extra digital input IF you select the correct FUSES(configuration) option. |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 27, 2011 4:33 pm |
|
|
i ordered a breadboard from ebay, since it seems a very easy way to start experimenting on a new project without all the soldering part..
i reloaded, two or three different programs,
i also entered a line "output_high(pin_c5)" but no result...
also checked the segment table and it seems to be correct..
is there any way to verify that pic's pins are actually working..??? |
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Thu Oct 27, 2011 5:12 pm |
|
|
nikolas wrote: | i ordered a breadboard from ebay, since it seems a very easy way to start experimenting on a new project without all the soldering part..
i reloaded, two or three different programs,
i also entered a line "output_high(pin_c5)" but no result...
also checked the segment table and it seems to be correct..
is there any way to verify that pic's pins are actually working..??? |
i even erased the code protected pic and loaded my program, but still the same result.. pin_c5 not responding..
Code: | #include <16F506.h>
#device adc=8
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOPROTECT
#FUSES NOMCLR
#FUSES IOSC4
#use delay(clock=4000000)
void display(int8 gear_out)
{
const int8 segment[7] = {63,12,91,94,108,118,119};
int8 show;
switch (gear_out)
{
case 1: show=segment[1];
break;
case 2: show=segment[2];
break;
case 3: show=segment[3];
break;
case 4: show=segment[4];
break;
case 5: show=segment[5];
break;
case 6: show=segment[6];
break;
default : show=segment[0];
break;
}
if (show & 64) output_high(PIN_B1);
else output_low(PIN_B1);
output_c(show & 63);
}
void main()
{
int8 gear,i,temp;
setup_adc_ports(AN0_AN2);
setup_adc(ADC_CLOCK_DIV_16);
setup_comparator(NC_NC_NC_NC);
set_adc_channel(0);
delay_us(50);
temp=0;
for (i=0;i<7;i++)
{
display(i);
delay_ms(200);
}
output_c(0);
for (i=0;i<10;i++)
{
output_toggle(pin_b1);
delay_ms(100);
}
while(1)
{
gear = read_adc();
if ((gear>245) & (temp!=0)){
temp=0;
display(0);}
else if ((gear>10)&(gear<=97) & (temp!=1)){
temp=1;
display(1);}
else if ((gear>97)&(gear<=122) & (temp!=2)){
temp=2;
display(2);}
else if ((gear>122)&(gear<=163) & (temp!=3)){
temp=3;
display(3);}
else if ((gear>163)&(gear<=204) & (temp!=4)){
temp=4;
display(4);}
else if ((gear>204)&(gear<=227) & (temp!=5)){
temp=5;
display(5);}
else if ((gear>227) & (gear<=245) & (temp!=6)){
temp=6;
display(6);}
else if (gear<10){
output_c(0);
output_toggle(pin_b1);}
else delay_ms(100);
}
} |
|
|
|
nikolas
Joined: 09 Oct 2011 Posts: 32
|
|
Posted: Fri Oct 28, 2011 9:48 am |
|
|
searching here,
i found this code on a thread from PCM Programmer
Code: | #define set_options(value) {#ASM \
MOVLW value \
OPTION \
#ENDASM}
//================================
void main()
{
setup_comparator(NC_NC);
// Enable pull-ups, wake-up on change, and Pin B2 for normal i/o.
set_options(0x1F); |
it does the jobs, because it sets TOCS to 0 but i don't know if the rest of the bits have to be 0 or 1 in my case.. |
|
|
|
|
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
|