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

 
 
 
Reply to this topicStart new topic
> Простая вещь... Кто работал с mega64 подскажите.
Potter
сообщение Oct 30 2006, 21:41
Сообщение #1


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

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



Вопрос собственно в следующем.... Работаю в компиляторе IAR 4.02A.... Для меги 16 прекрасно работали такие команды как PORTC_Bit0, DDRC_Bit6 = 0x1; PINC_Bit6... В меге 64 эти команды тоже работают только для некоторых портов.... А для порта скажем F не работают.... Подскажите пожалуйста почему и что надо зделать что б они заработали?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 30 2006, 22:24
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Potter @ Oct 31 2006, 00:41) *
Вопрос собственно в следующем.... Работаю в компиляторе 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);
    }
}
И пусть у компилятора голова болит о портах и размерах адресных пространств, а также какой уровень у меня обозначает "включено" - ноль или единица.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 31 2006, 02:40
Сообщение #3


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Potter
сообщение Oct 31 2006, 07:21
Сообщение #4


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

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



Цитата(arttab @ Oct 31 2006, 05:40) *
может режим совместимости с 103 включен и чать перефирии стала недоступной?


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


Цитата(Сергей Борщ @ Oct 31 2006, 01:24) *
Осмелюсь предположить, что порт F не влез в io address space, поэтому для него не работают команды cbi, sbi. Во избежание подобных сюрпризов можно приучить себя пользоваться конструкциями
Код
PORTC &= ~(1<<0);
DDRC |= (1<<0)
а чтобы было совсем красиво, позволю себе привести здесь очень полезный файл имени


А как будет выглядеть такая конструкция для команды I = PINC_Bit2?
Go to the top of the page
 
+Quote Post
vesago
сообщение Oct 31 2006, 07:22
Сообщение #5


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



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

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

#define bit3 3

if((PINC & (1<<bit3)) == 0)
{
...
}
else
{
...
}

Или
#define bit3 (PINC & (1<<bit3))
Go to the top of the page
 
+Quote Post
Potter
сообщение Oct 31 2006, 08:07
Сообщение #6


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

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



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

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

 


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


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