Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Программирование ATTINY2313A-PU в среде Arduino IDE 1.8.2

Тема в разделе "Общие вопросы по электронике", создана пользователем alexlaw, 23 май 2019.

  1. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    К сожалению пока не получается.
    Попробовал в Proteus, то же самое, что и в железе.
    Не правильный ход мыслей.
    Может у кого получится.
    Скетч - Usart_1Wire.
    Остальные работают правильно.
     

    Вложения:

  2. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    Подсказка.
    суть в том, что вам надо объединить два сигнала туда и обратно так, чтобы выход не закоротил вход при работе 1-wire в сторону UART
    Классически это решается созданием на выходе третьего состояния (состояние большого сопротивления фактически разрыв цепи), когда сигнал идет в сторону UART
    Если взять диод, то при подаче обратного напряжения его сопротивление станет большим- т е. диод и создаст третье состояние.
    Как это сделать? Как включить диод чтобы создать такой режим?
    Подумайте над этим.
     
  3. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Получилось.
    Usart_1Wire_No_interrupt (раскрыть)
    Код (Text):
    1. //http://microsin.net/programming/AVR/avr318-dallas-1-wire-master.html
    2. //https://www.maximintegrated.com/en/app-notes/index.mvp/id/214
    3. unsigned char temp;
    4. unsigned int tmp;
    5. uint8_t WireCRC;
    6. byte Num[10] ={126,48,109,121,51,91,95,112,127,123};
    7. int slaveSelect=14;
    8. int din=6;
    9. int clk=15;
    10. // буфер данных
    11. // 8 байт - CRC
    12. // Если вычисленный CRC совпадает с прочитанным CRC, то
    13. // данные были получены без ошибок
    14. //7 байт - 0x10, 6 байт - 0x0C, 5 байт - 0xFF
    15. byte bufData[9];
    16. byte a,b,n;
    17. void setup() {
    18.   pinMode(slaveSelect, OUTPUT);
    19.   pinMode(din, OUTPUT);
    20.   pinMode(clk, OUTPUT);
    21.   pinMode(12, OUTPUT);
    22.   digitalWrite(12,0);
    23. sendCommand(12,1); //normal mode (default is shutdown mode)
    24. sendCommand (15,0); //Display test off
    25. sendCommand (10,6); //set medium intensity (range is 0-15)
    26. sendCommand (11, 7); //7219 digit scan limit command
    27. sendCommand (9, 0); //decode command, use standard 7-segment digits
    28. clearDisp();
    29. //---------------------
    30. //CodeVisionAVR V2.05.0
    31. // USART initialization
    32. // Communication Parameters: 8 Data, 1 Stop, No Parity
    33. // USART Receiver: On
    34. // USART Transmitter: On
    35. // USART Mode: Asynchronous
    36. UCSRA=0x00;
    37. UCSRB=0x18;
    38. UCSRC=0x06;
    39. // USART Baud Rate: 115200
    40. UBRRH=0x00;
    41. UBRRL=0x03;
    42. //---------------------
    43. //digitalWrite(12,DetectPresence());
    44. }
    45.  
    46. void loop() {
    47. a=0;b=0;n=0;
    48. DetectPresence();// сброс шины
    49. Wire_Transmit(0xCC);// пропуск ROM
    50. Wire_Transmit(0x44);//инициализация измерения
    51. delay(900);  // пауза
    52. DetectPresence();// сброс шины
    53. Wire_Transmit(0xCC);// пропуск ROM
    54. Wire_Transmit(0xBE);// чтение памяти датчика
    55. for(int i = 0; i < 72; i++) { //чтение 9 байт памяти датчика      
    56.      if (a==8) {
    57.         bufData[n]=b;
    58.         a=0;
    59.         b=0;
    60.         n++;      
    61.      }
    62. b |= (ReadBit()<<a);
    63. a++;      
    64. }
    65. //вести подсчет CRC по алгоритму для всех байтов,
    66. //включая последний байт контрольной суммы.
    67. //если искажений не было, получится 0.
    68. //для 8 байт crc равно 8 байту буфера
    69. WireCRC=OneWireCRC (8);
    70. if (bufData[9]==WireCRC)digitalWrite(12,0); //OK
    71. else digitalWrite(12,1);//ошибка crc
    72.     if ((bufData[1]&128) != 0)//'-' отрицательная температура
    73.     {          
    74.       sendCommand (5, 1);
    75.       tmp = ((unsigned char)bufData[1]<<8) | bufData[0];
    76.       tmp = ~tmp + 1;
    77.       bufData[0] = tmp;
    78.       bufData[1] = tmp>>8;
    79.     }
    80. temp = bufData[0]>>4 | bufData[1]<<4;
    81. sendCommand (4, Num[temp/10]);
    82. sendCommand (3, Num[temp % 10]);
    83. //delay(2000);
    84. ////отладка-------------------
    85. //disp(WireCRC,0);//расчетное crc
    86. //delay(2000);
    87. //disp(bufData[9],128); //crc полученное от датчика
    88. delay(2000);
    89. clearDisp();
    90. //отладка-------------------
    91. }
    92. void clearDisp()
    93. {
    94. sendCommand (8, 0);
    95. sendCommand (7, 0);
    96. sendCommand (6, 0);
    97. sendCommand (5, 0);
    98. sendCommand (4, 1);
    99. sendCommand (3, 1);
    100. sendCommand (2, 99);
    101. sendCommand (1, 78);//t*C  --*  
    102. }
    103. void sendCommand(byte cmd, byte data)
    104. {
    105. digitalWrite(slaveSelect, LOW); //chip select is active low
    106. // передать старший байт
    107. shiftOut(din, clk, MSBFIRST, cmd);
    108. // передать младший байт
    109. shiftOut(din, clk, MSBFIRST, data);
    110. digitalWrite(slaveSelect,HIGH);
    111. }
    112. unsigned char TouchBit(unsigned char outValue)
    113. {  
    114.     // Place the output value in the UART transmit buffer, and wait
    115.     // until it is received by the UART receiver.
    116.     UDR = outValue;
    117.     while(!(UCSRA & (1 << RXC)))
    118.     {
    119.     }
    120.     // Set the UART Baud Rate back to 115200kbps when finished.
    121.     // USART Baud Rate: 115200
    122.     UBRRH=0x00;
    123.     UBRRL=0x03;
    124.     return UDR;
    125. }
    126. unsigned char DetectPresence()
    127. {
    128.     // Reset UART receiver to clear RXC register.
    129.     UCSRB &= ~(1 << RXEN);
    130.     UCSRB |= (1 << RXEN);  
    131.     // Set UART Baud Rate to 9600 for Reset/Presence signalling.
    132.     // USART Baud Rate: 9600
    133.     UBRRH=0x00;
    134.     UBRRL=0x33;  
    135.     // Return 0 if the value received matches the value sent.
    136.     // return 1 else. (Presence detected)
    137.     return (TouchBit(0xF0) != 0xF0);
    138. }
    139. void WriteBit1()
    140. {
    141.     TouchBit(0xff);
    142. }
    143. void WriteBit0()
    144. {
    145.     TouchBit(0x00);
    146. }
    147. void Wire_Transmit(unsigned int data)
    148. {
    149. for(int i = 0; i < 8; i++)
    150. {
    151.    if(data&0x01) WriteBit1();
    152.       else WriteBit0();  
    153.    data = data >> 1; // Следующий бит
    154. }
    155. }
    156. unsigned char ReadBit(){
    157.      // Return 1 if the value received matches the value sent.
    158.      // Return 0 else. (A slave held the bus low).
    159.      return (TouchBit(0xff) == 0xff);
    160. }
    161. uint8_t OneWireCRC (int bytes) {
    162.   uint8_t crc = 0;
    163.   for (int j=0; j<bytes; j++) {
    164.     crc = crc ^ bufData[j];
    165.     for (int i=0; i<8; i++) crc = crc>>1 ^ ((crc & 1) ? 0x8c : 0);
    166.   }
    167.   return crc;
    168. }
    169. //отладка-------------------
    170. //1-lsb-младший бит,8-msb-старший бит
    171. void disp(unsigned char data,unsigned char dot){
    172. for(int i = 1; i < 9; i++) {
    173.   if (i==8) sendCommand (i, Num[data & 0x01] | dot);
    174.   else  sendCommand (i, Num[data & 0x01]);
    175.   data = data >> 1; // Следующий бит
    176. }
    177. }
    178. //отладка-------------------
     
  4. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Вариант с диодом.
    USART3.png п
    В протеусе работает, в железе не пробовал.
     
    nikolz нравится это.
  5. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Тестирование кнопок
    Button.png
    скетч (раскрыть)
    Код (Text):
    1. //https://play.google.com/store/apps/details?id=com.peterhohsy.atmega_tutoriallite&hl=ru
    2. #include <util/delay.h>
    3. #define Keypad1_PORT    PORTB
    4. #define Keypad1_DIR     DDRB
    5. #define Keypad1_PIN     PINB
    6.  
    7. #define Segment1_PORT    PORTD
    8. #define Segment1_DIR     DDRD
    9. #define Segment1_PIN     PIND
    10.  
    11. #define KEYPAD_NO_PRESS  (unsigned char) 0xFF
    12. #define KEY1_PRESS       (unsigned char) 0
    13. #define KEY2_PRESS       (unsigned char) 1
    14. #define KEY3_PRESS       (unsigned char) 2
    15. #define KEY4_PRESS       (unsigned char) 3
    16. #define KEY5_PRESS       (unsigned char) 4
    17. #define KEY6_PRESS       (unsigned char) 5
    18. #define KEY7_PRESS       (unsigned char) 6
    19. #define KEY8_PRESS       (unsigned char) 7
    20. #define KEY9_PRESS       (unsigned char) 8
    21. #define KEY10_PRESS      (unsigned char) 9
    22. #define KEY11_PRESS      (unsigned char) 10
    23. #define KEY12_PRESS      (unsigned char) 11
    24. #define KEY13_PRESS      (unsigned char) 12
    25. #define KEY14_PRESS      (unsigned char) 13
    26. #define KEY15_PRESS      (unsigned char) 14
    27. #define KEY16_PRESS      (unsigned char) 15
    28.  
    29. #define KEY_RELEASE   1
    30. #define KEY_PRESS     0
    31.  
    32. unsigned char segment1[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; // 0~F
    33. unsigned char Keypad1_Data  = 0;      
    34. unsigned char Keypad1_State = KEY_RELEASE;
    35. int key;
    36. void setup() {
    37. // Если  вывод  функционирует  как  вход, то
    38. //при  установке  бита  PORTxn  в  1  подтягивающий  резистор
    39. //подключается между выводом микроконтроллера и шиной питания.
    40. Keypad1_PORT=0xFF;// pullup
    41. //Бит  DDxn  регистра  DDx  определяет  направление  передачи  данных
    42. //через контакт ввода/вывода. Если этот бит установлен в 1, то nй вывод
    43. //порта является выходом, если же сброшен в 0 — входом.
    44. Keypad1_DIR=0x00;// input
    45.  
    46. //Если бит установлен в 1, на выводе устанавливается
    47. //напряжение ВЫСОКОГО уровня.
    48. Segment1_PORT=0x00;// low
    49. //Бит  DDxn  регистра  DDxв установлен в 1, то nй вывод
    50. //порта является выходом
    51. //---------------
    52. Segment1_DIR=0x7F;// output
    53. Segment1_off();
    54. }
    55.  
    56. void loop() {  
    57.        key = Get_Keypad1_Press();  
    58.        if (key !=KEYPAD_NO_PRESS)
    59.        {  
    60.             Segment1_ShowDigit(key & 0x0f);
    61.        }
    62. delay(100);
    63. //Segment1_off();
    64. }
    65. // show hexadecimal 0 ~ F
    66. void Segment1_ShowDigit(unsigned char hexadecimal)
    67. {
    68.       Segment1_PORT = segment1[ hexadecimal & 0x0f];
    69. }
    70. void Segment1_off()
    71. {
    72.       Segment1_PORT = 0x00;
    73. }
    74. // show pattern : 00 ~ FF
    75. //     a
    76. //    --
    77. // f |  | b
    78. //    -- g
    79. // e |  | c
    80. //    --
    81. //    d
    82. //  bit6 bit5 bit4 bit3 bit2 bit1 bit0
    83. //    g   f    e    d    c    b    a
    84. void Segment1_ShowPattern(unsigned char pattern) // 00-FF
    85. {
    86.     Segment1_PORT = pattern;
    87. }
    88. unsigned char Get_Keypad1_Press()
    89. {
    90.     unsigned char temp1 = 0xff;
    91.     if (Keypad1_State == KEY_RELEASE)
    92.     {
    93.         // input | output
    94.         Keypad1_DIR = 0x0F;      
    95.         Keypad1_PORT = 0xF0;  
    96. _delay_loop_2(8);
    97.         switch (Keypad1_PIN & 0xF0)
    98.         {
    99.                case 0xE0 : temp1=0 ; break;
    100.                case 0xD0 : temp1=1 ; break;
    101.                case 0xB0 : temp1=2 ; break;
    102.                case 0x70 : temp1=3; break;
    103.                default : temp1=0xff; break;
    104.          }
    105.          if (temp1==0xff)
    106.          {
    107.              Keypad1_Data = KEYPAD_NO_PRESS;
    108.              return KEYPAD_NO_PRESS;
    109.          }
    110.          Keypad1_Data = temp1 * 4;
    111.  
    112.         //  output | input
    113.         Keypad1_DIR = 0xF0;      
    114.         Keypad1_PORT = 0x0F;  
    115. _delay_loop_2(8);
    116.         switch (Keypad1_PIN & 0x0F)
    117.         {
    118.                case 0x0E : temp1=0 ; break;
    119.                case 0x0D : temp1=1 ; break;
    120.                case 0x0B : temp1=2 ; break;
    121.                case 0x07 : temp1=3;  break;
    122.                default : temp1=0xff; break;
    123.         }
    124.         if (temp1==0xff)
    125.         {
    126.             Keypad1_Data = KEYPAD_NO_PRESS;
    127.             return KEYPAD_NO_PRESS;
    128.         }
    129.         else
    130.         {
    131.             delay(25);
    132.             Keypad1_Data = Keypad1_Data + temp1;
    133.             Keypad1_State = KEY_PRESS;
    134.             return  KEYPAD_NO_PRESS ;
    135.         }
    136.       }
    137.       else
    138.       {
    139.           Keypad1_DIR = 0x0F;  
    140.           Keypad1_PORT = 0xF0;
    141. _delay_loop_2(8);
    142.           switch (Keypad1_PIN & 0xF0)
    143.           {
    144.               case 0xE0 : temp1=0 ; break;
    145.               case 0xD0 : temp1=1 ; break;
    146.               case 0xB0 : temp1=2 ; break;
    147.               case 0x70 : temp1=3; break;
    148.               default : temp1=0xff; break;
    149.           }
    150.           if (temp1 != 0xff)
    151.               return KEYPAD_NO_PRESS;
    152.           else
    153.           {
    154.               Keypad1_State = KEY_RELEASE;
    155.               return Keypad1_Data;
    156.           }    
    157.      }
    158. }
     

    Вложения:

    • keypad.zip
      Размер файла:
      27 КБ
      Просмотров:
      0
  6. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    Задачка.
    Все кнопки можно подключить к одному пину,
    если сразу не получится, то максимум к двум.
    число кнопок -любое.
    подумайте над этим
     
  7. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    У Attiny2313 отсутствует Аналого\цифровой преобразователь.
    А с помощью аналогового компаратора, мне кажется слишком трудоемко и не эффективно.
    В общем, пока не вижу как подключить много кнопок к одному пину. Если знаете подскажите куда двигаться.
    PS Памяти всего 2 кб, поэтому экономить пины мне кажется нецелесообразно.
     
  8. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    я разве указал что это аналоговый пин?
    К аналоговому и д... сможет
    Задача подключить бесконечное число кнопок к любому пину или двум которые являются бинарными PIO.
    Подумайте над этим
     
  9. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Здравствуйте.
    Кнопки пока решил отложить - не определился с концепцией.
    То ли использовать дополнительный сдвиговый регистр, то ли измерять время
    зарядки конденсатора. Ну да ладно.
    Жду когда придут часы реального времени DS1302. А пока эмулирую в протеусе.
    Так вот если подключить виртуальный осциллограф к схеме, то время считывается
    правильно, если его отключить, то не правильно.
    В чем может быть причина?
    PS Меня интересует именно функции shiftOut и shiftIn,
    поэтому прошу не переводить вопрос на другие возможности (другая эмуляция SPI и т.п.)
     

    Вложения:

  10. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    вопрос не понятный.
    В протеусе подключаете?
    Посмотрите какие параметры этого осциллографа
    В этом и есть разница - с ним и без него.
     
  11. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Поставил диод на линию DIN на max7219 и все заработало.
    DS1302_MAX7219.png
    скетч (раскрыть)
    Код (Text):
    1. //-----------------------------------------------------------------------------
    2. /*                                   ATTINY2313
    3.                              =========================
    4.                           ATTINY      ARDUINO     ATTINY
    5.                    PA0/XTAL1 || 5 -  3        9 - 12 || PB0/AIN0/PCINT0    
    6.                    PA1/XTAL2 || 4 -  2       10 - 13 || PB1/AIN1/PCINT1
    7.                    PA2/RESET || 1 -  17      11 - 14 || PB2/OC0A/PCINT2
    8.                              ||              12 - 15 || PB3/OC1A/PCINT3  
    9.                      PD0/RXD || 2 -  0       13 - 16 || PB4/OC1B/PCINT4
    10.                      PD1/TXD || 3 -  1       14 - 17 || PB5/MOSI/DI/SDA/PCINT5
    11.           PD2/INT0/XCK/CKOUT || 6 -  4       15 - 18 || PB6/MISO/DO/PCINT6
    12.                     PD3/INT1 || 7 -  5       16 - 19 || PB7/USCK/SCL/PCINT7
    13.                       PD4/T0 || 8 -  6               ||
    14.                  PD5/T1/OC0B || 9 -  7               ||
    15.                      PD6/ICP || 11 - 8               ||
    16.                           ATTINY      ARDUINO     ATTINY                  
    17.                              =========================
    18.                                      ATTINY2313    */
    19. //-----------------------------------------------------------------------------                                    
    20. unsigned char temp;
    21. unsigned char prevtemp=100;
    22. unsigned int tmp;
    23.              //0  1  2   3   4  5  6  7  8   9   A    B  C  D  E  F
    24. byte Num[] ={126,48,109,121,51,91,95,112,127,123,119,31,78,61,79,71};
    25. uint8_t TimeBytes[7];// = {0,0,0,0,0,0,0};
    26. int slaveSelect=14;
    27. int din=6;
    28. int clk=15;
    29. // буфер данных
    30. // 8 байт - CRC
    31. // Если вычисленный CRC совпадает с прочитанным CRC, то
    32. // данные были получены без ошибок
    33. //7 байт - 0x10, 6 байт - 0x0C, 5 байт - 0xFF
    34. byte bufData[9];
    35. byte a,b,n;
    36. void setup() {
    37.   pinMode(slaveSelect, OUTPUT);
    38.   pinMode(din, OUTPUT);
    39.   pinMode(clk, OUTPUT);
    40. sendCommand7219(12,1); //normal mode (default is shutdown mode)
    41. sendCommand7219 (15,0); //Display test off
    42. sendCommand7219 (10,6); //set medium intensity (range is 0-15)
    43. sendCommand7219 (11, 7); //7219 digit scan limit command
    44. sendCommand7219 (9, 0); //decode command, use standard 7-segment digits
    45.   //УСТАНОВИТЬ ВРЕМЯ 30.11.1994 23 часа 45 мин 30 сек
    46.   sendCommand1302(0x86, 0x30);
    47.   sendCommand1302(0x88, 0x11);
    48.   sendCommand1302(0x8C, 0x94);
    49. //  sendCommand1302(0x84, 0x23);
    50. //  sendCommand1302(0x82, 0x45);
    51. //  sendCommand1302(0x80, 0x30);
    52. //  sendCommand1302(0x8A, 0x01);//день пн
    53. //---------------------
    54. //CodeVisionAVR V2.05.0
    55. // USART initialization
    56. // Communication Parameters: 8 Data, 1 Stop, No Parity
    57. // USART Receiver: On
    58. // USART Transmitter: On
    59. // USART Mode: Asynchronous
    60. UCSRA=0x00;
    61. UCSRB=0x18;
    62. UCSRC=0x06;
    63. // USART Baud Rate: 115200
    64. UBRRH=0x00;
    65. UBRRL=0x03;
    66. //---------------------
    67. //digitalWrite(12,DetectPresence());
    68. }
    69.  
    70. void loop() {
    71. a=0;b=0;n=0;
    72. DetectPresence();// сброс шины
    73. Wire_Transmit(0xCC);// пропуск ROM
    74. Wire_Transmit(0x44);//инициализация измерения
    75. delay(900);  // пауза
    76. DetectPresence();// сброс шины
    77. Wire_Transmit(0xCC);// пропуск ROM
    78. Wire_Transmit(0xBE);// чтение памяти датчика
    79. for(int i = 0; i < 72; i++) { //чтение 9 байт памяти датчика      
    80.      if (a==8) {
    81.         bufData[n]=b;
    82.         a=0;
    83.         b=0;
    84.         n++;      
    85.      }
    86. b |= (ReadBit()<<a);
    87. a++;      
    88. }
    89.  
    90.     if ((bufData[1]&128) != 0)//'-'
    91.     {          
    92.       sendCommand7219 (4, 1);
    93.       tmp = ((unsigned char)bufData[1]<<8) | bufData[0];
    94.       tmp = ~tmp + 1;
    95.       bufData[0] = tmp;
    96.       bufData[1] = tmp>>8;
    97.     } else sendCommand7219 (4, 0);
    98. temp = bufData[0]>>4 | bufData[1]<<4;
    99. sendCommand7219 (3, Num[temp/10]);
    100. sendCommand7219 (2, Num[temp % 10]);
    101. sendCommand7219 (1, 99);
    102. //sendCommand7219 (1, 78);
    103. data1302();
    104. ViewTime(8, TimeBytes[2]);//часы
    105. ViewTime(6, TimeBytes[1]);//минуты
    106. delay(60000);
    107. }
    108.  
    109. void sendCommand7219(byte cmd, byte data)
    110. {
    111. digitalWrite(slaveSelect, LOW); //chip select is active low
    112. // передать старший байт
    113. shiftOut(din, clk, MSBFIRST, cmd);
    114. // передать младший байт
    115. shiftOut(din, clk, MSBFIRST, data);
    116. digitalWrite(slaveSelect,HIGH);
    117. }
    118. void sendCommand1302(byte cmd, byte data)
    119. {
    120. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    121. // передать старший байт
    122. shiftOut(din, clk, LSBFIRST, cmd);
    123. // передать младший байт
    124. shiftOut(din, clk, LSBFIRST, data);
    125. digitalWrite(slaveSelect,LOW);
    126. }
    127. void data1302()
    128. {
    129. //Команда clock burst read с кодом 0xBF считывает текущее состояние часов
    130. //В ответ RTC посылают 7 байт, в которых хранятся соответственно
    131. //секунды, минуты, часы, день, месяц, день недели, год, и кое-какие флаги
    132. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    133. // передать  байт
    134. shiftOut(din, clk, LSBFIRST, 0xBF);
    135. pinMode(din, INPUT);
    136. for(int i = 0; i < 7; i++){
    137. TimeBytes[i]=shiftIn(din, clk, LSBFIRST);
    138. }
    139. digitalWrite(slaveSelect,LOW);
    140. pinMode(din, OUTPUT);
    141. }
    142. unsigned char TouchBit(unsigned char outValue)
    143. {  
    144.     // Place the output value in the UART transmit buffer, and wait
    145.     // until it is received by the UART receiver.
    146.     UDR = outValue;
    147.     while(!(UCSRA & (1 << RXC)))
    148.     {
    149.     }
    150.     // Set the UART Baud Rate back to 115200kbps when finished.
    151.     // USART Baud Rate: 115200
    152.     UBRRH=0x00;
    153.     UBRRL=0x03;
    154.     return UDR;
    155. }
    156. unsigned char DetectPresence()
    157. {
    158.     // Reset UART receiver to clear RXC register.
    159.     UCSRB &= ~(1 << RXEN);
    160.     UCSRB |= (1 << RXEN);  
    161.     // Set UART Baud Rate to 9600 for Reset/Presence signalling.
    162.     // USART Baud Rate: 9600
    163.     UBRRH=0x00;
    164.     UBRRL=0x33;  
    165.     // Return 0 if the value received matches the value sent.
    166.     // return 1 else. (Presence detected)
    167.     return (TouchBit(0xF0) != 0xF0);
    168. }
    169. void WriteBit1()
    170. {
    171.     TouchBit(0xff);
    172. }
    173. void WriteBit0()
    174. {
    175.     TouchBit(0x00);
    176. }
    177. void Wire_Transmit(unsigned int data)
    178. {
    179. for(int i = 0; i < 8; i++)
    180. {
    181.    if(data&0x01) WriteBit1();
    182.       else WriteBit0();  
    183.    data = data >> 1; // Следующий бит
    184. }
    185. }
    186. unsigned char ReadBit(){
    187.      // Return 1 if the value received matches the value sent.
    188.      // Return 0 else. (A slave held the bus low).
    189.      return (TouchBit(0xff) == 0xff);
    190. }
    191.  
    192. void ViewTime(byte high_place, byte data)
    193. {
    194.    sendCommand7219 (high_place, Num[(data & 0xF0) >> 4]);
    195.    sendCommand7219 (high_place-1, Num[data & 0x0F]);
    196. }
    197.  
     
  12. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Несколько ссылок для дальнейшего изучения или я бы назвал "используемая литература"
    Как установить (раскрыть)

    Программная реализация протокола SPI на AVR (раскрыть)

    AVR Урок 28. SPI. Драйвер LED MAX7219 (раскрыть)

    Микроконтроллеры AVR: пример работы с часами реального времени DS1302 (раскрыть)

    AVR Урок 31. Связь ATtiny2313 и Atmega8 по SPI. Часть 1 (раскрыть)

    Arduino and AVR projects (раскрыть)


    Интересный проект
    Музыка на ATtiny2313: двухканальный синтезатор (раскрыть)
     
  13. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    В "железе" с RTC 1302 пришлось немного подкорректировать.
    Выкинул диод и SHIFTIN
    IMG_20190709_145543.jpg
    Схема
    DS1302_MAX7219_1.png
    скетч (раскрыть)
    Код (Text):
    1. //-----------------------------------------------------------------------------
    2. /*                                   ATTINY2313
    3.                              =========================
    4.                           ATTINY      ARDUINO     ATTINY
    5.                    PA0/XTAL1 || 5 -  3        9 - 12 || PB0/AIN0/PCINT0  
    6.                    PA1/XTAL2 || 4 -  2       10 - 13 || PB1/AIN1/PCINT1
    7.                    PA2/RESET || 1 -  17      11 - 14 || PB2/OC0A/PCINT2
    8.                              ||              12 - 15 || PB3/OC1A/PCINT3  
    9.                      PD0/RXD || 2 -  0       13 - 16 || PB4/OC1B/PCINT4
    10.                      PD1/TXD || 3 -  1       14 - 17 || PB5/MOSI/DI/SDA/PCINT5
    11.           PD2/INT0/XCK/CKOUT || 6 -  4       15 - 18 || PB6/MISO/DO/PCINT6
    12.                     PD3/INT1 || 7 -  5       16 - 19 || PB7/USCK/SCL/PCINT7
    13.                       PD4/T0 || 8 -  6               ||
    14.                  PD5/T1/OC0B || 9 -  7               ||
    15.                      PD6/ICP || 11 - 8               ||
    16.                           ATTINY      ARDUINO     ATTINY                
    17.                              =========================
    18.                                      ATTINY2313    */
    19. //-----------------------------------------------------------------------------                                  
    20. int slaveSelect=14;//PB5
    21. int din=6;//PD4
    22. int clk=15;//PB6
    23. uint8_t TimeBytes[] ={0x41,0x42,0x43,0x44,'E','\n','\r'};
    24. byte Num[] ={126,48,109,121,51,91,95,112,127,123,119,31,78,61,79,71};
    25.  
    26. void setup() {
    27.   pinMode(clk, OUTPUT);//7 - 15 PB6 СИНИЙ
    28.   pinMode(din, OUTPUT);//6 - 6 PD4 ЗЕЛЕНЫЙ
    29.   pinMode(slaveSelect, OUTPUT);//5 - 14 PB5 ЖЕЛТЫЙ
    30. sendCommand7219(12,1); //normal mode (default is shutdown mode)
    31. sendCommand7219 (15,0); //Display test off
    32. sendCommand7219 (10,6); //set medium intensity (range is 0-15)
    33. sendCommand7219 (11, 7); //7219 digit scan limit command
    34. sendCommand7219 (9, 0); //decode command, use standard 7-segment digits
    35. sendCommand7219 (8, 0);
    36. sendCommand7219 (7, 61);
    37. sendCommand7219 (6, 91);
    38. sendCommand7219 (5, 1);
    39. sendCommand7219 (4, 48);
    40. sendCommand7219 (3, 121);
    41. sendCommand7219 (2, 126);
    42. sendCommand7219 (1, 109);
    43. delay(1000);
    44. //  //УСТАНОВИТЬ ВРЕМЯ 30.11.94 23 часа 45 мин 00 сек
    45.   sendCommand1302(0x86, 0x30);//день
    46.   sendCommand1302(0x88, 0x11);//месяц
    47.   sendCommand1302(0x8C, 0x94);//год
    48.   sendCommand1302(0x84, 0x23);//час
    49.   sendCommand1302(0x82, 0x45);//мин
    50.   sendCommand1302(0x80, 0x00);//сек
    51.   sendCommand1302(0x8A, 0x01);//день недели пн
    52.  
    53. }
    54.  
    55. void loop() {
    56. data1302();
    57. ViewTime(8, TimeBytes[2]);//часы
    58. sendCommand7219 (6, 1);
    59. ViewTime(5, TimeBytes[1]);//минуты
    60. sendCommand7219 (3, 1);
    61. ViewTime(2, TimeBytes[0]);//секунды
    62. delay(800);
    63. }
    64. void sendCommand7219(byte cmd, byte data)
    65. {
    66. digitalWrite(slaveSelect, LOW); //chip select is active low
    67. // передать старший байт
    68. shiftOut(din, clk, MSBFIRST, cmd);
    69. // передать младший байт
    70. shiftOut(din, clk, MSBFIRST, data);
    71. digitalWrite(slaveSelect,HIGH);
    72. }
    73. void sendCommand1302(byte cmd, byte data)
    74. {
    75. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    76. // передать старший байт
    77. shiftOut(din, clk, LSBFIRST, cmd);
    78. // передать младший байт
    79. shiftOut(din, clk, LSBFIRST, data);
    80. digitalWrite(slaveSelect,LOW);
    81. }
    82. void data1302()
    83. {
    84. //Команда clock burst read с кодом 0xBF считывает текущее состояние часов
    85. //В ответ RTC посылают 7 байт, в которых хранятся соответственно
    86. //секунды, минуты, часы, день, месяц, день недели, год, и кое-какие флаги
    87. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    88. // передать  байт
    89. shiftOut(din, clk, LSBFIRST, 0xBF);
    90. pinMode(din, INPUT);
    91. for(int i = 0; i < 7; i++){
    92. TimeBytes[i]=readByte();
    93. }
    94. digitalWrite(slaveSelect,LOW);
    95. pinMode(din, OUTPUT);
    96. }
    97. uint8_t readByte()
    98. {
    99.   uint8_t value = 0;
    100.   uint8_t currentBit = 0;
    101.  
    102.   for (int i = 0; i < 8; ++i)
    103.   {
    104.     currentBit = digitalRead(din);
    105.     value |= (currentBit << i);
    106.     digitalWrite(clk, HIGH);
    107.     delayMicroseconds(1);
    108.     digitalWrite(clk, LOW);
    109.   }
    110.   return value;
    111. }
    112. void ViewTime(byte high_place, byte data)
    113. {
    114.    sendCommand7219 (high_place, Num[(data & 0xF0) >> 4]);
    115.    sendCommand7219 (high_place-1, Num[data & 0x0F]);
    116. }

    Все работает :)
     
  14. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    А как вам такая схема
    [​IMG]
    --------------------------
    теперь для сравнения нарисуйте тоже самое на STM8L151
    8-bit ultra-low-power MCU, up to 32 KB Flash, 1 KB Data EEPROM, RTC, LCD, timers, USART, I2C, SPI, ADC, DAC, comparators.
    получится и дешевле и проще и меньше кушает и встроенный драйвер индикатора.
     
  15. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    несомненно лучше. Но ...
    ATTINY2313 хорош для начинающих, таких как я.
    А STM8L151 это уже следующий этап.
    К тому же я хотел использовать для программирования среду Arduino IDE, т.к. код в ней можно менять буквально на лету, что хорошо для наглядности и отладки.
    А пока работа с RAM RTC 1302
    скетч (раскрыть)
    Код (Text):
    1. //-----------------------------------------------------------------------------
    2. /*                                   ATTINY2313
    3.                              =========================
    4.                           ATTINY      ARDUINO     ATTINY
    5.                    PA0/XTAL1 || 5 -  3        9 - 12 || PB0/AIN0/PCINT0    
    6.                    PA1/XTAL2 || 4 -  2       10 - 13 || PB1/AIN1/PCINT1
    7.                    PA2/RESET || 1 -  17      11 - 14 || PB2/OC0A/PCINT2
    8.                              ||              12 - 15 || PB3/OC1A/PCINT3  
    9.                      PD0/RXD || 2 -  0       13 - 16 || PB4/OC1B/PCINT4
    10.                      PD1/TXD || 3 -  1       14 - 17 || PB5/MOSI/DI/SDA/PCINT5
    11.           PD2/INT0/XCK/CKOUT || 6 -  4       15 - 18 || PB6/MISO/DO/PCINT6
    12.                     PD3/INT1 || 7 -  5       16 - 19 || PB7/USCK/SCL/PCINT7
    13.                       PD4/T0 || 8 -  6               ||
    14.                  PD5/T1/OC0B || 9 -  7               ||
    15.                      PD6/ICP || 11 - 8               ||
    16.                           ATTINY      ARDUINO     ATTINY                  
    17.                              =========================
    18.                                      ATTINY2313    */
    19. //-----------------------------------------------------------------------------                                    
    20. int slaveSelect=14;//PB5
    21. int din=6;//PD4
    22. int clk=15;//PB6
    23. uint8_t TimeBytes[] ={0x41,0x42,0x43,0x44,'E','\n','\r'};
    24. byte Num[] ={126,48,109,121,51,91,95,112,127,123,119,31,78,61,79,71};
    25. byte ds1302[] ={0,61,91,1,48,121,126,109};
    26. uint8_t ReadBytes[8];
    27. void setup() {
    28.   pinMode(clk, OUTPUT);//7 - 15 PB6 СИНИЙ
    29.   pinMode(din, OUTPUT);//6 - 6 PD4 ЗЕЛЕНЫЙ
    30.   pinMode(slaveSelect, OUTPUT);//5 - 14 PB5 ЖЕЛТЫЙ
    31. sendCommand7219(12,1); //normal mode (default is shutdown mode)
    32. sendCommand7219 (15,0); //Display test off
    33. sendCommand7219 (10,6); //set medium intensity (range is 0-15)
    34. sendCommand7219 (11, 7); //7219 digit scan limit command
    35. sendCommand7219 (9, 0); //decode command, use standard 7-segment digits
    36.  
    37. sendCommand7219 (0x0C,0); //Display  off
    38. delay(100);
    39. //УСТАНОВИТЬ ВРЕМЯ
    40.   sendCommand1302(0x86, 0x10);//день
    41.   sendCommand1302(0x88, 0x07);//месяц
    42.   sendCommand1302(0x8C, 0x19);//год
    43.   sendCommand1302(0x84, 0x12);//час
    44.   sendCommand1302(0x82, 0x25);//мин
    45.   sendCommand1302(0x80, 0x00);//сек
    46.   sendCommand1302(0x8A, 0x03);//день недели
    47.     for (int i = 0; i < 8; ++i)
    48.   {  
    49.     sendCommand1302((i * 2) + 192, ds1302[i]);//запись 8 байт в RAM
    50.   }
    51.   delay(1000);
    52.   //чтение 8 байт из RAM
    53.       for (int i = 0; i < 8; ++i)
    54.   {  
    55.     digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    56.     shiftOut(din, clk, LSBFIRST, (i * 2) + 193);
    57.     pinMode(din, INPUT);
    58.     ReadBytes[i]=readByte();
    59.     digitalWrite(slaveSelect,LOW);
    60.     pinMode(din, OUTPUT);
    61.   }
    62.         for (int i = 1; i < 9; ++i)
    63.   {
    64.     sendCommand7219 (i, ReadBytes[8-i]);  
    65.   }
    66.   sendCommand7219 (0x0C,1); //Display  on
    67.   delay(2000);
    68. }
    69.  
    70. void loop() {
    71. data1302();
    72. ViewTime(8, TimeBytes[2]);//часы
    73. sendCommand7219 (6, TimeBytes[0]&0x01);
    74. ViewTime(5, TimeBytes[1]);//минуты
    75. sendCommand7219 (3, !(TimeBytes[0]&0x01));
    76. ViewTime(2, TimeBytes[0]);//секунды
    77. delay(1000);
    78. }
    79. void sendCommand7219(byte cmd, byte data)
    80. {
    81. digitalWrite(slaveSelect, LOW); //chip select is active low
    82. // передать старший байт
    83. shiftOut(din, clk, MSBFIRST, cmd);
    84. // передать младший байт
    85. shiftOut(din, clk, MSBFIRST, data);
    86. digitalWrite(slaveSelect,HIGH);
    87. }
    88. void sendCommand1302(byte cmd, byte data)
    89. {
    90. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    91. // передать старший байт
    92. shiftOut(din, clk, LSBFIRST, cmd);
    93. // передать младший байт
    94. shiftOut(din, clk, LSBFIRST, data);
    95. digitalWrite(slaveSelect,LOW);
    96. }
    97. void data1302()
    98. {
    99. //Команда clock burst read с кодом 0xBF считывает текущее состояние часов
    100. //В ответ RTC посылают 7 байт, в которых хранятся соответственно
    101. //секунды, минуты, часы, день, месяц, день недели, год, и кое-какие флаги
    102. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    103. // передать  байт
    104. shiftOut(din, clk, LSBFIRST, 0xBF);
    105. pinMode(din, INPUT);
    106. for(int i = 0; i < 7; i++){
    107. TimeBytes[i]=readByte();
    108. }
    109. digitalWrite(slaveSelect,LOW);
    110. pinMode(din, OUTPUT);
    111. }
    112. uint8_t readByte()
    113. {
    114.   uint8_t value = 0;
    115.   uint8_t currentBit = 0;
    116.  
    117.   for (int i = 0; i < 8; ++i)
    118.   {
    119.     currentBit = digitalRead(din);
    120.     value |= (currentBit << i);
    121.     digitalWrite(clk, HIGH);
    122.     delayMicroseconds(1);
    123.     digitalWrite(clk, LOW);
    124.   }
    125.   return value;
    126. }
    127. void ViewTime(byte high_place, byte data)
    128. {
    129.    sendCommand7219 (high_place, Num[(data & 0xF0) >> 4]);
    130.    sendCommand7219 (high_place-1, Num[data & 0x0F]);
    131. }
    132.  
     
  16. fps

    fps Читатель

    Сообщения:
    55
    Симпатии:
    13
    Интересная задача.
    Надеюсь она не подразумевает дополнительных микросхем и/или RC цепочек?
    Тогда не могу придумать. Нужна подсказка.
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    микросхем нет, а пассивные элементы надо,
    без них не делал.
     
  18. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Добавил кнопку для установки часов (время настраивается заранее, кнопка для синхронизации программного и реального времени)
    DS1302.png
     

    Вложения:

    • ds1302.zip
      Размер файла:
      25,1 КБ
      Просмотров:
      0
  19. nikolz

    nikolz Гуру

    Сообщения:
    4.139
    Симпатии:
    431
    посмотрите есть ли внутренняя подтяжка
    если нет то надо добавить чтобы от помех не синхронизировалось
    еще можно ток LED уменьшить
    да и зачем он если есть дисплей
     
  20. alexlaw

    alexlaw Новичок

    Сообщения:
    77
    Симпатии:
    1
    Светодиоды для наглядности.
    Сработает прерывание при наж кнопок, светодиод мигнет.
    Продолжаю изучать кнопки
    DS1302-led.png
    скетч (раскрыть)
    Код (Text):
    1. //-----------------------------------------------------------------------------
    2. /*                                   ATTINY2313
    3.                              =========================
    4.                           ATTINY      ARDUINO     ATTINY
    5.                    PA0/XTAL1 || 5 -  3        9 - 12 || PB0/AIN0/PCINT0    
    6.                    PA1/XTAL2 || 4 -  2       10 - 13 || PB1/AIN1/PCINT1
    7.                    PA2/RESET || 1 -  17      11 - 14 || PB2/OC0A/PCINT2
    8.                              ||              12 - 15 || PB3/OC1A/PCINT3  
    9.                      PD0/RXD || 2 -  0       13 - 16 || PB4/OC1B/PCINT4
    10.                      PD1/TXD || 3 -  1       14 - 17 || PB5/MOSI/DI/SDA/PCINT5
    11.           PD2/INT0/XCK/CKOUT || 6 -  4       15 - 18 || PB6/MISO/DO/PCINT6
    12.                     PD3/INT1 || 7 -  5       16 - 19 || PB7/USCK/SCL/PCINT7
    13.                       PD4/T0 || 8 -  6               ||
    14.                  PD5/T1/OC0B || 9 -  7               ||
    15.                      PD6/ICP || 11 - 8               ||
    16.                           ATTINY      ARDUINO     ATTINY                  
    17.                              =========================
    18.                                      ATTINY2313    */
    19. //-----------------------------------------------------------------------------                                    
    20. //https://www.myrobot.ru/stepbystep/pr_mcports.php
    21. int slaveSelect=14;//PB5
    22. int din=6;//PD4
    23. int clk=15;//PB6
    24. uint8_t TimeBytes[] ={0x41,0x42,0x43,0x44,'E','\n','\r'};
    25. byte Num[] ={126,48,109,121,51,91,95,112,127,123,119,31,78,61,79,71};
    26. byte ds1302[] ={0,61,91,1,48,121,126,109};
    27. boolean b = false;
    28. void setup() {
    29. //pb0 pb1 pb2 кнопки
    30. //pb3 pb4 светодиод  
    31. PORTB |= (1 << 0) | (1 << 1 ) | (1 << 2);// Set bits - pullup
    32. DDRB &= ~((1 << 0)  | (1 << 1)  | (1 << 2));// Clear bit - input
    33. PORTB &= ~((1 << 3)  |  (1 << 4));// Clear bit - low
    34. DDRB |= (1 << 3) | (1 << 4);// Set bits - output
    35. GIMSK |= (1 << PCIE);// Set bits - Разрешение прерывания по изменению состояния выводов 0й группы - PCINT.
    36. //PCMSK Определяют условие генерации прерывания PCI0. Если какойлибо
    37. //бит установлен в 1, то изменение состояния соответствующего вывода
    38. //вызовет генерацию прерывания
    39. PCMSK |= (1 << 0) | (1 << 1) | (1 << 2);// Set bits -прерывание по изменению состояния вывода 0 или 1  или 2 - PCINT
    40.  
    41.   pinMode(clk, OUTPUT);//7 - 15 PB6 СИНИЙ
    42.   pinMode(din, OUTPUT);//6 - 6 PD4 ЗЕЛЕНЫЙ
    43.   pinMode(slaveSelect, OUTPUT);//5 - 14 PB5 ЖЕЛТЫЙ
    44. sendCommand7219(12,1); //normal mode (default is shutdown mode)
    45. sendCommand7219 (15,0); //Display test off
    46. sendCommand7219 (10,6); //set medium intensity (range is 0-15)
    47. sendCommand7219 (11, 7); //7219 digit scan limit command
    48. sendCommand7219 (9, 0); //decode command, use standard 7-segment digits
    49.         for (int i = 1; i < 9; ++i)
    50.   {
    51.     sendCommand7219 (i, ds1302[8-i]);  
    52.   }
    53.   delay(2000);
    54. }
    55.  
    56. void loop() {
    57. if (b) SetTime();
    58. data1302();
    59. ViewTime(8, TimeBytes[2]);//часы
    60. sendCommand7219 (6, TimeBytes[0]&0x01);
    61. ViewTime(5, TimeBytes[1]);//минуты
    62. sendCommand7219 (3, !(TimeBytes[0]&0x01));
    63. ViewTime(2, TimeBytes[0]);//секунды
    64. delay(1000);
    65. }
    66. void sendCommand7219(byte cmd, byte data)
    67. {
    68. digitalWrite(slaveSelect, LOW); //chip select is active low
    69. // передать старший байт
    70. shiftOut(din, clk, MSBFIRST, cmd);
    71. // передать младший байт
    72. shiftOut(din, clk, MSBFIRST, data);
    73. digitalWrite(slaveSelect,HIGH);
    74. }
    75. void sendCommand1302(byte cmd, byte data)
    76. {
    77. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    78. // передать старший байт
    79. shiftOut(din, clk, LSBFIRST, cmd);
    80. // передать младший байт
    81. shiftOut(din, clk, LSBFIRST, data);
    82. digitalWrite(slaveSelect,LOW);
    83. }
    84. void data1302()
    85. {
    86. //Команда clock burst read с кодом 0xBF считывает текущее состояние часов
    87. //В ответ RTC посылают 7 байт, в которых хранятся соответственно
    88. //секунды, минуты, часы, день, месяц, день недели, год, и кое-какие флаги
    89. digitalWrite(slaveSelect,HIGH); //chip select is active HIGH
    90. // передать  байт
    91. shiftOut(din, clk, LSBFIRST, 0xBF);
    92. pinMode(din, INPUT);
    93. for(int i = 0; i < 7; i++){
    94. TimeBytes[i]=readByte();
    95. }
    96. digitalWrite(slaveSelect,LOW);
    97. pinMode(din, OUTPUT);
    98. }
    99. uint8_t readByte()
    100. {
    101.   uint8_t value = 0;
    102.   uint8_t currentBit = 0;
    103.  
    104.   for (int i = 0; i < 8; ++i)
    105.   {
    106.     currentBit = digitalRead(din);
    107.     value |= (currentBit << i);
    108.     digitalWrite(clk, HIGH);
    109.     delayMicroseconds(1);
    110.     digitalWrite(clk, LOW);
    111.   }
    112.   return value;
    113. }
    114. void ViewTime(byte high_place, byte data)
    115. {
    116.    sendCommand7219 (high_place, Num[(data & 0xF0) >> 4]);
    117.    sendCommand7219 (high_place-1, Num[data & 0x0F]);
    118. }
    119. void SetTime()
    120. {
    121. //УСТАНОВИТЬ ВРЕМЯ
    122.   sendCommand1302(0x86, 0x10);//день
    123.   sendCommand1302(0x88, 0x07);//месяц
    124.   sendCommand1302(0x8C, 0x19);//год
    125.   sendCommand1302(0x84, 0x12);//час
    126.   sendCommand1302(0x82, 0x25);//мин
    127.   sendCommand1302(0x80, 0x00);//сек
    128.   sendCommand1302(0x8A, 0x03);//день недели
    129.   b = false;
    130. }
    131. ISR(PCINT_vect) {
    132.   //наж кн pb0
    133.   if (!(PINB & 0x01)) PORTB |= (1 << 3);// Set bits - high pb3
    134.   else PORTB &= ~(1 << 3);// Clear bit
    135.   //наж кн pb1
    136.   if (!(PINB>>1 & 0x01)) PORTB |= (1 << 4);// Set bits - high pb4
    137.   else PORTB &= ~(1 << 4);// Clear bit
    138.   //наж кн pb2
    139.   if (!(PINB>>2 & 0x01)) {PORTB |= (1 << 3) | (1 << 4);// Set bits - high pb3 pb4
    140.        b = true;
    141.   }
    142. }

    nikolz - вы ничего не рассказали про ваш метод работы с кнопками.
    Или это секрет?
     

Поделиться этой страницей