Форум myROBOT.ru » Шаг за шагом » С чего начать? » программирование

Страниц (6): « 1 2 [3] 4 5 6 »
 

31. Andrey 2004 - 27 Января, 2019 - 12:32:37 - перейти к сообщению
Спасибо что пояснили
Цитата:
за варнинги - у вас значения типа 01010101 подразумеваются в двоичном виде, но это только вы понимаете. Компилятор такую запись понимает в десятичном виде (один миллион десять тысяч сто один). Для пояснения компилятору двоичного вида надо писать b01010101.

А я то думаю зачем заморачиваться, и так сойдет. Улыбка Улыбка
Двойным щелчком кликнул, получил вот это:

void
_delay_us(double __us)
{
uint8_t __ticks;
double __tmp ;
#if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__) && !defined(__DELAY_BACKWARD_COMPATIBLE__)
uint32_t __ticks_dc;
extern void __builtin_avr_delay_cycles(unsigned long);
__tmp = ((F_CPU) / 1e6) * __us;

#if defined(__DELAY_ROUND_DOWN__)
__ticks_dc = (uint32_t)fabs(__tmp);

#elif defined(__DELAY_ROUND_CLOSEST__)
__ticks_dc = (uint32_t)(fabs(__tmp)+0.5);

#else
//round up by default
__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
#endif

__builtin_avr_delay_cycles(__ticks_dc);

#elif !__HAS_DELAY_CYCLES || (__HAS_DELAY_CYCLES && !defined(__OPTIMIZE__)) || defined (__DELAY_BACKWARD_COMPATIBLE__)
__tmp = ((F_CPU) / 3e6) * __us;
if (__tmp < 1.0)
__ticks = 1;
else if (__tmp > 255)
{
_delay_ms(__us / 1000.0);
return;
}
else
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
#endif
}

это и есть "инклуднуто" ???
32. Predator - 27 Января, 2019 - 12:56:33 - перейти к сообщению
#include - директива, которая представляет собой сообщение компилятору, о том, что надо вставить еще кусок кода.
в верхних строчках этого файла (это и есть delay.h) посмотрите, есть-ли
#include "math.h" или
#include <math.h>
33. Andrey 2004 - 27 Января, 2019 - 13:44:32 - перейти к сообщению
там есть вот эти строчки
#include <inttypes.h>
#include <util/delay_basic.h>
а нужной нам инклудто нету. Замешательство
(Добавление)
или я опять не там искал???
34. Predator - 27 Января, 2019 - 17:16:16 - перейти к сообщению
вероятно там, сейчас покопаю в своих файлах, как там.
(Добавление)
хм....
у меня так:

CODE:

#include <inttypes.h>
#include <util/delay_basic.h>
#include <math.h>


попробуйте в свой исходник вставить
#include <math.h>

в смысле сюда:
CODE:

#define F_CPU 1000000UL
#include <math.h>
#include <util/delay.h>
#include <avr/io.h>
#define LED PORTC//переименовывание порта ц
#define k PORTD//переименовывание порта д
#define D 300// задержка
35. Andrey 2004 - 27 Января, 2019 - 18:07:49 - перейти к сообщению
Ничего не меняется.
Грустный
(Добавление)
CODE:
#include <avr/io.h>


int main(void)
{
DDRD=0b00000000;
DDRC=0b11111111;
PORTC=0b00000000;
PORTD=0b11111111;

while(1)
{
if (PORTD=0b11111110)
{
PORTC=0b11111111;
}
else
{
PORTC=0b00000000;
}

}
}


А программка данного типа будет правильной??

компилятор ошибок не выдает, но на практике не работает.
36. Predator - 27 Января, 2019 - 21:53:40 - перейти к сообщению
if (PORTD=0b11111110) - в этой строчке вы сравниваете весь порт D, со значением 0b11111110

1) регистр чтения для входов называется PIND (это дурацкое разделение только у АВРов)
2) при таком сравнении нужно, чтобы на всех входах кроме PIN0 были 1, а на PIN0 был 0, и никак иначе. Если требуется анализировать только PIN0 - то сравнивайте так:
CODE:

if ((PIND&0b00000001)=0)

тогда все битики, кроме 0-го станут 0-ми (независимо от того что там на входах), а нулевой останется как есть.


глобальная проблема другой версии в функции _delay_ms, она описана в util/delay.h, а это описание в свою очередь использует fabs, которая описана в math.h (по крайней мере у меня).
37. Andrey 2004 - 28 Января, 2019 - 13:48:20 - перейти к сообщению
Predator пишет:

if ((PIND&0b00000001)=0)

Вставил... Выдает вот эту ошибку:
Error 1 lvalue required as left operand of assignment.
38. Predator - 28 Января, 2019 - 13:51:20 - перейти к сообщению
да, мой косяк: == для сравнения.
39. Andrey 2004 - 28 Января, 2019 - 14:51:20 - перейти к сообщению
Т.е вот так:
if ((PIND&0b00000001)==0)
40. Predator - 28 Января, 2019 - 15:17:53 - перейти к сообщению
да
41. Andrey 2004 - 28 Января, 2019 - 16:36:10 - перейти к сообщению
В итоге я получил вот такую программу:

CODE:
#include <avr/io.h>
int main(void)
{
DDRD=0b00000000;
DDRC=0b11111111;
PORTC=0b00000000;
PORTD=0b11111111;

while(1)
{
if ((PIND&0b00000001)==0)

{
PORTC=0b11111111;
}
else
{
PORTC=0b00000000;
}

}
}


В которой четко сказано :

кнопка нажата-светодиод горит,
не нажата - не горит.
Все логично...
но у меня на практике программа работает неправильно, светодиод горит изначально,а когда нажимаешь кнопку гаснет.

может вы знаете в чем проблема??
42. Predator - 28 Января, 2019 - 17:28:44 - перейти к сообщению
а вот тут 2 варианта:
1) у вас кнопка подтянута к земле, при нажатии садится на + (в программе подразумевается наоборот)
2) у вас анод светодиода на +, а катод на ноге, в программе подразумевается, что анод на ноге, катод на земле. (ну и еще где-нибудь по пути есть и должен быть резистор).
43. Andrey 2004 - 01 Февраля, 2019 - 14:17:44 - перейти к сообщению
А данные проблемы как лучше решить программно или плату перепаять,
ведь у всех остальных эта программа правильно работает...
Predator пишет:
вот тут 2 варианта:
1) у вас кнопка подтянута к земле, при нажатии садится на + (в программе подразумевается наоборот)
2) у вас анод светодиода на +, а катод на ноге, в программе подразумевается, что анод на ноге, катод на земле. (ну и еще где-нибудь по пути есть и должен быть резистор)

Начал экспериментировать над своей программой.

Возникли трудности с сохранением хекс файла. Я его сохраняю, а он то сохраняется,
то остается прежним. Ну а так как мне нужно много различных вариантов перепробовать из которых лишь один правильный, то работа становится крайне неудобной.
Думаю скачать новую АВРку, не подскажете сколько она весит и где ее лучше скачать?
44. Predator - 01 Февраля, 2019 - 14:42:53 - перейти к сообщению
для начала свою схему "в студию", желательно и фотографии.
сделаем правильно под вашу схему.

Atmel studio на сайте microchip.
45. Andrey 2004 - 01 Февраля, 2019 - 15:37:15 - перейти к сообщению
Ну все я наконец то разобрался со своей программой, дело в том что у меня отладочная плата, привезенная из китая, включает в себя кнопку и светодиод. Я посмотрел, кнопка была подключена к PD1, светодиод к PD2 . Ну я запомнил что кнопка подключена к первой ноге,а светодиод ко второй а про то что это все порт D я забыл, ну и в конце концов получал нужное мне напряжение не на той ноге... В общем я извиняюсь за то что из за своей халатности, потратил ваше время задавая глупые вопросы. А также СПАСИБО зато что помогли мне с этой программкой, теперь все работает.


Однако новую студию я все равно хотел бы скачать, у меня перед этим было много неудачных ошибок, и в итоге скачал вот эту, но она какая то глючная...
(Добавление)
Извините ответ сразу не увидел, просто мне не мешало бы страницу почаще перезагружать...