"Вопросительные знаки" от Atmega328P 8MHz при подключении по Uart

В загрузчике DIY Attiny у меня не работает analogRead(A2), а analogRead(A3) работает. А в MicroCore работает analogRead(A2)

Как то вы интересно с одной темы на другую перепрыгиваете…

Это всё по пути решения проблемы)

Что это значит?

Вы какую скорость задаёте? А какую получаете? Вот и посчитайте во сколько раз отличие.

Скорость 9600.
На старом форуме сказали ставить такие параметры

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

В протеус работает на скорости 9600.

Что бы проверить частоту МК:

  • подключите светодиод через резистор к свободному пину
  • настройте его на вывод
  • в main-e добавьте: _delay_ms(400); PINB = 1<<LED_PIN; //номер бита светодиода
    Период мигания должен быть 1 сек.

Кто вам писал этот код?
Флаги в AVR сбрасываются так (пример): TIFR0 = 1<<OCF0A;

В Протеусе этот метод не всегда скажет о тактовой частоте. У него в опциях проекта есть параметр Clock for delays от которого зависят эти задержки.

У ТС скорее всего в протеусе стоит фьюз деления на 8

1 лайк

Это для железа. Что бы видеть реальную частоту МК.

А где этот параметр? Я что то не встречал такого.
Едва похоже Scale all values by constant во вкладке DSIM…


У меня в 8.15 такого нет.)

Код для F_CPU 1200000, в Протеусе у вас 1,2 и стоит. В железе же 9,6. Вот вам и 74800.

Вы прикалываетесь?)
Ещё раз. Ваш код (в 13-м сообщении) работает на 9600 при частоте МК 1,2 мгц!
Соответственно, при 9,6 мгц он будет работать на 74800, что вы и наблюдаете.
Разбирайтесь. Я достаточно вам дал рекомендаций.

Недавно себе писал простую функцию. Работает в железе 16MHz (9600). В Протеусе работает на Attiny13 на 9.6MHz(9600). Аналог Serial.write(). Может поможет

void writeByte(byte r) {
  digitalWrite(txPin, LOW); // 
  delayMicroseconds(104); // start bit
  for (byte i = 0; i < 8; i++) {
    digitalWrite(txPin, r & (1 << i)); //
    delayMicroseconds(95);//  
  }
  digitalWrite(txPin, HIGH); // stop bit
  delayMicroseconds(104); // 
}

P.S. Т.е просто вставить вместо функции uart_send_byte()
и переименовать, конечно, саму функцию и пин
P.P.S. Возможно, так надо было записать. В таком виде, в Протеусе работает и на 1.2 MHz(тоже 9600). К сожалению Attiny13 сейчас нет , чтобы проверить

void writeByte(uint8_t r) {
uint8_t  i;
  PORTB &=~(1 << txPin);
  _delay_us(104); // start bit 
  for (  i = 0; i < 8; i++) {
  if (r & (1 << i)){
  PORTB |= 1 << txPin; //
}
else{
 PORTB &= ~(1 << txPin); 
}
    _delay_us(95);//
  }
 PORTB |= 1 << txPin; // stop bit
  _delay_us(104); // 
}

Спасибо. Сейчас тоже нет аттини13, в будние дни проверю, отпишусь.

И не всё так просто. Если использовать мою функцию, придётся ещё изменить

#define SOFT_TX_PIN 1  // PB1 будет работать как TXD 

и

void uart_tx_init ()
{
  DDRB |= 1 << SOFT_TX_PIN;
  PORTB |= 1 << SOFT_TX_PIN;
}

Так же можно кое что лишнее из кода(13 сообщ) повыкидывать,
скажем в функции num_to_str() оператор switch можно совсем убрать, он ничего не делает, так же можно убрать второй параметр из функции. Ещё, неплохо привести типы данных, хорошо, компилятор справляется, хоть и ругается. Незначащие нули, тоже , необязательно выводить… Но это уже так, для красоты. Работает, и ладно))

Можно конечно пробовать разные готовые советы и “трясти” пока не получится.
По моему правильнее и полезнее разобраться в причине существующей ошибки.
Повторю.
Приведенный в 13 сообщении код рассчитан на скорость 9600 Бод при тактовой 1,2 МГц (из -за измененной зачем то строки 64 TCCR0B |= (1 << CS00) В оригинале было логичное TCCR0B = i;
То что у вас в протеусе “с этой строкой” работает на 9600 бод при 9,6 МГц возможно из-за

  • вы используете hex от другого варианта кода, ( Правильного, без лишней строки 64) Проверьте еще раз какой hex вы используете.
  • неправильные настройки тактирования в протеусе (тут вы вроде проверили)
  • глюк протеуса (Для этого случая, по моему маловероятно)

Там всё через жо.) Если хочется 9600 на 9,6 мгц, то 64 надо исправить на TCCR0B = 1<<CS01;