Menu

728x90

468x60

Navbar

Tuesday, February 24, 2026

ATMega644P and 25AA010A SPI Bus Serial EEPROM

 Overview

The Microchip Technology Inc. 25XX010A is a 1-Kbit (8-bit x 127) Serial Electrically Erasable PROM (EEPROM). The memory is accessed via a simple Serial Peripheral Interface (SPI) compatible serial bus. The bus signals required are a clock input (SCK) plus separate data in (SI) and data out (SO) lines. Access to the device is controlled through a Chip Select (CS) input. 

ATMega644P and 25AA010A SPI Bus Serial EEPROM

Since it uses the SPI interface it can handle the clock rate up to 10MHz faster than other I2C(TWI) serial EEPROM. Its read/write cycles is up to 1M times.

25AA010A | Microchip Technology 

It has various device's package including a DIP-8 package for hobbyists prototyping.

PIC16F887 SPI 25AA010A EEPROM XC8 Example
Device Selection Table


This chip also has a model in Proteus that enable the engineer to test its operation by software.

 

PIC16F887 SPI 25AA010A EEPROM XC8 Example
Package Types and Pin Function Table

The SPI transfer and receive must have the following data bytes, instruction, address, and data.
PIC16F887 SPI 25AA010A EEPROM XC8 Example
Block Diagram, Instructions, and SPI Read Sequence
 

The read command is 0x03 follows by the EEPROM address. The EEPROM 8-bit data will shift out by the SPI read routine issued by the microprocessor. 

Writing data to the EEPROM requires around 5ms. It requires a write enable instruction before the data writing sequence able to process.

PIC16F887 SPI 25AA010A EEPROM XC8 Example
Write Enable and Disable Commands
 

Write-enable command is 0x06 while the Write-disable command is 0x04. Additionally the Write Protect (WP) pin must pull high to enable data writing.

Byte write sequence instruction is 0x02 follows by the EEPROM address and the 8-bit data. It also has a page write sequence to write a burst of 16 bytes data package. The microprocessor needs to wait around 5ms to complete data writing.
 

PIC16F887 SPI 25AA010A EEPROM XC8 Example
Byte and Page Write Sequences
 

The Read Status Register Instruction is optional you can read the device datasheet for more detail. 

ATMega644P and 25AA010A SPI Bus Serial EEPROM It's useful the for a master MCU to determine when the next read or write operation will proceed. Some programmer just use a delay function that last around 100 micro-seconds instead of using this operation.

ATMega644 and  25AA010A Interfacing

Using a dedicated SPI interface of an MCU is very fast and reliable. The internal MCU serial communication module process this serial data transmission and reception tasks.

This example show a write and read operation to the 25AA010A from a master ATMega644P SPI. Data is written to the 25AA010A prior to reading back from this chip. Then they are shown on PORTC.

ATMega644P and 25AA010A SPI Bus Serial EEPROM
Schematic

 Source Code "main.c":

  1. /*
  2. * 12-spi_25AA010A.c
  3. *
  4. * Created: 2/24/2026 2:16:04 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. #define DDR_SPI DDRB
  11. #define PRT_SPI PORTB

  12. #define DD_SS 4
  13. #define DD_MOSI 5
  14. #define DD_MISO 6
  15. #define DD_SCK 7

  16. void SPI_MasterInit(void)
  17. {
  18. /* Set MOSI and SCK output, all others input */
  19. DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
  20. /* Enable SPI, Master, set clock rate fck/16 */
  21. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  22. }

  23. void SPI_MasterTransmit(char cData)
  24. {
  25. /* Start transmission */
  26. SPDR = cData;
  27. /* Wait for transmission complete */
  28. while(!(SPSR & (1<<SPIF)))
  29. ;
  30. }

  31. void SPI_SlaveInit(void)
  32. {
  33. /* Set MISO output, all others input */
  34. DDR_SPI = (1<<DD_MISO);
  35. /* Enable SPI */
  36. SPCR = (1<<SPE);
  37. }
  38. char SPI_SlaveReceive(void)
  39. {
  40. /* Wait for reception complete */
  41. while(!(SPSR & (1<<SPIF)))
  42. ;
  43. /* Return Data Register */
  44. return SPDR;
  45. }

  46. // 93AA46B SPI EEPROM

  47. void write_enable(void){
  48. PRT_SPI&=~(1<<DD_SS);
  49. SPI_MasterTransmit(0x06);
  50. PRT_SPI|=(1<<DD_SS);
  51. }

  52. unsigned char read_status(void){
  53. PRT_SPI&=~(1<<DD_SS);
  54. SPI_MasterTransmit(0x05);
  55. SPI_MasterTransmit(0x00);
  56. unsigned char temp=SPI_SlaveReceive();
  57. PRT_SPI|=(1<<DD_SS);
  58. return temp;
  59. }
  60. void write_93AA46B(unsigned char address, unsigned char data){
  61. unsigned char temp;
  62. PRT_SPI&=~(1<<DD_SS);
  63. SPI_MasterTransmit(0x02);
  64. SPI_MasterTransmit(address);
  65. SPI_MasterTransmit(data);
  66. PRT_SPI|=(1<<DD_SS);
  67. //Check Write Busy Flag
  68. do
  69. {
  70. temp=read_status();
  71. } while ((temp&0x01)==1);
  72. }

  73. unsigned char read_93AA46B(unsigned char address){
  74. PRT_SPI&=~(1<<DD_SS);
  75. SPI_MasterTransmit(0x03);
  76. SPI_MasterTransmit(address);
  77. SPI_MasterTransmit(0xFF);
  78. unsigned char data=SPI_SlaveReceive();
  79. PRT_SPI|=(1<<DD_SS);
  80. return data;
  81. }
  82. int main(void)
  83. {
  84. /* Replace with your application code */
  85. SPI_MasterInit();
  86. PRT_SPI|=(1<<DD_SS);
  87. unsigned char temp=0, data=0;
  88. DDRC=0xFF;
  89. write_enable();
  90. while (1)
  91. {
  92. for (unsigned char i=0;i<8;i++)
  93. {
  94. write_93AA46B(i,1<<i);
  95. PORTC=read_93AA46B(i);
  96. _delay_ms(1000);
  97. }
  98. }
  99. }






I don't have a physical device for this chip. So I just tested it in a simulator.

Now I added a character LCD to display some ASCII data. 

ATMega644P and 25AA010A SPI Bus Serial EEPROM
Schematic

 

Source Code "main.c":

  1. /*
  2. * 25AA010A_1602.c
  3. *
  4. * Created: 2/24/2026 9:36:19 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. #define DDR_SPI DDRB
  11. #define PRT_SPI PORTB

  12. #define DD_SS 4
  13. #define DD_MOSI 5
  14. #define DD_MISO 6
  15. #define DD_SCK 7

  16. void SPI_MasterInit(void)
  17. {
  18. /* Set MOSI and SCK output, all others input */
  19. DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
  20. /* Enable SPI, Master, set clock rate fck/16 */
  21. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  22. }

  23. void SPI_MasterTransmit(char cData)
  24. {
  25. /* Start transmission */
  26. SPDR = cData;
  27. /* Wait for transmission complete */
  28. while(!(SPSR & (1<<SPIF)))
  29. ;
  30. }

  31. void SPI_SlaveInit(void)
  32. {
  33. /* Set MISO output, all others input */
  34. DDR_SPI = (1<<DD_MISO);
  35. /* Enable SPI */
  36. SPCR = (1<<SPE);
  37. }
  38. char SPI_SlaveReceive(void)
  39. {
  40. /* Wait for reception complete */
  41. while(!(SPSR & (1<<SPIF)))
  42. ;
  43. /* Return Data Register */
  44. return SPDR;
  45. }

  46. // 93AA46B SPI EEPROM

  47. void write_enable(void){
  48. PRT_SPI&=~(1<<DD_SS);
  49. SPI_MasterTransmit(0x06);
  50. PRT_SPI|=(1<<DD_SS);
  51. }

  52. unsigned char read_status(void){
  53. PRT_SPI&=~(1<<DD_SS);
  54. SPI_MasterTransmit(0x05);
  55. SPI_MasterTransmit(0x00);
  56. unsigned char temp=SPI_SlaveReceive();
  57. PRT_SPI|=(1<<DD_SS);
  58. return temp;
  59. }
  60. void write_25AA010A(unsigned char address, unsigned char data){
  61. write_enable();
  62. unsigned char temp;
  63. PRT_SPI&=~(1<<DD_SS);
  64. SPI_MasterTransmit(0x02);
  65. SPI_MasterTransmit(address&0x7F);
  66. SPI_MasterTransmit(data);
  67. PRT_SPI|=(1<<DD_SS);
  68. //Check Write Busy Flag
  69. do
  70. {
  71. temp=read_status();
  72. } while ((temp&0x01)==1);
  73. }

  74. unsigned char read_25AA010A(unsigned char address){
  75. PRT_SPI&=~(1<<DD_SS);
  76. SPI_MasterTransmit(0x03);
  77. SPI_MasterTransmit(address&0x7F);
  78. SPI_MasterTransmit(0x00);
  79. _delay_us(100);
  80. unsigned char data=SPI_SlaveReceive();
  81. PRT_SPI|=(1<<DD_SS);
  82. return data;
  83. }

  84. int main(void)
  85. {
  86. /* Replace with your application code */
  87. SPI_MasterInit();
  88. PRT_SPI|=(1<<DD_SS);
  89. lcd_init();
  90. unsigned char temp[16]="ATMEGA644P SPI";
  91. for (unsigned char i=0;i<16;i++)
  92. {
  93. write_25AA010A(i,temp[i]);
  94. }
  95. for (unsigned char i=0;i<16;i++)
  96. {
  97. temp[i]=read_25AA010A(i);
  98. }
  99. lcd_text(temp);
  100. unsigned char temp_1[16]="25AA010A EEPROM";
  101. for (unsigned char i=16;i<32;i++)
  102. {
  103. write_25AA010A(i,temp_1[i]);
  104. }
  105. for (unsigned char i=16;i<32;i++)
  106. {
  107. temp_1[15-i]=read_25AA010A(i);
  108. }
  109. lcd_xy(1,2);
  110. lcd_text(temp_1);
  111. while (1)
  112. {
  113. }
  114. }

Click here to download this example.

 

 


 

Monday, February 23, 2026

ATMega644P SPI and MCP492X 12-bit ADC

Overview

The Microchip Technology Inc. MCP492X are 2.7 – 5.5V, low-power, low DNL, 12-Bit Digital-to-Analog Converters (DACs) with optional 2x buffered output and SPI interface. 
The MCP492X are DACs that provide high accuracy and low noise performance for industrial applications where calibration or compensation of signals (such as temperature, pressure and humidity) are required. The MCP492X are available in the extended temperature range and PDIP, SOIC, MSOP and TSSOP packages.

ATMega644P SPI and MCP492X 12-bit ADC
MCP4921 and MCP4922 DIP Chip

 This chip has a DIP version that is very user-friendly for DIY electronics prototyping. The MCP4921 has only one output DAC while the MCP4922 has two output DAC. DAC selection is set in software.

ATMega644P SPI and MCP492X 12-bit ADC 

These two versions of chip function almost the same except the number of output DAC.

ATMega644P SPI and MCP492X 12-bit ADC
PIN FUNCTION TABLE

 This 12-bit DAC yield different 4096 step. Using a typical +5.0VDC supply voltage we can double its output voltage level to 2X via its gain control bit.

ATMega644P SPI and MCP492X 12-bit ADC
Output Voltage Calculation

The SPI interface of this chip is one direction (write only). One SPI data frame is 16-bit (two byte) that contain DAC setting and 12-bit DAC value.

ATMega644P SPI and MCP492X 12-bit ADC
WRITE COMMAND REGISTER

The Chip Select (CS) is active low. So the master MCU keeps this pin low for two bytes of data transmission.

ATMega644P SPI and MCP492X 12-bit ADC
Write Command

 Using a dedicates SPI interface of an MCU offers a high speed data transmission.

ATMega644P SPI and MCP4921 Single DAC

The MCP4921 is a simple 8-bit DAC chip with single output.  Here the ATMega644P send any DAC voltage to this chip with the lowest and the highest voltage level.

ATMega644P SPI and MCP492X 12-bit ADC
Schematic

 I use its 2X gain feature that give a maximum output voltage up to 10VDC from a 5.0VDC supply voltage.

  1. /*
  2. * 12-spi_mcp4921.c
  3. *
  4. * Created: 2/23/2026 2:55:53 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. #define DDR_SPI DDRB
  11. #define PRT_SPI PORTB

  12. #define DD_SS 4
  13. #define DD_MOSI 5
  14. #define DD_MISO 6
  15. #define DD_SCK 7

  16. #define BUF 14
  17. #define G1X 13
  18. #define ACTIVE 12

  19. void SPI_MasterInit(void)
  20. {
  21. /* Set MOSI and SCK output, all others input */
  22. DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
  23. /* Enable SPI, Master, set clock rate fck/16 */
  24. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  25. }

  26. void SPI_MasterTransmit(char cData)
  27. {
  28. /* Start transmission */
  29. SPDR = cData;
  30. /* Wait for transmission complete */
  31. while(!(SPSR & (1<<SPIF)))
  32. ;
  33. }

  34. void SPI_SlaveInit(void)
  35. {
  36. /* Set MISO output, all others input */
  37. DDR_SPI = (1<<DD_MISO);
  38. /* Enable SPI */
  39. SPCR = (1<<SPE);
  40. }
  41. char SPI_SlaveReceive(void)
  42. {
  43. /* Wait for reception complete */
  44. while(!(SPSR & (1<<SPIF)))
  45. ;
  46. /* Return Data Register */
  47. return SPDR;
  48. }

  49. void mcp4921_send(unsigned int value){
  50. unsigned int mcp4922_data,dac_12;
  51. mcp4922_data=(1<<BUF)|(1<<ACTIVE);
  52. dac_12=value;
  53. mcp4922_data|=dac_12&0x0FFF;
  54. PRT_SPI&=~(1<<DD_SS);
  55. SPI_MasterTransmit(mcp4922_data>>8);
  56. SPI_MasterTransmit(mcp4922_data&0x00FF);
  57. PRT_SPI|=(1<<DD_SS);
  58. }

  59. int main(void)
  60. {
  61. /* Replace with your application code */
  62. SPI_MasterInit();
  63. while (1)
  64. {
  65. mcp4921_send(0x0000);
  66. _delay_ms(1000);
  67. mcp4921_send(0x0FFF);
  68. _delay_ms(1000);
  69. }
  70. }




The 12-bit DAC data is masked with the MCP4921 control bits.

Now let create a sine wave output using a DAC data table. This output sine wave doesn't have zero cross.

ATMega644P SPI and MCP492X 12-bit ADC
Sine Wave Generating

 

ATMega644P SPI and MCP492X 12-bit ADC
Output DAC Signal

Its frequency is around 120Hz.

  1. /*
  2. * sine_wave.c
  3. *
  4. * Created: 2/23/2026 7:41:55 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. #define DDR_SPI DDRB
  11. #define PRT_SPI PORTB

  12. #define DD_SS 4
  13. #define DD_MOSI 5
  14. #define DD_MISO 6
  15. #define DD_SCK 7

  16. #define BUF 14
  17. #define G1X 13
  18. #define ACTIVE 12

  19. static unsigned int sine_table[50] =
  20. {
  21. 512, 576, 639, 700, 759, 813, 862, 907, 944, 975,
  22. 999, 1015, 1023, 1023, 1015, 999, 975, 944, 907, 862,
  23. 813, 759, 700, 639, 576, 512, 448, 385, 324, 265,
  24. 211, 162, 117, 80, 49, 25, 9, 1, 1, 9,
  25. 25, 49, 80, 117, 162, 211, 265, 324, 385, 448
  26. };

  27. void SPI_MasterInit(void)
  28. {
  29. /* Set MOSI and SCK output, all others input */
  30. DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
  31. /* Enable SPI, Master, set clock rate fck/16 */
  32. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  33. }

  34. void SPI_MasterTransmit(char cData)
  35. {
  36. /* Start transmission */
  37. SPDR = cData;
  38. /* Wait for transmission complete */
  39. while(!(SPSR & (1<<SPIF)))
  40. ;
  41. }

  42. void SPI_SlaveInit(void)
  43. {
  44. /* Set MISO output, all others input */
  45. DDR_SPI = (1<<DD_MISO);
  46. /* Enable SPI */
  47. SPCR = (1<<SPE);
  48. }
  49. char SPI_SlaveReceive(void)
  50. {
  51. /* Wait for reception complete */
  52. while(!(SPSR & (1<<SPIF)))
  53. ;
  54. /* Return Data Register */
  55. return SPDR;
  56. }

  57. void mcp4921_send(unsigned int value){
  58. unsigned int mcp4922_data,dac_12;
  59. mcp4922_data=(1<<BUF)|(1<<ACTIVE);
  60. dac_12=value;
  61. mcp4922_data|=dac_12&0x0FFF;
  62. PRT_SPI&=~(1<<DD_SS);
  63. SPI_MasterTransmit(mcp4922_data>>8);
  64. SPI_MasterTransmit(mcp4922_data&0x00FF);
  65. PRT_SPI|=(1<<DD_SS);
  66. }

  67. int main(void)
  68. {
  69. /* Replace with your application code */
  70. SPI_MasterInit();
  71. char i=0;
  72. while (1)
  73. {
  74. mcp4921_send(4*sine_table[i]);
  75. //_delay_ms(10);
  76. i++;
  77. if(i>49) i=0;
  78. }
  79. }





ATMega644P SPI and MCP4921 Single DAC

The MCP4922 has two output DAC but doubled in footprint. However these two chips are identical in functions. This example show how to write DAC values to this chip.

ATMega644P SPI and MCP492X 12-bit ADC
Schematic

 The master MCU just send the DAC values once and it keep in the buffer of the MCP4922 (buffer enabled).

  1. /*
  2. * 12-spi_mcp4922.c
  3. *
  4. * Created: 2/22/2026 8:01:15 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. #define DDR_SPI DDRB
  11. #define PRT_SPI PORTB

  12. #define DD_SS 4
  13. #define DD_MOSI 5
  14. #define DD_MISO 6
  15. #define DD_SCK 7

  16. #define DAC_B 15
  17. #define BUF 14
  18. #define G1X 13
  19. #define ACTIVE 12

  20. void SPI_MasterInit(void)
  21. {
  22. /* Set MOSI and SCK output, all others input */
  23. DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
  24. /* Enable SPI, Master, set clock rate fck/16 */
  25. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  26. }

  27. void SPI_MasterTransmit(char cData)
  28. {
  29. /* Start transmission */
  30. SPDR = cData;
  31. /* Wait for transmission complete */
  32. while(!(SPSR & (1<<SPIF)))
  33. ;
  34. }

  35. void SPI_SlaveInit(void)
  36. {
  37. /* Set MISO output, all others input */
  38. DDR_SPI = (1<<DD_MISO);
  39. /* Enable SPI */
  40. SPCR = (1<<SPE);
  41. }
  42. char SPI_SlaveReceive(void)
  43. {
  44. /* Wait for reception complete */
  45. while(!(SPSR & (1<<SPIF)))
  46. ;
  47. /* Return Data Register */
  48. return SPDR;
  49. }

  50. int main(void)
  51. {
  52. /* Replace with your application code */
  53. SPI_MasterInit();
  54. unsigned int mcp4922_data,dac_12;
  55. mcp4922_data=(1<<DAC_B)|(1<<BUF)|(1<<ACTIVE);
  56. dac_12=3000;
  57. mcp4922_data|=dac_12&0x0FFF;
  58. PRT_SPI&=~(1<<DD_SS);
  59. SPI_MasterTransmit(mcp4922_data>>8);
  60. SPI_MasterTransmit(mcp4922_data&0x00FF);
  61. PRT_SPI|=(1<<DD_SS);
  62. mcp4922_data=(1<<BUF)|(1<<ACTIVE);
  63. dac_12=2048;
  64. mcp4922_data|=dac_12&0x0FFF;
  65. PRT_SPI&=~(1<<DD_SS);
  66. SPI_MasterTransmit(mcp4922_data>>8);
  67. SPI_MasterTransmit(mcp4922_data&0x00FF);
  68. PRT_SPI|=(1<<DD_SS);
  69. while (1)
  70. {
  71. }
  72. }


Now I added one ADC input to adjust the output DAC values.

ATMega644P SPI and MCP492X 12-bit ADC
Schematic

 

  1. /*
  2. * adc_dac.c
  3. *
  4. * Created: 2/23/2026 9:54:28 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. #define DDR_SPI DDRB
  11. #define PRT_SPI PORTB

  12. #define DD_SS 4
  13. #define DD_MOSI 5
  14. #define DD_MISO 6
  15. #define DD_SCK 7

  16. #define DAC_B 15
  17. #define BUF 14
  18. #define G1X 13
  19. #define ACTIVE 12

  20. void SPI_MasterInit(void)
  21. {
  22. /* Set MOSI and SCK output, all others input */
  23. DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
  24. /* Enable SPI, Master, set clock rate fck/16 */
  25. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
  26. }

  27. void SPI_MasterTransmit(char cData)
  28. {
  29. /* Start transmission */
  30. SPDR = cData;
  31. /* Wait for transmission complete */
  32. while(!(SPSR & (1<<SPIF)))
  33. ;
  34. }

  35. void SPI_SlaveInit(void)
  36. {
  37. /* Set MISO output, all others input */
  38. DDR_SPI = (1<<DD_MISO);
  39. /* Enable SPI */
  40. SPCR = (1<<SPE);
  41. }
  42. char SPI_SlaveReceive(void)
  43. {
  44. /* Wait for reception complete */
  45. while(!(SPSR & (1<<SPIF)))
  46. ;
  47. /* Return Data Register */
  48. return SPDR;
  49. }

  50. void dac_write(char dac, char gain, unsigned int dac_value){
  51. unsigned int mcp4922_data,dac_12,temp;
  52. if(gain==2) temp=0;
  53. else temp=1;
  54. if((dac=='B')||(dac==2)||(dac=='b')||(dac=='2'))
  55. mcp4922_data=(1<<DAC_B)|(1<<BUF)|(temp<<G1X)|(1<<ACTIVE);
  56. else if(dac=='A'||(dac==1)|(dac=='a')||(dac=='1'))
  57. mcp4922_data=(1<<BUF)|(temp<<G1X)|(1<<ACTIVE);
  58. else
  59. mcp4922_data=(1<<BUF)|(temp<<G1X)|(1<<ACTIVE);
  60. mcp4922_data|=dac_value&0x0FFF;
  61. PRT_SPI&=~(1<<DD_SS);
  62. SPI_MasterTransmit(mcp4922_data>>8);
  63. SPI_MasterTransmit(mcp4922_data&0x00FF);
  64. PRT_SPI|=(1<<DD_SS);
  65. }

  66. int main(void)
  67. {
  68. /* Replace with your application code */
  69. SPI_MasterInit();
  70. DDRB=0xFF;
  71. //PA0 or ADC0 as an analog input
  72. DDRA=0;
  73. //Turn on the ADC module
  74. ADCSRA=(1<<ADEN);
  75. uint16_t temp;
  76. ADMUX=0;
  77. dac_write(1, 2, 0x0FF);
  78. dac_write(2, 1, 0x0FFF);
  79. _delay_ms(5000);
  80. while (1)
  81. {
  82. //Start the conversion
  83. ADCSRA|=(1<<ADSC);
  84. //Wait for the completion
  85. while((ADCSRA&(1<<ADSC))==1);
  86. //Read the result
  87. temp=ADCL+(ADCH<<8);
  88. dac_write('A',2,temp*4);
  89. dac_write('B',2,0x0FFF-(temp*4));
  90. _delay_ms(100);
  91. }
  92. }





 

 

 

 

 

 


 

 

 

336x280

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (135) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (12) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (12) SN74HC595N (2) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)