|
Микроконтроллер сбрасывается..., Несоответствие между заголовочным файлом и Datasheet... |
|
|
|
Dec 25 2007, 09:07
|

Частый гость
 
Группа: Новичок
Сообщений: 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 !!!
|
|
|
|
|
Dec 25 2007, 09:56
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

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

Частый гость
 
Группа: Новичок
Сообщений: 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 !!!
|
|
|
|
|
Dec 25 2007, 11:50
|

Участник

Группа: Участник
Сообщений: 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...
|
|
|
|
|
Dec 25 2007, 11:53
|
Местный
  
Группа: Свой
Сообщений: 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) будет работать как то не так?
|
|
|
|
|
Dec 25 2007, 11:56
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 25 2007, 11:58
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 25 2007, 12:23
|

Частый гость
 
Группа: Новичок
Сообщений: 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 !!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|