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

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

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

  1. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Мне показалось, что еще один микроконтроллер, например в паре с ESP, не будет лишним.
    Поэтому решил разобраться с ATTINY2313A-PU.
    Вот, что получилось.

    Теперь попробую описать мои шаги к этому.
    Скетч чтоб не потерялся
    скетч (раскрыть)
    Код (Text):
    1.  
    2. //http://arduinolearning.com/code/program-attiny2313-arduino.php
    3. //https://blog.3d-logic.com/2015/01/21/arduino-and-the-tm1637-4-digit-seven-segment-display/
    4. const int clock1 = 6;
    5. const int data1 = 7;
    6.                  /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
    7. //uint8_t digits2[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
    8. uint8_t digits1[] = { 0x3f, 0x30, 0x5b, 0x79, 0x74, 0x6d, 0x6F, 0x38, 0x7f, 0x7D };
    9. unsigned long t;
    10. uint8_t minutes1;
    11. uint8_t seconds1;
    12. byte dot = 128;//двоеточие на дисплее индикатора
    13. void setup() {
    14.   // put your setup code here, to run once:
    15. pinMode(clock1, OUTPUT);
    16. pinMode(data1, OUTPUT);
    17. start(clock1,data1);
    18. writeValue(clock1,data1,0x8c);
    19. stop(clock1,data1);
    20. // clear display
    21. write(clock1,data1,0x00, 0x00, 0x00, 0x00);
    22. t=0;
    23.     //запускаем таймер                                                                                                                      
    24.     setupInterrupt();
    25. }
    26.  
    27. void loop() {
    28. if ((t % 2)==0){
    29.   dot=128;
    30. } else {dot=0;}
    31. if (t==3600){t=0;}
    32. minutes1 = (byte)((t / 60) % 60);
    33. seconds1 = (byte)(t % 60);
    34. write(clock1,data1,digits1[seconds1 % 10],digits1[seconds1 / 10] | dot,digits1[minutes1 % 10],digits1 [minutes1 / 10]);
    35. delay(5);
    36.  
    37. }
    38.  
    39. void write(int clock,int data,uint8_t first, uint8_t second, uint8_t third, uint8_t fourth)
    40. {
    41. start(clock,data);
    42. writeValue(clock,data,0x40);
    43. stop(clock,data);
    44. start(clock,data);
    45. writeValue(clock,data,0xc0);
    46. writeValue(clock,data,first);
    47. writeValue(clock,data,second);
    48. writeValue(clock,data,third);
    49. writeValue(clock,data,fourth);
    50. stop(clock,data);
    51. }
    52.  
    53. void start(int clock,int data)
    54. {
    55. digitalWrite(clock,HIGH);//send start signal to TM1637
    56. digitalWrite(data,HIGH);
    57. delayMicroseconds(5);
    58. digitalWrite(data,LOW);
    59. digitalWrite(clock,LOW);
    60. delayMicroseconds(5);
    61. }
    62.  
    63.  
    64. void stop(int clock,int data)
    65. {
    66. digitalWrite(clock,LOW);
    67. digitalWrite(data,LOW);
    68. delayMicroseconds(5);
    69. digitalWrite(clock,HIGH);
    70. digitalWrite(data,HIGH);
    71. delayMicroseconds(5);
    72. }
    73.  
    74. bool writeValue(int clock,int data,uint8_t value)
    75. {
    76. for(uint8_t i = 0; i < 8; i++)
    77. {
    78. digitalWrite(clock, LOW);
    79. delayMicroseconds(5);
    80. digitalWrite(data, (value & (1 << i)) >> i);
    81. delayMicroseconds(5);
    82. digitalWrite(clock, HIGH);
    83. delayMicroseconds(5);
    84. }
    85. // wait for ACK
    86. digitalWrite(clock,LOW);
    87. delayMicroseconds(5);
    88. pinMode(data,INPUT);
    89. digitalWrite(clock,HIGH);
    90. delayMicroseconds(5);
    91. bool ack = digitalRead(data) == 0;
    92. pinMode(data,OUTPUT);
    93. return ack;
    94. }
    95. void setupInterrupt()
    96. {
    97. /*В состав таймера/счетчика входят следующие регистры ввода/вывода:
    98. 16битный счетный регистр TCNT1;
    99. 16битный регистр захвата ICR1;
    100. два 16битных регистра сравнения — OCR1A и OCR1B;
    101. три 8битных регистра управления — TCCR1A, TCCR1B и TCCR1C.
    102. Каждый из 16битных регистров физически размещается в двух регист
    103. рах ввода/вывода, названия которых получаются добавлением к названию
    104. регистра  буквы  «H»  (старший  байт)  и  «L»  (младший  байт).  Счетный
    105. регистр таймера/счетчика T1 TCNT1, например, размещается в регистрах
    106. TCNT1H:TCNT1L.*/
    107.  
    108. //Разрешение прерывания осуществляется установкой в 1 бита TOIE1
    109. //TIMSK - регистр маски прерываний
    110.   TIMSK &= ~(1 << TOIE1);// Clear bit
    111. //OCIE1B - Флаг разрешения прерывания по совпадению "В" Т1
    112. //OCIE1A - Флаг разрешения прерывания по совпадению "А" Т1
    113.   TIMSK &= ~((1 << OCIE1A) | (1 << OCIE1B));// Clear bit
    114. //Режим Normal
    115. //Это  наиболее  простой  режим  работы  16битного  таймера/счетчика.
    116. //В данном режиме счетный регистр функционирует как обычный суммирующий счетчик.
    117.   TCCR1A &= ~((1 << WGM11) | (1 << WGM10));
    118.   TCCR1B &= ~((1 << WGM13) | (1 << WGM12));
    119.  
    120.   //Fcpu = 8000000 Гц
    121.   //Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
    122.   //Период тактового сигнала таймера Т1 равен Tt1 = (1/Fcpu)/k = k/Fcpu
    123.   //256/8000000=0.032 мс
    124.   //Делим требуемый интервал времени (1000 мс) на длительность одного такта таймера
    125.   //1000/0.032=31250
    126.   //2^16 + 1 - 31250 = 34287;
    127.   //Выбор источника тактового сигнала таймера/счетчика T1 clk I/O /256
    128.  
    129.   //clk I/O
    130.   //TCCR1B |= (1 << CS10);// Set bits
    131.   //TCCR1B &= ~((1 << CS11) | (1 << CS12));// Clear bit
    132.  
    133.   //clk I/O /8
    134.   //TCCR1B |= (1 << CS11);// Set bits
    135.   //TCCR1B &= ~((1 << CS10) | (1 << CS12));// Clear bit
    136.  
    137.   //clk I/O /64
    138.   //TCCR1B |= (1 << CS11)  | (1 << CS10); // Set bits
    139.   //TCCR1B &= ~(1 << CS12);           // Clear bit
    140.  
    141.   //clk I/O /256
    142.   TCCR1B |= (1 << CS12);// Set bits
    143.   TCCR1B &= ~((1 << CS10) | (1 << CS11));// Clear bit
    144.  
    145.   //clk I/O /1024
    146.   //TCCR1B |= (1 << CS12)  | (1 << CS10); // Set bits
    147.   //TCCR1B &= ~(1 << CS11);           // Clear bit
    148.  
    149.   /* Save value globally for later reload in ISR */
    150.  TCNT1=34287;
    151.  //Флаг разрешения прерывания по переполнению
    152.  TIMSK |= (1 << TOIE1);// Set bits
    153.  
    154. }
    155. //Install the Interrupt Service Routine (ISR) for Timer1 overflow.
    156. ISR(TIMER1_OVF_vect) {
    157.   TCNT1=34287;
    158.   t++;
    159. }
    160.  
    161.  


    схема
    Схема.png

    Исходные данные
    1. ATTINY2313A-PU
    2. WAVGAT ардуино Nano Mini-USB С загрузчика Совместимость Nano 3,0 контроллер CH340 драйвер USB 16 мГц Nano v3.0
    3. TM1637 светодиодный дисплей модуль 7 сегмент 4 биты 0,36
    4. Мини USBISP USBASP (MX-USBISP-V4.00 надпись на плате, процессор - мега88)
    5. Windows 8.1 x64
    6. Arduino IDE 1.8.2
    7. Макетная плата
    img1.png
    img2.png


    Продолжение следует...
     
  2. nikolz

    nikolz Гуру

    Сообщения:
    4.485
    Симпатии:
    443
    STM8L лучше.
     
  3. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Переделка китайского USBISP на меге88 в USBASP
    Updating firmware on USBASP bought from eBay

    Nano ISP
    5V ------------ 2
    GND ---------10
    13 ----------- 7 (SCK)
    12 ---------- 9 (MISO)
    11 ----------- 1 (MOSI)
    10 ----------- 5 (RESET)

    Устанавливаем драйвера - USBasp - USB programmer for Atmel AVR controllers - fischl.de
    Подключаем USBISP
    (у меня определилась как HID устройство, горит красный светодиод) - отключаем

    Ставим перемычку UP
    Подключаем к макетной плате
    img4.png

    Cмотрим порт (у меня COM3)
    Arduino IDE -Инструменты-Arduino as ISP
    Файл-Примеры-ArduinoISP - прошиваем Arduino nano
    Командная строка в режиме администратора.
    Пробуем прочитать USBISP
    Код (Text):
    1. "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe" -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -c avrisp -P COM3 -b 19200 -p m88 -U flash:r:c:\original_firmware.bin:r
    Если да, то шьем.
    У меня пошла эта прошивка -
    ATmega88.zip
    Бросаем прошивку в C:\Program Files (x86)\Arduino\hardware\tools\avr\bin
    Набираем команды
    Код (Text):
    1. cd "C:\Program Files (x86)\Arduino\hardware\tools\avr\bin"
    Код (Text):
    1. avrdude.exe -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -c avrisp -P COM3 -b 19200 -p m88 -v -u -U hfuse:w:0xdf:m -U lfuse:w:0xff:m
    Код (Text):
    1. avrdude.exe -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -c avrisp -P COM3 -b 19200 -p m88 -U flash:w:atmega88.hex
    У меня получилось - теперь горит синий светодиод и появилось USBasp

    Правда если у вас нет USBISP, то он и не нужен, можно шить и через Ардуину, но USBISP удобней

    Продолжение следует...
     

    Вложения:

    • ATmega88.zip
      Размер файла:
      5 КБ
      Просмотров:
      1
  4. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Добавляем поддержку ATtiny2313 в Ардуино IDE
    Program an attiny2313 with an Arduino - Arduino Learning
    Файл-Настройки-Дополнительные ссылки для менеджера плат - http://drazzy.com/package_drazzy.com_index.json
    Инструменты-Плата-Менеджер плат
    img5.png
    Устанавливаем ATTinyCore
    img6.png
    Выбираем Clock 8Mhz
    Далее - Записать загрузчик
    Все.
    Если шить Attiny через USBASP, то программатор в соответствии с ресунком выше.
    Если через Arduino , то программатор Arduino as ISP.
    И последнее распиновка ATTINY2313A-PU
    img7.png
     
  5. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Ошибся, правильно так
    img6.png
    USBasp(ATTinyCore)
     
  6. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Поробовал задействовать оба таймера Timer1 и Timer0
    Timer1 - в режиме Normal
    Timer0 - в режиме СТС -сброс при совпадении
    скетч (раскрыть)
    Код (Text):
    1. //http://arduinolearning.com/code/program-attiny2313-arduino.php
    2. //https://blog.3d-logic.com/2015/01/21/arduino-and-the-tm1637-4-digit-seven-segment-display/
    3. #include <avr/interrupt.h>
    4. const int clock1 = 6;
    5. const int data1 = 7;
    6.                  /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
    7. //uint8_t digits2[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
    8. uint8_t digits1[] = { 0x3f, 0x30, 0x5b, 0x79, 0x74, 0x6d, 0x6F, 0x38, 0x7f, 0x7D };
    9. uint8_t t;
    10. uint8_t minutes1;
    11. uint8_t seconds1;
    12. byte dot = 128;//двоеточие на дисплее индикатора
    13. byte b = 0;
    14. byte a = 31;
    15. void setup() {
    16.   // put your setup code here, to run once:
    17. pinMode(clock1, OUTPUT);
    18. pinMode(data1, OUTPUT);
    19. pinMode(12, OUTPUT);
    20. pinMode(13, OUTPUT);
    21. start(clock1,data1);
    22. writeValue(clock1,data1,0x8c);
    23. stop(clock1,data1);
    24. // clear display
    25. write(clock1,data1,0x00, 0x00, 0x00, 0x00);
    26. t=0;
    27.     //запускаем таймер                                                                                                                        
    28.     setupInterrupt1();
    29.     setupInterrupt0();
    30. }
    31.  
    32. void loop() {
    33. if ((t % 2)==0){
    34.   dot=128;
    35. } else {dot=0;}
    36. if (t==3600){t=0;}
    37. minutes1 = (byte)((t / 60) % 60);
    38. seconds1 = (byte)(t % 60);
    39. write(clock1,data1,digits1[seconds1 % 10],digits1[seconds1 / 10] | dot,digits1[minutes1 % 10],digits1 [minutes1 / 10]);
    40. delay(5);
    41.  
    42. }
    43.  
    44. void write(int clock,int data,uint8_t first, uint8_t second, uint8_t third, uint8_t fourth)
    45. {
    46. start(clock,data);
    47. writeValue(clock,data,0x40);
    48. stop(clock,data);
    49. start(clock,data);
    50. writeValue(clock,data,0xc0);
    51. writeValue(clock,data,first);
    52. writeValue(clock,data,second);
    53. writeValue(clock,data,third);
    54. writeValue(clock,data,fourth);
    55. stop(clock,data);
    56. }
    57.  
    58. void start(int clock,int data)
    59. {
    60. digitalWrite(clock,HIGH);//send start signal to TM1637
    61. digitalWrite(data,HIGH);
    62. delayMicroseconds(5);
    63. digitalWrite(data,LOW);
    64. digitalWrite(clock,LOW);
    65. delayMicroseconds(5);
    66. }
    67.  
    68.  
    69. void stop(int clock,int data)
    70. {
    71. digitalWrite(clock,LOW);
    72. digitalWrite(data,LOW);
    73. delayMicroseconds(5);
    74. digitalWrite(clock,HIGH);
    75. digitalWrite(data,HIGH);
    76. delayMicroseconds(5);
    77. }
    78.  
    79. bool writeValue(int clock,int data,uint8_t value)
    80. {
    81. for(uint8_t i = 0; i < 8; i++)
    82. {
    83. digitalWrite(clock, LOW);
    84. delayMicroseconds(5);
    85. digitalWrite(data, (value & (1 << i)) >> i);
    86. delayMicroseconds(5);
    87. digitalWrite(clock, HIGH);
    88. delayMicroseconds(5);
    89. }
    90. // wait for ACK
    91. digitalWrite(clock,LOW);
    92. delayMicroseconds(5);
    93. pinMode(data,INPUT);
    94. digitalWrite(clock,HIGH);
    95. delayMicroseconds(5);
    96. bool ack = digitalRead(data) == 0;
    97. pinMode(data,OUTPUT);
    98. return ack;
    99. }
    100. void setupInterrupt1()
    101. {
    102. /*В состав таймера/счетчика входят следующие регистры ввода/вывода:
    103. 16битный счетный регистр TCNT1;
    104. 16битный регистр захвата ICR1;
    105. два 16битных регистра сравнения — OCR1A и OCR1B;
    106. три 8битных регистра управления — TCCR1A, TCCR1B и TCCR1C.
    107. Каждый из 16битных регистров физически размещается в двух регист
    108. рах ввода/вывода, названия которых получаются добавлением к названию
    109. регистра  буквы  «H»  (старший  байт)  и  «L»  (младший  байт).  Счетный
    110. регистр таймера/счетчика T1 TCNT1, например, размещается в регистрах
    111. TCNT1H:TCNT1L.*/
    112.  
    113. //Разрешение прерывания осуществляется установкой в 1 бита TOIE1
    114. //TIMSK - регистр маски прерываний
    115.   TIMSK &= ~(1 << TOIE1);// Clear bit
    116. //OCIE1B - Флаг разрешения прерывания по совпадению "В" Т1
    117. //OCIE1A - Флаг разрешения прерывания по совпадению "А" Т1
    118.   TIMSK &= ~((1 << OCIE1A) | (1 << OCIE1B));// Clear bit
    119. //Режим Normal
    120. //Это  наиболее  простой  режим  работы  16битного  таймера/счетчика.
    121. //В данном режиме счетный регистр функционирует как обычный суммирующий счетчик.
    122.   TCCR1A &= ~((1 << WGM11) | (1 << WGM10));
    123.   TCCR1B &= ~((1 << WGM13) | (1 << WGM12));
    124.  
    125.   //Fcpu = 8000000 Гц
    126.   //Период тактового сигнала микроконтроллера Tcpu = 1/Fcpu
    127.   //Период тактового сигнала таймера Т1 равен Tt1 = (1/Fcpu)/k = k/Fcpu
    128.   //256/8000000=0.032 мс
    129.   //Делим требуемый интервал времени (1000 мс) на длительность одного такта таймера
    130.   //1000/0.032=31250
    131.   //2^16 + 1 - 31250 = 34287;
    132.   //Выбор источника тактового сигнала таймера/счетчика T1 clk I/O /256
    133.  
    134.   //clk I/O
    135.   //TCCR1B |= (1 << CS10);// Set bits
    136.   //TCCR1B &= ~((1 << CS11) | (1 << CS12));// Clear bit
    137.  
    138.   //clk I/O /8
    139.   //TCCR1B |= (1 << CS11);// Set bits
    140.   //TCCR1B &= ~((1 << CS10) | (1 << CS12));// Clear bit
    141.  
    142.   //clk I/O /64
    143.   //TCCR1B |= (1 << CS11)  | (1 << CS10); // Set bits
    144.   //TCCR1B &= ~(1 << CS12);           // Clear bit
    145.  
    146.   //clk I/O /256
    147.   TCCR1B |= (1 << CS12);// Set bits
    148.   TCCR1B &= ~((1 << CS10) | (1 << CS11));// Clear bit
    149.  
    150.   //clk I/O /1024
    151.   //TCCR1B |= (1 << CS12)  | (1 << CS10); // Set bits
    152.   //TCCR1B &= ~(1 << CS11);           // Clear bit
    153.  
    154.   /* Save value globally for later reload in ISR */
    155. TCNT1=34287;
    156. //Флаг разрешения прерывания по переполнению
    157. TIMSK |= (1 << TOIE1);// Set bits
    158.  
    159. }
    160. void setupInterrupt0()
    161. {
    162. TIMSK &= ~(1 << TOIE0);// Clear bit  - запрещаем прерывания по переполнению
    163. TIMSK &= ~((1 << OCIE0A) | (1 << OCIE0B));// Clear bit   - запрещаем прерывания по совпадению
    164. //TCCR0A &= ~((1 << WGM01) | (1 << WGM00));// Clear bit - режим Normal
    165. ////режим СТС
    166. TCCR0B &= ~(1 << WGM02);// Clear bit
    167. TCCR0A &= ~(1 << WGM00);// Clear bit
    168. TCCR0A |= (1 << WGM01);// Set bits
    169. ////Период тактового сигнала таймера Т0
    170. //1024/8000000=0.128 мс
    171. //длительность до совпадения при OCR0A = 254
    172. //254*0,128=32,51 мс
    173. //1000/32.51=30.76 31*32.51=1007.81 (31 совпадение для 1 сек)
    174.  
    175.   //clk I/O /1024
    176.   TCCR0B |= (1 << CS02)  | (1 << CS00); // Set bits
    177.   TCCR0B &= ~(1 << CS01);           // Clear bit
    178. OCR0A = 254;
    179. //режим СТС
    180. TIMSK &= ~(1 << OCIE0B);// Clear bit
    181. TIMSK |= (1 << OCIE0A);// Set bits
    182. //Флаг разрешения прерывания по переполнению
    183. // TIMSK |= (1 << TOIE0);// Set bits
    184. }
    185.  
    186. //Install the Interrupt Service Routine (ISR) for Timer1 overflow.
    187. ISR(TIMER1_OVF_vect) {
    188.   TCNT1=34287;
    189. // b=!b;
    190. // digitalWrite(12,b);
    191.   t++;
    192. }
    193. //Install the Interrupt Service Routine (ISR) .
    194. ISR(TIMER0_COMPA_vect) {
    195.   a--;
    196.   if (a<=0){
    197.    b=!b;
    198.   digitalWrite(12,b);
    199.   a=31;
    200.   }
    201. }

    Светодиод подключенный к PB3(pin12) - мигает раз в секунду и на индикаторе отображается счет времени.
    PS:
    Сделал режим СТС, тк ISR(TIMER0_OVF_vect) - ошибка компиляции (пока не разобрался)
    img8.png
     
  7. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Немного ошибся в скетче
    Исправить - uint16_t t;//uint16_t | unsigned int, word | от 0 до 65535
     
  8. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Небольшой пример кода, для режима Power Down с WatchDog
    Раз в 8 сек Тинька дергает 12-ой ногой, остальное время спит
    скетч (раскрыть)
    Код (Text):
    1. void setup() {
    2. pinMode(12, OUTPUT);
    3. watch_dog_ext();
    4. }
    5.  
    6. void loop() {
    7.   digitalWrite(12,1);
    8.   delay(500);
    9.   digitalWrite(12,0);
    10.   sleepNow();
    11.   delay(500);
    12. }
    13.  
    14. void sleepNow() {
    15. /*
    16. * Idle  (режим холостого хода)
    17. * В этом режиме прекращается формирование тактовых сигналов clk CPU и  clk FLASH .
    18. * При  этом  ЦПУ  микроконтроллера  останавливается,  а  все остальные  периферийные  устройства
    19. * (интерфейсные  модули,  таймеры/счетчики,  аналоговый  компаратор,  АЦП,  сторожевой  таймер),
    20. * а также  подсистема  прерываний  продолжают  функционировать.
    21. */
    22. /*Если компаратор не используется, то при переводе микроконтроллера в
    23. * режим Idle или ADC Noise Reduction его необходимо отключить. В других
    24. * «спящих» режимах модуль аналогового компаратора отключается автома
    25. * тически. */  
    26. DIDR |= (1 << AIN1D)  | (1 << AIN0D ); // Set bits - отключения  входных  цифровых буферов
    27. ACSR |= (1 << ACD);// Set bits - Выключение компаратора
    28. /*
    29. *Аналогоцифровой преобразователь
    30. * Если функционирование АЦП разрешено, то он будет работать во всех
    31. * «спящих»  режимах.  Соответственно,  для  снижения  потребляемого  тока
    32. * модуль АЦП необходимо отключать перед переводом микроконтроллера в
    33. * любой из энергосберегающих режимов.
    34. */
    35.  
    36. //Режим энергосбережения
    37. //MCUCR &= ~((1 << SM1) | (1 << SM0));// Clear bit  - Idle -не у меня не работает?
    38. MCUCR |= (1 << SM0);// Set bits - Power Down
    39. MCUCR |= (1 << SE);// Set bits -  sleep_enable
    40. asm ("sleep");
    41. MCUCR &= ~(1 << SE);// Clear bit - sleep_disable
    42. }
    43.  
    44. void watch_dog_ext(){
    45. //расширенный  сторожевой  таймер
    46. /*
    47. * для выключения таймера (сброса бита WDE) необходимо выполнить следующие действия:
    48. * 1. Одной командой записать 1 в биты WDE и WDCE.
    49. * 2. В течение следующих четырех тактов записать 0 в бит WDE.
    50. */
    51. /*
    52. * Обратите внимание на то, что состояние флага сброса WDRF регистра MCUSR отменяет состояние бита WDE. Это означает, что бит WDE уста
    53. * новлен всегда, когда установлен флаг WDRF, поэтому перед сбросом WDE необходимо также сбросить WDRF.
    54. */
    55. //MCUSR &= ~(1 << WDRF);// Clear bit
    56. //WDTCSR |= (1 << WDE)  | (1 << WDCE); // Set bits
    57. //WDTCSR &= ~(1 << WDE);// Clear bit
    58. /*
    59. * Для изменения периода таймаута необходимо выполнить следующие действия:
    60. * 1. Одной командой записать 1 в биты WDE и WDCE.
    61. * 2. В течение следующих четырех тактов записать требуемое значение в биты WDP3:0 и WDE, одновременно сбрасывая бит WDCE.
    62. * Перед  изменением  битов  WDP3:0  сторожевой  таймер  рекомендуется сбрасывать.
    63. */
    64. WDTCSR |= (1 << WDE)  | (1 << WDCE); // Set bits
    65. //8 сек
    66. WDTCSR |= (1 << WDP0)  | (1 << WDP3); // Set bits
    67. WDTCSR &= ~((1 << WDP1)  | (1 << WDP2));// Clear bit
    68. WDTCSR &= ~(1 << WDCE);// Clear bit
    69. WDTCSR |= (1 << WDE);// Set bits
    70. }
    71.  

    Сколько кушает тока, не замерял
     
  9. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    WatchDog в режиме прерывания (в предыдущем примере в режиме сброса)
    скетч (раскрыть)
    Код (Text):
    1. byte a = 0;
    2. void setup() {
    3. pinMode(12, OUTPUT);
    4. pinMode(13, OUTPUT);
    5. watch_dog_ext();
    6. }
    7. void loop() {
    8.   digitalWrite(12,a);
    9.   digitalWrite(13,0);
    10.   sleepNow();
    11.   digitalWrite(12,a);
    12.   delay(500);
    13. }
    14. void sleepNow() {
    15. /*
    16. * Idle  (режим холостого хода)
    17. * В этом режиме прекращается формирование тактовых сигналов clk CPU и  clk FLASH .
    18. * При  этом  ЦПУ  микроконтроллера  останавливается,  а  все остальные  периферийные  устройства
    19. * (интерфейсные  модули,  таймеры/счетчики,  аналоговый  компаратор,  АЦП,  сторожевой  таймер),
    20. * а также  подсистема  прерываний  продолжают  функционировать.
    21. */
    22. /*Если компаратор не используется, то при переводе микроконтроллера в
    23. * режим Idle или ADC Noise Reduction его необходимо отключить. В других
    24. * «спящих» режимах модуль аналогового компаратора отключается автома
    25. * тически. */
    26. DIDR |= (1 << AIN1D)  | (1 << AIN0D ); // Set bits - отключения  входных  цифровых буферов
    27. ACSR |= (1 << ACD);// Set bits - Выключение компаратора
    28. /*
    29. *Аналогоцифровой преобразователь
    30. * Если функционирование АЦП разрешено, то он будет работать во всех
    31. * «спящих»  режимах.  Соответственно,  для  снижения  потребляемого  тока
    32. * модуль АЦП необходимо отключать перед переводом микроконтроллера в
    33. * любой из энергосберегающих режимов.
    34. */
    35. //Режим энергосбережения
    36. //MCUCR &= ~((1 << SM1) | (1 << SM0));// Clear bit  - Idle -не у меня не работает?
    37. MCUCR |= (1 << SM0);// Set bits - Power Down
    38. MCUCR |= (1 << SE);// Set bits -  sleep_enable
    39. asm ("sleep");
    40. MCUCR &= ~(1 << SE);// Clear bit - sleep_disable
    41. }
    42. void watch_dog_ext(){
    43. //расширенный  сторожевой  таймер
    44. /*
    45. * для выключения таймера (сброса бита WDE) необходимо выполнить следующие действия:
    46. * 1. Одной командой записать 1 в биты WDE и WDCE.
    47. * 2. В течение следующих четырех тактов записать 0 в бит WDE.
    48. */
    49. /*
    50. * Обратите внимание на то, что состояние флага сброса WDRF регистра MCUSR отменяет состояние бита WDE. Это означает, что бит WDE уста
    51. * новлен всегда, когда установлен флаг WDRF, поэтому перед сбросом WDE необходимо также сбросить WDRF.
    52. */
    53. //MCUSR &= ~(1 << WDRF);// Clear bit
    54. //WDTCSR |= (1 << WDE)  | (1 << WDCE); // Set bits
    55. //WDTCSR &= ~(1 << WDE);// Clear bit
    56. /*
    57. * Для изменения периода таймаута необходимо выполнить следующие действия:
    58. * 1. Одной командой записать 1 в биты WDE и WDCE.
    59. * 2. В течение следующих четырех тактов записать требуемое значение в биты WDP3:0 и WDE, одновременно сбрасывая бит WDCE.
    60. * Перед  изменением  битов  WDP3:0  сторожевой  таймер  рекомендуется сбрасывать.
    61. * Сброс сторожевого таймера осуществляется командой WDR.
    62. */
    63. asm ("WDR");
    64. WDTCSR |= (1 << WDE)  | (1 << WDCE); // Set bits
    65. //4 сек
    66. WDTCSR |= (1 << WDP3); // Set bits
    67. WDTCSR &= ~((1 << WDP0)  | (1 << WDP1)  | (1 << WDP2));// Clear bit
    68. WDTCSR &= ~(1 << WDCE);// Clear bit
    69.  
    70. MCUSR &= ~(1 << WDRF);// Clear bit
    71. WDTCSR |= (1 << WDE)  | (1 << WDCE); // Set bits
    72. WDTCSR &= ~(1 << WDE);// Clear bit
    73.  
    74. WDTCSR |= (1 << WDIE);// Set bits - Разрешение прерывания от сторожевого таймера (сбрасывается после сраб тайм аута)
    75. }
    76. ISR(WDT_OVERFLOW_vect) { //4 сек
    77. digitalWrite(13,1);
    78. a=!a;
    79. }
     
  10. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Здравствуйте.
    Кто нибудь писал на Ассемблере для Attiny2313?
    Хочу переписать на Ассемблере управление TM1637 в виде ассемблеровских вставок.
    От Arduino IDE отказываться не хочу.
    Помигать диодами я смог.
    скетч (раскрыть)
    Код (Text):
    1. void setup() {
    2. asm volatile
    3.   (
    4.     /*
    5.      *DDRB - регистр направления данных порта B
    6.      *$17 r23
    7.      *PB3 - pin12,PB4 - pin13
    8.      */
    9.    
    10.     "ldi r23,0b00011000" "\n"
    11.     "out 23,r23" "\n" //pinMode(12, OUTPUT);pinMode(13, OUTPUT);
    12.   );
    13.  
    14. }
    15.  
    16. void loop() {
    17.    asm volatile
    18.   (
    19.     /*
    20.      *PORTB - регистр данных порта B
    21.      *$18 r24
    22.      */  
    23. //digitalWrite(12,1);digitalWrite(13,1);
    24.    
    25. "ldi r24,0b00011000" "\n"
    26. "out 24,r24" "\n"
    27.   );
    28. delay(500);
    29.    asm volatile
    30.   (
    31. //digitalWrite(12,0);digitalWrite(13,0);
    32.  
    33. "ldi r24,0b00000000" "\n"
    34. "out 24,r24" "\n"
    35. );
    36. delay(500);
    37. }
     
  11. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Вот мигание полностью на ассемблере
    скетч (раскрыть)
    Код (Text):
    1. void setup() {
    2. asm volatile
    3.   (
    4.     /*
    5.      *DDRB - регистр направления данных порта B
    6.      *$17 r23
    7.      *PB3 - pin12,PB4 - pin13
    8.      */    
    9.     "ldi r23,0b00011000" "\n"
    10.     "out 23,r23" "\n"
    11.   );
    12. }
    13.  
    14. void loop() {
    15.    asm volatile
    16.   (
    17.     /*
    18.      *PORTB - регистр данных порта B
    19.      *$18 r24
    20.      */    
    21. "ldi r24,0b00011000" "\n"
    22. "out 24,r24" "\n"    
    23. //; Generated by delay loop calculator
    24. //; at http://www.bretmulvey.com/avrdelay.html
    25. //; Delay 4 000 000 cycles
    26. //; 500ms at 8.0 MHz
    27.     "ldi  r18, 21""\n"
    28.     "ldi  r19, 75""\n"
    29.     "ldi  r20, 191""\n"
    30. "L1: dec  r20""\n"
    31.     "brne L1""\n"
    32.     "dec  r19""\n"
    33.     "brne L1""\n"
    34.     "dec  r18""\n"
    35.     "brne L1""\n"
    36.     "nop""\n"
    37. "ldi r24,0b00000000" "\n"
    38. "out 24,r24" "\n"
    39.     "ldi  r18, 21""\n"
    40.     "ldi  r19, 75""\n"
    41.     "ldi  r20, 191""\n"
    42. "L2: dec  r20""\n"
    43.     "brne L2""\n"
    44.     "dec  r19""\n"
    45.     "brne L2""\n"
    46.     "dec  r18""\n"
    47.     "brne L2""\n"
    48.     "nop""\n"
    49.   );
    50. }
     
  12. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Еще вариант с дисплеем на max7219.
    скетч (раскрыть)
    Код (Text):
    1. int slaveSelect=14;
    2. int din=6;
    3. int clk=15;
    4. byte btNum[10]={126,48,109,121,51,91,95,112,127,123};
    5. void setup() {
    6.   pinMode(slaveSelect, OUTPUT);
    7.   pinMode(din, OUTPUT);
    8.   pinMode(clk, OUTPUT);
    9. sendCommand(12,1); //normal mode (default is shutdown mode)
    10. sendCommand (15,0); //Display test off
    11. sendCommand (10,6); //set medium intensity (range is 0-15)
    12. sendCommand (11, 7); //7219 digit scan limit command
    13. sendCommand (9, 0); //decode command, use standard 7-segment digits
    14. sendCommand (8, 79);
    15. sendCommand (7, 91);
    16. sendCommand (6, 103);
    17. sendCommand (5, 1);
    18. sendCommand (4, 127);
    19. sendCommand (3, 109);
    20. sendCommand (2, 95);
    21. sendCommand (1, 95);
    22. }
    23.  
    24. void loop() {
    25. delay(5);
    26.  
    27. }
    28. void sendCommand(byte cmd, byte data)
    29. {
    30. digitalWrite(slaveSelect, LOW); //chip select is active low
    31. // передать старший байт
    32. shiftOut(din, clk, MSBFIRST, cmd);
    33. // передать младший байт
    34. shiftOut(din, clk, MSBFIRST, data);
    35. digitalWrite(slaveSelect,HIGH);
    36. }

    IMG_20190531_233111.jpg
     
  13. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Датчик температуры ds18b20.
    тестовый скетч (раскрыть)
    Код (Text):
    1. //за основу взята библиотека http://mypractic.ru/downloads/arduino/OneWire.zip
    2. //DQ датчика к + через резистор 4.7к
    3. #include "OneWire1.h"
    4. OneWire sensDs (7);
    5. byte bufData[2];  // буфер данных
    6. int slaveSelect=14;
    7. int din=6;
    8. int clk=15;
    9. //датчик к PIN7 - PD5 - PORTD
    10. byte Num[10] ={126,48,109,121,51,91,95,112,127,123};
    11. unsigned char temp;
    12. void setup() {
    13.   pinMode(slaveSelect, OUTPUT);
    14.   pinMode(din, OUTPUT);
    15.   pinMode(clk, OUTPUT);
    16. sendCommand(12,1); //normal mode (default is shutdown mode)
    17. sendCommand (15,0); //Display test off
    18. sendCommand (10,6); //set medium intensity (range is 0-15)
    19. sendCommand (11, 7); //7219 digit scan limit command
    20. sendCommand (9, 0); //decode command, use standard 7-segment digits
    21. sendCommand (8, 0);
    22. sendCommand (7, 0);
    23. sendCommand (6, 0);
    24. sendCommand (5, 0);
    25. sendCommand (4, 1);
    26. sendCommand (3, 1);
    27. sendCommand (2, 99);
    28. sendCommand (1, 78);//t*C  --*
    29. }
    30.  
    31. void loop() {
    32. sensDs.reset();  // сброс шины
    33. sensDs.write(0xCC, 0); // пропуск ROM
    34. sensDs.write(0x44, 0); // инициализация измерения
    35. delay(900);  // пауза 0,9 сек
    36. sensDs.reset();  // сброс шины
    37. sensDs.write(0xCC, 0); // пропуск ROM
    38. sensDs.write(0xBE, 0); // команда чтения памяти датчика
    39. sensDs.read_bytes(bufData, 2);  // чтение памяти датчика, 2 байта
    40. temp = bufData[0]>>4 | bufData[1]<<4;
    41. sendCommand (4, Num[temp/10]);
    42. sendCommand (3, Num[temp % 10]);
    43. delay(5000);
    44. }
    45. void sendCommand(byte cmd, byte data)
    46. {
    47. digitalWrite(slaveSelect, LOW); //chip select is active low
    48. // передать старший байт
    49. shiftOut(din, clk, MSBFIRST, cmd);
    50. // передать младший байт
    51. shiftOut(din, clk, MSBFIRST, data);
    52. digitalWrite(slaveSelect,HIGH);
    53. }

    библиотека
    OneWire1.zip
    IMG_20190609_011740.png
     

    Вложения:

    • OneWire1.zip
      Размер файла:
      1,8 КБ
      Просмотров:
      1
  14. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Аналоговый компаратор.
    comparator.png
    скаетч1 (раскрыть)
    Код (Text):
    1. void setup() {
    2. pinMode(12, OUTPUT);
    3. ACSR &= ~(1 << ACIE);// Clear bit - Запрещение прерывания от компаратора
    4. ACSR |= (1 << ACD);// Set bits - Выключение компаратора
    5. // Set bits - отключения  входных  цифровых буферов
    6. DIDR |= (1 << AIN1D)  | (1 << AIN0D );
    7. pinMode(9, INPUT);// AIN0
    8. pinMode(10, INPUT);// AIN1
    9. //изменение состояния выхода компаратора с 0 на 1
    10. ACSR |= (1 << ACIS1)  |  (1 << ACIS0); // Set bits
    11. ACSR &= ~(1 << ACD);// Clear bit - Включение компаратора
    12. }
    13.  
    14. void loop() {
    15. if (ACSR & (1 << ACO)) //если бит ACO установлен
    16. {
    17.    digitalWrite(12,1);
    18. } else {
    19.   digitalWrite(12,0);
    20. }
    21. delay(1000);
    22. }
    23.  

    слетч2 (раскрыть)
    Код (Text):
    1. void setup() {
    2. pinMode(12, OUTPUT);
    3. pinMode(13, OUTPUT);
    4. ACSR &= ~(1 << ACIE);// Clear bit - Запрещение прерывания от компаратора
    5. ACSR |= (1 << ACD);// Set bits - Выключение компаратора
    6. // Set bits - отключения  входных  цифровых буферов
    7. DIDR |= (1 << AIN1D)  | (1 << AIN0D );
    8. pinMode(9, INPUT);// AIN0
    9. pinMode(10, INPUT);// AIN1
    10. //изменение состояния выхода компаратора с 0 на 1
    11. ACSR |= (1 << ACIS1)  |  (1 << ACIS0); // Set bits
    12. ACSR &= ~(1 << ACD);// Clear bit - Включение компаратора
    13. ACSR |= (1 << ACIE);// Set bits - Разрешение прерывания
    14. }
    15. void loop() {
    16. if (ACSR & (1 << ACO)) //если бит ACO установлен
    17. {
    18.    digitalWrite(12,1);
    19. } else {
    20.   digitalWrite(12,0);
    21. }
    22. delay(1000);
    23. digitalWrite(13,0);
    24. ACSR |= (1 << ACIE);// Set bits - Разрешение прерывания
    25. }
    26. ISR(ANA_COMP_vect){
    27.     digitalWrite(13,1);
    28.     ACSR &= ~(1 << ACIE);// Clear bit - Запрещение прерывания
    29. }

     
  15. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Универсальный синхронный/асинхронный приемо\передатчик - USART
    USART.png
    Usart_Read (раскрыть)
    Код (Text):
    1. byte b=0;
    2. void setup() {
    3. pinMode(12, OUTPUT);
    4. digitalWrite(12,0);
    5. initUSART();
    6. }
    7.  
    8. void loop() {
    9.   delay(1000);
    10. }
    11.  
    12. void initUSART() {
    13. //запретить прнерывания от передатчика
    14. UCSRB &= ~((1 << RXCIE) | (1 << TXCIE) | (1 << UDRIE)); // Clear bit
    15. //Если бит UMSEL сброшен в 0, то модуль работает в асинхронном режиме
    16. //USBS Количество стопбитов. Если бит сброшен в 0, то передатчик посылает 1 стопбит,
    17. //если установлен в 1, то 2 стопбита.
    18. //UCPOL  При работе в асинхронном режиме он должен быть сброшен в 0. USART Mode: Asynchronous
    19. //UPM1 UPM0 - Управление схемой контроля четности - 0 0 Выключена
    20. UCSRC &= ~((1 << UMSEL) | (1 << USBS) | (1 << UCPOL) | (1 << UPM1) | (1 << UPM0)); // Clear bit
    21. //Определение размера слова данных - 8 бит
    22. UCSRC |= (1<<UCSZ1) | (1<<UCSZ0); // Set bits
    23. UCSRA &= ~(1 << UCSZ2); // Clear bit
    24. UCSRC &= ~(1 << U2X); // Clear bit  обычная скорость
    25. // Speed = 9600
    26. UBRRH = 0;
    27. UBRRL = 51;
    28. //Разрешение приема
    29. UCSRB |=(1<<RXEN); // Set bits
    30. UCSRB |= (1<<RXCIE); // Set bits Разрешение прерывания по завершении приема.
    31.  
    32. }
    33. //прерывания по завершении приема.
    34. //9dddddddddddddddddddd9 - сработает 22 раза
    35. ISR(USART_RX_vect){
    36.   if (UDR==0x39)//цифра 9 - сработает 2 раза
    37.   {
    38.     b=!b;
    39.     digitalWrite(12,b);  
    40.   }  
    41. }

    Подключаем ардуино к компу.
    Для передачи на Тиньку используем Инструменты-Монитор порта-<<отправить>>
    скорость 9600.
     
  16. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Usart_Transmit (раскрыть)
    Код (Text):
    1. char charVar[] ={0x41,0x42,0x43,0x44,'E','F','\n','\r'};
    2. byte b=0;
    3. void setup() {
    4. pinMode(12, OUTPUT);
    5. digitalWrite(12,0);
    6. initUSART();
    7. }
    8. void loop() {
    9. for (int i=0;i < 8;i++) {
    10.   USART_Transmit(charVar[i]);
    11. }
    12. delay(2000);
    13. }
    14.  
    15. void initUSART() {
    16. //UCSRB &= ~((1 << TXEN) | (1 << RXEN)); // Clear bit
    17. //запретить прнерывания от передатчика
    18. UCSRB &= ~((1 << RXCIE) | (1 << TXCIE) | (1 << UDRIE)); // Clear bit
    19. //Если бит UMSEL сброшен в 0, то модуль работает в асинхронном режиме
    20. //USBS Количество стопбитов. Если бит сброшен в 0, то передатчик посылает 1 стопбит,
    21. //если установлен в 1, то 2 стопбита.
    22. //UCPOL  При работе в асинхронном режиме он должен быть сброшен в 0. USART Mode: Asynchronous
    23. //UPM1 UPM0 - Управление схемой контроля четности - 0 0 Выключена
    24. UCSRC &= ~((1 << UMSEL) | (1 << USBS) | (1 << UCPOL) | (1 << UPM1) | (1 << UPM0)); // Clear bit
    25. //Определение размера слова данных - 8 бит
    26. UCSRC |= (1<<UCSZ1) | (1<<UCSZ0); // Set bits
    27. UCSRA &= ~(1 << UCSZ2); // Clear bit
    28. //UCSRC &= ~(1 << U2X); // Clear bit  обычная скорость
    29. // Speed = 9600
    30. UBRRH = 0;
    31. UBRRL = 51;
    32. //Разрешение передачи
    33. UCSRB |=(1<<TXEN); // Set bits
    34. //UCSRB |= (1<<TXCIE); // Set bits Разрешение прерывания по завершении передачи.
    35. }
    36. void USART_Transmit(unsigned int data)
    37. {
    38.    /* Ждать очистки буфера передатчика */
    39.    while ( !( UCSRA & (1<<UDRE))) {  
    40.    };
    41.    UDR = data;
    42.    b=!b;
    43.    digitalWrite(12,b);    
    44. }
    45. //ISR(USART_TX_vect){
    46.  
    47. //  }  
    48.  

    USART1.png
     
  17. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    скетч (раскрыть)
    Код (Text):
    1. char charVar[64];
    2. byte b=0;
    3. byte a=0;
    4. boolean c = false;
    5. void setup() {
    6. pinMode(12, OUTPUT);
    7. digitalWrite(12,0);
    8. //---------------------
    9. //CodeVisionAVR V2.05.0
    10. // USART initialization
    11. // Communication Parameters: 8 Data, 1 Stop, No Parity
    12. // USART Receiver: On
    13. // USART Transmitter: On
    14. // USART Mode: Asynchronous
    15. // USART Baud Rate: 9600
    16. UCSRA=0x00;
    17. UCSRB=0x18;
    18. UCSRC=0x06;
    19. UBRRH=0x00;
    20. UBRRL=0x33;
    21. //---------------------
    22. UCSRB |= (1<<RXCIE) | (1<<TXCIE); // Set bits Разрешение прерывания по завершении приема и передачи.
    23. }
    24.  
    25. void loop() {
    26. if (c){
    27. USART_Transmit('*');
    28. for (int i=0;i < a;i++) {
    29.   USART_Transmit(charVar[i]);
    30.   charVar[i]=0;
    31. }
    32. USART_Transmit('*');
    33. USART_Transmit('\n');
    34. USART_Transmit('\r');  
    35. }
    36. a=0;
    37. delay(2000);
    38. }
    39. void USART_Transmit(unsigned int data)
    40. {
    41.    /* Ждать очистки буфера передатчика */
    42.    while ( !( UCSRA & (1<<UDRE))) {  
    43.    };
    44.    UDR = data;
    45.    b=!b;
    46.    digitalWrite(12,b);  
    47. }
    48. ISR(USART_RX_vect){
    49.   charVar[a]=UDR;
    50.   c=true;
    51.   a++;
    52.   if(a>64)a=0;
    53. }
    54. ISR(USART_TX_vect){
    55. c=false;
    56. }

    Прием и передача обратно.
    Принимаются данные и отправляются обратно, в начале и в конце ставится звездочка.
    PS В ардуину залит "Blink", если в ардуине есть Serial.begin(9600);
    то в Мониторе порта принятые от Тиньки данные не отображаются.
    Пока не разобрался
     
  18. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    Прошу прощения за ошибку в коде
    if(a>64)a=0;
    испр скетч (раскрыть)
    Код (Text):
    1. char charVar[64];
    2. byte b=0;
    3. byte a=0;
    4. boolean c = false;
    5. void setup() {
    6. pinMode(12, OUTPUT);
    7. digitalWrite(12,0);
    8. //---------------------
    9. //CodeVisionAVR V2.05.0
    10. // USART initialization
    11. // Communication Parameters: 8 Data, 1 Stop, No Parity
    12. // USART Receiver: On
    13. // USART Transmitter: On
    14. // USART Mode: Asynchronous
    15. // USART Baud Rate: 9600
    16. UCSRA=0x00;
    17. UCSRB=0x18;
    18. UCSRC=0x06;
    19. UBRRH=0x00;
    20. UBRRL=0x33;
    21. //---------------------
    22. UCSRB |= (1<<RXCIE) | (1<<TXCIE); // Set bits Разрешение прерывания по завершении приема и передачи.
    23. }
    24.  
    25. void loop() {
    26. if (c){
    27. USART_Transmit('*');
    28. //если принято байт больше, чем размер бефера  charVar, то
    29. //данные записанные первыми - перезаписываются, остальные данные есть в буфере,
    30. //но назад не отпр
    31. if (a==0)a=64;
    32. for (int i=0;i < a;i++) {
    33.   USART_Transmit(charVar[i]);
    34.   charVar[i]=0;
    35. }
    36. USART_Transmit('*');
    37. USART_Transmit('\n');
    38. USART_Transmit('\r');  
    39. }
    40. a=0;
    41. delay(2000);
    42. }
    43. void USART_Transmit(unsigned int data)
    44. {
    45.    /* Ждать очистки буфера передатчика */
    46.    while ( !( UCSRA & (1<<UDRE))) {  
    47.    };
    48.    UDR = data;
    49.    b=!b;
    50.    digitalWrite(12,b);    
    51. }
    52. ISR(USART_RX_vect){
    53.   charVar[a]=UDR;
    54.   c=true;
    55.   a++;
    56.   if(a>63)a=0;
    57. }
    58. ISR(USART_TX_vect){
    59. c=false;
    60. }

    USART2.png
     
  19. alexlaw

    alexlaw Новичок

    Сообщения:
    79
    Симпатии:
    1
    USART в режиме 1-WIRE.
    OneWire.png
    скетч (раскрыть)
    Код (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. byte bufData[9];  // буфер данных
    4. byte a=0;
    5. void setup() {
    6. pinMode(12, OUTPUT);
    7. digitalWrite(12,0);
    8. // USART initialization
    9. // Communication Parameters: 8 Data, 1 Stop, No Parity
    10. // USART Receiver: On
    11. // USART Transmitter: On
    12. // USART Mode: Asynchronous
    13. // USART Baud Rate: 9600
    14. //Разрешение прерывания по завершении приема и передачи.
    15. UCSRA=0x00;
    16. UCSRB=0xD8;
    17. UCSRC=0x06;
    18. UBRRH=0x00;
    19. UBRRL=0x33;
    20. }
    21.  
    22. void loop() {
    23. USART_Transmit(0xF0);
    24. delay(2000);
    25. }
    26. void USART_Transmit(unsigned int data)
    27. {
    28.    /* Ждать очистки буфера передатчика */
    29.    while ( !( UCSRA & (1<<UDRE))) {  
    30.    };
    31.    UDR = data;    
    32. }
    33. ISR(USART_RX_vect){
    34.   bufData[a]=UDR;
    35. //скорость передачи 9600 бод. Передача 0xF0 от UART формирует правильный импульс сброса.
    36. //Если устройства нет, полученное значение будет равно передаваемому значению.
    37. //Одно подчиненное устройство, работающее с минимальной внутренней синхронизацией, изменит ответ на 0xE0.
    38. //Один ведомый, работающий с максимальной внутренней синхронизацией, изменит ответ на 0x90.
    39.   if (UDR==0xE0)
    40.   {digitalWrite(12,1);} else {
    41.    digitalWrite(12,0);
    42.   }
    43.   a++;
    44.   if(a>8)a=0;
    45.  
    46. }
    47. //ISR(USART_TX_vect){
    48. //
    49. //}

    У меня DS18b20 ответил - 0xF0.
    Можно двигаться дальше ...
    IMG_20190622_164703.jpg
     
  20. nikolz

    nikolz Гуру

    Сообщения:
    4.485
    Симпатии:
    443
    alexlaw,
    Полагаю, что схему можно существенно упростить
    два транзистора заменить одним диодом.
    Подумайте над этим.
     

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