-
Постов
7 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о an_ga
- День рождения 14.04.1972
Контакты
-
Сайт
Array
-
ICQ
Array
Информация
-
Город
Array
-
IAR 5.3
an_ga опубликовал тема в Программирование
Доброго времени суток. При разработке программы для 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 уже не ноль а какое-то число. Есть отработки прерываний, но они переменную не трогают. Закономерности найти не могу. Подскажите, пожалуйста, где копать. Большое спасибо. -
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.
-
Обычный. Просто изначально все делалось для 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; } //------------------------------------------------------------------------- Спасибо.
-
Всем доброго времени суток! Столкнулся со следующей проблемкой. Контроллер общается с АЦП по SPI. Сначала это был софтовый SPI. Потом взял AT89S8252. Запустить внем SPI не удалось. Даташит выучил наизусть- всеравно нет. Пришлось оставить софтовый. Потихоньку перешел на AT89S8253. Попробовал - заработало. Зашиваю в 8252 - фигвамы рисует. Может кто-то сталкивался с проблемой? Буду благодарен за намек.
-
По поводу регуляторов (для информации): http://my.elvisti.com/shov/tune1.html А температуру из напряжения термопары я обычно по полиному считал. Мне кажется так проще. Главное ЭДС холодного спая не забывать прибавлять.
-
ПИД регулятор темперауры
an_ga ответил Master of OKER тема в AVR
Разрешите вставить свои пять копеек, т.к. регуляторами температуры приходится заниматься регулярно. Любой регулятор нужно настраивать. Настройка сводится с подбору коэффициентов пропорционального, интегрального и дифференциального звена. В общем виде: P=Kп*X+Kи*SUMMA(X)+Kд*(dX/dT), где: X-разность между установленной и измеренной температурой; P-значение выходной мощности; SUMMA(X)-сумма значений X; (dX/dT)-разность между значениями X от измерения к измерению; Kп,Kи,Kд-кэффициенты пропорционального, интегрального и дифференциального звена. Если объект инерционный (время реакции на воздействие от 1 сек. и больше, приблизительно конечно), то дифференциальное звено погоды делать не будет. Диф. звено используется в динамичных объектах и позволяет резко поддавать мощи или также резко убирать. Можно сделать только проп. регулятор, но там всегда будет иметься отклонение от уст. температуры (статизм). С интегратором этого нет, т.к. в установившемся режиме X болтается около ноля. Часто алгоритм регулятора включают в каком-то диапазоне от уст. величины, чтобы небыло различных залетов интегратора и т.п. Есть алгоритмы самонастройки регуляторов. Книг по этой теме миллион. Иногда такие объекты попадаются, что мозги вскипают. А с появлением микропроцессоров сколько разработчиков - столько и решений. :)