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

 
 
> проблемы с программировоние ATMega 1280, CodeVision не обращается к портам с G по L
morpheus
сообщение Oct 10 2008, 10:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 7-09-06
Пользователь №: 20 173



ДОброго всем времени суток
есть mega1280 и компилятор CodeVision 1.25.8 prof при попытке считаь пин на портах с G по L
if (PINL.2==0 или PORTL.2) выдает ошибку он это видит как структуру. Хотя на более младших портах все работает. Подскажите пожалеста в чем проблема
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
SasaVitebsk
сообщение Oct 10 2008, 11:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(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>

Вот там и прописаны ваши порты.
Возьмите и, согласно даташита, поправьте данный файл
Go to the top of the page
 
+Quote Post
Petka
сообщение Oct 10 2008, 12:27
Сообщение #3


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(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го бита).
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Oct 10 2008, 12:49
Сообщение #4


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 10 2008, 13:09
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Ещё следует помнить о том, что при использовании структур,
объединяющих в себе регистры PORTX,DDRX и PINX, могут быть проблемы
из-за того, что не всегда эти регистры располагаются друг за другом в адресном пространстве.
Пример - PINF для Mega128.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 10 2008, 17:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Аааа.. Вот как дела значат абстоят.
Значит 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
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:27
Рейтинг@Mail.ru


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