Jump to content
Дмитрий Чуков

Программирование ATMega 8 в CVAVR

Recommended Posts

Необходимо составить программу, которая формирует сигнал с частотой 1 кГц и скважностью 4 при помощи таймера. В CodeVision AVR написать программу и после в протеусе проверить, целый день уже бьюсь, не могу разобраться с таймерами. Вроде задача не трудная, если бы увидел, как это должно выглядеть в коде... Как настроить таймер для ATMega8A и решить эту задачу?

Share this post


Link to post
Share on other sites
23 минуты назад, Дмитрий Чуков сказал:

Как настроить таймер для ATMega8A и решить эту задачу?

Сначала настраиваете таймер так, чтобы он переполнялся каждую 1 мс, т.е. частота переполнений 1 кГц. А потом используете регистр OCR1B и режим аппаратного управления выходом OC1B: в регистр записываете значение, равное 1/4 значения, соответствующего периоду переполнений (то число, при помощи которого вы заставили таймер переполняться каждую миллисекунду), и получаете на OC1B нужный вам сигнал.


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

Share this post


Link to post
Share on other sites

Вы в мастере проекта выберите простой шим с выходом  указываете длительность сигнала  и там все само посчитается. а программа из 1 строчки задать значение шима чтоб была  нужная ширина импульса... 

Share this post


Link to post
Share on other sites

Взаимодействие устройств IoT от Microchip с облаком Google

Благодаря облачным технологиям появилась возможность реализовать сложные проекты на базе микроконтроллера путем перераспределения вычислительной нагрузки между микроконтроллером и облаком. Простые в использовании отладочные платы, такие как AVR- и PIC-IoT WG, позволяют выполнять ресурсоемкие вычисления, передавая их в облако.

Подробнее

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

  • Сообщения

    • Конечно фейк!!! Всё давно пишется и мониторится. Любая сецсслужба была бы полной дурой, если б не использовала сей информационный ресурс в полной мере всего возможного объёма, с самого раннего её появления. Причём, наблюдаемый сам покупает , обновляет средства наблюдения за ним, как програмные, так и девайсовые, следит чтоб следящий за ним девайс был ззаряжен и работоспособен (чинит в случае необходимости), наблюдаемый САМ оплачивает трафик с которого за ним следят.....   И более того, наблюдаются действия провокационного характера, типа побаламутить спокойное место какой нибудь "горячей темой" , типа "говна на вентилятор кинуть", высказать мнение  уровня "диваннго эксперта/аналитика" ...... - и смотри собирай информацию кто об чём и как думает/рассуждает! "...И если есть те кто приходит к тебе,  то найдётся и тот кто придёт за тобой!..." Соответствующий куратор уже знает с какого места пишутся эти строчки. С уважением, Сергей
    • Когда собирался бурить скважину на воду возле дома, обратился к местному спецу, который взялся бурить. Изначально я хотел в другом углу участка, где мне удобнее трубы провести. Но спец походил по участку с "лозой" (два Г-образных куска алюминиевой проволоки) и предложил другое место. В нём и пробурили, и не прогадал - и вода близко (7,5 м), и дебет скважины с большим запасом. А сосед пробурил (сам) как раз примерно там, где я и хотел, только за своим забором. Скважина быстро кончалась, буквально два-три ведра - и жди час, пока снова наберётся. В итоге после лета мучений с поливом вызвал бригаду бурильщиков, забурили на 43 метра, пока попали в водоносный слой с нормальным дебетом. Ну и верить мне теперь, или как? Кстати, по молодости сам пробовал с рамкой ходить, но у меня результат сильно от настроения зависит, хотя трубу канализации и высоковольтный кабель под землёй находил точно.
    • автор темы сам модератор, но меры не принимает. а за него лично я модерировать не буду.
    • Проще не бывает и без каких-либо задержек: https://forum.cxem.net/index.php?/topic/13268-простые-схемы-для-радиолюбителей/&do=findComment&comment=414343  
    • Ну почему же упрощенно? Сборник "В помощь радиолюбителю" №76, стр. 40, С. Филин "Лампово-транзисторный усилитель для стереотелефонов".
    • , поэтому присоединяюсь к группе ОБС и тоже распространяю всякие сплетни.
  • Similar Content

    • By sunjob
      добрый день
      проект v-usb
      выкус из спецификации/инета/форумов:
      - реализация не полностью соответствует стандарту
      - работа на 100% не гарантируется
      - питание по USB / с компа может провалиться до 4-4.5В (а F_CPU идет в "притирочку" ...)  :))
      у всех рекомендованных схем подключения (3 шт) имеются те или иные очевидные минусы.



      как следствие стабильно может работать только при "определенных условиях"
      в планах поработать с библиотекой.
      для начало решил "набросать" альтернативный вариант. (так сказать, попытаться закрыть все возможные дыры в подключении)


       
      достаем помидоры, баркова, мысли, высказываемся (заранее благодарен)
      tag: v-usb, usb, avr, atmega328p, avr-gcc, linux/mac-osx
      NO atmega32u4, NO arduino pro micro etc...

    • By Ivarrr
      Помогите понять где ошибка... не получается реализовать попеременный опрос 2ух каналов АЦП. Данные с одного канала должны передаваться на первый индикатор как напряжение, а со второго, соответственно на второй индикатор как сила тока.
       
      #define F_CPU 8000000U
      #include <avr/io.h>
      #include <avr/interrupt.h>
      #include <stdlib.h>
      #include <util/delay.h>
      #define INDICATOR PORTD
      #define RANK PORTB
      unsigned int UR1=0, UR2=0, UR3=0, UR4=0; //переменные для деления на разряды значения напряжения
      unsigned int IR1=0, IR2=0, IR3=0, IR4=0; //переменные для деления на разряды значения силы тока
      int GainControl=1;
      int current_ch=0;
      float I, U;
      unsigned char voltage, current;
      unsigned int NUMS [10] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000}; // от 0 до 9
      int main(void)
      {
          DDRB=0xFF; PORTB=0x00; //ножки порта B для разряда
          DDRC=0x00; PORTC=0x00; //ножки порта C для АЦП
          DDRD=0xFF; PORTD=0xFF; //ножки порта D для индикаторов
          
          TCCR0 |= (1<<CS01); TCCR0 &= ~((1<<CS00) | (1<<CS02)); //настройка частоты таймера f/8
          TIMSK |= (1<<TOIE0); //разрешение прерываний по переполнению таймера
          TCNT0=0; // обнуление счетчика
          
          ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADPS2)); // запуск АЦП, запуск преобразования, предделитель 16
          ADCSRA &= ~((1<<ADFR) | (1<<ADIF) | (1<<ADPS1) | (1<<ADPS0)); // режим преобразвания прерывестый, флаг перобразования опущен, предделитель 16
          ADMUX |= ((1<<REFS0) | (1<<REFS1)); //источник опорного напряжения 2.56В
          ADMUX &= ~((1<<ADLAR) | (1<<MUX0) | (1<<MUX1) | (1<< MUX2) | (1<<MUX3)); // направление записи, измерительная ножка ADC0;
          
          sei(); // вкл прерывания
          while (1) 
          {
              if (ADCSRA & (1<<ADIF))
              {
                          U_Convert((U*5.00/1024)*100);
                          I_convert((I*5.00/1024)*100);
              }
          }
      }
      void U_Convert (unsigned int U_num)  //деление на разряды напряжения
      {
          UR1=U_num/100;
          UR2=U_num%100/10;
          UR3=U_num%10;
      }
      void I_convert (unsigned int I_num) //деление на разряды тока
      {    IR1=I_num/100;
          IR2=I_num%100/10;
          IR3=I_num%10;
      }
      ISR (TIMER0_OVF_vect)
      {        
          if (GainControl == 1) {INDICATOR = 0b11111110; RANK = NUMS[UR1];} //отображение 1ого разряда напряжения
          if (GainControl == 2) {INDICATOR = 0b11111101; RANK = NUMS[UR2];} //отображение 2ого разряда напряжения
          if (GainControl == 3) {INDICATOR = 0b11111011; RANK = NUMS[UR3];} //отображение 3ого разряда напряжения    
          if (GainControl == 4) {INDICATOR = 0b11110111; RANK = NUMS[IR1];} //отображение 1ого разряды силы тока
          if (GainControl == 5) {INDICATOR = 0b11101111; RANK = NUMS[IR2];} //отображение 2ого разряды силы тока
          if (GainControl == 6) {INDICATOR = 0b11011111; RANK = NUMS[IR3];} //отображение 3ого разряды силы тока
          GainControl++;
          if (GainControl > 6) GainControl=0; //  мониторинг переменной для управления затворами    
      }
      ISR (ADC_vect) 
      {
          if (current_ch == 0)
            {
                U = ADC;
                voltage = (U*2.56/1024)*100;
                ADMUX |= (1<<MUX0);
                current_ch = 1;
                ADCSRA |= (1<<ADSC);
            }
            else
            {
                I = ADC;
                current = (I*2.56/1024)*100;
                ADMUX &= ~(1<<MUX0);
                current_ch = 0;
                ADCSRA |= (1<<ADSC);
            }
      }
    • By Обычный Человек
      Микроконтроллер ATmega328p, внешний кварц 16МГц. Компилятор avr-gcc с оптимизацией O1

      Написал код для управление шаговым двигателем. Работает так: требуемая скорость задается переменной STP1_ReqSpeed, дальше с частотой 100Гц срабатывает таймер TIM0, который высчитывает с какой частотой надо подавать сигналы на вход шагового драйвера. TIM1 работает в режиме частотно импульсной модуляции и по прерыванию меняет значение пина на противоположное.

      Управление работает, скорость регулируется, но по какой то причине случаются пропуски шагов. Чаще всего во время ускорения. Количество пропусков от 0 до 4, обычно 2-3, длятся 32мс.

      Из кода вырезал неиспользуемое. Заменить прерывания на аппаратный ШИМ возможности нет. Как убрать эти пропуски?
      Осциллограммы:
       
       
    • By Артур Измаилов
      1.Создать схему в которой два светодиоды загораются в следующей последовательности:  1 и 2, 2 и 3, 3 и 4, …, 15 и 16, 1 и 2 и т.д. (т.е. создается эффект движения двух светодиодов).
      Дано условие выше. Решение задачи нужно представить в Proteus. Код для программирования пишу в AtmelStudio 7. Схему собрал в Proteus. Вывел 16 светодиодов через 2 порта (Порт B и Порт D). МК использовал ATMEGA 8 вариации в корпусе DIP с 28 ножками (SPDIL28). 
      До этого смог написать схему, чтобы работали светодиоды в последовательности 1.2.3.4.5....16.1.2.3.4 и тд. Делал через оператор FOR. Однако с этим кодом начались проблемы. Помогите пожалуйста. 
      Нижу представил изображение кода. 
      Заранее спасибо!
       

×
×
  • Create New...