Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



banned28 и 3 шим

Сообщений 1 страница 8 из 8

1

Подскажите пожалуйста как сконфигурировать мегу128 для работы с тремя шимами.
нашел пример под CodeVision в принципе там всё понятно, но на баскоме не могу таймер правильно настроить

вот пример на С

Код:
/*****************************************************

Chip type           : ATbanned28
Program type        : Application    

Clock frequency     : 16,000000 MHz   

Memory model        : Small
External SRAM size  : 0
Data Stack size     : 1024
*****************************************************/

#include <banned28.h>

// Declare your global variables here

void main(void)
{

// выводы PB5 PB6 PB7 нужно сконфигурировать как выходы 
DDRB=0xE0;




// настройка 16 битного Таймера_1


//TIMER1 initialize - prescale:64  (делитель тактовой частоты)

// WGM: 10) PWM phz correct, TOP= ICRn
// desired value: 50Hz
// actual value: 50,000Hz (0,0%)

 TCCR1B = 0x00; //stop - остановить таймер
 
 TCNT1H = 0xF6; //setup - эти числа
 TCNT1L = 0x3C; //  нам не нужны
                  
 
 /* 
 
    В двухбайтные регистры OCR1х нужно вписывать величину ШИМ. 
    Расчет: 
    
    OCR1х = целое [(длина импульса в мкС) * 2501 / 20000]
    
    пример: для среднего положения Servo нужен импульс 1500 мкС
    OCR1х = 1500 * 2501 / 20000 = 187,575  целое число 188
    по симуляции и вреале возможно пойдет 187
    
    OCR1х = целое [(нужный ШИМ в %) * 2501 / 100 ]
    
    пример: расчет ШИМ в 10 % - у нас это импульс 2000 мкС
    OCR1х = 10 * 2501 / 100 = 250,1  целое число 250
    
 */
   
 OCR1AH = 0;     // ШИМ на PB5   1500 uS
 OCR1AL = 188; 
 
 OCR1BH = 0;     // ШИМ на PB6   10%  или 2000 uS
 OCR1BL = 250;  
 
 OCR1CH = 0;     // ШИМ на PB7 (VMLAB не симулирует) 1000 uS
 OCR1CL = 125;   // число 250
 
           
 
 //  ICR1 = 2500  это ШИМ  100%  равный периоду в 20000 мкС
 ICR1H  = 0x09;
 ICR1L  = 0xC4;
 //  ===============================
 
     
 TCCR1A = 0xAA; // Установка режима работы выходов - PB5 PB6 PB7
 TCCR1B = 0x13; //start Timer


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
      // Place your code here
      #asm("wdr")

      };
}

Отредактировано FlashKiller (2012-10-08 15:32:59)

0

2

$regfile = "m128def.dat"
$crystal = 8000000

Config Timer3 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up , Prescale = 1
Config Porte = Output

Compare3a = 100
Compare3b = 150
Compare3c = 200
Do

Loop

End

+1

3

Можно использовать TIMER1,можно 16 Bit, так как таймер 16 битный ну и т.д.Смотрите HELP.

0

4

olegzh75 спасибо. всё работает

0

5

Наздоровье.Обращайтесь.

0

6

olegzh75, здравствуйте!
Подскажите как изменить частоту шима?

0

7

В соседних темах не смотрели ? ;)

0

8

Смотрел. Для меги 328 все прекрасно работает. 128-ю никак не могу заставить....

Код:
$regfile = "m128def.dat"
$crystal = 16000000

  $framesize = 32                                           'размер области используемой и необходимой для преобразований
  $hwstack = 40                                             ' Размер аппаратного стека
  $swstack = 16                                             ' Размер программного стека
  $baud = 9600
 ' $baud1 = 9600

Config ACI = Off

'----------------------  Настройка TIMER1  -------------------------------------
  Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up , Prescale = 8
  Stop Timer1


Tccr1a.wgm10 = 0
Tccr1a.wgm11 = 0
Tccr1b.wgm12 = 0
Tccr1b.wgm13 = 1

'Tccr1a.com1a1 = 1
'Tccr1a.com1a0 = 0
'Tccr1a.com1b1 = 1
'Tccr1a.com1b0 = 0
'Tccr1a.com1c1 = 1
'Tccr1a.com1c0 = 0

'TCCR1A = 0b10101010
'TCCR1B = 0b01010010
'TCCR1C = 0b00000000

Ocr1a = 100
Ocr1B = 20
Ocr1C = 15

ICR1 = 200 ''  менять частоту

'ICR1H = 10
'ICR1L = 100



TIMSK = 0
eTIMSK = 0
tifr = 0
etifr = 0


Start Timer1

Главный_цикл:


 nop
 nop




Goto Главный_цикл

End

Меняю ICR1. Частота не меняется....
Что делаю не так?

Отредактировано Al64 (2022-03-02 17:42:01)

0