Jump to content
Богдан Губанов

не правильно работает таймер в МК нужна помощь в прошивке

Recommended Posts

Доброго времени суток есть мк Attiny2313 настроенный на работу от внутреннего генерата на 8 мгц, включен и настроен UART на прём и на передачу, к UART вопросов нет а вот про таймеры есть мне нужно на каждом из 4х портов следующие >>>> порт  PD1 on  на 1 mS, потом PD1 OFF потом PD2 on 1ms PD2 OFF и так до 4х потом всё по новой с первого. Я на бросал простой код с использование библиотеки delay.h  

в таком виде:

int main(){

           while(1){

             

                 PORTD.5=0;

                 PORTD.2=1;

                delay_ms(1);

                PORTD.2=0;

                PORTD.3=1;

                delay_ms(1);

                PORTD.3=0;

                PORTD.4=1;

                delay_ms(1);

                PORTD.4=0;

                PORTD.5=1;

                delay_ms(1);

              

}

 

  return 0;

}

 

Всё работает но при проходе цикла происходит следующие:  несколько проходов всё нормально импульсы по 1 мс но потом какой то из выводов остаётся включенный на 1 мили секунду дольше чем надо потом опять несколько проходов норм  и всё это повторяется,пробовал бороться с этим использовав 8 битный таймер не помогло что может быть не так и почему это происходит на прикреплённой картинке я нарисовал чтоб было понятно что происходит и как с этим бороться, Пожалуйста нужна помощь очень ))))Спасибо)   

Безымянный.png

Edited by Богдан Губанов
ошибся в буквах

Share this post


Link to post
Share on other sites

включить прерывания по таймеру, таймер настроить на срабатывание 1мс,

в прерывании написать следующий код

{ static unsigned char count;

 count++;
 count&=0x03;
 switch (count){
   case 0: 
          PORTD.5=0;
          PORTD.2=1; 
        break; 
   case 1: 
          PORTD.2=0;
          PORTD.3=1; 
        break; 
   case 2: 
          PORTD.3=0;
          PORTD.4=1; 
        break; 
   case 3: 
          PORTD.4=0;
          PORTD.5=1; 
        break; 
  default:
        break; 
 }
}

 

Share this post


Link to post
Share on other sites

Это наверное не вся программа. Выложите всю.


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

7 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений

Подробнее

1 час назад, IMXO сказал:

включить прерывания по таймеру, таймер настроить на срабатывание 1мс,

в прерывании написать следующий код


{ static unsigned char count;

 count++;
 count&=0x03;
 switch (count){
   case 0: 
          PORTD.5=0;
          PORTD.2=1; 
        break; 
   case 1: 
          PORTD.2=0;
          PORTD.3=1; 
        break; 
   case 2: 
          PORTD.3=0;
          PORTD.4=1; 
        break; 
   case 3: 
          PORTD.4=0;
          PORTD.5=1; 
        break; 
  default:
        break; 
 }
}

 

я делал по прерыванию таймера ,только я в прерывании  делал i++; переменной и по   вашему примеру (switch) выбирал что делать, такая же беда по этому и в делай ушел подумал что может я делаю что то не правильно но и при использовании делая тоже самое код программы моей всей выложу позже кстати прошивал в железо тоже самое и в протеусе  

1 час назад, mazzi сказал:

Это наверное не вся программа. Выложите всю.

позже выложу )

Share this post


Link to post
Share on other sites

Вот вся программа в текстовом документе, самое интересное что на логическом анализаторе такая хрень творится на картинках видно, 

и я эту функцию

void ser_off(char a){
       
        if(a!=as){
                PORTD.2=seg_off;  //1
                PORTD.3=seg_off;  //2
                PORTD.4=seg_off;  //3
                PORTD.5=seg_off;   //4
                as=a;
                }

}

 

переношу  

в функцию 


void ser_out(char a,char b,int s){

// paint
            if(b=='.'){PORTD.6=led_on;} //dp
                else{PORTD.6=led_off;}
            
// отображение символа на сигменте 
           switch (a){
                
                case '1' :
                    PORTB.0=led_off; //a
                    PORTB.1=led_on; //b
                    PORTB.2=led_on; //c
                    PORTB.3=led_off;  //d
                    PORTB.4=led_off;  //e
                    PORTB.5=led_off; //f
                    PORTB.6=led_off; //g
                 //   PORTD.6=led_off; //dp
                      
                
                break;

/,,,,,,,,,,,,,,,,,,

,,,,,,,,,,,,

,,,,,,,,,

}

то глюк пропадает я не пойму чего не так от куда этот глюк берётся,да и вообще почему то не очень стабильно работает по частоте  

Новый текстовый документ (4).txt

Безымянный.jpg

это после переноса void ser_off(char a) в  void ser_out(char a,char b,int s)

Без.jpg

Share this post


Link to post
Share on other sites
                     

Измеряем мощность в режиме реального времени с помощью ИС регистратора потребляемой мощности

Одной из важнейших функций обеспечения работы системы управления питанием является измерение среднего значения потребляемой мощности критичных участков цепи питания в режиме реального времени. Микросхемы регистраторов производства Maxim Integrated имеют встроенную функцию накопления измеренных значений мощности и предоставляют на выходе данные, пригодные для вычисления ее среднего значения. В статье рассматриваются различные примеры использования регистраторов для проведения критичных измерений мощности в режиме реального времени.

Подробнее

ух, жесть какая... мюсье знает толк в извращениях... хотелось бы вопросить накой нужен switch/case для формирования симисегментов??? к тому же находящимися на одном порту вывода.  вы что не разу не встречали в гугле примеров как это делается?

Share this post


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

ух, жесть какая... мюсье знает толк в извращениях... хотелось бы вопросить накой нужен switch/case для формирования симисегментов??? к тому же находящимися на одном порту вывода.  вы что не разу не встречали в гугле примеров как это делается?

Гугл  конечно)читал но мне не надо в таком формате например  PORTD=0xFF или PORTD=mas[ ] и.т.д., я разрабатываю своё поэтому так громоздка да и выводится на него будут не только числа конечно когда до конца дойду если дойду то код будет немного по другому я сейчас так сказать оттачиваю мастерство ))))) управлятся эта хрень будет по юарт но то потом 

и если убрать функцию 

void ser_off(char a){
       
        if(a!=as){
                PORTD.2=seg_off;  //1
                PORTD.3=seg_off;  //2
                PORTD.4=seg_off;  //3
                PORTD.5=seg_off;   //4
                as=a;
                }

}

Вообще из кода то всё равно есть какая то хрень?? 

янный.jpg

Share this post


Link to post
Share on other sites
Цитата

откуда здесь такая пауза

ну например отсюда

Цитата

void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index++]=c;
#if TX_BUFFER_SIZE != 256
   if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
#endif
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}

ЗЫ прекращайте нарушать правила форума П.2.9

Share this post


Link to post
Share on other sites
1 час назад, Богдан Губанов сказал:

но мне не надо в таком формате например  PORTD=0xFF или PORTD=mas[ ] и.т.д., я разрабатываю своё

У вас цель сделать как можно хуже? "Своё" вы собрались выделить именно крайне плохим кодом? Обычно "своё" стремятся сделать лучше аналогов, но вот чтобы хуже... это я впервые вижу.

 

7 часов назад, IMXO сказал:

в прерывании написать следующий код

{
   static char data = 2;
   PORTD = (PORTD & 0xE1) | data;
   data <<= 1;
   if(data == 0x20) data = 2;
}

 


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

Share this post


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

static char data = 2;

на сколько я понимаю Си при входе в функцию енто всегда будет равно двум или нет?

Share this post


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

при входе в функцию енто всегда будет равно двум или нет?

только первый раз - static же


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

Share this post


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

У вас цель сделать как можно хуже? "Своё" вы собрались выделить именно крайне плохим кодом? Обычно "своё" стремятся сделать лучше аналогов, но вот чтобы хуже... это я впервые вижу.

 


{
   static char data = 2;
   PORTD = (PORTD & 0xE1) | data;
   data <<= 1;
   if(data == 0x20) data = 2;
}

 

Ок я Вас понял переделаю по людски )Спасибо

Share this post


Link to post
Share on other sites

Всем спасибо переделал всё теперь как надо, проблема была в том что я постоянно в цикле while(1) перезаписывал постоянно одинаковыми значениями регистры IO, а они не могут с такой скоростью работать как тактовая проца от туда и глюк был 

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...

  • Сообщения

    • Ну да дно, юзают их все и повсеместно, есть по моему еще nrf5xx, их в промышленные устройства ставят, ESP это не радиомодуль и стоит дороже, ты же написал что юзать с МК, конечно ESP уже имеет на борту МК, но если брать то ESP8266 12 серию, ESP32 у меня с ней сервер плохо работал, потому закинул, а на  на ESP8266 12 я и умный дом делал и много другого, но ESP это wi-fi, а nrf  это радиомодуль
    • Ты как опять ни чего не понял. Денег бизнеса в РФ нету, капитал уже убежал, есть деньги придворных олигархов, но и бежать им некуда,  ты их собрался обдирать ? Так они и так не бегут. Меньше пей и не будет 404 страниц. И что ? Ты пойдёшь Стрелкова защищать с этими ящиками :), LOL. Западный бизнес вывел уже деньги с рынка РФ, закрыв там позиции, а налоговые угрозы только ускорят выход остальных. Акции компаний уже сегодня и так на дне.  
    • Этот человек делал платы для  Ивана Телегина 86,  он здесь на форуме тоже бывает, он их Вам выкладывал. Качество очень хорошее.
    • Если бы все жены имели такое образование, что   то разводов не было бы ВООБЩЕ ...
    • Даров, коллеги! Есть кто бухой? Куясе! Руслан! В такой теме! Совсем скучно стало? BSOD, CУKA
    • Изолировать оголённые контакты нужно очень тщательно, термостойким силиконом заливать. Есть такой для автомобильных применений, 350 градусов держит.
×
×
  • Create New...