|
Прошу помощи в написании первой программы |
|
|
|
Aug 18 2012, 03:38
|
Группа: Новичок
Сообщений: 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); Подскажите как быть?
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 28)
|
Aug 23 2012, 05:00
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-08-12
Пользователь №: 73 176

|
Цитата(Ruslan1 @ Aug 22 2012, 09:39)  Как человек, повидавший настолько многое, могли бы по крайней мере разобраться и правильно описать причину неработоспособности. Так как Вы последовательно утверждали: 1) светодиоды мигают одновременно 2) светодиоды припаяны анодом к земле Одно из этих утверждений явно ложное. На будущее: попробуйте корректно и правильно описать проблему. Часто хорошо поставленный вопрос не нуждается в ответе. Задающий, прочитав такой вопрос, сам находит ответ  Я не многое видел. У меня отец инженер КИПиА, поэтому данного железа времен союза у нас дома было много. Я никогда не учился работать с электроникой (я программист по образованию и работаю по нему же), поэтому познания мои весьма скудные, и мк меня заинтересовали со стороны программирования. А теперь в свои 25 я еще пытаюсь изучить правила построения схем-обвязок к мк.
|
|
|
|
|
Aug 23 2012, 05:29
|
Гуру
     
Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710

|
Хороший программист в первую очередь хорошо себе комментирует, и если бы Вы, как Вам говорят, отписали бы здесь, с самого начала, простым и понятным русским языком, всё то, что в действительности сделали, а именно "я подпаял, не глядя ни в какие бумаги, и не проверяя никакими приборами, первые попавшиеся мне красный и зелёный светодиоды неизвестной марки тольстенькими ножками к выводам МК, а тоненькими к резистору 1 кОм на общий провод", то — ещё раз, как Вам и сказали то, что Вы сейчас процитировали — Вы бы сами увидели ответ на свой вопрос.
|
|
|
|
|
Aug 26 2012, 20:21
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Aug 26 2012, 20:59
|
Гуру
     
Группа: Свой
Сообщений: 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-е меньше.
|
|
|
|
|
Aug 26 2012, 21:09
|

Гуру
     
Группа: Свой
Сообщений: 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. Десятичная константа, величина которой превышает наибольшее машинное целое со зна- ком, считается длинной; восьмеричная или шестнадцатиричная константа, которая превышает наибольшее машинное целое без знака, также считается длинной.
|
|
|
|
|
Aug 26 2012, 21:21
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(zombi @ Aug 27 2012, 00:09)  Пишем в PORTC десять лямов?! наверное имелось в виде PORTC=0b1000000; или как там этот бин пишется... Цитата(zombi @ Aug 27 2012, 00:09)  и что компилятор не ругается? А должен? Варнинг выпишет и не более...
|
|
|
|
|
Aug 26 2012, 21:28
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(zombi @ Aug 27 2012, 00:09)  Пишем в PORTC десять лямов?! наверное имелось в виде PORTC=0b1000000; или как там этот бин пишется... Цитата(zombi @ Aug 27 2012, 00:09)  и что компилятор не ругается? А должен? Варнинг выпишет и не более...
|
|
|
|
|
Aug 26 2012, 21:32
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(zombi @ Aug 27 2012, 00:28)  Дык, вроде в СИ вообще нет двоичной формы записи числа. В Си нету, а в AVRGCC есть: не знаю точно как и зачем сделали, наверное что-то вроде такого: Код #define b00000001 1 #define b00000010 2 Бессмысленная штука.
|
|
|
|
|
Aug 26 2012, 21:35
|
Группа: Новичок
Сообщений: 4
Регистрация: 26-08-12
Пользователь №: 73 262

|
Поторопился... "проектик" на Mega8, суть его в том, что при нажатии на кнопку (pc0) должен запуститься цикл (pb5). Попробую сейчас сделать запись PINX вашего вида
|
|
|
|
|
Aug 26 2012, 21:45
|
Группа: Новичок
Сообщений: 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)? Насчет хекса, вы постоянно пересчитываете или же наизусть знаете?
|
|
|
|
|
Aug 26 2012, 22:09
|
Гуру
     
Группа: Свой
Сообщений: 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 резистора достаточно?
|
|
|
|
|
Aug 29 2012, 11:48
|
Группа: Новичок
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|