Вопрос по использованию портов
|
|
Участник
14 сообщений
Мужчина
|
Дело такое, мне лень читать литературу да и особо не знаю какую нужно... Научился управлять портами, делать бегущие светодиоды на порте С микроконтроллера ATmega8 Хочу задействовать все выводы какие можно и сделать рисунки из светодиодов с помощью прерываний. Вопрос такой, порты PB3 по PB5 нужны для прошивки, тоесть их нельзя использовать, а как их не трогать чтобы управлять как выходами с PB0 по PB2 и с PB6 по PB7 Программирую в CodeVisionAVR в ней можно управлять отдельным портом, можно ли решить эту задачу такой записью?
DDRB=0b111; //первые 3 порта и последние 2 порта - выходы, т.к. 3 порта в середине настроены на прошивку DDRB.6=1; DDRB.7=1; //дальше управлять ими
PORTB=0b1 deley_ms(50) PORTB=0b10 deley_ms(50) PORTB=0b100 deley_ms(50) PORTB=0b000 PORTB.6=1 deley_ms(50) PORTB.6=0 PORTB.7=1 deley_ms(50) PORTB.7=0
На сколько знаю через точку можно задать отдельный порт и присвоить ему значение не трогая остальные порты и это запись чисто кодвиженавская. Или можно записать так?
DDRB=0b11100011 Дальше управление ими... Я просто боюсь того что если я задействую эти порты то потом не смогу пере прошить м.к. и эта программа останется в памяти на вечно х)
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Quote (ShiNi) через точку можно задать отдельный порт и присвоить ему значение не трогая остальные порты и это запись чисто кодвиженавская. - верно.
Надо смотреть в сторону "кубов" 4х4х4. 8х8х8 и смотреть в коде как там реализовано все. Ведь при ограниченном количестве портов, светодиодов там огромное множество Если nightmare зайдет, подскажет. Я давно в CvAVR не юзал мк... Но это реально - то что ты хочешь
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
|
|
|
|
|
Модераторы
211 сообщений
Мужчина
|
Да, такая запись валидна(правильна) PORTB.6=1; Это расшифровывается как 6 бит порта В установка в лог.1. В данном случае запись через точку означает индивидуальное задание нужного бита порта В. Если записать так PORTB.7=0 , то это установка 7 бит порта B в лог.0. Но сама программа, что-то не закончена, поэтому привожу такой вариант:
Code #include <mega8.h> #include <delay.h> #define dl 50 /* директива заменит dl на значение 50 */ void main(void) { DDRB=0b111; DDRB.6=1; DDRB.7=1; while(1) /* бесконечный цикл */ { PORTB=0b1; delay_ms(dl); PORTB=0b10; delay_ms(dl); PORTB=0b100; delay_ms(dl); PORTB=0b000;; PORTB.6=1; delay_ms(dl); PORTB.6=0; PORTB.7=1; delay_ms(dl); PORTB.7=0; }; } если изменять переменную dl, то будет меняться скорость перемещения огня.
Исправил опечатки в коде /nightmare/
|
|
|
|
|
Начальная группа
1798 сообщений
Мужчина
|
К портам для программирования можно подключиться, лишь бы токоограничительные резисторы не были слишком малы и "держали" на этих выводах всегда логический ноль. Можно светодиоды подключить к этим выводам через транзисторные ключи с резистором в базе килоом на 10 и работать будет. В одном устройстве так электромагнитная пищалка подключена к MISO, в итоге при перепрошивке она проигрывает забавные мелодии, причем с разными программаторами разные мелодии.
|
|
|
|
|
Участник
14 сообщений
Мужчина
|
Я ввёл только отрывок программы, а сейчас другая проблема с прерыванием, вроде всё правильно, но при компиляции выдаёт ошибку... Сейчас кину программу
Добавлено (15.10.2012, 23:16) --------------------------------------------- //Обработка прерываний через порты int1 int2 #include <mega8.h> #include <delay.h>
//Прерывание ______________________________________________________________________________________________________________________________
interrupt(2) void ExtInt0(void); // Обработка прерываний на рорте Int0 (порт PD2, Вывод 4) { PORTC=0b1; delay_ms(200); PORTC=0b10; delay_ms(200);
}
interrupt(3) void ExtInt1(void); // Обработка прерываний на рорте Int1 (порт PD3, Вывод 5) { PORTC=0b100000; delay_ms(200); PORTC=0b010000; delay_ms(200);
}
//Настройка портов и регистров _____________________________________________________________________________________________________________
void main(void) {
DDRC=0b1111111; //Все порты С сконфигурированы как выходы
DDRD=0b11110011; //Вне порты кроме PD2 и PD3 выходы (2 и 3 это прерывания)
delay_ms(10); // задержка нужна для зарядки антидребезгого конденсатора для правельной работы
GICR=0b11000000; /* Регистр eneral Interrupt Control Register разрешает внешнее прерывание 10 000000 - по выводу int1 01 000000 - по выводу int0 11 000000 - по всем выводам */
MCUCR=0b00001111; /* Регистр Micro Controller Unit Control Registr настраиваетпрерывания на срабатывание:
int1 int0 0000 10 10 - по спадающему фронту сигнала на выводе 0000 11 11 - по нарастающему фронту 0000 00 00 - по низкому уровню сигнала 0000 01 01 - по любому игменению уровня сигнала */
#asm("sei") // или SREG=(1<<7); Status Register разрешает общее прерывание
//Основная программа _____________________________________________________________________________________________________________________ while(1) { PORTC=0b1; delay_ms(50); PORTC=0b10; delay_ms(50); PORTC=0b100; delay_ms(50); PORTC=0b1000; delay_ms(50); PORTC=0b10000; delay_ms(50); PORTC=0b0100000;delay_ms(50); PORTC=0b10000; delay_ms(50); PORTC=0b1000; delay_ms(50); PORTC=0b100; delay_ms(50); PORTC=0b10; delay_ms(50); PORTC=0b1; delay_ms(50);
} } Error: C:\cvavreval\Проекты\Обработка прерываний\Обработка прерываний.c(7): '[' expected, but '(' found
|
|
|
|
|
Участник
97 сообщений
Мужчина
|
а какую ошибку выдает?
|
|
|
|
|
Участник
14 сообщений
Мужчина
|
ниже написалДобавлено (15.10.2012, 23:19) --------------------------------------------- Вот ещё раз Error: C:\cvavreval\Проекты\Обработка прерываний\Обработка прерываний.c(7): '[' expected, but '(' found
|
|
|
|
|
Участник
97 сообщений
Мужчина
|
а разве порты 0 и 1 можно использовать? это же связь через USB
|
|
|
|
|
Участник
14 сообщений
Мужчина
|
USB? Я программирую через LTP порт, задействованы порты для прошивки PB3, PB4, PB5, PC6 (выводы 1,17,18,19) А вот порты PD2 и PD3 это INT0 и INT1(выводы 4,5)Добавлено (15.10.2012, 23:30) --------------------------------------------- Не пойму что не хватает для компиляции
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Quote (ShiNi) Error: C:\cvavreval\Проекты\Обработка прерываний\Обработка прерываний.c(7): '[' expected, but '(' found - ребятки, учите ка английский чтобы понимать )) Без этого никуда )
Тут говорится - символ скобки [ отсутствует, но скобка ( найдена.
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
избегайте путей с русскими названиями...
|
|
|
|
|
Участник
14 сообщений
Мужчина
|
Да, это признаю, английский у меня сильно хромает) Так куда эту скобку поставить то нужно?))
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Если в компиляторе нажать на сроку ошибки - обычно показывается место де именно, или там же рядом указывается строка с ошибкой
|
|
|
|
|
Администраторы
3417 сообщений
Мужчина
|
Quote (ShiNi) ____________________________________________________________________________________________________________________________ перед этой "тире" стоит // ??
|
|
|
|
|