как увидеть показания с аналогового датчика на attiny13

romiras
Offline
Зарегистрирован: 12.07.2015

Подскажите, как можно увидеть показания, снятые с аналог. входа тини13, сериал принт - не поддерживается, как тогда быть? Скетч, например такой:

void setup() {
  pinMode(3, OUTPUT);
 
}
int sensorValue = analogRead(2);
 
void loop() {
  sensorValue = analogRead(2);
  if (sensorValue >= 887 && sensorValue <= 888) {
    digitalWrite(3, HIGH) ;
    delay(1000);
    digitalWrite(3, LOW) ;
    delay(1000);
  }
  else {
 
    digitalWrite(3, LOW);
  }
 
}
gena
Offline
Зарегистрирован: 04.11.2012

  Если скорость опроса аналогового входа не критична, то можно считанные данные отправлять в функцию имитирующую работу UART. Далее преобразователь UART -> USB и программа "монитор".

romiras
Offline
Зарегистрирован: 12.07.2015

как это осуществить программно , знаний, к сожалению пока не хватает(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Странный вопрос, а как надо-то? Вариантов-то миллион - можно семисегментный индикатор присобачить, можно по смс послать, можно сделать web-страницу и смотреть её браузером. Чего надо-то?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, что-то мне подсказывает, что долго вы будете ждать выполнение вашего условия  if (sensorvalue....

romiras
Offline
Зарегистрирован: 12.07.2015

как увидеть результат на пк напрямую, через usb кабель

romiras
Offline
Зарегистрирован: 12.07.2015

Почему, если не секрет?)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, ну как, условие сработает только при значениях 887 или 888. 

romiras
Offline
Зарегистрирован: 12.07.2015

это было накидано просто для примера, цифры из головы

romiras
Offline
Зарегистрирован: 12.07.2015

Можно ли по spi подключить lcd 1602 к attiny? если да, тогда проблема решена

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
gena
Offline
Зарегистрирован: 04.11.2012

  Ну дак это хороший повод поднабраться знаний. Изучите протокол UART, задайтесь конкретной скоростью, например 9600. С помощью функций delay научитесь передавать какой либо символ. Пока это научитесь делать, поймёте работу UART углублённо. Затем немного модифицируете программу и будете передавать уже нужные Вам символы. Не думаю, что с это очень сложная задача. Было бы достаточная мотивация.

romiras
Offline
Зарегистрирован: 12.07.2015

будем разбираться

auct
Offline
Зарегистрирован: 14.12.2014
Joiner
Offline
Зарегистрирован: 04.09.2014

Посмотри тут. Attiny  и LCD  http://rfanat.ru/s21/avr-atyny13-voltm.html

romiras
Offline
Зарегистрирован: 12.07.2015

То что надо! Спасибо!

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

https://habr.com/ru/post/251141/

#define F_CPU 9600000

#include <avr/io.h>
#include <util/delay.h>

#define SOFT_TX_PIN (1<<PB1) // PB1 будет работать как TXD 
#define SOFT_TX_PORT PORTB
#define SOFT_TX_DDR DDRB

int helloHabr = 0; 

int main (void) {
  uart_tx_init (); // инициализация прог. UARTа

  while (1) {
    helloHabr++; 
    uart_print("Hello Habr, I'm ATtiny13 "); // превед 
    num_to_str(helloHabr, 4); // 0..9999 т.к. только 4 числа можно вывести
    uart_print(" counds"); 
    uart_print("\r\n");	// переход на новую строчку
    _delay_ms(1000); 
  }
  return 0; 
}

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00;		// prescaler 1
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 75;			//115200 baudrate at prescaler 1
}

// Функция вывода содержимого переменной
void num_to_str(unsigned int value, unsigned char nDigit)
{
  switch (nDigit)
  {
  case 4:
    uart_send_byte((value / 1000) + '0');
  case 3:
    uart_send_byte(((value / 100) % 10) + '0');
  case 2:
    uart_send_byte(((value / 10) % 10) + '0');
  case 1:
    uart_send_byte((value % 10) + '0');
  }
}

void uart_print(char *str)
{
  byte i = 0;
  while (str[i]) {
    uart_send_byte(str[i++]);
  }
}

//bitbanged UART transmit byte
void uart_send_byte (unsigned char data)
{
  unsigned char i;
  TCCR0B = 0;
  TCNT0 = 0;
  TIFR0 |= 1 << OCF0A;
  TCCR0B |= (1 << CS00);
  TIFR0 |= 1 << OCF0A;
  SOFT_TX_PORT &= ~SOFT_TX_PIN;
  while (!(TIFR0 & (1 << OCF0A)));
  TIFR0 |= 1 << OCF0A;
  for (i = 0; i < 8; i++)
  {
    if (data & 1)
      SOFT_TX_PORT |= SOFT_TX_PIN;
    else
      SOFT_TX_PORT &= ~SOFT_TX_PIN;
    data >>= 1;
    while (!(TIFR0 & (1 << OCF0A)));
    TIFR0 |= 1 << OCF0A;
  }
  SOFT_TX_PORT |= SOFT_TX_PIN;
  while (!(TIFR0 & (1 << OCF0A)));
  TIFR0 |= 1 << OCF0A;
}

OCR0A = 75; //115200 baudrate at prescaler 1

Как сделать скорость 9600 ? В протеусе не поддерживается скорость 115200

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Очевидно увеличить значение в столько раз, в сколько 115200 отличается от 9600 .
Такой ответ устроит ?

Вряд ли.
Потому как 75*12=900
Что совсем чуть чуть не влазит в 1 байт.
Ну значит нужно пересчитать значение с другим прескалером.
Ну и не забыть его выставить

Кстати, странное значение 75.
Оно под эту частоту и скорость вроде как и не подходит

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Там зависимость от частоты тактирования и предделителя. Тактовая указана как 9.6МГц

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
Очевидно увеличить значение в столько раз, в сколько 115200 отличается от 9600 . Такой ответ устроит ? Вряд ли. Потому как 75*12=900 Что совсем чуть чуть не влазит в 1 байт. Ну значит нужно пересчитать значение с другим прескалером. Ну и не забыть его выставить Кстати, странное значение 75. Оно под эту частоту и скорость вроде как и не подходит

в смысле? у него регистр не 16 битный разве? и сам отвечу - 8 битный, стр.80 даташита

тогда видимо так?
 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00 || 1 << CS01;		// prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;			// 9600 //115200 baudrate at prescaler 1
}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

На 57600 

На остальных скоростях иероглифы

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Калькулятор говорит:
Прескалер 8
OCRx 124

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а делители как выставили?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
Калькулятор говорит: Прескалер 8 OCRx 124

а если прескалер на 64?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Что мне сделать?)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

Что мне сделать?)

покажите настройки порта

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

В протеусе? Я в протеусе пробую.

#21 картинки

 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = 1 << CS00 || 1 << CS01;    // prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;     // 9600 //115200 baudrate at prescaler 1
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

В протеусе? Я в протеусе пробую.

#21 картинки

 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = 1 << CS00 || 1 << CS01;    // prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;     // 9600 //115200 baudrate at prescaler 1
}

и получилось 57600?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Получается, да

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

Получается, да

странно! очень странно! вот этот лживый С )))
а попробуйте сударыня по данным калькулятора от Кактуса

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = 1 << CS01;   // prescaler 1
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 124;     //115200 baudrate at prescaler 1
}

Так?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = 1 << CS01;   // prescaler 1
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 124;     //115200 baudrate at prescaler 1
}

Так?

да

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Работает

Где тут смайл в темных очках?))))

Большое спасибо))) А то бы делала семисегментные индикаторы на 595...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

Большое спасибо))) А то бы делала семисегментные индикаторы на 595...

поинтересуюсь, для чего тини13?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Делаю резистивную клавиатуру, при нажатии на определённую кнопку, например 3, будет три звуковых сигнала и мигание лампоки, и т.п. Для детского творчества)

Вот и нужно было посмотреть что будет на входе при различных резисторах.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

Kakmyc пишет:
Калькулятор говорит: Прескалер 8 OCRx 124

а если прескалер на 64?

То тогда OCRx=15, но реальная частота будет 9375.

А при прескалере 8 и OCRx=124 , ровно 9600

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Калькулятор под андроид брал тут:
https://play.google.com/store/apps/details?id=ru.chipenable.avrcalculato...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

Делаю резистивную клавиатуру, при нажатии на определённую кнопку, например 3, будет три звуковых сигнала и мигание лампоки, и т.п. Для детского творчества)

Вот и нужно было посмотреть что будет на входе при различных резисторах.

я публиковал схему правильной резистивной клавиатуры позволяющей нажимать более одной клавиши, осталось найти где она тут лежит

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Irinka пишет:

Делаю резистивную клавиатуру, при нажатии на определённую кнопку, например 3, будет три звуковых сигнала и мигание лампоки, и т.п. Для детского творчества)

Вот и нужно было посмотреть что будет на входе при различных резисторах.

Если привести считываемое значение к диапазону 0-99. То можно просто мигать светодиодом для считывания. 

Например 67- мигаем 6 раз, пауза мигаем 7 раз. Затем - по новой

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Что вы все в математике магию ищите, всегда же ей сами пользуетесь )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Что вы все в математике магию ищите, всегда же ей сами пользуетесь )))


патамушта в природе нет десятичной арифметики, совсем нет )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

Что мне сделать?)

а вот так?
 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00 | 1 << CS01;		// prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;			// 9600 //115200 baudrate at prescaler 1
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

Irinka пишет:

Что мне сделать?)

а вот так?
 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00 | 1 << CS01;		// prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;			// 9600 //115200 baudrate at prescaler 1
}

 

Написал же уже.
"Вот так" скорость будет 9375бод

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
ua6em пишет:

Irinka пишет:

Что мне сделать?)

а вот так?
 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00 | 1 << CS01;		// prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;			// 9600 //115200 baudrate at prescaler 1
}

 

Написал же уже. "Вот так" скорость будет 9375бод

ты не увидел мой косяк, было 57600... )))

ЗЫ это при 15, а я высчитал 14 )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

В протеусе? Я в протеусе пробую.

#21 картинки

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = 1 << CS00 || 1 << CS01;    // prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;     // 9600 //115200 baudrate at prescaler 1
}

ошибка в строке 4, разбор идёт справа на лево, установит делитель на 8, получит true и нулевой бит устанавливать не будет, ну а ниже мы умножили значением счетчика в 6 раз, итого получили делитель на 2, то-есть 57600 )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

Kakmyc пишет:
ua6em пишет:

Irinka пишет:

Что мне сделать?)

а вот так?
 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00 | 1 << CS01;		// prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;			// 9600 //115200 baudrate at prescaler 1
}

 

Написал же уже. "Вот так" скорость будет 9375бод

ты не увидел мой косяк, было 57600... )))

ЗЫ это при 15, а я высчитал 14 )))

А прескалер 64 и OCRx 14 дадут 10000бод

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
ua6em пишет:

Kakmyc пишет:
ua6em пишет:

Irinka пишет:

Что мне сделать?)

а вот так?
 

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;		// compare mode
  TCCR0B = 1 << CS00 | 1 << CS01;		// prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;			// 9600 //115200 baudrate at prescaler 1
}

 

Написал же уже. "Вот так" скорость будет 9375бод

ты не увидел мой косяк, было 57600... )))

ЗЫ это при 15, а я высчитал 14 )))

А прескалер 64 и OCRx 14 дадут 10000бод

9300 тогда ближе, эта тема кстати озвучивалась, что при выборе стараться выбирать OCR максимально возможный

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Чего ты пристал то к прескалеру 64 ?
Если с прескалером 8, частота именно та что нужна

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
Чего ты пристал то к прескалеру 64 ? Если с прескалером 8, частота именно та что нужна

не к прескалеру, а ошибке в выборе прескалера как такового (коду программы), одна лишняя палка, а каков результат )))

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

Irinka пишет:

void uart_tx_init ()
{
  TCCR0A = 1 << WGM01;    // compare mode
  TCCR0B = 1 << CS00 || 1 << CS01;    // prescaler 64
  SOFT_TX_PORT |= SOFT_TX_PIN;
  SOFT_TX_DDR |= SOFT_TX_PIN;
  OCR0A = 14;     // 9600 //115200 baudrate at prescaler 1
}

ошибка в строке 4, разбор идёт справа на лево, установит делитель на 8, получит true и нулевой бит устанавливать не будет

Нет, как раз только нулевой бит и установит. TCCR0B = 1;