Обсуждаем контроллеры компании Atmel.
Ответить

Re: WatchDog Timer Сторожевой таймер в AVR

Сб май 21, 2016 12:40:48

electronik_tver писал(а): глючил протеус именно на этом камне и именно на собаке..
Не на собаке (я написал уже на чем) и возможно на всех камнях AVR.

Re: WatchDog Timer Сторожевой таймер в AVR

Пт июл 22, 2016 13:14:00

Доброго дня.
Помогите разрешить очередной затык на ровном месте при использовании WatchDog на Atmega8 с AVRStudio4.



Если пользоваться _delay_ms, то контроллер перезагружается, как будто строки со сбросом дальше нет. Если _delay_ms убрать, то все ок. WatchDog настроен на 2 с, т.е. задержка в десятки мс не должна влиять. Еще один нюанс: при загрузке программы с _delay_ms в протеус, все прекрасно работает (сообщений о ресете нет), но при заливке в реальную микросхему получаются только сплошные перезагрузки.
Почему _delay_ms так влияет на сброс WatchDog?

Re: WatchDog Timer Сторожевой таймер в AVR

Пт июл 22, 2016 14:07:00

я настоятельно рекомендую не изобретать велосипеды по настройке и сбросу WDT, а использовать "библиотечный", входящий в комплект WinAVR, вариант.

1. приинклюдить модуль <avr/wdt.h>
2. использовать для сброса WDT макрос wdt_reset();
3. для настройки режима WDT использовать макрос wdt_enable() передавая ему в качестве параметра нужную константу WDTO_XXX

по всей видимости у вас режим WDT настроен некорректно

Re: WatchDog Timer Сторожевой таймер в AVR

Вс июл 24, 2016 11:00:09

F_CPU определен?

for (unsigned char i = 0; ... - попробуйте объявить i как volatile и посмотрите, что будет. Если начнет перезагружаться так же, как и с _delay_ms, то, скорее всего, строжевой таймер настроен некорректно.

Re: WatchDog Timer Сторожевой таймер в AVR

Пн июл 25, 2016 08:05:44

ARV писал(а):я настоятельно рекомендую не изобретать велосипеды по настройке и сбросу WDT, а использовать "библиотечный", входящий в комплект WinAVR, вариант.

1. приинклюдить модуль <avr/wdt.h>
2. использовать для сброса WDT макрос wdt_reset();
3. для настройки режима WDT использовать макрос wdt_enable() передавая ему в качестве параметра нужную константу WDTO_XXX

по всей видимости у вас режим WDT настроен некорректно

Спасибо, "библиотечно" работает.

YS писал(а):F_CPU определен?

for (unsigned char i = 0; ... - попробуйте объявить i как volatile и посмотрите, что будет. Если начнет перезагружаться так же, как и с _delay_ms, то, скорее всего, строжевой таймер настроен некорректно.
F_CPU определен?

for (unsigned char i = 0; ... - попробуйте объявить i как volatile и посмотрите, что будет. Если начнет перезагружаться так же, как и с _delay_ms, то, скорее всего, строжевой таймер настроен некорректно.

Частота определена в опциях проекта AVRStudio, в тексте программы F_CPU не опеределен. Но ковырять, что в моем варианте не пашет лень (watchdog в этой железке для душевного спокойствия, без явной необходимости), поюзаю библиотеку :)

Re: WatchDog Timer Сторожевой таймер в AVR

Пн авг 22, 2016 15:57:11

Доброе время суток.
Может кто из знающих подскажет. Есть устройство на Amega8A при нажатии на определенную кнопку активирует выход (на пине порта B появляется +5В) на определенный интервал времени. И есть отдельная кнопка которая активирует (должна) выход постоянно, код для нее реализован на бесконечном цикле. Сброс всех временных установок осуществляется кнопкой "RESET" т.е. аппаратным сбросом контроллера, отключение выхода и возврат к состоянию ожидания нажатия какой либо кнопки. В Atmel Studio7 все работает как часы. Зашил контроллер, кнопки которые отсчитывают время работают нормально, а при нажатии кнопки для непрерывного режима через какое-то время выход отключается. Сторожевой таймер отключен. Может при реализации бесконечного цикла именно в "железе" есть какие-то засады?
Бесконечный цикл завязанный сам на себя при помощи команды RJMP.

Re: WatchDog Timer Сторожевой таймер в AVR

Пн авг 22, 2016 19:58:15

Ну так а сам код-то где? :)

Re: WatchDog Timer Сторожевой таймер в AVR

Вт авг 23, 2016 08:30:52

; Amega8.asm
;
; Created: 30.05.2016 14:45:18
; Author : крокус
;

.include "m8adef.inc" ; открыть файл описаний

;.cseg
;.org 0
; ++++++++++++++++++++++++++++++++++++переопределение векторов прерываний

rjmp reset ;вектора прерываний
nop ;rjmp INT0;External Interrupt Request 0
nop; rjmp INT1; External Interrupt Request 1
nop ;rjmp OC2; Timer/Counter2 Compare Match
nop ;rjmp OVF; Timer/Counter2 Overflow
nop ;rjmp ICP1; Timer/Counter1 Capture Event
rjmp stop1; OC1A; Timer/Counter1 Compare Match A
nop;rjmp OC1B; Timer/Counter1 Compare Match B
nop; OVF1; Timer/Counter1 Overflow
nop ;rjmp OVF0; Timer/Counter0 Overflow
nop ;rjmp SPI; Serial Transfer Complete
nop ;rjmp URXC; USART, Rx Complete
nop ;rjmp UDRE; USART Data Register Empty
nop ;rjmp UTXC; USART, Tx Complete
nop ;rjmp ADCC; ADC Conversion Complete
nop ;rjmp ERDY; EEPROM Ready
nop ;rjmp ACI; Analog Comparator
nop ;rjmp TWI; 2-wire Serial Interface
nop ;rjmp SPMR; Store Program Memory Ready

reti


start:
ldi r16,0b00000000;
out ddrd,r16
ldi r16,0b11111111
out portd,r16
ldi r17,0b00000001
out ddrb,r17
ldi r17,0b00000000
out portb,r17
;sbi portb,0
ldi r21,0b00000001


; ++++++++++++++++++++++++++++++++++++= начало циклов проверки сост кнопок замыкающихся на 0

switch:
.def rin=r18;
ldi rin,0b11111111
nop
in rin,pind


init:
ldi r19,0b00001100
out tccr1b,r19
ldi r19,0b00000000
out tccr1a,r19

;++++++++++++++++++++++отключение сторож таймера +++++++++++++++++++++++
; ldi r20,0b00011000
; out wdtcr,r20
; nop
; ldi r20,0b00010000
; out wdtcr,r20



; ++++++++++++++++++++++++++++ определение маски прерывания ++++++++++++++++++
ldi r20,0b00010000
out timsk,r20
sei

sbrc rin,0
rjmp sw1
out portb,r21
.equ kdel=1152
ldi r19,high(kdel)
out ocr1ah,r19
ldi r19,low(kdel)
out ocr1al,r19
out tcnt1h,r17
out tcnt1l,r17
c1: rjmp c1



sw1: sbrc rin,1
rjmp sw2
out portb,r21
.equ kdel1=2944
ldi r19,high(kdel1)
out ocr1ah,r19
ldi r19,low(kdel1)
out ocr1al,r19
out tcnt1h,r17
out tcnt1l,r17
c2: rjmp c2



sw2: sbrc rin,2
rjmp sw3
out portb,r21
.equ kdel2=6400
ldi r19,high(kdel2)
out ocr1ah,r19
ldi r19,low(kdel2)
out ocr1al,r19
out tcnt1h,r17
out tcnt1l,r17
c3: rjmp c3



sw3: sbrc rin,3
rjmp sw4
out portb,r21
.equ kdel3=7040
ldi r19,high(kdel3)
out ocr1ah,r19
ldi r19,low(kdel3)
out ocr1al,r19
out tcnt1h,r17
out tcnt1l,r17
c4: rjmp c4



sw4: sbrc rin,4
rjmp sw5
out portb,r21
.equ kdel4=10240
ldi r19,high(kdel4)
out ocr1ah,r19
ldi r19,low(kdel4)
out ocr1al,r19
out tcnt1h,r17
out tcnt1l,r17
c5: rjmp c5


;++++++++++++++++++++++++++++++++++++++++++++++++++++++ проверка состояния кнопки 5 (ВРЕМЕННО)

sw5: sbrc rin,5
rjmp sw6
out portb,r21
in rin,pind
sbrc rin,5
rjmp stop1
rjmp sw5

;++++++++++++++++++++++++++++++++++++++++++++++++ проверка состояния кнопки 6 (НЕПРЕРЫВНО)

sw6: sbrc rin,6
rjmp switch
sw66: out portb,r21
rjmp sw66


;#################КНОпка RESET начинает исполнение кода заново


stop1: cbi portb,0; установка пина b0 в 0 остальные в 0 откл нагрузки
rjmp switch; переход на циклы проверки сост кн

Еще раз повторюсь сброс всего и откл нагрузки по кнопке RESET

Читал даташит, если я правильно понял, чтобы отключить сторож таймер надо во фьюзах WDTON поставить в 1 ?

Re: WatchDog Timer Сторожевой таймер в AVR

Вт авг 23, 2016 08:38:13

Попробуйте, для начала, установить стек.

Re: WatchDog Timer Сторожевой таймер в AVR

Вт авг 23, 2016 09:14:11

Кроме отсутствия инициализации указателя стека, я не заметил где вы выходите из прерывания.

Re: WatchDog Timer Сторожевой таймер в AVR

Вт авг 23, 2016 10:41:15

вроде бы понял от чего идет прерывание по переполнению таймера 1, сейчас буду код ковырять. Хотя не понятно с чего вдруг, у меня стоит прерывание по сравнению на предыдущих кнопках.

Re: WatchDog Timer Сторожевой таймер в AVR

Вт авг 23, 2016 11:01:49

gudsa писал(а):сейчас буду код ковырять
Так это не Ваш код??? Если да, проще начать снова:
-инициализация
-опрос кнопок
-если нажата кнопка на PD6 вывод 1 на PB0
-пока нажата кнопка на PD5 вывод 1 на PB0
-если нажата какая-то другая кнопка установить соответствующий интервал в OCR1A, выдать 1 на PB0 и запустить таймер; в прерывании сбросить PB0

Re: WatchDog Timer Сторожевой таймер в AVR

Вт авг 23, 2016 13:19:55

Код мой. Решил проблему установкой команды запрещения прерываний перед опросом пина PD6, чтобы не было прерывания по переполнению таймера 1. Спасибо про замечание по поводу выхода из прерывания, это и послужило зацепкой. Заодно и стек инициализировал.

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 18:08:12

Здравствуйте.
Хотел бы у вас спросить информацию.
имею я программу, ватчдог и прерывание. В конце программы указан сон.
Если я не ошибаюсь то программа будет выполняться следующем способов
1. Программа запускается и выполняется полностью
2. Во время выполнения "заводиться" ватчдог на режим прерывание на 8 секунд
3. в конце подулем sleep.h уходит спать

Через 8 секунд ватчдог выполнит только прерывание, или же и прерывание и основной код программы ? Мне хотелось бы что-бы только прерывание в конце которого будет комманда сон. Заранее большое спасибо

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 18:20:56

Не все AVR имеют прерывание от собаки.
viewtopic.php?p=2540738#p2540738

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 19:12:43

kakawkin писал(а):что-бы только прерывание в конце которого будет комманда сон
Код:
while(1) sleep();

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 19:20:29

Z_h_e писал(а):Не все AVR имеют прерывание от собаки.
viewtopic.php?p=2540738#p2540738

Даташит по моему МК шепчет мне
    Only an External Reset, a Watchdog System Reset, a
    Watchdog Interrupt, a Brown-out Reset


Добавлено after 3 minutes 57 seconds:
ARV писал(а):
kakawkin писал(а):что-бы только прерывание в конце которого будет комманда сон
Код:
while(1) sleep();

У меня так и есть.
Т.е. код будет как понял вот такой:
Код:
interrupt [WDT] void wdt_timeout_isr(void)
{
// Place your code here

}

И в этот код я засовываю тоже самое что и в while(1) и в конце снова слип. И программа уже никогда не залезет в основную программу ( void main(void) )

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 19:26:53

kakawkin писал(а):И в этот код я засовываю тоже самое что и в while(1) и в конце снова слип.
или вы выражаетесь не понятно, или я слишком туп, чтобы вас понять... общая канва вашей программы должна быть такой:
Код:
interrupt [WDT] void wdt_timeout_isr(void){
// тут только то, что должно работать по прерыванию от WDT и ничего более
}

int main(void){
  // тут не нужно никаких циклов,
  // делаете только то, что должно делаться ОДИН раз
  // после включения питания
  // а в самом конце - sleep в цикле

  while(1) sleep();
}

и все. когда дойдет до последнего цикла - уснет. после просыпа отработает прерывание и "начало цикла" while(1), после чего снова уснет. и так далее до полного удовлетворения.

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 19:41:08

ARV писал(а):
kakawkin писал(а):И в этот код я засовываю тоже самое что и в while(1) и в конце снова слип.
или вы выражаетесь не понятно, или я слишком туп, чтобы вас понять... общая канва вашей программы должна быть такой:
Код:
interrupt [WDT] void wdt_timeout_isr(void){
// тут только то, что должно работать по прерыванию от WDT и ничего более
}

int main(void){
  // тут не нужно никаких циклов,
  // делаете только то, что должно делаться ОДИН раз
  // после включения питания
  // а в самом конце - sleep в цикле

  while(1) sleep();
}

и все. когда дойдет до последнего цикла - уснет. после просыпа отработает прерывание и "начало цикла" while(1), после чего снова уснет. и так далее до полного удовлетворения.

Во - спасибо. Я думал помимо прерывания, цикла while он запустит вообще всю программу с нуля. Большое вам спасибо

Re: WatchDog Timer Сторожевой таймер в AVR

Вт янв 31, 2017 19:47:09

с нуля запустит сброс. внимательно изучите, как работают прерывания от WDT, чтобы потом не удивляться.
Ответить