реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Микроконтроллер сбрасывается..., Несоответствие между заголовочным файлом и Datasheet...
Freeze Anti
сообщение Dec 25 2007, 09:07
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



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

У меня к вам вот такой вопрос...

Я пишу программу для ATmega32... Пишу ее в WinAVR 20060421... Так вот...
После команды sei() у меня происходит сброс... Есть предположения, почему он происходит...

Я просмотрел заголовочный файл iom32.h и обнаружил небольшое несоответствие с даташитом... В общем... В заголовочном файле написано...

Код
/* ADC Conversion Complete */
#define ADC_vect            _VECTOR(16)
#define SIG_ADC                _VECTOR(16)


а читая даташит, я вижу...

Цитата
Table 18. Reset and interrupt vectors
Vector No. | Program address | Source | Interrupt definition
. . .
16 | $01E | USART, TXC | USART, Tx Complete
17 | $020 | ADC | ADC Conversion Complete
. . .


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

Спасибо за внимание...


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
VassiL
сообщение Dec 25 2007, 09:28
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 20-12-07
Из: Таганрог
Пользователь №: 33 471



Здравствуйте!
У меня проблема такого плана..
Начинаю постигать азы программирования на СИ под МК в среде AVR studio. Взял как простейший вариант ATtiny2313 и при использовании прерывания 16-тибитного таймера по переполнению происходит RESET МК, вместо перехода на соответствующий вектор прерывания.
Может кто сталкивался с такого рода проблеммой, помогите пожалуйста!
Go to the top of the page
 
+Quote Post
Freeze Anti
сообщение Dec 25 2007, 09:33
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Вот я о том же и говорю... Попробуйте в библиотеке найти вектора прерываний и задать их явно, не прибегая к услугам этой библиотеки... Я, к сожалению, смогу проверить свою догадку только завтра... О результатах незамедлительно сообщу...


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 25 2007, 09:56
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Freeze Anti @ Dec 25 2007, 12:07) *
Так вот... если я ошибаюсь, и моя ошибка не из-за этого - поправьте меня, пожалуйста... а если я не ошибаюсь, то хотел бы предложить создать топик, где описывались бы подобные ошибки... просто я захотел поделиться своим наблюдением... просмотрел поиск и не обнаружил ничего по этой теме...


Ошибки в зоголовочных файлах нет. Чтобы поправить вас нужно увидеть ваш код.


VassiL - тоже код, версию WinAVR и варинги компилятора.

Анатолий.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 25 2007, 10:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Freeze Anti @ Dec 25 2007, 12:07) *
Я просмотрел заголовочный файл iom32.h и обнаружил небольшое несоответствие с даташитом...
"Несоответствие" возникло из-за того, что некоторые считают вектора прерываний с единицы (как в даташите), а другие - с нуля (в заголовочном файле). Несоответствие - только в этом. Ошибка - в Вашей программе.
Go to the top of the page
 
+Quote Post
Freeze Anti
сообщение Dec 25 2007, 10:48
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Код
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>

. . .

unsigned short sCurrentTemp = 0;

INTERRUPT(SIG_ADC) //Обработчик прерывания от интегрированного АЦП
{
    unsigned int ADCData; //Буферная переменная для хранения
    ADCData = ADCW;         //результата преобразования
    sCurrentTemp = ADCData / 2;
    ADCSRA = ADCSRA | 0x40; //Устанавливаем разряд ADSC в регистре
                           //ADCSR, чтобы начать новое преобразование
}

. . .

void main(void)
{
    char sLogo1[] = {0x4F, 0x41, 0x4F, 0x20, 0x43, 0x48, 0xA8, 0xE1, 0x20, 0x50, 0x4F, 0x43, 0xE0, 0x4F, 0x50, 0x54, 0x45, 0x58, 0x00};
    char sLogo2[] = {0x4B, 0xB8, 0xAC, 0x20, 0x30, 0x2E, 0x31, 0x00};
    DDRB = 0xFF; //Выводы 0 - 6 порта B - выходы (передача данных и управляющие сигналы)
    InitLCD(); //Инициализируем ЖК-дисплей
    ClearLCD();
    ShowStr(sLogo1);
    GoToLine(2);
    ShowStr(sLogo2);
    DDRA = 0x00; //Все выводы порта A - входы
    DDRC = 0x00; //Все выводы порта C - входы
    ADMUX = 0xC0; //Назначаем в качестве аналогового входа PA0;
    ADCSRA = 0xEF; /*0b11101111 - активизируем АЦП с коэффициентом
                    деления 128, разрешаем прерывание от АЦП и
                    начинаем преобразование*/
    sei(); //Общее разрешение прерываний;
    _delay_ms(2000);
    while(1)
    {
        if (PINC & 0x02)
            Control();
        else
            if (PINA & 0x02)
                Set();
            else
                Measure();
    }
}


Вот... и после функции sei(); контроллер перезапускается... Посмотрел даташит и хедер... возможно, вы и правы... отсчет везде начинается с единицы, но только в хедере нет вектора RESET...


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Dec 25 2007, 11:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Freeze Anti - думаю что у вас есчё что-то вызывает интерупт - а так как гцц на всем неиспользованным векторам даёт ссылку на ресет - оттого у вас и сброс происходит.
Так что проверьте - нет ли у вас той картины что я обрисовал - ну очень похоже..
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 25 2007, 11:37
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



1- INTERRUPT(SIG_ADC)
Вам не нужен INTERRUPT(...) !!!! Точка. Вам нужен ISR(...). Теже будьте внимательны к предупреждениям компилятора. Вы не подключили хеадер где описан INTERRUPT(), но в любом случае он вам не нужен!!!

2. unsigned short sCurrentTemp = 0;
Переменая должна быть 'volatile'!!!

3. _delay_ms(2000);
Неверно. Прочитайте описание _delay_ms и _delay_us. Извините, но мне влом описывать эту ошибку раз в квартал.

Анатолий.

Сообщение отредактировал aesok - Dec 25 2007, 11:44
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Dec 25 2007, 11:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



А WDT случайно не включен фьюзом? И сбрасывается - в железе или в симуляторе?
ЗЫ Обработчик лучше определять как ISR(ADC_vect){...

Кстати unsigned int ADCData вообще не нужна и оптимизатор ее выбросит. Про volatile уже выше отметили.

Сообщение отредактировал Qwertty - Dec 25 2007, 11:49
Go to the top of the page
 
+Quote Post
VassiL
сообщение Dec 25 2007, 11:50
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 20-12-07
Из: Таганрог
Пользователь №: 33 471



Цитата(aesok @ Dec 25 2007, 12:56) *
Ошибки в зоголовочных файлах нет. Чтобы поправить вас нужно увидеть ваш код.
VassiL - тоже код, версию WinAVR и варинги компилятора.

Анатолий.


Хочу заставить моргать светодиод с помощью данного кода
используя прерывание
Версия WinAVR 20050214
Ставил версию 2007 года на другой машине - таже история.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define Freq 4000000

INTERRUPT(SIG_OVERFLOW1)
{
//Инициализируем счетный регистр значением 61630
TCNT1 = 0x10000 - (Freq / 1024);
PORTB ^= 0x01;
}

int main (void)
{
DDRB = 0x01; //Вывод 0 порта В - Выход
TCCR1A = 0; // T/C1 отсоеденен от вывода ОС1, режим ШИМ отключен
TCCR1B = 5; // Коэф. деления частоты системной синхронизации = 1024
TCNT1 = 0x10000 - (Freq / 1024); //Инициализируем счетный регистр
TIFR = 0; //Сбрасываем все флаги прерываний от T/C1
TIMSK = 0x80; //Разрешаем прерывание при переполнении T/C1
GIMSK = 0; //Запрет внешних прерываний
sei(); //Общее разрешение прерываний
while(1); //Ожидаем прерывания от T/C1 каждую секунду
}

После компиляции имеются варнинги:
c:/program files/win avr/bin/../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
../LEDBlink.c:10: warning: return type defaults to 'int'
../LEDBlink.c: In function 'INTERRUPT':
../LEDBlink.c:14: warning: control reaches end of non-void function
Build succeeded with 3 Warnings...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Dec 25 2007, 11:53
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(aesok @ Dec 25 2007, 14:37) *
3. _delay_ms(2000);
Неверно. Прочитайте описание _delay_ms и _delay_us. Извините, но мне влом описывать эту ошибку раз в квартал.
Анатолий.

А в чем ошибка? Например тактовая F_CPU 128Кгц, неужели _delay_ms(2000) будет работать как то не так?
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 25 2007, 11:55
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



1. Пост номер 8, ответ 1.

2. #define Freq 4000000
Длжно быть Freq 4000000UL


Анатолий.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Dec 25 2007, 11:56
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(VassiL @ Dec 25 2007, 14:50) *
Хочу заставить моргать светодиод с помощью данного кода
используя прерывание
Версия WinAVR 20050214
Ставил версию 2007 года на другой машине - таже история.

...

После компиляции имеются варнинги:
c:/program files/win avr/bin/../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
../LEDBlink.c:10: warning: return type defaults to 'int'
../LEDBlink.c: In function 'INTERRUPT':
../LEDBlink.c:14: warning: control reaches end of non-void function
Build succeeded with 3 Warnings...

Уберите #include <avr/signal.h>
Измените INTERRUPT(SIG_OVERFLOW1) на ISR(SIG_OVERFLOW1)
И варнинги исчезнут.

Сообщение отредактировал Qwertty - Dec 25 2007, 12:01
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 25 2007, 11:58
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Qwertty @ Dec 25 2007, 14:53) *
А в чем ошибка? Например тактовая F_CPU 128Кгц, неужели _delay_ms(2000) будет работать как то не так?


Извините. В этом случае будет.

Но тогда:

ADCSRA = 0xEF; /*0b11101111 - активизируем АЦП с коэффициентом
деления 128, разрешаем прерывание от АЦП и
начинаем преобразование*/

Частота работы ADC очень низкая = 1Кгц.

By default, the successive approximation circuitry requires an input clock frequency between 50
kHz and 200 kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the
input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate.

Анатолий.

Сообщение отредактировал aesok - Dec 25 2007, 12:04
Go to the top of the page
 
+Quote Post
Freeze Anti
сообщение Dec 25 2007, 12:23
Сообщение #15


Частый гость
**

Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613



Цитата(aesok @ Dec 25 2007, 14:55) *
2. #define Freq 4000000
Длжно быть Freq 4000000UL
Анатолий.


Это вообще то задается в Makefile... и тогда, действительно, UL не надо...

Цитата
И сбрасывается - в железе или в симуляторе?


Так в том и проблема, что сбрасывается в симуляторе... сам сначала на фьюзы грешил... сейчас поправлю в соответствии с замечаниями и проверю...

Сообщение отредактировал Freeze Anti - Dec 25 2007, 12:26


--------------------
!!! All you need is LOVE !!!
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01521 секунд с 7
ELECTRONIX ©2004-2016