реклама на сайте
подробности

 
 
> Прошу помощи в написании первой программы
AlxX
сообщение Aug 18 2012, 03:38
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 18-08-12
Пользователь №: 73 176



Здравствуйте. Я начинаю изучать програмирование под МК и у меня не получается корректно написать первую программу.
МК, используемый мною, ATmega8535. Из обвязки 2 светодиода на порту A на нулевом и первом соответственно. Схема стаблилизации питания на 78L05. Два светодиода подключены катодом к МК, анодом к одному и тому же резистору на 1 килоом. Вся эта конструкция запитана от кроны.

Пишу программу:

#include <mega8535.h>
#include <delay.h>

void main(void){
PORTA=0x00;
DDRA=0xFF;
while(1){
PORTA.0=1;
PORTA.1=0;
delay_ms(500);
PORTA.0=1;
PORTA.1=0;
//PORTA.1=1;
delay_ms(700);
}//while
}//main

В результате мигают оба светодиода, как будто я написал PORTA = 1(PORTA=0);
Подскажите как быть?
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 28)
AlxX
сообщение Aug 23 2012, 05:00
Сообщение #16





Группа: Новичок
Сообщений: 5
Регистрация: 18-08-12
Пользователь №: 73 176



Цитата(Ruslan1 @ Aug 22 2012, 09:39) *
Как человек, повидавший настолько многое, могли бы по крайней мере разобраться и правильно описать причину неработоспособности. Так как Вы последовательно утверждали:
1) светодиоды мигают одновременно
2) светодиоды припаяны анодом к земле

Одно из этих утверждений явно ложное.

На будущее: попробуйте корректно и правильно описать проблему. Часто хорошо поставленный вопрос не нуждается в ответе. Задающий, прочитав такой вопрос, сам находит ответ sm.gif


Я не многое видел. У меня отец инженер КИПиА, поэтому данного железа времен союза у нас дома было много. Я никогда не учился работать с электроникой (я программист по образованию и работаю по нему же), поэтому познания мои весьма скудные, и мк меня заинтересовали со стороны программирования. А теперь в свои 25 я еще пытаюсь изучить правила построения схем-обвязок к мк.
Go to the top of the page
 
+Quote Post
Plain
сообщение Aug 23 2012, 05:29
Сообщение #17


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



Хороший программист в первую очередь хорошо себе комментирует, и если бы Вы, как Вам говорят, отписали бы здесь, с самого начала, простым и понятным русским языком, всё то, что в действительности сделали, а именно "я подпаял, не глядя ни в какие бумаги, и не проверяя никакими приборами, первые попавшиеся мне красный и зелёный светодиоды неизвестной марки тольстенькими ножками к выводам МК, а тоненькими к резистору 1 кОм на общий провод", то — ещё раз, как Вам и сказали то, что Вы сейчас процитировали — Вы бы сами увидели ответ на свой вопрос.
Go to the top of the page
 
+Quote Post
ilglbv
сообщение Aug 26 2012, 20:21
Сообщение #18





Группа: Новичок
Сообщений: 4
Регистрация: 26-08-12
Пользователь №: 73 262



Доброго времени суток!
Даже стыдно как то спрашивать) Но все же..
Пытаюсь поиграться с регистом PIN, вроде все варианты перепробывал, но не получается(((

#include <avr/io.h>
#include <util/delay.h>
int main (void)
{ DDRC = 01111111;
PORTC = 10000000;
while (1){
if (PINC0 == 0)
{PORTB |= (1<<5); // включаем
_delay_ms(550); // ждём
PORTB &= ~(1<<5); // выключаем
_delay_ms(550); // ждём
}

}
}

В двоичном пишу потому что стал думать может в хексе запутался((
Please, Help!
Avr Studio 6, Proteus 7.7
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 20:59
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ilglbv @ Aug 26 2012, 23:21) *
Пытаюсь поиграться с регистом PIN, вроде все варианты перепробывал, но не получается(((

Не помешало бы указать тип МК: так как у разных типов разные возможности для "игр" с PINx.
У mega8/16/../128 PINx - только для чтения состояния порта, а у mega48/88../328 - PINx может быть использован для инвертирования выхода.

Цитата(ilglbv @ Aug 26 2012, 23:21) *
DDRC = 01111111;
PORTC = 10000000;
while (1){
if (PINC0 == 0)
{PORTB |= (1<<5);

В двоичном пишу потому что стал думать может в хексе запутался((

DDRC = 01111111; - настройка порта С на выход?
Тогда PORTB |= (1<<5) зачем? Подключить подтягивающие резисторы в порте B?
DDRB = 0xFF; было бы логичней.
И вообще кстати непонятна цель вашей программы- вывести на PB5 "1" если на PC0 - высокий уровень? Или что-то другое?

Цитата(ilglbv @ Aug 26 2012, 23:21) *
if (PINC0 == 0)

PINC0 это вот что:
#define PINC0 0
то есть ваш код
if (0 == 0)
.
Лучше так:
Код
if ((PINC&(1<<0))==0) { // если PC0 == 0
//....
}



Цитата(ilglbv @ Aug 26 2012, 23:21) *
В двоичном пишу потому что стал думать может в хексе запутался((

Кому как, в bin проще запутаться - букв много, в hex-е меньше.

Go to the top of the page
 
+Quote Post
zombi
сообщение Aug 26 2012, 21:09
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(ilglbv @ Aug 26 2012, 23:21) *
PORTC = 10000000;

Пишем в PORTC десять лямов?! и что компилятор не ругается?

Цитата
2.2. Константы


Имеется несколько видов констант, которые перечислены
ниже.

2.2.1. Целые константы


Целая константа, состоящая из последовательности цифр,
считается восьмеричной, если она начинается с 0 (цифра
нуль), и десятичной в противном случае. Цифры 8 и 9 имеют
восьмеричные значения 10 и 11 соответственно. Последова-
тельность цифр, которой предшествуют символы 0х (нуль, х-
маленькое) или 0х (нуль X-большое), рассматривается как
шестнадцатиричное целое. Шестнадцатиричные цифры включают
буквы от a (маленькое) или A (большое) до f (маленькое) или
F (большое) со значениями от 10 до 15. Десятичная константа,
величина которой превышает наибольшее машинное целое со зна-
ком, считается длинной; восьмеричная или шестнадцатиричная
константа, которая превышает наибольшее машинное целое без
знака, также считается длинной.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 21:21
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Aug 27 2012, 00:09) *
Пишем в PORTC десять лямов?!

наверное имелось в виде PORTC=0b1000000; или как там этот бин пишется...
Цитата(zombi @ Aug 27 2012, 00:09) *
и что компилятор не ругается?

А должен?
Варнинг выпишет и не более...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 21:28
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Aug 27 2012, 00:09) *
Пишем в PORTC десять лямов?!

наверное имелось в виде PORTC=0b1000000; или как там этот бин пишется...
Цитата(zombi @ Aug 27 2012, 00:09) *
и что компилятор не ругается?

А должен?
Варнинг выпишет и не более...
Go to the top of the page
 
+Quote Post
zombi
сообщение Aug 26 2012, 21:28
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ Aug 27 2012, 00:21) *
наверное имелось в виде PORTC=0b1000000; или как там этот бин пишется...

Дык, вроде в СИ вообще нет двоичной формы записи числа.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 21:32
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Aug 27 2012, 00:28) *
Дык, вроде в СИ вообще нет двоичной формы записи числа.

В Си нету, а в AVRGCC есть: не знаю точно как и зачем сделали, наверное что-то вроде такого:
Код
#define b00000001 1
#define b00000010 2

Бессмысленная штука.
Go to the top of the page
 
+Quote Post
ilglbv
сообщение Aug 26 2012, 21:35
Сообщение #25





Группа: Новичок
Сообщений: 4
Регистрация: 26-08-12
Пользователь №: 73 262



Поторопился... "проектик" на Mega8, суть его в том, что при нажатии на кнопку (pc0) должен запуститься цикл (pb5).
Попробую сейчас сделать запись PINX вашего вида
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 21:37
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



. стёрто
форум глючит - сообщения по 2 раза пишутся...
Go to the top of the page
 
+Quote Post
ilglbv
сообщение Aug 26 2012, 21:45
Сообщение #27





Группа: Новичок
Сообщений: 4
Регистрация: 26-08-12
Пользователь №: 73 262



Вот, поправил и все заработало)
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{ DDRC |=(0<<0); <- смущает меня эта запись, но компилятор не возмущается... все работает
PORTC |=(1<<0);
while (1){
if ((PINC&(1<<0))==0)
{PORTB |= (1<<5); // включаем
_delay_ms(550); // ждём
PORTB &= ~(1<<5); // выключаем
_delay_ms(550); // ждём
}

}
}
По поводу описания портов, номеров битов идут слева направо или наоборот (DDRX=0123..7 или DDRX=765..10)?
Насчет хекса, вы постоянно пересчитываете или же наизусть знаете?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 22:09
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ilglbv @ Aug 27 2012, 00:35) *
DDRC |=(0<<0); <- смущает меня эта запись, но компилятор не возмущается... все работает

А что ему возмущатся?
DDRC |=(0<<0); тоже самое, что
DDRC|=0;
то есть порт DDRC не изменится в результате.
Компилятор не должен возмушаться на такое - может так надо.
Он только должен сгенерить код который прочитает DDRC, сделать ИЛИ с заданным числом и результат записать в DDRC.
Если нужно переключить PC0 на вход нужно написать так:
Код
DDRC&=~(1<<0);


Цитата(ilglbv @ Aug 27 2012, 00:35) *
По поводу описания портов, номеров битов идут слева направо или наоборот (DDRX=0123..7 или DDRX=765..10)?

Вопрос какой-то некорректный...
Допустим
DDRC=1; установка в 1 бита 0
DDRC=2; установка в 1 бита 1
...
DDRC=1<<7; установка в 1 бита 7

Цитата(ilglbv @ Aug 27 2012, 00:35) *
Насчет хекса, вы постоянно пересчитываете или же наизусть знаете?

Ну, тетраду в hex представить что она есть в бин не сложно, байт в hex тоже можно - в этих пределах можно сказать наизусть.
А вот таблицу умножения в hex не знаю, наверное оно не надо.
А в bin-записи много букв и труднее представить что там 0 что один - глаза разбегаются...

PS
Код
PORTB |= (1<<5); // включаем
_delay_ms(550); // ждём
PORTB &= ~(1<<5); // выключаем
_delay_ms(550); // ждём

PB5 может нужно на выход включить?
DDRB|=(1<<5);
или включения pullup резистора достаточно?
Go to the top of the page
 
+Quote Post
ilglbv
сообщение Aug 29 2012, 11:48
Сообщение #29





Группа: Новичок
Сообщений: 4
Регистрация: 26-08-12
Пользователь №: 73 262



Цитата(_Артём_ @ Aug 27 2012, 02:09) *
А что ему возмущатся?
DDRC |=(0<<0); тоже самое, что
DDRC|=0;
то есть порт DDRC не изменится в результате.
Компилятор не должен возмушаться на такое - может так надо.
Он только должен сгенерить код который прочитает DDRC, сделать ИЛИ с заданным числом и результат записать в DDRC.
Если нужно переключить PC0 на вход нужно написать так:
Код
DDRC&=~(1<<0);



Вопрос какой-то некорректный...
Допустим
DDRC=1; установка в 1 бита 0
DDRC=2; установка в 1 бита 1
...
DDRC=1<<7; установка в 1 бита 7


Ну, тетраду в hex представить что она есть в бин не сложно, байт в hex тоже можно - в этих пределах можно сказать наизусть.
А вот таблицу умножения в hex не знаю, наверное оно не надо.
А в bin-записи много букв и труднее представить что там 0 что один - глаза разбегаются...

PS
Код
PORTB |= (1<<5); // включаем
_delay_ms(550); // ждём
PORTB &= ~(1<<5); // выключаем
_delay_ms(550); // ждём

PB5 может нужно на выход включить?
DDRB|=(1<<5);
или включения pullup резистора достаточно?


Видимо достаточно... ведь все работает) (avr studio 6)
PS спасибо Артему за PINC&(1<<0))==0
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016