1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

Generating PWM with TIMER2 ATMega328P

Discussion in 'AVR' started by Cantafford, Mar 18, 2017.

  1. Cantafford

    Cantafford Member

    Joined:
    Jul 5, 2015
    Messages:
    251
    Likes:
    2
    Hello,

    I have connected 2 ATMEGA328P's with SPI communication one as master one as slave. On the master MCU I have also attached a keypad. I want to read a key from that keypad and send it via SPI to the slave. I will use a test-led which will light up when the value of the key pressed is 0. I have tested the interfacing of the keypad. It works fine.

    Should be simple however I cannot seem to be able to send the value of the key pressed. I have managed to send data which I write in code but when I press a key the data does not reach the slave device for some reason.

    Here is the code for the master:
    Code (text):

    /*
     * SPI.c
     *
     * Created: 2/18/2017 10:09:10 AM
     *  Author: Paul
     */

    #define F_CPU 8000000

    //SPI master
    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>





    void SPIMasterInit(void);
    void SPIMasterSend(int key);
    int GetKeyPressed();



    int main(void)
    {
     //SPIMasterInit();
     int key;

     while (1)
     {
      key=GetKeyPressed(); // key gets read properly

      SPIMasterSend(key); // send the read value of the key!!!
     }
    }



    //SPI init
    void SPIMasterInit(void)
    {
     //set MOSI, SCK and SS as output
     DDRB |= (1<<PB3)|(1<<PB5)|(1<<PB2);
     //set SS to high
     PORTB |= (1<<PB2);
     //enable master SPI at clock rate Fck/16
     SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    }

    //master send function
    void SPIMasterSend(int key)
    {
     //select slave( SS must be pulled to ground before sending data )
     PORTB &= ~(1<<PB2);
     //send data(=1)
     SPDR=key; // this is the data sent!!!!
     //wait for transmition complete
     while (!(SPSR &(1<<SPIF)));
     //SS to high
     PORTB |= (1<<PB2);
    }

    int GetKeyPressed()
    {
          int r,c;

          PORTD|= 0X0F;

          for(c=0;c<3;c++)
          {
             DDRD&=~(0X7F);

             DDRD|=(0X40>>c);
             for(r=0;r<4;r++)
             {
                if(!(PIND & (0X08>>r)))
                {
                   return (r*3+c);
                }
             }
          }

          return 0XFF;//Indicate No key pressed
    }
     
    And here is the code for the slave device:

    Code (text):

    /*
     * slave.c
     *
     * Created: 2/18/2017 10:48:09 AM
     *  Author: Paul
     */

    //SPI slave

    #define F_CPU 8000000

    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include "lcd.h"
    #include "myutils.h"



    void SPISlaveInit(void);
    void InitLCD();

    ISR(SPI_STC_vect)
    {
     uint8_t recievedData;
     recievedData = SPDR;
     if(recievedData == 0) PORTB |= (1<<0);
    }



    int main(void)
    {
     
     int key;
     DDRB |= (1<<0); // check led set as output

     InitLCD();
     sei();

     while (1)
     {
     
     
     }
    }


    void SPISlaveInit(void)
    {
     //set MISO as output
     DDRB |= (1<<PB4);
     //enable SPI and enable SPI interrupt
     SPCR = (1<<SPE)|(1<<SPIE);
    }


    void InitLCD()
    {
        LCDInit(LS_NONE|LS_NONE);
        LCDClear();
        LCDWriteString("Test text ");
        _delay_ms(150);
        LCDClear();
    }
     


    Here is how I connected everything. Based on my code whenever I press keypad(1) the LED should light up. However the LED is off at all times.
    [​IMG]

    Please help me correct this. Thank you.
     
  2. Cantafford

    Cantafford Member

    Joined:
    Jul 5, 2015
    Messages:
    251
    Likes:
    2
    I forgot to actually call the init functions for both slave and master...it works now.
     

Share This Page