Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 14:37:56
Друг Кота
Карма: 67
Рейтинг сообщений: 1062
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19855 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Так а с чего вы взяли, что сторож не работает? Может, он работает — просто вы не замечаете? Сложно разобраться в проге по 3-м кускам кода.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 14:43:27
Грызет канифоль
Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36 Сообщений: 256 Откуда: Волгоград
Рейтинг сообщения:0
Ну с того что когда ресетит МК, то видно как LED моргает. Есть же строчка
LED = 1; delay_ms(25); LED = 0; // когда контроллер спит, строж. таймер работает как надо, тому подтверждение работа этого светодиода (кратковременное моргание раз в 4 секунды)
А в основном цикле просто горит LED постоянно, что указывает на то, что МК не ресетится. В осн. цикле стоит задержка несколько секунд перед включением светодиода (в первом посте не указал)
// Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; }
// External Interrupt(s) initialization // INT0: Off // INT1: On // INT1 Mode: Low level // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x02; EIFR=0x02; PCICR=0x00;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; DIDR1=0x00;
// ADC initialization // ADC Clock frequency: 15,625 kHz // ADC Voltage Reference: Int., cap. on AREF // ADC Auto Trigger Source: ADC Stopped // Only the 8 most significant bits of // the AD conversion result are used // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On // ADC4: On, ADC5: On DIDR0=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86;
SMCR = 0b00000101; // Power-down Mode Страница 43 мануала ATmega48 #asm("sleep"); //Вводит контроллер в режим энергосбережения // Просыпаемся от прерыванием INT1 и сразу на обработчик
while (1) { delay_ms(2000); // Ждем чтобы разрядился конденсатор
// Если сеть 220VAC есть, то засыпаем if (LineCtr == 0) { BOOSTER_OFF; LED = 0; main(); }
// Если пропала сеть 220VAC if (LineCtr == 1) { // Первое значение batU берется из обработчика (сюда по-другому и не попасть) if (batU >= 148 && LineCtr == 1 && PIND.3 == 1) { ctr = 20; batU = 0; while(ctr) // цикл из 20 измерений {ctr--; batU = batU + read_adc(2);} batU = batU / 20; // вычисляем среднее
BOOSTER_ON; delay_ms(500); } else main(); } } }
// External Interrupt 1 service routine // В прерывании строжевой таймер не работает (?) interrupt [EXT_INT1] void ext_int1_isr(void) { BOOSTER_OFF;
// Запускаем функцию контроля за зарядом АКБ //******************************************************************* ctr = 20; batU = 0; while(ctr) // цикл из 20 измерений {ctr--; batU = batU + read_adc(2);} batU = batU / 20; // вычисляем среднее
/* Вычисление делителя на контроль напряжение АКБ Коэф. деления = 13.1V / 0.833V = 15,726 Опорное напряжение (измеренное) = 1.100V Таким образом разрешение АЦП = 1.100 / 256 = 4,297 mV Для получения нижней границы заряда в 10V нужно 10V / 15.726 = 636 mV на АЦП, или ее значения 636 mV / 4.297 = 148 Для получения 13.4V нужно значение АЦП = 198*/
// Если напряжение на АКБ меньше 13.4V, то заряжаем if(batU <= 207) {BD140 = 1; LED = 0;} // Включаем заряд АКБ else {BD140 = 0; LED = 0;} // Выключаем заряд АКБ delay_ms(500); //******************************************************************* }
стало интересно-почему так,погуглил-почитал,после повер-доун проц долго просыпается,по идее пваш проц должен проснуться от сторожевого таймера но этого не происходит,значит както отключается,как? нашел похожую проблему http://530.ru/wwwboards/mcontrol/2233/messages/673767.shtml
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 14:51:39
Друг Кота
Карма: 67
Рейтинг сообщений: 1062
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19855 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Кажется, я начал доезжать на своём бронепоезде. Без внешнего прерывания МК засыпает, и через 4 секунды его ресетит сторож? После ресета светодиод вспыхивает на 25 мс и гаснет. Без внешнего прерывания так продолжается бесконечно долго. Правильно? НО! Если во время сна дёрнуть прерыванием, то после его обработки МК зависает в основном цикле с зажжёным светодидом, и МК не ресетится? Ассемблерный файл смотрели? Может, компилятор где-то что-то отключил? Фьюз сторожа выставлен?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 15:01:24
Друг Кота
Карма: 67
Рейтинг сообщений: 1062
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19855 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
VNN84 писал(а):
Фьюз WDTON выставлен.
В смысле, запрограммирован? Т.е. работает по нижней строчке таблицы?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 15:07:05
Грызет канифоль
Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36 Сообщений: 256 Откуда: Волгоград
Рейтинг сообщения:0
Я уже с этой проблемой неделю бьюсь, уже перепробовал все ))). Вот и решил узнать в форуме, может я в упор не вижу ошибку.
Для чего это все: без сторожа МК бывает виснет из-за внешних помех и не реагирует вообще, а такого допускать совсем нельзя, ибо схема (аварийное питание) пойдет на монтаж и потом проблемно будет ее от туда доставать.
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 15:13:29
Друг Кота
Карма: 67
Рейтинг сообщений: 1062
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19855 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Посмотрите ассемблерный файл. Не ресетит ли сторож delay_ms или ещё кто.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 15:14:50
Грызет канифоль
Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36 Сообщений: 256 Откуда: Волгоград
Рейтинг сообщения:0
СПС. Попробую. Но ассемблер уже хорошенько подзабыл )))
Спойлер
Код:
;CodeVisionAVR C Compiler V2.05.0 Professional ;(C) Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. ;http://www.hpinfotech.com
;Chip type : ATmega48PA ;Program type : Application ;Clock frequency : 1,000000 MHz ;Memory model : Small ;Optimize for : Size ;(s)printf features : int, width ;(s)scanf features : int, width ;External RAM size : 0 ;Data Stack size : 128 byte(s) ;Heap size : 0 byte(s) ;Promote 'char' to 'int' : Yes ;'char' is unsigned : Yes ;8 bit enums : Yes ;global 'const' stored in FLASH: No ;Enhanced core instructions : On ;Smart register allocation : On ;Automatic register allocation : On
.CSEG ; 0000 0018 #asm("cli") ; 0000 0019 #asm("wdr") ; 0000 001A /* Clear WDRF in MCUSR */ ; 0000 001B MCUSR &= ~(1<<WDRF); ; 0000 001C /* Write logical one to WDCE and WDE */ ; 0000 001D /* Keep old prescaler setting to prevent unintentional time-out */ ; 0000 001E WDTCSR |= (1<<WDCE) | (1<<WDE); ; 0000 001F /* Turn off WDT */ ; 0000 0020 WDTCSR = 0x00; ; 0000 0021 #asm("sei") ; 0000 0022 } ; ;void WDT_init() ; 0000 0025 { ; 0000 0026 // Watchdog Timer initialization ; 0000 0027 // Watchdog Timer Prescaler: OSC/512k ; 0000 0028 // Watchdog Timer interrupt: Off ; 0000 0029 #pragma optsize- ; 0000 002A #asm("wdr") ; 0000 002B WDTCSR=0x38; ; 0000 002C WDTCSR=0x28; ; 0000 002D #ifdef _OPTIMIZE_SIZE_ ; 0000 002E #pragma optsize+ ; 0000 002F #endif ; 0000 0030 } ; ;// Read the 8 most significant bits ;// of the AD conversion result ;unsigned char read_adc(unsigned char adc_input) ; 0000 0035 { _read_adc: ; 0000 0036 ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); ; adc_input -> Y+0 LD R30,Y ORI R30,LOW(0xE0) STS 124,R30 ; 0000 0037 // Delay needed for the stabilization of the ADC input voltage ; 0000 0038 delay_us(10); __DELAY_USB 3 ; 0000 0039 // Start the AD conversion ; 0000 003A ADCSRA|=0x40; LDS R30,122 ORI R30,0x40 STS 122,R30 ; 0000 003B // Wait for the AD conversion to complete ; 0000 003C while ((ADCSRA & 0x10)==0); _0x3: LDS R30,122 ANDI R30,LOW(0x10) BREQ _0x3 ; 0000 003D ADCSRA|=0x10; LDS R30,122 ORI R30,0x10 STS 122,R30 ; 0000 003E return ADCH; LDS R30,121 ADIW R28,1 RET ; 0000 003F } ; ;void main(void) ; 0000 0042 { _main: ; 0000 0043 // Crystal Oscillator division factor: 3 ; 0000 0044 #pragma optsize- ; 0000 0045 CLKPR=0x80; LDI R30,LOW(128) STS 97,R30 ; 0000 0046 CLKPR=0x03; LDI R30,LOW(3) STS 97,R30 ; 0000 0047 #ifdef _OPTIMIZE_SIZE_ ; 0000 0048 #pragma optsize+ ; 0000 0049 #endif ; 0000 004A ; 0000 004B PORTB=0x00; DDRB=0b00000011; LDI R30,LOW(0) OUT 0x5,R30 LDI R30,LOW(3) OUT 0x4,R30 ; 0000 004C PORTC=0x00; DDRC=0x10; LDI R30,LOW(0) OUT 0x8,R30 LDI R30,LOW(16) OUT 0x7,R30 ; 0000 004D PORTD=0b00001000; DDRD=0b00100000; LDI R30,LOW(8) OUT 0xB,R30 LDI R30,LOW(32) OUT 0xA,R30 ; 0000 004E ; 0000 004F // Timer/Counter 0 initialization ; 0000 0050 // Clock source: System Clock ; 0000 0051 // Clock value: Timer 0 Stopped ; 0000 0052 // Mode: Normal top=0xFF ; 0000 0053 // OC0A output: Disconnected ; 0000 0054 // OC0B output: Disconnected ; 0000 0055 TCCR0A=0x00; LDI R30,LOW(0) OUT 0x24,R30 ; 0000 0056 TCCR0B=0x00; OUT 0x25,R30 ; 0000 0057 TCNT0=0x00; OUT 0x26,R30 ; 0000 0058 OCR0A=0x00; OUT 0x27,R30 ; 0000 0059 OCR0B=0x00; OUT 0x28,R30 ; 0000 005A ; 0000 005B // Timer/Counter 1 initialization ; 0000 005C // Clock source: System Clock ; 0000 005D // Clock value: Timer1 Stopped ; 0000 005E // Mode: Normal top=0xFFFF ; 0000 005F // OC1A output: Discon. ; 0000 0060 // OC1B output: Discon. ; 0000 0061 // Noise Canceler: Off ; 0000 0062 // Input Capture on Falling Edge ; 0000 0063 // Timer1 Overflow Interrupt: Off ; 0000 0064 // Input Capture Interrupt: Off ; 0000 0065 // Compare A Match Interrupt: Off ; 0000 0066 // Compare B Match Interrupt: Off ; 0000 0067 TCCR1A=0x00; STS 128,R30 ; 0000 0068 TCCR1B=0x00; STS 129,R30 ; 0000 0069 TCNT1H=0x00; STS 133,R30 ; 0000 006A TCNT1L=0x00; STS 132,R30 ; 0000 006B ICR1H=0x00; STS 135,R30 ; 0000 006C ICR1L=0x00; STS 134,R30 ; 0000 006D OCR1AH=0x00; STS 137,R30 ; 0000 006E OCR1AL=0x00; STS 136,R30 ; 0000 006F OCR1BH=0x00; STS 139,R30 ; 0000 0070 OCR1BL=0x00; STS 138,R30 ; 0000 0071 ; 0000 0072 // Timer/Counter 2 initialization ; 0000 0073 // Clock source: System Clock ; 0000 0074 // Clock value: Timer2 Stopped ; 0000 0075 // Mode: Normal top=0xFF ; 0000 0076 // OC2A output: Disconnected ; 0000 0077 // OC2B output: Disconnected ; 0000 0078 ASSR=0x00; STS 182,R30 ; 0000 0079 TCCR2A=0x00; STS 176,R30 ; 0000 007A TCCR2B=0x00; STS 177,R30 ; 0000 007B TCNT2=0x00; STS 178,R30 ; 0000 007C OCR2A=0x00; STS 179,R30 ; 0000 007D OCR2B=0x00; STS 180,R30 ; 0000 007E ; 0000 007F // External Interrupt(s) initialization ; 0000 0080 // INT0: Off ; 0000 0081 // INT1: On ; 0000 0082 // INT1 Mode: Low level ; 0000 0083 // Interrupt on any change on pins PCINT0-7: Off ; 0000 0084 // Interrupt on any change on pins PCINT8-14: Off ; 0000 0085 // Interrupt on any change on pins PCINT16-23: Off ; 0000 0086 EICRA=0x00; STS 105,R30 ; 0000 0087 EIMSK=0x02; LDI R30,LOW(2) OUT 0x1D,R30 ; 0000 0088 EIFR=0x02; OUT 0x1C,R30 ; 0000 0089 PCICR=0x00; LDI R30,LOW(0) STS 104,R30 ; 0000 008A ; 0000 008B TIMSK0=0x00; TIMSK1=0x00; TIMSK2=0x00; STS 110,R30 STS 111,R30 STS 112,R30 ; 0000 008C ; 0000 008D // USART initialization ; 0000 008E // USART disabled ; 0000 008F UCSR0B=0x00; STS 193,R30 ; 0000 0090 ; 0000 0091 // Analog Comparator initialization ; 0000 0092 // Analog Comparator: Off ; 0000 0093 // Analog Comparator Input Capture by Timer/Counter 1: Off ; 0000 0094 ACSR=0x80; LDI R30,LOW(128) OUT 0x30,R30 ; 0000 0095 ADCSRB=0x00; LDI R30,LOW(0) STS 123,R30 ; 0000 0096 DIDR1=0x00; STS 127,R30 ; 0000 0097 ; 0000 0098 // ADC initialization ; 0000 0099 // ADC Clock frequency: 15,625 kHz ; 0000 009A // ADC Voltage Reference: Int., cap. on AREF ; 0000 009B // ADC Auto Trigger Source: ADC Stopped ; 0000 009C // Only the 8 most significant bits of ; 0000 009D // the AD conversion result are used ; 0000 009E // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On ; 0000 009F // ADC4: On, ADC5: On ; 0000 00A0 DIDR0=0x00; STS 126,R30 ; 0000 00A1 ADMUX=ADC_VREF_TYPE & 0xff; LDI R30,LOW(224) STS 124,R30 ; 0000 00A2 ADCSRA=0x86; LDI R30,LOW(134) STS 122,R30 ; 0000 00A3 ; 0000 00A4 // SPI initialization ; 0000 00A5 // SPI disabled ; 0000 00A6 SPCR=0x00; LDI R30,LOW(0) OUT 0x2C,R30 ; 0000 00A7 ; 0000 00A8 // TWI initialization ; 0000 00A9 // TWI disabled ; 0000 00AA TWCR=0x00; STS 188,R30 ; 0000 00AB ; 0000 00AC LED = 1; delay_ms(25); LED = 0; SBI 0xB,5 LDI R30,LOW(25) LDI R31,HIGH(25) RCALL SUBOPT_0x0 CBI 0xB,5 ; 0000 00AD ; 0000 00AE // Watchdog Timer initialization ; 0000 00AF // Watchdog Timer Prescaler: OSC/512k ; 0000 00B0 // Watchdog Timer interrupt: Off ; 0000 00B1 #pragma optsize- ; 0000 00B2 #asm("wdr") wdr ; 0000 00B3 WDTCSR=0x38; LDI R30,LOW(56) STS 96,R30 ; 0000 00B4 WDTCSR=0x28; LDI R30,LOW(40) STS 96,R30 ; 0000 00B5 #ifdef _OPTIMIZE_SIZE_ ; 0000 00B6 #pragma optsize+ ; 0000 00B7 #endif ; 0000 00B8 ; 0000 00B9 // Global enable interrupts ; 0000 00BA #asm("sei") sei ; 0000 00BB ; 0000 00BC SMCR = 0b00000101; // Power-down Mode Страница 43 мануала ATmega48 LDI R30,LOW(5) OUT 0x33,R30 ; 0000 00BD #asm("sleep"); //Вводит контроллер в режим энергосбережения sleep ; 0000 00BE // Просыпаемся от прерыванием INT1 и сразу на обработчик ; 0000 00BF ; 0000 00C0 while (1) _0xA: ; 0000 00C1 { ; 0000 00C2 delay_ms(2000); // Ждем чтобы разрядился конденсатор LDI R30,LOW(2000) LDI R31,HIGH(2000) RCALL SUBOPT_0x0 ; 0000 00C3 ; 0000 00C4 // Если сеть 220VAC есть, то засыпаем ; 0000 00C5 if (LineCtr == 0) SBIC 0x9,4 RJMP _0xD ; 0000 00C6 { ; 0000 00C7 BOOSTER_OFF; LED = 0; SBI 0x5,1 CBI 0x5,0 CBI 0xB,5 ; 0000 00C8 main(); RCALL _main ; 0000 00C9 } ; 0000 00CA ; 0000 00CB // Если пропала сеть 220VAC ; 0000 00CC if (LineCtr == 1) _0xD: SBIS 0x9,4 RJMP _0x14 ; 0000 00CD { ; 0000 00CE // Первое значение batU берется из обработчика (сюда по-другому и не попасть) ; 0000 00CF if (batU >= 148 && LineCtr == 1 && PIND.3 == 1) LDI R30,LOW(148) LDI R31,HIGH(148) CP R3,R30 CPC R4,R31 BRLO _0x16 SBIS 0x9,4 RJMP _0x16 SBIC 0x9,3 RJMP _0x17 _0x16: RJMP _0x15 _0x17: ; 0000 00D0 { ; 0000 00D1 ctr = 20; batU = 0; RCALL SUBOPT_0x1 ; 0000 00D2 while(ctr) // цикл из 20 измерений _0x18: TST R6 BREQ _0x1A ; 0000 00D3 {ctr--; batU = batU + read_adc(2);} RCALL SUBOPT_0x2 RJMP _0x18 _0x1A: ; 0000 00D4 batU = batU / 20; // вычисляем среднее RCALL SUBOPT_0x3 ; 0000 00D5 ; 0000 00D6 BOOSTER_ON; CBI 0x5,1 SBI 0x5,0 ; 0000 00D7 delay_ms(500); LDI R30,LOW(500) LDI R31,HIGH(500) RCALL SUBOPT_0x0 ; 0000 00D8 } ; 0000 00D9 else main(); RJMP _0x1F _0x15: RCALL _main ; 0000 00DA } _0x1F: ; 0000 00DB } _0x14: RJMP _0xA ; 0000 00DC } _0x20: RJMP _0x20 ; ;// External Interrupt 1 service routine ;// В прерывании строжевой таймер не работает (?) ;interrupt [EXT_INT1] void ext_int1_isr(void) ; 0000 00E1 { _ext_int1_isr: ST -Y,R0 ST -Y,R1 ST -Y,R15 ST -Y,R22 ST -Y,R23 ST -Y,R24 ST -Y,R25 ST -Y,R26 ST -Y,R27 ST -Y,R30 ST -Y,R31 IN R30,SREG ST -Y,R30 ; 0000 00E2 BOOSTER_OFF; SBI 0x5,1 CBI 0x5,0 ; 0000 00E3 ; 0000 00E4 // Запускаем функцию контроля за зарядом АКБ ; 0000 00E5 //******************************************************************* ; 0000 00E6 ctr = 20; batU = 0; RCALL SUBOPT_0x1 ; 0000 00E7 while(ctr) // цикл из 20 измерений _0x25: TST R6 BREQ _0x27 ; 0000 00E8 {ctr--; batU = batU + read_adc(2);} RCALL SUBOPT_0x2 RJMP _0x25 _0x27: ; 0000 00E9 batU = batU / 20; // вычисляем среднее RCALL SUBOPT_0x3 ; 0000 00EA ; 0000 00EB /* Вычисление делителя на контроль напряжение АКБ ; 0000 00EC Коэф. деления = 13.1V / 0.833V = 15,726 ; 0000 00ED Опорное напряжение (измеренное) = 1.100V ; 0000 00EE Таким образом разрешение АЦП = 1.100 / 256 = 4,297 mV ; 0000 00EF Для получения нижней границы заряда в 10V нужно ; 0000 00F0 10V / 15.726 = 636 mV на АЦП, или ее значения 636 mV / 4.297 = 148 ; 0000 00F1 Для получения 13.4V нужно значение АЦП = 198*/ ; 0000 00F2 ; 0000 00F3 // Если напряжение на АКБ меньше 13.4V, то заряжаем ; 0000 00F4 if(batU <= 207) {BD140 = 1; LED = 0;} // Включаем заряд АКБ LDI R30,LOW(207) LDI R31,HIGH(207) CP R30,R3 CPC R31,R4 BRLO _0x28 SBI 0x8,4 RJMP _0x32 ; 0000 00F5 else {BD140 = 0; LED = 0;} // Выключаем заряд АКБ _0x28: CBI 0x8,4 _0x32: CBI 0xB,5 ; 0000 00F6 delay_ms(500); LDI R30,LOW(500) LDI R31,HIGH(500) RCALL SUBOPT_0x0 ; 0000 00F7 //******************************************************************* ; 0000 00F8 } LD R30,Y+ OUT SREG,R30 LD R31,Y+ LD R30,Y+ LD R27,Y+ LD R26,Y+ LD R25,Y+ LD R24,Y+ LD R23,Y+ LD R22,Y+ LD R15,Y+ LD R1,Y+ LD R0,Y+ RETI
.CSEG ;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES, CODE SIZE REDUCTION:4 WORDS SUBOPT_0x0: ST -Y,R31 ST -Y,R30 RJMP _delay_ms
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x1: LDI R30,LOW(20) MOV R6,R30 CLR R3 CLR R4 RET
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:6 WORDS SUBOPT_0x2: DEC R6 LDI R30,LOW(2) ST -Y,R30 RCALL _read_adc LDI R31,0 __ADDWRR 3,4,30,31 RET
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:4 WORDS SUBOPT_0x3: __GETW2R 3,4 LDI R30,LOW(20) LDI R31,HIGH(20) RCALL __DIVW21U __PUTW1R 3,4 RET
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Ср сен 11, 2013 15:16:26
Друг Кота
Карма: 67
Рейтинг сообщений: 1062
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19855 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Ищите "WDR".
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Уже было. В CodeVisionAVR функции delay_ms ресетят WD однозначно (содержат команду WDR в цикле). Переходите на WinAVR или делайте задержку иным образом.
Заголовок сообщения: Re: Проблемы со сторожевым таймером. Что я делаю неправильно
Добавлено: Чт сен 12, 2013 08:49:00
Друг Кота
Карма: 67
Рейтинг сообщений: 1062
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19855 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
pyzhman писал(а):
Компилятор в delay_ms() ставит команду wdr
Хотя я искал, но нигде не нашёл упоминания об этом. Может, я слепой? А похожая проблема вроде уже всплывала у кого-то, потому я и предложил.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения