|
|
View previous topic :: View next topic |
Author |
Message |
aaronik19
Joined: 25 Apr 2011 Posts: 297
|
bits at startup |
Posted: Wed Mar 25, 2020 5:33 pm |
|
|
Dear Friends,
I have PIC18F25J11 and I have an LED connected on Pin B2. I made a simple circuit, when an interrupt is triggered on B0, the led goes high. In the main routine I made the code below:
Code: | set_tris_b(0b00000001);
enable_interrupts(INT_EXT_H2L);
enable_interrupts(GLOBAL); |
I set B0 for interrupt input and the rest are output. The problem is that when I turn on the circuit many times, B2 turns on and sometime did not light up. What could be the problem? I want it to remain off until the interrupt. I also added the code:
Code: | output_low(PIN_B2); |
but still no difference. Your help is highly appreciated. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 25, 2020 5:57 pm |
|
|
Add the line shown in bold below:
Quote: |
set_tris_b(0b00000001);
enable_interrupts(INT_EXT_H2L);
clear_interrupt(INT_EXT);
enable_interrupts(GLOBAL);
|
Also add this fuse statement:
|
|
|
aaronik19
Joined: 25 Apr 2011 Posts: 297
|
|
Posted: Wed Mar 25, 2020 6:04 pm |
|
|
Thanks for your reply. Can i ask you why you added those lines please? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 25, 2020 8:59 pm |
|
|
Quote: | set_tris_b(0b00000001);
enable_interrupts(INT_EXT_H2L);
clear_interrupt(INT_EXT);
enable_interrupts(GLOBAL);
Can i ask you why you added those lines please?
|
See section 9.1 in the PIC data sheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/39932D.pdf
Quote: |
9.1 INTCON Registers
Note:
Interrupt flag bits are set when an interrupt
condition occurs regardless of the state of
its corresponding enable bit or the Global
Interrupt Enable bit. User software should
ensure the appropriate interrupt flag bits
are clear prior to enabling an interrupt.
This feature allows for software polling. |
This means you clear it before trying to use it.
Quote: |
The problem is that when I turn on the circuit many times, B2 turns on and sometimes did not light up.
#fuses BROWNOUT
Can i ask you why you added those lines please?
|
Because the power supply for the PIC may not drop to 0 volts if you
rapidly turn the power on and off. If it doesn't drop to 0v, then the PIC
may not start up correctly. But if you enable BROWNOUT, and it will hold
the PIC in reset until the power voltage rises up to a usable level for
correct operation. |
|
|
aaronik19
Joined: 25 Apr 2011 Posts: 297
|
|
Posted: Thu Mar 26, 2020 1:37 am |
|
|
The compiler is telling me that the fuse is unknown when i insert #fuses BROWNOUT |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19516
|
|
Posted: Thu Mar 26, 2020 2:05 am |
|
|
Your chip is one of the very few PIC's that doesn't have a BROWNOUT fuse.
On yours it is always enabled on chips where the internal voltage regulator
is enabled (the F variant). So ignore this. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9228 Location: Greensville,Ontario
|
|
Posted: Thu Mar 26, 2020 5:44 am |
|
|
re:
bits at startup....
One should always read the uChip datasheet to see what bits are set/cleared or UNDEFINED at reset or startup.
RAM for instance are UNDEFINED, so any RANDOM value could be there.
Adding the preprocessor '#zero_ram' line ensures all RAM is cleared or full of zeros. If you only use a few variables, 'preset' them ( ie char a='a'; )
SFRs (Special Function Registers) , like timer or UART settings NEED to be properly initialized. Some bits of some registers may have defaults of set or cleared , others -U-, undetermined. YOU need to make sure your program configures them as YOU need. Don't trust a 'wizard' ! The wizard creates code based on someone else's idea of a 'default' probably NOT what you consdier the default should be, so it's always better to do it yourself.
Another area that can cause headaches is the actual IDE and programmer. MPLAB defaults to 'debug' mode, so it sets up the PIC for that however you need to compile in 'release' mode for the real World.The 'programmer' also has 'defaults' so be sure to check those ! You can either have the PIC main() program or the programmer control 'fuses'. |
|
|
aaronik19
Joined: 25 Apr 2011 Posts: 297
|
|
Posted: Thu Mar 26, 2020 5:11 pm |
|
|
I really appreciate your replies, but unfortunately, the bit continued to light up during starup. This is the program. I am sorry but I used a library and some of the lines might be useless.
Code: | #include <mainpic18F25j11.h>
#use fast_io(b)
#include <FlexLCD.c>
#include <DS3231.c> // include DS3231 driver source file
signed int16 chip_temp;
// DS3231 library variable declaration
RTC_Time *mytime, *alarm1;
#INT_EXT
void EXT_isr(void)
{
output_high(PIN_B2);
clear_interrupt(INT_EXT);
}
void dow_print()
{
lcd_gotoxy(17, 2);
switch(mytime->dow)
{
case SUNDAY : printf(lcd_putc, "Sun"); break;
case MONDAY : printf(lcd_putc, "Mon"); break;
case TUESDAY : printf(lcd_putc, "Tue"); break;
case WEDNESDAY: printf(lcd_putc, "Wed"); break;
case THURSDAY : printf(lcd_putc, "Thu"); break;
case FRIDAY : printf(lcd_putc, "Fri"); break;
default : printf(lcd_putc, "Sat");
}
}
void main()
{
Alarm1_Disable();
Alarm2_Disable();
enable_interrupts(INT_EXT_H2L);
clear_interrupt(INT_EXT);
enable_interrupts(GLOBAL);
IntSqw_Set(OUT_INT); // DS3231 INT/SQW pin configuration (interrupt when alarm)
Disable_32kHZ(); // disable DS3231 32kHz output
Alarm1_Enable();
delay_ms(100);
mytime->hours = 13;
mytime->minutes = 03;
mytime->seconds = 55;
mytime->dow = TUESDAY;
mytime->day = 24;
mytime->month = MARCH;
mytime->year = 20;
// write time and date to the RTC chip
RTC_Set(mytime);
delay_ms(100); // wait a second
//set up alarm
alarm1->hours = 13;
alarm1->minutes = 04;
alarm1->seconds = 00;
Alarm1_Set(alarm1, HOURS_MINUTES_SECONDS_MATCH);
Alarm1_IF_RESET();
lcd_init();
lcd_clear();
set_tris_b(0b00000001);
while(true)
{
mytime = RTC_Get();
// print time
lcd_gotoxy(1, 1);
printf(lcd_putc, "T: %02u:%02u:%02u", mytime->hours, mytime->minutes, mytime->seconds);
// print date
dow_print(); // print week day
lcd_gotoxy(1, 2);
printf(lcd_putc, "D: %02u/%02u/20%02u", mytime->day, mytime->month, mytime->year);
// read chip temperature
signed int16 chip_temp = Get_Temperature();
// print chip temperature
lcd_gotoxy(13, 1);
if (chip_temp < 0) // if temperature is negative
printf(lcd_putc, "-%02Lu.%02Lu%cC", abs(chip_temp) / 100, abs(chip_temp) % 100, 223);
else
printf(lcd_putc, " %02Lu.%02Lu%cC", chip_temp / 100, chip_temp % 100, 223);
alarm1 = Alarm1_Get();
lcd_gotoxy(1, 3);
printf(lcd_putc, "Alarm: %02u:%02u:%02u", alarm1->hours, alarm1->minutes, alarm1->seconds);
delay_ms(500);
lcd_clear();
}
} |
is there a way how I can make sure that all specifics bit are all Low? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19516
|
|
Posted: Fri Mar 27, 2020 12:43 am |
|
|
This line:
set_tris_b(0b00000001);
Will then mean that every pin of portB (except B0), will be driven by what is in the LATB register.
This register wakes with 'uuuuuuuu'. Undefined values. May be 0 or 1,
depending on luck, different chips etc. etc...
If you want to set TRIS, then _you_ have to load the register first.
Easier. Just use output_b, then load the TRIS. So:
Code: |
output_b(0); //sets all the output latches to '0'
set_tris_b(0b00000001); //now set B0 as an input
|
This way the pins will all drive low. |
|
|
|
|
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
|