Свежие обсуждения
Микроконтроллеры

Как в Си прочесть байт с ног AT97SAM7S64 и записать и записать его туда?

1 2

Добрый день! Осваиваю контроллер и Си. Никак не могу врубиться для чего маска и можно ли из нее собать что-то на подобии байта в который и пихать свой байт.

Для чего мне это надо. Например

PA0, PA1, PA5, PA7 .... задействованы под ЖК. Им надо управлять.

Хочется сделать что-то вроде
.... определили PA-концы ....
byte LCD = {PA0, PA1, PA5, PA7...}; //собрали байт, ссылающийся на эти концы

LCD = b1011; //пихаем число записанное в тексте как бинарное (тоже вопрос как это сделать!)

лучше, если это будет не байт. А произвольное количество ног.

Что значит такая конструкция?:
pSSC->SSC_CR = AT91C_SSC_TXEN;
не важно что тут за переменный. Просто вот эти вещи не понятны .... -> .... = .....;

P.S: не могу найти справк в. Keil mVision по СИ. Вот в PicC была... Кто знает где ее искать?

 

Последнее - работа с указателями. Значение справа от знака (=) записываем в поле структуры, адрес которой берется из pSSC. В ATMega этой конструкции примерно соответствует код:

lds r28,pSSC
lds r29,pSSC+1
std Y+SSC_CR,<значение из правой части>

Первый вопрос не совсем понял. Хочется записать что-то наподобие PORTB = 2, и эта двойка попала бы, к примеру, в старшую тетраду? Если суть в этом, в С есть описание битовых переменных. Делается оно так:

struct {char field1 : 2;
char field2 : 3;
char field3 : 3;
} x; // Вся эта структура имеет длину 1 байт (2 бита + 3 бита + 3 бита)

x.field1 = 1; // Записываем код 01 в два старших бита байта.
x.field2 = 3; // Записываем код 011 в три "средних" бита байта.
x.field3 = 6; // Записываем код 110 в три младших бита байта.

При выполнении этих присваиваний остальные биты байта НЕ изменяются. В реале все эти присваивания компилируются в and, lsl/lsr и прочий геморрой, но программеру эта кухня не видна.

 

Ну про первый вопрос попробую понятней.

У меня к контроллеру подключен ЖК-дисплей. Он соединен с разными ногами контроллера. Например, DB0 ЖК с PA5 МК, DB1 с PA8, DB2 с PA12 и.т.д (ну такая дурацкая распайка получилась).

Мне надо написать процедуру инициализации дисплея, при том хочется в удобной форме.

В PIC C для PIC-ов я мог создать, например, свой байт из ссылок на биты регистра PORTA или PORTB. При этом порядок битов в байте был бы таким, какой я хочу. А дальше в этот байт прописать число в 16-иричном формате. И вся эта кухня расходилась в результате на нужные пины контроллера.
Соотвественно, и тут я хочу сделать то же.

И вот в вашей структуре мне не понятно следующее:
1. char - это символ? В Visual Basic это символ. Т.е. A, B, C, D.... А мне нужен бит. Но почему-то при попытке определить поле как символ компилятор говорит что понятия byte или bit не существует

2. А как мне записать такое:
struct {
bit DB0; // записать как ссылку на ногу PA5
bit DB1; // ссылка на PA8
bit DB2; // PA12
...
bit DB7; // ссылка на ногу
} x;

а в коде x = 9D9D; (а лучше вообще x=1001110110011101)

РЕЗЮМЕ: То есть я хочу одной строкой задавать значения выбранных мной ног И при этом желательно в бинарной форме

 

И что такое всетаки эта маска? Это очень похоже на то, что я хочу

 

Идея понятна, но, боюсь, что так сделать не получится - в стандарте С такой фишки совершенно точно нет, это явно изобретение разработчиков компилятора для PIC-ов (хотя довольно удобное ). То, что я написал раньше, предназначено для в точности обратной задачи - разобрать байт на биты, а не собирать его из битов. Подождите, может быть еще кто из участников откликнется В крайнем случае напишите пару функций типа writeLCD/readLCD

 

А может как-то можно написать такую функцию чтобы назначала ссылки на пины? Только как ума не приложу! Си я пока совсем не знаю!

 

mrengineer
Си я пока совсем не знаю!
- Поэтому начинать надо с изучения Си, например, по книге Кернигана и Ричи. Это спасет Вас от необходимости задавать ещё сотни вопросов на форумах : - ) (нет, конечно у Си для микроконтроллеров есть своя специфика, но она не так велика, как кажется некоторым). Извиняюсь за лирику, но уверен, что это самый правильный ответ.

 

Вот тут с этой маской

Вот описывается в .с файле маска
const int lcd_mask[] = {A0,RW,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0};

В процедуре main стоит
// Configure the PIO Lines corresponding to LCD as Outputs
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LCD_MASK);

Это типа назначение что все, что в маске записано, будет работать на выход (пины на выход)

Далее фигурирует функция
// Set all pins of lcd OFF
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LCD_MASK);

Она все пины в маске сбрасывает в 0

В файле board.h (описывает мою мезонитную плату) имеется
// ------------------ LCD display MT-10S1 --------------------------- //
#define DB0 (1<<0) // PA0 / PGMEN0 & PWM0 TIOA0 48
#define DB1 (1<<1) // PA1 / PGMEN1 & PWM1 TIOB0 47
#define DB2 (1<<2) // PA2 & PWM2 SCK0 44
#define DB3 (1<<3) // PA3 & TWD NPCS3 43
#define A0 (1<<4) // PA4
#define RW (1<<5) // PA5
#define E (1<<6) // PA6
#define DB7 (1<<7) // PA7
#define DB6 (1<<8) // PA8
#define DB5 (1<<9) // PA9
#define DB4 (1<<10) // PA10

#define LCD_MASK (A0|RW|DB7|DB6|DB5|DB4|DB3|DB2|DB1|DB0)
и успешно работает

А вот сами функции
__inline void AT91F_PIO_CfgOutput(
AT91PS_PIO pPio, // \arg pointer to a PIO controller
unsigned int pioEnable) // \arg PIO to be enabled
{
pPio->PIO_PER = pioEnable; // Set in PIO mode
pPio->PIO_OER = pioEnable; // Configure in Output
}

__inline void AT91F_PIO_ClearOutput(
AT91PS_PIO pPio, // \arg pointer to a PIO controller
unsigned int flag) // \arg output to be cleared
{
pPio->PIO_CODR = flag;
}

-----------------------------------------------------------------------------------------------
Что означает __inline ?
Реально ли из этого всего сварганить указанные выше writeLCD/readLCD?

 

caddr: согласен Может, подскажете где качнуть? А вообще раньше от таких вопросов меня спасал хелп по языку в PIC C, но в keil его попросту нет

 

Тоесть получается, что маска - это и есть набор сслылок на нужные пины. Но есть только две функции которые ставят сразу всем эти пинам в маске 0 или 1 И функция указания направления ввода/вывода пинов в маске А функции чтобы назначать пинам в маске произвольные значения не существует Но есть надежда что кто-то подскажет как ее сделать.