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

 
 
> Прошу помощи в написании первой программы
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
Ответов (1 - 28)
kovigor
сообщение Aug 18 2012, 03:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(AlxX @ Aug 18 2012, 06:38) *
В результате мигают оба светодиода, как будто я написал PORTA = 1(PORTA=0);
Подскажите как быть?

В приведенном вами фрагменте ошибка: светодиоды никак не могут мигать. Ну и аноды нужно к разным резисторам подключить ...
Go to the top of the page
 
+Quote Post
zombi
сообщение Aug 18 2012, 16:47
Сообщение #3


Гуру
******

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



Цитата(AlxX @ Aug 18 2012, 06:38) *
Два светодиода подключены катодом к МК, анодом к одному и тому же резистору на 1 килоом.

Куда подключён второй вывод резистора? или аноды соединены через резистор???

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

Цитата(AlxX @ Aug 18 2012, 06:38) *
Код
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

В результате мигают оба светодиода


Судя по программе состояние ног порта А вообще не меняется, как может что то мигать?

Go to the top of the page
 
+Quote Post
AlxX
сообщение Aug 19 2012, 16:04
Сообщение #4





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



Цитата(zombi @ Aug 18 2012, 19:47) *
Куда подключён второй вывод резистора? или аноды соединены через резистор???

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



Судя по программе состояние ног порта А вообще не меняется, как может что то мигать?


Схема подключения (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=0;
        PORTA.1=1;
        delay_ms(700);
    }//while
}//main
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Aug 19 2012, 17:03
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(AlxX @ Aug 19 2012, 19:04) *
Код
#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=0;
        PORTA.1=1;
        delay_ms(700);
    }//while
}//main


А Вы на ножках тестером посмотрите - дергаются ли PORTA.0 & PORTA.1
И фус-биты проверьте - особенно постоянное включение wdt (если он есть в 8535). На какой частоте работает процессор, правильно ли она указана в проекте. Так в коде ошибок не наблюдается. Может не работать если постоянно ресетится изза сторожевого таймера или косяков в подключении светодиодов.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Aug 19 2012, 21:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(AlxX @ Aug 18 2012, 06:38) *
Два светодиода подключены катодом к МК, анодом к одному и тому же резистору на 1 килоом.

Я всегда говорил, что только те, кто застал ламповую технику, никогда не путают анод и катод. Потому как если хоть раз в жизни довелось ткнуть пальцем в анодное напряжение - то на всю жизнь запомниться, что анод это ПЛЮС (ну да, сейчас этот плюс уже можно маленькими буквами писать, он маленький, но все же плюс sm.gif
Go to the top of the page
 
+Quote Post
Семин
сообщение Aug 20 2012, 08:25
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 27-04-12
Пользователь №: 71 608



Сторона диода которая похожа на букву К - есть КАТОД.
Диод открывается, проводит ток, а светодиод при этом ещё
и светится, когда на него подаётся минус.
Go to the top of the page
 
+Quote Post
zombi
сообщение Aug 20 2012, 09:20
Сообщение #8


Гуру
******

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



to AlxX
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные изображения
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
AlxX
сообщение Aug 21 2012, 13:00
Сообщение #9





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



Цитата(zombi @ Aug 20 2012, 12:20) *
to AlxX


Абсолютно верно - у меня наоборот светодиоды подключены (+ - выход мк, - - через резистор на GND ).

Сторожевой таймер в настройках проекта отключен. В настройках указана частота 1 мегагерц, доп. кварцев не подключено. Сигнал на обеих ногах появляется одновременно (на всех остальных сигнала нет).
Go to the top of the page
 
+Quote Post
Xenia
сообщение Aug 21 2012, 13:20
Сообщение #10


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Думаю, что надо разориться и купить ... еще один резистор на 1 ком sm.gif. Как только светодиоды разведут по отдельным резисторам, всё само наладится. А сейчас, скорее всего, по отдельности они горят, а вместе гаснут (резко ослабляют свое свечение) из-за увеличения падения напряжения на единственном сопротивлении.
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Aug 21 2012, 14:48
Сообщение #11


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Скорей всего у Вас сопля между ногами wink.gif
ЗЫ. т.е не у Вас, а у процессора.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Aug 21 2012, 16:30
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Чем сидеть в онлайне на форуме и ждать подсказок, лучше давно бы уже сами попробовали поморгать ногами в противофазе, оторвать светодиоды и посмотреть напряжение на выводах, просто выставить противофазные напряжения без моргания... Дел на 5 минут, баг ловится сразу.
Go to the top of the page
 
+Quote Post
AlxX
сообщение Aug 22 2012, 05:27
Сообщение #13





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



В общем проблема решена. Я как человек привыкший верить конструкторам и заставший еще живые радиодетали СССР по старой памяти спаял "широкую" ногу к выводу МК, а "узкую" через сопротивление на землю. Но китайская промышленность, как оказалось, думает иначе! У них на красных светодиодах так и есть, а на желтых и зеленых с точностью до наоборот! В общем перепаял светодиоды и добавил сопротивление и все работает на ура. Всем огромное спасибо.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Aug 22 2012, 06:39
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(AlxX @ Aug 22 2012, 08:27) *
Я как человек привыкший верить конструкторам и заставший еще живые радиодетали СССР

Как человек, повидавший настолько многое, могли бы по крайней мере разобраться и правильно описать причину неработоспособности. Так как Вы последовательно утверждали:
1) светодиоды мигают одновременно
2) светодиоды припаяны анодом к земле

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

На будущее: попробуйте корректно и правильно описать проблему. Часто хорошо поставленный вопрос не нуждается в ответе. Задающий, прочитав такой вопрос, сам находит ответ sm.gif
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Aug 22 2012, 07:50
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата
"широкую" ногу к выводу МК, а "узкую" через сопротивление на землю.
...
на красных светодиодах так и есть, а на желтых и зеленых с точностью до наоборот!


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

UPDATE. Пардон, сообразил. Если самому додумать, что один светодиод зелёный ("неправильный"), второй красный, то логика какая-то прослеживается. Я с чего-то решил, что они одинаковые.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
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 - 23:43
Рейтинг@Mail.ru


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