Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Господа, возник вопрос по AVRISP MK2.

Надо было раньше купить, но купил только сегодня. В общем пепелац собран на ATmega128A. После того как я подкинул дрова и Atmel Studio 6.2 его увидела, то сразу предложила обновить прошивку до 1.17 (старая была 1.с). После того как оно всё обновилось с успехом, я решил зашить ATtiny25. Программатор горит красным глазом и студия вещает про то, что Vtarget установлен слишком низкий (0,2в). До обновления фирмвари программатор так себя не вёл. Пины стандартные, не самопал. Перепутать не мог. Да и не перепутано там.

Вопрос вот какой: где нужно отрегулировать борду по Vtarget и возможно ли это в AS7?

P.S. После установки AS7 было предложено обновиться до версии 1.18, что было успешно произведено. Но к сожалению толку нет.

AVRISP mkII
Debug host        127.0.0.1
Debug port        56187
Serial number     0000B0026998
Connection        com.atmel.avrdbg.connection.mchp
Firmware Version  1.18
Hardware Version  1

 

Скрытый текст

Без імені22.jpg

 

Изменено пользователем Morlock
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

16.07.2020 в 11:23, Дмитрий Вас сказал:

где куда что это? 

Например можно скачать и поставить:

Microsoft Visual Studio Express 2015 for Windows Desktop

Это среда разработки, в ней создаете проект ConsoleApplication1 - какой нибудь,

там появляется С-файл (или С++ - файл это не принципиально) в нем функция main(),

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

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Здравствуйте! Почему когда я написал вот такой код 

//Atmega8
//Укажем частоту
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Инициализируем библиотеку для работы с дисплеем
#include "n5110.h"
#include <stdlib.h>

//Предварительные настройки
void presets(){
//Инициализируем дисплей
    Lcd_init();
//Настройки АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS2) | (1<<ADPS2) ; //Делитель 128 = 64 кГц

//ADMUX	
ADMUX |= (1<<REFS1)|(1<<REFS0); //Опорное напряжение 2.56 В внутреннее
//| (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0) //Выбор вывода
}

int readADC(unsigned int ch){
	unsigned char set_admux = ADMUX;
	set_admux &= ~((1<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0));
	switch(ch)
	{
	    case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break; 
		default:break;
	}
	ADMUX = set_admux
	;_delay_ms(10);
	int tmp = 0;
	for (int i=0;i<40;i++)
	{
		ADCSRA |= (1<<ADSC); //Запуск преобразования
		while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
		ADC +=tmp; //tmp = tmp + ADC;
	}
   	return tmp/40;
}


int main(void)
{
    presets();
    while (1) 
    {
		Lcd_clear();
		Lcd_printf(0,0,FONT_1X,((readADC(0)*2.56*(30/2.56))/1023), 1);
	    Lcd_printf(0,1,FONT_1X,((readADC(1)*0.02935)), 1);
		Lcd_update();
		_delay_ms(200);
    			
		
    }
}

набросал схему в Proteus - АЦП показывает 0.0, почему так?

     

n5110.c n5110.h New Project.pdsprj GccApplication7.atsln

Изменено пользователем Андрей Протаскин
Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Андрей Протаскин сказал:

показывает 0.0, почему так?

а если написать ему hello world, дисплей напишет?

6 часов назад, Андрей Протаскин сказал:

while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования

после этого напиши обнулить канал измерения. это обязательно!!!ADMUX&=0xF0;//обязательно обнуляем канал

Ссылка на комментарий
Поделиться на другие сайты

Пробовал - всё равно в Proteus преобразователь показывает 0.0.

Вот код 

//Atmega8
//Укажем частоту
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Инициализируем библиотеку для работы с дисплеем
#include "n5110.h"
#include <stdlib.h>

//Предварительные настройки
void presets(){
//Инициализируем дисплей
    Lcd_init();
//Настройки АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS2) | (1<<ADPS2) ; //Делитель 128 = 64 кГц

//ADMUX	
ADMUX |= (1<<REFS1)|(1<<REFS0); //Опорное напряжение 2.56 В внутреннее
//| (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0) //Выбор вывода
}

int readADC(unsigned int ch){
	unsigned char set_admux = ADMUX;
	set_admux &= ~((1<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0));
	switch(ch)
	{
	    case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break; 
		default:break;
	}
	ADMUX = set_admux
	;_delay_ms(10);
	int tmp = 0;
	for (int i=0;i<40;i++)
	{
		ADCSRA |= (1<<ADSC); //Запуск преобразования
		while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
		ADMUX&=0xF0;
		ADC +=tmp; //tmp = tmp + ADC;
	}
   	return tmp/40;
}


int main(void)
{
    presets();
    while (1) 
    {
		Lcd_clear();
		Lcd_printf(0,0,FONT_1X,((readADC(0)*2.56*(30/2.56))/1023), 1);
	    Lcd_printf(0,1,FONT_1X,((readADC(1)*0.02935)), 1);
		Lcd_update();
		_delay_ms(200);
    			
		
    }
}

 

GccApplication7.atsln n5110.c n5110.h New Project.pdsprj

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, Андрей Протаскин сказал:

всё равно в Proteus преобразователь показывает 0.0

Ясное дело:

18 минут назад, Андрей Протаскин сказал:

ADC +=tmp; //tmp = tmp + ADC;

У вас же в комментарии написано верное выражение, почему изменили-то? ADC - это регистр результата преобразования, записывать туда что-либо бесполезно. Вам же надо накапливать сумму замеров в tmp - что ж вы написали-то?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте! Скажите мне пожалуйста, где взять в Proteus такой же подстроечный резистор как на скриншоте показанный  красными стрелками? https://yadi.sk/i/f-k8lhfhiHYyRg

Ссылка на комментарий
Поделиться на другие сайты

Все резисторы в протеусе в одном месте находятся, в том числе и переменные. Если память мне не изменяет, в названии переменного резистора есть слово variable  и LIN, можно ввести в поиск и потом выбрать нужный.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте! Я тут написал код 

//Atmega8
//Укажем частоту
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Инициализируем библиотеку для работы с дисплеем
#include "n5110.h"
#include <stdlib.h>

//Предварительные настройки
void presets(){
//Инициализируем дисплей
    Lcd_init();
//Настройки АЦП
//ADCSRA
ADCSRA |= (1<<ADEN) //Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS2) | (1<<ADPS2) ; //Делитель 128 = 64 кГц

//ADMUX	
ADMUX |= (1<<REFS1)|(1<<REFS0); //Опорное напряжение 2.56 В внутреннее

}

int readADC(unsigned int ch){
	unsigned char set_admux = ADMUX;
	set_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));
	switch(ch)
	{
	    case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break; 
		case 2: set_admux |= ((0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0));break; 
		
		default:break;
	}
	ADMUX = set_admux;
	int tmp = 0;
	for (int i=0;i<40;i++)
	{
		ADCSRA |= (1<<ADSC); //Запуск преобразования
		while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
	    tmp += ADC; //tmp = tmp + ADC;

	}
   	return tmp/40;
}


int main(void)
{
    presets();
    while (1) 
    {
		Lcd_clear();
		//Вольты
		Lcd_printf(0,0,FONT_1X,((readADC(0)*2.56*(30/2.56))/1023), 1);
		//Амперы
	    Lcd_printf(0,1,FONT_1X,((readADC(1)*2.56*(3/2.56))/1023), 1);
		//Градусы
		Lcd_printf(0,2,FONT_1X,(((readADC(2)*2.56*100*(3.73/2.56))/1023)-273.15), 0);
		Lcd_update();
		_delay_ms(200);
    			
		
    }
}

Собрал схему в Proteus , а АЦП (Вольтметр, амперметр и термометр) показывают 13.2, 1.3, -497, а должно показывать 23.4, 2.0, 95 Почему так?

GccApplication7.atsln n5110.c n5110.h GccApplication7.hex New Project.pdsprj

Ссылка на комментарий
Поделиться на другие сайты

40 минут назад, Андрей Протаскин сказал:

tmp += ADC;

Здесь может происходить переполнение переменной tmp. Сделайте её long, должно помочь.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

@Андрей Протаскин

18.07.2020 в 16:00, Дмитрий Вас сказал:
18.07.2020 в 10:00, Андрей Протаскин сказал:

while ((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования

после этого напиши обнулить канал измерения. это обязательно!!!ADMUX&=0xF0;//обязательно обнуляем канал

я уже писал вам. я так же напоролся, ОБЯЗАТЕЛЬНО!! после преобразования обнулять канал!!!

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте.

Откопал у себя б\у PIC16C57C.

Программатор TL866II+ видит их и читает. Но не пишет.

И не стирает (даже пункт в меню стирания не подсвечен).

Насколько я понял по битам конфигурации МК защищен от чтения\стирания.

Отсюда вопрос: имеет ли смысл возиться с удалением бит защиты для стирания с целью дальнейшего использования в личных целях или проще эти МК выкинуть?

Аналогично обнаружены три PIC16LF628. На попытку чтения как  PIC16LF628А ругаются на неправильный ID. Выкинуть?

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

Ссылка на комментарий
Поделиться на другие сайты

Ба, они что, с пережигаемой памятью?

Изменено пользователем smart_ed

В действительности всё выглядит иначе, чем на самом деле. ©

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...