Jump to content

J5 DIN in C


John_Swenson
 Share

Recommended Posts

I'm building some simple boxes with just a few buttons. In the past I did this using the J5 DIN routines written in ASM. I don't see equivalents in the C wrapper. I want to do these projects with C, so I need some way of getting the J5 functionality in C.

I presume I could either rewrite the ASM routines in C, or leave them in ASM and link them in with the C main program, but then I would need a J5 wrapper, correct? Given that one of the functions is an ISR, that might be a little tough to write in C.

Any hints on the best way to do this?

Thanks,

John S.

Link to comment
Share on other sites

Hi John,

I presume I could either rewrite the ASM routines in C, or leave them in ASM and link them in with the C main program, but then I would need a J5 wrapper, correct?

yes. And you would have to overwork some parts of the j5_din source, since it uses macros, which are not compatible with gpasm (this reminds me, that I wanted to search for a solution for this compatibility problem)

Given that one of the functions is an ISR, that might be a little tough to write in C.

I guess, that the code in J5_DIN_Update wouldn't run much longer if written in C, because there isn't that much data handling. It should look similar to this:


unsigned char j5_din_status, j5_din_status_changed;

void j5_din_update(void)
{
  unsigned char tmp = (PORTA & 0x0f) | ((PORTA & 0x20)>>1) | (PORTE << 5);
  j5_din_status_changed |= j5_din_status ^ tmp;
  j5_din_status = tmp;

[/code]

Best Regards, Thorsten.

Link to comment
Share on other sites

  • 3 months later...

It's a little bit hard for me to understand.

I'm really bad in ASM, so what's the easiest way to use the j5 as a digital input? I download the zip who explains this with the code, but I don't understand everything. How use the ASM code with my existing C code?

Link to comment
Share on other sites

??? well it's really hard for me. I compare the code but I don’t understand. If I want to use j5 as a digital input, I must put some files of j5_din_v1_3 in my sdcc_skeleton, but not all. The link between the files is hard to understand for me. I make some tests, but it’s not a good way. Programming is not my cup of tea but I try to understand.  :'(

Link to comment
Share on other sites

May I suggest reading all of this: http://publications.gbdirect.co.uk/c_book/ and all of the PIC18f452 datasheet, and all of the ASM source code. Once you understand all of that, you'll understand what the code is doing :) Maybe I've misunderstood though, if there is something in particular that you'd like to know then ask away :)

Link to comment
Share on other sites

Hi HawThorn,

there are two different ways on how to use buttons without the need of a DIN-Board and that is what you want, right?

Further, I assume you want to code your own application rather than using a pre-existing one?

Option 1: wire your switches to some spare AIN-pins (J5 of Core). Whenever a pin-state changes, you'll be notified by AIN_NotifyChange(). You just have to check if (pin_value > 512)

Option 2: wire your switches with a resistor (!) to any spare pin of the core module. Consult "mios_pin_list.txt" (it's also in the download section of uCApps.de) to find the appropriate pins and their equivalent names (e.g. RA5 for J5, pin4). With this option you don't have no handy notifier function, you'll have to implement some checking method within a timer. If you are not used to C, I'd recommend option 1!

However, there is a relatively new thread that covers most of these two concepts in detail: http://www.midibox.org/forum/index.php?topic=6754.0

Hope this helps,

;) Michael

Link to comment
Share on other sites

Hello...

Well I think I understand (and it's working).

I use this code

void Init(void) __wparam
{
  // initialize the AIN driver
  MIOS_AIN_NumberSet(2);   // just 2 buttons for my test
  MIOS_AIN_UnMuxed();      // no AINX4 modules are used
  MIOS_AIN_DeadbandSet(0xFE); // 0 or 254...  
}
And this one
void AIN_NotifyChange(unsigned char pin, unsigned int pin_value) __wparam
{
   MIOS_LCD_Clear(); 
   MIOS_LCD_CursorSet(0x00);
   MIOS_LCD_PrintBCD3(pin);  // to see the pot when he change his state
   MIOS_LCD_CursorSet(0x40);
   MIOS_LCD_PrintBCD3(pin_value); // to see the value of the pot
}

I use switches with resistor like this http://www.ucapps.de/mios/j5_din.pdf

And it’s working  :)

Some question more:

Ideally the value of my switch must be 0 or 255… but some time it’s 254 or 48 or anything else. Is it a problem of my button (really bad one)? It’s not a problem for my application but I want to know.

slowly but surely

Laurent

Link to comment
Share on other sites

You should set the AIN_DeadbandSet(7), so that it's optimized for 7bit values. This is also the default setting.

Remember that it's a 10bit value in <pin_value>. 10 bit means a range from 0 to 1023!

And that means you should invoke an if-statement:

[tt]if(pin_value > 512) {

  // ON

} else {

  // OFF

}[/tt]

;)

Michael

Link to comment
Share on other sites

  • 2 years later...
  • 2 weeks later...

Hi demym,

I never tried this, but I am quite sure that you can use the function, though it's not (yet?) documented in the function list. But it is defined in mios (j5_io.inc in mios_base_v1_0b) :

;; --------------------------------------------------------------------------
;;  FUNCTION: J5_IO_Init
;;  DESCRIPTION: This function initializes J5 as digital IO port.
;;  The "TRIS" (tristate) flags are expected as parameter.
;;  - if 1: pin used as input
;;  - if 0: pin used as output
;;
;;  Pin Mapping:
;;    Pin #0: RA.0
;;    Pin #1: RA.1
;;    Pin #2: RA.2
;;    Pin #3: RA.3
;;    Pin #4: RA.5
;;    Pin #5: RE.0
;;    Pin #6: RE.1
;;    Pin #7: RE.2
;;  IN:   tristate flags in WREG
;;  OUT:  -
;;  USES: MIOS_PARAMETER1
;; --------------------------------------------------------------------------
_J5_IO_Init			; (for C)

Best,

Michael

Edit:

the function is part of a module, that can be additionally added to enhance the available base functionalities of mios. The extra modules can be found inside the mios_base folder inside /modules

Link to comment
Share on other sites

So,

can't i use that function in C ?

I've put J5_IO_Init(0x0f) in my Init event, but doesn't compile, this is the output:

main.c:76: warning 112: function 'J5_IO_Init' implicit declaration

main.c:76: error 101: too many parameters

make: *** [_output/main.o] Error 1

thx

Link to comment
Share on other sites

Hi,

You have to add the j5_io module to your project ;)

Here's how that works:

Integration Hints

~~~~~~~~~~~~~~~~~

C based Applications

~~~~~~~~~~~~~~~~~~~~

  1) Makefile: add "j5_io.o" to OBJS variable

  2) Makefile: include j5_io.mk' date=' and enhance J5_IO_DEFINES if required:

---

# include J5_IO driver

J5_IO_DEFINES += -DJ5_IO_DONT_USE_INPUT_FUNCTIONS=1

include $(MIOS_PATH)/modules/j5_io/j5_io.mk

---

  3) main.c: #include <j5_io.h>

  4) main.c: add J5_IO_Init(<tris-value>) to Init() hook

    <tris-value>: e.g. 0x00 for output, 0xff for input,

                  0xf0 for upper pins input and lower pins output

[/quote']

Hope that helps

Best,

Michael

Link to comment
Share on other sites

  • 4 weeks later...

Hi, i'm still trying to do mixed DIN/DOUT using J5.

So i used  J5_IO_Init(0x0f) in my code (J5 0-3 for DIN and J5 4-7 for DOUT).

The DOUT part of the circuit works (i've connected 4 leds, with a 470 ohm resistor, and leds switch on-off correctly, based on my midi commands to the core).

But for the DIN part, i have connected 10k resistors to J5 0-3, and also connected the switches (which, as for the little i can understand, when in ON state they send those pins to ground).

I've also implemented this code in AIN_NotifyChange (based on some earlier info in this thread) :

valore=0;

if (pin_value>512) valore=1;

for (i=0; i<4; i++)

{

  J5_IO_PinSet(i, valore); 

}

MIOS_MIDI_TxBufferPut(192);

        MIOS_MIDI_TxBufferPut(2);

(i wanted to generate a MIDI event to see, in MIOS Studio, if something happens when i press the button...)

But nothing happens..

Also, i've noticed that using a 10k resistor, as shown in the j5_din.pdf, voltage on the pins is 0.3V when the button is open, and, obviously, 0V when i press the button..  Is it correct that this small voltage variation could be catched in AIN_NotifyChange ?

What am i doing wrong ? I followed the schematics in j5_din.pdf (with the only exception that i'm using pins 4-7 for DOUT and 0-3 for DIN).

Also, in the init function i also have this code (copied from this thread), after the J5_IO_Init(0x0f) :

  ADCON1 = 0x07;

  TRISA &= 0xd0;

  TRISE &= 0xf8;

I've tried to comment out these three instructions, but the device seems to be working in the same exact way. Are those instructions necessary, as i'm using the J5_IO_Init(0xF) ?

Thanks in advance.

Have a nice time

Link to comment
Share on other sites

But for the DIN part, i have connected 10k resistors to J5 0-3, and also connected the switches (which, as for the little i can understand, when in ON state they send those pins to ground).

Yeh kinda... the pins are tied to +5V normally, and when the switch is on, it allows the 5V to flow to GND (via the resistor, otherwise it would be a short circuit) instead of the PIC pin,

I've also implemented this code in AIN_NotifyChange (based on some earlier info in this thread) :

valore=0;

if (pin_value>512) valore=1;

for (i=0; i<4; i++)

{

  J5_IO_PinSet(i, valore); 

}

MIOS_MIDI_TxBufferPut(192);

         MIOS_MIDI_TxBufferPut(2);

That code was intended to show you how to use an AIN as a binary input... doesn't really apply here... plus, you're trying to set the pins 0...3 which you have configured as an input ;)

Also, i've noticed that using a 10k resistor, as shown in the j5_din.pdf, voltage on the pins is 0.3V when the button is open, and, obviously, 0V when i press the button..  Is it correct that this small voltage variation could be catched in AIN_NotifyChange ?

AIN Notify has nothing to do with it, you are not using the MIOS AIN functions any more, as you have used the J5IO module instead, to interface those pins.

Anyway, those pins should be tied high with no switch in place, so you should be reading 5V from them. Check your wiring... (you can post a pic if you like!)

Also, in the init function i also have this code (copied from this thread), after the J5_IO_Init(0x0f) :

  ADCON1 = 0x07;

  TRISA &= 0xd0;

  TRISE &= 0xf8;

Firstly that is not required as J5IO does that already (in the init as I think you've guessed). That probably breaks it (in addition to the above issues). Code-wise, just follow the example app, and you'll be set.

Secondly that code does not support newer PICs like 4620 and 4685.

HTH!

Link to comment
Share on other sites

Ok, that was a very clear explanation...

But.. maybe it's obvious....so where do i catch J5 DIN events ? Into function  DIN_ToggleNotify ? Thought it was only reserved for 'normal' DIN operation, not J5

The schematics i've used is this:

j5_din.jpg

In this schematic it seems that closing the button ties pins directly to ground... is it correct ?

Sorry for missing of understanding :-)

Thanks a lot, by the way

Link to comment
Share on other sites

Sorry I missed that bit  :)

Somebody will correct me if i'm wrong but I 'think' that you will need to call J5_IO_PinGet() (or J5_IO_Get()) and then compare the result with the result of the previous call to see if anything has changed.

I would think that it will need polling fairly frequently.....

Cheers

Phil

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...