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

TriS

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

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

  • Посещение

Репутация

0 Обычный
  1. Прилагаю весь проект с кодом. Только недавно где-то читал что некоторые типы микросхем именно так работают :-( ___.rar
  2. прерывания не использую, компилирую и тут же эмулирую в протеусе /***************************************************** This program was produced by the CodeWizardAVR V2.04.4a Advanced Automatic Program Generator © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 26.12.2010 Author : NeVaDa Company : Comments: Chip type : ATtiny13A AVR Core Clock frequency: 3,686400 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 16 *****************************************************/ #include <tiny2313.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=7 #endasm #include <1wire.h> #include <delay.h> #include <stdio.h> #define DS1990_FAMILY_CODE 1 #define SEARCH_ROM 0xF0 #define MAX_DEVICES 1 #define MAX_SERIAL 9 /* DS1990 devices ROM code storage area, 9 bytes are used for each device (see the w1_search function description), but only the first 8 bytes contain the ROM code and CRC */ unsigned char rom_code[MAX_DEVICES][MAX_SERIAL]; eeprom unsigned char key[MAX_DEVICES][MAX_SERIAL]; // Declare your global variables here void main(void) { unsigned char i,j,devices; // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization PORTB=0xE0; //PORTB=0b11100000; DDRB=0b00011000; // Port D initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // 1 Wire Bus initialization w1_init(); //devices=w1_search(SEARCH_ROM,&rom_code[0][0]); // PORTB |= 1<<3; //// PORTB |= 1<<4; // delay_ms(1000); // PORTB &= ~(1<<4); //PINB.4=1; // PINB.3=1; delay_ms(600); // PINB.3=0; // PINB.4=0; while (1) { devices=w1_search(SEARCH_ROM,&rom_code[0][0]); // detect how many 1 Wire devices are present on the bus delay_ms(470); if(PINB.6==0) { PORTB &= ~(1<<4); delay_ms(250); PORTB &= ~(1<<4); } if(PINB.5==0) { PORTB |= 1<<3; delay_ms(250); PORTB |= 1<<3; } } }
  3. Повторная запись в порт

    Пишу код под attiny2313, на CAVR. Сталкнулся с такой вот проблемой. порт В4 настроен на выход, дефолтом на нем 0. код: ..... PORTB |= 1<<4; delay_ms(500); PORTB |= 1<<4; ..... повторная запись единички в регистр переводит его состояние в ноль, как от этого избавиться? мне все рано что было на выводе до исполнения команды, но когда я хочу туда записать 1, я хочу быть уверен что порт не упадет в 0.
  4. я до физической схемы еще не дошел, эмулирую в протеусе, резистор между 2 и 3 ногой есть, второй датчик подключен параллельно. Если пробывать подключать один датчик то он тоже не обнаруживается.
  5. У меня не обнаруживается на шине ни один из двух датчиков ds1820, пробую и с задержками, но пока глухо. w1_init(); delay_ms(2000); devices=w1_search(0xf0,rom_codes); В итоге devices=0 такое ощущение что w1_search() не отрабатывает вообще, на всякий случай кому интересно прикладываю проект prj.rar
  6. Нашел вот что: PLEASE MAKE SURE THAT THE CKSEL0..3 FUSE BITS ARE PROGRAMMED TO USE THE EXTERNAL 3.6864MHz CLOCK SOURCE OF THE STK500 AND NOT THE INTERNAL 1MHz OSCILLATOR. The ATmega8515 chip comes from the factory with CKSEL0..3 fuse bits set to use the internal 1 MHz oscillator. The DS1820/18S20 sensors are connected to bit 6 of PORTA of the ATmega8515 as follows: [DS1820/18S20] [sTK500 PORTA HEADER] 1 GND - 9 GND 2 DQ - 7 PA6 3 VDD - 10 +5V All the temperature sensors must be connected in parallel AN 4.7k PULLUP RESISTOR MUST BE CONNECTED BETWEEN DQ (PA6) AND +5V ! В свойствах проекта поменял частоту на 3.6864MHz , выставил фьюзы CKSEL0..3, но все равно на шине датчики не обнаруживаются
  7. Помогите найти ошибку!!!! Использую две шины I2C и 1-Wire на одном порту, использую микросхему часов ds1307(I2C) и 2 датчика температуры ds1820(1-wire), так вот сначала инициализирую шину 1-wire, определяю кол-во устройств ds1820 на ней.... определяется ноль, затем инициализирую шину I2C, по ней прекрасно общаюсь с ds 1307. /***************************************************** This program was produced by the CodeWizardAVR V2.04.4a Advanced Automatic Program Generator © Copyright 1998-2009 Pavel Haiduc, <span name="mcb_s" id="multishop1" style="overflow:hidden; zoom:1; display:inline; margin: 0px; padding: 0px; " class="wbc_wrapped_word">HP InfoTech s</span>.r.l. http://www.hpinfotech.com Project : Version : Date : 10.07.2010 Author : NeVaDa Company : Company Comments: Chip type : ATmega8515 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> // 1-wire #asm .equ __w1_port=0x1b //PORTA .equ __w1_bit=2 #endasm #include <1wire.h> // I2C Bus functions #asm .equ __i2c_port=0x1b //PORTA .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include <i2c.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 //PORTC #endasm #include <lcd.h> #include <ds1307.h> #include <ds1820.h> #include <delay.h> #include <stdio.h> #include <string.h> //#include <eeprom.h> #define lcd_segment 16 /* maximum number of DS1820/DS18S20 connected to the 1 Wire bus */ #define MAX_DEVICES 8 unsigned char rom_code[MAX_DEVICES][9]; unsigned char devices; unsigned char hour,minute,sek; //часы, минуты, секунды unsigned char day,month,year; //день, месяц, год int menu=1; int menu_time=0; int i=0; int update=1000; // период обновлений char auto_ind[5]=""; unsigned char lcd_buffer[lcd_segment*2]; unsigned char t_stab=22; void lcd_menu_time(void) { if (i>update) { i=0; switch (menu_time) { case 1: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Setup Hour:\r\nH=%i",hour); lcd_puts(lcd_buffer); break; case 2: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Setup Min:\r\nM=%i",minute); lcd_puts(lcd_buffer); break; case 3: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Setup Sec:\r\nS=%i",sek); lcd_puts(lcd_buffer); break; case 4: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Setup Date:\r\nD=%i",day); lcd_puts(lcd_buffer); break; case 5: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Setup Month:\r\nM=%i",month); lcd_puts(lcd_buffer); break; case 6: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Setup Year:\r\nY=%i",year); lcd_puts(lcd_buffer); break; case 7: lcd_clear(); lcd_gotoxy(0,0); sprintf(lcd_buffer, "Save Setup?\r\n+ Yes, - No"); lcd_puts(lcd_buffer); break; default:; } } } void lcd_cond() { unsigned char k,j; int temp; if (i>update) { i=0; if (devices>0) { //PINA.3=0xfe; } else { //PINA.3=0xff; sprintf(lcd_buffer,"No find"); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(200); } lcd_clear(); if (devices) { for (k=0;k<devices;k++) { sprintf(lcd_buffer,"Device #%u ROM\nCode is:",k+1); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(200); lcd_clear(); for (j=0;j<8;j++) { sprintf(lcd_buffer,"%02X ",rom_code[k][j]); lcd_puts(lcd_buffer); if (j==3) lcd_gotoxy(0,1); }; delay_ms(200); }; for (k=0;k<devices;) { temp=ds1820_temperature_10(&rom_code[k][0]); j='+'; if (temp<0) { j='-'; temp=-temp; }; sprintf(lcd_buffer,"t%u=%c%i.%u\xdfC",++k,j,temp/10,temp%10); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(800); }; } // sprintf(lcd_buffer, "U:%i%cC, S:%i%cC\r\nT=%i%cC %s",31,0xdf,tem,0xdf,t_stab,0xdf,auto_ind); } } void lcd_time(void) { if (i>update) { i=0; rtc_get_time(&hour,&minute,&sek); //считать время rtc_get_date(&day,&month,&year); //считать дату lcd_clear(); lcd_gotoxy(0,0); lcd_putsf(""); //lcd_putchar(hour/10+16+hour%10); lcd_putchar(hour/10+0x30); lcd_putchar(hour%10+0x30); lcd_putchar(':'); lcd_putchar(minute/10+0x30); lcd_putchar(minute%10+0x30); lcd_putchar(':'); lcd_putchar(sek/10+0x30); lcd_putchar(sek%10+0x30); lcd_gotoxy(0,1); lcd_putsf(""); lcd_putchar(day/10+0x30); lcd_putchar(day%10+0x30); lcd_putchar('-'); lcd_putchar(month/10+0x30); lcd_putchar(month%10+0x30); lcd_putchar('-'); lcd_putchar(year/10+0x30); lcd_putchar(year%10+0x30); } } void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A 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=T State0=T PORTA=0x00; DDRA=0x00; //DDRA=0x0D; // 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=T State0=T PORTB=0xFF; DDRB=0x00; // Port C 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=T State0=T PORTC=0x00; DDRC=0x00; // Port D 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=T State0=T PORTD=0x00; DDRD=0x00; // Port E initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTE=0x00; DDRE=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; EMCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // LCD module initialization lcd_init(lcd_segment); sprintf(lcd_buffer,"Init 1-wire"); lcd_puts(lcd_buffer); w1_init(); devices=w1_search(0xf0,rom_code); lcd_clear(); sprintf(lcd_buffer,"%u DS1820\nDevice detected",devices); lcd_puts(lcd_buffer); delay_ms(100); // I2C Bus initialization i2c_init(); rtc_init(0,1,0); rtc_set_date(01,01,10); //установить дату: день,месяц,год rtc_set_time(23,59,00); //установить время: часы, минуты, секунды while (1) { i++; if (menu_time==0) switch (menu) { case 0:lcd_time(); break; case 1:lcd_cond(); break; default:; } if (PINB.0==0) // если нажата кнопка Time/Kond { delay_ms(250); // задержка 1/4 сек. (для удобства) выбора menu++; if (menu>=2) menu=0; } // Настройки часов if(menu==0) { if (PINB.1==0) { menu_time++; if (menu_time>7) menu_time=7; delay_ms(250); } if (menu_time!=0) lcd_menu_time(); //------------------------------------------- if ((menu_time==1)&(PINB.2==0)) { hour++; if (hour==24||hour==255) hour=0; // if (hour>23) hour=0; delay_ms(250); } if ((menu_time==1)&(PINB.3==0)) { hour--; if (hour==24||hour==255) hour=0; //if (hour<0) hour=23; delay_ms(250); } //------------------------------------------- if ((menu_time==2)&(PINB.2==0)) { minute++; // if (minute>59) minute=0; delay_ms(250); } if ((menu_time==2)&(PINB.3==0)) { minute--; //if (minute<0) minute=59; delay_ms(250); } //------------------------------------------- if ((menu_time==3)&(PINB.2==0)) { sek++; //if (sek>59) hour=0; delay_ms(250); } if ((menu_time==3)&(PINB.3==0)) { sek--; //if (sek<0) sek=59; delay_ms(250); } //------------------------------------------- //------------------------------------------- if ((menu_time==4)&(PINB.2==0)) { day++; // if (day>31) day=0; delay_ms(250); } if ((menu_time==4)&(PINB.3==0)) { day--; // if (day<0) day=31; delay_ms(250); } //------------------------------------------- if ((menu_time==5)&(PINB.2==0)) { month++; // if (month>12) month=0; delay_ms(250); } if ((menu_time==5)&(PINB.3==0)) { month--; // if (month<0) month=12; delay_ms(250); } //------------------------------------------- if ((menu_time==6)&(PINB.2==0)) { year++; // if (year>59) year=0; delay_ms(250); } if ((menu_time==6)&(PINB.3==0)) { year--; // if (year<0) year=59; delay_ms(250); } //------------------------------------------- //------------------------------------------- if ((menu_time==7)&(PINB.2==0)) { rtc_set_date(day,month,year); //установить дату: день,месяц,год rtc_set_time(hour,minute,sek); //установить время: часы, минуты, секунды menu_time=0; delay_ms(250); } if ((menu_time==7)&(PINB.3==0)) { menu_time=0; delay_ms(250); } //------------------------------------------- if (menu_time!=0) { if (hour==24||hour==255) hour=0; if (minute==60||minute==255) minute=0; if (sek==60||sek==255) sek=0; if (day==31||day==255) day=0; if (month==13||month==255) month=0; if (year==99||year==255) year=0; } } // Настройки кондея if(menu==1) { if (PINB.1==0) { if (strcmp (auto_ind,"")==0) { strcpy(auto_ind,"Auto"); // PINA.2=0xfe; } else { strcpy(auto_ind,""); // PINA.2=0xff; } delay_ms(250); } if (PINB.2==0) { t_stab++; if (t_stab>30) t_stab=30; delay_ms(250); } if (PINB.3==0) { t_stab--; if (t_stab<15) t_stab=15; delay_ms(250); } } } }
  8. Контроллер температуру снимает правильно, датчик переключается при верхнем пороге правильно, а нижний порог вместо заданного при инициализации - 0 градусов. Глюк?
  9. Пишу в СV AVR, имеется проект в котором используется датчик ds1621, инициализирую его след. образом ds1621_init(0,20,22,0). В протеусе, до запуска проекта выставляю этому датчику температуру 15 градусов, запускаю проект на выполнение, нога Tout в активном состоянии, довожу температуру до 23 градусов, Tout - переходит в отключенное состояние, начинаю понижать температуру до Tlow=20, но датчик не переключается в активное состояние. Что я делаю не так, либо это глюк? _dump.rar
×
×
  • Создать...