C Electronics LEDs PIC Tindie

@tymkrs TTL-8

TYMKRS TTL-8

I’ve been watching for the release of the tymkrs ttl-8 ( no -me ?) for some time now. @whixr had been showing it off in a MIDI project on one of their YouTube videos a while back and I thought it was a great little breadboard-hackers tool. Is it magic? No it’s a shift register.. but a worthy bench-top tool for sure. For $6 this board showed up in the mail box a couple of days after purchase… Atdiy is pretty prompt about shipping.

I also have plans on putting this to use while troubleshooting a MIDI project I’m working on for my brother but I’m sure this little board will come in handy for all sorts of purposes.

So like all items I buy off Tindie* I had to check it out right away! My workshop is about half packed for the move but I suspect my bench top items will wait for last so I still had the tools to check this item out; In full tradition of moving, my bench top items will also be first to move into the new house ;)

* with exception for the Minishift and CPLD dev board; someday..
I wrote up some basic code to shift out a counter in my main loop to test this board out; nothing special but it got the job done. There isn’t much to go wrong.. and in fact the task was pretty vanilla; nothing went wrong.

The tymkrs TTL-8 up close...
The tymkrs TTL-8 up close…

 

The test code.. [Edit: my code works with no delays built in.. at 4MHz (I tested this), whixr runs these faster and has ganged many of these together but adds capacitors for filtering on power mentioned adding a ceramic cap between the clock and ground after about 5 chained boards]


/*
 * File:   main.c
 * Author: Charles M Douvier
 * Contact at: http://iradan.com
 *
 * Created on September 26, 2014, 2:47 PM
 *
 * Target Device:
 * 16F1509 on Tautic 20 pin dev board
 *
 * Project: ttl-8 test
 *
 *
 * Version:
 * 1.0
 *
 */
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 //4Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

#include 
#include 
#include 
#include 


//config bits
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=ON, CP=OFF, BOREN=ON, CLKOUTEN=OFF, IESO=OFF, FCMEN=OFF
#pragma config WRT=OFF, STVREN=OFF, LVP=OFF

#define _XTAL_FREQ 4000000 //defined for delay
 

/*
 *
 */
int r;
unsigned char n;

void init_io(void) {

    ANSELA = 0x00; // all port A pins are digital I/O
    ANSELB = 0x00; // all port B pins are digital I/O
    ANSELC = 0x00; // all port B pins are digital I/O

    TRISAbits.TRISA0 = 0; // output
    TRISAbits.TRISA1 = 0; // output
    TRISAbits.TRISA2 = 0; // output
    TRISAbits.TRISA3 = 0; // output
    TRISAbits.TRISA4 = 0; // output
    TRISAbits.TRISA5 = 0; // output

    TRISBbits.TRISB4 = 0; // output
    TRISBbits.TRISB5 = 1; // input
    TRISBbits.TRISB6 = 0; // output
    TRISBbits.TRISB7 = 0; // output

    TRISCbits.TRISC0 = 0; // output
    TRISCbits.TRISC1 = 0; // output
    TRISCbits.TRISC2 = 0; // output
    TRISCbits.TRISC3 = 0; // DATA OUT
    TRISCbits.TRISC4 = 0; // CLOCK
    TRISCbits.TRISC5 = 0; // LATCH
    TRISCbits.TRISC6 = 0; // output
    TRISCbits.TRISC7 = 0; // output

}

void latch(void) {
    PORTCbits.RC5 = 1;  //latch bump
    __delay_us(10);      //this is slow.. that's okay for me
    PORTCbits.RC5 = 0;
}

void clk(void){
    PORTCbits.RC4 = 1;  //set clock
    __delay_us(5);      //this is slow.. that's okay for me
    PORTCbits.RC4 = 0;
}

void shift_out (unsigned int x){
    r = 8;

    while(r){
        if (x & 0b10000000){
            LATCbits.LATC3 = 1;

        }
        else{
            LATCbits.LATC3 = 0;
        }

        clk();
        x = x << 1;
        --r;
        LATCbits.LATC3 = 0;
    }

    latch();
}

int main(void) {

    // set up oscillator control register, using internal OSC at 4MHz.
    OSCCONbits.IRCF = 0x0d; //set OSCCON IRCF bits to select OSC frequency 4MHz
    OSCCONbits.SCS = 0x02; //set the SCS bits to select internal oscillator block
    //OPTION_REGbits.nWPUEN = 0; // enable weak pullups (each pin must be enabled individually)

    init_io();

    latch();

    while (1) {

        n = n+1;;

        shift_out(n);

        __delay_ms(50);

    }
    return (EXIT_SUCCESS);
}


TTL-8 what comes in the bag..
TTL-8 what comes in the bag..

This I would have done different:

We all have different needs for our tools; I believe this board layout worked for their projects and made sense, it just wouldn’t have been how mine would have been laid out. As you can tell from the first photo I chose to use my own.

I would have opted for side mounted port in/out connections with right angle connectors. I would have also added a pair of mounting holes. My layout would have increased the cost of the board by about 30%. That’s fine and dandy for *me*….the tymkrs are obviously targeting breadboard-hackers with this board which makes more sense; the outputs on the board could have a right angle connector (not included, pennies on eBay) soldered on and plugged into a breadboard while you had jumpers come in from your micro to plug into a right angle female connector of choice. The LEDs would then be the correct orientation for normal viewing (reading 0 on the left).  The current board size is a compact 1.15 in (29mm) by 0.65 in (11.5mm) or about .75 in²; my alterations would have pushed it up to just over 1 in².

 

C Microcontrollers RF

PIC talks UART on RF – 434 MHz | 0xEE.net

PIC talks UART on RF – 434 MHz | 0xEE.net.

A cross post of the latest 0xEE.net article on using cheap RF modules with PIC Microcontrollers streaming serial using parity.

Electronics Test Equipment

How is my Saleae Logic 8 Logic Analyzer working out?

IMG_5241
I received my Saleae Logic 8 analyzer in the mail a few days ago. I pre-ordered it maybe a day or two after they opened up pre-orders for their new logic analyzers earlier this year. Last I checked they haven’t started shipping the Logic Pro 8/16 yet (USB 3.0/faster). I ordered the Logic 8 as I typically use the LA for 100KHz I2c and *kbaud serial analysis. Today I used it to check some singles on a microcontroller (16F1509). I flashed the micro with some sample code to confirm it worked; it did. The LA worked just fine but I noticed something and I’m not sure if it’s an over zealous algorithm, inductance, a ghost or what? I get a lot more wiggle in the analog display in the LA app than I do on my scope. Full disclosure: my scope has not been calibrated for over two years I still trust it’s input and I use it in the 10MHz+ range all the time, seems pretty solid. This is a 100ms transition off and on. I’ll be keeping my eye on this.. naturally I checked this at max sample rate (25MHz) after I noticed this.. same wiggle.

 

The digital and analog signal shown in Saleae Logic 1.1.24 beta using a Logic 8
The digital and analog signal shown in Saleae Logic 1.1.24 beta using a Logic 8

 

The same signal (channel 0) on a 60MHz Tektronix TDS1002B scope screenshot; I trust the scopes input.
The same signal (channel 0) on a 60MHz Tektronix TDS1002B scope screenshot; I trust the scopes input.

The same signal but with the analog view in 8x mode:

saleae-4
I read through the online manual but I suspect the beta software documentation is lagging behind a bit. Version 1.1.21 said there was a “New voltage measurement tool for analog”.. I see there is a .25 just out so I’ll try that. Still, regardless I have zero regrets and love this thing. I like the bigger form.. I’m also glad they have these black ground clips but wish they would make two changes.

1. Channel 0 is a black leaded wire.. like all the grounds. Maybe white or any other color?

2. In the older application the channels were color coded in the application to match their wire leads.. that was nice :)

.. ask and though shall receive.. I downloaded 1.1.25 and there was my voltages. Didn’t even get to draft!

saleae-5

 

This is a great tool and a must-have if you’re doing any kind of microcontroller work. Maybe I’ll try the Logic Pro’s out once they get caught up with all the pre-orders.

Uncategorized

Big changes for the workbench coming soon, a new address!

We are looking for a new home and our offer for a house we liked has been accepted. Pending some post-inspection requests and VA appraisal we should be closing on the new home in ~30 days? Who knows the real date.. sooner the better for us of course.

Of course a workshop area was on my “must-have” list while looking. Luck would have it my wife’s favorite house came with ample workshop area. It’s apart from the house but has full power and is quite nice. It’s loaded with stuff they’re using to fix up a few items that need attention with the home. So it’s a bit messy in the photo taken here.

photo from inspection
photo from inspection

The new workshop will give me ~120 ft2 which is roughly half the space I have now. It’s also has some additional store space and is laid out well.

Unfortunately this move means I’ll be a little lacking on the content on the blog as I have been for a few weeks now (vacation followed by a couple weeks of house buying). I’ll be packing up much of my shop shortly, my blogging activities will be strictly writing.

The home will have some free space in which I might be able to host some hackerspace activities for the a while if there is ever interest beyond one other person. We’re located close to downtown Everett, WA. I’d like to get 4 or 5 people together as a start–as always let me know if you’re interested. Thanks for stopping by and I look forward to getting back to some quality bench time in the near future.

C Electronics i2c Microcontrollers PIC

AD5246 I2C Digital Resistor+PIC 16F1509 Test Circuit

As part of a larger MIDI project I was looking for some digital resistors. With any project I try to tackle the parts I think I’m going to have the most problem with first, of course it rarely works out I choose the difficult bits… this was the case with these resistors, they’re super simple.

A simple circuit with the PIC dev board, the SC70-6 i2C resistor and some pull up resistors (don't forget those!) I'm running 5V using 10k here..
A simple circuit with the PIC dev board, the SC70-6 i2C resistor and some pull up resistors (don’t forget those!) I’m running 5V using 10k here..

My last adventure with I2C took me a while to beat into submission so I thought I would start with this. I have ordered a enough SOIC/SC70/TSSOP, etc. breakout boards to be considered borderline hoarding. All the fun stuff comes in small packages which makes sense for placing it in a product but it’s no fun when you’re just trying to check something out. I recommend grabbing some if you haven’t already. I’m not brave enough to shoot from the hip and have boards fabed without at least testing the stuff I’m questionable about… granted in this case I2C hardware is pretty simple.  I popped my first Analog Devices AD5246BKSZ10 (Digi-Key Part number: AD5246BKSZ10-RL7CT-ND )  on to a little SIP package breakout board.. I eventually gave up on the SIP package. I hand-soldered it and it must have had some little bits under the package. I grabbed a DIP package breakout and threw some chipquick down then used my 858D to reflow the tiny SC70-6 package.

A little breakout board, I bought a ton of these on eBay for SC70-6 and others..
A little breakout board, I bought a ton of these on eBay for SC70-6 and others..

On power up the resistor defaults to mid-span (with no command).. that’s kind of nice but I will have to consider that when integrating this to a project; In my case that is 5K (of 10k). I hacked up some recent I2C code for quick dev … it was a no-brainer really. The 10K resistor I have centers out at 5.00K but its top side is 9.90K .. not a big deal for me. The resistance data command is 7bit, 0x00 to 0x7F takes you from 0 Ohms to 10K. If you did the math that’s 78 Ohm steps… There is a 5K, 10K, 50K and a 100K version in this series and they can only handle 5mA of current. I will consider putting in a typical passive resistor in series to limit the possible current through the resistor if that will be an issue.

Some thoughts I had..

Pros:

  • Easily adaptable to an all analog circuit
  • tiny!
  • great for firmware calibration! no tiny pots in a case you have to open
  • Doesn’t power up at 0 Ohm!  (this might be  a con for you..)

Cons:

  • Not addressable (it’d be nice if it was a 8 pin package to select between 4 different addresses)
  • Tiny package if you’re trying to hand-solder a project
  • No so good if you need very fine resolution

 

No surprises really.. So here’s the goodies: a screen shot of the I2C write command for max resistance followed by the code.

The i2c command was super simple, start, address,n a 7-bit value 0x00 - 0x7F, stop!
The i2c command was super simple, start, address,n a 7-bit value 0x00 – 0x7F, stop!

 

 


/* 
 * File:   main.c
 * Author: Charles M Douvier
 * Contact at: http://iradan.com
 *
 * Created on September 14, 2014, 8:06 AM
 *
 * Target Device:
 * 16F1509 on Tautic 20 pin dev board
 *
 * Project: Digital Resistor Test
 *
 *
 * Version:
 * 1.0  Initial Code to Test Wiper
 *
 *
 *  AD5246BKSZ10-RL7
 *  I2C Address 0x5C (Write)
 *  Resistor I2C
 *  Write S 0 1 0 1 1 1 0 W A X D6 D5 D4 D3 D2 D1 D0 A P
 *  Read  S 0 1 0 1 1 1 0 R A 0 D6 D5 D4 D3 D2 D1 D0 A P
 */
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 //4Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

#include 
#include 
#include 
#include 

//config bits
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=ON, MCLRE=ON, CP=OFF, BOREN=OFF, CLKOUTEN=OFF, FCMEN=OFF
#pragma config WRT=OFF, STVREN=OFF, LVP=OFF

#define _XTAL_FREQ 4000000 //defined for delay

    unsigned int ACK_bit;
    int i;
    unsigned char byte, tempbyte1, tempbyte2;

/*
 * 
 */
void init_io(void) {

    ANSELA = 0x00; // all port A pins are digital I/O
    ANSELB = 0x00; // all port A pins are digital I/O
    ANSELC = 0x00; // all port B pins are digital I/O

    TRISAbits.TRISA0 = 0; // output
    TRISAbits.TRISA1 = 0; // output
    TRISAbits.TRISA2 = 0; // output
    TRISAbits.TRISA3 = 0; // output
    TRISAbits.TRISA4 = 0; // output
    TRISAbits.TRISA5 = 0; // output

    TRISBbits.TRISB4 = 1; // RB4 I2C SDA, has to be set as an input
    TRISBbits.TRISB5 = 1; // RB5 = nc
    TRISBbits.TRISB6 = 1; // RB6 I2C SCLK, has to be set as an input
    TRISBbits.TRISB7 = 0; // RB7 = nc

    TRISCbits.TRISC0 = 0; // output
    TRISCbits.TRISC1 = 0; // output
    TRISCbits.TRISC2 = 0; // output
    TRISCbits.TRISC3 = 0; // output
    TRISCbits.TRISC4 = 0; // output
    TRISCbits.TRISC5 = 0; // output
    TRISCbits.TRISC6 = 1; // input
    TRISCbits.TRISC7 = 1; // input
}


void I2C_ACK(void)
{
   PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
   SSP1CON2bits.ACKDT=0;        // clear the Acknowledge Data Bit - this means we are sending an Acknowledge or 'ACK'
   SSP1CON2bits.ACKEN=1;        // set the ACK enable bit to initiate transmission of the ACK bit to the serial eeprom
   while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
}

void Send_I2C_Data(unsigned int databyte)
{
    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
    SSPBUF = databyte;              // send databyte
    while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
}

unsigned char RX_I2C_Data (void)
{

    RCEN = 1;               //
    while( RCEN ) continue;
    while( !BF ) continue;
    byte = SSPBUF;
   return byte;
}

void I2C_Control_Write0(void)
{
    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
    SSP1BUF = 0x5C;             // send the control byte (90 TCN75, EF BMP085)
    while(!PIR1bits.SSP1IF)     // Wait for interrupt flag to go high indicating transmission is complete
        {
        i = 1;
          // place to add a breakpoint if needed
        }
    PIR1bits.SSP1IF=0;

}
void I2C_Control_Write1(void)
{
    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
    SSP1BUF = 0x92;             // send the control byte (90 TCN75, EF BMP085, change this)
    while(!PIR1bits.SSP1IF)     // Wait for interrupt flag to go high indicating transmission is complete
        {
        i = 1;
          // place to add a breakpoint if needed
        }
    PIR1bits.SSP1IF=0;

}

void I2C_Control_Read0(void)
{
    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
    SSP1BUF = 0x91;             // send the control byte (90 TCN75, EF BMP085, change this)
    while(!PIR1bits.SSP1IF)     // Wait for interrupt flag to go high indicating transmission is complete
        {
        i = 1;
          // place to add a breakpoint if needed
        }
    PIR1bits.SSP1IF=0;
   }



void I2C_Start_Bit(void)
{
    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
    SSPCON2bits.SEN=1;          // send start bit
    while(!PIR1bits.SSP1IF)    // Wait for the SSPIF bit to go back high before we load the data buffer
        {
        i = 1;
        }
    PIR1bits.SSP1IF=0;
}

void I2C_check_idle()
{
    unsigned char byte1; // R/W status: Is a transfer in progress?
    unsigned char byte2; // Lower 5 bits: Acknowledge Sequence, Receive, STOP, Repeated START, START

    do
    {
        byte1 = SSPSTAT & 0x04;
        byte2 = SSPCON2 & 0x1F;
    } while( byte1 | byte2 );
}
/*
 * Send the repeated start message and wait repeated start to finish.
 */
void I2C_restart()
{
    I2C_check_idle();
    RSEN = 1; // Reinitiate start
    while( RSEN ) continue;
}

void I2C_Stop_Bit(void)
{
    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
    SSPCON2bits.PEN=1;          // send stop bit
    while(!PIR1bits.SSP1IF)
    {
        i = 1;
        // Wait for interrupt flag to go high indicating transmission is complete
    }
}

void I2C_NAK(void)
{
    PIR1bits.SSP1IF=0;           // clear SSP interrupt bit
    SSP1CON2bits.ACKDT=1;        // set the Acknowledge Data Bit- this means we are sending a No-Ack or 'NAK'
    SSP1CON2bits.ACKEN=1;        // set the ACK enable bit to initiate transmission of the ACK bit to the serial eeprom
    while(!PIR1bits.SSP1IF)     // Wait for interrupt flag to go high indicating transmission is complete
    {
        i = 1;
    }
}

void set_resistor(void)
{

    I2C_Start_Bit();                    // send start bit
    I2C_Control_Write0();               // send control byte with read set
    Send_I2C_Data(0x7F);                // Send Resistance Value Data
                                        // 0x00 - 0x7F
                                        // 0 - 10KOhm
    I2C_Stop_Bit();                     // Stop

}




int main(void) {

    // set up oscillator control register, using internal OSC at 4MHz.
    OSCCONbits.IRCF = 0x0d; //set OSCCON IRCF bits to select OSC frequency 4MHz
    OSCCONbits.SCS = 0x02; //set the SCS bits to select internal oscillator block
    OPTION_REGbits.nWPUEN = 0; // enable weak pullups (each pin must be enabled individually)

    SSPCONbits.SSPM=0x08;       // I2C Master mode, clock = Fosc/(4 * (SSPADD+1))
    SSPCONbits.SSPEN=1;         // enable MSSP port
    SSPADD = 0x09;              // 100KHz
    // **************************************************************************************

    init_io();

    __delay_ms(100);             // let everything settle.

    set_resistor();

    while (1) {
        //do something
        PORTAbits.RA0 = 0;
        __delay_ms(100);
        PORTAbits.RA0 = 1;
        __delay_ms(100);
    }
    return (EXIT_SUCCESS);
}


 

Electronics Motors VFD

Electric Scooter & new VFD update

I finally got my brother over to do some welding for me. The electric scooter is only a couple of nuts and bolts away from a complete frame. I have the core electronics finished .. so maybe this weekend I’ll be able to take it for my first test drive… I can tell I’ll need to extend my handle bar.. but that can wait for another day.

 

Work continues on the electric scooter... I got my brother to weld for me because he is better at it (but don't tell him that).
Work continues on the electric scooter… I got my brother to weld for me because he is better at it (but don’t tell him that).

The frame I build out of over priced metal stock from Home Depot.. (most of it is under the vehicle in the above photo) .. the front end is from a kid’s bike.. The motor and drive have already checked out.. don’t know what kind of speed I’ll get out of it, I doubt over 15mph or so.

 

I also scored another VFD today. It’s another Rockwell Automation VTAC9 but this one is much smaller and very bench-friendly. I have about 280VDC on the bus and I got it power up into precharge (kicks on at about 250VDC). I have another 90VDC in batteries and I thought another case (so 180V.).. I hope that’s enough to get me out of precharge or I’ll have to build a high voltage DC power supply. meh. I couldn’t finish my testing because my brother has shown up for the welding.

I scored another VFD. This one has a crap AC input but driving the DC bus direct works just fine as it has on all Rockwell Automation drives I've tried.
I scored another VFD. This one has a crap AC input but driving the DC bus direct works just fine as it has on all Rockwell Automation drives I’ve tried.

It’s front end (AC input) is dead but it looks like I can chop some jumpers to disconnect it. Though I had it hooked up when I ran up the DC input. I was running about 50 mA with the fans and UI running.  If you have one with no wires attached .. mine starts up with Terminal 1, 3, 4, 5, 6 and 7 jumpered and Terminal 8 and 9 jumpered. This base doesn’t have a “DC -” terminal like the large drive has.. so you can either tie it to the big DC bus jumpers off the capacitor board or there is a DC+ terminal and the DC- is a little single test point pin to the right of the terminals. If I have enough VDC in this house maybe I’ll be spinning a motor by the end of the week. I reprogrammed the drive already… it’s pretty self-explanatory.

 

Update: 402 VDC… still in pre-charge. I have a 150VDC power supply I’ll did out. I’m hoping 550V will do the trick.. 600VDC is nominal.

C Electronics Interface RS-232

Using Parity on the PIC 18F26K22 UART

I have been working on the next article for 0xEE.net this weekend while I recover from my week long backpacking trip. My muscles are feeling great but I took a couple good hits from sharp boulders while doing some Class 2-3 scrambling. It was well worth it of course.

A view of the lake I stayed on after a bit of a scramble up the hill.
A view of the lake I stayed on after a bit of a scramble up the hill.

In the article I’m working on I used parity on a UART. I wanted to share this snippet with you in case you ran into the same thing. I’ve never used parity with the PICs and was a little surprised to find no built in parity checking function; it’s not that big of a deal of course.. I haven’t even ever really looked. At least they allow for a 9-bit mode so you can perform your own software parity checking. No bit-banging for me this weekend. In the code below I am transmitting at a crawl.. 2,400 baud 8E1 (You’ll find out why in a while if you follow 0xEE.net). I’ll drop the receiving code here but the transmitting side uses the same code.. except I did it on a 16F1509 but the parity function is exactly the same. I feel a little embarrassed I pulled this parity function itself from the internet and forgot where I sourced it; everything else is mine. I had kept the FireFox window open to grab the URL for reference but forgot to grab it before a Windows Update restart. Regardless it was just snippet on a forum somewhere; there are a couple different versions of the same thing or lookup tables.. I felt this was the most elegant method.

 

The biggest change to normal UART use was  enabling 9 bit mode. Both on the RX and the TX side… In this case for the RX micro I didn’t need to set the TXSTA1bits.TX9 because I’m only doing one way communication but I felt it was good for consistency.

TXSTA1bits.TX9=1; // select 9 data bits for TX

RCSTA1bits.RX9=1; // select 9 data bits for RX

One of the benefits to this particular parity code is it’s none destructive. I’ve seen more code that decimates the original variable than doesn’t. Not a big deal if you’re like me and your micros are always loafing around.

You can take this code and drop it on a TAUTIC 18F26K22 development board.. RA0 is the onboard LED.

Finally, the complete RX code:



/*
 * File:   main.c
 * Author: Charles M Douvier
 * Contact at: http://iradan.com
 *
 * Created on Sept 1 2014, 12:12 PM
 *
 * Target Device:
 * 18F26K22 TAUTIC dev board
 *
 * Project:
 *
 *
 * Version:
 * 1.0
 *
 */
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 //4Mhz FRC internal osc
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

#include 
#include 
#include 
#include 


//config bits
#pragma config FOSC=INTIO67, WDTEN=OFF, PWRTEN=OFF, CP0=OFF, CP1=OFF, BOREN=ON
#pragma config STVREN=ON, LVP=OFF, HFOFST=OFF, IESO=OFF, FCMEN=OFF

//WRT=OFF, FOSC=INTOSC, MCLRE=ON

#define _XTAL_FREQ 4000000 //defined for delay


    char    buf[10];            //buff for iota
    char    parity_rx, rx_data;


    volatile unsigned int uart_data, parity;    // use 'volatile' qualifer as this is changed in ISR
/*
 *
 */
void interrupt ISR() {

    if (PIR1bits.RCIF)          // see if interrupt caused by incoming data
    {
        parity_rx = RCSTA1bits.RX9D;  //grab parity bit first
        uart_data = RCREG;     // read the incoming data
        PIR1bits.RCIF = 0;      // clear interrupt flag
    }

}

void init_io(void) {
    TRISAbits.TRISA0 = 0; // output
    TRISAbits.TRISA1 = 0; // output
    TRISAbits.TRISA2 = 0; // output
    TRISAbits.TRISA3 = 0; // output
    TRISAbits.TRISA4 = 0; // output
    TRISAbits.TRISA5 = 0; // output


    ANSELA = 0x00; // all port A pins are digital I/O


    TRISBbits.TRISB4 = 0; // RB4 = nc
    TRISBbits.TRISB5 = 1; // RB5 = nc
    TRISBbits.TRISB6 = 0; // RB6 = nc
    TRISBbits.TRISB7 = 0; // RB7 = nc

    ANSELB = 0b00001000;     //RB3, AN9

    TRISCbits.TRISC0 = 0; // output
    TRISCbits.TRISC1 = 0; // output
    TRISCbits.TRISC2 = 0; // P1A PWM output
    TRISCbits.TRISC3 = 0; // output
    TRISCbits.TRISC4 = 0; // output
    TRISCbits.TRISC5 = 0; // output
    TRISCbits.TRISC6 = 1; // input
    TRISCbits.TRISC7 = 1; // input
    ANSELC = 0x00; // all port B pins are digital I/O
}

//not of my code.. 
unsigned char calculateparity(unsigned char scancode)
{
	unsigned char parity = 0;

	while(scancode > 0)          // if it is 0 there are no more 1's to count
	{
		if(scancode & 0x01)    //see if LSB is 1
		{
			parity++;                // why yes it is
		}
		scancode = scancode >> 1; //shift to next bit
	}

	return (parity & 0x01);  // only need the low bit to determine odd / even }
}

void uart_xmit(unsigned int mydata_byte) {

    while(!TXSTA1bits.TRMT);    // make sure buffer full bit is high before transmitting
    TXREG = mydata_byte;       // transmit data
}

void serial_init(void)
{
    //2400 8E1
    // calculate values of SPBRGL and SPBRGH based on the desired baud rate
    //
    // For 8 bit Async mode with BRGH=0: Desired Baud rate = Fosc/64([SPBRGH:SPBRGL]+1)
    // For 8 bit Async mode with BRGH=1: Desired Baud rate = Fosc/16([SPBRGH:SPBRGL]+1)



    TXSTA1bits.BRGH=1;       // select low speed Baud Rate (see baud rate calcs below)
    TXSTA1bits.TX9=1;        // select 9 data bits
    TXSTA1bits.TXEN = 1;     // enable transmit


    RCSTA1bits.SPEN=1;       // serial port is enabled
    RCSTA1bits.RX9=1;        // select 9 data bits
    RCSTA1bits.CREN=1;       // receive enabled

    /*
     *bit 2 FERR: Framing Error bit
     *1 = Framing error (can be updated by reading RCREGx register and receive next valid byte)
     *0 = No framing error
     *bit 1 OERR: Overrun Error bit
     *1 = Overrun error (can be cleared by clearing bit CREN)
     *0 = No overrun error
     *bit 0 RX9D: Ninth bit of Received Data
     *This can be address/data bit or a parity bit and must be calculated by user firmware.
     */

    SPBRG1=103;  // here is calculated value of SPBRGH and SPBRGL
    SPBRGH1=0;

    PIR1bits.RCIF=0;        // make sure receive interrupt flag is clear
    PIE1bits.RCIE=1;        // enable UART Receive interrupt
    INTCONbits.PEIE = 1;    // Enable peripheral interrupt
    INTCONbits.GIE = 1;     // enable global interrupt

         __delay_ms(50);        // give time for voltage levels on board to settle

}

int main(void) {

    init_io();
    serial_init();


    // set up oscillator control register, using internal OSC at 4MHz.
    OSCCONbits.IRCF = 0x05; //set OSCCON IRCF bits to select OSC frequency 4MHz
    OSCCONbits.SCS = 0x02; //set the SCS bits to select internal oscillator block



    while (1) {
        PORTAbits.RA0 = 0;
        if (uart_data) {

            if (RCSTA1bits.FERR) {  // Frame Error, next read will reset
                uart_data = NULL;
            }

            if (RCSTA1bits.OERR) {  // Overrun Error
                RCSTA1bits.CREN=0;       // receive disabled
                __delay_us(1);
                RCSTA1bits.CREN=1;       // receive enabled
                uart_data = NULL;
            }

            parity = calculateparity(uart_data);
            if (parity_rx == parity) {

                rx_data = uart_data;
                if (rx_data == 'a') {
                    PORTAbits.RA0 = 1;
                    __delay_ms(1);
                    PORTAbits.RA0 = 0;
                }
            }


            uart_data = NULL;   //Done
        }


 //       PORTAbits.RA0 = 1;
 //       __delay_ms(40);
 //       PORTAbits.RA0 = 0;
 //       __delay_ms(40);


    }
    return (EXIT_SUCCESS);
}

Electronics

Introducing Snohomish County Electronics Hobbyist Association

I have built this website in hopes of forming a Snohomish County (North Seattle/Everett) electronics club.

The Snohomish County Electronics Hobbyist Association

I hope to grow at least a small group of interested people for meetings.. then if we have enough interest a HackerSpace, maybe some classes, etc could follow.

Contact me if you’d like to get in on the action and help me put this together.

Uncategorized

Snohomish County HackerSpace/MakerSpace?

I wonder if there is any interest in setting up a North Seattle/SnoCo hackspace? I’m talking Lynnwood, Bothell, Everett area? Or perhaps even just an “electronics-embedded dev club” of sorts. Everything in the Seattle area is seemingly below I-90. Primary interests would be electronics, embedded development, perhaps some machining.

Send me a message or reply if you have any interest or even if you live north of Seattle and think it’s a poor idea for some reason?

 

Analog Electronics Radio RF

Amidon Toriod Experimenter Kits

I have been pushing myself to build some IF filters. I’ve never built a front end of a radio; VCO, mixer, filters.. none of it. I started by buying the Amidon Toroid Experimenters kit #2 and #3 as many of the ARRL handbook samples use Amidon part numbers. I ended up switching to another book to do all my research though; “Secrets of RF Design”. Let me let you in on the secret.. it’s a lot of reading, not all of it stimulating. I also bought the “Island Cutter” from QRPme which is probably one of my favorite purchases of the year… armed with that I started building circuits.

If you’re working about purchasing the Amidon Experimenter Kits.. well I have no regrets. It gave me a good selection of options and even some larger one’s I don’t know when I will use but maybe for a switching supply project or something. I ordered a few other small pieces I knew I’d need more than 4 of just to have them on hand.

Amidon Toroid Kits

I really enjoy the circuits around varactor diodes. I’m building an analog front end but for stability I might just end up wwitching to DDS later on but for now for the VCO is a tank circuit. Next step is the mixer..

Varactor Tank Circuit Fun

 

I probably should still be working on other things, I have a pile of “to-do”s but I needed a little inspiration to keep me at the bench after all this summer fun. My last summer outing is a 7 day backpacking trip in the northern cascades packrafting! That’ll be some seriously needed unplug time. So stay tuned… I ordered about ~$500 worth of electronics for all my up-coming fun.. looking forward to digging into it. I still need to buy an LCR meter, I’ve never owned one and it would be nice to know my inductors is/are “in the ball field” when I wind something using the tables… I can do the math but I think it’d still be nice for a confirmation before I start soldering and making measurements.

Follow

Get every new post delivered to your Inbox

Join other followers: