Jump to content

Recommended Posts

46 минут назад, Дмитрий Вас сказал:

я мог и накосячить кстати

Скорее всего, именно так и вышло.

Сдвиг нуля всегда даст в итоге НОЛЬ, как ни двигай. Поэтому у вас битовое И с нулем, т.е. PCNF0 станет равно 0.


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites

в общем какие то странности. в моем мк когда пишу так 

OCR0RA=speed; //on-time
OCR0SA=50;//dead time

и speed прогоняю через энкодер то ширина импульсов меняется все ок. 

когда делаю так 

void PSC0_sin_gen (void)
{
	
	for (unsigned int A=0;A<=161;A++)
	{ 
	//PCNF0 = 0b;//разрешается перезапись 
	OCR0RA = tab_sin[A];
	OCR0SA = 50;
	OCR0RB = 0;
	OCR0SB = 0;
	//PCNF0 = 0b00010010;//перезаписано
	if (A==161) A=0; 
	}
}

ничего не происходит, сам массив

unsigned char tab_sin[161]=
   {0,2,3,5,7,8,10,12,13,15,
	17,18,20,22,23,25,26,28,30,31,
	33,34,36,38,39,41,42,44,46,47,
	49,50,52,53,55,56,58,59,61,62,
	63,65,66,68,69,71,72,73,75,76,
	77,79,80,81,82,84,85,86,87,89,
	90,91,92,93,94,95,97,98,99,100,
	101,102,103,104,105,106,107,107,108,109,
    110,109,108,107,107,106,105,104,103,102,
    101,100,99,98,97,95,94,93,92,91,
	90,89,87,86,85,84,82,81,80,79,
	77,76,75,73,72,71,69,68,66,65,
	63,62,61,59,58,56,55,53,52,50,
	49,47,46,44,42,41,39,38,36,34,
	33,31,30,28,26,25,23,22,20,18,
	17,15,13,12,10,8,7,5,3,2,0};

короче весь полупериод синусоиды 

Share this post


Link to post
Share on other sites

Кажется, я вам уже говорил, что у вас какой-то странный подход... вам надо завести один из таймеров на какую-то частоту, и по прерыванию этого таймера обновлять только OCR0A, не трогая остальное, которое должно оставаться единожды настроенным всегда (если, конечно, мертвое время вы на лету менять не планируете. Для чего без малейших задержек в цикле менять значения OCR0A, которое активируется только по истечению периода очередного импульса ШИМ, я не понимаю.


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites

Вебинар "Разбор новых уникальных модулей FMAC и CORDIC в микроконтроллерах общего назначения STM32G4" (15.07.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре 15.07.2020, посвященном новому семейству микроконтроллеров общего назначения – STM32G4. Вебинар рассчитан на технических специалистов и тех, кто знаком с основами цифровой обработки сигналов. Мы разберем алгоритм работы CORDIC, а также рассмотрим пример создания цифрового фильтра на базе FMAC.

Зарегистрироваться на вебинар

А зачем нужен массив с 161 значением?  если 80 достаточно, дважды заносите одни и те же значения. Ваш цикл for пролетает за доли секунды

В этой строчке тоже не вижу необходимости  if (A==161) A=0;


Сергей.

Share this post


Link to post
Share on other sites
                     

Новые контроллеры VIPerPLUS для ИП – видео и материалы вебинара STMicroelectronics

Видеозапись и материалы вебинара ST о семействе AC/DC регуляторов VIPerPLUS производства компании STMicroelectronics. Инженерами ST было детально рассмотрено новое семейство микросхем VIPerPLUS со встроенным транзистором, их возможности и топологии применения. Продемонстрировано испытание из лаборатории ST в Праге и моделирование в среде E-DesignSuite.

Подробнее

я не знаю как это сделать, знаю только что шим работает от CLKpll, и какой это таймер? какой то внутренний генератор на 64мгц! там еще делители настраиваются

PCNF2|=PSC2_FOUR_RAMP//Four Ramp Mode
	     |(1<<PCLKSEL2)//выбираем CLK PLL стр 162 таб.16-9

энкодер от первого таймера, 

и как синхронизировать эти таймеры? вот тактирует он от своего PLL импульсы а мы тут влазим...

Share this post


Link to post
Share on other sites
                     

Конденсаторы ECWFG от Panasonic: теперь и для высоковольтных применений

Компания Panasonic анонсировала существенное расширение серии пленочных конденсаторов ECWFG: на сегодняшний день диапазон рабочих напряжений серии составляет 630…1100 В (DC). Серия ECWFG поддерживает уникальную функцию микропредохранителей.

Подробнее

28 минут назад, Дмитрий Вас сказал:

и как синхронизировать эти таймеры?

Они сихронизируются аппаратно: вы заносите в OCR0RA новое значение, оно пишется в промежуточный регистр, и ждет, пока аппаратная часть доделает начатый период ШИМ, а затем перегрузит это значение в рабочий регистр. Как-то так.

То есть вам не надо думать о синхронизации, но вы должны понимать, что если вы не даете МК времени на доделывание ШИМа, а постоянно обновляете регистр, момент синхронизации не наступает (или наступает очень редко), в итоге вы видите не то, что ожидаете.

31 минуту назад, Дмитрий Вас сказал:

я не знаю как это сделать

Очень просто: я же вам написал! Допустим, таймер0 настраиваете на прерывания 100 раз в секунду, в обработчике пишите своё 

OCR0RA = tab_sin[A];
if(++A >= 160) A = 0;

И все. А остальную писанину в регистры делаете один раз на этапе инициализации периферии в вашей программе. Ну, разве что еще переменная A у вас должна быть внутри обработчика объявлена static uint8_t A;


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
2 минуты назад, ARV сказал:

if(++A >= 160) A = 0;

какой интересный запись , приму на заметку.

Share this post


Link to post
Share on other sites

где то я опять сделал ошибку и закрыл не проверив, теперь ругается

ISR(TIMER0_COMPA_vect)
{
	static uint8_t A;
	//static uint8_t B;
	//static uint8_t C;
	OCR0RA = tab_sin[A];
	OCR0SA = 50;
	OCR0RB = 0;
	OCR0SB = 0;
	if(++A >= 160) 
	    { 
		  OCR0RB = tab_sin [A];
		  OCR0SB = 50;
		  OCR0RA = 0;
		  OCR0SA = 0;
		  A = 0;
		};

Ошибка двух или более типов данных в спецификаторах объявлений, вот что пишет

Share this post


Link to post
Share on other sites
Posted (edited)

Доброго дня! Подскажите пожалуйста , если  впомните вдруг. Нужно контроллер подобрать по корпусу СО-8. И ногам питания (не очень стандартным) 8-Vcc. 4-Vss.  (по олдовой геометрии ТТЛ в общем, если так можно выразится. Последняя нога" +" , и по диагонали" -")

По функционалу понадобятся I2C  и EEPROM.

Буду благодарен , если вспомнит кто-нибудь в распостраненном семействе. Либо вариант посоветует (не космического масштаба ) заказать небольшую партию известного образца с моей распиновкой 

 

РS: "аттини 13" нашел пока. Но слабенькая она совсем 

Edited by Пришел в кедах

Share this post


Link to post
Share on other sites

любой восьмилапый ПЫХ ,  только у них пин8 = Vss(-) , пин4,пин1 = Vdd(+)

по фукционалу из доступных 12F1822, 12F1840

Share this post


Link to post
Share on other sites
2 часа назад, Пришел в кедах сказал:

Но слабенькая она совсем

Да ладно, слабенькая! Нормальная для своих "лет" :) Есть её старшие сестрички attiny25 и attiny85. Сейчас есть и другие, но я не помню их по имени...


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites

Вся задача как раз в готовые платы упихать. Там 1-й пин уже незамысловатый логический вход .. А так.. На ПИКе идеально было бы для меня

Share this post


Link to post
Share on other sites

Добрый вечер.

В очередной раз пытаюсь постигнуть эту "магию " программирования.

Прошу совета.

Сейчас читаю  книги по автоматному программированию, автор Шалыто, понравилась логика и сама концепция .

Ну и возник вопрос,совета просить не у кого,

Возможно ли (почему нельзя) использовать конструкцию типа :

if(PINB0 & !PINB1)     //  если PINBO=1 а PINB1=0, то делаем что-то

{

do_something();

}

я понимаю что что-то тут не так, и если бы все было так просто то не использовались стандартные конструкции типа:

if((0 != (PINB & (1<<PINBO)) & (0 == (PINB & (1<<PINB1)))

{

do_something();

}

 

 

Share this post


Link to post
Share on other sites

есть регистр запуска шим PCTL2 = (1<<PRUN2);. хочу кнопкой включать и выключать его.

ISR (TIMER1_COMPA_vect)
{
	//обработка кнопки
	if(!(PIND&(1<<5)))//если нажата кнопка
	{
	    PCTL2 ^= (1<<PRUN2);
	}

правильно ли я написал?

@pndbr через & нельзя только через запятую возможно. посмотрите как у меня в вопросе написанно

Share this post


Link to post
Share on other sites
13 минут назад, Дмитрий Вас сказал:

правильно ли я написал?

Нет: таймер у вас сгенерирует прерывание явно много раз в секунду, и каждый раз, когда при этом кнопка все еще будет нажата, бит PRUN2 будет менять свое значение на противоположное, т.е. будет включаться и выключаться многократно, пока нажата кнопка.

 

14 минут назад, pndbr сказал:

Возможно ли (почему нельзя) использовать конструкцию типа

Возможно все, если все сделать правильно. В частности, применять оператор && (ЛОГИЧЕСКОЕ И) вместо & (БИТОВОЕ И). А остальное - дело техники: никто не запретит вам создать макросы и получить "конструкцию типа"

#define PIN_1	(!!(PINB & (1<<PB0)))
#define PIN_2	(!!(PINB & (1<<PB1)))
  
// "конструкция"
if(PIN_1 && !PIN_2) {
  // что-то там
}

 

Edited by ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
Только что, ARV сказал:

 


#define PIN_1	(!!(PINB & (1<<PB0)))
#define PIN_2	(!!(PINB & (1<<PB1)))
  
// "конструкция"
if(PIN_1 && !PIN_2) {
  // что-то там
}

 

спасибо добрый человек

но возник новый вопрос:

(!!(PINB & (1<<PB0)))

С оператором "!" (НЕ) знаком,а оператор "!!" первый раз встречаю, что он значит?

 

 

Share this post


Link to post
Share on other sites

Это 2 оператора !


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
2 минуты назад, ARV сказал:

 

логично,не спорю)

но попрошу Вас,если не сложно,немного подробнее написать, для недостаточно просветленных..ну или направить где я смогу найти описание действий оператора сдвоенного "НЕ"

Edited by pndbr

Share this post


Link to post
Share on other sites

Да что тут понимать...

Оператор НЕ превращает любое НЕНУЛЕВОЕ число в 0, а НОЛЬ превращает в 1. То есть после первого ! мы получим 0, если было не ноль, и 1, если был ноль. А после второго ! мы получим снова инверсию, то есть получим 1, если изначально было не ноль, и 0, если был и так ноль.

Иными словами двойное НЕ превращает любое ненулевое число в 1, а любой ноль не меняет.

Таким образом, можно сравнивать любые числа, как логические значения, что без двойного НЕ невозможно.

Например:

char A = 12;
char B = 30;

// простое сравнение
if(A == B) {
  // не сработает, т.к. числа разные
}

// "логическое" сравнение
if(!!A == !!B){
  // сработает, т.к. логически оба числа эквивалентны TRUE
}

Многие ошибочно пытаются сравнивать "значение бита в порту" с 1 или 0, а это не сработает, т.к., например, ТРЕТИЙ бит в порту это 0x04, что, естественно, единице не будет равно никогда. Если сделать НЕ-НЕ, то любой бит в порту превратится в 1 или 0, что уже можно сравнивать безошибочно

Edited by ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
2 минуты назад, ARV сказал:

Да что тут понимать...

Все гениальное - просто.

Спасибо за развернутый ответ, стало понятно.

Share this post


Link to post
Share on other sites
1 hour ago, ARV said:

Оператор НЕ превращает

С таким же успехом компилятор перед использованием оператора && превратит сначала оба операнда в логические величины, а затем уже произведёт логическую операцию. Поэтому тут двойное отрицание не нужно.

Share this post


Link to post
Share on other sites
7 часов назад, Yurkin2015 сказал:

Поэтому тут двойное отрицание не нужно.

А если применять оператор == или !=, а тем более ^, он превратит операнды в логические или нет?

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

Edited by ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

  • Similar Content

    • By Rad TV
      Скетч простой и кислий. Сделан автором RadTV канал:https://www.youtube.com/channel/UC1k5elIKErFnmwTzIsRgQrA?view_as=subscriber
      Буду рад рокомендациях и помощи!Сделал сам проект должен бить простим и  что би влезло в ATtini85!
      Есть защита акб и просто парения (!!!Кнопка на розмикания!!!)
      Обновления будут!!!!
       
       
      RadMOD ver1.0.txt
    • By Стас73
      Доброй ночи, уважаемые.
      Прошу Вашего совета по следующей куче проблем для меня, т.к. не соображаю в электронике, схемах, резисторах и подобному, но дружу с компом и есть желание сделать определенный механизм, но пока нет наставления на путь истинный от специалистов)
      Задача состоит в следующем - хочу мотор стеклоочистителя подключить к Ардуино, но управлять им необходимо с кнопки. Шилд, например, который обрабатывает сигнал нажатия на кнопку (допустим кнопка записи), при ее активации, нажимаю на другую кнопку, которая дает команду движку вращаться по часовой стрелке. Отпускают ее, моторчик останавливается. Другая кнопка, вращение в противоположную сторону. Т.е. записал последовательность и продолжительность вращений,  нажимаю вновь на кнопку запись и мои действия сохраняются. Далее на 4 кнопку жму и моя игра с моторчиком автоматически воспроизводится. Если такое выполнимо с помощью плат и шилдов без доп программирования логики, то буду ОЧЕНЬ  признателен если расскажете как вкратце это осуществить или кинете ссылки к примеру на Али с нужными товарами. Если легковыполнимо, то в будущем наверное уже разберусь,  как обойтись без нажатия на 4 кнопку (воспроизведения записанных действий) и запускать этот процесс, подключив датчик движения или звука.
      Если необходимо описывать логику или создавать типа какого-то протокола, что шилд (?) умел понимать, что я от него хочу, то подскажите среду разработки для неба, что б там по минимуму было наворотов) В принципе с основами c++ для Ардуино скорее всего придется ознакомиться. 
      Заранее спасибо!
    • By Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
    • By MirVsem
      Добрый день.
      Есть интересные модули ибп для слаботочки до 1А.
      m.aliexpress.ru/item/4000109380893.html
       По цене идеально подходит для зоопарка роутеров, IoT устройств... Переключение на резерв (туда-обратно) без просадки. Зарядка литиевой банки как положено, всякие защиты от перегрузки и прочее. Казалось бы все замечательно. 
      НО как всегда не без ложки дёгтя.
       Защита от переразрядки работает неадекватно. Хотя возможно это не сама защита, а повышающий модуль. На пороге ~3в у него срабатывает циклический перезапуск и так пока банка не просядет ниже 3в. Точно померять нечем.
      Из наблюдений. Проверил напряжение переключается с 12в на 9в и щелчки. Естественно нагрузка в это время дико насилуется (роутер свистит минут 5 пока полностю не отключится)
      Вопрос к гуру. Возможно ли что-то доработать в даном модуле чтобы исправить этот досадный баг?
    • By Юлия Михайлова
      Требуються люди умеющие работать с микроконтролерами esp 32 и stm32 , так же будет плюсом опыт работы с raspberry , требования опыт работы не мение 1,5 года , возраст не старше 35 лет , готовы взять на удаленную работу просьба отправлять резюме , и звонить по номеру +380 (68) 227 82 52
×
×
  • Create New...