реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Timer1 mega8, не получается запустить
Метценгерштейн
сообщение Mar 6 2012, 20:37
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Код
...
//=========================== interrupts =====================================
#pragma vector = TIMER1_COMPA_vect
__interrupt void overflow_timer1(void)
  {
    cpl (LED); //частота прерываний 76 кГц (период 38 кГц)
  }
//============================================================================
//****************************************************************************
//============================================================================
char __low_level_init (void) {  
        
        TCCR1B= (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10); //CTC mode, prescaling /8
        TIMSK = (1<<TOIE1)|(1<<OCIE1A);   //for counter counter 1
        OCR1A= 9524;
...


задача- меандр с частотой 38 КГц. Кварц 16 МГц.

нет на осцилле сигнала. Вроде все проинициализировал...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 6 2012, 23:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Метценгерштейн @ Mar 6 2012, 22:37) *
Вроде все проинициализировал...


Может и всё, но из кода это не видно.
Цитата(Метценгерштейн @ Mar 6 2012, 22:37) *
[/code]
TCCR1B= (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10); //CTC mode, prescaling /8
TIMSK = (1<<TOIE1)|(1<<OCIE1A); //for counter counter 1
...[/code]


CTC mode: WGM=4
Что в TCCR1A записано?
Go to the top of the page
 
+Quote Post
vao
сообщение Mar 7 2012, 03:43
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 144
Регистрация: 12-05-09
Из: Воронеж
Пользователь №: 48 973



А где настройка TCCR1A и порта ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 7 2012, 05:22
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А не проще меандр на pwm модуле таймера делать (и прерывания будут не нужны вовсе)?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 7 2012, 07:59
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



TCCR1A не настраивал, т.к. мне там ничего не нужно было. Или настроить обязательно что-то надо?

может и проще без прерываний, но пока так хочу чтобы заработало.

Порт просто на выход настроен. чего с ним -то может быть.

из даташита на мегу

тут WGM
режим 4 0 1 0 0 CTC OCR1A Immediate MAX
и только WGM12 стоит 1.

и зачем мне тогда TCCR1A ?

Сообщение отредактировал Метценгерштейн - Mar 7 2012, 08:32
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 7 2012, 11:11
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Метценгерштейн @ Mar 7 2012, 11:59) *
и зачем мне тогда TCCR1A ?

Ви не там ищете. sm.gif
cpl(LED) - это что?
Нафига TOIE1 включен?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 7 2012, 12:09
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



cpl (LED)- это есть такой Аскольд. Его макрос- т.е. перевернуть бит на противоположный. с нуля на единицу.
этим же макросом включить
on(LED);
выключить
off (LED);

это работает- к этому нет претензий

TOIE1 -прерывания по переполнению, до которых не доходит- значит не нужен. Так?

Сообщение отредактировал Метценгерштейн - Mar 7 2012, 12:18
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 7 2012, 14:28
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



У меня постоянно такие проблемы возникают: разрешил прерыв. от переполнения, а включил от компаратора, и наоборот. Симуль в помощь. Ну нет там больше ничего эдакого!
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 7 2012, 16:08
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Разобрался с проблемой. Она была не в счетчиках.

В настройках ИАРа я указал язык С++, а не СИ. Как только поменял на СИ- все заработало.

Вопрос- что компилятор выкидывал из кода, когда компилил на С++

Код
#include <ioavr.h>       // здесь объявлены все SFR для 2313
#include <stdint.h>      // в нем описан uint32_t
#include <inavr.h>       // здесь объявлены фукции разрешения/запрета прерываний, nop и прочие полезные                          
#include "ascold.h"      // здесь описаны очень удобные макросы дерганья ногами
#include "Hardware.h"
#include "RS232.h"

#define LED_BLINK_PERIOD 500U

volatile uint32_t CntT1_ms;

//=========================== interrupts =====================================
#pragma vector = TIMER1_COMPA_vect
__interrupt void overflow_timer1(void)
  {
    CntT1_ms++; // each ms will interrupt
    cpl (TST);
  }
//============================================================================
//****************************************************************************
//============================================================================
char __low_level_init (void) {   // эта функция вызывается сразу после
                                 // включения процика после установки
                                 // указателей стека.
                                 // Здесь можно настроить периферию
        
        TCCR1B= (1<<WGM12) | (0<<CS12)|(0<<CS11) |(1<<CS10); //CTC mode, no prescaling
        TIMSK = (1<<OCIE1A);   //for counter 0 and counter 1 (1<<TICIE1)
        OCR1A= (OSC / 1000);

        PORTB = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);            // все ноги в 0
        DDRB =(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);              // все ноги на вывод

        PORTD = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);            // все ноги в 0
        DDRD =(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);              // все ноги на вывод
        
        PORTC = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);            // все ноги в 0
        DDRC =(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);              // все ноги на вывод
        
        return 1;            // После возвращения проинициальзировать память                              
}
//============================================================================
//****************************************************************************
//====================== подфункции ==========================================
void  Delay(uint32_t t)         // только с большой буквы Delay!!! Конфликтует.
    {                           // на задержке noop
    volatile uint32_t i;
    for(i = 0; i < t; i++) {
            }
    }

//============================================================================
//****************************************************************************
//================ main ======================================================


  void main (void) {
__enable_interrupt();
uint32_t timeStamp =CntT1_ms;
    for(;;) {              

       if ((CntT1_ms-timeStamp) >= LED_BLINK_PERIOD) {
          cpl (LED);
          timeStamp =CntT1_ms;
     }

  }
}
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 7 2012, 16:48
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Метценгерштейн @ Mar 7 2012, 18:08) *
Разобрался с проблемой. Она была не в счетчиках.

В настройках ИАРа я указал язык С++, а не СИ. Как только поменял на СИ- все заработало.

Вопрос- что компилятор выкидывал из кода, когда компилил на С++


Последние несколько лет использую IAR AVR настроенный как С++ и никогда компилятор не выкидывал ничего из инициализации. Правда инициализация у меня вызывается в main.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 7 2012, 17:02
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



факт- выкинул. как только на Си заменил- все путем. ИАР компилятор у меня.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 7 2012, 17:10
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Метценгерштейн @ Mar 7 2012, 19:02) *
факт- выкинул. как только на Си заменил- все путем. ИАР компилятор у меня.


Вставте в main для интереса, выкинет или нет?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 7 2012, 17:16
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



С IAR-ом мало знаком, но некоторые соображения имеются.
Компилятор не выкидывал ничего, но вот функция char __low_level_init (void) в режиме С++ получила «декорированное» имя и уже линкер её проигнорировал, подшил пустышку из библиотеки.
Попробуйте
Код
extern "C" char __low_level_init (void)
{
...
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Mar 7 2012, 19:09
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, так и есть. Как только написал

extern "C" char __low_level_init (void)

сразу на С++ все заработало. Без extern "C" - на С++ не работает.

А что тут получается? Что дает extern "C" ? Принудительно эту функцию компилит как Си?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 7 2012, 21:56
Сообщение #15


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Метценгерштейн @ Mar 7 2012, 23:09) *
Без extern "C" - на С++ не работает.
А что тут получается? Что дает extern "C" ? Принудительно эту функцию компилит как Си?

А потому что у C++ того - ... полиморфизм sm.gif. То бишь в нем разрешается иметь много одинаково названных функций, отличающихся только списком параметров и/или возвращаемым значением. А простой C такие вольности не позволяет.

А чтобы разные функции под C++ не перепутались, компилятору приходится их назвать по-разному, придумывая им названия из комбинации имени функции, которую ей дал программист, с шифром, указывающим на типы возвращаемого значения и параметров. Например, функцию:
char __low_level_init(void)
C++ компилятор мог бы скопилировать (дать метку) под именем C_V__low_level_init или как-нибудь в том же роде.

Поэтому на C++ обычно невозможно создать такую метку функции, чтобы она линковалась с "нормальными" библиотеками или ассемблерным кодом. Разве что на ассемблере можно создать метку, чтобы она с C++ой компиляцией совпадала. Впрочем, посредством extern "C" или других экстернов можно заставить С++ компилить функцию по другим правилам, только это уже не будет C++.

У обычного же C имена функций обычно предсказуемы, хотя и этот частенько модифицирует данное програмистом имя, добавляя к нему спереди префикс (чаще подчеркивание). И лишь славный ассемблер sm.gif компилит функции с тем же именем, как ее назвал программист.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016