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

IIIytNIK

Members
  • Постов

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

  • Посещение

  • Победитель дней

    4

Сообщения, опубликованные IIIytNIK

  1. Значит проблема с железом. Проверить питание на mega16, проверить кварц путем замены на заведомо рабочий, проверить дорожки на обрыв, может где-то пайка отвалилась, заменить mega16, только нужно будет предварительно прошить его бутлоадером.

  2. Этих тем ежегодно по десятку вылезает...

    Пару лет может быть и было актуально, но сегодня нет, потому что:

    1)Это никому не нужно

    2)Большинство устройств на Android поддерживает USB-OTG

    3)Есть видеорегистраторы со встроенными жесткими дисками форм-фактора 2,5"

    Вместо видеорегистратора, кстати говоря, можно использовать тот же Raspberry PI или CubieBoard. производительности хватает. Проверено.

  3. Вообще ремонт кнопки затвора(замена) в АСЦ стоит от 3000 до 5000 рублей. У меня в свое время был древнейший Canon EOS 10D, тоже проблема была с кнопкой - срабатывала через раз. В СЦ предложили заменить блок с кнопкой за 3500р, на что я естественно отказался. В итоге вылечил залив в кнопку изопропиловый спирт и хорошенько понажимав её.

    В вашем случае варианты такие:

    Обратиться в АСЦ

    Попробовать промыть кнопку изопропиловым спиртом. Если не получится, то разобрать её и прочистить механически (терять уже нечего)

    Попробовать заменить её на такую кнопку (должна подойти)

  4. Катодный бы вообще не пахал. Где-то он скорее всего забыл инвертировать "~".

    Ну и для нуждающихся исправленный исходник:

    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.04.4a Advanced
    
    Project : Мини термометр
    Version :
    Date    : 24.04.2010
    Author  : Pervakov Danil
    
    Chip type			   : ATtiny2313
    AVR Core Clock frequency: 4,000000 MHz
    Memory model		    : Tiny
    External RAM size	   : 0
    Data Stack size		 : 32
    *****************************************************/
    //
    // Fuse CKSEL = 0010, SUT = 10 (Int.RC 4 MHz)
    //
    // EEPROM usage: 0 byte(s), 0,0% of EEPROM
    // Program size: 829 words (1658 bytes), 81,0% of FLASH
    //
    // Датчики DS18S20 и/или DS18B20 - (PORTD bit 6)
    //
    
    // сердце - не Пентиум и не Атлон и частота не в ГГц, но если вспомнить IBM PC XT с его Intel 8088
    #include <tiny2313.h>
    
    // 1 Wire Bus functions
    #asm
      .equ __w1_port=0x12 ;PORTD
      .equ __w1_bit=6
    #endasm
    
    // DS18x20 Temperature Sensor functions
    #include "ds18x20_v2.h"  
    
    #include <delay.h>
    #include <bcd.h>
    
    //---------------------------------------
    #define A   2
    #define B  32
    #define C   4
    #define D  64  
    #define E 128
    #define F   1
    #define G   1
    
    static flash unsigned char digits_PA[] = {
       (A+F), // 0
       (0),   // 1
       (A),   // 2
       (A),   // 3
       (F),   // 4
       (A+F), // 5
       (A+F), // 6
       (A),   // 7
       (A+F), // 8
       (A+F), // 9
       (A+F), // A - 10
       (F),   // b - 11
       (A+F), // C - 12
       (0),   // d - 13
       (A+F), // E - 14
       (A+F), // F - 15
       (0),   // 16 - знак минус
       (A+F), // 17 - символ градус цельсия
       (0)    // 18 - пусто
    };
    
    static flash unsigned char digits_PB[] = {
       (B+C+D+E),   // 0
       (B+C),	   // 1
       (B+D+E+G),   // 2
       (B+C+D+G),   // 3
       (B+C+G),	 // 4
       (C+D+G),	 // 5
       (C+D+E+G),   // 6
       (B+C),	   // 7
       (B+C+D+E+G), // 8
       (B+C+D+G),   // 9
       (B+C+E+G),   // A - 10
       (C+D+E+G),   // b - 11
       (D+E),	   // C - 12
       (B+C+D+E+G), // d - 13
       (D+E+G),	 // E - 14
       (E+G),	   // F - 15
       (G),		 // 16 - знак минус
       (B+G),	   // 17 - символ градус цельсия
       (0)		  // 18 - пусто
    };
    
    #define MINUS  16
    #define GRADUS 17
    #define PROBEL 18
    #define SYMBOL_F 15
    
    // K1 - PORTD.0-1, K2 - PORTD.2-3, K3 - PORTD.4-5
    static flash unsigned char cursor[]={0b11111100, 0b11110011, 0b11001111};
    
    unsigned char digit_out[3], cur_dig;
    bit zpt_ON;
    int temperature;	   // то, что возвращает датчик
    
    
    // maximum number of DS1820/DS18S20/DS18B20 devices connected to the 1 Wire bus
    #define MAX_DS18x20 4
    
    // DS1820/DS18S20/DS18B20 devices ROM code storage area, 9 bytes are used for each device
    unsigned char rom_code[MAX_DS18x20][9];
    
    
    // ----------------------------------------------------------------------------
    //
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
       //TCNT0=0xE6;// Reinitialize Timer 0 value
    
       PORTD&=0b11000000;    // потушить все (биты всех знакомест "1" - для Общ.кат.)
    
       PORTA=~digits_PA[digit_out[cur_dig]]; // символ на экран
       PORTB=~digits_PB[digit_out[cur_dig]];
    
       if ((zpt_ON == 1) && (cur_dig == 1)) PORTB.4=0;  // запятая во втором разряде (нумерация нач. с нуля)	    
    
       PORTD |= ~(cursor[cur_dig]);  // засветить нужный бит (бит знакоместа в "0" - для Общ.кат.)
    
       cur_dig++; if (cur_dig > 2) cur_dig=0;
    }
    
    
    
    // ----------------------------------------------------------------------------
    void view_term(void) {
       unsigned char celie, drob, tmp;
       unsigned int temp, celie_tmp, drob_tmp;
    
    
       temp = (unsigned int) temperature;
    
       if (temperature>=0) {
           digit_out[0]=PROBEL;	   // первый символ (сотни) пустой
       } else {	    
           temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид
           digit_out[0]=MINUS;	    // и высветить знак минус (в дальнейшем атрибут отр.темп.)
            };
       //digit_out[3]=GRADUS;
       zpt_ON=1;
    
       celie_tmp = temp >> 4;			  // целая часть числа
       drob_tmp  = temp & 0x000F;		  // дробная часть числа с точностью 1/16 градуса
    
       drob  = (unsigned char) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса
    
       celie = (unsigned char) celie_tmp;  // я люблю явное преведение типов
    
       if (celie >= 100) {tmp=bin2bcd(celie-100); digit_out[0] = 1; } else { tmp=bin2bcd(celie); }   // вычислить целую часть
    
       if ((celie >= 100) || ((digit_out[0] == MINUS) && (celie >= 10))) { //  если больше 100,0 гр. или если темп. меньше -10 точность 1 гр.
           zpt_ON=0;
           digit_out[1] = tmp >> 4;    // десятки
           digit_out[2] = tmp & 0x0F;  // единицы
       }
    
       if ((digit_out[0] == MINUS) && (celie < 10)) { // если темп.меньше 0 и больше -10 точность 0,1 гр.
           digit_out[1] = celie; // единицы
           digit_out[2] = drob;  // дробная часть
       }
    
       if ((digit_out[0] == PROBEL) && (celie < 100)) { // если темп. меньше 100,0 гр и больше 0 гр точность 0,1 гр.
           if (tmp >> 4) digit_out[0] = tmp >> 4; // десятки - если десятков нет то и не показывать
           digit_out[1] = tmp & 0x0F;			 // единицы
           digit_out[2] = drob;				   // дробная часть
       }
    }  // -------------------------------------------------------------------------
    
    
    
    
    
    //================================== main =====================================
    void main(void) {
    unsigned char i, ds18x20_devices;
    
    // Input/Output Ports initialization
    // Port A initialization
    PORTA=0x00; // State2=T State1=0 State0=0
    DDRA=0x03;  // Func2=In Func1=Out Func0=Out
    
    // Port B initialization
    PORTB=0x00; // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    DDRB=0xFF; // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    
    // Port D initialization
    PORTD=0x3F;// State6=T State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
    DDRD=0xFF; // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    
    /*
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 3,906 kHz
    // Mode: Normal top=FFh
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    TCCR0A=0x00;
    TCCR0B=0x05;
    TCNT0=0xE6;
    OCR0A=0x00;
    OCR0B=0x00;
    */
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 62,500 kHz
    // Mode: Normal top=FFh
    // OC0A output: Disconnected
    // OC0B output: Disconnected
    TCCR0A=0x00;
    TCCR0B=0x03;
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;
    
    
    // Timer/Counter 1 initialization
    // Clock value: Timer1 Stopped
    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, INT1, Interrupt on any change on pins PCINT0-7: Off
    GIMSK=0x00;
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x02;
    
    // Universal Serial Interface initialization
    // Mode: Disabled
    USICR=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    ACSR=0x80;
    
    // 1 Wire Bus initialization
    w1_init();
    
    // Determine the number of DS18x20 devices connected to the 1 Wire bus
    ds18x20_devices=w1_search(0xf0,rom_code);
    
    // Global enable interrupts
    #asm("sei")
    
    // высветить на индикаторе F 'кол-во найденых устройств'
    digit_out[0]=SYMBOL_F;
    digit_out[1]=PROBEL;
    digit_out[2]=ds18x20_devices;
    
    // т.к. при первом чтении датчиков считывается мусор
    // первое чтение датчиков делаем в холостую
    if (ds18x20_devices >= 1) {
       for (i=0;i<ds18x20_devices;i++) {
    //        if (rom_code[i][0] == DS18B20_FAMILY_CODE){
    //            temperature=ds18b20_temperature(&rom_code[i][0]);
    //        }
           if (rom_code[i][0] == DS18S20_FAMILY_CODE){
               temperature=ds18s20_temperature(&rom_code[i][0]);
           }
           delay_ms(1000);
       }
    } else {
       delay_ms(2000);
    }
    
    
    // -------------------------------- рабочая часть -----------------------------------
    while (1) {
    
        if (ds18x20_devices >= 1) {  // если обнаружено больше одного датчика
    
    		    for (i=0;i<ds18x20_devices;) {
    				    if (rom_code[i][0] == DS18B20_FAMILY_CODE){
    						 temperature=ds18b20_temperature(&rom_code[i][0]);
    				    }
    				    if (rom_code[i][0] == DS18S20_FAMILY_CODE){
    						 temperature=ds18s20_temperature(&rom_code[i][0]);
    				    }
    				    if (temperature!=-9999) view_term();
    
    				    delay_ms(2000);
    				    i++;
    		    }
        }
    };// ----------------------------- рабочая часть (end) -----------------------------------
    
    
    
    } // =================================== end main =========================================
    
    
    
    
    //
    // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= The End -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    //
    

  5. Оригинальная разводка убогая и соответственно код из-за нее убогий. Зачем было распихивать пины сегментов на разные порты? UPD: Посмотрел плату из статьи - оригинально, конечно, но не всегда удобно.

×
×
  • Создать...