Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
DeadDance
1 / 1 / 0
Регистрация: 16.06.2013
Сообщений: 46
1

работа с таймерами в ATmega328p (понять как выставить нужное мне время)

10.04.2016, 18:26. Просмотров 2513. Ответов 6

Мне нужно что бы программа переключала диоды через 0.1 секунду. Частота мк 16МГц, предделитель взял 1024.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
.include "m328Pdef.inc"
 
 
.cseg
.org $0000 rjmp Reset     ; (Reset)
.org $0020 rjmp Timer_Overflow  
.org INT_VECTORS_SIZE 
 
Timer_Overflow:
    //  dec r20
    //  cpi r20, 0x00
    //  brne ret0
    cpi r17, 0x20
    brne oo
    rjmp main
oo: lsl r17
    cpi r18, 0x10
    brne ooo
    lsr r18
    lsr r18
ooo:    lsr r18                ;50      
    out PORTB,r17 
    out PORTD,r18
ret0:   reti
 
 
 
 Reset:ldi r16,Low(RAMEND) 
       out SPL,r16        
       ldi r16,High(RAMEND)
       out SPH,r16
        cli
        ldi r16,(1<<TOIE0)
        sts TIMSK0, r16
         ldi r16,0b00000000
         out TCCR0A,r16
        ldi r16,0b00000101
        out TCCR0B,r16
        ldi r16,0xff 
       out DDRB,r16
        ldi r16,0b11110011
       out DDRD,r16
       ldi r16,0b00000000
       out DDRC,r16
 
main: 
        cli
 
        ldi r20,0x00 //06
        ldi r17, 0x00
        ldi r18, 0x00
        out PORTB,r17 
        out PORTD,r18
        sbic PINC, 5
        rjmp vkl0
        sbis PINC, 4
        rjmp vkl0
       rjmp main
 
vkl0:
    ldi r17, 0x01
    ldi r18, 0x80
    out PORTB,r17 
    out PORTD,r18
    sei
vkl00:
    
    
    rjmp vkl00
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2016, 18:26
Ответы с готовыми решениями:

Как понять схему устройства и выставить там цифры?
плата Atmega128,компилятор AVR Studio4, язык Assembler вот схема подключения,только я не совсем...

Проблема с монитором! Не могу выставить нужное разрешение.
парни помогите что делать мне нужно разешение экрана поменять, но которого мне нужно рарешения...

Не могу выставить нужное разрешение при подключении монитора по Dvi
Здравствуйте . приобрел видеокарту gtx1060 фирмы KFA2 . Имею старый монитор samsung T200 . из...

Как задать нужное время?
Здравствуйте. Я новичок в джаве и у меня возник такой вопрос. Не могу нигде найти, как установить...

Как вызвать функцию в нужное время ?
Как мне вызывать функцию DO только каждую 100 -ую милисекунду? По идее она должна запускаться как...

6
DeadDance
1 / 1 / 0
Регистрация: 16.06.2013
Сообщений: 46
10.04.2016, 18:56  [ТС] 2
Вот схемка
работа с таймерами в ATmega328p (понять как выставить нужное мне время)
0
pyzhman
1156 / 512 / 74
Регистрация: 15.05.2012
Сообщений: 2,917
11.04.2016, 07:05 3
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

В обработчике прерывания:
Assembler
1
rjmp main
Это как это? Это для чего это?
А чтобы рассчитать время срабатывания таймера делаем так:
1. Тактовая частота 16.000.000 Гц. Прескалер 1024. Стало быть таймер будет тактироваться с частотой 16000000/1024= 15 625 Гц, или наращиваться каждые 1024/16000000= 64 мкс.
2. Разрядность таймера 0, который указан в программе, - 256. Стало быть переполнятся он будет (режим, выбранный в программе) через каждые 256*64мкс= 16,384 мс.
3. По условию нужно 0,1 с. Стало быть нужно организовать счетчик, который бы посчитал 0,1/0,016384= 6 раз и выдал сигнал.
0
ValeryS
Модератор
7887 / 5869 / 768
Регистрация: 14.02.2011
Сообщений: 20,173
Завершенные тесты: 1
11.04.2016, 10:58 4
Цитата Сообщение от DeadDance Посмотреть сообщение
rjmp main
классный выход из прерывания
0
DeadDance
1 / 1 / 0
Регистрация: 16.06.2013
Сообщений: 46
11.04.2016, 12:48  [ТС] 5
а да .. забыл код подчистить в обработчике)))
да да я именно то и рассуждал, но что то пошло не так при использовании в коде.
вот что получилось при задержке 1 раз:
0
Миниатюры
работа с таймерами в ATmega328p (понять как выставить нужное мне время)  
DeadDance
1 / 1 / 0
Регистрация: 16.06.2013
Сообщений: 46
11.04.2016, 12:51  [ТС] 6
то бишь все правильно ! но если сделать цикл 6 раз ... то мы получаем 98.31 мс = 0.9831 секунд.. ну почти ..))
0
Миниатюры
работа с таймерами в ATmega328p (понять как выставить нужное мне время)  
DeadDance
1 / 1 / 0
Регистрация: 16.06.2013
Сообщений: 46
11.04.2016, 14:35  [ТС] 7
но в протеусе переключение срабатывает очень медленно.... вот и не могу понять где я что неправильно сделал

Добавлено через 1 минуту
вот код со счетчиком 6 раз
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
.include "m328Pdef.inc"
 
 
.cseg
.org $0000 rjmp Reset     ; (Reset)
.org $0020 rjmp Timer_Overflow  
.org INT_VECTORS_SIZE 
 
Timer_Overflow:
        dec r20
        cpi r20, 0x00
        brne ret0
    cpi r17, 0x20
    brne oo
    rjmp ret0
oo: lsl r17
    cpi r18, 0x10
    brne ooo
    lsr r18
    lsr r18
ooo:    lsr r18                ;50      
    out PORTB,r17 
    out PORTD,r18
ret0:   reti
 
 
 
 Reset:ldi r16,Low(RAMEND) 
       out SPL,r16        
       ldi r16,High(RAMEND)
       out SPH,r16
        cli
        ldi r16,(1<<TOIE0)
        sts TIMSK0, r16
         ldi r16,0b00000000
         out TCCR0A,r16
        ldi r16,0b000000101
        out TCCR0B,r16
        ldi r16,0xff 
       out DDRB,r16
        ldi r16,0b11110011
       out DDRD,r16
       ldi r16,0b00000000
       out DDRC,r16
 
main: 
        cli
 
        ldi r20,0x06 //06
        ldi r17, 0x00
        ldi r18, 0x00
        out PORTB,r17 
        out PORTD,r18
        sbic PINC, 5
        rjmp vkl0
        sbis PINC, 4
        rjmp vkl0
       rjmp main
 
vkl0:
    ldi r17, 0x01
    ldi r18, 0x80
    out PORTB,r17 
    out PORTD,r18
    sei
vkl00:
    
    
    rjmp vkl00
Добавлено через 1 час 41 минуту
Все нашел проблему )... неправильно построил цикл
0
11.04.2016, 14:35
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2016, 14:35

Как запускать Qt программу в нужное время?
Написал простенькое Qt-приложение для фана. Включил его в автозагрузку. Как мне сделать так, чтобы...

Как выключать программу в нужное время?
как сделать так что бы программа в 00:00 выключалась?

Как сделать, чтобы после успешной авторизации пропадала форма входа и выводилось нужное мне?
Написал простейшую регистрацию пользователя на пхп, теперь хочу сделать авторизицию, вроде как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.