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

zxz_rus

Members
  • Постов

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

  • Посещение

Электроника

  • Стаж в электронике
    6-10 лет
  • Сфера радиоэлектроники
    MK

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения zxz_rus

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

-1

Репутация

  1. Alex, нет вы не правильно меня поняли. Я премного благодарен за помощь. А решение проблемы я так и не нашел, почему контроллер не переключает состояния порта. И отнюдь я не "не имею ни малейшего представления о том что выполняет каждая строка". Спасибо. дельный совет. Но у меня задача не собрать конкретный девайс, а разобраться в работе кода и спроектировать свое. Вопрос заключался в том, что без энкодера все пашет. А с ним перестает. Порт не реагирует на сравнение. Компилятор не ругается. Прошу прощения если я кого то задел своими вопросами, и ответами. )
  2. Ну это все конечно хорошо, а более существенное что нибудь, кто нибудь посоветует???
  3. Спасибо, разобрался))) Была ошибка в настройке проекта в CV AVR
  4. Добрый вечер, помогите разобраться с кодом. Делаю термометр, с возможностью, выставления температуры срабатывания рэлле с помощью энкодера. Проблемы следующие. Не срабатывает реле, и отклик на энкодер идет слишком долго. То есть пару раз провернешь и только потом переменная увеличивается. По отдельности проекты работали. Общий код: #include <mega8.h> int NewState,OldState,upState,Temp,downState,count_1; // unsigned char trig; float temper; #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <stdio.h> #include <delay.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=2 #endasm #include <1wire.h> #include <ds18b20.h> #pragma warn- /* eeprom */ eeprom int temp_eep; #pragma warn+ interrupt [TIM1_COMPA] void timer1_compa_isr(void) { NewState=PINB & 0b00000011; if(NewState!=OldState) { switch(OldState) { case 2: { if(NewState == 3) upState++; if(NewState == 0) downState++; break; } case 0: { if(NewState == 2) upState++; if(NewState == 1) downState++; break; } case 1: { if(NewState == 0) upState++; if(NewState == 3) downState++; break; } case 3: { if(NewState == 1) upState++; if(NewState == 2) downState++; break; } } OldState=NewState; } if(trig==1) // если флаг активен { if(OldState==NewState) // если энкодер в покое то увеличиваем счетчик {count_1++; if(count_1==5000) // если счетчик дотикал до 5 секунд {temp_eep=Temp; // пишем данные в еепром count_1=0; //обнуляем счетчик trig=0; // обнуляем флаг } } } TCNT1H=0x00; TCNT1L=0x00; } void main(void) { char lcd_buf[17]; char lcd_buf2[17]; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=P PORTB=0x03; DDRB=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x0A; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x03; OCR1AL=0xE8; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x10; // Global enable interrupts #asm("sei") lcd_init(16); w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES); Temp=temp_eep; //Выгружаем данные из памяти while (1) { if (upState >= 4) { Temp++; upState = 0; trig=1; // ставим флаг } if (downState >= 4) { Temp--; downState = 0; trig=1; // ставим флаг } temper=ds18b20_temperature(0); if (temper<=Temp) {PINC.1=1;} else {PINC.1=0;} sprintf(lcd_buf,"t=%.1f\xdf""C",temper); ////0b 99 sprintf(lcd_buf2,"Temp=%d\xdf""C",Temp); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(lcd_buf); lcd_gotoxy(0,1); lcd_puts(lcd_buf2); delay_ms(10); }; } Проект термометра: #include <mega8.h> #include <delay.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=2 #endasm #include <1wire.h> #include <ds18b20.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <stdio.h> char lcd_buf[17]; void main(void) { float temper; lcd_init(16); w1_init(); ds18b20_init(0,-20,50,DS18B20_12BIT_RES); while(1) { temper=ds18b20_temperature(0); sprintf(lcd_buf,"t=%.1f\xdfC",temper); lcd_clear(); lcd_puts(lcd_buf); if (temper<=18) {PINC.1=1;} delay_ms(1500); }; } При сравнении переменных temper<=temp ничего не происходит. пробовал Temp заменить числом как во втором примере, тоже ноль реакции. Второй пример работает. Компилятор ошибок не выдает. Пишу в CV AVR. Схема собрана в железе.
  5. Да указал, к хек файлу, но возможно я сам МК настроил не правильно... Не могу понять. Да вроде пересобирал и не раз... Не помогает))))
  6. zxz_rus

    Замок на Ibutton ds1990

    Здравствуйте, пишу программу для считывания ключей DS1990 и реализации на ней замка. Нашел вот такой проект. Собрал схему в протеусе, для того что бы отладить процесс, и переписать прогу под свои нужды. Протеус выдает лог ошибок, программа компилируется без проблем. Мужики взгляните кому не трудно, в чем ошибка)) #include <tiny45.h> #include <delay.h> #define out PORTB.2 #define led PORTB.0 #define button1 PINB.3 #define button2 PINB.4 // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=1 #endasm #include <1wire.h> // Задаем глобальные переменные #pragma warn- /* eeprom unsigned char zero=255; */ eeprom unsigned char rom_code[15][8];/*15 -это max количество ключей.Для tiny-25 это 15*/ eeprom unsigned char m=0; #pragma warn+ unsigned char read_rom_code[8]; void main(void) { // Задаем докальные переменные unsigned char i,j,n; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Инициализация портов ввода/вывода // Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=Out // State5=P State4=P State3=P State2=0 State1=T State0=0 PORTB=0x38; DDRB=0x05; while (1) { if(w1_init()) // инициализация 1-Wire {w1_search(0xF0,&read_rom_code[0]); for(i=0;i<m;i++) // сравнение побайтно считанного и сохраненного кодов { n=0; for(j=0;j<8;j++) {if(read_rom_code[j]==rom_code[i][j]) n++;} if(n==8) goto zamok;} } if(button1==0) // проверка нажатия кнопки { while(button1==0) {} // ожидание отпускания кнопки led=1; // мигание светодиода delay_ms(500); led=0; // режим программирования и стирания в EEPROM while(w1_init()==0) {if(button1==0) goto end; if(button2==0) break;} if(button2==0) { while(button2==0) {} for(i=0;i<m;i++) // стереть все ключи {for(j=0;j<8;j++) {rom_code[i][j]=0;} m=0;} goto led_end;} w1_search(0xF0,&read_rom_code[0]); //записать в EEPROM if(m==15) goto end; /* m это максимальное количество ключей */ else {for(j=0;j<8;j++) {rom_code[m][j]=read_rom_code[j];} m++; led_end: led=1; // подтверждение записи и стирания delay_ms(2000); led=0;} end: while(button1==0) {} // ожидание отпускания кнопки for(i=0;i<2;i++) {led=1; delay_ms(500); led=0; delay_ms(200);} } if(button2==0) delay_ms(200); if(button2==0) zamok: { out=1; // процедура открытия замка delay_ms(200); out=0; } }; } Код и файлы проекта прилагаю. tiny-45.rar
  7. Вот такой лог при запуске... таких сообщений пару сотен... спасибо, сопротивление поправил.
  8. Здравствуйте, помогите пожалуйста, не могу запустить симуляцию в ISIS протеус выдает кучу сообщений про память, схема не работает. Уверен что то я не так настраиваю, заранее спасибо. tiny-45.rar
×
×
  • Создать...