Добрый день. Подскажи пожалуйста в чем может быть причина. Суть проблемы:
Написал скетч на Arduino Nano и оттестировал на макетке, все работает. Купил голую atmega328, прошиваю ее через ядро MiniCore, скетч не работает ). Причем обычный Blink работает.
Сделал эксперимент: прошил на самой arduino atmega без загрузчика и тактирование от внутреннего генератора, заливаю скетч работает, выпаиваю кварц - скетч перестает работать, хотя он уже как бы и не нужен т.к. тактирование идет от внутреннего генератора )
В скетче использована функция по считываю показаний потенциометра с пина А0, думаю может с этим связано и кварц тут необходим?
Как и чем прошил? Поподробнее, если можно.
Значит не от внутреннего
Покажите код полностью, есть библиотеки, которые на внутреннем генераторе не работают
‘’’
#define Seat_left_pin 0
#define Seatleft 3
#define Seat_right_pin 1
#define Seatright 5
int val_seat_1, out_seat_1;
int val_seat_2, out_seat_2;
int b=0, w=1, a=0, y=1;
unsigned long sk1,sk2;
int timer1 = 1200, timer2 = 1200;
void setup() {
pinMode(Seatleft, OUTPUT);
pinMode(Seatright, OUTPUT);
pinMode(Seat_left_pin,INPUT);
pinMode(Seat_right_pin,INPUT);
}
void loop() {
// инициализация левого обогрева,
if (b>0 && w == 0 ) {analogWrite(Seatleft, out_seat_1); digitalWrite(13,HIGH);} else {analogWrite(Seatleft, 0); digitalWrite(13,LOW);}
if ( millis() - sk1 > 995 && timer1 >= 0 ) {
sk1 = millis();
timer1 = timer1 - 1;
}
if (timer1 == 0){
w=1;
analogWrite(Seatleft, 0);
digitalWrite(13,LOW);
}
LeftSeat();
// инициализация правого обогрева
if (a>0 && y == 0 ) {analogWrite(Seatright, out_seat_2); digitalWrite(17,HIGH);} else {analogWrite(Seatright, 0);digitalWrite(17,LOW);}
if ( millis() - sk2 > 995 && timer2 >= 0 ) {
sk2 = millis();
timer2 = timer2 - 1;
}
if (timer2 == 0){
y=1;
analogWrite(Seatright, 0);
}
RightSeat();
}
void LeftSeat()
{
val_seat_1 = analogRead(Seat_left_pin);
val_seat_1 = map(val_seat_1, 1023, 0, 0, 255);
val_seat_1 = constrain(val_seat_1, 0, 255);
switch (val_seat_1){
case 0 … 15: out_seat_1 = 0; b=0; timer1 = 1200; w=0; break;
case 16 … 42: out_seat_1 = 32; b=1; break; //уменьшение на 20% - 25
case 43 … 65: out_seat_1 = 64; b=2; break; //уменьшение на 20% - 51
case 66 … 81: out_seat_1 = 96; b=3; break; //уменьшение на 20% - 76
case 82 … 107: out_seat_1 = 128; b=4; break; //уменьшение на 20% - 102
case 108 … 128: out_seat_1 = 160; b=5; break; //уменьшение на 20% - 128
case 129 … 149: out_seat_1 = 192; b=6; break; //уменьшение на 20% - 153
case 150 … 170: out_seat_1 = 224; b=7; break; //уменьшение на 20% - 179
case 171 … 190: out_seat_1 = 255; b=8; break; //уменьшение на 20% - 204
}
delay(30);
}
void RightSeat()
{
val_seat_2 = analogRead(Seat_right_pin);
val_seat_2 = map(val_seat_2, 1023, 0, 0, 255);
val_seat_2 = constrain(val_seat_2, 0, 255);
switch (val_seat_2){
case 0 … 25: out_seat_2 = 0; a=0; timer2 = 1200; y=0; break;
case 26 … 50: out_seat_2 = 32; a=1; break;
case 51 … 70: out_seat_2 = 64; a=2; break;
case 71 … 90: out_seat_2 = 96; a=3; break;
case 91 … 110: out_seat_2 = 128; a=4; break;
case 111 … 130: out_seat_2 = 160; a=5; break;
case 131 … 150: out_seat_2 = 192; a=6; break;
case 151 … 170: out_seat_2 = 224; a=7; break;
case 171 … 190: out_seat_2 = 255; a=8; break;
}
delay(30);
}
‘’’
да тут с ошибкой картинку сделал просто, там стоит Internal 8 MHz
тут с ошибкой… там с ошибкой…
А потом удивляетесь, что не работает.
Код вставьте по правилам форума. он и так-то у вас написан коряво, а без форматирования вообще глаза сломаешь.
#define Seat_left_pin 0
#define Seatleft 3
#define Seat_right_pin 1
#define Seatright 5
int val_seat_1, out_seat_1;
int val_seat_2, out_seat_2;
int b=0, w=1, a=0, y=1;
unsigned long sk1,sk2;
int timer1 = 1200, timer2 = 1200;
void setup() {
pinMode(Seatleft, OUTPUT);
pinMode(Seatright, OUTPUT);
pinMode(Seat_left_pin,INPUT);
pinMode(Seat_right_pin,INPUT);
}
void loop() {
// инициализация левого обогрева,
if (b>0 && w == 0 ) {analogWrite(Seatleft, out_seat_1); digitalWrite(13,HIGH);} else {analogWrite(Seatleft, 0); digitalWrite(13,LOW);}
if ( millis() - sk1 > 995 && timer1 >= 0 ) {
sk1 = millis();
timer1 = timer1 - 1;
}
if (timer1 == 0){
w=1;
analogWrite(Seatleft, 0);
digitalWrite(13,LOW);
}
LeftSeat();
// инициализация правого обогрева
if (a>0 && y == 0 ) {analogWrite(Seatright, out_seat_2); digitalWrite(17,HIGH);} else {analogWrite(Seatright, 0);digitalWrite(17,LOW);}
if ( millis() - sk2 > 995 && timer2 >= 0 ) {
sk2 = millis();
timer2 = timer2 - 1;
}
if (timer2 == 0){
y=1;
analogWrite(Seatright, 0);
}
RightSeat();
}
void LeftSeat()
{
val_seat_1 = analogRead(Seat_left_pin);
val_seat_1 = map(val_seat_1, 1023, 0, 0, 255);
val_seat_1 = constrain(val_seat_1, 0, 255);
switch (val_seat_1){
case 0 ... 15: out_seat_1 = 0; b=0; timer1 = 1200; w=0; break;
case 16 ... 42: out_seat_1 = 32; b=1; break; //уменьшение на 20% - 25
case 43 ... 65: out_seat_1 = 64; b=2; break; //уменьшение на 20% - 51
case 66 ... 81: out_seat_1 = 96; b=3; break; //уменьшение на 20% - 76
case 82 ... 107: out_seat_1 = 128; b=4; break; //уменьшение на 20% - 102
case 108 ... 128: out_seat_1 = 160; b=5; break; //уменьшение на 20% - 128
case 129 ... 149: out_seat_1 = 192; b=6; break; //уменьшение на 20% - 153
case 150 ... 170: out_seat_1 = 224; b=7; break; //уменьшение на 20% - 179
case 171 ... 190: out_seat_1 = 255; b=8; break; //уменьшение на 20% - 204
}
delay(30);
}
void RightSeat()
{
val_seat_2 = analogRead(Seat_right_pin);
val_seat_2 = map(val_seat_2, 1023, 0, 0, 255);
val_seat_2 = constrain(val_seat_2, 0, 255);
switch (val_seat_2){
case 0 ... 25: out_seat_2 = 0; a=0; timer2 = 1200; y=0; break;
case 26 ... 50: out_seat_2 = 32; a=1; break;
case 51 ... 70: out_seat_2 = 64; a=2; break;
case 71 ... 90: out_seat_2 = 96; a=3; break;
case 91 ... 110: out_seat_2 = 128; a=4; break;
case 111 ... 130: out_seat_2 = 160; a=5; break;
case 131 ... 150: out_seat_2 = 192; a=6; break;
case 151 ... 170: out_seat_2 = 224; a=7; break;
case 171 ... 190: out_seat_2 = 255; a=8; break;
}
delay(30);
}
Если вы приводите значение val_seat_1
к диапазону 0…255, то почему switch только до 190? А что произойдет, если значение будет 200?
Так не делают.
Вообще, все умные книжки рекомендуют ВСЕГДА предусматривать вариант default в свитче
Возьмите пример блинк с задержкой мигания светодиода одна секунда и прошейте с этими параметрами. Будет мигать или нет?
При тесте с потенциометром считываемое значение не бывает больше 190, а шив я вывожу 255.
Будет да, а вот эта программа не работает если выпаять кварц, но работает если к плате обратно подпаять кварц
В каком месте 190? Какое отношение имеет ЧТЕНИЕ с потенциометра и ЗАПИСЬ на ШИМ?? Вы ничего не путаете?
не говорите впустую. прошейте, запустите и померяйте, с какой частотой будет мигать светодиод
Если бы в пустую, частоту нечем замерить, но на глаз 1 сек и есть. Я прошивал и пробовал. Работает как с кварцем так и без.
тогда и тут должно работать
Берёшь программатор (например usbasp), любую программу прошивки (например, avrdudeprog33) и считываешь фьюзы. Скриншот показываешь тут.
Я полностью с Вами согласен, но не работает ((( первое что я сделал это как раз проверил через Blink, мигание есть. Сразу прошиваю свой скетч нет ничего ( - это все на голом камне
Прошиваю скетч на ардуино работает
Прошиваю через USBasp программатор atmega на самой плате Arduino работает
Выпаиваю кварц перестает работать.
Подозрение что кварц замешан как то, хотя не должен (