Вт дек 06, 2022 22:45:04
Ср дек 07, 2022 06:10:05
Вт апр 11, 2023 21:13:48
Вт апр 11, 2023 23:50:24
Нету там внешнего источника синхронизации! Есть внешний источник тактовой частоты. А синхронизация делается с внутренней тактовой частотой ядра, чтобы пользователь не пытался подать на входы Т0/Т1 частоту выше внутренней.таймеров есть режим "внешний источник синхронизации
Во всех режимах, со всеми прерываниями.Вопрос - как можно использовать такой прескалер, при каких режимах, с какими прерываниями.
Чего там гуглить-то??? Всё расписано в даташите, глава 17 (T0&T1 Prescalers), 15 (8-bit T0) и 16 (16-bit T1). Ну подали тактовую частоту не изнутри, а снаружи, вот и все дела.Гуглил про "внешний источник синхронизации Tn_FALLING/Tn_RISING" - информации не очень много.
Пт апр 14, 2023 22:24:14
/* ATmega328P/ATmega2560 AtmelStudio -std=c++14 */
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include "E:\lib\src\AVR\GPIO.h"
#include "E:\AVR_PWM\Timers328(test)\src\TimerHelpers.h"
// Частота регулируется предделителем. Режим 1
// для F_CPU 16000000
// clk/1 - 31,4 kHz,
// clk/8 - 3,9 kHz, 16000000/8 = 2000000 Hz
// clk/64 - 490 Hz, 16000000/64 = 250000 Hz
// clk/256 - 122 Hz, 16000000/256 = 62500 Hz
// clk/1024 - 30 Hz 16000000/1024 = 15625 Hz
TimerHelper16<1, PRESCALE::Tn_RISING, (PORT::SET_A_ON_COMPARE | PORT::SET_B_ON_COMPARE)> timer1;
GPIO<BOARD::OC1A> OC1A; // PinB1
GPIO<BOARD::OC1B> OC1B; // PinB2
GPIO<BOARD::T1> T1; // PinD5
int main(void){
// Порты на вывод
OC1A.output();
OC1B.output();
T1.input();
T1.high();
timer1.setMode<TimerControlRegister::TCCR_1A, TimerControlRegister::TCCR_1B>();
TCNT1 = 0; // 256 max
OCR1A = 200;
OCR1B = 200;
while (1) { }
return 0;
}
Вт май 09, 2023 16:19:30
Чт июн 01, 2023 11:34:14
#include <tiny2313.h>
#include <math.h>
#include <io.h>
#include <delay.h>
#define F_CPU (8000000)
#define VFG_TIMER_MAX (65535)
#define VFG_PIN0 PORTB0
#define VFG_PIN1 PORTB1
#define VFG_PIN2 PORTB2
#define VFG_DDR DDRB
#define VFG_PORT PORTB
float fG=100;
unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
//void Tim1Init(void);
//void SetUpTim1A(double Foc);
void Tim1Init(void)
{
VFG_DDR = (1<<VFG_PIN0); // set pin as OUTPUT
TCCR1A = (1<<COM1A0); //toggle on compare
TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10); // set timer CTC mode
TIMSK = (1<<OCIE1A);
//SetUpTim1A(0);
#asm("sei")
}
void SetUpTim1A(float Foc) //set value OCR1A register
{
float TimDiv, OCRnx_calc=0;
unsigned int ret_OCRnx=0;
unsigned char ClockSelect=0;
unsigned char i=0;
for(i=0;i<=4;i++) {
TimDiv=(F_CPU/(2*Foc*N[i])-1);
OCRnx_calc = ceil((TimDiv/Foc) - 1);
if(OCRnx_calc >= 0 && OCRnx_calc<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
}
ret_OCRnx = (unsigned int)OCRnx_calc;
OCR1A = ret_OCRnx;
TCCR1B = (1<<WGM12) | ClockSelect;
}
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
VFG_PORT ^= (1<<VFG_PIN0);
}
void main(void)
{
unsigned char nG;
Tim1Init();
#asm("sei")
while(1)
{
fG=200;
SetUpTim1A(fG);
delay_ms(50);
}
}
Пт июн 02, 2023 10:03:04
Пт июн 02, 2023 10:13:53
Ivanoff-iv писал(а):warptred12, у тебя обновление регистров не там записано, или в ветвление их внеси или из цикла убери...
а флоаты там действительно нужны? как-никак 75% флеша поели....
Добавлено after 3 minutes 28 seconds:
да, и строка OCRnx_calc = ceil((TimDiv/Foc) - 1); не нужна...
хватит и OCRnx_calc = TimDiv; наверно... если я правильно понял замысел
#include <tiny2313.h>
#include <math.h>
#include <io.h>
#include <delay.h>
#define F_CPU (8000000)
#define VFG_TIMER_MAX (65535)
#define VFG_PIN0 PORTB0
#define VFG_PIN1 PORTB1
#define VFG_PIN2 PORTB2
#define VFG_DDR DDRB
#define VFG_PORT PORTB
unsigned int fG=100;
unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
void Tim1Init(void)
{
VFG_DDR = (1<<VFG_PIN0); // set pin as OUTPUT
TCCR1A = (1<<COM1A0); //toggle on compare
TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10); // set timer CTC mode
TIMSK = (1<<OCIE1A);
//SetUpTim1A(0);
#asm("sei")
}
void SetUpTim1A(unsigned int Foc) //set value OCR1A register
{
unsigned int TimDiv;
unsigned char ClockSelect=0;
unsigned char i=0;
for(i=0;i<=4;i++) {
TimDiv=(F_CPU/(2*Foc*N[i])-1);
if(TimDiv >= 0 && TimDiv<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
OCR1A = TimDiv;
TCCR1B = (1<<WGM12) | ClockSelect;
}
}
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
VFG_PORT ^= (1<<VFG_PIN0);
}
void main(void)
{
unsigned char nG;
Tim1Init();
#asm("sei")
while(1)
{
fG=200;
SetUpTim1A(fG);
delay_ms(50);
}
}
Пт июн 02, 2023 10:31:09
void SetUpTim1A(float Foc) //set value OCR1A register
{
float TimDiv, OCRnx_calc=0;
unsigned int ret_OCRnx=0;
unsigned char ClockSelect=0;
unsigned char i=0;
for(i=0;i<=4;i++) {
TimDiv = (F_CPU/(2*Foc*N[i])-1);
OCRnx_calc = TimDiv; //ceil((TimDiv/Foc) - 1);
if(OCRnx_calc >= 0 && OCRnx_calc<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
}
}
ret_OCRnx = (unsigned int)OCRnx_calc;
OCR1A = ret_OCRnx;
TCCR1B = (1<<WGM12) | (ClockSelect<<CS10);
}
Пт июн 02, 2023 10:45:55
void SetUpTim1A(float Foc) //set value OCR1A register
{
float TimDiv, OCRnx_calc=0;
unsigned int ret_OCRnx=0;
unsigned char ClockSelect=0;
unsigned char i=0;
for(i=0;i<=4;i++) {
TimDiv = (F_CPU/(2*Foc*N[i])-1);
OCRnx_calc = TimDiv; //ceil((TimDiv/Foc) - 1);
if(OCRnx_calc >= 0 && OCRnx_calc<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
}
}
ret_OCRnx = (unsigned int)OCRnx_calc;
OCR1A = ret_OCRnx;
TCCR1B = (1<<WGM12) | (ClockSelect<<CS10);
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
VFG_PORT ^= (1<<VFG_PIN0);
}
Пт июн 02, 2023 10:52:52
Пт июн 02, 2023 10:55:09
Пт июн 02, 2023 11:23:30
void set_out_pin (char num){
nG=1<<num;
VFG_DDR = nG;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
VFG_PORT = (VFG_PORT^nG)&(nG);
}
Пт июн 02, 2023 11:31:10
#include <tiny2313.h>
#include <math.h>
#include <io.h>
#include <delay.h>
#define F_CPU (8000000)
#define VFG_TIMER_MAX (65535)
#define VFG_PIN0 PORTB0
#define VFG_PIN1 PORTB1
#define VFG_PIN2 PORTB2
#define VFG_DDR DDRB
#define VFG_PORT PORTB
unsigned int fG=100;
unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
void Tim1Init(void)
{
TCCR1A = (1<<COM1A0); //toggle on compare
TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10); // set timer CTC mode
TIMSK = (1<<OCIE1A);
//SetUpTim1A(0);
#asm("sei")
}
void SetUpTim1A(unsigned int Foc) //set value OCR1A register
{
unsigned int TimDiv, OCRnx_calc=0;
unsigned int ret_OCRnx=0;
unsigned char ClockSelect=0;
unsigned char i=0;
for(i=0;i<=4;i++) {
TimDiv = (F_CPU/(2*16*Foc*N[i])-1);
OCRnx_calc = TimDiv;
if(OCRnx_calc >= 0 && OCRnx_calc<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
}
}
ret_OCRnx = (unsigned int)OCRnx_calc;
OCR1A = ret_OCRnx;
TCCR1B = (1<<WGM12) | (ClockSelect<<CS10);
}
void UpdateTim1A(unsigned int freq) //хранение старого значения
{
static unsigned int fG_old = 0;
if (fG_old != freq)
{
SetUpTim1A(freq);
fG_old = freq;
}
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
unsigned char msc=(1<<nG);
VFG_DDR = msc;
VFG_PORT = (VFG_PORT^msc)&(msc);
}
void main(void)
{
static unsigned int fG_old = 0;
Tim1Init();
UpdateTim1A(fG);
#asm("sei")
for(;;) {
if (fG_old != fG) { //проверка, не изменилось ли старое значение
SetUpTim1A(fG);
fG_old = fG;
}
nG=0; //номер генератора
fG=4; //частота генератора
SetUpTim1A(fG);
delay_ms(50);
}
}
Пт июн 02, 2023 11:42:03
Пт июн 02, 2023 11:45:37
Пт июн 02, 2023 11:46:22
#include <tiny2313.h>
#include <math.h>
#include <io.h>
#include <delay.h>
#define F_CPU (8000000)
#define VFG_TIMER_MAX (65535)
#define VFG_DDR DDRB
#define VFG_PORT PORTB
float fG=0;
unsigned char nG;
const unsigned int N[]={1,8,64,256,1024};
//void Tim1Init(void);
//void SetUpTim1A(double Foc);
void Tim1Init(void)
{
TCCR1A = (1<<COM1A0); //toggle on compare
TCCR1B = (1<<WGM12); // set timer CTC mode
TIMSK = (1<<OCIE1A);
//SetUpTim1A(0);
}
void SetUpTim1A(float Foc) //set value OCR1A register
{
static float Old=0;
unsigned long int TimDiv;
unsigned char i, ClockSelect=0;
if (Old==Foc) return; //проверим нужно ли обновлять.
Old=Foc;
for(i=0;i<=4;i++) {
TimDiv = (F_CPU/(2*Foc*N[i])-1);
if(TimDiv<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
}
}
OCR1A = TimDiv;
TCCR1B = (1<<WGM12) | (ClockSelect<<CS10);
}
void set_out_pin (char num){
nG=1<<num;
VFG_DDR = nG;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
VFG_PORT = (VFG_PORT^nG)&(nG);
}
void main(void)
{
Tim1Init();
set_out_pin(0);
#asm("sei")
while(1)
{
fG=200;
SetUpTim1A(fG);
delay_ms(50);
}
}
Пт авг 25, 2023 17:42:51
const uint8_t MOTOR_RIGHT_PWM = 10;
const uint8_t MOTOR_LEFT_PWM = 9;
analogWrite(MOTOR_RIGHT_PWM, pwm);
Сб авг 26, 2023 07:12:58