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

  • Сообщения

    • Как в большинстве случаев, 100500 страниц обсуждения того, как сделать то, что требует ТС, и ни одного вопроса "А нахрена делать так"? @tifaso , прежде, чем выносить мозг форумчанам, нельзя было сразу всю вашу "проблему" озвучить? Вашу схему цветомузыки действительно достаточно "слегка подкоректировать" - всего-навсего заменить резисторы R9 - R12 на 330 Ом, чтобы питать от 12 В. При этом больше ничего не изменится - токи через светодиоды останутся теми же (максимально до 27 мА). Ну, резистор R8 ещё можно заменить на 13 кОм, чтобы даже ток в базу Т4 не изменился (хотя его вообще-то в этой схеме подбирать надо). Фигня вопрос. Какие "радиаторы-стабилизаторы"? Эта схема максимально может потреблять ток не более 4 х 27 = 108 мА. Куда вам "по первой линии 9v 2A"? Вам закон Ома неплохо бы подтянуть для начала и начать видеть в схеме цепи, по которым течёт ток. Выкладывайте подробно, что за "аудио устройство там и радио и MP3 player и много другого сопутствующего навешано". Доверия к вашим выводам, как надо делать, - никакого. И подробно-подробно. А то окажется например, что вы в эту "светомузыку" на КТ3102 вместо светодиодов лампочки накаливания ставите, или ещё что-нибудь...
    • завел ) - в общем - перемотал трансформатор - поднял частоту до 60 кГц ,чет намудрил с делителем тл-ки и напряжение выше 17 вольт не поднимается и немного прыгает - похоже я не догрузил его ,- схема и печатка в корпусах. далее пойду по предложенной Сергеем доработке - для этого намотал еще обмотку - позже - ес все получится - скину . еще не понял момент - почему от 24 вольт греется резистор снабера - при сетевом почти нет)
    • Там где три вершины вниз при перемещении вправо влево, что меняется?
    • Разве он без подбора этой мелкоты не будет работать?
    • У тебя фигня, а не проблема. Я вот не то что "тихо про себя", а даже вообще об этом не задумывался, а оно вот уже тут, - НАПИСАНО.
    • это как блин понять .?..чувак  сначала хотел на ровном месте докопатся до схемы а когда не получилось накосячил с моделькой практически без шанса  на проверку так как на отрез отказался выдать её мне!!! и вместо извинений называет меня грубияном!!! хотелось узнать бы  за что Малахов мне минус поставил и ведь сто пудово гордо промолчит!
    • Фильм матрица это наше будущее и оно уже наступило. Многие не догадываются что происходит. Конечно, в батарейку никто не собирается превращать человека, это искажение искусственно создано в фильме, иначе могут и поверить)). Возможно, матрица и есть тот самый "зверь", упоминаемый в библии. Но пока мы живём в информационной матрице, создаваемой СМИ, которая не менее эффективно держит основную массу в гипнотическом сне. Смеяться также перестанете, когда очевидно станет. Пока врут как могут. Всё ради блага человечества делают, заботятся о нас))
×
×
  • Create New...