Maker Pro
Maker Pro

Design Simple microcontroller circuit

i am Trying to build a very basic circuit, the working is as follows:

operating voltage is 3.3Vdc

1. Press switch 1- LED starts to Toggle
2. Press Switch 2- Stop the toggle
3. Long press Switch 2- LED blink 5 times.

i used 18F4520 and it worked (But a costly solution) so i switched to 12F510 but not able to program., not able to figure out the issue.

Can someone kindly help me with the code or any analog circuit.

#include <18f4520.h>
#fuses INTRC,NOWDT,MCLR //,PROTECT
#use delay(clock=8000000)

void main()
{
while(True)
{
if ( input(PIN_B2) == 0)
{
while(True)
{
output_toggle(Pin_B0);
delay_ms(500);
if( input(Pin_B1) == 0)
break;
}
}
output_low(Pin_B0);

if(input(Pin_B1) == 0 && delay_ms(3000))
{

output_high(Pin_B0);
delay_ms(100);
output_low(Pin_B0);
delay_ms(100);
output_high(Pin_B0);
delay_ms(100);
output_low(Pin_B0);
delay_ms(100);
output_high(Pin_B0);
delay_ms(100);
output_low(Pin_B0);
delay_ms(100);
}
}
}
 
Last edited:
Hello!
To make this circuit in analog components solely, it would be rather costly.
For the C-code, its nice to use functions (in combination with hardware interrupts.) For switch 1,2:
the switch not being debounced might give problems when using a hw interrupt.

bool sw1 = 'value switch 1';
bool sw2 = 'value switch 2' ;

//LED blink as long as sw1 is engaged
void toggle_sw1( sw1 && !sw2){
led =! led;
delay_ms(1000);
}
// a do while loop can also be used within main or some function
do
led = ! led;
delay_ms(1000);
while(sw1 & !sw2);

For switch 5 you can make a counter with for example a for -loop.

for(int j= 0; j < 6; J++){
J++;
delay_ms(1000);
if(j == '5'){
blink_five_times();
}
}


void blink_five_times(){
for(int i=0; i <6; i++){
led=!led;
delay_ms(1000);
}
}

I have not personally test this code, but I hope it might point in the good direction :). I have included two ways to debounce switches. It is also possible to use a software interrupt.
you can for example read the state of the switch a few times, and have it run trough a 500 ms loop. and look for a stable reading.
 

Attachments

  • debounce.jpg
    debounce.jpg
    65.2 KB · Views: 94

CDRIVE

Hauling 10' pipe on a Trek Shift3
This topic needs to be relocated to its pertinent forum. That would be Microcontrollers & Programming.

Chris
 
so i switched to 12F510 but not able to program.,
Hi sid, can you elaborate on what specifically happened. You said that you are not able to program the 12F510 - are you having issues getting the chip configured? or getting any output from the chip?
 
You say you switched from the 18F4520 to the 12F510, but the code you posted still uses the #include directive for the 18F4520. That might be the problem.
 
You say you switched from the 18F4520 to the 12F510, but the code you posted still uses the #include directive for the 18F4520. That might be the problem.
Exactly. The pin outs are probably not even the same. Hopefully sid will be back on to elaborate on the exact problem.
 
Hello,

I did make the necessary changes such as required header file to #include <18f4520.h> , i used the 8 pin IC and made the necessary cirucit as per the pinout of the IC.

while i was programming using pickit3 i was getting an error for OSSCAL but ignoring that i still programmed and it did program successfully.
i used http://ww1.microchip.com/downloads/en/DeviceDoc/PICkit3%20Programmer%20Application%20v3.10.zip
programming.

i tried to simulate the same on proteus as well but still didnt work.

i guess the IC is not getting programmed.

Request you to help.

thanks,
SId
 
Hello,

I did make the necessary changes such as required header file to #include <18f4520.h> ,
SId

Yes, but didn't you say that you changed from the 18f to the smaller 12f pic? If you did then you would have to call the header for the 12f pic and not the 18f. They are not compatible, the setup for each chip is separate.
 
Yes, but didn't you say that you changed from the 18f to the smaller 12f pic? If you did then you would have to call the header for the 12f pic and not the 18f. They are not compatible, the setup for each chip is separate.
Yes Sorry I completely skipped this one, Yes i did change the header file to 12F510 , while programming.

I posted the code which was working for 18F4520. so yes i did change the header file.
 
I do not see the pin assignment.

You have to define the direction of the pin (IN/OUT) and then clear any Analog (ANSEL) registers associated with the Pins.
 
Ok, good. Now with the pic12's the oscal value can be lost during programming - especially if you are not using mplabs ide. What programmer and ide are you using?
 
Do you really want to battle these OSCCAL (and other) problems with 10-year old chips? Why not to try PIC12F1501?
 
Ok, good. Now with the pic12's the oscal value can be lost during programming - especially if you are not using mplabs ide. What programmer and ide are you using?
Initially i was trying MPLAB IDE but since it was not working i used, pickit3 standalone software which i had shared previously.
i read multiple forums wherein most of them suggest pickit 3 is a problem while using microchips baseline controllers.

i am clueless on how to go about with it now. :(
 
There is your issue - when using mplabs, osscal is preserved. Third party programs do not, AFAIK. The chip might be wasted at this point. Do a web search for resetting osscal and see what comes up.
 
Top