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

Простая вещь... Кто работал с mega64 подскажите.

Вопрос собственно в следующем.... Работаю в компиляторе IAR 4.02A.... Для меги 16 прекрасно работали такие команды как PORTC_Bit0, DDRC_Bit6 = 0x1; PINC_Bit6... В меге 64 эти команды тоже работают только для некоторых портов.... А для порта скажем F не работают.... Подскажите пожалуйста почему и что надо зделать что б они заработали?

Поделиться сообщением


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

Вопрос собственно в следующем.... Работаю в компиляторе IAR 4.02A.... Для меги 16 прекрасно работали такие команды как PORTC_Bit0, DDRC_Bit6 = 0x1; PINC_Bit6... В меге 64 эти команды тоже работают только для некоторых портов.... А для порта скажем F не работают.... Подскажите пожалуйста почему и что надо зделать что б они заработали?
Осмелюсь предположить, что порт F не влез в io address space, поэтому для него не работают команды cbi, sbi. Во избежание подобных сюрпризов можно приучить себя пользоваться конструкциями

PORTC &= ~(1<<0);
DDRC |= (1<<0)

а чтобы было совсем красиво, позволю себе привести здесь очень полезный файл имени Аскольда Волкова:

// *****************************************
// ****                                 ****
// ****    I/O bits altering macros     ****
// ****     Idea by Ascold Volkov       ****
// ****                                 ****
// *****************************************
#ifndef    ASCOLD_H__
#define    ASCOLD_H__
#ifdef    __IAR_SYSTEMS_ICC__

#if defined(AT91SAM7S64) || defined(AT91SAM7S128)
    #define _setL(port,bit)            do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)
    #define _setH(port,bit)            do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
    #define _clrL(port,bit)            do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
    #define _clrH(port,bit)            do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)
    #define _bitL(port,bit)            (!(AT91C_BASE_PIO##port##->PIO_PDSR & (1 << bit)))
    #define _bitH(port,bit)            ( AT91C_BASE_PIO##port##->PIO_PDSR & (1 << bit))
    #define _cpl(port,bit,val)        do { AT91C_BASE_PIO##port##->PIO_ODSR ^= (1<<bit); } while(0)
    #define _dir_out(port,bit,val)    do { AT91C_BASE_PIO##port##->PIO_OER = (1<<bit); } while(0)
    #define _dir_in(port,bit,val)    do { AT91C_BASE_PIO##port##->PIO_ODR = (1<<bit); } while(0)
#elif defined(LPC2119) || defined(LPC2129)
    #define _setL(port,bit)            do { IO##port##CLR = (1 << bit); } while(0)
    #define _setH(port,bit)            do { IO##port##SET = (1 << bit); } while(0)
    #define _clrL(port,bit)            do { IO##port##SET = (1 << bit); } while(0)
    #define _clrH(port,bit)            do { IO##port##CLR = (1 << bit); } while(0)
    #define _bitL(port,bit)            (!(IO##port##PIN & (1 << bit)))
    #define _bitH(port,bit)            ( IO##port##PIN & (1 << bit))
    #define _cpl(port,bit,val)        do { IO##port##PIN ^= (1 << bit); } while(0)
    #define _dir_out(port,bit,val)    do { IO##port##DIR |= (1 << bit); } while(0)
    #define _dir_in(port,bit,val)    do { IO##port##DIR &= ~(1 << bit); } while(0)
#elif defined(ADuC7020) || defined(ADuC7021)|| defined(ADuC7022)|| defined(ADuC7024)|| defined(ADuC7025)|| defined(ADuC7026)|| defined(ADuC7027)
    #define _setL(port,bit)            do { GP##port##CLR = (1 << (bit + 16)); } while(0)
    #define _setH(port,bit)            do { GP##port##SET = (1 << (bit + 16)); } while(0)
    #define _clrL(port,bit)            do { GP##port##SET = (1 << (bit + 16)); } while(0)
    #define _clrH(port,bit)            do { GP##port##CLR = (1 << (bit + 16)); } while(0)
    #define _bitL(port,bit)            (!(GP##port##DAT & (1 << bit)))
    #define _bitH(port,bit)            ( GP##port##DAT & (1 << bit))
    #define _cpl(port,bit,val)        do { GP##port##DAT ^= (1 << (bit + 16)); } while(0)
    #define _dir_out(port,bit,val)    do { GP##port##DAT |= (1 << (bit + 24)); } while(0)
    #define _dir_in(port,bit,val)    do { GP##port##DAT &= ~(1 << (bit + 24)); } while(0)
#else    // MSP430, AVR etc.
    #define _setL(port,bit)        do { port &= ~(1 << bit); } while(0)
    #define _setH(port,bit)        do { port |= (1 << bit); } while(0)
    #define _clrL(port,bit)        do { port |= (1 << bit); } while(0)
    #define _clrH(port,bit)        do { port &= ~(1 << bit); } while(0)
    #define _bitL(port,bit)        (!(port & (1 << bit)))
    #define _bitH(port,bit)        (port & (1 << bit))
    #define _cpl(port,bit,val)        do {port ^= (1 << bit); } while(0)
#endif

#define    dir_out(x)                _dir_out (x)
#define    dir_in(x)                _dir_in (x)

#define _set(port,bit,val)        _set##val(port,bit)
#define on(x)                    _set (x)

#define _clr(port,bit,val)        _clr##val(port,bit)
#define off(x)                    _clr (x)

#define _bit(port,bit,val)        _bit##val(port,bit)
#define signal(x)                _bit (x)

#define cpl(x)                    _cpl (x)

#endif    //    __IAR_SYSTEMS_ICC__
#endif    //    ASCOLD_H__

пример использования:

#define    LED            PORTC,2,H    // active high
#define    TEST        PORTD,3,L    // active low
#define    MANUAL_PROG        PINB,5,L

void main() {
    for(;;) {
        cpl(TEST);
        if(signal(MANUAL_PROG))
            on(LED);
        else
            off(LED);
    }
}

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

Поделиться сообщением


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

может режим совместимости с 103 включен и чать перефирии стала недоступной?

Поделиться сообщением


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

может режим совместимости с 103 включен и чать перефирии стала недоступной?

 

Подскажите пожалуйста что такое 103? И как его отключить(включить)?

 

 

Осмелюсь предположить, что порт F не влез в io address space, поэтому для него не работают команды cbi, sbi. Во избежание подобных сюрпризов можно приучить себя пользоваться конструкциями

PORTC &= ~(1<<0);
DDRC |= (1<<0)

а чтобы было совсем красиво, позволю себе привести здесь очень полезный файл имени

 

А как будет выглядеть такая конструкция для команды I = PINC_Bit2?

Поделиться сообщением


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

По умолчанию мега 64 прикидывается мегой 103. Чтобы сделать ее мегой 64 с активацией ряда функций присущих меге 64 надо подправить соответствующий фуз.

 

Бит проверить:

 

#define bit3 3

 

if((PINC & (1<<bit3)) == 0)

{

...

}

else

{

...

}

 

Или

#define bit3 (PINC & (1<<bit3))

Поделиться сообщением


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

Убрал бит M103C и все заработало.... Всем большле спасибо за помощь.... Во блин сколько подводных камней при переходе на конроллер с которым не разу не рабботал.... Сначала программатор не работал.... Потом этот бит M103C.... Я конечно понимаю что есть даташит и в нем все написанно... Но допустим таких проблем у меня не было при переходе с меги 8 на мегу 16.... То есть я хачу сказать что не изучать же весь даташит на новый конроллер (на котроллер с которым не разу не работал).... Учитывая что очень большой объем информации у всех даташитов одинаков.... Ну собствено спасибо.... Думаю что больше проблем не будет... Но если что я буду еще писать.... Хотя кто знает с какими (очевидными) подводными камнями мне еще предстоит столкнуться просьба написать об этом...

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...