Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт май 13, 2014 19:22:27
Откуда: г. Сургут

Сообщение kLeR1k »

ibiza11 писал(а):kLeR1k, код в студию!
kLeR1k писал(а):И как можно отключить ШИМ и посадить ногу на землю?

Код: Выделить всё

TCCR0A &= ~((1<<COM0A0)|(1<<COM0A1)); // если выход А
TCCR0A &= ~((1<<COM0B0)|(1<<COM0B1)); // если выход B
PORT &= ~(1<<BIT);
Компилятор ругается на COM0A0, как на неизвестную переменную. Если это имеет какое-то значение, пользуюсь CodeVisionAVR.
Спойлер

Код: Выделить всё

#include <tiny13.h>
#include <delay.h>

int cnt=0;
int pwmflag=1;
char Step=0xFF;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

if (pwmflag==1)
{
// Reinitialize Timer 0 value
TCNT0=0xFE;
// Place your code here
 cnt++;
 //Каждый 5000-й заход в прерывание
 if (cnt==5000)
 //if (cnt==2)
 {
  cnt=0; 
  //254 шага увеличения ширины импульса
  if (Step !=0xFE ) {
   Step++;
   OCR0A=Step;    
  }
 }   
}
}

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
  
}

// Declare your global variables here

void main(void)
{
//Задержка после включения поворота
int TurnOfDelay;
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
// State5=P State4=P State3=P State2=P State1=0 State0=0 
PORTB=0x3C;
DDRB=0x03;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9600,000 kHz
// Mode: Fast PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected


TCCR0A=0x83;      //83=non-inverted, C3=inverted
/* TCCR0A
  (10)=Clear OC0A on Compare Match, set OC0A at TOP
  |
 --    --(11)=Fast PWM + WGM02 in TCCR0B=0 
 10000011
*/ 
 
  
TCCR0B=0x01;
/* TCCR0B
     -(0)=WGM02
 00000001
*/

TCNT0=0x10;

OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x06;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: Off
#pragma optsize-
WDTCR=0x39;
WDTCR=0x29;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
pwmflag=1;
TurnOfDelay = 1500;
while (1)
      {  
          
          #asm("wdr"); //Сброс сторожевого таймера
          if (PINB.3==0) 
          {
               //Выключен поворотник
               if (PINB.1==1)
               {
                // Гасим поворотник
                PORTB.1 = 0;
               }
               if (TurnOfDelay<1500)
               {                  
                    // Ждём n секунды после этого, ДХО держим выключенными 
                    TurnOfDelay++;
                    if (pwmflag>0)
                    {
                        Step=0;
                        OCR0A=0; 
                        PORTB=0x00;
                        DDRB=0x03;
                        PORTB.0=0;
                        cnt=0;
                        pwmflag=0;
                    }
               }
               else
                {
                     if (PINB.4==0 && pwmflag==0)
                     {
                        //Прошло n секунд и не горят габариты - включаются ДХО  
                        PORTB=0x3C;
                        DDRB=0x03;
                        pwmflag=1;
                     }
                }
          }
          else
          {
            //Включен поворотник - выключаются ДХО, зажигается поворотник  
            TurnOfDelay = 0;
            if (pwmflag>0)
            {
                Step=0;
                OCR0A=0; 
                PORTB=0x00;
                DDRB=0x03;
                PORTB.0=0;
                cnt=0;
                pwmflag=0;
            }
            if (PINB.1==0)
            {
                PORTB.1 = 1;
            }
          }
          if (PINB.4==1)
           {                  
                //Если включены габариты - ДХО выключены
                if (pwmflag>0)
                {
                    Step=0;
                    OCR0A=0; 
                    PORTB=0x00;
                    DDRB=0x03;
                    PORTB.0=0;
                    cnt=0;
                    pwmflag=0;
                }
           }
           else
           {       
                if (PINB.3==0 && TurnOfDelay>=1500 && pwmflag==0)
                {
                    // Габариты выключены и поворотник выключен n секунд назад - включаются ДХО
                    PORTB=0x3C;
                    DDRB=0x03;
                    pwmflag=1;
                }
           }
          // Не сработало ни одно из условий, но есть питание - ДХО включаются по прерыванию    
          delay_us(100);  
      };
}
Извиняюсь за грязный код, рефакторить ещё пока толком и не чего...
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Компилятор ругается на COM0A0, как на неизвестную переменную.
Так определите ее сами через #define
Fucking static initialization order fiasco
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

kLeR1k писал(а):Компилятор ругается на COM0A0, как на неизвестную переменную. Если это имеет какое-то значение, пользуюсь CodeVisionAVR.

Код: Выделить всё

#define COM0B0 4
#define COM0B1 5
#define COM0A0 6
#define COM0A1 7
Ставим плюсы: )
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Скажите пожалуйста если мне надо оцифровывать невысокие напряжения порядка 0,01 - 0,5 Вольт.
Могу ли я подать на AREF например образцовое напряжение 0,512 Вольт ? Таким образом при 8 бит дискретизации получить одно деление равно 0,002 Вольта.

Второй вопрос может ли компаратор встроенный в Atmega 48 Сравнивать напряжения уровня 0,1 Вольт ?
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Все возможно. Только сложно будет такой точности напряжения добиться.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25996
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

amd9800 писал(а): Могу ли я подать на AREF например образцовое напряжение 0,512 Вольт ?
Подать конечно можно, но получить что либо в результате - нет.
Даташит определяет МИНИМАЛЬНОЕ значение референсного напряжения - 2(ДВА) Вольта.
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Подать-то может и можно, только сразу же вырастет шум и упадет точность, кроме того надо очень тщательно разводить шины аналогового питания контроллера, особенно общий провод - 2 миливольта навести там очень просто - соседняя дорожка с током порядка 100мА, сам ток по этой же дорожке в десяток милиампер - и твои 2мВ падения имеешь, в итоге кроме шума самого АЦП добавится непредсказуемый шум по шине питания.
Контактная информация:
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Понял. Тогда получается надо усилить сигнал с помощью ОУ ?

И как быть с таким описанием в даташите. Вы пишите про 2 Вольта а у атмеги48 встроенное 1,1 вольта, что то у вас не вяжется.
The reference voltage for the ADC (VREF) indicates the conversion range for the ADC. Single ended channels that exceed VREF will result in codes close to 0x3FF. VREF can be selected as either AVCC, internal 1.1V reference, or external AREF pin.
Последний раз редактировалось amd9800 Вс июн 29, 2014 23:21:31, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 25996
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Да, именно так и получается.
Причем выбирать ОУ нужно с учетом диапазона измеряемых напряжений...
Не все они Rail-to-Rail... Причем не все по входу и не все по выходу...
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

"КРАМ" скажите пожалуйста где в даташите atmega 48 указанно 2 вольта?
Последний раз редактировалось amd9800 Вс июн 29, 2014 23:38:56, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 25996
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Я ошибся. Просто бегло прочел название Вашего контроллера и посмотрел в даташит на 8-ую Мегу.
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

возможно ли на Atmega48 так настроить таймер?

Например если чип работает на частоте 8МГц и мне необходима частота ШИМа 25Кгц.

То можно настроить 16 битный таймер (Timer 1) чтоб он тикал до 320 и потом таймер сбрасывался ?
Поскольку у Atmega 48 два регистра сравнения на каждый таймер то первый регистр сравнения ставим 320, а второй будет принимать динамические значения от 0 до 320. И он будет связан с выходом OC1B. Таким образом ШИМ будет от 0 до 320 по дискретизации и частота будет 25КГц.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это режим работы таймера 8 или 9.
Контактная информация:
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Не понял вашего ответа
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ну ёпта, ты даташит на контроллер открывал? Там все режимы работы таймера расписаны, так нужный тебе режим работы - 8 или 9. Впрочем, номер режима работы задается определенными битами управляющего регистра. Но рекомендую все-таки ознакомится с даташитом, т.к. от режима работы таймера зависят и остальные необходимые настройки.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Мало того, что грубите, еще и неверно ответили. Подойдет любой режим PWM в котором можно установить значение TOP: 8,9,10,11,14,15.
Изображение
Ставим плюсы: )
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Alexeyslav писал(а):Ну ёпта, ты даташит на контроллер открывал? Там все режимы работы таймера расписаны
Уважаемый Алексей 8 бит это отчет до 256.
А 9 бит это уже отчет до 512.

А мне нужно получить частоту 25КГц при частоте чипа 8МГц. Вы наверное даже не поняли моего вопроса а отвечаете грубо и непрофессионально. Подозреваю что вы очень плохо разбираетесь в микроконтроллерах.

И кстати даташит я не только открывал но и читал, и про режимы 8бит 9бит и 10бит я знаю.
ibiza11 писал(а):Подойдет любой режим PWM в котором можно установить значение TOP: 8,9,10,11,14,15.
Хорошо выбираю я режим 9.

В регистре TCCR1B выставляю биты WGM13 WGM12 в положение - 1 0
В регистре TCCR1A WGM11 WGM10 в положение - 0 1

А дальше какие действия?

Может вы не поняли постановку задачи?
Допустим мне надо чтоб ШИМ работал по такому принципу. В одном регистре сравнения я задаю значение к примеру 10. Выход PORTB.2 (OC1B) сигнал будет изначально Высоким таймер потикал 10 тактов и поменял сигнал на выходе на Низкий потом потикал еще 310 таков до 320 и таймер сбросился в ноль, сигнал стал высоким. И опять все с начала.



Выставил я временно вместо 320 -> 256 чтоб сравнить частоту с таймером 0 (на нем у меня обычный 8 бит ШИМ - частота получается 31,2 КГц)

TCCR1A=0b10100001;
TCCR1B=0b00010001;

TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0x20;

Так непонятно почему получается частота ШИМ 1 в два раза ниже хотя должна быть одинаковой.
Желтый это образцовый сигнал из протеуса на 24КГц
Синий и Красный это выходы А и Б от таймера 0
Зеленый это выход Б от таймера 1
Выход А постоянно высокий
Изображение
Вложения
PWM.PNG
(8.52 КБ) 643 скачивания
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Наверно поэтому. Сравните иллюстрации режимов 9 и 15. Есть существенная разница, не так ли. Именно поэтому здесь был предложен режим 14 или 15.
In phase and frequency correct PWM mode the counter is incremented until the counter value matches either the
value in ICR1 (WGM13:0 = 8), or the value in OCR1A (WGM13:0 = 9). The counter has then reached the TOP and
changes the count direction.
The TCNT1 value will be equal to TOP for one timer clock cycle. The timing diagram
for the phase correct and frequency correct PWM mode is shown on Figure 16-9 on page 129. The figure shows
phase and frequency correct PWM mode when OCR1A or ICR1 is used to define TOP. The TCNT1 value is in the
timing diagram shown as a histogram for illustrating the dual-slope operation. The diagram includes non-inverted
and inverted PWM outputs. The small horizontal line marks on the TCNT1 slopes represent compare matches
between OCR1x and TCNT1. The OC1x Interrupt Flag will be set when a compare match occurs.
Последний раз редактировалось akl Пн июн 30, 2014 09:53:18, всего редактировалось 1 раз.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Хм, просто создалось такое впечатление что даташит не открывали. Чем же режимы 8 или 9 не подходят? не позволяют получить 25кГц при 8Мгц тактовой частоте? Просто TOP значение придется ставить не 320 а 160.
Кроме установки режима работы таймера(последним действием) надо будет установить режим работы выхода COM1B1:0(=0b10 или 0b11 в зависимости от полярности требуемых импульсов) в регистре TCCR1A, в OCR1A занести значение 160(=320/2) а OCR1B нужное значение ШИМ 0..159.
При этом желательно отключить таймер TCCR1B CS12:0 = 0b000 и после настойки и установки режима работы включить его TCCR1B CS12:0 = 0b001.
Контактная информация:
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Alexeyslav писал(а):При этом желательно отключить таймер TCCR1B CS12:0 = 0b000 и после настойки и установки режима работы включить его TCCR1B CS12:0 = 0b001.
для чего надо отключать таймер, а потом включать?
Alexeyslav писал(а):Хм, просто создалось такое впечатление что даташит не открывали.
Впечатления у вас не правильные.



Как мне правильно определить какие пины использовать на Atmega 48.

Задача:
1. Выход под ШИМ - определился использовать OC1B (PB2)
2. Нужен целый порт для семи сегментного индикатора и 4 пина для катода поскольку он(индикатор) 4х значный
3. Нужен компаратор сравнивать один сигнал который постоянно меняется с одним постоянным напряжением
4. Нужно 2 Канала ADC я выбрал ADC6 и ADC7
5. 3 кнопки, но без вызова прерывания.
Ответить

Вернуться в «Разные вопросы по МК»