CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

16F1823 IOC interrupt
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
sebalitter



Joined: 05 May 2015
Posts: 47

View user's profile Send private message Send e-mail

16F1823 IOC interrupt
PostPosted: Mon Nov 04, 2024 12:09 pm     Reply with quote

Hello

the IOC_A4 interrupt is no working correctly on switching states

PCH v5.115.

Any ideas?

Code:

#include <16F1823.h>
#device adc=10
 
#fuses INTRC_IO NOWDT BROWNOUT PUT NOLVP

#use delay(clock = 4000000)           //Configuracion reloj interno

#define line_R PIN_A4
#define led_R PIN_A1

short alarm = FALSE;

void inicializacion() {

output_float(line_R);// Make pin A4 into an input.
output_drive(led_R); // Make pin A1 into an output.

//port_a_pullups(true);
    //ext_int_edge(L_TO_H);
   

    // turn on interrupts
    clear_interrupt(INT_IOC);    // Clear external interrupt flag bit
    enable_interrupts(INT_IOC_A4_L2H);
   
   
    enable_interrupts(INT_IOC);
    enable_interrupts(GLOBAL);
}



#INT_IOC
void ioc_isr(void){
 
   
    if(interrupt_active(INT_IOC_A4))
               alarm = 1;
}



void main()
{

   inicializacion();
   
           
   while(TRUE){

    if(alarm){
            output_toggle(led_R);
            delay_ms(1000);
            alarm= 0;
           //clear_interrupt(INT_IOC);
}

   }

   

}


Last edited by sebalitter on Mon Nov 04, 2024 3:30 pm; edited 2 times in total
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 2:15 pm     Reply with quote

Maybe I'm wrong, but I feel that your logic is not the soundest here. What is the point of checking if the interrupt is active once you are already there? It seems by the way you coded it, it will arrive in your interrupt routine every time there is an L2H change. You clear the interrupt. Output high led_R. Else will never get executed, since you only come there with an active interrupt and you clear that right away. How do you expect to come to the else part?

What do you want to happen? Turn on the led for 200ms on every interrupt?

And as it was reiterated here like million of times, never use delays inside interrupts. They are meant to be serviced as quickly as possible. Set a flag there, clear some bits, restart a timer, change the logic for the next interrupt. No heavy mathematics, no delays.
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 2:41 pm     Reply with quote

As a side note. Main should do all the heavy work, interrupts are there just to tell the main what to do. It depends on what you are trying to control, but it is always a good idea to run your pic as fast as it can reliably work. Gives you more instructions between two interrupts to do what interrupt commanded. Less time to come to the interrupt routine itself and less time spent there. A win-win situation.
sebalitter



Joined: 05 May 2015
Posts: 47

View user's profile Send private message Send e-mail

PostPosted: Mon Nov 04, 2024 3:18 pm     Reply with quote

PrinceNai wrote:
As a side note. Main should do all the heavy work, interrupts are there just to tell the main what to do. It depends on what you are trying to control, but it is always a good idea to run your pic as fast as it can reliably work. Gives you more instructions between two interrupts to do what interrupt commanded. Less time to come to the interrupt routine itself and less time spent there. A win-win situation.


Thanks. I changed the code but it still doesn't enter the interrupt.
Do I have to put a clean_interrupt somewhere? Are the fuses OK?
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 3:45 pm     Reply with quote

Not entering and not working correctly isn't the same :-). How do you check if the interrupt was ever fired? In your code pull-ups are not enabled (commented out).
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 3:48 pm     Reply with quote

As always, the basic 1s blink led is useful to tell if timings and settings are ok and that your Pic is alive. An example is maybe two threads down. So two questions. Does your Pic work with the desired speed? How do you know it doesn't enter the interrupt? Your new code?
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 4:24 pm     Reply with quote

Maybe this could be under sticky. The code does what you wrote, not what you thought it would do
sebalitter



Joined: 05 May 2015
Posts: 47

View user's profile Send private message Send e-mail

PostPosted: Mon Nov 04, 2024 4:29 pm     Reply with quote

PrinceNai wrote:
As always, the basic 1s blink led is useful to tell if timings and settings are ok and that your Pic is alive. An example is maybe two threads down. So two questions. Does your Pic work with the desired speed? How do you know it doesn't enter the interrupt? Your new code?


It's working now. There was a false contact on the trigger.
Could you tell me how you deal with false contacts?
What is the best way to work with prototype PCBs?
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 4:59 pm     Reply with quote

False contacts? Do yo mean debouncing?

Last edited by PrinceNai on Mon Nov 04, 2024 6:59 pm; edited 1 time in total
PrinceNai



Joined: 31 Oct 2016
Posts: 479
Location: Montenegro

View user's profile Send private message

PostPosted: Mon Nov 04, 2024 6:56 pm     Reply with quote

For the forum. What is working and what you did to make it work? Maybe your code? It will help others for sure.
sebalitter



Joined: 05 May 2015
Posts: 47

View user's profile Send private message Send e-mail

A #DEVICE required
PostPosted: Fri Nov 08, 2024 4:24 pm     Reply with quote

PrinceNai wrote:
For the forum. What is working and what you did to make it work? Maybe your code? It will help others for sure.


im trying to Sends a message when the power is cut off.

For this, use the interrupt on change and the GSM A6. together with the code you posted in
[url]
https://www.ccsinfo.com/forum/viewtopic.php?p=225208
[/url]

I will publish the code working here. let me fix some bugs first.

I can't compile, it gives me an error
functions.c:0:0: Error#128 A #DEVICE required before this line:

the header is this:

Code:

#include <16F1823.h>
//#include "test.h"                //fuses, uses
#device PASS_STRINGS = IN_RAM    //copy all the strings to RAM to allow access with pointers
#device adc=10                   //10 bit AD resolution
#device ICD=TRUE
#FUSES DEBUG                     //No Watch Dog Timer
#include <stdlib.h>

                                                                                   
#FUSES WDT                       //Watch Dog Timer
//#FUSES WDT128                    //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                        //High speed Osc, high power 16MHz-25MHz                                       
#FUSES NOBROWNOUT                //No brownout reset
#FUSES NOLVP                     //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES PUT

                                                                 
#use delay(crystal=20000000)       //20Mhz clock                                         
//#use delay(internal=32000000)                               
                                                                                         
#use rs232(parity=N,xmit=PIN_C5,rcv=PIN_C4,bits=8,stream=GSM,errors)                               
#use i2c(Master,slow,sda=PIN_C2,scl=PIN_C1 ) // ,force_hw) 

#include <defs.h>                //definitions of pins and registers
#include <string.h>
#include <ctype.h>
                                                                                   
//***********************************************************************
// includes
//***********************************************************************
#include "i2c_Flex_LCD.c"
#include <functions.c>          //all the functions       



functions.c has just some functions like

void Blink_Led (void){
output_low(OK_STATUS);
delay_ms(20);
output_high(OK_STATUS);
}

any ideas?


Last edited by sebalitter on Sat Nov 09, 2024 7:39 am; edited 1 time in total
Ttelmah



Joined: 11 Mar 2010
Posts: 19506

View user's profile Send private message

PostPosted: Sat Nov 09, 2024 4:05 am     Reply with quote

Two things.

First, your include of the lcd driver should be after the fuses.
The sequence should always be:

Processor
Fuses
Clock

Then and only then other includes.

The fuses and clock can be swapped (depends on whether you want the
clock setting to set the clock fuses, or want to override these yourself).

Now the key thing missing from what you post is the clock setting.

If that doesn't fix it, post what is in the start of your functions.c
sebalitter



Joined: 05 May 2015
Posts: 47

View user's profile Send private message Send e-mail

PostPosted: Sat Nov 09, 2024 7:42 am     Reply with quote

Ttelmah wrote:
Two things.

First, your include of the lcd driver should be after the fuses.
The sequence should always be:

Processor
Fuses
Clock

Then and only then other includes.

The fuses and clock can be swapped (depends on whether you want the
clock setting to set the clock fuses, or want to override these yourself).

Now the key thing missing from what you post is the clock setting.

If that doesn't fix it, post what is in the start of your functions.c



Sorry, I forgot to add the test.h that has all those settings. I changed it.
still getting:
functions.c:0:0: Error#128 A #DEVICE required before this line
Ttelmah



Joined: 11 Mar 2010
Posts: 19506

View user's profile Send private message

PostPosted: Sat Nov 09, 2024 8:13 am     Reply with quote

So, as I said, you need to show us the first few lines of this file,
sebalitter



Joined: 05 May 2015
Posts: 47

View user's profile Send private message Send e-mail

PostPosted: Sat Nov 09, 2024 8:20 am     Reply with quote

Ttelmah wrote:
So, as I said, you need to show us the first few lines of this file,


functions.c

Code:

void Blink_Led (void);                                                     
void Blink_CO_Led(void);                                 
void Init_GSM (void);
void Get_Baudrate(void);
void Set_Baudrate ();         
void Clear_UART_Buffer();
void Wait_OK_Response(void);
void Wait_ONLINE_Response(void);
void Wait_Arrow_Space(void);
void Check_Registration(void);
void GSM_Send(char *s);
unsigned ComposeMessage(char* Message);
// ************************** BLINK OK LED ************************************
void Blink_Led(){
   output_low(OK_STATUS);                               
   delay_ms(20);                                         
   output_high(OK_STATUS);                         
}                                         
// ************************** BLINK CO LED ************************************
void Blink_CO_Led(){
   output_low(CO_LED);                               
   delay_ms(20);                                         
   output_high(CO_LED);                                                                                                   
}

....
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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