Отговори на тема  [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3
Въпрос от MikroC 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Nikola Kirov написа:
...
дефинираш си тип
typedef union
{
unsigned char byte;
struct
{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}bits;
} bitstr;

правиш си променлива
bitstr Variable

Variable.bits.b6 = 0; /// bit 6 = 0;
...


@Nikola, в момента точно това ме мъчи, как да Port1 да присвоява стойност от Variable....или с други думи
Код:
Variable.bits.b6 = 1
да ми вдигне в 1'ца Port1.6?


Съб Яну 21, 2006 1:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ами ако трябва да ползваш структурата

Variable.byte = Port; /// четеш порта
Variable.bits.b6 = 1; /// променяш бита
Port = Variable.byte /// Записваш в порта

Но обикновенно компилаторите имат дефинирани макроси за работа с битовете на порта и е по удобно с тях.


Съб Яну 21, 2006 2:34 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Това е ясно че ще заработи и първо то ми идва на ум, но съм сигурен че има някакъв начин чрез Variable да се подразбира Port, т.е. Variable.byte = 0xFF да е равнозначно с Port = 0xFF....прост пример, CCS C, библиотеката за LCD 16х2:
Код:
struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;

#byte lcd = 6    // ей тоя ред ми е големия проблем....
// и по нататък
lcd.data = 0хА; // работи като B4:B7=0xA....

Как става това на ANSI C?


Съб Яну 21, 2006 2:53 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
А това ли. Еи така
bitstr Variable @ Адреса на порта;

Така тоси union ще се намира физически на адреса на порта и няма да е нужно преди това да го четеш и след това да го пишеш
направо

Variable.bits.b6 = 1;
и компилатора ще прочете тоя адрес ще промени стоиноста и пак ще го запише там.
Само трябва да се разбереш так как стои въпроса с банките на Пиковете. Но пак виж в .h faila на компилатора трябва да имаш макроси или нещо друго за тая работа. В IAR просто си пиша
PORTA_PORTA6 = 1;


Съб Яну 21, 2006 3:05 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Въпроса ми е за KEIL 8051, обаче тоя знак "@" като че ли е нонсенс за него....


Съб Яну 21, 2006 3:22 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
В всички компилатори така се задава твърдо адреса на променливата.
Виж евентулано дали не е с
#pragma нещо си там
в IAR може да го направя и така

#pragma location = neobhodimiq adress
bitstr Variable


Съб Яну 21, 2006 3:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
@Nikola, благодаря много за помоща, в KEIL се оказа че това се прави с _at_:
Код:
volatile struct lcd_pin_map idata lcd  _at_ 0x90;    /* list at idata 0x90 */


Обаче тук идва един проблем който снощи до 5 часа така и не разбрах как да оправя - не мога да поместя bit променлива в struct/union, т.е.
Код:
struct lcd_pin_map {                 // This structure is overlayed
           char enable;           // on to an I/O port to gain
           char rs;               // access to the LCD pins.
           char rw;               // The bits are allocated from
           char unused;           // low order up.  ENABLE will
           char lcddata:4;         // be pin B0.
        };

се разполага на адреси 0x90,0x91,0x92,0x93,0x94... Нямам навика да използвам такива "извратени" методи за адресиране на порт чрез структура, но вече го видях работещо и сън не ме хваща докато не разбера как става

PS. съжалявам че малко излязох от темата :wink:


Съб Яну 21, 2006 5:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
struct lcd_pin_map { // This structure is overlayed
char enable:1; // on to an I/O port to gain
char rs:1; // access to the LCD pins.
char rw:1; // The bits are allocated from
char unused:1; // low order up. ENABLE will
char lcddata:4; // be pin B0.
};
така става в един баит


Съб Яну 21, 2006 6:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Наложи ми се да напиша една дребна програмка за една 12ка а се оказа че MPLAB IDE нещо се е осрала и без да я ползвам само от стоене и нещо връзката с HiTech не работи и рекох да го пробвам това MicroC.
Ами загубих близо час да го разгадавам къде какво има.
Значи това е компилатор за съвсем начинаещи. Става за запознаване с това какво е процесор и какво е C но не и за сериозно хора. Явно такава му е насоченоста. Така че ако някои сега започва това е компилатора за него не съм виждал толкова добре направен потребителски интерфеис и хелпове.
Но за малко по напреднали които си вадят хляба с програмиране не става.
Сигурно и почече от час може би загубих за тоя дето духа. А ми хареса интерфеиса.


Съб Яну 28, 2006 2:04 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Сеп 25, 2004 4:33 pm
Мнения: 273
Местоположение: София
Мнение 
Не разбирам защо се приема, че колкото по-трудно е програмирането, толкова по-професионално е то.
Защо да се глезим със С като може и на Асемблер?

_________________
Adios
Mozfet


Съб Яну 28, 2006 7:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Защото ми изгенерира с 20 процената по дълъг код от IAR.
Да не говорим че явно създателите му не мислят че h фаиловете са нещо важно в C to и не можеш да ги слагаш в проекта.
Като гледам организацията на всичко е мисленоче си правиш програмката в един C фаил. Нямаш генерация на coff фаил също. Нямаш настоика за начина и нивото на оптимизиция,предполагам че такава отсъства като гледам колко ми набъбна една дребна програмка за 12ка.
И още куп дразнещи неща ама не ми се занимава нито да пиша нито да споря. Който е трябвало да разбере е разбрал които не е времето си е негово и може сам да решава как да си го губи.
А за начинаещите си е супер компилатора,препоръчвам го.


Съб Яну 28, 2006 7:25 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни