Перейти к содержанию
    

th-under

Участник
  • Постов

    9
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о th-under

  • День рождения 18.01.1987

Информация

  • Город
    Array
  1. ILYAUL, zombi, спасибо Вам большое за помощь! Не обратил внимания к сожалению на такую тонкость. Теперь буду внимательнее!
  2. zombi, совершенно верно, они соединены. Я управляю входом ~LD ЦАПа с помощью 18 ножки МК. Своей фразой я просто хотел сказать, что проблема не в контакте (так как не важно, куда именно я тыркаю тестером). И микроконтроллер и ЦАП в корпусах DIP помещены в соответствующие панельки. ILУAUL, ножка PB4 была поднята в лог. единицу во время конфигурации портов и после этого не опускалась. После того, как я не получил необходимые мне 100 мВ, я добавил еще раз PORTB |= (1<<PB4); в функцию void DAC_prog(unsigned int dacData) перед выбором ЦАПа "чипселектом" ~CS. На всякий случай. Но проблема, увы, не была устранена.
  3. Программирование ЦАП AVR

    Здравствуйте, уважаемые форумчане! Всех с наступающим Новым Годом! Мне нужна Ваша помощь и совет вот по какому вопросу: Я пробую программировать ЦАП DAC8512F с помощью SPI порта контроллера ATMega168 (кварц 20 МГц). ЦАП подключен к контроллеру следующим образом: 19 ножка МК (PB5/SCK) - 3 ножка ЦАПа CLK; 18 ножка МК (PB4/MISO) - 5 ножка ~LD; 17 ножка МК (PB3/MOSI) - 4 ножка SDI; 16 ножка МК (PB2/~SS) - 2 ножка ~CS; 15 ножка МК (PB1) - 6 ножка ~CLR; 8 ножка ЦАП +5В; 7 ножка ЦАП GND. В итоге после выполнения программы (приведена ниже) на выходе ЦАПа устанавливается 0 В, а не требуемые 100 мВ. НО после того как я тестером в режиме измерения напряжения ткну в ножку ~LD ИЛИ ножку 18 МК, на выходе ЦАПа устанавливается требуемое значение. В чем может быть проблема? почему данные в регистр ЦАПа не поступают автоматически?? Спасибо за помощь! Проблема наверняка какая нибудь не сложная. Но к сожалению не могу в ней разобраться. Программа: #define DACDEFAULT 100 int main(void) { WDT_off(); // Отключаем сторожевой таймер IO_conf(); // Конфигурируем порты _delay_us(5); // Ждем 5 мкс SPI_init(); // Инициализируем SPI _delay_us(5); // Ждем 5 мкс DAC_erase(); _delay_us(5); // Ждем 5 мкс DAC_prog(DACDEFAULT); // Программируем ЦАП на 100 мВ } /* Часть программы SPI */ void SPI_init(void) { //Устанавливаем SPI в режиме мастера, SCL отрицательной полярности //Скорость FCK/64, обработка сигнала по нарастающему фронту SCL SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1); } void SPI_Transmit(char cData) // Передача числа 8 бит { // Начать передачу SPDR = cData; // Ожидаем завершения передачи while(!(SPSR & (1<<SPIF))); } /*Инициализация ножек МК*/ void IO_conf(void) { // Конфигурация порта B: Выводы 1-5 на выход xx11 1110 DDRB =(1<<DDB5)|(1<<DDB4)|(1<<DDB3)|(1<<DDB2)|(1<<DDB1); // CS ЦАП PB2=1 (Не выбран), //CLR ЦАП PB1=1 (Нет очистки), PORTB |= (1<<PB4)|(1<<PB2)|(1<<PB1); } /* Программирование ЦАП */ void DAC_prog(unsigned int dacData) { DAClevelH = (unsigned char) dacData>>8; DAClevelL = (unsigned char) dacData; PORTB |= (1<<PB4); _delay_us(5); //Выбираем ЦАП с помощью CS - логический 0 PORTB &= ~(1<<PB2); _delay_us(5); //Записываем данные в ЦАП SPI_Transmit(DAClevelH); // Ожидание завершения передачи прописано в функции SPI_Transmit(DAClevelL); // Ожидание завершения передачи прописано в функции //Возвращаем CS в состояние логической 1 _delay_us(5); // Ждем 5 мкс PORTB |= (1<<PB2); _delay_us(5); // Ждем 5 мкс //Переносим данные из сдвигового регистра в регистр ЦАП - лог 0 PORTB &= ~(1<<PB4); _delay_ms(1); // Ждем 5 мкс PORTB |= (1<<PB4); _delay_us(5); // Ждем 5 мкс } /* Стираем ЦАП */ void DAC_erase(void) { PORTB |= (1<<PB4); _delay_us(5); PORTB &= ~(1<<PB1); _delay_ms(1); // Ждем 1 мс //Возвращаем CLR в состояние - логическая 1 PORTB |= (1<<PB1); _delay_us(30); // Ждем 30 мкс }
  4. :laughing: Доброе утро. Если тема еще актуальна могу прислать компилятор V4.02E/DOS.
  5. sergeeff, спасибо! Попробую и после праздников отпишусь :)
  6. Извиняюсь за столь поздний ответ! ЖКИ PG12864LRF; а вот как описаны шрифты, это я и сам хочу узнать :rolleyes: Прикрепил в архиве файлы таблицы и функции выводов текста. Спасибо, AHTOXA за ссылку, посмотрю. glib.rar
  7. Здравствуйте! Нужно увеличить шрифт, отображаемый на экране ЖКИ прибора. В проекте, написанном на IAR C, нашел два файла, отвечающие за размер шрифта. fnt8x8.h - "маленький" шрифт; fnt8x16.h - "большой" шрифт. Структура каждого из этих файлов представляет собой инициализацию двух массивов данных. Например, для fnt8x8.h const byte smallfontbits[ 2048 ] = {числа массива}; const byte smallfontpitches[ 256 ] = {числа массива}; extern const font_t smallfont; А для fnt8x16.h const byte largefontbits[4096] = {числа массива}; const byte largefontpitches[ 256 ] = {числа массива}; extern const font_t largefont; Поэтому возникли следующие вопросы: что означают эти массивы? как создать больший шрифт? может есть какие-то ссылки на создание таких файлов? гугл не помог. Нужно создать шрифт больший, чем в fnt8x16. К сожалению, сами файлы выложить не удалось. Почему-то возникла надпись "Ошибка Неудачная загрузка. Вам запрещено загружать такой тип файлов". Спасибо!
  8. Спасибо, MrYuran. Воспользовался первым Вашим советом, проблема решилась. Мда... тут без подсказки всех особенностей и не узнаешь :) Спасибо, rezident. Пролистаю сейчас еще этот момент в руководстве.
  9. Доброго всем времени суток! Начал недавно заниматься программированием микроконтроллеров. Возникла проблема следующего характера: Есть большая программа написанная на IAR для MSP430F161. Дописал кусок программы в котором инициализировал второй блок захвата/сравнения для таймера B таким образом, чтобы прерывании осуществлялось каждые 1/500 сек. Но программа отказывалась работать. В режиме деббагинга установил, что MSP не выходит из прерывания, инициализированного вторым блоком захвата/сравнения. Вот куски программы: Основное тело программы: #define TB_DIVIDER 1024 #define TB_DIVIDER2 64 void main(void) { ... InitHW(); // инициализация HW, в том числе и таймеров _EINT(); // разрешение прерываний от таймеров ... for (;;) { // Бесконечный цикл } } void InitHW(void) { WDTCTL = WDTPW + WDTHOLD; ... BCSCTL2 |= SELM1 + SELS; //Инициализация таймера: TBCTL = TBSSEL0 + TBCLR; // ACLK, clear TBR TBCCTL0 = CCIE; // TRCCR0 interrupt enabled TBCCTL1 = CCIE; // TRCCR1 interrupt enabled TBCCR0 = TB_DIVIDER; // ~10 Ticks per second TBCCR1 = TB_DIVIDER2; // ~500 Ticks per second TBCTL |= MC0; ... } // Timer B1 interrupt service routine #pragma vector=TIMERB1_VECTOR __interrupt void Timer_B1(void) { if(amd==1) { if(Per1>0) Per1--; if(Per2>0) Per2--; if(Per3>0) Per3--; if(Per4>0) Per4--; } } // Timer B0 interrupt service routine #pragma vector=TIMERB0_VECTOR __interrupt void Timer_B(void) { //кусок программы, исправно работающий при отсутствии строчки TBCCTL1 = CCIE; } Причем, если в #define TB_DIVIDER2 поставить значение большее 1024, то программа, которая была до внесения мной изменений, выполняется. В чем может быть проблема? Возможно ли что эта проблема связана с приоритетом прерывания? Т.к. "скорость" появления прерывания от TIMERB1_VECTOR больше чем у TIMERB0_VECTOR, а приоритеты наоборот... или нет? Тактовая частота 8 MГц. ACLK - 32768 Гц. За ранее благодарю. Прошу сильно не пинать, ибо, повторюсь, новичок в этом.
×
×
  • Создать...