Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблемы с программировоние ATMega 1280
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
morpheus
ДОброго всем времени суток
есть mega1280 и компилятор CodeVision 1.25.8 prof при попытке считаь пин на портах с G по L
if (PINL.2==0 или PORTL.2) выдает ошибку он это видит как структуру. Хотя на более младших портах все работает. Подскажите пожалеста в чем проблема
SasaVitebsk
Цитата(morpheus @ Oct 10 2008, 13:56) *
ДОброго всем времени суток
есть mega1280 и компилятор CodeVision 1.25.8 prof при попытке считаь пин на портах с G по L
if (PINL.2==0 или PORTL.2) выдает ошибку он это видит как структуру. Хотя на более младших портах все работает. Подскажите пожалеста в чем проблема

Надо понимать, что компилятор вообще ничего не хочет знать. smile.gif
Гдето вы подключаете файл описаний данной мк.
По типу
#include <iom1280.h>

Вот там и прописаны ваши порты.
Возьмите и, согласно даташита, поправьте данный файл
Petka
Цитата(morpheus @ Oct 10 2008, 14:56) *
ДОброго всем времени суток
есть mega1280 и компилятор CodeVision 1.25.8 prof при попытке считаь пин на портах с G по L
if (PINL.2==0 или PORTL.2) выдает ошибку он это видит как структуру. Хотя на более младших портах все работает. Подскажите пожалеста в чем проблема


Есть в АВР специальные команды доступа непосредственно к биту.
Когда Вы пишите что-то типа PIND.3 (PORTD.2) компилятор использует эти команды. Так вот в некоторых АВРках для старших портов отсутствуют такие команды. И к ним следует обращаться примерно так: "((PING>>3)&1)" и "PORTL|=1<<2" (для установки 2го бита) "PORTL&=~(1<<2)" (для сброса 2го бита).
mempfis_
Цитата(morpheus @ Oct 10 2008, 14:56) *
ДОброго всем времени суток
есть mega1280 и компилятор CodeVision 1.25.8 prof при попытке считаь пин на портах с G по L
if (PINL.2==0 или PORTL.2) выдает ошибку он это видит как структуру. Хотя на более младших портах все работает. Подскажите пожалеста в чем проблема


Думаю правильнее было-бы написать if (PINL.2) но для этих портов такая запись в CVAVR всёравно не прокатит. Эти порты лежат не пространстве памяти I/O, а в области оперативной памяти и доступ к ним необходимо осуществлять по-другому:
if (PINL&(1<<2)) //проверка пина PINL.2
PORTL |= (1<<2) //установить PORTL.2

Записи типа if(PINx.y) допустима для портов только их пространства памяти I/O к которым применимы команды SBIS/SBIC для проверки-пропуска, SBI/CBI для установки/ сброса отдельных битов. Те которые лежат в оперативной памяти должны быть сначала загружены в регистр командой LDS где они могут быть проверены с помощью команд SBRS/SBRC. Для установки бита также необходимо их сначала загрузить (LDS) установить/сбросить бит (SBR/CBR) и занести новое значение в порт (STS). Вот собственно поэтому у меня когдато ругался компилятор на эти записи для портов F, G, H

Пока писал Petka опередил меня smile.gif
demiurg_spb
Ещё следует помнить о том, что при использовании структур,
объединяющих в себе регистры PORTX,DDRX и PINX, могут быть проблемы
из-за того, что не всегда эти регистры располагаются друг за другом в адресном пространстве.
Пример - PINF для Mega128.
SasaVitebsk
Аааа.. Вот как дела значат абстоят.
Значит 100 раз прав оказался компилятор IAR, который требует ко всем портам такого обращения. smile.gif

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

Вот объявления
Код
#define    OW_DQ            0                            // Шина данных для 1-wire устройств
#define    OW_PIN            PINB
#define    OW_DDR            DDRB
#define    OW_PORT            PORTB

#define    OW_PORT_SET        OW_PORT |=    (1<<OW_DQ)
#define    OW_PORT_CLR        OW_PORT &= ~(1<<OW_DQ)
#define    OW_DDR_SET        OW_DDR  |=    (1<<OW_DQ)
#define    OW_DDR_CLR        OW_DDR  &= ~(1<<OW_DQ)


А вот пример компиляции
Код
          uint8_t    OW_reset(void)
   \                     OW_reset:
     44          {
   \   00000000   938A               ST      -Y, R24
     45            uint8_t answer;
     46            
     47            OW_PORT_SET;                                    // Обеспечить питанием для двух проводного варианта
   \   00000002   9A28               SBI     0x05, 0x00
     48            OW_DDR_SET;                                    // На вывод
   \   00000004   9A20               SBI     0x04, 0x00
     49            DelayMs(10);                                    // 10 ms
   \   00000006   E00A               LDI     R16, 10
   \   00000008   ....               RCALL   DelayMs
     50            
     51            OW_PORT_CLR;                                    // Reset
   \   0000000A   9828               CBI     0x05, 0x00
     52            DelayMks(510);                                // 510 us
   \   0000000C   EF0E               LDI     R16, 254
   \   0000000E   E011               LDI     R17, 1
   \   00000010   ....               RCALL   DelayMks
     53          
     54            OW_DDR_CLR;                                    // Освободить шину
   \   00000012   9820               CBI     0x04, 0x00
     55            OW_PORT_SET;                                    // Подпорка
   \   00000014   9A28               SBI     0x05, 0x00
     56            DelayMks(90);                                    // ~90us
   \   00000016   E50A               LDI     R16, 90
   \   00000018   E010               LDI     R17, 0
   \   0000001A   ....               RCALL   DelayMks
     57          
     58            answer = ((OW_PIN & (1<<OW_DQ))!=0);
   \   0000001C   E080               LDI     R24, 0
   \   0000001E   9918               SBIC    0x03, 0x00
   \   00000020   E081               LDI     R24, 1
     59            DelayMks(400);                                 // ~420us для завершения цикла
   \                     ??OW_reset_0:
   \   00000022   E900               LDI     R16, 144
   \   00000024   E011               LDI     R17, 1
   \   00000026   ....               RCALL   DelayMks
     60            OW_DDR_SET;                                    // На вывод
   \   00000028   9A20               SBI     0x04, 0x00
     61            return (answer);                                // 0-есть устройства, 1-нет устройств
   \   0000002A   2F08               MOV     R16, R24
   \   0000002C   9189               LD      R24, Y+
   \   0000002E   9508               RET
   \   00000030                      REQUIRE _A_PORTB
   \   00000030                      REQUIRE _A_DDRB
   \   00000030                      REQUIRE _A_PINB
     62           }
     63
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.