ATMEGA328P-PU кварцевый (резонатор, генератор) НЕ 16МГц

Гриша
Offline
Зарегистрирован: 27.04.2014

Купил кварц 16,384 МГц, ровно на 16МГц небыло, ценник копеечный.  Есть ATMEGA328P-PU раньше хотел его запустить от внутреннего генератора, но вродебы больше 8МГц от внутреннего разогнать нельзя (я не нашел в инете). 

http://arduino.cc/en/Tutorial/ArduinoToBreadboard

1) подскажите, могули я записать загрузчик не модифицируя под этот кварц?

есть UNO R3.

может кто имел опыт? собираюсь потом купить на 16,0МГц, Что такое фьюзы и как их на калькуляторе считать пока не понял, хочу использовать стандартный загрузчик как для UNO платы. И вообще не смог найти простой статьи про нестандартные кварцы.   

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

заранее спасибо :)

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

А поменять параметр "build.f_cpu" в boards.txt не помогает?

Для 16 и 16.384 фьюзы будут одинаковые.

Гриша
Offline
Зарегистрирован: 27.04.2014

KVadik пишет:

А поменять параметр "build.f_cpu" в boards.txt не помогает?

Для 16 и 16.384 фьюзы будут одинаковые.

1) это вопрос или ответ?

2) поменять нет проблем, а uno.bootloader.file=optiboot_atmega328.hex - тот-же?

вывод: при нестондартном кварце необходимо явно указать фактическую частоту в файле boards.txt если частота отличается от стандартной на (сколько?)% - это правильно или нет????

MaksMS
Offline
Зарегистрирован: 11.03.2013

Гриша пишет:

вывод: при нестондартном кварце необходимо явно указать фактическую частоту в файле boards.txt если частота отличается от стандартной на (сколько?)% - это правильно или нет????

Да, верно, даже бутлоадер этот же будет работать

Гриша
Offline
Зарегистрирован: 27.04.2014

MaksMS пишет:

Гриша пишет:

вывод: при нестондартном кварце необходимо явно указать фактическую частоту в файле boards.txt если частота отличается от стандартной на (сколько?)% - это правильно или нет????

Да, верно, даже бутлоадер этот же будет работать

спасибо! Понимаю, что разбег небольшой и возможно заработает, вот бы узнать "ворота" (%) в которых гарантировно будут работать фьюзы. И изменяя boards.txt (будет своя блок вставка на заданную частоту) ARDUINO ISP - записать с помощью загрузчика (выбрать эту плату), - тоже поидее заработаеть . Чуток позже попробую, напишу как получилось... 

ЗЫ изменяя boards.txt а потом поменяв кварц на 16,0 я выбиру UNO, по идеи, все будет работать ??? boards.txt  - для правильной работы ISP?

MaksMS
Offline
Зарегистрирован: 11.03.2013

 у м/к должно быть вставлены фьюзы просто от внешнего кварца. Нет там выбора частоты 16 и 16.384 мгц.. Там достаточно большой диапозон частот..

Гриша
Offline
Зарегистрирован: 27.04.2014

MaksMS пишет:

 у м/к должно быть вставлены фьюзы просто от внешнего кварца. Нет там выбора частоты 16 и 16.384 мгц.. Там достаточно большой диапозон частот..

спасибо! вразумительный ответ, может кому потом пригодится :)

Гриша
Offline
Зарегистрирован: 27.04.2014

создал вставку :

##############################################################

uno_16_384MHz.name=Arduino_Uno_16.384MHz
uno_16_384MHz.upload.protocol=arduino
uno_16_384MHz.upload.maximum_size=32256
uno_16_384MHz.upload.speed=115200
uno_16_384MHz.bootloader.low_fuses=0xff
uno_16_384MHz.bootloader.high_fuses=0xde
uno_16_384MHz.bootloader.extended_fuses=0x05
uno_16_384MHz.bootloader.path=optiboot
uno_16_384MHz.bootloader.file=optiboot_atmega328.hex
uno_16_384MHz.bootloader.unlock_bits=0x3F
uno_16_384MHz.bootloader.lock_bits=0x0F
uno_16_384MHz.build.mcu=atmega328p
uno_16_384MHz.build.f_cpu=16384000L
uno_16_384MHz.build.core=arduino
uno_16_384MHz.build.variant=standard 

собрал на макетке пример:

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
long on1  = 0x00FFA25D;
long off1 = 0x00FFE01F;
long on2 = 0x00FF629D;
long off2 = 0x00FFA857;
long on3 = 0x00FFE21D;
long off3 = 0x00FF906F;
long on4 = 0x00FF22DD;
long off4 = 0x00FF6897;
long on5 = 0x00FF02FD;
long off5 = 0x00FF9867;
long on6 = 0x00FFC23D;
long off6 = 0x00FFB04F;

IRrecv irrecv(RECV_PIN);
decode_results results;

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) 
    {
     Serial.println("Could not decode message");
    } 
  else 
   {
    if (results->decode_type == NEC) 
      {
       Serial.print("Decoded NEC: ");
      } 
    else if (results->decode_type == SONY) 
      {
       Serial.print("Decoded SONY: ");
      } 
    else if (results->decode_type == RC5) 
      {
       Serial.print("Decoded RC5: ");
      } 
    else if (results->decode_type == RC6) 
      {
       Serial.print("Decoded RC6: ");
      }
     Serial.print(results->value, HEX);
     Serial.print(" (");
     Serial.print(results->bits, DEC);
     Serial.println(" bits)");
   }
     Serial.print("Raw (");
     Serial.print(count, DEC);
     Serial.print("): ");

  for (int i = 0; i < count; i++) 
     {
      if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
     } 
    else  
     {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
     }
    Serial.print(" ");
     }
      Serial.println("");
     }

void setup()
 {
  pinMode(RECV_PIN, INPUT);   
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);  
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  
  irrecv.enableIRIn(); // Start the receiver
 }

int on = 0;
unsigned long last = millis();

void loop() 
{
  if (irrecv.decode(&results)) 
   {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250) 
      {
       on = !on;
//       digitalWrite(8, on ? HIGH : LOW);
       digitalWrite(13, on ? HIGH : LOW);
       dump(&results);
      }
    if (results.value == on1 )
       digitalWrite(LED1, HIGH);
    if (results.value == off1 )
       digitalWrite(LED1, LOW); 
    if (results.value == on2 )
       digitalWrite(LED2, HIGH);
    if (results.value == off2 )
       digitalWrite(LED2, LOW); 
    if (results.value == on3 )
       digitalWrite(LED3, HIGH);
    if (results.value == off3 )
       digitalWrite(LED3, LOW);
    if (results.value == on4 )
       digitalWrite(LED4, HIGH);
    if (results.value == off4 )
       digitalWrite(LED4, LOW); 
    if (results.value == on5 )
       digitalWrite(LED5, HIGH);
    if (results.value == off5 )
       digitalWrite(LED5, LOW); 
    if (results.value == on6 )
       digitalWrite(LED6, HIGH);
    if (results.value == off6 )
       digitalWrite(LED6, LOW);        
    last = millis();      
    irrecv.resume(); // Receive the next value
  }
}

все работает! нормально загрузилось через ARDUINO AS ISP загрузить с помощью программатора...

ОГРОМНОЕ СПАСИБО!!!!!

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

MaksMS пишет:

 у м/к должно быть вставлены фьюзы просто от внешнего кварца. Нет там выбора частоты 16 и 16.384 мгц.. Там достаточно большой диапозон частот..

Ну не совсем так, для 328, например фьюзами задается 4 диапазона частоты внешнего кварца (0.4-0.9МГц, 0.9-3МГц, 3-8МГц и более 8МГц (максимально допустимая частота зависит от модификации чипа и напряжения питания)

MaksMS
Offline
Зарегистрирован: 11.03.2013

Да, это я вкурсе, но в данном случае я же написал что для 16 что для 16.384 фьюзы одинаковые