Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » прямой доступ к регистрам из Си

Страниц (1): [1]
 

1. cjA - 15 Апреля, 2013 - 16:46:33 - перейти к сообщению
Извините. Имеем примерно так
CODE:

unsigned char Registers[0x3F] = 0x20;
.
.
/* это съедает */
case RQ_SET_DDRD:DDRB=rq->wValue.bytes[0];return 0;
case RQ_SET_PORTB:PORTB=rq->wValue.bytes[0];return 0;
.
/* а это нет */
case RQ_GET_REGISTR: dataBuffer[0]=Registers[ rq->wValue.bytes[0] ]; return 1;
case RQ_SET_REGISTR: Registers[ rq->wValue.bytes[0] ]=rq->wValue.bytes[1]; return 0;
.
.

Не хочет собирать. Как мне разместить этот массив по адресу регистров? А то писать 128 case'ов как-то мучительно, да и не правильно.
2. Роботов - 15 Апреля, 2013 - 17:21:16 - перейти к сообщению
Попробуй так:
CODE:

/* а это нет */
case RQ_GET_REGISTR: {dataBuffer[0]=Registers[ rq->wValue.bytes[0] ]; return 1;}
case RQ_SET_REGISTR: {Registers[ rq->wValue.bytes[0] ]=rq->wValue.bytes[1]; return 0;}
3. cjA - 15 Апреля, 2013 - 17:43:23 - перейти к сообщению
он не дает мне первую строчку выполнить, хотя это адрес начала блока регистров.
не могу перевести char[63] в char , говорит.
(Добавление)
Нужно чтоб
Registers[0x12]=5; /*адрес порт Д*/
и
PORT=5;
выполняли одно и тоже
4. elmot - 15 Апреля, 2013 - 20:01:40 - перейти к сообщению
CODE:

unsigned char Registers[] = (unsigned char*)0x20;

Не?
5. cjA - 17 Апреля, 2013 - 13:54:08 - перейти к сообщению
Решено, но без изящества
CODE:

#include <avr/io.h>
#define Registers(reg_num) _SRF_IO8(reg_num)
void main(void)
{
/*
#define DDRB _SFR_IO8(0x17)
определено где-то в avr/io.h
*/
char d;
/*Вот это компилется*/
d= DDRB;
DDRB= d;
d=_SFR_IO8(0x17);
_SFR_IO8(0x17)=d;
/*Это тоже компилется*/
d= Registers (0x17);

/*А вот это не компилется, пишет
" lvalue required as left operand of assignment "*/
//Registers (0x17)=d;
}//end main


Ну да и ладно, что там внутри usbFunctionSetup не важно, я как раз и хочу сделать так чтоб больше никогда не переделывать эту функцию

Всем спасибо за внимание Голливудская улыбка
6. vik49 - 17 Апреля, 2013 - 21:06:45 - перейти к сообщению
Только я не понял зачем же нужно из языка высокого уровня опускаться до регистров.
Для этого есть ассемблер.
Объясни если не трудно.

----
The main function of the three electrod tubes is amplifications!!!
7. elmot - 17 Апреля, 2013 - 21:08:18 - перейти к сообщению
Странный вопрос. Программа на с лазает в регистры. В чем проблема?
8. cjA - 18 Апреля, 2013 - 00:13:09 - перейти к сообщению
Можно и на ассемблере,vik49
CODE:

//Вместо 64 вот таких строчек
case RQ_GET_DDRC: rq->wValue.bytes[0]=DDRB; return 1;
case RQ_SET_DDRC: DDRB=rq->wValue.bytes[0]; return 0;
//достаточно вставить две таких
case RQ_GET_REGISTR: dataBuffer[0]=_SFR_IO8(rq->wValue.bytes[0]); return 1;
case RQ_SET_REGISTR: _SFR_IO8( rq->wValue.bytes[0]) = rq->wValue.bytes[1]; return 0;

Ну вдруг нужно мне будет счетчики поменять на "горячую" или еще что?
(Добавление)
Да еще и для каждого МК свое, потому что имена регистров не всегда совпадают.
9. vik49 - 19 Апреля, 2013 - 15:29:02 - перейти к сообщению
Всё это можно сделать гораздо проще.
Каждый регистр имеет свой адрес.
Разыменуйте этот адрес - и всё.

--------
The main function of the three electrod tube is amplification!!!