roboforum.ru

Технический форум по робототехнике.

На какой из таймеров AT90s2313 вешается програмный ШИМ ?

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

На какой из таймеров AT90s2313 вешается програмный ШИМ ?

Сообщение Hamileon » 04 май 2006, 22:13

Собственно вопрос.
Как включить ?  Способ с outb(TIMSK, (1<<TOIE0));    в CodeVisionAVR не срабатывает.

А вообще нужн этот кусок кода
outb(TIMSK, (1<<TOIE0));        
outb(TCCR0, 8);
sei();

только работающий в CodeVisionAVR. Пять часов сижу немогу понять.

PS: Как переводить из формата цифр 0x01 итд в стандарт ?  

PSS: А вообще пытаюсь сделать програмный ШИМ.
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение avr123.nm.ru » 04 май 2006, 22:28

програмный на любой таймер можно "вешать"

но у него есть и "железный" шим на PB3.

про кусок кода - уж несколько раз вам написал - как это делать на Си в CVAVR написано на стр 5 курса и в задачах !

==========

Ну хорошо мой курс написан мелким шрифтом и ты не можешь его прочитатьт......

но в паку примеров к CVAVR то ты можешь залезть и поискать нужный тебе регистр и таймер ?

вот например  AVR134.C   KEYPAD.C   LED.C

и посмотреть как автор компилятора с ним обращается ?

==========

здесь напишу тебе видимым шрифтом то что написано
на 1-й странице курса.

Поиск ответов на вопросы начни с Хелпа и примеров к компилятору.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Hamileon » 05 май 2006, 22:44

Сайт хороший. Спасибо.

Но остаются вопросы.

#pragma interrupt_handler timer0_ovf_isr:7

эта строка просто указывает компилятору название функции timer0_ovf_isr которая будет вызываться при возникновении прерывания № 7.  

Мы могли бы назвать ее и по своему усмотрению - главное сохранить формат объявления!)

#pragma interrupt_handler (название функции обработчика):(номер прерывания по ДШ)


#pragma КодВизион пишет нет такой дерективы.

timer0_ovf_isr что это ?(Это и есть название тоесть могу написать на этом месте Vasin_Timer_Nomer_Nol), По отдельности понятно кроме isr.
Но вместе ??? Почему ovf без указания 0 или 1 ???
Как перевести числа вормата 00х05 которые вы используете в нормальные ? Потому как читаю тадаши там написано установите бит 1 к примеру. У вас устанавливается совсем другое и в другом формате отсюда и вопросы.

interrupt_handler ?? В доташе такого не описано (совмесно)

Кстати где взять для CodeVisionAVR инклюды с дефайнами асмы таких команд как SEI итд что то вроде macros.h для iccv
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение wolf » 05 май 2006, 23:49

CV - не ICC, и специфичные для AVR конструкции в нём реализованы по-другому.
Исчерпывающая информация на эту тему есть во встроенной помощи CV.

Ответы по существу.
обработчик прерывания в CV объявляется так:
interrupt [TIM0_OVF] obrabot4ik_perepolnenia_timera() {
 //код
}
вывод в порт(регистр) делается так:
PORTB.5 = 0;
аналогично, вышеупомянутый бит можно установить так:
TIMSK.TOIE0 = 1;
двоичная форма записи в CV такова:
x = 0b10010110;

и т.д. и т.п.
Изучите хелп и примеры. Этого хватает для полноценной работы.
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение Hamileon » 06 май 2006, 00:18

А такая запись ? Нормально ?


TIMSK=1; Устанавливаем TOIE0
TCCR0=8; Устанавливаем деление частоты
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение avr123.nm.ru » 06 май 2006, 00:27

Hamileon писал(а):Сайт хороший. Спасибо.

Но остаются вопросы.

pragma interrupt_handler timer0_ovf_isr:7

#pragma КодВизион пишет нет такой дерективы.


вы задачу читайте с начала ! а не с середины.

В начале говорится для какого компилятора она написана.

Hamileon писал(а):1) Как перевести числа вормата 00х05 которые вы используете в нормальные ?

2) Потому как читаю тадаши там написано установите бит 1 к примеру.

3) У вас устанавливается совсем другое и в другом формате отсюда и вопросы.

4) где взять для CodeVisionAVR инклюды с дефайнами асмы таких команд как SEI итд что то вроде macros.h для iccv


Уже несколько раз на разных форумах ВАМ отвечал:

Си для МК - стр 5 курса  - там есть ответы на ВСЕ 4 вопроса.

http://avr123.nm.ru/05.htm

и в задачах - хотябы в 1-й !!!
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 06 май 2006, 00:33

Hamileon писал(а):А такая запись ? Нормально ?

TIMSK=1; Устанавливаем TOIE0
TCCR0=8; Устанавливаем деление частоты


первое не знаю, потому что не помню расположение бит в регистре.

Второе наверняка не правильно, потому что делитель обычно биты 2_0

а вы вписали  число 8  это  0000 1000  -  т.е. биты_2_0 у вас НУЛИ.


В задаче 1 и 3new написано как правильно.

Как установить бит в конце задачи 1  и на стр. 5 курса Си для МК.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 06 май 2006, 00:41

для 90s2313   TOIE0 это бит 7

TIMSK=1;   равносильно  TIMSK= 0b00000001;  

значит вы установили бит_0 и "очистили" остальные.


Как установить бит номер N в конце задачи 1
и на стр. 5 курса - Си для МК.

=======

Почитай всеже не спеша - многое прояснится.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Hamileon » 06 май 2006, 03:18

Никак не пойму как перевести вид 0x04 в восьми битный. Есть ли для этого программа ? И зачем такие неудобства  :oops:

Ведь DDRB=0xFF; И DDRB = 1 тоже самое. Смысл в такой кривезне ?
К примеру TCCR0=0x05; Что значит ? В даташе в таблице 7 этого раздела нет таких чисел. Как установить деление ?



Что еще у меня не правильно ?

#include <90s2313.h>
#include <stdio.h>
#define F_CPU 4000000
#define K_DELAY_10ms    F_CPU/600  

void Delay_10ms(unsigned char t) {
 unsigned int i;
 if (t==0) return;
 while (t--) for(i=0;i<K_DELAY_10ms; i++);
}

void main(void) {
 
TIMSK=0x00;
TCCR0=0x05;
   
#asm("sei") // ðàçðåøèëè ïðåðûâàíèÿ âîîáùå
// Àññåìáëåðíàÿ âñòàâêà!

 

DDRB.2=1;

while(1) {    
PORTB.2 = 1;  
 
Delay_10ms(10);    
   
PORTB.2 = 0;  

Delay_10ms(10);    

}
}    

interrupt [TIM0_OVF] void timer0_ovf_isr(void) {

PORTB.2 = 1;  
Delay_10ms(250);  
PORTB.2 = 0;  
Delay_10ms(250);
}

Сам по образованию Экономист. Никогда не програмил и непояль. Начал всего с недельку назад.
По этому мне так тяжело.
PS: Разрабатывать устройства не собираюсь, те я не конкурент  :oops: . Просто как хоби хочу, а тут получается каторга, через два часа на работу вставать а у меня голова квадратная и спать хочется  :roll:
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение Johnny Bravo » 06 май 2006, 06:10

Hamileon писал(а):Никак не пойму как перевести вид 0x04 в восьми битный. Есть ли для этого программа ? И зачем такие неудобства  

Ведь DDRB=0xFF; И DDRB = 1 тоже самое. Смысл в такой кривезне ?


0x04 = 4 = 0b00000100 HEX/DEC/BIN
Программа - калькулятор в виндовс инженерный. И это я бы сказал удобство, а не неудобство.

а 0хFF (HEX) это не 1 (DEC), а 255(DEC).
Все это и многое другое в курсе avr123.nm.ru!!!


P.S. Раз туда так часто отправляют, быть может действительно там что-то есть?!
Johnny Bravo
 
Сообщения: 400
Зарегистрирован: 26 фев 2006, 15:21
Откуда: Омск

Сообщение wolf » 06 май 2006, 09:58

Hamileon писал(а):Никак не пойму как перевести вид 0x04 в восьми битный. Есть ли для этого программа ? И зачем такие неудобства  :oops:

Ведь DDRB=0xFF; И DDRB = 1 тоже самое. Смысл в такой кривезне ?
К примеру TCCR0=0x05; Что значит ? В даташе в таблице 7 этого раздела нет таких чисел. Как установить деление ?


Почитайте что-нибудь по системам счисления, вроде http://www.codenet.ru/progr/dos/mem.php

Hamileon писал(а):Что еще у меня не правильно ?

Комментирую.

#include <90s2313.h>
#include <stdio.h>
#define F_CPU 4000000                            //незачем
#define K_DELAY_10ms    F_CPU/600        //незачем

//функция не нужна, есть системная delay_ms <delay.h>
void Delay_10ms(unsigned char t) {
 unsigned int i;
 if (t==0) return;
 while (t--) for(i=0;i<K_DELAY_10ms; i++);
}

void main(void) {
 
TIMSK=0x00;      //прерывание не разрешено
TCCR0=0x05;
   
#asm("sei")

DDRB.2=1;

while(1) {    
PORTB.2 = 1;  
 
Delay_10ms(10);    
   
PORTB.2 = 0;  

Delay_10ms(10);    

}
}    

//не осознал смысла прерывания
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {

PORTB.2 = 1;  
Delay_10ms(250);  
PORTB.2 = 0;  
Delay_10ms(250);
}
wolf
 
Сообщения: 63
Зарегистрирован: 23 июл 2005, 00:39
Откуда: Казань

Сообщение avr123.nm.ru » 06 май 2006, 10:54

Hamileon писал(а):Никак не пойму как перевести вид 0x04 в восьми битный.


А что вы делаете чтобы понять ?

просто смотрите на эти числа и ждете просветления ? озарения ?

=====

Число 0x04 это "не менее 3-х битное" число, т.е. оно и 8-ми и 50-ти битное

Наверно вы желаете видеть его в двоичном виде ?  сейчас оно в 16-ти ричном записано.

=====

Школьный курс информатики !  Формы представления чисел.

и куча инфы в сети и в любом учебнике по программированию - опять же в сети полно и ссылки на книги даны в кратком курсе.

Hamileon писал(а):Есть ли для этого программа ?  


Калькулятор windows     вид - инженерный.

Hamileon писал(а):И зачем такие неудобства  :oops:


Это удобно.

Вы полагаете вы один умный а все программисты в мире идиоты ? ну-ну.


Hamileon писал(а):Ведь DDRB=0xFF; И DDRB = 1 тоже самое.


как вы это открыли ?

прочитав выше:
TIMSK=1;   равносильно  TIMSK= 0b00000001;  



DDRB=0xFF равносильно DDRB = -1

Hamileon писал(а):К примеру TCCR0=0x05; Что значит ?


"Си для МК"  стр.5 курса  http://avr123.nm.ru/05.htm

Hamileon писал(а):Как установить деление ?


задачи курса  1,  3,  3new,  11        

Упражнения - задачи по курсу AVR


Hamileon писал(а):Сам по образованию Экономист. Никогда не програмил и непояль. Начал всего с недельку назад.
По этому мне так тяжело.


Вот ИМЕННО для начинающих я написал курс - САМЫЕ первые шаги.

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

Hamileon писал(а):как хоби хочу, а тут получается каторга, через два часа на работу вставать а у меня голова квадратная и спать хочется  :roll:


Ну дак и будет каторга - если вам говорят написано там-то а вы не читаете.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение avr123.nm.ru » 06 май 2006, 10:57

Hamileon писал(а):Как установить деление ?


запустить мастер начального кода компилятора и мышкой указать ему что вы хотите - он выдаст текст на Си.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Hamileon » 06 май 2006, 12:02

А что вы делаете чтобы понять ?

просто смотрите на эти числа и ждете просветления ? озарения ?


Часами сижу читаю даташу и ваш курс.  Уже на это целенаправлено потратил 16 часов. Непрерывного изучения.

В школе ? А ты в лицее учился ? Помню плохо, но помойму у нас всего пара занятий с компьютером. А так нам расказывали историю создания и все.


avr123 тебе гордость непозволяет просто переправить и показать как нужно ?
Если так то просто не отвечай ты отбиваешь охоту других отвечать то-есть мешаешь.

PS: А вообще очень странно столько вумных людей в других топиках а на простой ответ немогут ответить ? Не ужели это такой предмет гордости ? Вот мы крутые электроники(хотя я уверен что тут все кто есть в жизни либо учатся либо учились по этой професии либо близко и дальше по ней работают.)
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение avr123.nm.ru » 06 май 2006, 12:28

Блин! ну вот же цитата из задачи 1 - уж "100 раз" рекомендованой уважаемому Hamileon

http://avr123.nm.ru/mkkurs01.htm писал(а):
Строчка программы :

TCCR0 = 0x05;

поместит в переменную (регистр МК) число 0b00000101   (это и есть
0x05 или в десятичном виде число 5) - т.е. биты 2 и 0  "установятся" -
значит станут единицами.  


Конечно в программе можно написать так:

TCCR0 = 0b00000101;

или даже так:

TCCR0 = 5;
 
А выше мы уже нашли в ДШ что так (бит2_0     1  0  1) установится коэф. деления частоты кварца на 1024 и таймер начнет считать - в "нормальном режиме" - т.е. добавлять единицу к числу в регистре TCNT0  каждые 1024 периода колебаний сигнала (говорят еще - тактов, клоков) на ножке XTAL1.


Так же подробнейше! все рассказывается и в других материалах курса.


Еще цитата из "Си для МК"  стр. 5 курса:

http://avr123.nm.ru/05.htm писал(а):
Числа  

В компиляторе можно записывать в виде указанном в его Help'е !         Раздел - константы - Constants.

например  -  Целые числа могут быть записаны :

- в десятичной форме - 1234

- в двоичной форме с префиксом 0b так:  0b101001

- в шестнадцатеричной форме с префиксом 0x так:  0x5А

- в восьмеричной форме с префиксом 0  так: 0775


Числа с плавающей точкой имеют в записи эту точку и какое либо число после этой точки, вот так:   61.234   или так:  73.0

и могут иметь в конце   F   вот так: 61.234F




и затем идет таблица:

"Различные представления числа"
0xD3   равно   0b1101 0011   равно  211

подробная таблица.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17