роботы робототехника микроконтроллеры


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

> Без описания
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Извините. Имеем примерно так
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'ов как-то мучительно, да и не правильно.
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



Попробуй так:
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;}
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



он не дает мне первую строчку выполнить, хотя это адрес начала блока регистров.
не могу перевести char[63] в char , говорит.
(Добавление)
Нужно чтоб
Registers[0x12]=5; /*адрес порт Д*/
и
PORT=5;
выполняли одно и тоже
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



CODE:

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

Не?

(Отредактировано автором: 15 Апреля, 2013 - 20:01:55)

 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Решено, но без изящества
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 не важно, я как раз и хочу сделать так чтоб больше никогда не переделывать эту функцию

Всем спасибо за внимание Голливудская улыбка
 
 Top
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



Только я не понял зачем же нужно из языка высокого уровня опускаться до регистров.
Для этого есть ассемблер.
Объясни если не трудно.

----
The main function of the three electrod tubes is amplifications!!!
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



Странный вопрос. Программа на с лазает в регистры. В чем проблема?
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Можно и на ассемблере,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;

Ну вдруг нужно мне будет счетчики поменять на "горячую" или еще что?
(Добавление)
Да еще и для каждого МК свое, потому что имена регистров не всегда совпадают.
 
 Top
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



Всё это можно сделать гораздо проще.
Каждый регистр имеет свой адрес.
Разыменуйте этот адрес - и всё.

--------
The main function of the three electrod tube is amplification!!!
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru