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

Atmega32 В Atmel Studio 6


MIG29

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

Привет, помогите разобраться с программой.

В программе 16-ти битный таймер микроконтроллера при переполнении увеличивает значение переменной. Если это значение превысит допустимое то мк должен "простаивать" пока не будет получен сигнал лог1 на определенную ногу.

Имеется датчик, который время от времени посылает сигнал лог1. В Atmel Studio все работает правильно. Но когда закидываю в микросхему то происходит не так как при отладке. А именно ведёт себя так, будто никакого таймера нет и счёт не начинался, соответственно устройсво не "уходит в сон".

/*
* Led_control.cpp
*
* Created: 26.07.2014 17:40:33
* Author: World-12
*/
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

int Delay1;
//unsigned short int LedNum;

void init ()//Загрузка портов
{
sei(); //Разрешение глобальных прерываний , флаг I
DDRD = 0b00111111;//Port D and A to output
DDRA = 0b01111111;
PORTD = 0b00000001;
PORTA = 0b00000001;
//PORTB = 0b00000100;//Подтягивающий резистор на PORTB.2
//INT2
GICR = 0b00100000;//Разрешение прерывания по INT0 - INT2.
MCUCSR = 0b01000000;// Прерывание по rising
//GIFR Это флаги возникших прерываний INTF0 - INTF2. При входе в вектор прерывания они сбрасываются.
//MCUCSR = 0b01000000; // Формировать прерывание при смене с лог1 на лог0.]
//TIMER
TCCR1B = 0b00000101;// Предделитель 1024
TIMSK = 0b00000100;// Разрешить прерывание для OverFlow Timer 1
}

ISR(TIMER1_OVF_vect)
{
/* 65535 Циклов у 16-ти битного счетчика, c предделителем 67107840
8,38848 с можно получить за один цикл с предделителем 1024*/
Delay1 ++;
_delay_us(10);
//Пример округления. float round (float x);
}

ISR (INT2_vect)
{
Delay1 = 0;
PORTA = 0b00000001;
PORTD = 0b00000001;
}

void working()
{
PORTD <<= 1;

if( PORTD & 0b01000000 )
{ PORTA <<= 1;
PORTD = 0b00000001; }

if(PORTA & 0b10000000)
{ PORTA = 0b00000001; }
}

int main()
{
init();//Один раз инициализируемся
while(1) {


while(Delay1 < 2)
{ working();
_delay_us(111);

}

PORTA = 0x00;
PORTD = 0x00;
_delay_ms(1000);

}
}

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

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

FUSE CKSEL 0...3 выставлены в 0100, для получения 8Мгц внутренний источник. Библиотека delay.h работает нормально.

Пробовал на 2х микросхемах atmega32 с помощью Usbasp - программатора.

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

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

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

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

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

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

Я убрал из кода разрешение прерывания по INT 2 и это помогло, таймер выполнил нужную функцию. Значит проблема в том что на ногу поступает лог1?

Но как это возможно, если у меня в схеме ножка МК вобще не была подключена ни к чему.?

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

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

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

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

Кажется понял, подключил датчик к ноге INT 2 (до этого я не подключал , хотел убедиться как таймер работает и это получилась проблема).

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

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

Когда на ногу ничего не цепляешь то ее нужно все равно "подтянуть" или "стянуть"?
Да, поскольку в режиме входа сопротивление у выводов контроллера высокое и на него наводится любая помеха. Проще подтягивать к "+", выставив DDRx=0; PORTx=1;, то есть использовав внутреннюю подтяжку. Преимущество внешних прерываний INTx в том, что могут срабатывать как по высокому уровню, так и по низкому.
Народ, что я наделал? Теперь при создании переменной она размещается в области "prog". Память для программы?
Судя по представленному куску кода все нормально. Для проверки можно попробовать посмотреть указатель на эту переменную

int Line;
int *p=&line;
PORTA=(char)(p>>8);
PORTB=(char)p;

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

COKPOWEHEU,

Я заметил что в настройках toolchain стоит Atmel AVR 32 bit ©

Пробовал менять, но смена тулчейна не сохраняется... зачем тогда эти наборы?

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

Я понял)) Так как переменные нигде не использовались в коде компилятор посчитал нужным разместить их в програмной части памяти... Вот блин(( еще одна надуманная мной проблема без повода...

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

Как сделать чтобы можно было обращаться к массиву :

SomeVar = SomeArray[Var];

Тоесть вместо номера элемента - переменная с определенным значением, когда планировал, то думал что в С++ будет такая возможность.

Или даже целое выражение:

SomeVar = Array[Var1 + Var2];

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

Вот схема, atmega подает сигналы на базы одной пары транзисторов (один из Q1 - Q7 и один из Q8 - Q13), таким образом быстро меняя пары транзисторов зажигаются все 42 диода с большой частотой. В каждый момент вычисляется номер диода и управляющая ШИМ нога посылает на базу Q14 сигналы нужной длины.

Формируется определенное изображение матрицы.

Но если управляющей ноге нужно формировать сигналы длительностью около 0, то диоды все равно не гаснут полностью... Думаю что это ток "база - эммитер" с транзисторов Q1 - Q7 проходит по светодиодам к коллекторам Q8 - Q13.

Это не окончательная схема, еще хотел подключать двоично-десятичные дешифраторы.

Что можно придумать с этим ?

post-182324-0-60165800-1407666607_thumb.jpg

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

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

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

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

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

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

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

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

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

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

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