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

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

rkit пишет:

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

нет, для логических операций разбор идёт взат, установит 1 бит, деление на 8, получит true, а OCR умножит  приблизительно на 6, то 57600 и получилось

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

По диагонали, млять. Возьми да проверь, елси не веришь.

Upper
Offline
Зарегистрирован: 23.06.2020

UA6EM Если не секрет, сколько вам примерно лет? (Это не имеет отношения к данной теме, просто вы несколько раз намекали на свой почтенный возраст, но не помню, писали или не сколько конкретно лет).

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

Upper пишет:

 сколько конкретно


я ещё парень, мне всего 65 )))

rkit пишет:

По диагонали, млять. Возьми да проверь, елси не веришь.

Irinka проверила, сериал заработал на 57600

 

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

del

Upper
Offline
Зарегистрирован: 23.06.2020

Я то думал вы совсем совсем почтенного возраста. Тогда новые сведения вам могут быть противопоказаны. Но если только 65 ...

Операции выполняются не справа налево а слева направо, это легко самому проверить. Запишите a = f1() || f2() и посмотрите, какая вызовется первой.
Но в данном случае это не важно, т.к. логическое ИЛИ (не побитовое) возвращает или 0 или 1

Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные  в сетапе.

Если использовать большое значение прескаллера, то может потребоваться сбрасывать его перед началом отправки байта, иначе будет СИЛЬНО плавающая длина стартового бита.

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

Upper пишет:

Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные  в сетапе.

где вы там увидели изменение OCR ума не приложу, нет этого в коде или в упор не вижу )))
в коде он 14... в принципе код Ирина выложила, залить его в атмегу, глянуть осциллограмму и будет видно...
Если делитель в нуле то OCR для скорости порта 57600 должна быть порядка 150...
Доживёт пост до пятницы, посмотрю, а то давно не было ни одного знатного пятничного срача )))

ЗЫ я жеж не сам это придумал, талантов таких нету, кто-то из знающих этого сайта озвучивал, если ничего не путаю )))

исходный код:

#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;
}

 

Upper
Offline
Зарегистрирован: 23.06.2020

ua6em пишет:

Upper пишет:

Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные  в сетапе.

где вы там увидели изменение OCR ума не приложу, нет этого в коде или в упор не вижу )))

Ну значит кому то и 65 это много.

>> т.к. кроме сетапа прескаллер менялся и в вызове функции

Прескаллер задается через TСCR0B Там даже в комментарии есть подпись.

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

слона то я и не заметил ))) всё одно как получается 57600 не понимаю...не, тогда и 9600 у неё не заработает, без правки кода, а у неё заработало...чудеса...