Без описания |
| Поиск в теме | Версия для печати |
Белый Волк  |
Отправлено: 11 Ноября, 2008 - 08:54:18
|

Супермодератор

Сообщений всего: 648
Дата рег-ции: Февр. 2007
|
Все микроконтроллеры серии mega поддерживают внутрисхемное программирование (ISP - In System Programing) через интерфейс SPI (Serial Peripherial Interface - последовательный периферийный интерфейс).
Выводы, необходимые для программирования:
__________ATMEGA8_______________ __ATMEGA16
RESET_____PC6, он же (1)____________(9)
GND ______(8) и/или (22) ____________(11) и/или (31)
MISO______PB4, он же (18)___________PB6, он же (7)
SCK_______PB5, он же (19)___________PB7, он же (8)
MOSI______PB3, он же (17)___________PB5, он же (6)
Числа в скобках - номера выводов для корпусов PDIP (выводы крупные, расстояние между выводами ~2,5 мм).
Программатор STK200, описанный на этом сайте и состоящий из 5 проводов от LPT-порта можно использовать с любыми микроконтроллерами серии mega.
При программировании в настройках программы укажите, что код пишется для ATmega16.(Отредактировано автором: 11 Ноября, 2008 - 08:59:10) |
| |
|
darkblue  |
Отправлено: 15 Ноября, 2008 - 21:30:22
|

Супермодератор

Сообщений всего: 403
Дата рег-ции: Нояб. 2008
|
Спасибо вам ,лишь вы один помогаете новичкам,собрал я данную схемку ,прошил её файлом с тестом двигателя работает,уже дня 2 сижу разбираюсь с программой для простого робота,может вы взглянете что нужно ещё поменять для данной схемки ,там просто программа была написана для atmega8 я чуть чуть изменил порты вывода но всё равно глуха
(Добавление)
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7 beta 5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 17.02.2008
Author : Spiritus Sancti
Company : Licrym.org
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <stdlib.h>
unsigned int gtime;
unsigned char d[7][7]={ //таблица вероятностей переходов, строки - текущее движение, столбцы - следующее.
// STO F FR FL B BR BL
/*STO*/ {1, 18, 18, 18, 18, 17, 13},
/*F */ {7, 26, 21, 21, 10, 8, 7},
/*FR */ {7, 23, 23, 27, 8, 6, 6},
/*FL */ {7, 23, 7, 43, 8, 6, 6},
/*B */ { 4, 10, 10, 5, 28, 22, 21},
/*BR */ { 6, 13, 9, 8, 35, 22, 7},
/*BL */ {16, 8, 6, 6, 35, 8, 21}
};
unsigned char now, h;
int gTimeOfMove = 1000; //время элементарного хода в мсек
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //прерывание раз в 1/1041 сек (1041,666 Гц)
{
if (gtime!=0)--gtime;
}
void delay (unsigned int time){ //на вход задержка милисекундах, макс 65535
gtime=time;
while(gtime!=0){};
}
//далее функции управления двигателями
void f(int t){ // Вперед
PORTA.1=0;
PORTA.2=1;
PORTA.3=0;
PORTA.4=0;
if(t!=0) delay(t);
}
void b(int t){ // назад
PORTA.1=1;
PORTA.2=0;
PORTA.3=0;
PORTA.4=0;
if(t!=0) delay(t);
}
void fl(int t){ // вперед налево
PORTA.1=0;
PORTA.2=1;
PORTA.3=0;
PORTA.4=1;
if(t!=0) delay(t);
}
void fr(int t){ // вперед направо
PORTA.1=0;
PORTA.2=1;
PORTA.3=1;
PORTA.4=0;
if(t!=0) delay(t);
}
(Добавление)
void bl(int t){ // назад налево
PORTA.1=1;
PORTA.2=0;
PORTA.3=0;
PORTA.4=1;
if(t!=0) delay(t);
}
void br(int t){ // назад направо
PORTA.1=1;
PORTA.2=0;
PORTA.3=1;
PORTA.4=0;
if(t!=0) delay(t);
}
void stop(int t){ //стоп
PORTA.1=0;
PORTA.2=0;
PORTA.3=0;
PORTA.4=0;
if(t!=0) delay(t);
}
void led_on(void){ //Включить светодиод
PORTD.0=1;}
void led_off(void){ //Выключить светодиод
PORTD.0=0;}
void go(unsigned char napr){ //Выборка направления и отдача команды двигателям
switch(napr){
case 1:
stop(gTimeOfMove);
break;
case 2:
f(gTimeOfMove);
break;
case 3:
fr(gTimeOfMove);
break;
case 4:
fl(gTimeOfMove);
break;
case 5:
b(gTimeOfMove);
break;
case 6:
br(gTimeOfMove);
break;
case 7:
bl(gTimeOfMove);
break;
};
}
unsigned char next_move(void){ //выясняем следующий ход
int a, b, c;
a = rand()/327; //0..99 число
c=0;
for (b=1; b<=7; b++){ //поик по таблице
if(a > c && a < (d[now][b]+c) ) break;
c=c+d[now][b];
};
if (b==8)b=1; //если b будет 8 то контроллер зависает, нужно искать ошибку в алгоритме, пока просто закроем эту дыру
now = b;
return b;
};
(Добавление)
void bl(int t){ // назад налево
PORTA.1=1;
PORTA.2=0;
PORTA.3=0;
PORTA.4=1;
if(t!=0) delay(t);
}
void br(int t){ // назад направо
PORTA.1=1;
PORTA.2=0;
PORTA.3=1;
PORTA.4=0;
if(t!=0) delay(t);
}
void stop(int t){ //стоп
PORTA.1=0;
PORTA.2=0;
PORTA.3=0;
PORTA.4=0;
if(t!=0) delay(t);
}
void led_on(void){ //Включить светодиод
PORTD.0=1;}
void led_off(void){ //Выключить светодиод
PORTD.0=0;}
void go(unsigned char napr){ //Выборка направления и отдача команды двигателям
switch(napr){
case 1:
stop(gTimeOfMove);
break;
case 2:
f(gTimeOfMove);
break;
case 3:
fr(gTimeOfMove);
break;
case 4:
fl(gTimeOfMove);
break;
case 5:
b(gTimeOfMove);
break;
case 6:
br(gTimeOfMove);
break;
case 7:
bl(gTimeOfMove);
break;
};
}
unsigned char next_move(void){ //выясняем следующий ход
int a, b, c;
a = rand()/327; //0..99 число
c=0;
for (b=1; b<=7; b++){ //поик по таблице
if(a > c && a < (d[now][b]+c) ) break;
c=c+d[now][b];
};
if (b==8)b=1; //если b будет 8 то контроллер зависает, нужно искать ошибку в алгоритме, пока просто закроем эту дыру
now = b;
return b;
};
(Добавление)
void start(void){ //начинаем движение. пока без датчиков
while(1){
h=next_move();
go(h);
led_on();
delay(100);
led_off();
}
};
void main(void)
{ int i;
//Инициализация портов
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x7F;
PORTA=0x00;
DDRA=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00; //коэфф деления таймера
OCR1AL=0x0F; //
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei"
while (1)
{
now=1;
for (i=0;i<=5;i++) { //Помигаем светодиодом после включения, заодно задержка перед троганием что бы успеть отбежать
led_on();
delay(500);
led_off();
delay(500);
};
start();
};
} |
| |
|
Белый Волк  |
Отправлено: 18 Ноября, 2008 - 09:42:19
|

Супермодератор

Сообщений всего: 648
Дата рег-ции: Февр. 2007
|
Я использую другой компилятор языка C, поэтому я не могу быстро разобраться в синтаксисе программы, которую Вы выложили.
То, что я понял:
1) драйвер двигателей подключен к четырём выводам порта A (PORTA(1-4), видимо имеются в виду первые четыре бита порта, выводы микросхемы - PA0-PA3);
2) при начале движения (без датчиков), следующее движение определяется случайно, но с заданной вероятностью.
С остальным нужно разбираться.
Предлагаю Вам попробовать написать простой код самостоятельно, используя, например, программу AVR Studio. В ней можно пошагово посмотреть выполение программы и состояние таймеров, портов ввода-вывода, и значения переменных.
Для программирования можно использовать C или Assembler. Во втором случае программирование можно начинать сразу после установки программы, в первом - нужно сначала установить WinAVR. |
| |
|
|
| Поиск в теме | Версия для печати |
| Страниц (1): [1] |
| « Делаем роботов » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
  |
|
|
|