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

 
 
> WinAVR&AVR studio, Подскажите кто знает !
URANst
сообщение Nov 9 2007, 08:49
Сообщение #1


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Уважаемые ЗНАЮЩИЕ подскажите плиз что за хрень:
Работаю в связке WinAVR-20070525 и AVR studio version 4.13 build 528. Написал программку :

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned char i;
unsigned char mas[100];

interrupt(SIG_INPUT_CAPTURE1)
{
TCNT1H=0x00;
TCNT1L=0x00;
mas[i+1]=ICR1L;
mas[i]=ICR1H;
mas[i+2]=((TCCR1B>>6)&1);
i=i+3;
TCCR1B^=0x40;
}
INTERRUPT(SIG_OVERFLOW1)
{
if ((i<100) && (i!=0)) {
mas[i]=0xFF;
mas[i+1]=0xFF;
i=i+2;
}
}

void main (void)
{
DDRD=0x00;
PORTD=0x00;
TCCR1A=0x00;
TIMSK=0b00100100;
TCCR1B=0b01000001;
sei();
while(1){
};
}

Компилируется вроде все ОК. При загрузке ее в AVRStudio выполнение начинается с строки находящейся выше на одну чем void main (void) , а в цикл while(1); вообще не входит – это первое. Второе – если INTERRUPT написать в двух функциях заглавными буквами возникает ошибка при компиляции.
Мои предположения – глючные WinAVR или AVRStudio, но не факт. Что ВЫ посоветуете мне по этому поводу.
Прикрепленные файлы
Прикрепленный файл  ris.rar ( 64.8 килобайт ) Кол-во скачиваний: 18
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Kuzmi4
сообщение Nov 9 2007, 09:30
Сообщение #2


Гуру
******

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



2 URANst - проверьте на 2006-м винавре - для 2006-го программа вроде нормальная...
я вообсче то вместо интерупта пишу - SIGNAL - а там уже в нём запресчаю прерывания или нет...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Nov 9 2007, 09:32
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



А так?
ISR(SIG_OVERFLOW1){
...
}


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
URANst
сообщение Nov 9 2007, 10:01
Сообщение #4


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

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Kuzmi4 Вы были правы. В 2006 Win AVR написал вместо INTERRUPT - SIGNAL и все пошло. Но даже в 2006 с INTERRUPT какие то глюки.

И еще я правильно понял - при входе в INTERRUPT общее запрещение прерывания не устанавливается(тобиш нужно если надо самому запрещать), при входе в SIGNAL автоматом выполняется CLI(); а при выходе SEI(); ???
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Nov 9 2007, 10:13
Сообщение #5


Гуру
******

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



В GCC есть SIGNAL () и INTERRUPT().
Разница между ними в наличии команды sei() в INTERRUPT().
(avr/interrupt.h)
Вот полезная сцЫлочка -
http://winavr.scienceprog.com/avr-gcc-tuto...ing-winavr.html
Go to the top of the page
 
+Quote Post
swisst
сообщение Nov 9 2007, 12:24
Сообщение #6


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

Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425



Так попробуйте...

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


unsigned char i;
unsigned char mas[100];

ISR(TIMER1_CAPT_vect){

    TCNT1H=0x00;
    TCNT1L=0x00;
    mas[i+1]=ICR1L;
    mas[i]=ICR1H;
    mas[i+2]=((TCCR1B>>6)&1);
    i=i+3;
    TCCR1B^=0x40;
}

ISR (TIMER1_OVF_vect){

    if ((i<100) && (i!=0)) {
        mas[i]=0xFF;
        mas[i+1]=0xFF;
        i=i+2;
    }
}

int main (void)
{
    cli();
    DDRD=0x00;
    PORTD=0x00;
    TCCR1A=0x00;
    [b]TIMSK1=0b00100100;[/b]
    TCCR1B=0b01000001;
    sei();
    while(1){
        DDRD=0x00;
        PORTD=0x00;

    };
    return 0;
}



А что до обработки прерываний - почитайте док avr-libc-user-manual-1.4.4.pdf там расписаны все вектора прерываний+есть примеры...

В жирной строке у Вас - м, должно быть, судя по всему - TIMSK
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:09
Рейтинг@Mail.ru


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