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

an_ga

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

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

  • Посещение

Репутация

0 Обычный

Информация о an_ga

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

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. IAR 5.3

    Доброго времени суток. При разработке программы для tiny2313 наткнулся на следующую проблемму: изменяются значения глбальных переменных. Влоть до того: unsigned char ButtonNumber; . . . if(cmd==Play) { Mode=pass;//режим ввода 7мизначного пароля ButtonNumber=0; Beep(); } void Beep() { Buzzer_ON;//вкл. пищалку delay_ms(200);//использует __delay_cycles Buzzer_OFF;//выкл. пищалку } После Beep() ButtonNumber уже не ноль а какое-то число. Есть отработки прерываний, но они переменную не трогают. Закономерности найти не могу. Подскажите, пожалуйста, где копать. Большое спасибо.
  2. void ram_eeprom(void data*,void xdata*,unsigned char); void eeprom_ram(void xdata*,void data*,unsigned char); unsigned int xdata KeyClock_ee; . . . ram_eeprom(&KeyClock,&KeyClock_ee,sizeof(KeyClock)); . . . eeprom_ram(&KeyClock_ee,&KeyClock,sizeof(KeyClock)); Это основная программа на С. А это функции на ассемблере: NAME EEPROM_MODULE EEPROM_MODULE SEGMENT CODE PUBLIC _eeprom_ram,_ram_eeprom sfr EECON = 0x96; Memory Control Register rseg eeprom_module ;--------------------------------------------------------------- ;Перенос данных из EEPROM в ОЗУ ;В R0 адрес в ОЗУ, куда переносим ;В DPTR адрес в EEPROM, откуда берем ;В R3 сколько байт ;--------------------------------------------------------------- _eeprom_ram: mov dph,r6;откуда из EEPROM mov dpl,r7 mov a,r5;куда в RAM mov r0,a orl EECON,#00001000b;включаем EEPROM rd_eeprom: movx a,@dptr mov @r0,a inc dptr inc r0 djnz r3,rd_eeprom anl EECON,#11110111b;выключаем EEPROM ret ;-------------------------------------- ;Перенос данных из ОЗУ в EEPROM ;В R0 адрес в ОЗУ, откуда берем ;В DPTR адрес в EEPROM, куда переносим ;В R3 сколько байт ;-------------------------------------- _ram_eeprom: mov a,r7;откуда из RAM mov r0,a mov dph,r4;куда в EEPROM mov dpl,r5 orl EECON,#00011000b;включаем EEPROM, разрешаем запись ram_ee: mov a,EECON jnb acc.1,ram_ee;ждем готовности EEPROM (RDY/BSY=1) mov a,@r0 movx @dptr,a inc dptr inc r0 wwr2: mov a,EECON jnb acc.1,wwr2;ждем готовности EEPROM (RDY/BSY=1) djnz r3,ram_ee anl EECON,#11100111b;выключаем EEPROM, запрещаем запись ret END Писал в Keil.
  3. AT89S8252

    Спасибо за интерес к вопросу. Думаю, что рабочий, т.к. делал попытки в разное время с разными микросхемами. А то что он программируется по SPI, это показатель? Скорее всего я где-то лохонулся, но не знаю где.
  4. AT89S8252

    Обычный. Просто изначально все делалось для 8252 и не заработало. Потом ткнул в 8253-пошло. Странно, что я не так делаю? void init_SPI(void); //Инициализация SPI void init_ADS(void); //Инициализация АЦП void spi_out(unsigned char); //Отправка байта по SPI unsigned char spi_in(void); //Прием байта по SPI char code init_ADS_word[5]={0x64,0x42,0x20,0x98,0x6A};//Инструкция+4байта параметров АЦП void init_SPI() { SPCR=0x50; //01010000 /* SPR0=0 Частота SCK SPR1=0 CPHA=0 SCK___/``` CPOL=0 SCK___ MSTR=1 Master DORD=0 Старшим битом вперед SPE=1 SPI разрешен SPIE=0 Прерывание от SPI запрещено*/ } //------------------------------------------------------------------------- void init_ADS() { char j; IE1=0; while(!IE1);//Ждем DRDY от АЦП for(j=0;j<5;j++) { spi_out(init_ADS_word[j]); } } //------------------------------------------------------------------------- void spi_out(unsigned char byte) { unsigned char k; SPDR=byte; do { //Ожидаем отправки k=SPSR; k&=SPIF_; } while(!k); } //------------------------------------------------------------------------- unsigned char spi_in() { unsigned char k; SPDR=0xFF; //Фиктивная отправка do { //Ожидаем приема k=SPSR; k&=SPIF_; } while(!k); return SPDR; } //------------------------------------------------------------------------- Спасибо.
  5. AT89S8252

    Всем доброго времени суток! Столкнулся со следующей проблемкой. Контроллер общается с АЦП по SPI. Сначала это был софтовый SPI. Потом взял AT89S8252. Запустить внем SPI не удалось. Даташит выучил наизусть- всеравно нет. Пришлось оставить софтовый. Потихоньку перешел на AT89S8253. Попробовал - заработало. Зашиваю в 8252 - фигвамы рисует. Может кто-то сталкивался с проблемой? Буду благодарен за намек.
  6. По поводу регуляторов (для информации): http://my.elvisti.com/shov/tune1.html А температуру из напряжения термопары я обычно по полиному считал. Мне кажется так проще. Главное ЭДС холодного спая не забывать прибавлять.
  7. Разрешите вставить свои пять копеек, т.к. регуляторами температуры приходится заниматься регулярно. Любой регулятор нужно настраивать. Настройка сводится с подбору коэффициентов пропорционального, интегрального и дифференциального звена. В общем виде: P=Kп*X+Kи*SUMMA(X)+Kд*(dX/dT), где: X-разность между установленной и измеренной температурой; P-значение выходной мощности; SUMMA(X)-сумма значений X; (dX/dT)-разность между значениями X от измерения к измерению; Kп,Kи,Kд-кэффициенты пропорционального, интегрального и дифференциального звена. Если объект инерционный (время реакции на воздействие от 1 сек. и больше, приблизительно конечно), то дифференциальное звено погоды делать не будет. Диф. звено используется в динамичных объектах и позволяет резко поддавать мощи или также резко убирать. Можно сделать только проп. регулятор, но там всегда будет иметься отклонение от уст. температуры (статизм). С интегратором этого нет, т.к. в установившемся режиме X болтается около ноля. Часто алгоритм регулятора включают в каком-то диапазоне от уст. величины, чтобы небыло различных залетов интегратора и т.п. Есть алгоритмы самонастройки регуляторов. Книг по этой теме миллион. Иногда такие объекты попадаются, что мозги вскипают. А с появлением микропроцессоров сколько разработчиков - столько и решений. :)
×
×
  • Создать...