UA6EM Если не секрет, сколько вам примерно лет? (Это не имеет отношения к данной теме, просто вы несколько раз намекали на свой почтенный возраст, но не помню, писали или не сколько конкретно лет).
Я то думал вы совсем совсем почтенного возраста. Тогда новые сведения вам могут быть противопоказаны. Но если только 65 ...
Операции выполняются не справа налево а слева направо, это легко самому проверить. Запишите a = f1() || f2() и посмотрите, какая вызовется первой.
Но в данном случае это не важно, т.к. логическое ИЛИ (не побитовое) возвращает или 0 или 1
Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные в сетапе.
Если использовать большое значение прескаллера, то может потребоваться сбрасывать его перед началом отправки байта, иначе будет СИЛЬНО плавающая длина стартового бита.
Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные в сетапе.
где вы там увидели изменение 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;
}
слона то я и не заметил ))) всё одно как получается 57600 не понимаю...не, тогда и 9600 у неё не заработает, без правки кода, а у неё заработало...чудеса...
Нет, как раз только нулевой бит и установит. TCCR0B = 1;
нет, для логических операций разбор идёт взат, установит 1 бит, деление на 8, получит true, а OCR умножит приблизительно на 6, то 57600 и получилось
По диагонали, млять. Возьми да проверь, елси не веришь.
UA6EM Если не секрет, сколько вам примерно лет? (Это не имеет отношения к данной теме, просто вы несколько раз намекали на свой почтенный возраст, но не помню, писали или не сколько конкретно лет).
сколько конкретно
я ещё парень, мне всего 65 )))
По диагонали, млять. Возьми да проверь, елси не веришь.
Irinka проверила, сериал заработал на 57600
del
Я то думал вы совсем совсем почтенного возраста. Тогда новые сведения вам могут быть противопоказаны. Но если только 65 ...
Операции выполняются не справа налево а слева направо, это легко самому проверить. Запишите a = f1() || f2() и посмотрите, какая вызовется первой.
Но в данном случае это не важно, т.к. логическое ИЛИ (не побитовое) возвращает или 0 или 1
Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные в сетапе.
Если использовать большое значение прескаллера, то может потребоваться сбрасывать его перед началом отправки байта, иначе будет СИЛЬНО плавающая длина стартового бита.
Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные в сетапе.
где вы там увидели изменение OCR ума не приложу, нет этого в коде или в упор не вижу )))
в коде он 14... в принципе код Ирина выложила, залить его в атмегу, глянуть осциллограмму и будет видно...
Если делитель в нуле то OCR для скорости порта 57600 должна быть порядка 150...
Доживёт пост до пятницы, посмотрю, а то давно не было ни одного знатного пятничного срача )))
ЗЫ я жеж не сам это придумал, талантов таких нету, кто-то из знающих этого сайта озвучивал, если ничего не путаю )))
исходный код:
Что там проверяла Иринка не известно, т.к. кроме сетапа прескаллер менялся и в вызове функции и затирал значения выставленные в сетапе.
где вы там увидели изменение OCR ума не приложу, нет этого в коде или в упор не вижу )))
Ну значит кому то и 65 это много.
>> т.к. кроме сетапа прескаллер менялся и в вызове функции
Прескаллер задается через TСCR0B Там даже в комментарии есть подпись.
слона то я и не заметил ))) всё одно как получается 57600 не понимаю...не, тогда и 9600 у неё не заработает, без правки кода, а у неё заработало...чудеса...