В загрузчике 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
Это для железа. Что бы видеть реальную частоту МК.
А где этот параметр? Я что то не встречал такого.
Едва похоже 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;


