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

zalg

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

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

  • Посещение

Репутация

0 Обычный
  1. Т.е. последние 10 лет Вы не применяете продукцию "Интеграла"? А может что-то поменялось?
  2. Ну наверняка - это потому что нет постоянного спроса на их продукцию, а постоянного спроса нет, потому что нет доверия, в общем замкнутый круг, который нужно размыкать, для нормального развития. А вообще, у меня в силу специфики нет таких сроков, поэтому меня именно интересуют вопросы надежности и качества продукции
  3. В последнее время в процессе подбора компонентной базы для различных устройств и проектов я часто "залезаю" в каталог продукции ф. Интеграл, и он меня приятно удивляет. Во-первых достаточно широкий выбор продукции ( например в списке продукции специального назначения у них есть цифровой потенциометр, у остальных мировых производителей я видел только коммерческий вариант ), во-вторых много аналогов широко используемых западных микросхем ( sn54ac, act и т.д. ). От сюда возникает вопрос - можно ли ( и нужно ли) использовать продукцию фирмы "Интеграл" (integral.by)?? Мой начальник категорически протестует против этого, утверждая, что "наши" всегда будут делать хуже, чем запад, но я в это не верю.
  4. c8051f120 прерывания SMBus в Keil

    МК c8051f120, среда разработки Keil Обмен по SMBus ( i2c ) работает при опросе флага SI: while(1){ if( (SMB0CN & 0x08) == 0x08 ){ if( SMB0STA == 0x80 ){ i2c = SMB0DAT; printf( " i2c data = %X\n", i2c ); } if( SMB0STA == 0xA8 ){ SMB0DAT = 0xA5; } SMB0CN &= ~(0x08); } } При попытке перенести эти действия в прерывания, программа перестает работать, вернее просто не попадает в обработчик прерываний, что я определяю по косвенным признакам: например переменная temp не меняет своего значения Вот текст обработчика: void I2C_ISR( void ) interrupt 7 using 1 { if( SMB0STA == 0xA8 ){ SMB0DAT = 0xA5; } temp = 0x06; } И инициализация прерываний, которую я произвожу прямо перед основным циклом программы void Interrupts_Init() { IE = 0x88; //разрешить глоабльные прерывания и прерывания по Timer1 EIE1 = 0x02;//разрешить прерывания SMBus } Хочу заметить, что так же произвожу обмен по UART с помощью функции printf, может быть это как нибудь влияет
  5. Спасибо за отклик! Конденсатор емкостью 10 кФ. Проблема в том, что осциллограммы напряжения повторяют осциллограммы тока на конденсаторе. Я подозреваю, что это из-за влияния входного тракта осциллографа, но не уверен. Еще раз повторяю - 10 кФ. Опишу подробнее. Импульсный источник тока заряжает суперконденсатор. Всплески тока, которые производит ШИМ источника почему то повторяет напряжение на конденсаторе. Хотя по логике напряжение на конденсаторе представляет собой интеграл тока, соответственно не должно воспроизводить короткие импульсы
  6. Большая емкость

    Простите пожалуйста за может быть глупый вопрос, но сроки горят! Идет заряд конденсатора большой емкости с помощью импульсного источника тока. Напряжение на конденсаторе повторяет форму тока в цепи при измерении осциллографом. Вопрос - почему? Еще раз прошу прощения за чайничество.
  7. Здравствуйте уважаемые коллеги! Мне нужно реализовать зарядку конденсатора большой емкости большим постоянным током(15А) до небольшого напряжения(~2В). Приемлемо ли следующие решение: последовательно с конденсатором включить токосъемный резистор; схему на основе DC/DC switching convertor реализовать таким образом, чтобы напряжение на этом резисторе поддерживалось постоянным?
  8. stdint.h

    По мере освоения IAR узнал, что типы данных могут отличаться по размеру, в зависимости от компилятора и платформы, и что типы данных с фиксированным размером определены в файле stdint.h. Когда полез в него, то увидел там такую запись, например: /* Fixed size types. These are all optional. */ #ifdef __INT8_T_TYPE__ typedef __INT8_T_TYPE__ int8_t; typedef __UINT8_T_TYPE__ uint8_t; #endif /* __INT8_T_TYPE__ */ На сколько я понимаю, она определяет тип переменной размером 8 бит(со знаком и без знака соответственно), но вот не могу разобраться от куда берется тип __INT8_T_TYPE__. Хотелось бы разобраться, чтобы не оставалось недопонимания. И вообще следует ли пользоваться этим заголовочным файлом, или с таким же успехом можно определять свои типы, например так: typedef unsigned char uint8; // для 8-битных AVR Спасибо заранее.
  9. Добрый день! Недавно начал переходить с AVR Studio на IAR (соответственно с ассемблера на Си ) и возник такой вопрос. Если возникает какая то типовая промежуточная задача, для которой возможно есть библиотечная функция, поставляемая с компилятором. Как мне убедиться в этом, определить какая именно и в каком заголовочном файле она находится. Спасибо.
  10. AVR + Си

    До этого писал на ассемблере. Сейчас начал новый проект на AT90USB1286 и попутно изучать usb. Как то у меня все очень медленно продвигается. Я так понимаю сделать usb-устройство на ассемблере задача нетривиальная и решил, что пора переходить на Си, так как есть готовые библиотеки. Посоветуйте пожалуйста среду разработки и компилятор. И еще буду благодарен за полезные ресурсы по usb. (Пока читаю книгу Агурова "Интерфейс usb. Практика использования и программирования." и втыкаю в atmel'евские appnotes )
  11. ds18b20

    Спасибо за помощь, но оказывается дело было в датчике, поменял его и все хорошо заработало.
  12. ds18b20

    У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +85 С(0550h в первых двух считанных байтах, затем считывание прекращаю, подавая "ресет" ). Насколько я понял, так и должно быть, НО затем он начинает фиксировать изменения температуры относительно этого значения, как будто калибруется при подаче питания. И еще одна странность - младший бит байта 0 - всегда ноль, т.е. при нагреве (если коснуться датчика пальцами) температура начинает расти так - 0550h,0552h,0554h и т.д. Перепроверял все по нескольку раз, симулировал в Proteus - работает как надо, уже грешу на датчик. Может кто сталкивался? .include "m8535def.inc" .equ clk = 0 .equ data = 1 .equ load = 7 .def hexL = r16 ; Младший байт шестнадцатиричного слова .def hexH = r17 ; Старший байт шестнадцатиричного слова .def hexHH = r18 ; Самый старший байт шестнадцатиричного слова .def BCD0 = r22 ; BCD- разряды 2 и 1 .def BCD1 = r23 ; BCD- разряды 4 и 3 .def BCD2 = r24 ; BCD- разряды 6 и 5 .def BCD3 = r25 ; BCD- разряды 8 и 7 .def cnt = r19 ; Счетчик .def tmp1 = r20 ; Рабочий регистр ;-------------------------------------------------------------- .ORG 0x0 ;?????? ?????? ?? RESET rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM2_COMP ;TIM2_COMP Timer2 Compare Handler rjmp TIM2_OVF ; Timer2 Overflow Handler rjmp TIM1_CAPT ; Timer1 Capture Handler rjmp TIM1_COMPA ; Timer1 Compare A Handler rjmp TIM1_COMPB ; Timer1 Compare B Handler rjmp TIM1_OVF ; Timer1 Overflow Handler rjmp TIM0_OVF ; Timer0 Overflow Handler rjmp SPI_STC ; SPI Transfer Complete Handler rjmp USART_RXC ; USART RX Complete Handler rjmp USART_UDRE ; UDR Empty Handler rjmp USART_TXC ; USART TX Complete Handler rjmp ADC_ ; ADC Conversion Complete Handler rjmp EE_RDY ; EEPROM Ready Handler rjmp ANA_COMP ; Analog Comparator Handler rjmp TWSI ; Two-wire Serial Interface Handler rjmp EXT_INT2 ; IRQ2 Handler rjmp TIM0_COMP ; Timer0 Compare Handler rjmp SPM_RDY ; Store Program Memory Ready Handler RESET: ldi r16,high(RAMEND) ; Main program start out SPH,r16 ; Set Stack Pointer to top of RAM ldi r16,low(RAMEND) out SPL,r16 Start: rcall INIT_PORTS ;rcall INIT_UART ;rcall getc ;for test comunication - nullmodem ;rcall putc ;ldi r16, 0x80 ;out GICR, r16 ;out GIFR, r16 ;ldi r18, 0x01 ;ldi r19, 0x03 main: ;ttest3: ;sbic PinD,2 ;rjmp ttest3 rcall Init rcall SkipROM rcall ConvertT rcall Init rcall SkipROM rcall ReadScratchpad ;ldi r27,0x17 ;ldi r26,0x15 ;lsr r27 ;ror r26 mov r18,r27 mov r19,r27 andi r18,0x0f andi r19,0xf0 lsr r19 lsr r19 lsr r19 lsr r19 mov r16,r19 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r18 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r20,r26 mov r21,r26 andi r20,0x0f andi r21,0xf0 lsr r21 lsr r21 lsr r21 lsr r21 mov r16,r19 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r18 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT ttest: rjmp ttest ;rcall DataOut rjmp main /*---------------------------Write Time Slots----------------------------*/ write0: in r16,DDRC ori r16,0x04; !!!?????????!! out DDRC, r16 cbi PortC,2 ldi r16, 0x23;70us rcall TmrDelay in r16,DDRC andi r16,0xfb out DDRC, r16; release line rcall delay_15us ret write1: in r16,DDRC ori r16,0x04 out DDRC, r16 cbi PortC,2 ldi r16, 0x03; 6us rcall delay in r16,DDRC andi r16,0xfb out DDRC, r16; release line ldi r16, 0x23;70us rcall TmrDelay ret /*------------------------Read Time Slots-------------------------------*/ read: in r16,DDRC ori r16,0x04 out DDRC, r16 cbi PortC,2 ldi r16, 0x02; 4us rcall delay in r16,DDRC andi r16,0xfb out DDRC, r16; release line ldi r16, 0x02; 4us rcall delay sbic PinC,2 ori r22,0x80 ldi r16, 0x30; 50us rcall TmrDelay ret read_1byte: ldi r21,0x08 ldi r22,0x00 loop_1byte: lsr r22 rcall read dec r21 cpi r21,0x00 brne loop_1byte ret /*------------------------------------------------------------------------*/ Init: in r16,DDRC ori r16,0x04; !!!?????????!! out DDRC, r16 ldi r16,0xf0;480us cbi PortC,2 rcall TmrDelay; Reset pulse in r16,DDRC andi r16,0xfb; !!!?????????!! out DDRC, r16; release line ldi r16,0x28;80us rcall TmrDelay sbic PinC,2;Presence pulse rcall Error ldi r16,0xc8;400us rcall TmrDelay sbis PinC,2;check if the sensor has released line rcall Error ret Send: ldi r21,0x08 start1: ror r20 brcs wr rcall write0 dec r21 cpi r21, 0x00 breq end1 rjmp start1 wr: rcall write1 dec r21 cpi r21, 0x00 breq end1 rjmp start1 end1: ret SkipROM:;CCh ldi r20,0xcc rcall Send ret ReadScratchpad:;BEh ldi r20,0xBE rcall Send reading: rcall read_1byte mov r26,r22 rcall read_1byte mov r27,r22 rcall Init ret ConvertT:;44h ldi r20,0x44 rcall Send in r16,DDRB ori r16,0x08 out DDRB, r16 cbi PortB,3;switch LED ldi r22,0x00 converting: rcall read cpi r22,0x00 breq converting in r16,DDRB andi r16,0xf7 out DDRB, r16 cbi PortB,3;turn off LED ret ConfTmr0: ldi r17,0x02 out TIMSK, r17;Compare Match interrupt is enabled out OCR0,r16 sei ldi r17,0x0a out TCCR0,r17;CTC Mode, T=2us ret TmrDelay: subi r16,6 rcall ConfTmr0 ldi r18,0x00 loop9: cpi r18, 0xff brne loop9 cli nop ;correction nop nop ret Error: go: ldi r17,0x00 ldi r16, 0x08 out DDRB, r16 cbi PortB,3;switch LED rjmp go ret delay: loop1: dec r16 cpi r16,0x00 nop brne loop1 ret delay_15us: ldi r16, 0x06 loop_15us: dec r16 cpi r16,0x00 nop brne loop1 ret /*---------functions for debugging-----------------------------*/ switch_LED: loop_LED: ldi r16, 0x08 out DDRB, r16 cbi PortB,3;switch LED rjmp loop_LED ret CIFRA: cpi r16, 0x00 breq L0 cpi r16, 0x01 breq L1 cpi r16, 0x02 breq L2 cpi r16, 0x03 breq L3 cpi r16, 0x04 breq L4 cpi r16, 0x05 breq L5 cpi r16, 0x06 breq L6 cpi r16, 0x07 breq L7 cpi r16, 0x08 breq L8 cpi r16, 0x09 breq L9 cpi r16, 0x0A breq LA cpi r16, 0x0B breq LB cpi r16, 0x0C breq LC cpi r16, 0x0D breq L0D cpi r16, 0x0E breq LE cpi r16, 0x0F breq LF L0: ldi r16,0xC0 ret L1: ldi r16,0xF9 ret L2: ldi r16,0xA4 ret L3: ldi r16,0xB0 ret L4: ldi r16,0x99 ret L5: ldi r16,0x92 ret L6: ldi r16,0x82 ret L7: ldi r16,0xF8 ret L8: ldi r16,0x80 ret L9: ldi r16,0x90 ret LA: ldi r16,0x88 ret LB: ldi r16,0x83 ret LC: ldi r16,0xC6 ret L0D: ldi r16,0xA1 ret LE: ldi r16,0x86 ret LF: ldi r16,0x8E ret CIFERBLAT: lsl r16 brcs SS1 cbi PortC, data cbi PortC, clk sbi PortC, clk rjmp End_SS SS1: sbi PortC, data cbi PortC, clk sbi PortC, clk End_SS: dec r17 cpi r17, 0x00 brne CIFERBLAT ret HexBCD: ; xxxx (Hex) -> 0abcde (BCD) rcall Div10 ; hexH:hexL / 10, ??????? - ? tmp1 mov BCD0,tmp1 ; ????????? - ? hexH:hexL, tmp1 = ?????? 1 rcall Div10 ; ??????? = ?????? 2 swap tmp1 ; ?????? 2 – ? ??????? ???????? or BCD0,tmp1 ; ?????????? ??????? 2 ? 1 ? BCD0 rcall Div10 ; ??????? = ?????? 3 mov BCD1,tmp1 ; ? BCD1 rcall Div10 ; ??????? = ?????? 4 swap tmp1 ; ?????? 4 – ? ??????? ???????? or BCD1,tmp1 ; ?????????? ??????? 4 ? 3 ? BCD1 rcall Div10 ; ??????? = ?????? 5 mov BCD2,tmp1 ; ? BCD2 rcall Div10 ; ??????? = ?????? 6 swap tmp1 ; ?????? 6 – ? ??????? ???????? or BCD2,tmp1 ; ?????????? ??????? 6 ? 5 ? BCD2 rcall Div10 ; ??????? = ?????? 7 mov BCD3,tmp1 ; ? BCD3 rcall Div10 ; ??????? = ?????? 8 swap tmp1 ; ?????? 8 – ? ??????? ???????? or BCD3,tmp1 ; ?????????? ??????? 6 ? 5 ? BCD3 ret Div10: ; ??????? hexHH:hexH:hexL ?? 10, ; ????????? – ? hexHH:hexH:hexL, ??????? - ? tmp1 clr tmp1 lsl hexL rol hexH rol hexHH; rol tmp1 ; ??????? ??????? ???? ???????? ?? 10 lsl hexL ; ????? ???? ? ?????????? rol hexH ; ?????? 0 rol hexHH rol tmp1 lsl hexL rol hexH rol hexHH rol tmp1 ldi cnt,21 ; ??????? ??? ?????????? 21 ????????s Loop10: lsl hexL ; ????? ???????? ????? ?? 1 ?????? rol hexH rol hexHH rol tmp1 ; ???????????? ? tmp1 subi tmp1,10 ; ????????: ???????????? > 10 ? brlo HB1 ; ???????, ???? ??? inc hexL ; ??????????? ??????? ??????? ?? 1 rjmp HB2 HB1: subi tmp1,-10 ; ????????? ???????? ???????? HB2: dec cnt ; ?????????????? ??????? ???????? brne Loop10 ; ???????, ???? ??? ?? ??? ??????? ret DataOut: lsl r27 lsl r27 lsl r27 lsl r27 lsl r27 lsr r26 lsr r26 lsr r26 or r26,r27 mov r16,r26 lsr r16 ldi r17,0x00 ldi r18,0x00 rcall HexBCD ldi r16,0x00 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r23 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r18,r22 mov r19,r22 andi r18,0x0f andi r19,0xf0 lsr r19 lsr r19 lsr r19 lsr r19 mov r16,r19 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r18 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT ;ttest: ;rjmp ttest ret /*-------------------------------------------------------------*/ INIT_UART: ldi r16,00 out UBRRH,r16 ldi r16,25 out UBRRL,r16 ldi r16,24 ; UART for TX and RX out UCSRB,r16 ldi r16,0x86 out UCSRC,r16 ret getc: sbis UCSRA,RXC rjmp getc in r16,UDR ret putc: sbis UCSRA,UDRE rjmp putc out UDR,r16 ret INIT_PORTS: ldi r16, 0x00 out DDRA, r16 ;??? ????? ldi r16, 0x00 out DDRB, r16 ldi r16, 0x03 out DDRC, r16 ldi r16, 0x10 ;??? LCD ???????, ??? LED ???????? ?? 0, 2->TXD out DDRD, r16 ret EXT_INT0: ; IRQ0 Handler+- reti EXT_INT1: ; IRQ1 Handler reti main2: reti TIM2_COMP: reti ; Timer2 Compare Handler TIM2_OVF: reti ; Timer2 Overflow Handler TIM1_CAPT: reti ; Timer1 Capture Handler TIM1_COMPA: reti ; Timer1 Compare A Handler TIM1_COMPB: reti ; Timer1 Compare B Handler TIM1_OVF: reti ; Timer1 Overflow Handler TIM0_OVF: reti; Timer0 Overflow Handler SPI_STC: reti ; SPI Transfer Complete Handler USART_RXC: reti ; USART RX Complete Handler USART_UDRE: reti ; UDR Empty Handler USART_TXC: reti ; USART TX Complete Handler ADC_: reti EE_RDY: reti ; EEPROM Ready Handler ANA_COMP: reti ; Analog Comparator Handler TWSI: reti ; Two-wire Serial Interface Handler EXT_INT2: reti ; IRQ2 Handler TIM0_COMP: ldi r17,0x00 out TCCR0,r17 ldi r17,0x00 out TIMSK, r17 ldi r17,0x00 out TCNT0,r17;reset timer ldi r18, 0xff reti ; Timer0 Compare Handler SPM_RDY: reti ; Store Program Memory Ready Handler
  13. Опыт программирования у меня не большой, так что замечаниям по поводу оформления кода буду благодарен. .include "m8535def.inc" .equ clk = 0 .equ data = 1 .equ load = 7 .def hexL = r16 ; Младший байт шестнадцатиричного слова .def hexH = r17 ; Старший байт шестнадцатиричного слова .def hexHH = r18 ; Самый старший байт шестнадцатиричного слова .def BCD0 = r22 ; BCD- разряды 2 и 1 .def BCD1 = r23 ; BCD- разряды 4 и 3 .def BCD2 = r24 ; BCD- разряды 6 и 5 .def BCD3 = r25 ; BCD- разряды 8 и 7 .def cnt = r19 ; Счетчик .def tmp1 = r20 ; Рабочий регистр ;-------------------------------------------------------------- .ORG 0x0 ;?????? ?????? ?? RESET rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM2_COMP ;TIM2_COMP Timer2 Compare Handler rjmp TIM2_OVF ; Timer2 Overflow Handler rjmp TIM1_CAPT ; Timer1 Capture Handler rjmp TIM1_COMPA ; Timer1 Compare A Handler rjmp TIM1_COMPB ; Timer1 Compare B Handler rjmp TIM1_OVF ; Timer1 Overflow Handler rjmp TIM0_OVF ; Timer0 Overflow Handler rjmp SPI_STC ; SPI Transfer Complete Handler rjmp USART_RXC ; USART RX Complete Handler rjmp USART_UDRE ; UDR Empty Handler rjmp USART_TXC ; USART TX Complete Handler rjmp ADC_ ; ADC Conversion Complete Handler rjmp EE_RDY ; EEPROM Ready Handler rjmp ANA_COMP ; Analog Comparator Handler rjmp TWSI ; Two-wire Serial Interface Handler rjmp EXT_INT2 ; IRQ2 Handler rjmp TIM0_COMP ; Timer0 Compare Handler rjmp SPM_RDY ; Store Program Memory Ready Handler RESET: ldi r16,high(RAMEND) ; Main program start out SPH,r16 ; Set Stack Pointer to top of RAM ldi r16,low(RAMEND) out SPL,r16 Start: rcall INIT_PORTS ;rcall INIT_UART ;rcall getc ;for test comunication - nullmodem ;rcall putc ;ldi r16, 0x80 ;out GICR, r16 ;out GIFR, r16 ;ldi r18, 0x01 ;ldi r19, 0x03 main: ;ttest3: ;sbic PinD,2 ;rjmp ttest3 rcall Init rcall SkipROM rcall ConvertT rcall Init rcall SkipROM rcall ReadScratchpad ;ldi r27,0x17 ;ldi r26,0x15 ;lsr r27 ;ror r26 mov r18,r27 mov r19,r27 andi r18,0x0f andi r19,0xf0 lsr r19 lsr r19 lsr r19 lsr r19 mov r16,r19 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r18 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r20,r26 mov r21,r26 andi r20,0x0f andi r21,0xf0 lsr r21 lsr r21 lsr r21 lsr r21 mov r16,r19 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r18 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT ttest: rjmp ttest ;rcall DataOut rjmp main /*---------------------------Write Time Slots----------------------------*/ write0: in r16,DDRC ori r16,0x04; !!!?????????!! out DDRC, r16 cbi PortC,2 ldi r16, 0x23;70us rcall TmrDelay in r16,DDRC andi r16,0xfb out DDRC, r16; release line rcall delay_15us ret write1: in r16,DDRC ori r16,0x04 out DDRC, r16 cbi PortC,2 ldi r16, 0x03; 6us rcall delay in r16,DDRC andi r16,0xfb out DDRC, r16; release line ldi r16, 0x23;70us rcall TmrDelay ret /*------------------------Read Time Slots-------------------------------*/ read: in r16,DDRC ori r16,0x04 out DDRC, r16 cbi PortC,2 ldi r16, 0x02; 4us rcall delay in r16,DDRC andi r16,0xfb out DDRC, r16; release line ldi r16, 0x02; 4us rcall delay sbic PinC,2 ori r22,0x80 ldi r16, 0x30; 50us rcall TmrDelay ret read_1byte: ldi r21,0x08 ldi r22,0x00 loop_1byte: lsr r22 rcall read dec r21 cpi r21,0x00 brne loop_1byte ret /*------------------------------------------------------------------------*/ Init: in r16,DDRC ori r16,0x04; !!!?????????!! out DDRC, r16 ldi r16,0xf0;480us cbi PortC,2 rcall TmrDelay; Reset pulse in r16,DDRC andi r16,0xfb; !!!?????????!! out DDRC, r16; release line ldi r16,0x28;80us rcall TmrDelay sbic PinC,2;Presence pulse rcall Error ldi r16,0xc8;400us rcall TmrDelay sbis PinC,2;check if the sensor has released line rcall Error ret Send: ldi r21,0x08 start1: ror r20 brcs wr rcall write0 dec r21 cpi r21, 0x00 breq end1 rjmp start1 wr: rcall write1 dec r21 cpi r21, 0x00 breq end1 rjmp start1 end1: ret SkipROM:;CCh ldi r20,0xcc rcall Send ret ReadScratchpad:;BEh ldi r20,0xBE rcall Send reading: rcall read_1byte mov r26,r22 rcall read_1byte mov r27,r22 rcall Init ret ConvertT:;44h ldi r20,0x44 rcall Send in r16,DDRB ori r16,0x08 out DDRB, r16 cbi PortB,3;switch LED ldi r22,0x00 converting: rcall read cpi r22,0x00 breq converting in r16,DDRB andi r16,0xf7 out DDRB, r16 cbi PortB,3;turn off LED ret ConfTmr0: ldi r17,0x02 out TIMSK, r17;Compare Match interrupt is enabled out OCR0,r16 sei ldi r17,0x0a out TCCR0,r17;CTC Mode, T=2us ret TmrDelay: subi r16,6 rcall ConfTmr0 ldi r18,0x00 loop9: cpi r18, 0xff brne loop9 cli nop ;correction nop nop ret Error: go: ldi r17,0x00 ldi r16, 0x08 out DDRB, r16 cbi PortB,3;switch LED rjmp go ret delay: loop1: dec r16 cpi r16,0x00 nop brne loop1 ret delay_15us: ldi r16, 0x06 loop_15us: dec r16 cpi r16,0x00 nop brne loop1 ret /*---------functions for debugging-----------------------------*/ switch_LED: loop_LED: ldi r16, 0x08 out DDRB, r16 cbi PortB,3;switch LED rjmp loop_LED ret CIFRA: cpi r16, 0x00 breq L0 cpi r16, 0x01 breq L1 cpi r16, 0x02 breq L2 cpi r16, 0x03 breq L3 cpi r16, 0x04 breq L4 cpi r16, 0x05 breq L5 cpi r16, 0x06 breq L6 cpi r16, 0x07 breq L7 cpi r16, 0x08 breq L8 cpi r16, 0x09 breq L9 cpi r16, 0x0A breq LA cpi r16, 0x0B breq LB cpi r16, 0x0C breq LC cpi r16, 0x0D breq L0D cpi r16, 0x0E breq LE cpi r16, 0x0F breq LF L0: ldi r16,0xC0 ret L1: ldi r16,0xF9 ret L2: ldi r16,0xA4 ret L3: ldi r16,0xB0 ret L4: ldi r16,0x99 ret L5: ldi r16,0x92 ret L6: ldi r16,0x82 ret L7: ldi r16,0xF8 ret L8: ldi r16,0x80 ret L9: ldi r16,0x90 ret LA: ldi r16,0x88 ret LB: ldi r16,0x83 ret LC: ldi r16,0xC6 ret L0D: ldi r16,0xA1 ret LE: ldi r16,0x86 ret LF: ldi r16,0x8E ret CIFERBLAT: lsl r16 brcs SS1 cbi PortC, data cbi PortC, clk sbi PortC, clk rjmp End_SS SS1: sbi PortC, data cbi PortC, clk sbi PortC, clk End_SS: dec r17 cpi r17, 0x00 brne CIFERBLAT ret HexBCD: ; xxxx (Hex) -> 0abcde (BCD) rcall Div10 ; hexH:hexL / 10, ??????? - ? tmp1 mov BCD0,tmp1 ; ????????? - ? hexH:hexL, tmp1 = ?????? 1 rcall Div10 ; ??????? = ?????? 2 swap tmp1 ; ?????? 2 – ? ??????? ???????? or BCD0,tmp1 ; ?????????? ??????? 2 ? 1 ? BCD0 rcall Div10 ; ??????? = ?????? 3 mov BCD1,tmp1 ; ? BCD1 rcall Div10 ; ??????? = ?????? 4 swap tmp1 ; ?????? 4 – ? ??????? ???????? or BCD1,tmp1 ; ?????????? ??????? 4 ? 3 ? BCD1 rcall Div10 ; ??????? = ?????? 5 mov BCD2,tmp1 ; ? BCD2 rcall Div10 ; ??????? = ?????? 6 swap tmp1 ; ?????? 6 – ? ??????? ???????? or BCD2,tmp1 ; ?????????? ??????? 6 ? 5 ? BCD2 rcall Div10 ; ??????? = ?????? 7 mov BCD3,tmp1 ; ? BCD3 rcall Div10 ; ??????? = ?????? 8 swap tmp1 ; ?????? 8 – ? ??????? ???????? or BCD3,tmp1 ; ?????????? ??????? 6 ? 5 ? BCD3 ret Div10: ; ??????? hexHH:hexH:hexL ?? 10, ; ????????? – ? hexHH:hexH:hexL, ??????? - ? tmp1 clr tmp1 lsl hexL rol hexH rol hexHH; rol tmp1 ; ??????? ??????? ???? ???????? ?? 10 lsl hexL ; ????? ???? ? ?????????? rol hexH ; ?????? 0 rol hexHH rol tmp1 lsl hexL rol hexH rol hexHH rol tmp1 ldi cnt,21 ; ??????? ??? ?????????? 21 ????????s Loop10: lsl hexL ; ????? ???????? ????? ?? 1 ?????? rol hexH rol hexHH rol tmp1 ; ???????????? ? tmp1 subi tmp1,10 ; ????????: ???????????? > 10 ? brlo HB1 ; ???????, ???? ??? inc hexL ; ??????????? ??????? ??????? ?? 1 rjmp HB2 HB1: subi tmp1,-10 ; ????????? ???????? ???????? HB2: dec cnt ; ?????????????? ??????? ???????? brne Loop10 ; ???????, ???? ??? ?? ??? ??????? ret DataOut: lsl r27 lsl r27 lsl r27 lsl r27 lsl r27 lsr r26 lsr r26 lsr r26 or r26,r27 mov r16,r26 lsr r16 ldi r17,0x00 ldi r18,0x00 rcall HexBCD ldi r16,0x00 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r23 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r18,r22 mov r19,r22 andi r18,0x0f andi r19,0xf0 lsr r19 lsr r19 lsr r19 lsr r19 mov r16,r19 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT mov r16,r18 ldi r17,0x08 rcall CIFRA rcall CIFERBLAT ;ttest: ;rjmp ttest ret /*-------------------------------------------------------------*/ INIT_UART: ldi r16,00 out UBRRH,r16 ldi r16,25 out UBRRL,r16 ldi r16,24 ; UART for TX and RX out UCSRB,r16 ldi r16,0x86 out UCSRC,r16 ret getc: sbis UCSRA,RXC rjmp getc in r16,UDR ret putc: sbis UCSRA,UDRE rjmp putc out UDR,r16 ret INIT_PORTS: ldi r16, 0x00 out DDRA, r16 ;??? ????? ldi r16, 0x00 out DDRB, r16 ldi r16, 0x03 out DDRC, r16 ldi r16, 0x10 ;??? LCD ???????, ??? LED ???????? ?? 0, 2->TXD out DDRD, r16 ret EXT_INT0: ; IRQ0 Handler+- reti EXT_INT1: ; IRQ1 Handler reti main2: reti TIM2_COMP: reti ; Timer2 Compare Handler TIM2_OVF: reti ; Timer2 Overflow Handler TIM1_CAPT: reti ; Timer1 Capture Handler TIM1_COMPA: reti ; Timer1 Compare A Handler TIM1_COMPB: reti ; Timer1 Compare B Handler TIM1_OVF: reti ; Timer1 Overflow Handler TIM0_OVF: reti; Timer0 Overflow Handler SPI_STC: reti ; SPI Transfer Complete Handler USART_RXC: reti ; USART RX Complete Handler USART_UDRE: reti ; UDR Empty Handler USART_TXC: reti ; USART TX Complete Handler ADC_: reti EE_RDY: reti ; EEPROM Ready Handler ANA_COMP: reti ; Analog Comparator Handler TWSI: reti ; Two-wire Serial Interface Handler EXT_INT2: reti ; IRQ2 Handler TIM0_COMP: ldi r17,0x00 out TCCR0,r17 ldi r17,0x00 out TIMSK, r17 ldi r17,0x00 out TCNT0,r17;reset timer ldi r18, 0xff reti ; Timer0 Compare Handler SPM_RDY: reti ; Store Program Memory Ready Handler
  14. У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +85 С(0550h в первых двух считанных байтах, затем считывание прекращаю, подавая "ресет" ). Насколько я понял, так и должно быть, НО затем он начинает фиксировать изменения температуры относительно этого значения, как будто калибруется при подаче питания. И еще одна странность - младший бит байта 0 - всегда ноль, т.е. при нагреве (если коснуться датчика пальцами) температура начинает расти так - 0550h,0552h,0554h и т.д. Перепроверял все по нескольку раз, симулировал в Proteus - работает как надо, уже грешу на датчик. Может кто сталкивался?
×
×
  • Создать...