Jump to content
SergeyKa

Глючит Atmega8

Recommended Posts

Не могу понять в чем проблема. Микроконтроллер как-будто замирает и ведёт себя неадекватно. Кварц запитывается от двух конденсаторов 22pF. Сначала у меня было общее питание, которое питало светодиоды. Я подумал, что помехи проходят из-за него. Пришлось сделать два блок питания, однако и это не помогло, вместо того, чтобы плавно изменять цвет, микроконтроллер подвисает и некоторые цвета включаются резко и самопроизвольно. Менял другой микроконтроллер не помогло. С кварца идет стабильный синус на 16МГц.

v3r6jhe_2AA.jpg

 

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


int main(void)
{

DDRB = 0x0e; 
PORTB |= (1 << PB4);
TCCR1A=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); 
TCCR1B=(1<<CS10); 
TCCR2=(1<<CS20)|(1<<COM21)|(1<<WGM20); 

OCR1A=0x00;
OCR1B=0x00;
OCR2=0xff;

while(1){
    
    for (unsigned char i = 0; i<255; i++)        
    {OCR2--; OCR1A++; _delay_ms(100);}
    
    for (unsigned char i = 0; i<255; i++)        
    {OCR1A--; OCR1B++; _delay_ms(100);}
        
    for (unsigned char i = 0; i<255; i++)        
    {OCR1B--; OCR2++; _delay_ms(100);}    
        
    
        }
}

Share this post


Link to post
Share on other sites

А вы учитываете, что OCR2 восьмибитнй, а OCR1A  и OCR1B - 16-битные, и циклы у вас совсем не одинаковое количество прогонов делают?


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

Share this post


Link to post
Share on other sites

Пополнение и новинки линейки ViperPlus от STMicroelectronics

Компания ST обновила семейство ШИМ-регуляторов со встроенным ключом ViperPlus, выпустив новые бюджетные микросхемы VIPER122 и VIPER222, микросхемы VIPER265K и VIPER267K, имеющие встроенный ключ MOSFET напряжением 1050 В, и самый мощный VIPer31x. С их помощью возможно реализовать топологии: изолированный и неизолированный обратноходовой преобразователь (flyback), понижающий преобразователь (buck), повышающе-понижающий преобразователь (buck-boost).

Подробнее

12 минуты назад, ARV сказал:

А вы учитываете, что OCR2 восьмибитнй, а OCR1A  и OCR1B - 16-битные, и циклы у вас совсем не одинаковое количество прогонов делают?

нужно OCR1AL? 

Share this post


Link to post
Share on other sites

Как сократить время вычислений и освободить ресурсы центрального процессора?

Цифровые фильтры применяются в системах цифровой обработки сигналов (ЦОС) для решения двух основных задач: разделения и восстановления сигналов. Такие задачи могут решаться программными и аппаратными методами. Для их решения удобно использовать аппаратный цифровой фильтр FMAC, входящий в состав микроконтроллеров семейства STM32G4.

Подробнее

Откуда я знаю, что вам нужно.

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


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

Share this post


Link to post
Share on other sites

Цикл статей: Все что вы хотели знать о STM32G4

Компания Компэл опубликовала цикл статей о новом семействе микроконтроллеров STM32G4. В статьях рассмотрены системная архитектура и разнообразие режимов питания, обзоры интерфейсных модулей, периферии и таймеров, а также различные виды и способы защиты информации, реализованные в микроконтроллерах новой серии STM32G4. Читать статьи >>

Подробнее

 

6 минут назад, ARV сказал:

Я обычно регистры напрямую не инкрементирую/декрементирую, ибо там свои заморочки.

 

а в чем разница что я напишу так

number = 200;

OCR1A = number;

 

и в том что я напишу

OCR1A = 200; 

Share this post


Link to post
Share on other sites

Разница пояявляется, когда вы пишите OCR1A++ и впридачу используете это в качестве логического выражения - вы уже попали на том факте, что OCR1A++ даст 0 на выходе спустя 65535 циклов, а ведь навернка хотели, чтобы спустя 255. Там есть и другие моменты... которые, наверное, в конкретном случае никак не влияют, но привычка так делать может подвести в другой раз.


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

Share this post


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

Разница пояявляется, когда вы пишите OCR1A++ и впридачу используете это в качестве логического выражения - вы уже попали на том факте, что OCR1A++ даст 0 на выходе спустя 65535 циклов, а ведь навернка хотели, чтобы спустя 255. Там есть и другие моменты... которые, наверное, в конкретном случае никак не влияют, но привычка так делать может подвести в другой раз.

ну ок, я попробую, только не думаю что это решит проблему, потому что зависание идет где-то на 80% ШИМ, и число циклов ограничивается циклом FOR

Share this post


Link to post
Share on other sites
12 часа назад, SergeyKa сказал:

нужно OCR1AL? 

Нет , если ШИМ 16бит нужно преобразовать из int в два байта , например так:

Цитата

int pwm=2000;

OCR1A=pwm&0xFF;

OCR1B=(char)(pwm>>8);

 


Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Share this post


Link to post
Share on other sites

Ножка RESET болтается в воздухе. Сейчас микроконтроллер как-будто умер окончательно. Странно себя ведёт. Когда я втыкаю шлейф программатора (раньше было норм) сейчас на кварце нет частоты вообще. Т.е. вернее как я только воткнул его и подал питание есть. Я нажимаю в PonyProg -> ReadAll он читает, но дальше частота исчезает и в него не возможно ни записать ничего, ни прочитать, ни сбросить память ERASE. Фьюзы удалось прочитать. Но записать другие не выходит. Фьюзы читаются способом выдернул МК из слота программатора вставил -> прочитал. Записать так не удаётся. 

Фьюзы настроены на 16MHz, стоит кварц 16MHz. вроде новый неужели из-за него всё?

Vl-juWi1l7Q.jpg

Edited by SergeyKa

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. 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...

  • Сообщения

    • Снабер лучше поставить - резистор мощностью 0.25 - ёмкость керамика - его можно подобрать по ослику, начать можно от 2 нФ и резистор 30 - 40 Ом, по ёмкости на выходе - как лучше, я вам сказал, остальное учитывать в печати, если у вас макетка - можно проверить заодно и 227) она по идее - ес оригинал - тоже должна выдать 100 ватт и более 
    • Господа, от руки набросал платку с деталями из моего наличия. Выставляю на ваш суд, так сказать Сопротивления 10R оказались только 2 ватт. 2 штуки в паралель и будет мне 2w 5R. Разряжающий резистор на 820кОм по факту есть, полярный конденсатор 220х450в, мост под рукой на 3А попался. С ёмкостью балластного, наверное придётся поиграть, так сказать.  Если моя лента включается сразу после моста "в штате", видимо она действительно рассчитана на пиковое 310в. Отсюда вопрос, а нужен ли мне вообще этот конденсатор на входе... Никогда не понимал этих Китайцев.
    • похоже да.... да ладно 200 тоже нормально..  я считаю само главное это сннабббер предложенный вами..снял самую главную проблему...остальное может мои не дороботки  ..макетка и тд.. @BAFI кстати ...а выходной каскад..диод MBR20100CT..обвязки у него нет(снаббера или как он там   ...сопротивление и кандер)...может с выходом по колдовать...или это мелочи?
    • Уже не один день  сижу думаю как  запустить stm32  с eeprom для сохранения данных.И в кубе такая же история.Записую функцию чтения в майн и контролер  садится ничего не работает ? В чём дело ? Сталкивались с таким чудом.Записывал без функции тоже самое одна сторока  его убивает. #include"main.h" #define I2C_REQUEST_WRITE                       0x00//0 #define I2C_REQUEST_READ                        0x01 #define EEPROM_ADDRESS                   0b1010000 #define I2C_OWNADDRESS1_7BIT             0x00004000U void i2c1_AF_init(void) {   GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_0;   GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_1;   GPIOB->AFR[0]|=GPIO_AFRL_AFSEL7_2    ;   GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_3;   GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_0;   GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_1;   GPIOB->AFR[0]|=GPIO_AFRL_AFSEL6_2;   GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_3; } void i2c1_init(void) {     GPIOB->MODER|=GPIO_MODER_MODE7_1;     GPIOB->MODER&=~GPIO_MODER_MODE7_0;     GPIOB->OTYPER|=GPIO_OTYPER_OT7;     GPIOB->MODER|=GPIO_MODER_MODE6_1;     GPIOB->MODER&=~GPIO_MODER_MODE6_0;     GPIOB->OTYPER|=GPIO_OTYPER_OT6;     RCC->APB1ENR|=RCC_APB1ENR_I2C1EN;     I2C1->CR2&=~I2C_CR2_FREQ_2  ;     I2C1->TRISE=9;     I2C1->CCR&=~I2C_CCR_FS;     //I2C1->OAR1|=I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE;      I2C1->OAR1|= I2C_OWNADDRESS1_7BIT;     //I2C1->CR1|=I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP;     I2C1->CR1|=I2C_CR1_ACK;     I2C1->OAR2|=I2C_OAR2_ADD2;     I2C1->CR1|=I2C_CR1_PE; } void I2C1_SendByteByADDR1(uint16_t adres,uint8_t  data) {     //uint8_t data2;     I2C1->CR1|=I2C_CR1_ACK;     I2C1->CR1|=I2C_CR1_START;       while(!(I2C1->SR1&I2C_SR1_SB))       {       }     (void) I2C1->SR1;     I2C1->DR|=  EEPROM_ADDRESS |I2C_REQUEST_WRITE;     //I2C1->DR|= addr | I2C_REQUEST_WRITE;//      while (!(I2C1->SR1& I2C_SR1_ADDR))      {      }      (void) I2C1->SR1;      (void) I2C1->SR2;      I2C1->DR|=(uint8_t)adres;//      while (!(I2C1->SR1& I2C_SR1_TXE))      {      }      I2C1->DR|=(uint8_t) (adres>>8) ;//      while (!(I2C1->SR1 & I2C_SR1_TXE))      {      }      I2C1->DR|=data;      while (!(I2C1->SR1 & I2C_SR1_BTF))      {      }      I2C1->CR1|=I2C_CR1_STOP; } void I2C1_readByteByADDR1(uint16_t adres,uint8_t data) {     //uint8_t data2;     //uint8_t data1;     I2C1->CR1|=I2C_CR1_ACK;       I2C1->CR1|= I2C_CR1_START;       while (!(I2C1->SR1& I2C_SR1_SB)){}       (void) I2C1->SR1;       I2C1->DR|=  EEPROM_ADDRESS |I2C_REQUEST_WRITE;      // I2C1->DR|= SLAVE_OWN_ADDRESS | I2C_REQUEST_WRITE;       while (!(I2C1->SR1& I2C_SR1_ADDR)){}       (void) I2C1->SR1;       (void) I2C1->SR2;       //Transmit Address begin EEPROM       I2C1->DR|=  (uint8_t) adres;      while (!(I2C1->SR1& I2C_SR1_TXE)){}      I2C1->DR|=(uint8_t) (adres>>8);       while (!(I2C1->SR1& I2C_SR1_TXE)){}       I2C1->CR1 |= I2C_CR1_START;        while (!(I2C1->SR1 & I2C_SR1_SB)){}        (void) I2C1->SR1;        I2C1->DR = EEPROM_ADDRESS|I2C_REQUEST_READ;        while (!(I2C1->SR1 & I2C_SR1_ADDR)){}         (void) I2C1->SR1;         (void) I2C1->SR2;         I2C1->CR1 &= ~I2C_CR1_ACK;                 while (!(I2C1->SR1 & I2C_SR1_RXNE)){}                  data= I2C1->DR;             //    while (!(I2C1->SR1 & I2C_SR1_RXNE)){}                  //data2 =I2C1->DR;               I2C1->CR1 |= I2C_CR1_STOP;             //   return data;             //    Delay(5); } void i2c2_AF_init(void) {     GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_0;       GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_1;       GPIOB->AFR[1]|=GPIO_AFRH_AFSEL10_2    ;       GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_3;       GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_0;       GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_1;       GPIOB->AFR[1]|=GPIO_AFRH_AFSEL11_2;       GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_3; } void i2c2_init(void) {     GPIOB->MODER|=GPIO_MODER_MODE10_1;         GPIOB->MODER&=~GPIO_MODER_MODE10_0;         GPIOB->OTYPER|=GPIO_OTYPER_OT10;         GPIOB->MODER|=GPIO_MODER_MODE11_1;         GPIOB->MODER&=~GPIO_MODER_MODE11_0;         GPIOB->OTYPER|=GPIO_OTYPER_OT11;         //RCC->APB1ENR|=RCC_APB1ENR_I2C2EN; }     вот на  этой строчке
    • @abovar делал как тут написано, если брать питание с первого ОУ и припаивать средний контакт ползунка на 5 контакт второго ОУ то БП сваливается в защиту, никаких абсолютно регулировок не происходит, а вот если взять питание с первого ОУ и ползунок припаять к 5 контакту третьего ОУ то регулировка получается от 4.2 вольт до 29.5вольт, если выше или ниже тоже уходит в защиту, ну в принципе мне и этого хватает, что скажите насчет этого? имеет такой вариант на жизнь?))) на нагрузку не проверял прям на конкретную, но вот подключил два прожектора при 15.00вольтах, итого 4,5 ампера нагрузка и с 15.00 вольт просело напряжение до 14.87 вольт, это нормально?
    • Благодарю. Встречал эту схему, но в связи с возможным растеканием фазы по воде от микросхем решил отказаться.
    • Нет, Паш. Увы. Но, с большой долей вероятности, можно утверждать, что используется интерфейс RS485 с протоколом ModBus RTU. Можно навесить параллельно ещё чип и слушать.

  • Понижающий преобразователь напряжения

×
×
  • Create New...