роботы робототехника микроконтроллеры


 Страниц (17): В начало « ... 8 9 10 11 [12] 13 14 15 16 ... » В конец    

> Без описания
lamakazzz Post Id



Главнокомандующий


Сообщений всего: 328
Дата рег-ции: Янв. 2010  



долго будет прошивать через переходник
лучше соберите программатор USBbit
 
 Top
Рамзес Post Id



Маршал


Сообщений всего: 129
Дата рег-ции: Дек. 2009  



kalexi, на самой материнке посмотрите, должен быть выход СОМ порта.
 
 Top
zatmenie Post Id



Генерал


Сообщений всего: 97
Дата рег-ции: Май 2009  



Всем привет.
Михаил сколько вы тут не старались, а я все равно не въехал как мне сделать ШИМ. Загвоздка у меня вот в чем.
mihail пишет:

/* прерывание при переполнении таймера/счетчика 0 */
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/* PB7=0, PB6=0, PB5=0, PB4=0, PB3=0, PB2=0, PB1=1, PB0=1 */
PORTB = 0b00000011; Не понял что обозначает эта строка
/* PD7=0, PD6=0, PD5=0, PD4=0, PD3=0, PD2=0, PD1=0, PD0=0 */
PORTD = 0b00000000; Не понял что обозначает эта строка
}

/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0A таймера/счетчика 0 */
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
/* PD7=0, PD6=1, PD5=1, PD4=1, PD3=1, PD2=1, PD1=1, PD0=1 */
PORTD = 0b01111111; И здесь тоже не понял
}

/* прерывание при совпадении счетного регистра TCNT0 с регистром сравнения OCR0В таймера/счетчика 0 */
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
/* PB7=0, PB6=0, PB5=0, PB4=0, PB3=1, PB2=1, PB1=0, PB0=0 */
PORTB = 0b00001100; Ну и здесь тоже
}

void main(void)
{

/* все выводы порта B сконфигурировать как выходы */
DDRB = 0b11111111; здесь все ясно
PORTB = 0b00000000;

/* все выводы порта D сконфигурировать как выходы */
DDRD = 0b11111111; здесь тоже понятно
PORTD = 0b00000000;

/* Timer/Counter 0 Control Register A */
/* регистр управления таймером/счетчиком 0 А */
/* биты регистра:
COM0A1 COM0A0 COM0B1 COM0B0 Reserved Reserved WGM01 WGM00 */
TCCR0A = 0b00000000; а вот здесь начанается труба

/* Timer/Counter 0 Control Register B */
/* регистр управления таймером/счетчиком 0 В */
/* биты регистра:
FOC0A FOC0B Reserved Reserved WGM02 CS02 CS01 CS00 */
TCCR0B = 0b00000011; как и здесь

/* Timer/Counter 0 */
/* счётный регистр таймера/счетчика 0 */
TCNT0 = 0;

/* Output Compare Register А */
/* регистр сравнения таймера/счетчика 0 А */
OCR0A = 100;

/* Output Compare Register В */
/* регистр сравнения таймера/счетчика 0 В */
OCR0B = 200;

/* Timer/Counter Interrapt Mask Register */
/* регистр маски прерываний таймеров/счетчиков */
/* биты регистра:
TOIE1 OCIE1A OCIE1B Reserved ICIE1 OCIE0B TOIE0 OCIE0A */
TIMSK = 0b00000111; и здесь

/* глобальное разрешение прерываний */
#asm("sei"Подмигивающий

while (1)
{
/* *******************************************
Изменяя значение регистров сравнения можно менять значение ШИМ (PWM)
Так как таймер/счетчик 0 является восьмиразрядным, то значения регистров сравнения должны быть от 0 (0b00000000 или 0x00) до 255 (0b11111111 или 0xFF)
******************************************* */
OCR0A = 128; понятно
/* *******************************************
ШИМ (PWM) на всех ножках порта D составляет около 50%
******************************************* */
OCR0B = 64;
/* *******************************************
ШИМ (PWM) на PB1 и PB0 составляет около 25%
ШИМ (PWM) на PB3 и PB2 составляет около 75%
******************************************* */
}
}

Большие проблемы вызывают такие вот значения - 0b00000111, в CVAVR я привык иметь дело с 16-ричными числами и по этому числа в виде 0b для меня совсем не понятны и я не знаю как мне их преобразовать в привычные мне числа. Вот такая вот проблема.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



TCCR0B = 0b00000011; - покласть число 0b00000011 в регистр TCCR0B

zatmenie пишет:
проблемы вызывают такие вот значения - 0b00000111, в CVAVR я привык иметь дело с 16-ричными числами и по этому числа в виде 0b для меня совсем не понятны и я не знаю как мне их преобразовать в привычные мне числа.
С двоичными числами не знакомы совсем? А как вы понимаете, какие биты в порту будут выставлены, если привыкли только к HEX-числам?
Преобразовывать можно в WIN-калькуляторе в инжинерном виде или любом другом.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



zatmenie
у вас такая классно закаментная прога- война и мир- лежит и летает.

В такой большой проге никто не будет возится, ты траблы назови где?
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



zatmenie пишет:
Михаил сколько вы тут не старались, а я все равно не въехал как мне сделать ШИМ.
Я уже и сам понял, что пользы от меня тут ноль по модулю Грустный Проще объяснить я не могу. Просто не знаю как это сделать. Могу лишь подсказать направление, а дальше Вы сами.

0b11111111 - это число. 0xFF - снова число. 255 - опять число. Все это одно и то же число, только записано по разному. Первый вариант - это двоичная (бинарная) система счисления. Второй вариант - это шестнадцатеричная система счисления. Последний вариант - знакомая всем, десятичная система счисления.

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

Восемь бит - это один байт.

У микроконтроллера есть специальные регистры. Записывая в них разные числа, из программы, можно управлять микроконтроллером. Регистры восьмиразрядные. Это значит, что писать в них надо восемь бит или один байт. Можно в любой системе счисления. Компилятор сам все сделает как надо.

Сами регистры описаны в datasheet микроконтроллера.

Как смог, так и рассказал Замешательство Не серчайте если что не так Улыбка
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



PORTX = 0bxxxxxxxx
- это мы вроде подтягиваем к плюсу. но вот зачем мы меняем это в ... процессе - не понятно

если подтянули к плюсу то нагрузка идет на минус, если не подтянули- нагрузка идет с плюса.
вроде так.

а вот там где труба- открывайте даташит Подшучивать, дразнить (логика мнемонического мышления инженеров атмел (да и остальных фирм)) Т - означает таймер, а остальное- по таблице регистров... Грустный
 
 Top
zatmenie Post Id



Генерал


Сообщений всего: 97
Дата рег-ции: Май 2009  



mihail пишет:
0b11111111 - это число. 0xFF - снова число.

а есть ли какой нибудь способ перевести из двоичной системы в шестнадцатеричную?
(Добавление)
cjA пишет:
В такой большой проге никто не будет возится, ты траблы назови где?

Просто я привык работать с генератором кода CVAVR и не знаю как настроить таймер таким способом как TCCR0A = 0b00000000 и т.д
(Добавление)
nest пишет:
TCCR0B = 0b00000011; - покласть число 0b00000011 в регистр TCCR0B

это понятно
nest пишет:
Преобразовывать можно в WIN-калькуляторе
не получается
(Добавление)
mihail пишет:
Я уже и сам понял, что пользы от меня тут ноль по модулю Грустный
все нормально, а можете ваш пример ШИМа сократить как нибудь так что бы ШИМ был только на одной ножке мк, например на PD.6?

(Отредактировано автором: 21 Декабря, 2010 - 09:46:49)

 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



--- пишет:

nest пишет:
TCCR0B = 0b00000011; - покласть число 0b00000011 в регистр TCCR0B

это понятно
nest пишет:
Преобразовывать можно в WIN-калькуляторе
не получается
(Добавление)

Прикреплено изображение
kp.png

 
 Top
zatmenie Post Id



Генерал


Сообщений всего: 97
Дата рег-ции: Май 2009  



killgur у меня на калькуляторе нет функции "Программист", я на калькуляторе могу преобразовать бинарные числа в шестнадцатеричные только если они начинаются с 1, например 10010011, а вот число 00100110 уже не могу преобразовать потому что в калькулятор не записывается два нуля
 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



zatmenie пишет:
killgur у меня на калькуляторе нет функции "Программист", я на калькуляторе могу преобразовать бинарные числа в шестнадцатеричные только если они начинаются с 1, например 10010011, а вот число 00100110 уже не могу преобразовать потому что в калькулятор не записывается два нуля


не записывается и не надо
преобразуй в HEX по отдельности

00100110 => 0010 и 0110 = #26

здесь вообще не нужен никакой калькулятор

а в куркулятор вводи 100110 без первых нулей

(Отредактировано автором: 21 Декабря, 2010 - 15:12:52)

 
 Top
zatmenie Post Id



Генерал


Сообщений всего: 97
Дата рег-ции: Май 2009  



Ой Ой кажется я въезжаю. Всем спасибо, буду экспериментироватьУлыбка Да кстати а можно как ни будь поменять значение OCR0A не перепрограммируя весь мк? А то как то не удобно получается
(Добавление)
ОЙ а как мне менять значение OCR0A программно? нужно так: если портд6==0 то OCR0A=10, если портд6==1 то OCR0A=245
Вот моя программа, ШИМ работает но изменений которые должны быть при изменении OCR0A нет
CODE:

#include <tiny2313.h>
#include <delay.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTD = 0x20;

}

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTD = 0x20;

}


void wait10(void)
{
TCNT1=0;
while(TCNT1<4330)
{PORTB.0=0;
PORTB.1=1;
};
}

void wait11(void)
{
TCNT1=0;
while(TCNT1<4330)
{PORTB.0=1;
PORTB.1=0;
};
}

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=P State1=P State0=P
PORTA=0x07;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port D initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x20;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4,330 kHz
// Mode: Phase correct PWM top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00; //COM0A1 COM0A0 COM0B1 COM0B0 Резерв Резерв WGM01 WGM00
TCCR0B=0x05; //FOC0A FOC0B Резерв Резерв WGM02 CS02 CS01 CS00
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 4,330 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00; //COM1A1 COM1A0 COM1B1 COM1B0 Резерв Резерв WGM11 WGM10
TCCR1B=0x05; //ICNC1 ICES1 Резерв WGM13 WGM12 CS12 CS11 CS10
TCNT1H=0x10; //TCNT115 TCNT114 TCNT113 TCNT112 TCNT111 TCNT110 TCNT19 TCNT18
TCNT1L=0xEA; //TCNT17 TCNT16 TCNT15 TCNT14 TCNT13 TCNT12 TCNT11 TCNT10
ICR1H=0x00; //ICR115 ICR114 ICR113 ICR112 ICR111 ICR110 ICR109 ICR108
ICR1L=0x00; //ICR107 ICR106 ICR105 ICR104 ICR103 ICR102 ICR101 ICR100
OCR1AH=0x00; //OCR1A15 OCR1A14 OCR1A13 OCR1A12 OCR1A11 OCR1A10 OCR1A9 OCR1A8
OCR1AL=0x00; //OCR1A7 OCR1A6 OCR1A5 OCR1A4 OCR1A3 OCR1A2 OCR1A1 OCR1A0
OCR1BH=0x00; //OCR1B15 OCR1B14 OCR1B13 OCR1B12 OCR1B11 OCR1B10 OCR1B9 OCR1B8
OCR1BL=0x00; //OCR1B7 OCR1B6 OCR1B5 OCR1B4 OCR1B3 OCR1B2 OCR1B1 OCR1B0

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x07; //TOIE1 OCIE1A OCIE1B Резерв OCIE1 OCIE0B TOIE0 OCIE0A

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

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

// Global enable interrupts
#asm("sei")

while (1)
{
if(PIND.6==0) OCR0A=10;
else OCR0A=245;
}
}

(Отредактировано автором: 21 Декабря, 2010 - 17:09:15)

 
 Top
zatmenie Post Id



Генерал


Сообщений всего: 97
Дата рег-ции: Май 2009  



Вот попытался с помощью ШИМа изменять частоту звука.
CODE:
/*****************************************************
Chip type : ATtiny2313
Clock frequency : 4,433619 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTD = 0x20;

}

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTD = 0x20;

}


void wait10(void)
{
TCNT1=0;
while(TCNT1<4330)
{PORTB.0=0;
PORTB.1=1;
};
}

void wait11(void)
{
TCNT1=0;
while(TCNT1<4330)
{PORTB.0=1;
PORTB.1=0;
};
}

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=P State1=P State0=P
PORTA=0x07;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port D initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x20;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00; //COM0A1 COM0A0 COM0B1 COM0B0 Резерв Резерв WGM01 WGM00
TCCR0B=0x00; //FOC0A FOC0B Резерв Резерв WGM02 CS02 CS01 CS00
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 4,330 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00; //COM1A1 COM1A0 COM1B1 COM1B0 Резерв Резерв WGM11 WGM10
TCCR1B=0x05; //ICNC1 ICES1 Резерв WGM13 WGM12 CS12 CS11 CS10
TCNT1H=0x10; //TCNT115 TCNT114 TCNT113 TCNT112 TCNT111 TCNT110 TCNT19 TCNT18
TCNT1L=0xEA; //TCNT17 TCNT16 TCNT15 TCNT14 TCNT13 TCNT12 TCNT11 TCNT10
ICR1H=0x00; //ICR115 ICR114 ICR113 ICR112 ICR111 ICR110 ICR109 ICR108
ICR1L=0x00; //ICR107 ICR106 ICR105 ICR104 ICR103 ICR102 ICR101 ICR100
OCR1AH=0x00; //OCR1A15 OCR1A14 OCR1A13 OCR1A12 OCR1A11 OCR1A10 OCR1A9 OCR1A8
OCR1AL=0x00; //OCR1A7 OCR1A6 OCR1A5 OCR1A4 OCR1A3 OCR1A2 OCR1A1 OCR1A0
OCR1BH=0x00; //OCR1B15 OCR1B14 OCR1B13 OCR1B12 OCR1B11 OCR1B10 OCR1B9 OCR1B8
OCR1BL=0x00; //OCR1B7 OCR1B6 OCR1B5 OCR1B4 OCR1B3 OCR1B2 OCR1B1 OCR1B0

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x07; //TOIE1 OCIE1A OCIE1B Резерв OCIE1 OCIE0B TOIE0 OCIE0A

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

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

// Global enable interrupts
#asm("sei")

for (OCR0A=0x0A; OCR0A<0xF0; OCR0A++);
{
if(OCR0A<0xF0)
{
TCCR0B=0x03;
delay_ms(50);
}
else TCCR0B=0x02;
}
}

Скажите эта программа вообще работоспособна?
Звук у меня остаётся на одной и той же частоте (TCCR0B=0x03)
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



ну так если частота ШИМ не меняется - то и частота звука меняться не будет Улыбка
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



zatmenie пишет:
Скажите эта программа вообще работоспособна?
Если программа компилируется, то работать она будет. Но, это вовсе не означает, что программа будет работать так как Вы хотите.

Если Вы не меняли Fuse Bits и не ставили кварцевый резонатор и т.д. т.п., то с данной программой МК работает на частоте 8 MHz, а не 4 MHz. Это важно. Компилятор должен знать на какой частоте МК будет выполнять программу.

Думаю, звук проще получить чисто аппаратными средствами. Посмотрите режим работы таймера/счетчика CTC (Clear Timer on Compare Match).

PS У меня такое чувство, что где-то в сети, я такое уже видел. Это я про извлечение звука из МК с помощью СТС.

PPS Звук слышимый человеком это колебания с частотой 20 - 20000 Hz. Лучше всего воспринимаются 3000 - 8000 Hz.

(Отредактировано автором: 24 Декабря, 2010 - 23:15:45)

 
 Top
Страниц (17): В начало « ... 8 9 10 11 [12] 13 14 15 16 ... » В конец
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru