
Замонался я со своим контроллером Atmega128. Явно знаний недостаточно..
1. Моя задача: Довести аппаратную платформу (Atmega128 + резонатор 4МГц+источник питания) до рабочего (программируемого) состояния. Т.е. нужно сделать макетную платку на которой можно отлаживать всевозможный код.
Схема Э3 на эту платку прилагается:
Нажмите для просмотра прикрепленного файла
Зачеркнул я те элементы схемы, которые не установил.
Платку спаял и включил. Подключился к ней используя программатор AVRISP(фирмовый). Подключается четко и без проблем. Посмотрел фьюзы:
Нажмите для просмотра прикрепленного файла
Т.е. контроллер жив и как-то работает! Проверяю дальше.
Отмечу, что из фьюзов видно, что по умолчанию контроллер тактируется от встроенного RC генератора 1 МГц. Этого достаточно, посчитал я, чтобы убедиться в работоспособности контроллера до конца.
2. Пишу простейший код для моргания лампочкой в порт "А":
Код
#define F_CUP 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
PORTA = 0x00;
_delay_ms(1000);
PORTA = 0xFF;
_delay_ms(1000);
}
}
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
PORTA = 0x00;
_delay_ms(1000);
PORTA = 0xFF;
_delay_ms(1000);
}
}
Код компилируется без ошибок, я его без проблем прошиваю -----> результата нет вообще. Лампочка не мигает никакая из порта А.
Если записываю в порт "А" единицы, тогда лампочка поджигается.
Потом записываю в порт "А" нули, диодик гаснет. Т.е. контроллер как-то программируется и воспринимает мой код.
Код
#define F_CUP 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
PORTA = 0xFF;
}
}
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
PORTA = 0xFF;
}
}
3. Для компиляции и симуляции использую Atmel Studio6
Нажмите для просмотра прикрепленного файла
4. Важный момент, который я заметил:
Если я пишу код без функций задержек, тогда на ножке светодиодика вижу меандр с частотой 71 кГц:
Код
#define F_CUP 1000000UL
#include <avr/io.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
PORTA = 0x00;
PORTA = 0xFF;
}
}
#include <avr/io.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
PORTA = 0x00;
PORTA = 0xFF;
}
}
Т.е. не работает код в котором используется стандартная функция задержек.
Пробовал написать и свою простейшую функцию, в результате тоже не работает.
Код
#define F_CUP 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
test ();
PORTA = 0xFF;
}
}
void test (void)
{
PORTA = 0x00;
}
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0xFF;
PORTA = 0x00;
while(1)
{
test ();
PORTA = 0xFF;
}
}
void test (void)
{
PORTA = 0x00;
}
Т.е. процессор входит в функцию и там и остается......
5. Что я делаю неправильно???
---- Ошибка в коде????
---- Ошибка в включении контроллера???
---- Или нужно цеплять кварц и настраивать фьюзы?
---- Возможно дело в фьюзах?
Подскажите куда копать?????