Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
1

Управление LC72131 и тв тюнером на ATMEGA8A

11.06.2021, 12:08. Показов 255. Ответов 20
Метки нет (Все метки)

Как сделать схему для управления LC72131 в тюнере FM ( например, типа TC-702FYAB от списанной магнитолы Hyundai H-CMD4002) на ATMEGA8A(64-108MHz, 50-146 MHz ) ? ПЧ 10,7МГц для FM , 450(465,455 ) кГц или 10,7 МГц
Кварц при синтезаторе на 4,5 МГц.
Можно ли также управлять ТВ- тюнером CDT-6EPN2-00 для приемника с двойным преобразованием для настройки его на радиолюбительские частоты 144-146 МГц, 50-51 МГц, 430-439МГц (если подключить к выходу тюнер на 31-38 МГц на Ka22429/MC3362/TA2003+SA612 (for SSB) как тракт ПЧ )?
0
Вложения
Тип файла: rar Hyundai H-CMD4002.rar (5.73 Мб, 0 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2021, 12:08
Ответы с готовыми решениями:

Управление скважностью ШИМ-сигнала ATMega8A с параллельного АЦП
Есть ли программа на Си или ассемблере для управления скважностью ШИМ-сигнала ATMega8A с...

Неполадки с тюнером
у меня такая проблема с тюнером. Мы когда то купили тюнер на ПК. Уже давно мы смотрим тв на ПК. Но,...

Проблема с ТВ Тюнером
Прошу помощи у знающих людей!!! Проблема такая: у меня мать "Gigabyte GA-M61PME-S2P" звук...

Трабл с тюнером
Изображение на экране стало вот таким!!!???

20
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 12:12  [ТС] 2
Можно ли встроить программу управления темброблоком на PT2312A (CD2312A) по I2C ?
Про темброблок на PT2312A можно отдельную тему выделить .
0
Вложения
Тип файла: pdf PT2312A-SL.pdf (207.8 Кб, 0 просмотров)
Тип файла: pdf lc72131.pdf (408.5 Кб, 3 просмотров)
1603 / 827 / 343
Регистрация: 11.10.2018
Сообщений: 4,347
11.06.2021, 12:16 3
Здравствуйте. Что Вы так все в эту ATMega8 используете? Там же какой-то косяк в ней был. Не помню правда какой, возможно что-то с АЦП. Посмотрите в Errata и в Интернете.
P.S. Какой там косяк был? Кто знает - подскажите, пожалуйста.
0
964 / 591 / 97
Регистрация: 15.05.2012
Сообщений: 3,483
11.06.2021, 12:38 4
Криворукость юзеров там вечно выскакивает.
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 12:42  [ТС] 5
мне под такие удобно.
Можно и на ATTiny2313A.

В тюнере CDT-6EPN2-00 надписи на микросхемах :

1) синтезатор, преобразователь
6509A
1026
TPG8043


(кажется, аналог TDA6509A)
2) демодулятор
9885H
3604
TPD8073

(кажется, аналог TDA9885H)
0
Вложения
Тип файла: pdf TDA9885.pdf (284.0 Кб, 0 просмотров)
Тип файла: pdf TDA6508_6508A_6509_6509A_1.pdf (275.8 Кб, 0 просмотров)
Тип файла: pdf TDA6508_NXPSemiconductors.pdf (322.1 Кб, 0 просмотров)
964 / 591 / 97
Регистрация: 15.05.2012
Сообщений: 3,483
11.06.2021, 12:43 6
Цитата Сообщение от USERPC01 Посмотреть сообщение
Можно ли
Можно, конечно, и зайца научить курить. В принципе, ничего нет невозможного … для человека с интеллектом.
Цитата Сообщение от USERPC01 Посмотреть сообщение
Как сделать
Победить в себе либо лень, либо незнание.
(Это поговорка "Покупает тот, кто либо ленится, либо не умеет" другими словами.)
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 12:46  [ТС] 7
хотел узнать , есть ли прототипы и аналоги на форуме

Добавлено через 24 секунды
Потом свои варианты напишу .

Добавлено через 1 минуту
C I2C Master есть варианты, даже программные, пока не прикрутил для этих микросхем.
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 13:12  [ТС] 8
Можно на основе https://www.avrfreaks.net/foru... d-74ls138n сделать, переделав на I2C подпрограмму отправки данных (в других темах ,например, по lm7001 обсуждалось ).
0
Вложения
Тип файла: zip V211.zip (897.6 Кб, 0 просмотров)
Тип файла: zip V211_01.zip (897.7 Кб, 0 просмотров)
Тип файла: zip V211_tx.zip (897.6 Кб, 0 просмотров)
Тип файла: zip V215_ATTiny4313_plus.zip (911.9 Кб, 0 просмотров)
Тип файла: zip V2.05_mem.zip (367.9 Кб, 0 просмотров)
Тип файла: zip V208.zip (360.5 Кб, 0 просмотров)
1898 / 1216 / 121
Регистрация: 04.01.2010
Сообщений: 4,358
11.06.2021, 13:40 9
Цитата Сообщение от pyzhman Посмотреть сообщение
Победить в себе либо лень, либо незнание.
(Это поговорка "Покупает тот, кто либо ленится, либо не умеет" другими словами.)
... не в случае с SW...

Не по теме:

В эпоху open-source все меньше и меньше людей что-то пишут свое. Большинство тырят из готового ). В итоге программисты вырождаются как класс :) И всем от этого хорошо, кроме заказчика.

0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 13:47  [ТС] 10
https://www.microchip.com/wwwA... e=en591794

AVR315: Using the TWI Module as I2C Master, AN2480
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 13:51  [ТС] 11
старая редакция апноутов (до ребрендинга )
0
Вложения
Тип файла: zip AVR315.zip (7.0 Кб, 0 просмотров)
Тип файла: pdf AVR315.pdf (158.2 Кб, 0 просмотров)
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 13:52  [ТС] 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/*****************************************************************************
*
* Atmel Corporation
*
* File              : TWI_Master.c
* Compiler          : IAR EWAAVR 2.28a/3.10c
* Revision          : $Revision: 1.13 $
* Date              : $Date: 24. mai 2004 11:31:20 $
* Updated by        : $Author: ltwa $
*
* Support mail      : avr@atmel.com
*
* Supported devices : All devices with a TWI module can be used.
*                     The example is written for the ATmega16
*
* AppNote           : AVR315 - TWI Master Implementation
*
* Description       : This is a sample driver for the TWI hardware modules.
*                     It is interrupt driveren. All functionality is controlled through 
*                     passing information to and from functions. Se main.c for samples
*                     of how to use the driver.
*
*
****************************************************************************/
 
#include "ioavr.h"              
#include "inavr.h"
#include "TWI_Master.h"
 
static unsigned char TWI_buf[ TWI_BUFFER_SIZE ];    // Transceiver buffer
static unsigned char TWI_msgSize;                   // Number of bytes to be transmitted.
static unsigned char TWI_state = TWI_NO_STATE;      // State byte. Default set to TWI_NO_STATE.
 
union TWI_statusReg TWI_statusReg = {0};            // TWI_statusReg is defined in TWI_Master.h
 
/****************************************************************************
Call this function to set up the TWI master to its initial standby state.
Remember to enable interrupts from the main application after initializing the TWI.
****************************************************************************/
void TWI_Master_Initialise(void)
{
  TWBR = TWI_TWBR;                                  // Set bit rate register (Baudrate). Defined in header file.
// TWSR = TWI_TWPS;                                  // Not used. Driver presumes prescaler to be 00.
  TWDR = 0xFF;                                      // Default content = SDA released.
  TWCR = (1<<TWEN)|                                 // Enable TWI-interface and release TWI pins.
         (0<<TWIE)|(0<<TWINT)|                      // Disable Interupt.
         (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // No Signal requests.
         (0<<TWWC);                                 //
}    
    
/****************************************************************************
Call this function to test if the TWI_ISR is busy transmitting.
****************************************************************************/
unsigned char TWI_Transceiver_Busy( void )
{
  return ( TWCR & (1<<TWIE) );                  // IF TWI Interrupt is enabled then the Transceiver is busy
}
 
/****************************************************************************
Call this function to fetch the state information of the previous operation. The function will hold execution (loop)
until the TWI_ISR has completed with the previous operation. If there was an error, then the function 
will return the TWI State code. 
****************************************************************************/
unsigned char TWI_Get_State_Info( void )
{
  while ( TWI_Transceiver_Busy() );             // Wait until TWI has completed the transmission.
  return ( TWI_state );                         // Return error state.
}
 
/****************************************************************************
Call this function to send a prepared message. The first byte must contain the slave address and the
read/write bit. Consecutive bytes contain the data to be sent, or empty locations for data to be read
from the slave. Also include how many bytes that should be sent/read including the address byte.
The function will hold execution (loop) until the TWI_ISR has completed with the previous operation,
then initialize the next operation and return.
****************************************************************************/
void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize )
{
  unsigned char temp;
 
  while ( TWI_Transceiver_Busy() );             // Wait until TWI is ready for next transmission.
 
  TWI_msgSize = msgSize;                        // Number of data to transmit.
  TWI_buf[0]  = msg[0];                         // Store slave address with R/W setting.
  if (!( msg[0] & (TRUE<<TWI_READ_BIT) ))       // If it is a write operation, then also copy data.
  {
    for ( temp = 1; temp < msgSize; temp++ )
      TWI_buf[ temp ] = msg[ temp ];
  }
  TWI_statusReg.all = 0;      
  TWI_state         = TWI_NO_STATE ;
  TWCR = (1<<TWEN)|                             // TWI Interface enabled.
         (1<<TWIE)|(1<<TWINT)|                  // Enable TWI Interupt and clear the flag.
         (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|       // Initiate a START condition.
         (0<<TWWC);                             //
}
 
/****************************************************************************
Call this function to resend the last message. The driver will reuse the data previously put in the transceiver buffers.
The function will hold execution (loop) until the TWI_ISR has completed with the previous operation,
then initialize the next operation and return.
****************************************************************************/
void TWI_Start_Transceiver( void )
{
  while ( TWI_Transceiver_Busy() );             // Wait until TWI is ready for next transmission.
  TWI_statusReg.all = 0;      
  TWI_state         = TWI_NO_STATE ;
  TWCR = (1<<TWEN)|                             // TWI Interface enabled.
         (1<<TWIE)|(1<<TWINT)|                  // Enable TWI Interupt and clear the flag.
         (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|       // Initiate a START condition.
         (0<<TWWC);                             //
}
 
/****************************************************************************
Call this function to read out the requested data from the TWI transceiver buffer. I.e. first call
TWI_Start_Transceiver to send a request for data to the slave. Then Run this function to collect the
data when they have arrived. Include a pointer to where to place the data and the number of bytes
requested (including the address field) in the function call. The function will hold execution (loop)
until the TWI_ISR has completed with the previous operation, before reading out the data and returning.
If there was an error in the previous transmission the function will return the TWI error code.
****************************************************************************/
unsigned char TWI_Get_Data_From_Transceiver( unsigned char *msg, unsigned char msgSize )
{
  unsigned char i;
 
  while ( TWI_Transceiver_Busy() );             // Wait until TWI is ready for next transmission.
 
  if( TWI_statusReg.lastTransOK )               // Last transmission competed successfully.              
  {                                             
    for ( i=0; i<msgSize; i++ )                 // Copy data from Transceiver buffer.
    {
      msg[ i ] = TWI_buf[ i ];
    }
  }
  return( TWI_statusReg.lastTransOK );                                   
}
 
// ********** Interrupt Handlers ********** //
/****************************************************************************
This function is the Interrupt Service Routine (ISR), and called when the TWI interrupt is triggered;
that is whenever a TWI event has occurred. This function should not be called directly from the main
application.
****************************************************************************/
#pragma vector=TWI_vect
__interrupt void TWI_ISR(void)
{
  static unsigned char TWI_bufPtr;
  
  switch (TWSR)
  {
    case TWI_START:             // START has been transmitted  
    case TWI_REP_START:         // Repeated START has been transmitted
      TWI_bufPtr = 0;                                     // Set buffer pointer to the TWI Address location
    case TWI_MTX_ADR_ACK:       // SLA+W has been tramsmitted and ACK received
    case TWI_MTX_DATA_ACK:      // Data byte has been tramsmitted and ACK received
      if (TWI_bufPtr < TWI_msgSize)
      {
        TWDR = TWI_buf[TWI_bufPtr++];
        TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to send byte
               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           //
               (0<<TWWC);                                 //  
      }else                    // Send STOP after last byte
      {
        TWI_statusReg.lastTransOK = TRUE;                 // Set status bits to completed successfully. 
        TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
               (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
               (0<<TWWC);                                 //
      }
      break;
    case TWI_MRX_DATA_ACK:      // Data byte has been received and ACK tramsmitted
      TWI_buf[TWI_bufPtr++] = TWDR;
    case TWI_MRX_ADR_ACK:       // SLA+R has been tramsmitted and ACK received
      if (TWI_bufPtr < (TWI_msgSize-1) )                  // Detect the last byte to NACK it.
      {
        TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
               (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send ACK after reception
               (0<<TWWC);                                 //  
      }else                    // Send NACK after next reception
      {
        TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send NACK after reception
               (0<<TWWC);                                 // 
      }    
      break; 
    case TWI_MRX_DATA_NACK:     // Data byte has been received and NACK tramsmitted
      TWI_buf[TWI_bufPtr] = TWDR;
      TWI_statusReg.lastTransOK = TRUE;                 // Set status bits to completed successfully. 
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
             (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
             (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
             (0<<TWWC);                                 //
      break;      
    case TWI_ARB_LOST:          // Arbitration lost
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
             (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag
             (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a (RE)START condition.
             (0<<TWWC);                                 //
      break;
    case TWI_MTX_ADR_NACK:      // SLA+W has been tramsmitted and NACK received
    case TWI_MRX_ADR_NACK:      // SLA+R has been tramsmitted and NACK received    
    case TWI_MTX_DATA_NACK:     // Data byte has been tramsmitted and NACK received
//    case TWI_NO_STATE              // No relevant state information available; TWINT = “0”
    case TWI_BUS_ERROR:         // Bus error due to an illegal START or STOP condition
    default:     
      TWI_state = TWSR;                                 // Store TWSR and automatically sets clears noErrors bit.
                                                        // Reset TWI Interface
      TWCR = (1<<TWEN)|                                 // Enable TWI-interface and release TWI pins
             (0<<TWIE)|(0<<TWINT)|                      // Disable Interupt
             (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // No Signal requests
             (0<<TWWC);                                 //
  }
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*****************************************************************************
*
* Atmel Corporation
*
* File              : TWI_Master.h
* Compiler          : IAR EWAAVR 2.28a/3.10c
* Revision          : $Revision: 1.13 $
* Date              : $Date: 24. mai 2004 11:31:22 $
* Updated by        : $Author: ltwa $
*
* Support mail      : avr@atmel.com
*
* Supported devices : All devices with a TWI module can be used.
*                     The example is written for the ATmega16
*
* AppNote           : AVR315 - TWI Master Implementation
*
* Description       : Header file for TWI_Master.c
*                     Include this file in the application.
*
****************************************************************************/
 
/****************************************************************************
  TWI Status/Control register definitions
****************************************************************************/
#define TWI_BUFFER_SIZE 4   // Set this to the largest message size that will be sent including address byte.
 
#define TWI_TWBR            0x0C        // TWI Bit rate Register setting.
                                        // Se Application note for detailed 
                                        // information on setting this value.
// Not used defines!
//#define TWI_TWPS          0x00        // This driver presumes prescaler = 00
 
/****************************************************************************
  Global definitions
****************************************************************************/
 
union TWI_statusReg                       // Status byte holding flags.
{
    unsigned char all;
    struct
    {
        unsigned char lastTransOK:1;      
        unsigned char unusedBits:7;
    };
};
 
extern union TWI_statusReg TWI_statusReg;
 
/****************************************************************************
  Function definitions
****************************************************************************/
void TWI_Master_Initialise( void );
unsigned char TWI_Transceiver_Busy( void );
unsigned char TWI_Get_State_Info( void );
void TWI_Start_Transceiver_With_Data( unsigned char * , unsigned char );
void TWI_Start_Transceiver( void );
unsigned char TWI_Get_Data_From_Transceiver( unsigned char *, unsigned char );
 
/****************************************************************************
  Bit and byte definitions
****************************************************************************/
#define TWI_READ_BIT  0       // Bit position for R/W bit in "address byte".
#define TWI_ADR_BITS  1       // Bit position for LSB of the slave address bits in the init byte.
 
#define TRUE          1
#define FALSE         0
 
/****************************************************************************
  TWI State codes
****************************************************************************/
// General TWI Master staus codes                      
#define TWI_START                  0x08  // START has been transmitted  
#define TWI_REP_START              0x10  // Repeated START has been transmitted
#define TWI_ARB_LOST               0x38  // Arbitration lost
 
// TWI Master Transmitter staus codes                      
#define TWI_MTX_ADR_ACK            0x18  // SLA+W has been tramsmitted and ACK received
#define TWI_MTX_ADR_NACK           0x20  // SLA+W has been tramsmitted and NACK received 
#define TWI_MTX_DATA_ACK           0x28  // Data byte has been tramsmitted and ACK received
#define TWI_MTX_DATA_NACK          0x30  // Data byte has been tramsmitted and NACK received 
 
// TWI Master Receiver staus codes  
#define TWI_MRX_ADR_ACK            0x40  // SLA+R has been tramsmitted and ACK received
#define TWI_MRX_ADR_NACK           0x48  // SLA+R has been tramsmitted and NACK received
#define TWI_MRX_DATA_ACK           0x50  // Data byte has been received and ACK tramsmitted
#define TWI_MRX_DATA_NACK          0x58  // Data byte has been received and NACK tramsmitted
 
// TWI Slave Transmitter staus codes
#define TWI_STX_ADR_ACK            0xA8  // Own SLA+R has been received; ACK has been returned
#define TWI_STX_ADR_ACK_M_ARB_LOST 0xB0  // Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been returned
#define TWI_STX_DATA_ACK           0xB8  // Data byte in TWDR has been transmitted; ACK has been received
#define TWI_STX_DATA_NACK          0xC0  // Data byte in TWDR has been transmitted; NOT ACK has been received
#define TWI_STX_DATA_ACK_LAST_BYTE 0xC8  // Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
 
// TWI Slave Receiver staus codes
#define TWI_SRX_ADR_ACK            0x60  // Own SLA+W has been received ACK has been returned
#define TWI_SRX_ADR_ACK_M_ARB_LOST 0x68  // Arbitration lost in SLA+R/W as Master; own SLA+W has been received; ACK has been returned
#define TWI_SRX_GEN_ACK            0x70  // General call address has been received; ACK has been returned
#define TWI_SRX_GEN_ACK_M_ARB_LOST 0x78  // Arbitration lost in SLA+R/W as Master; General call address has been received; ACK has been returned
#define TWI_SRX_ADR_DATA_ACK       0x80  // Previously addressed with own SLA+W; data has been received; ACK has been returned
#define TWI_SRX_ADR_DATA_NACK      0x88  // Previously addressed with own SLA+W; data has been received; NOT ACK has been returned
#define TWI_SRX_GEN_DATA_ACK       0x90  // Previously addressed with general call; data has been received; ACK has been returned
#define TWI_SRX_GEN_DATA_NACK      0x98  // Previously addressed with general call; data has been received; NOT ACK has been returned
#define TWI_SRX_STOP_RESTART       0xA0  // A STOP condition or repeated START condition has been received while still addressed as Slave
 
// TWI Miscellaneous status codes
#define TWI_NO_STATE               0xF8  // No relevant state information available; TWINT = “0”
#define TWI_BUS_ERROR              0x00  // Bus error due to an illegal START or STOP condition
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 14:19  [ТС] 13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/*****************************************************************************
*
* Atmel Corporation
*
* File              : main.c
* Compiler          : IAR EWAAVR 2.28a/3.10c
* Revision          : $Revision: 1.13 $
* Date              : $Date: 24. mai 2004 11:31:20 $
* Updated by        : $Author: ltwa $
*
* Support mail      : avr@atmel.com
*
* Supported devices : All devices with a TWI module can be used.
*                     The example is written for the ATmega16
*
* AppNote           : AVR315 - TWI Master Implementation
*
* Description       : Example of how to use the driver for TWI master 
*                     communication.
*                     This code reads PORTD and sends the status to the TWI slave.
*                     Then it reads data from the slave and puts the data on PORTB.
*                     To run the example use STK500 and connect PORTB to the LEDS,
*                     and PORTD to the switches. .
*
****************************************************************************/
 
#include <ioavr.h>
#include <inavr.h>
#include "TWI_Master.h"
 
#define TWI_GEN_CALL         0x00  // The General Call address is 0
 
// Sample TWI transmission commands
#define TWI_CMD_MASTER_WRITE 0x10
#define TWI_CMD_MASTER_READ  0x20
 
// Sample TWI transmission states, used in the main application.
#define SEND_DATA             0x01
#define REQUEST_DATA          0x02
#define READ_DATA_FROM_BUFFER 0x03
 
unsigned char TWI_Act_On_Failure_In_Last_Transmission ( unsigned char TWIerrorMsg )
{
                    // A failure has occurred, use TWIerrorMsg to determine the nature of the failure
                    // and take appropriate actions.
                    // Se header file for a list of possible failures messages.
                    
                    // Here is a simple sample, where if received a NACK on the slave address,
                    // then a retransmission will be initiated.
 
  if ( (TWIerrorMsg == TWI_MTX_ADR_NACK) | (TWIerrorMsg == TWI_MRX_ADR_NACK) )
    TWI_Start_Transceiver();
    
  return TWIerrorMsg; 
}
 
 
void main( void )
{
  unsigned char messageBuf[4];
  unsigned char TWI_targetSlaveAddress, temp, TWI_operation=0,
                pressedButton, myCounter=0;
 
  //LED feedback port - connect port B to the STK500 LEDS
  DDRB  = 0xFF;
  PORTB = myCounter;
  
  //Switch port - connect portD to the STK500 switches
  DDRD  = 0x00;
 
  TWI_Master_Initialise();
  __enable_interrupt();
  
  TWI_targetSlaveAddress   = 0x10;
 
  // This example is made to work together with the AVR311 TWI Slave application note and stk500.
  // In adition to connecting the TWI pins, also connect PORTB to the LEDS and PORTD to the switches.
  // The code reads the pins to trigger the action you request. There is an example sending a general call,
  // address call with Master Read and Master Write. The first byte in the transmission is used to send
  // commands to the TWI slave.
 
  // This is a stk500 demo example. The buttons on PORTD are used to control different TWI operations.
  for(;;)
  {  
    pressedButton = ~PIND;
    if (pressedButton)       // Check if any button is pressed
    {
      do{temp = ~PIND;}      // Wait until key released
      while (temp);
      
      switch ( pressedButton ) 
      {
        // Send a Generall Call
        case (1<<PD0):      
          messageBuf[0] = TWI_GEN_CALL;     // The first byte must always consit of General Call code or the TWI slave address.
          messageBuf[1] = 0xAA;             // The command or data to be included in the general call.
          TWI_Start_Transceiver_With_Data( messageBuf, 2 );
          break;
 
        // Send a Address Call, sending a command and data to the Slave          
        case (1<<PD1):      
          messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
          messageBuf[1] = TWI_CMD_MASTER_WRITE;             // The first byte is used for commands.
          messageBuf[2] = myCounter;                        // The second byte is used for the data.
          TWI_Start_Transceiver_With_Data( messageBuf, 3 );
          break;
 
        // Send a Address Call, sending a request, followed by a resceive          
        case (1<<PD2):      
          // Send the request-for-data command to the Slave
          messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
          messageBuf[1] = TWI_CMD_MASTER_READ;             // The first byte is used for commands.
          TWI_Start_Transceiver_With_Data( messageBuf, 2 );
 
          TWI_operation = REQUEST_DATA;         // To release resources to other operations while waiting for the TWI to complete,
                                                // we set a operation mode and continue this command sequence in a "followup" 
                                                // section further down in the code.
                    
        // Get status from Transceiver and put it on PORTB
        case (1<<PD5):
          PORTB = TWI_Get_State_Info();
          break;
 
        // Increment myCounter and put it on PORTB          
        case (1<<PD6):      
          PORTB = ++myCounter;        
          break;
          
        // Reset myCounter and put it on PORTB
        case (1<<PD7):      
          PORTB = myCounter = 0;        
          break;  
      }
    }    
 
    if ( ! TWI_Transceiver_Busy() )
    {
    // Check if the last operation was successful
      if ( TWI_statusReg.lastTransOK )
      {
        if ( TWI_operation ) // Section for follow-up operations.
        {
        // Determine what action to take now
          if (TWI_operation == REQUEST_DATA)
          { // Request/collect the data from the Slave
            messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
            TWI_Start_Transceiver_With_Data( messageBuf, 2 );       
            TWI_operation = READ_DATA_FROM_BUFFER; // Set next operation        
          }
          else if (TWI_operation == READ_DATA_FROM_BUFFER)
          { // Get the received data from the transceiver buffer
            TWI_Get_Data_From_Transceiver( messageBuf, 2 );
            PORTB = messageBuf[1];        // Store data on PORTB.
            TWI_operation = FALSE;        // Set next operation        
          }
        }
      }
      else // Got an error during the last transmission
      {
        // Use TWI status information to detemine cause of failure and take appropriate actions. 
        TWI_Act_On_Failure_In_Last_Transmission( TWI_Get_State_Info( ) );
      }
    }
 
    // Do something else while waiting for TWI operation to complete and/or a switch to be pressed
    __no_operation(); // Put own code here.
 
  }
}
 
 
/*
  // This example code runs forever; sends a byte to the slave, then requests a byte
  // from the slave and stores it on PORTB, and starts over again. Since it is interupt
  // driven one can do other operations while waiting for the transceiver to complete.
  
  // Send initial data to slave
  messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);
  messageBuf[1] = 0x00;
  TWI_Start_Transceiver_With_Data( messageBuf, 2 );
 
  TWI_operation = REQUEST_DATA; // Set the next operation
 
  for (;;)
  {
    // Check if the TWI Transceiver has completed an operation.
    if ( ! TWI_Transceiver_Busy() )                              
    {
    // Check if the last operation was successful
      if ( TWI_statusReg.lastTransOK )
      {
      // Determine what action to take now
        if (TWI_operation == SEND_DATA)
        { // Send data to slave
          messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT);
          TWI_Start_Transceiver_With_Data( messageBuf, 2 );
          
          TWI_operation = REQUEST_DATA; // Set next operation
        }
        else if (TWI_operation == REQUEST_DATA)
        { // Request data from slave
          messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT);
          TWI_Start_Transceiver_With_Data( messageBuf, 2 );
          
          TWI_operation = READ_DATA_FROM_BUFFER; // Set next operation        
        }
        else if (TWI_operation == READ_DATA_FROM_BUFFER)
        { // Get the received data from the transceiver buffer
          TWI_Get_Data_From_Transceiver( messageBuf, 2 );
          PORTB = messageBuf[1];        // Store data on PORTB.
          
          TWI_operation = SEND_DATA;    // Set next operation        
        }
      }
      else // Got an error during the last transmission
      {
        // Use TWI status information to detemine cause of failure and take appropriate actions. 
        TWI_Act_On_Failure_In_Last_Transmission( TWI_Get_State_Info( ) );
      }
    }
    // Do something else while waiting for the TWI Transceiver to complete the current operation
    __no_operation(); // Put own code here.
  }
}
*/
Добавлено через 1 минуту
Еще один пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/* for ATmega8/168/328
site: http://countzero.weebly.com
 
avr-gcc -mmcu=atmega8 -Wall -Os -o rtc.elf rtc.c
avr-objcopy -O ihex rtc.elf rtc.hex
avrdude  -patmega8 -carduino -P/dev/ttyUSB0 -b19200 -D -Uflash:w:./rtc.hex:i
*/
 
#define F_CPU 16000000UL
#define LEN 32
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <util/twi.h>
#include <stdio.h>
 
 
//General Master staus codes                                            
#define START       0x08    //START has been transmitted    
#define REP_START   0x10
#define MT_DATA_ACK 0x28
 
//Master Transmitter staus codes                                            
#define MT_ADR_ACK  0x18    //SLA+W has been tramsmitted and ACK received 
#define MT_ADR_NACK 0x20    //SLA+W has been tramsmitted and NACK received
 
#define MT_DATA_ACK 0x28    //Data byte has been tramsmitted and ACK received
#define MT_DATA_NACK    0x30    //Data byte has been tramsmitted and NACK received
#define MT_ARB_LOST 0x38    //Arbitration lost in SLA+W or data bytes
 
#define WRITE       0x00
#define READ        0x01
 
#define READ_END    0x01
#define READ_NOEND  0x00
 
#define RTC     0xD0
 
char buffer[LEN];
register unsigned char IT asm("r16");
volatile unsigned char done;
volatile unsigned char IDX;
 
static inline void clearStr(char* str)
{
        for(IT=0;IT<LEN;IT++)
                str[IT]=0;
}
 
static uint8_t uart_putchar(char c, FILE *stream)
{
       if (c == '\n')
                   uart_putchar('\r', stream);
          loop_until_bit_is_set(UCSRA, UDRE);
             UDR = c;
            return 0;
}
 
ISR(USART_RXC_vect)
{
        char bf= UDR;
        buffer[IDX]=bf;
        IDX++;
 
        if (bf == ':' || IDX >= LEN)
        {
                IDX=0;
                done=1;
        }
}
 
static void blink13(uint8_t count)
{
        PORTB |= (1<<PB5);
        count =(count <<1);count--; //count=(count*2)-1;
        for (IT=0;IT<count;IT++)
        {
                _delay_ms(500);
                PORTB ^= (1<<PB5);
        };
};
 
uint8_t send_i2c(uint8_t value)
{
    TWDR = value;
    TWCR = (1<<TWINT) | (1<<TWEN);
    // wail until transmission completed and ACK/NACK has been received
    while(!(TWCR & (1<<TWINT))) {};
    // check value of TWI Status Register. Mask prescaler bits.
 
    return ((TWSR & 0xF8) != MT_ADR_ACK) ? 1 : 0;
}
 
static uint8_t start_i2c(uint8_t d_adr)
{
    TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // START
    while (!(TWCR & (1<<TWINT))) {};
 
    uint8_t twst; twst = (TWSR & 0xF8); // check value of TWI Status Register. Mask prescaler bits.
    if ((twst != START) && (twst != REP_START))
        return 1;
    uint8_t ret; ret=send_i2c(d_adr);
    return ret;
};
 
static inline void stop_i2c()
{
    TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
 
static uint8_t read_i2c(uint8_t END)
{
    if (END)
        TWCR = (1<<TWINT)|(1<<TWEN);
    else
            TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
 
    while(!(TWCR & (1<<TWINT)));
 
    return TWDR; // return data
}
/*
static uint8_t check_i2c_adr(uint8_t adr)
{
    uint8_t ret;
    ret=start_i2c(adr|WRITE);
    stop_i2c();
    return ret;
}
*/
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
 
int main(void)
{
        // USART init
        UBRRL=103;
        UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
        UCSRC=(1<<URSEL)|(3<<UCSZ0);
 
    TWBR = (F_CPU / 100000UL - 16)/2; // TWI bitrate
 
        DDRB |= (1<<PB5); //  pinMode(13,OUTPUT);
 
        blink13(3); //ready indication
        IDX=0;
        done=0;
        sei();
 
    stdout = &mystdout;
    printf("Set address rtc1307: 0x00\n");
    if (!start_i2c(RTC))
    {
        uint8_t ret; ret=send_i2c(0x00);
        stop_i2c();
        if (!ret)
            printf("Set Address success!\n");
        uint8_t k, data; k=0;
        start_i2c(RTC|READ);
        for(k=0;k<64;k++)
        {
            data=read_i2c(READ_NOEND);
            printf("address: %d value: %d\n", k,data);
        }
 
        stop_i2c();
    } else
    {
        stop_i2c();
        printf("Set Address failure!\n");
    }
 
    for (;;){};
 
        return 0;
}
Добавлено через 1 минуту
интересніе подпрограммы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
uint8_t send_i2c(uint8_t value)
{
    TWDR = value;
    TWCR = (1<<TWINT) | (1<<TWEN);
    // wail until transmission completed and ACK/NACK has been received
    while(!(TWCR & (1<<TWINT))) {};
    // check value of TWI Status Register. Mask prescaler bits.
 
    return ((TWSR & 0xF8) != MT_ADR_ACK) ? 1 : 0;
}
 
static uint8_t start_i2c(uint8_t d_adr)
{
    TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // START
    while (!(TWCR & (1<<TWINT))) {};
 
    uint8_t twst; twst = (TWSR & 0xF8); // check value of TWI Status Register. Mask prescaler bits.
    if ((twst != START) && (twst != REP_START))
        return 1;
    uint8_t ret; ret=send_i2c(d_adr);
    return ret;
};
 
static inline void stop_i2c()
{
    TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
 
static uint8_t read_i2c(uint8_t END)
{
    if (END)
        TWCR = (1<<TWINT)|(1<<TWEN);
    else
            TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
 
    while(!(TWCR & (1<<TWINT)));
 
    return TWDR; // return data
}
/*
static uint8_t check_i2c_adr(uint8_t adr)
{
    uint8_t ret;
    ret=start_i2c(adr|WRITE);
    stop_i2c();
    return ret;
}
*/
Добавлено через 17 секунд
интересные подпрограммы (переделать под наш случай )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
...
TWBR = (F_CPU / 100000UL - 16)/2; // TWI bitrate
...
uint8_t send_i2c(uint8_t value)
{
    TWDR = value;
    TWCR = (1<<TWINT) | (1<<TWEN);
    // wail until transmission completed and ACK/NACK has been received
    while(!(TWCR & (1<<TWINT))) {};
    // check value of TWI Status Register. Mask prescaler bits.
 
    return ((TWSR & 0xF8) != MT_ADR_ACK) ? 1 : 0;
}
 
static uint8_t start_i2c(uint8_t d_adr)
{
    TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // START
    while (!(TWCR & (1<<TWINT))) {};
 
    uint8_t twst; twst = (TWSR & 0xF8); // check value of TWI Status Register. Mask prescaler bits.
    if ((twst != START) && (twst != REP_START))
        return 1;
    uint8_t ret; ret=send_i2c(d_adr);
    return ret;
};
 
static inline void stop_i2c()
{
    TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
 
static uint8_t read_i2c(uint8_t END)
{
    if (END)
        TWCR = (1<<TWINT)|(1<<TWEN);
    else
            TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
 
    while(!(TWCR & (1<<TWINT)));
 
    return TWDR; // return data
}
/*
static uint8_t check_i2c_adr(uint8_t adr)
{
    uint8_t ret;
    ret=start_i2c(adr|WRITE);
    stop_i2c();
    return ret;
}
*/
 
... (переделать )
 
{
        uint8_t ret; ret=send_i2c(0x00);
        stop_i2c();
        //if (!ret)
            //printf("Set Address success!\n");
        uint8_t k, data; k=0;
        start_i2c(RTC|READ); //изменить структуру 
        for(k=0;k<64;k++)
        {
            data=read_i2c(READ_NOEND);
            printf("address: %d value: %d\n", k,data);
        }
 
        stop_i2c();
    } else
    {
        stop_i2c();
        printf("Set Address failure!\n");
    }
Добавлено через 4 минуты
Пример по ПЗУ с записью
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <mega8.h>
#include <delay.h>
// I2C Bus functions
#asm
   .equ __i2c_port=0x15 //Адрес порта C
   .equ __sda_bit=4
   .equ __scl_bit=5
#endasm
#include <i2c.h>
#include <stdio.h>
#define Ext_EEPROM_Adr 0b10100000 // Адрес 24LC512 на I2C шине
 
unsigned char high_byte, low_byte, message[23]={'H','E','L','L','O',',',' ','e','x','t','e','r','n','a','l',' ','E','E','P','R','O','M','!'};
 
unsigned char eeprom_read(unsigned char address2, unsigned char address1) //Функция чтения из внешней EEPROM
{
unsigned char data;                    
i2c_start();                       //Кидаем команду "Cтарт" на шину I2C
i2c_write(Ext_EEPROM_Adr);         //Кидаем на шину адрес 24LC512
i2c_write(address2);               //Старший байт адресного пространства 24LC512
i2c_write(address1);               //Младший байт
i2c_start();                       //Снова посылаем "старт" в шину
i2c_write(Ext_EEPROM_Adr | 1);     //Обращаемся к 24LC512 в режиме чтения, т.е. по адресу 101000001
data=i2c_read(0);                  //Принимаем данные с шины и сохраняем в переменную
i2c_stop();                        //Посылаем команду "Cтоп"
return data;                       //Возвращаем значение прочитанного
}
 
void eeprom_write(unsigned char address2, unsigned char address1, unsigned char data) //Функция записи во внешнюю EEPROM
{   
i2c_start();                           //Кидаем команду "Cтарт" на шину I2C
i2c_write(Ext_EEPROM_Adr);             //Кидаем на шину адрес 24LC512
i2c_write(address2);                   //Старший байт адресного пространства 24LC512
i2c_write(address1);                   //Младший байт
i2c_write(data);                       //Посылаем байт для записи
i2c_stop();                            //Посылаем команду "Стоп"
delay_ms(5);                           //Даем микросхеме время записать данные, EEPROM довольно медлительна
}
 
void main(void)
{
DDRD=0xFF;
 
// I2C Bus initialization
i2c_init();
 
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
 
//Записываем для теста короткую строку "HELLO, external EEPROM!" в первые 23 байта внешней EEPROM
for(low_byte=0; low_byte<23; low_byte++)   
 {
    eeprom_write(high_byte, low_byte, message[low_byte]); 
 }   
//Кидаем в UART содержимое первых 23-х байтов адресного пространства 24LC512                                                 
     for(low_byte=0; low_byte<23; low_byte++) 
     {
       putchar(eeprom_read(0x00,low_byte));
       delay_ms(100);
     } 
while (1);       
}
Добавлено через 3 минуты
Программная реализация

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// пишем бит в шину
void i2c_wr_bit(char b) {
delay_us(i2c_time/2); // формируем первую половину паузы
if (b) wrsda; else rdsda;  // пишем бит...    
delay_us(i2c_time/2); // завершаем паузу
rdscl;                // выдаем фронт в линию SCL     
delay_us(i2c_time);   // формируем сам импульс
wrscl;                // выдаем спад в линию SCL
}
 
 
// читаем бит из шины
char i2c_rd_bit() {
char ret=1;          // временая переменная
rdsda;               // SDA - на чтение
delay_us(i2c_time);  // формируем паузу между импульсами  
rdscl;               // выдаем фронт SCL    
if (i2c_read) ret=0; // читаем SDA                                 
delay_us(i2c_time);  // формируем фронт
wrscl;               // формируем спад SCL
return ret;          // вернули, что прочитали...
}
 
 
// передача байта на шину
char i2c_wr(char data)  {
  //Функция возвращает 1, если есть ответ ACK
  char i; // счетчик для цикла. Если объявлять глобально, могут быть глюки
  for (i=0; i<8; i++) {         // выдаем в шину 8 бит
    i2c_wr_bit((data&0x80)==0); // отдаем бит
    data<<=1;  }                // двигаем байт
  // читаем «акнолидж» (подтверждение приёма)
  return i2c_rd_bit();          // вернули, что прочитали  
}
 
// прием байта с шины
char i2c_rd(char a)  {
  //если ack=1, то выдается подтверждение ack в шину
  char i, data=0;                // счетчик и принимаемый байт
  for (i=0; i<8; i++) {          // цикл приема бит
    if (!i2c_rd_bit()) data++;   // читаем бит
    if(i!=7) data<<=1;  }        // двигаем байт
  i2c_wr_bit(a);  // выдаем «акнолидж» (подтверждение приема)
  return data;    // вернули, что прочли
}
 
// старт i2c
void i2c_go(void)  {
  delay_us(i2c_time);  // ждем, пока предидущие сигналы устаканятся
  rdsda; rdscl;        // отпускаем шину
  delay_us(i2c_time);  // формируем паузу:)
  wrsda;  clrsda;      // давим SDA и ставим 0
  delay_us(i2c_time);  // задержка...
  wrscl;  clrscl;      // давим SCL и ставим 0
  delay_us(i2c_time);  // задержка...
}
// стоп i2c
void i2c_end(void)  {
  wrsda;               // давим SDA
  delay_us(i2c_time);  // ждем..
  rdscl;               // давим SCL
  delay_us(i2c_time);  // ждем..
  rdsda;               // отдаем SDA
}
 
...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// главная функция
void main(void)  {
DDRB.5=1;
delay_ms(100);   // ждем, пока питание устаканится
while (1)  {
char t=0;
delay_ms(100); // ждем немного
PORTB.5=0; // гасим тестовый светодиод
// пишем байт 0xF7 в память микросхемы по адресу 05
i2c_go();
i2c_wr(0xA0);  // i2c адрес микросхемы
i2c_wr(0x05);  // адрес в памяти
i2c_wr(0xF7);  // данные
i2c_end();
// пишем байт 0x3B в память микросхемы по адресу 06
i2c_go();
i2c_wr(0xA0);  // i2c адрес микросхемы
i2c_wr(0x06);  // адрес в памяти
i2c_wr(0x3B);  // данные
i2c_end();
// читаем память..
i2c_go();
i2c_wr(0xA0);  // i2c адрес микросхемы
i2c_wr(0x05);  // адрес для чтения
i2c_go();      // так надо........
i2c_wr(0xA1);  // запуск чтения
if (i2c_rd(1)==0xF7) t++; // принимаем данные с линии
if (i2c_rd(0)==0x3B) t++; // аск передаем 0, т.к. это последний байт для чтения
i2c_end();
// если все данные прочитаны верно
if (t==2) PORTB.5=1;  // включаем тестовый светодиод
}
}
Добавлено через 41 секунду
Под наши микросхемы коды адреса и данных еще не выбрали.

Добавлено через 59 секунд
С форматом данных и частотой определяемся.

Добавлено через 2 минуты
https://www.instructables.com/... nd_ATmega/
https://www.serasidis.gr/circu... ensors.htm
http://playingwithatmega8.blog... ation.html

Добавлено через 3 минуты
Можно пример с tda7313 посмотреть и переделать, провести аналогии .

Добавлено через 5 минут
http://www.dh3ben.de/html/elec... eamp.shtml немного не по теме
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 14:26  [ТС] 14
Переделать пример из интернета для tda7313 на PT2312A,а также для LC72131.
0
Вложения
Тип файла: rar audio_m8_tda7313.rar (1.33 Мб, 0 просмотров)
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 14:37  [ТС] 15
На PT2312A неполный даташит , на CD2312 не могу найти .
С PT2313

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <Wire.h>
#include <PT2313.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
#include <EEPROM.h>//#include <EEPROMex.h>- для старой версии Arduino IDE
PT2313 audioChip;
 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
 byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
 byte menu,in,w,w1;
 int vol,z,vol_d,bass,treb,balans;
 unsigned long time;
void setup(){
  Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);
  audioChip.initialize(0,true);
  pinMode(12,INPUT);// меню
  pinMode(11,INPUT);// плюс
  pinMode(10,INPUT);// минус
  pinMode(9,INPUT);// IN
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  lcd.createChar(0,a1); lcd.createChar(1,a2);
  audio();
}
void loop(){
    if(digitalRead(12)==HIGH){menu++;time=millis();w1=1;w=1;cl();if(menu>3){menu=0;}}// меню
    if(digitalRead(9)==HIGH){in++;time=millis();w1=1;audio();delay(200);if(in>2){in=0;}}// in
  // индикация громкости + управление кнопками //////////////
   if(menu==0){
   if(digitalRead(11)==HIGH){vol++;w=1;if(vol>62){vol=62;}}// 47 максимальная громкость  
   if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости 
   if(w==1){audio();cl();time=millis();w=0;w1=1;}
  lcd.setCursor(0,0);lcd.print("Volume ");
  lcd.print(-62+vol);lcd.setCursor(11,0);lcd.print("dB K");lcd.print(in);
  vol_d=(vol-40);
   if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
   lcd.setCursor(13,1);lcd.print(vol);
 }
 
  // индикация тембр НЧ + управление кнопками //////////////
   if(menu==1){
   if(digitalRead(11)==HIGH){bass++;w=1;if(bass>7){bass=7;}} 
   if(digitalRead(10)==HIGH){bass--;w=1;if(bass<-7){bass=-7;}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
  lcd.setCursor(0,0);lcd.print("Bass      ");
  lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB");
   for(z=-7;z<=bass;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);}
 }
 ///////////////////////////////////////////////////////////
 
   // индикация тембр BЧ + управление кнопками //////////////
   if(menu==2){
   if(digitalRead(11)==HIGH){treb++;w=1;if(treb>7){treb=7;}} 
   if(digitalRead(10)==HIGH){treb--;w=1;if(treb<-7){treb=-7;}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
  lcd.setCursor(0,0);lcd.print("Trebble   ");
  lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB");
   for(z=-7;z<=treb;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);}
 }
 ///////////////////////////////////////////////////////////
 
 // индикация баланс + управление кнопками +\- 4 дБ ///////
   if(menu==3){
   if(digitalRead(11)==HIGH){balans++;w=1;if(balans>4){balans=4;}}
   if(digitalRead(10)==HIGH){balans--;w=1;if(balans<-4){balans=-4;}}
  lcd.setCursor(0,0);
   if(balans>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(15,1);lcd.print("L");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+8,1);lcd.write((uint8_t)0);}
   if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 /////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w1==1){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
  menu=0;w1=0;cl();
 }
 
}
void cl(){delay(200);lcd.clear();}
void audio(){  
  audioChip.source(in);//select your source 1...3  вход 3...1
  audioChip.volume(vol);//Vol 0...62 шаг 1 дБ
  audioChip.gain(0);//gain 0...3 шаг 3.75 дБ
  audioChip.bass(bass);//bass -7...+7 шаг 2 дБ
  audioChip.treble(treb);//treble -7...+7 шаг 2 дБ
  audioChip.balance(balans);//-31...+31 программно ограничено до +\-8 дБ
  audioChip.loudness(true);//true or false // тонкомпенсация
}
0
Вложения
Тип файла: zip PT2313 (1).zip (463.5 Кб, 0 просмотров)
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 14:56  [ТС] 16
https://datasheetspdf.com/pdf-... s/SC7312/1

Добавлено через 47 секунд
https://pdf1.alldatasheet.com/... T2312.html

Добавлено через 5 минут
Мне собственно на CD2312 даташит нужен (плохо скачивается)

Добавлено через 1 минуту
https://pdf1.alldatasheet.com/... T2312.html

Добавлено через 9 минут
А в LC72131 DI,DO,CL,CE (не I2C, похожа на модифицированную SPI, битбанг , как и с LM7001,другие коды ).

Добавлено через 50 секунд
Это в тюнере I2C .
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 15:06  [ТС] 17
Нашел аналог, переделать под АТМЕГА8А, кварц синтезатора 4,5 МГц (такой есть , а там 7,2 МГц ), схема другая .
0
Вложения
Тип файла: zip 100602Radio-synt-LC72131.zip (15.18 Мб, 0 просмотров)
Тип файла: zip radio (1).zip (262.1 Кб, 0 просмотров)
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 15:11  [ТС] 18
Упростить .
0
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 15:15  [ТС] 19
Для PT2313 даташит (28 выводов)
0
Вложения
Тип файла: pdf pt2313.pdf (281.6 Кб, 0 просмотров)
3 / 3 / 0
Регистрация: 29.06.2018
Сообщений: 1,236
11.06.2021, 15:16  [ТС] 20
У PT2312A 32 вывода
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2021, 15:16

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Проблема с tv-тюнером
привет всем а у меня как всегда вопросы ???? слушайте-- у меня монитор LG с встроенным тв -тюнером...

Работа с FM тюнером
Здравствуйте. Возможно ли как то в Android получать FM сигнал и обрабатывать его ? Api какой нидь ?...

Монитор с встроенным тв-тюнером
Удумал взять 27' моник, посмотрел по сайтам, многие производители предлагают мониторы с встроенными...

Усилитель с тюнером на микросхемах
Эскиз схемы усилителя на микросхемах TDA2030A,TDA1524A с тюнером на микросхеме CXA1538S(TEA5711)...

Стоит ли покупать монитор с тв тюнером?
Доброго дня! Дело в том что нашел монитор - он мне понравился, но меня напрягло наличие там тв...

Удаленный контроль тюнером из соседней комнаты
Здравствуйте. Есть некий спутниковый ТВ-тюнер и подсоединенные к нему два телевизора. Один из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.