Страница 18 из 115
Добавлено: Пн фев 09, 2009 19:32:02
Барсик
SeregaT писал(а):Каким образом можно написать прошивку для МК на С, и конвертировать её в файл HEX?
1. Запустить среду разработки CodeVisionAVR.
2. Сгенерить в автоматическом режиме текстовый файл с программой на C.
3. Добавить в этот файл операторы, которые Вам нужны.
4. Нажать кнопочку "Make The Project" чтобы получить HEX файл.
5. Если у Вас есть программатор, который поддерживается этой средой разработки, то нажать кнопочку "Run the chip programmer" и залить Ваш HEX файл в контроллер.
Добавлено: Пн фев 09, 2009 19:39:58
SeregaT
Тоесть если у меня нету программатора, который поддерживается этой средой, то я всёравно смогу прошить свой МК?
Ну тогда можно начинать разбираться в C
P.S. И правда, всё генерится, прошивается, работает...
P.P.S А что, на С прога на много больше места занимает, чем на ассемблере? Просто я тут сделал прогу для моргания одним светодиодом, а она места почти столько-же заняла, как прога на ассемблере, в которой использовалось 8 светодиодов, причём с кучей алгоритмов и мегаиллюминацией.
Добавлено: Пн фев 09, 2009 19:48:57
Барсик
Конечно! HEX файл то у Вас будет! Шейте чем хотите! А лучше собрать STK200/300, как советует
Pippeytz. Программатор Громова хорош для тех, кто сам программы не пишет, а эпизодически хочет залить готовую прошивку.
SeregaT писал(а):...P.P.S А что, на С прога на много больше места занимает, чем на ассемблере?...
Не так уж и намного, но, конечно больше - это неизбежная плата за язык высокого уровня. Кстати, когда в неё добавите "мегаиллюминацию", то размер увеличится не на много. Ведь то, что туда натолкал компилятор для работы с "C", в программе уже есть...
Добавлено: Пн фев 09, 2009 19:53:30
SeregaT
Барсик писал(а):Программатор Громова хорош для тех, кто сам программы не пишет, а эпизодически хочет залить готовую прошивку.
Да фиг с ним, главное работает. Для нормального программатора надо плату делать, а с этим у меня пока очень туго. Под микросхемы никогда не делал...
Добавлено: Пн фев 09, 2009 20:10:14
Pippeytz
А хрена там делать?
Принтерь есь?
ЛУТ спасет мир.
Добавлено: Пн фев 09, 2009 20:17:45
SeregaT
Ну до плат я потом доберусь. Там наверное проги есть для рисования плат? Да и как разметить под микросхему то-же хз.
Добавлено: Пн фев 09, 2009 20:27:00
Pippeytz
Епт, как вставлять рисунки чтобы были малеьнкие иконки видны в посте , а не просто сцылко?
Добавлено: Пн фев 09, 2009 20:55:20
SeregaT
Pippeytz писал(а):Епт, как вставлять рисунки чтобы были малеьнкие иконки видны в посте , а не просто сцылко?
[img]ссылка[/img]
Добавлено: Пн фев 09, 2009 21:01:37
SeregaT
А не могли бы выложить тут для примера текст проги на C (типа какойнибудь моргалки, не сложный)?
Добавлено: Пн фев 09, 2009 21:12:47
Pippeytz
#include <mega8> //Включаем библиотеку для работы с микроконтроллером ATMega8
#include <delay> //Включаем библиотеку для организации задержек
void main(void)
{
int i; // описание переменной "і" как целое число Int - (Integer)
PORTD=0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D
DDRD=0xFF; //Делаем порт D, как выход, чтобы на выходах порта было напряжение 5В
while (1) //Организовываем бесконечный цикл
{
for (i = 0; i<4 ; i++) // Цикл мигание первого светодиода, 4 раза
{
PORTD.0=1; //Включаем светодиод на 0 выходе порта D.0
delay_ms(50); //Делаем задержку на 50 миллисекунд
PORTD.0=0; //Выключаем светодиод на 0 выходе порта D.0
delay_ms(50); //Делаем задержку на 50 миллисекунд
}
delay_ms(200); // Задержка между мерцаниями, 200 мс
for (i = 0; i<4 ; i++) // Мигание второго светодиода, 4 раза
{
PORTD.1=1; //Включаем светодиод на 0 выходе порта D.1
delay_ms(50); //Делаем задержку на 50 миллисекунд
PORTD.1=0; //Выключаем светодиод на 0 выходе порта D.1
delay_ms(50); //Делаем задержку на 50 миллисекунд
}
delay_ms(200); // Задержка между мерцаниями, 200 мс
};
}
Как-то так
по коду можно догадатсья куда диода цеплять нада
Добавлено: Ср фев 11, 2009 09:37:10
SeregaT
Мдааа. Каждая новая строчка на C нехило добавляет объём прошивки.
А гденить можно посмотреть примеры различных прог с описаниями? Что-то нигде не нашёл.
Добавлено: Ср фев 11, 2009 13:15:12
SeregaT
Подскажите пожалуйста такую тему:
Вот хочу написать прогу, эмулирующую работу одного станка с ЧПУ (как раз на нём контроллер наполовину накрылся, и сделано малость через Ж, так что потом может и пригодиться прога).
Требования: на выход минимум 10 каналов (тоесть одного порта недостаточно). Получается, что один порт надо полностью на выход, а другой частично (пока не понял, как на C открыть частично, на ассемблере с этим понятно, но для станка на C будет лучше). Так-же нужно 4 канала на вход.
Теперь самое главное. Не могли бы написать пример для фрагмента алгоритма?
Фрагмент вот:
PORTD.0=1
Ждёт сигнала с PORTB.1
PORTD.1=1
Задержка 1 сек
PORTD.0=0
Задержка 1 сек
На начало программы
И ещё, при нажатии на концевик (0 на reset), программа начнётся сначала, но для этого нужно убрать 0 с вывода reset. Может концевик включить через кондёр, типа он зарядится и на reset снова 1?
Добавлено: Чт фев 12, 2009 17:15:51
SeregaT
Эх, похоже я так и не узнаю ответа на предыдущий вопрос (про фрагмент кода)...
Добавлено: Чт фев 12, 2009 18:02:11
Cat_CooLeR
Код: Выделить всё
while (1)
{
PORTD.0=1;
while (PORTB.1==0)
PORTD.1=1;
delay_ms(1000);
PORTD.0=0;
delay_ms(1000);
};
Так, скорее всего..
Добавлено: Чт фев 12, 2009 18:35:40
SeregaT
Спасибо, попробую. А как в начале программы написать, чтобы активировать часть каналов порта B на вход?
Добавлено: Чт фев 12, 2009 19:22:27
Барсик
SeregaT писал(а):...Получается, что один порт надо полностью на выход, а другой частично (пока не понял, как на C открыть частично...)...
Запустите автоматический генератор программного кода и на закладке "Ports" укажите какие линии порта должны работать на ввод и какие на вывод. Он Вам сгенерит строчки на "C", которые инициализируют порты.
SeregaT писал(а):...Ждёт сигнала с PORTB.1...
Вы ждёте сигнал с выхода порта или ждёте, когда на ногу микроконтроллера придёт сигнал извне? Это две большие разницы. Чтобы смотреть, что на ноге, надо использовать PINB.1
Код: Выделить всё
while (1)
{
PORTD.0=1;
// ждём лог. 1 на ноге
while (!PINB.1);
// Дождались...
PORTD.1=1;
// Задержка 1 сек
delay_ms(1000);
PORTD.0=0;
// Задержка 1 сек
delay_ms(1000);
// На начало программы
};
Обратите внимание на точку с запятой в конце строчки while (!PINB.1);
Если ; пропустить, то компилятор не сообщит об ошибке, но программа будет работать неправильно.
SeregaT писал(а):...при нажатии на концевик (0 на reset), программа начнётся сначала, но для этого нужно убрать 0 с вывода reset....
С этим вообще не понятно. Напишите подробнее, что Вы хотие от этого несчастного концевика.
Добавлено: Чт фев 12, 2009 19:26:45
SeregaT
Cat_CooLeR писал(а):
Так, скорее всего..
PORTD.0 и PORTD.1 включились одновременно и на сигнал на PORTB.1 никак не реагирует

Добавлено: Чт фев 12, 2009 19:28:44
SeregaT
Барсик писал(а):
Вы ждёте сигнал с выхода порта или ждёте, когда на ногу микроконтроллера придёт сигнал извне? Это две большие разницы.
Я малость ступил. Ждать надо сигнала извне (0 или 1, без разницы).
С этим вообще не понятно. Напишите подробнее, что Вы хотие от этого несчастного концевика.
Ну вот например в конце программы включается сигнал на предыдущий станоу и начинается подача доски. Доска дошла до концевика, нажимает его и программа должна запустится сначала (но концевик остаётся нажатым). А вообще, это пока не особо важно, вспомнил, чтонадо не на ресет а на другой выход (прога должна не совсем сначала начаться).
Добавлено: Чт фев 12, 2009 19:52:21
SeregaT
Барсик
Что-то не получилось с фрагментом. Я наверное не правильно вопрос поставил.
Я имел ввиду, что алгоритм нужен был такой:
При запуске программы на PORTD.0 появляется 1 (5в)
Затем программа ждёт сигнала на PORTB.1
После сигнала уже на PORTD.1 должна появится 1 (5в)
Через секунду должен выключиться PORTD.0
Еще через секунду должен выключиться PORTD.1 и программа должна начаться сначала.
А получилось вот так:
При включении на PORTD.1 появляется 1.
На PORTD.0 с секундными паузами появляется и исчезает 1
Когда на PORTB.1 подать ноль, то на PORTD.0 появляется 1 до тех пор, пока с PORTB.1 не убрать 0
Добавлено: Чт фев 12, 2009 20:44:25
SeregaT
Cat_CooLeR и
Барсик
Спасибо большое!
Из ваших двух ответов собрал один и всё заработало
while (1)
{
PORTD.0=1;
while (!PINB.1==0);
PORTD.1=1;
delay_ms(1000);
PORTD.0=0;
delay_ms(1000);
PORTD.1=0;
delay_ms (1000);
}
};
Напишу прогу, выложу текст для оценки

Только надо светодиодами для проверки запастись
