Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 26.04.2019
Сообщений: 8
1

Генерация частоты на Attiny

22.01.2021, 08:43. Просмотров 452. Ответов 8
Метки нет (Все метки)

Решил сделать "пиликалку" для прозвонки кабеля. Ну и чисто чтобы потренироваться в программировании контроллеров сделал это на attiny13. На одном выводе все формируется ОК. Режим работы таймеров СТС, т.е. инверсия сигнала при совпадении. Ну такой, как я понял стандартный режим формирования частоты на этих микроконтроллерах. Как уже написал - все нормально, но захотелось сигнал побольше и решил на другой ножке сформировать сигнал в потивофазе. И тут - засада, как это сделать? Я предположил, что нужно при инициализации один из выводов установить в 0, а второй в единицу:
Assembler
1
2
 ldi w,0b00000010
 out PINB,w
Нарисовал в протеусе схемку, запустил, и вот такая засада: сигнал прерывается, то есть, то нет. На осциллографе видно что фаза скачет, как мне кажется произвольным образом. Прошил реальный чип - наблюдаю то же самое.Я даже установку выводов перенес в секцию Loop - т.е. установка при каждом писке, но все равно фаза скачем произвольно. Почему так-то?


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
.device ATtiny13
.include "tn13def.inc"
.list
.def        w = r16       
.def        count1 = r17
.def        count2 = r18
.def        count3 = r19
 
.equ        delay=150
.equ        note1 = 80
.equ        note2= 101
.equ        note3 = 120
 
        .cseg
        .org 0
 
      rjmp  Start
    
    Start:  
               ldi w,0b00000011
           out DDRB,w
           
           ldi w,0b00000010
           out PINB,w
               
           ldi w,0b01010010 
           out TCCR0A,w
           ldi w,0b00000010 
           out TCCR0B,w
     
     Loop:
       
               ldi w,0b00000010
           out PINB,w
       
           ldi w,note1
           out OCR0A, w
           rcall _delay
           
           ldi w,note2
           out OCR0A, w
           rcall _delay
 
           ldi w,note3
           out OCR0A, w
           rcall _delay
           
           rjmp  Loop   
           
  _delay:
           ldi count1,0
           ldi count2,delay
   delay1:
           dec  count1
           brne delay1 
           dec count2
           brne delay1
           ret
0
Миниатюры
Генерация частоты на Attiny  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2021, 08:43
Ответы с готовыми решениями:

Генерация звука заданной частоты
Возможно ли на vb.net сгенерировать синусоиду, определенной частоты и выдать на колонки? Формула...

Работа со звуком: генерация звука определенной частоты
Всем привет! Помогите пожалуйста:есть ли в Delphi какая-то функция на подобии sound(x) в паскале....

Получить слова длиной Х по убыванию частоты появления в тексте с указанием этой частоты
На входе программа получает *.тхт файл и число Х. На выходе - возвращает слова длиной Х по убыванию...

Различие частоты сигнала и частоты его АКФ
Здравствуйте. Я думал, что если взять обычный синусоидальный сигнал, найти его АКФ, то частота не...

8
Модератор
Эксперт CЭксперт С++
4194 / 3727 / 672
Регистрация: 07.10.2015
Сообщений: 7,634
22.01.2021, 09:32 2
dumkan, не pinb, а portb
1
0 / 0 / 0
Регистрация: 26.04.2019
Сообщений: 8
22.01.2021, 10:35  [ТС] 3
Да, верно, спасибо. Но проблема не исчезает, даже если так (в двух местах):
Assembler
1
2
 ldi w,0b00000010
           out PORTB,w
В принципе я эти строчки вообще убираю, но чип ведет себя все так же. Такое впечатление что есть какой-то внутренний регистр связанный с таймером, с которого уже на порты посылаются значения. Вот только непонятно, почему на PB0 и PB1 они то в фазе, то в противофазе. Почему так скачет-то?
0
Модератор
Эксперт CЭксперт С++
4194 / 3727 / 672
Регистрация: 07.10.2015
Сообщений: 7,634
22.01.2021, 17:14 4
dumkan, а так?
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
.device ATtiny13
.include "tn13def.inc"
.list
.def        w = r16       
.def        CR0 = r2
.def        count1 = r17
.def        count2 = r18
.def        count3 = r19
 
.equ        delay=150
.equ        note1 = 80
.equ        note2= 101
.equ        note3 = 120
 
        .cseg
        .org 0
 
      rjmp  Start
    
    Start:  
           ldi w,0b00000011
           out DDRB,w
           
           ldi w,0b00000010
           out PORTB,w
               
           ldi w,0b01010010 
           out TCCR0A,w
           ldi w,0b00000010 
           out TCCR0B,w
     
           clr CR0
     Loop:
           out TCNT0, CR0
           ldi w,note1
           out OCR0A, w
           rcall _delay
           
           out TCNT0, CR0
           ldi w,note2
           out OCR0A, w
           rcall _delay
 
           out TCNT0, CR0
           ldi w,note3
           out OCR0A, w
           rcall _delay
           
           rjmp  Loop   
           
  _delay:
           ldi count1,0
           ldi count2,delay
   delay1:
           dec  count1
           brne delay1 
           dec count2
           brne delay1
           ret
1
0 / 0 / 0
Регистрация: 26.04.2019
Сообщений: 8
22.01.2021, 18:56  [ТС] 5
Да, спасибо, так действительно фаза не скачет.
Я тут немного поэкспериментировал, фаза скачет если мы меняем OCR0A. Т.е. если один раз в секции Start этот регистр загрузили, то на выходах сигнал в фазе. Или даже если в Loop этот регистр каждый раз загружаем, но одним и тем же числом - тоже все ОК. Проблема начинается если мы меняем значение хоть раз. Ваше решение со сбросом счетного регистра работает! Но есть пара вопросов:
1. Собственно говоря почему так работает - нужно сбросить счетный регистр перед загрузкой регистра сравнения чтобы не было скачков фазы на разных выходах? Отчего скачки вообще происходят, ведь оба выхода настроены одинаковы - инверсия выхода при совпадении счетчика с регистром сравнения.
2. Хотя код позволяет синхронизировать выходы, но они теперь всегда в фазе, т.е. динамик между этими выходами - молчит. Можно ли как-то выходы синхронизировать в противофазе?
0
Тутошний я
1985 / 1088 / 200
Регистрация: 03.11.2009
Сообщений: 3,771
Записей в блоге: 2
23.01.2021, 10:30 6
Цитата Сообщение от dumkan Посмотреть сообщение
ведь оба выхода настроены одинаковы - инверсия выхода при совпадении счетчика
а в счётчиках, при сбросе, одинаковые значения?
Цитата Сообщение от dumkan Посмотреть сообщение
Можно ли как-то выходы синхронизировать в противофазе?
а если настроить счётчик в противофазе?

Добавлено через 38 минут
Цитата Сообщение от Grey Посмотреть сообщение
а если настроить счётчик в противофазе?
не то. это 2 счётчика нужно.

Добавлено через 20 минут
по моему проще настроить таймер на переполнение. и в прерывании переключать выводы.
0
0 / 0 / 0
Регистрация: 26.04.2019
Сообщений: 8
23.01.2021, 12:41  [ТС] 7
Таймер в тиньке13 один, и счетчик соответственно тоже один.
Но регистров сравнения - два. Если использовать режим ШИМ, записать в регистры сравнения одинаковые числа (OCR0A=OCR0B), и выводы настроить один сброс 0, а второй в 1 при совпадении (TCCR0A=0b1011хххх), то получаем противофазные ШИМ на выходах. Но в этом режиме мы регистрами OCR0A,OCR0B управляем именно ШИМ, а не частотой . Мне же нужен меандр но с разными частотами.

Добавлено через 7 минут
по моему проще настроить таймер на переполнение. и в прерывании переключать выводы.
Так и придется сделать, но программно через прерывания как-то неэлегантно мне кажется. Раз есть аппаратные ШИМ и возможность формирования частот, то хотелось как-то через них.
0
Тутошний я
1985 / 1088 / 200
Регистрация: 03.11.2009
Сообщений: 3,771
Записей в блоге: 2
23.01.2021, 21:26 8
как вариант. тоже программный.
таймер в режим CTC.
выходы от него отключаем.
в прерывании Output Compare 0A переключать выводы.

Добавлено через 27 минут
попробовал код, похожий как liv предложил.
Assembler
1
2
           ldi w,0b00000010
           out PORTB,w
тут же выходы настраиваются в противофазе.
и таймер потом их также в противофазе переключает.
там на пару тактов всего фаза не совпадает.
0
0 / 0 / 0
Регистрация: 26.04.2019
Сообщений: 8
24.01.2021, 14:03  [ТС] 9
попробовал код, похожий как liv предложил.
AssemblerВыделить код
1
2
ldi w,0b00000010
out PORTB,w
тут же выходы настраиваются в противофазе.
и таймер потом их также в противофазе переключает.
там на пару тактов всего фаза не совпадает.
Вот именно что так не работает. Чип не инвертирует состояние порта. Он в принципе не может прочитать состояние порта, который настроен на выход и как-то инвертировать его. Похоже что используется какой-то буфер, в котором и происходит формирование битов которые потом в порт записывает.

Добавлено через 45 минут
Ну вот так работает конечно:
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
70
71
72
73
device ATtiny13
.include "tn13def.inc"
.list
.def        w = r16       
.def        count1 = r17
.def        count2 = r18
.def        count3 = r19
.def        out_port = r20
 
.equ        delay=150
.equ        note1 = 80
.equ        note2= 101
.equ        note3 = 120
 
.cseg
.org 0
       rjmp  Start
       reti ; внешнее
       reti ; по измениению выхода
       reti ; переполнение таймера
       reti ; EEPROM
       reti ; компаратор
       rjmp Comp
       reti ; совпадение B
       reti ; сторожевой таймер
       reti ; АЦП
    Start:  
        ldi w,RAMEND
        out SPL, w
       
        ldi w,0b00000011
        out DDRB,w
       
        ldi w,0b00000010 
        out TCCR0A,w
        ldi w,0b00000010 
        out TCCR0B,w
       
        ldi out_port,0b00100001 
        ldi w, 0b00000100
        out  TIMSK0,w
        sei
       
     Loop:
 
        ldi w,note1
        out OCR0A, w
        rcall _delay
      
        ldi w,note2
        out OCR0A, w
        rcall _delay
       
        ldi w,note3
        out OCR0A, w
        rcall _delay
       
    rjmp  Loop   
 
Comp:
        swap out_port
    out PORTB,out_port  
    reti
           
_delay:
       ldi count1,0
       ldi count2,delay
delay1:
       dec  count1
       brne delay1 
       dec count2
       brne delay1
       ret
Вопрос, можно ли без прерывания формировать частоты в противофазе?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2021, 14:03

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

Attiny в atmega
Всем привет и доброго времени. Есть задача- имеется прошивка hex для attiny2313, возможно ли ее...

Тактирование Attiny
Всем привет, люди, подскажите плиз, понимаю что ламерский вопрос, но тем не менее, взял зверюгу...

Attiny 13 ADC
решил сделать автовключение света в ванной. купил дальнометр 2Y0A21, подключил его к ардуино и...

ATtiny 2313
Добрый день, возникли трудности с работой с МК. Это мой первый практический опыт в паянии и работе...

не прошивается attiny 13
Доброго времени суток!! Пытаюсь прошить мк attiny13, самое простое - помигать светодиодиком. Но...

Определить частоты частости, накопленные частоты и частости для данных статистических данны
за 2003 год получены группировки доходов одного из акционерных обществ. Определить частоты ....


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

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

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