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

Финальные результаты тестирования литиевых батареек FANSO при нормальных условиях

Перед разработчиком устройства, в котором предполагается использование батарейки, всегда стоит задача выбора того или иного бренда. Конечно, наиболее объективный результат по качеству можно получить при реальном тестировании в режиме работы самого устройства. Для того чтобы у разработчиков была некоторая информация о реальных значениях основных параметров ЛХИТ, инженеры компании КОМПЭЛ решили провести серию из трех тестов. Первый тест на постоянный разряд в нормальных климатических условиях, начатый в апреле 2019 г., мы завершили.

Узнать финальный результат тестирования

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
                     

Видеокурс Работаем с микроконтроллерами STM32G0. Впервые на русском языке.

В цикле видеокурсов по работе с STM32G0 от компании STMicroelectronics показаны архитектура, периферия (особенности процессорного ядра, режимов пониженного питания, векторов прерываний, DMA и мультиплексора DMA, схемы тактирования и сброса, и.т.д.) и даны практические примеры. Материал дает наглядное понимание того, как начать работу на новых микроконтроллерах STM32G0

Подробнее

ух, жесть какая... мюсье знает толк в извращениях... хотелось бы вопросить накой нужен 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...

×
×
  • Create New...