From: Ivan P. <iva...@gm...> - 2008-01-28 18:06:10
|
Hello, I'm new to SDCC and microcontrollers - my first two very simple programs burned into PIC16F88 and working! :) Now I'm trying something little harder than just lighting LEDs - I want to try the interrupt system. PIC16F88 has one external interrupt - on pin RB0. I'm trying the following very simple program, but something is wrong: #define __16f88 #include"pic/pic16f88.h" typedef unsigned int word; word at 0x2007 __CONFIG = 0x3f70; void isr_high(void) interrupt 1 { if (RB0 == 1) RA1 = 0; } void main(void) { TRISA = 0; while(1) { RA1 = 1; } } I expect when I run this to have pin RA1 '1', untill RB0 is pulled '1'. Then RA1 should go '0' untill RB0 is released. I'm running that at gpsim and there RA1 is always '1'. When I run the program step by step I see it never enters the interrupt code section. So, how can I define an interrupt? I've searched a lot through the documentation of SDCC and the only piece of value I've found is the 'void isr_high interrupt 1' function I'm using. Is there a more complicated/simplified way to code an interrupt? Thanks, Ivan. |
From: Joel L. <jl...@ia...> - 2008-01-30 07:22:22
|
Ivan, Try replacing the 1 with a 0. This will place the ISR at 0x0003, where the PIC expects it. void isr_high(void) interrupt 0 { ... Joel On Jan 28, 2008 12:06 PM, Ivan Petrushev <iva...@gm...> wrote: > Hello, > I'm new to SDCC and microcontrollers - my first two very simple > programs burned into PIC16F88 and working! :) > Now I'm trying something little harder than just lighting LEDs - I > want to try the interrupt system. > PIC16F88 has one external interrupt - on pin RB0. > I'm trying the following very simple program, but something is wrong: > #define __16f88 > #include"pic/pic16f88.h" > > typedef unsigned int word; > word at 0x2007 __CONFIG = 0x3f70; > > void isr_high(void) interrupt 1 { > if (RB0 == 1) RA1 = 0; > } > void main(void) { > TRISA = 0; > while(1) { > RA1 = 1; > } > } > > I expect when I run this to have pin RA1 '1', untill RB0 is pulled > '1'. Then RA1 should go '0' untill RB0 is released. > I'm running that at gpsim and there RA1 is always '1'. When I run the > program step by step I see it never enters the interrupt code section. > So, how can I define an interrupt? I've searched a lot through the > documentation of SDCC and the only piece of value I've found is the > 'void isr_high interrupt 1' function I'm using. > > Is there a more complicated/simplified way to code an interrupt? > > Thanks, > Ivan. > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > |
From: Jean-Paul <tch...@fr...> - 2008-01-30 07:59:09
|
Hello Ivan, The task you are describing is as simple as RA1 =3D !RB0. To use interrupts in any controller (so in PICs too), you have several thin= gs=20 to configure: =2D choose whether the interrupt routine will react to a state or to an edg= e; =2D choose that an ISR will react at all, i.e. allow interrupts in general,= the=20 one you use in particular, once before entering the main loop. In the interrupt service routine itself, two cases are possible according t= o=20 the type and model of controller: =2D the flag that is set by the interrupting event gets reset by hardware u= pon=20 execution of the ISR; or =2D you have to explicitly reset the flag yourself inside the ISR. Either way, the flag has to be reset. You'll want to check all that in the specs of your controller, then code yo= ur=20 program so that: =2D interrupts are allowed for both edges on RB0 (startup); =2D RA1 =3D 0 upon a trailing (falling) edge (ISR) =2D RA1 =3D 1 upon a leading (rising) edge (ISR) =2D The main loop will do nothing, that's the idea with interrupts. It's not that terrible, Ivan ;-) Regards JP Le Lundi 28 Janvier 2008 19:06, Ivan Petrushev a =E9crit=A0: > Hello, > I'm new to SDCC and microcontrollers - my first two very simple > programs burned into PIC16F88 and working! :) > Now I'm trying something little harder than just lighting LEDs - I > want to try the interrupt system. > PIC16F88 has one external interrupt - on pin RB0. > I'm trying the following very simple program, but something is wrong: > #define __16f88 > #include"pic/pic16f88.h" > > typedef unsigned int word; > word at 0x2007 __CONFIG =3D 0x3f70; > > void isr_high(void) interrupt 1 { > if (RB0 =3D=3D 1) RA1 =3D 0; > } > void main(void) { > TRISA =3D 0; > while(1) { > RA1 =3D 1; > } > } > > I expect when I run this to have pin RA1 '1', untill RB0 is pulled > '1'. Then RA1 should go '0' untill RB0 is released. > I'm running that at gpsim and there RA1 is always '1'. When I run the > program step by step I see it never enters the interrupt code section. > So, how can I define an interrupt? I've searched a lot through the > documentation of SDCC and the only piece of value I've found is the > 'void isr_high interrupt 1' function I'm using. > > Is there a more complicated/simplified way to code an interrupt? > > Thanks, > Ivan. > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user =2D-=20 Never jump into a loop! |
From: Gonzalo F. P. P. <gon...@ya...> - 2008-01-30 12:52:14
|
take a look at this page http://www.micahcarrick.com/04-26-2005/pic-interrupts-gpsim.html --- Jean-Paul <tch...@fr...> escribió: > Hello Ivan, > > The task you are describing is as simple as RA1 = > !RB0. > > To use interrupts in any controller (so in PICs > too), you have several things > to configure: > - choose whether the interrupt routine will react to > a state or to an edge; > - choose that an ISR will react at all, i.e. allow > interrupts in general, the > one you use in particular, once before entering the > main loop. > > In the interrupt service routine itself, two cases > are possible according to > the type and model of controller: > - the flag that is set by the interrupting event > gets reset by hardware upon > execution of the ISR; > or > - you have to explicitly reset the flag yourself > inside the ISR. > Either way, the flag has to be reset. > > You'll want to check all that in the specs of your > controller, then code your > program so that: > - interrupts are allowed for both edges on RB0 > (startup); > - RA1 = 0 upon a trailing (falling) edge (ISR) > - RA1 = 1 upon a leading (rising) edge (ISR) > - The main loop will do nothing, that's the idea > with interrupts. > > It's not that terrible, Ivan ;-) > > Regards > JP > > Le Lundi 28 Janvier 2008 19:06, Ivan Petrushev a > écrit : > > Hello, > > I'm new to SDCC and microcontrollers - my first > two very simple > > programs burned into PIC16F88 and working! :) > > Now I'm trying something little harder than just > lighting LEDs - I > > want to try the interrupt system. > > PIC16F88 has one external interrupt - on pin RB0. > > I'm trying the following very simple program, but > something is wrong: > > #define __16f88 > > #include"pic/pic16f88.h" > > > > typedef unsigned int word; > > word at 0x2007 __CONFIG = 0x3f70; > > > > void isr_high(void) interrupt 1 { > > if (RB0 == 1) RA1 = 0; > > } > > void main(void) { > > TRISA = 0; > > while(1) { > > RA1 = 1; > > } > > } > > > > I expect when I run this to have pin RA1 '1', > untill RB0 is pulled > > '1'. Then RA1 should go '0' untill RB0 is > released. > > I'm running that at gpsim and there RA1 is always > '1'. When I run the > > program step by step I see it never enters the > interrupt code section. > > So, how can I define an interrupt? I've searched a > lot through the > > documentation of SDCC and the only piece of value > I've found is the > > 'void isr_high interrupt 1' function I'm using. > > > > Is there a more complicated/simplified way to code > an interrupt? > > > > Thanks, > > Ivan. > > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by: Microsoft > > Defy all challenges. Microsoft(R) Visual Studio > 2008. > > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > _______________________________________________ > > Sdcc-user mailing list > > Sdc...@li... > > > https://lists.sourceforge.net/lists/listinfo/sdcc-user > > -- > Never jump into a loop! > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio > 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Sdcc-user mailing list > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > Tarjeta de crédito Yahoo! de Banco Supervielle. Solicitá tu nueva Tarjeta de crédito. De tu PC directo a tu casa. www.tuprimeratarjeta.com.ar |
From: Jean-Paul <tch...@fr...> - 2008-01-30 13:40:21
|
Hello Gonzalo, I'm using Flowcode (TM) for PIC's. With SDCC, I program only 51's. The purpose of my previous post was to give our friend Ivan, who says himse= lf=20 new in microcontrollers, a first view over the working of interrupts in=20 general. Now, thanks to you and your link, he'll have a closer view on the specifics= of=20 PIC. Regards JP Le Mercredi 30 Janvier 2008 13:51, Gonzalo Fernando Perez Paina a =E9crit= =A0: > take a look at this page > http://www.micahcarrick.com/04-26-2005/pic-interrupts-gpsim.html =2D-=20 Never jump into a loop! |