протеус на мыло[/uquote]Прекрасно в протеусе работает.
Спойлер


Я не специалист в CVAVR, но это не похоже на правду.sergejjj123 писал(а):Если записать так PORTD = masiv[*p] то запишется 1 в PD.1
А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
Ещё раз,резюмируя. Проще всего это сделать так:sergejjj123 писал(а):Как в массиве с помощью указателя вытащить с 0-го индекса значение?
Я не специалист в CVAVR, но это не похоже на правду.sergejjj123 писал(а):Если записать так PORTD = masiv[*p] то запишется 1 в PD.1
А чтобы зажечь PD.0 надо изголиться - PORTD = masiv[*p-1]
может быть, наоборот - регистр в переменную? я так вангую, вы хотите свою функцию set_port использовать как-то такrvk писал(а):А как же тогда заставить codevision запихать переменную в регистр?
Код: Выделить всё
set_port(&PORTB, 3); // устанавливаем 3-й бит в PORTB
set_port(&PORTD, 2); // 2-й бит в PORTDКод: Выделить всё
#define set_port(p,b) do{ p |= (1 << (b));}while(0)
set_port(PORTB, 3);
set_port(PORTD, 2);Да. Спасибо!такое возможно на самом деле в AVR-GCC, но на сколько мне известно, не в CVAVR.
в большинстве случаев вместо подобной функции вполне неплохо проявляют себя макросы
Код: Выделить всё
#define SET_PORT ( *reg, bit ) ( ( *reg ) |= ( 1 << ( bit ) ) )
#define CLEAR_PORT ( *reg, bit ) ( ( *reg ) &= ~( 1 << ( bit ) ) )
#define CHECK_PIN ( *pin, bit ) ( ( *pin ) & ( 1 << ( bit ) ) )Для чего и как это работает? Зачем здесь цикл?#define set_port(p,b) do{ p |= (1 << (b));}while(0)
Код: Выделить всё
#define SET_PORT ( *reg, bit ) ( ( *reg ) |= ( 1 << ( bit ) ) )
#define CLEAR_PORT ( *reg, bit ) ( ( *reg ) &= ~( 1 << ( bit ) ) )
#define CHECK_PIN ( *pin, bit ) ( ( *pin ) & ( 1 << ( bit ) ) )
uint8_t BITS_CHIP_PANEL[] = { 0, 1, 7, 6, 5, 4 };
uint8_t *PORTS_CHIP_PANEL[] = { &PORTA, &PORTA, &PORTD, &PORTD, &PORTC, &PORTC };
uint8_t *PINS_CHIP_PANEL[] = { &PINA, &PINA, &PIND, &PIND, &PINC, &PINC };
uint8_t *DDRS_CHIP_PANEL[] = { &DDRA, &DDRA, &DDRD, &DDRD, &DDRC, &DDRC };
Код: Выделить всё
CLEAR_PORT( PORTS_CHIP_PANEL[ i ], i );Этот код в студии работает. Значит точно ничего не выйдет в Codevision.define некорректные, а именно -звездочки в них.
Код: Выделить всё
uint8_t BITS_CHIP_PANEL[] = { 0, 1, 7, 6, 5, 4 };
uint8_t *PORTS_CHIP_PANEL[] = { &PORTA, &PORTA, &PORTD, &PORTD, &PORTC, &PORTC };Код: Выделить всё
*PORTS_CHIP_PANEL[ 3 ] |= ( 1 << BITS_CHIP_PANEL[ 3 ] );Код: Выделить всё
// Задаем режим работы таймера-счетчика 0
TCCR0A = _BV(COM0A0) | // COM0A1 = 0 и COM0A0 = 1 - переключение OC0A в момент совпадения
_BV(WGM01); // WGM = 010 - режим CTC
TCCR0B = _BV(CS02)| // CS = 101 - от внутреннего источника
_BV(CS00); // с предделителем 1024
OCR0A = M; // Инициализируем счетчик
Код: Выделить всё
TCCR0A = (1<<COM0A0) | (1<<WGM01); лучший способ - плюнуть на визарды и взять справочник/datasheet. Если очень плохо с английским скачайте книжки Евстифеева - Микроконтроллеры AVR семейств Tiny и Mega - там все разжеванокак с этим разобраться
.. я же вам название дал, неужели поиск в гугле запретили? http://avr.ru/docs/books/avrbango писал(а):Поделитесь если есть