Перейти к содержанию

Видеокурс по AVR-микроконтроллерам для начинающих


Рекомендуемые сообщения

пробелы и ТАВы пофиг ему.

форматирование- касательно редактора форума, это так, мысли в слух.

я про то что если будете писать такие сложные конструкции строчка за строчкой, то обязательно пропустите какую нить скобку, и тогда компилятор будет ругаться на лишнй else или еще на чего нить.

в таком случае проще пользовать копипаст, и ТАВы для наглядности.

но есть моменты в которых такие кострукции упрощаются с 3-5 операторов ветвления вложеных друг в друга, до 2-3. а то и меньше

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

На свой вопрос я получил хороший ответ, но "Trouble" свой не исправил...

Посмотрите на тот код который выдумал и поясните пожалуйста мою ошибку:

1//Atmega16

2//создание бегущего огонька на 16 светодиодах: порт А и порт Б

3//при нажатой кнопке огонек бежит в обратную сторону

4#define F_CPU 8000000 //установка работы процессора на частоте 8МГц

5#include <avr/io.h> // подключение библиотек для работы с АВР

6#include <util/delay.h> // подключение библиотек временной задержки

7 void preset() // первоначальные настройки

8 {

9 DDRA = 0xFF; // порт А как выход

10 PORTA = 0x00;// порт А записать в 0

11 DDRB = 0xFF; // порт В как выход

12 PORTB = 0x00;// порт В записать в 0

13 DDRD = 0x00; // порт Д как вход

14 PORTD = 0xFF;// нулевой бит порта Д с подътяжкой на +

15 PORTA = 0x01;// записать в порт А лог. 1 на 0

16 _delay_ms(200);// задержка 200 м.сек.

17 PORTA = 0x03;// записать в порт А лог. 1 на 0 и 1 бит

18 _delay_ms(200);

19 }

20 int main(void) // основное тело программы

21 {

22 preset();// запуск первоначальных настроек

23 while(1) // основная функция

24 {

25 if (PIND&(1<<PC0)) //при НЕ нажатой кнопке выполнить действие , так как на PORTD уже есть лог 1.

26 {

27 if (PORTA == 0xC0) // если порт А не равен 0хС0 будет истина

28 {

29 PORTA = 0x80;

30 PORTB = 0x01;

31 _delay_ms(200);

32 PORTA = 0x00;

33 PORTB = 0x03;

34 _delay_ms(200);

35 if (PORTB == 0x03)

36 {

37 preset();// запуск первоначальных настроек

38 }

39 else

40 {

41 PORTB =PORTB*2;

42 _delay_ms(200);

43 }

44 }

45 else

46 {

47 if (PORTA == 0x60)

48 {

49 PORTA =0xC0;

50 }

51 else

52 {

53 PORTA = PORTA *2;

54 _delay_ms(200);

55 }

56

57

58 }

59

60

61

62 }

63

64 //else// при НАЖАТОЙ кнопке выполнить действие

65

66 }

67 }

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

это явно что-то связаное с взломом пентагона, но не бегущий огонек.

бегущий огонек проще сделать с использованием порязрядного сдвига "<<" .

типа вот так, для одного порта.

if(кнопка нажата)
{
for(char i == 0; i < = 8; i++)
{
PORTB = (1< < i);
_delay_ms();
}
}
else
{
for(char i == 7; i > = 0; i--)
{
PORTB = (1< < i);
_delay_ms();
}
}

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

.equ DEL_TIME = 65535
.def temp = r16
;;;;;;;;;;;;;;;;;;
;настройка остальных портов
ldi temp,0
out PORTB,temp
ldi temp,1
out PORTA,temp
CYCLE:
 rcall DELAY
 sbis PINC,0
	  rjmp BTN_PRESSED
 in temp,PORTA
 rol temp
 out PORTA,temp
 in temp, PORTB
 rol temp
 out PORTB,temp
 rjmp CYCLE
BTN_PRESSED:
 in temp,PORTB
 ror temp
 out PORTB,temp
 in temp, PORTA
 ror temp
 out PORTA,temp
 rjmp CYCLE

DELAY:
 push XH
 push XL
 ldi XH,high(DEL_TIME)
 ldi XL,low(DEL_TIME)
DELAY_CYCLE:
 sbiw X,1
         brne DELAY_CYCLE
 pop XL
 pop XH
ret

Как-то так. Программу не тестировал, так что могут быть опечатки. Если возникают проблемы с основами, разберитесь в них (ассемблер очень помогает) вместо того, чтобы просить готовый ответ на форуме.

Вы считаете что компилятору важны пробелы и TABы? Так я почти так же как и на вашем примере сделал, кроме сильно сдвинутых строк 13,14 16,17 (3 if b 3 else).

А что вы имели в виду под "Форматирование съезжает..." ?

"Форматирование съезжает" - движок форума съедает пробелы в начале строки, из-за чего код начинает выглядеть как набор слов (если не принять специальных мер, разумеется).

Форматирование ВАЖНО, но не компилятору, ему хоть в одну строчку пиши - не заметит разницы, а человеку. В первую очередь себе, чтобы не напутать с уровням вложенности и не пропустить закрывающие скобки. Во вторую - тем, у кого просите помощи, чтобы было сразу видно, что автор хотел сказать, а что сказал. А не пробираться через болото однобуквенных переменных, выровненного по левому краю кода, рандомно расположенным скобкам и отсутствующим комментариям. Кстати, номера строк лучше не вставлять, чтобы можно было скопировать кусок кода и проверить работоспособность, или прогнать в отладчике.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Доброе утро!

Ребята, я просил помочь разобраться в своей ошибке....но это не претензия.

Всем спасибо в посильной помощи. К советам конечно прислушаюсь.

Ссылка на комментарий
Поделиться на другие сайты

unsigned char pos=0;
unsigned int temp;
while(1){
 temp = (1<<pos);
 PORTB = (unsigned char)temp;
    PORTA = (unsigned char)(temp>>8);
 if(PIND & (1<<0))pos++; else pos--;
 _delay_ms(200);
}

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

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Всем привет!

У меня фиаско.

Пробую только "Hello world" получить и получаю чистій екран в Протеусе.

ВНожки в Атмеги перемигуются на управлении екраном, но изображения нет.

Пробовал и вручную с видеоурока текст вбивать в Студию и из соопщений в топике копи/пастить.

Компилируется, ноги дрігаются, а текста НЕТ.

Все симуляции в Протеусе из его папки ЕКЗАМПЛС работают нормально.

Протеус - 8.3 ломаній, с Рутрекера.

Студия - 6.2.

Видовс - 7х64.

Прикрепил свой НЕХ, он у Вас работает?

Вот лог Протеуса:

PROSPICE 8.02.00 (Build 18620) © Labcenter Electronics 1993-2015.

Loaded netlist 'C:\Users\Andriy\AppData\Local\Temp\LISA8649.SDF' for design 'lcd_5110.pdsprj'

AVR Release 8.3SP0 build 19804 for ATMEGA8. [u1]

Loading HEX file '..\Lesson0\GccApplication1\GccApplication1\Debug\GccApplication1.hex'. [u1]

Read total of 1900 bytes from file '..\Lesson0\GccApplication1\GccApplication1\Debug\GccApplication1.hex'. [u1]

Simulation is not running in real time due to excessive CPU load.

Подскажите, куда копать, пожалуйста.

Спасибо!GccApplication1.rar

Код:

//атмега8А
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
void presets () {
Lcd_init();
Lcd_clear();
}
int main (void)
{
presets();
while (1)
{
Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hellow!"));
Lcd_prints(0, 1, FONT_1X, (unsigned char *) PSTR ("Привет!"));
Lcd_update();
}
}

shema.rarLCD_5110.zip

Изменено пользователем Владимир Андрущенко
Ссылка на комментарий
Поделиться на другие сайты

Прикрепил свой НЕХ, он у Вас работает?

Вот лог Протеуса:

...

В логе ошибок не видно. Как и прикрепленного HEX'а.

При просьбе о помощи на этом форуме стоит прикладывать схему, исходный код (с человеческим форматированием, осмысленными комментариями и без автогенерированного мусора!) и, желательно, проекты (протеуса, AVRStudio, cvavr, makefile или в чем там пишете программу и моделируете схему).

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А земля-то на дисплей подается?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А земля-то на дисплей подается?

Землю на дисплей я подал первім делом.

На видео автора курса (топика) земли НЕТ, а проект работает.

Логический потенциал "ноль" там присутствует и без "земли".

Запустил сутра проект в Протеусе. Белій екран. Воз не сдвинулся.

Вам не надоело пользоваться демо версией этого дисплея??

Заменил ДЛЛ. Ничего не поменялось. Белій дисплей.

Ссылка на комментарий
Поделиться на другие сайты

]Можно еще вот так в лоб решить, только медленно оно работать будет из-за сдвига на переменную.

Спасибо, я рассчитывал работать с конструкцией if{} и else{} для того что бы, бегущий огонек побежал обратно ИМЕННО в момент нажатия кнопки, то есть не дожидаясь окончания кода программы.

Предполагал в дальнейшем попробовать применить переменные, но после усвоения if{} и else{}. А в вашем коде я не разобрался, возможно не дорос.

И не дожидаясь помощи продолжал разбираться и вот что получилось в первый раз:

//Atmega16
//создание бегущего огонька на 16 светодиодах: порт А и порт Б
//при нажатой кнопке огонек бежит в обратную сторону
#define F_CPU 8000000 //установка работы процессора на частоте 8МГц
#include <avr/io.h>	 // подключение библиотек для работы с АВР
#include <util/delay.h> // подключение библиотек временной задержки

void preset() // первоначальные настройки
{
 DDRA = 0xFF; // порт А как выход
 PORTA = 0x00;// порт А записать в 0
 DDRB = 0xFF; // порт В как выход
 PORTB = 0x00;// порт В записать в 0
 DDRD = 0x00; // порт Д как вход
 PORTD = 0xFF;// нулевой бит порта Д с подътяжкой на +
 PORTA = 0x01;// записать в порт А лог. 1 на 0
 _delay_ms(200);// задержка 200 м.сек.
 PORTA = 0x03;// записать в порт А лог. 1 на 0 и 1 бит
 _delay_ms(200);
}


int main(void) // основное тело программы
{
 preset();// запуск первоначальных настроек
while(1) // основная функция
{
	 if (PIND&(1<<PC0)) //при НЕ нажатой кнопке выполнить действие , так как на PORTD уже есть лог 1.
	 {
		 if (((PORTA==0xC0)||(PORTA==0x00))==((PORTB==0x00)||(PORTB<=0x180))) 
		 {
				 if (PORTA==0xC0)
					 {
	 					 PORTA = 0x80;
				 		 PORTB = 0x01;
				 		 _delay_ms(200);
				 		 PORTA = 0x00;
				 		 PORTB = 0x03;
	 					 _delay_ms(200);
					 }



				 if (PORTB == 0x80)
					 {
		 			 preset();// запуск первоначальных настроек
					 }

					 else
						 {
								 PORTB=PORTB*2;
						 	 _delay_ms(200);
		 			 }
				 	 }
		 else
				 {
					 if (PORTA == 0x60)
						 {
								 PORTA =0xC0;
						 }
					 else
						 {
								 PORTA = PORTA *2;
								 _delay_ms(200);
						 }
				 }



		 }

	 else// при НАЖАТОЙ кнопке выполнить действие
		 {
				 if (PORTB<PORTA) //((PORTB==0x03)(PORTA==0x00))
					 {
						 if (PORTA == 0x01)
						 {
								 PORTA = 0x00;
								 PORTB =0x80;
								 _delay_ms(200);
								 PORTB = 0xC0;
								 _delay_ms(200);
						 }
						 else
						 {
								 PORTA = PORTA /2;
								 _delay_ms(200);
						 }
					 }

				 else
					 {
						 if (PORTB==0x03)
						 {
								 PORTB = 0x01;
								 PORTA = 0x80;
								 _delay_ms(200);
								 PORTB = 0x00;
								 PORTA = 0xC0;
								 _delay_ms(200);
						 }
						 else
						 {
								 PORTB = PORTB/2;
								 _delay_ms(200);
						 }
					 }
		 }




 }
}

Ну и как полагается новичку я пошел по "сложному" пути)))

Ну а следующий код мне кажется на порядок легче. И к счастью все работает, одним словом доволен как слон как ни как первая программа))).

Может кому понадобится для обзора, файлы прикрепил.

//Atmega16
//создание бегущего огонька на 16 светодиодах: порт А и порт Б
//при нажатой кнопке огонек бежит в обратную сторону
#define F_CPU 8000000 //установка работы процессора на частоте 8МГц
#include <avr/io.h>	 // подключение библиотек для работы с АВР
#include <util/delay.h> // подключение библиотек временной задержки

void preset() // первоначальные настройки
{
 DDRA = 0xFF; // порт А как выход
 PORTA = 0x00;// порт А записать в 0
 DDRB = 0xFF; // порт В как выход
 PORTB = 0x00;// порт В записать в 0
 DDRD = 0x00; // порт Д как вход
 PORTD = 0xFF;// нулевой бит порта Д с подътяжкой на +
 PORTA = 0x01;// записать в порт А лог. 1 на 0
 _delay_ms(200);// задержка 200 м.сек.
 PORTA = 0x03;// записать в порт А лог. 1 на 0 и 1 бит
 _delay_ms(200);
}


int main(void) // основное тело программы
{
 preset();// запуск первоначальных настроек
 while(1) // основная функция
 {
	 if (PIND&(1<<PC0)) //при НЕ нажатой кнопке выполнить действие , так как на PORTD уже есть лог 1.
	 {
		 if (PORTB<PORTA) // 
		 {
				 if (PORTA == 0xC0)
				 {
					 PORTA =0x80;
					 PORTB =0x01;
					 _delay_ms(200);
					 PORTA = 0x00;
					 PORTB = 0x03;
					 _delay_ms(200);
				 }
				 else
				 {
					 PORTA = PORTA *2;
					 _delay_ms(200);
				 }


		 }

		 else
		 {
				 if (PORTB==0xC0)
				 {
					 PORTA = 0x01;
					 PORTB = 0x80;
					 _delay_ms(200);
					 PORTA = 0x03;
					 PORTB = 0x00;
					 _delay_ms(200);
				 }
				 else
				 {
					 PORTB =PORTB*2;
					 _delay_ms(200);
				 }


		 }



	 }

	 else// при НАЖАТОЙ кнопке выполнить действие
	 {
		 if (PORTB<PORTA) //((PORTB==0x03)(PORTA==0x00))
		 {
				 if (PORTA == 0x01)
				 {
					 PORTA = 0x00;
					 PORTB =0x80;
					 _delay_ms(200);
					 PORTB = 0xC0;
					 _delay_ms(200);
				 }
				 else
				 {
					 PORTA = PORTA /2;
					 _delay_ms(200);
				 }
		 }

		 else
		 {
				 if (PORTB==0x03)
				 {
					 PORTB = 0x01;
					 PORTA = 0x80;
					 _delay_ms(200);
					 PORTB = 0x00;
					 PORTA = 0xC0;
					 _delay_ms(200);
				 }
				 else
				 {
					 PORTB = PORTB/2;
					 _delay_ms(200);
				 }
		 }
	 }




 }
}

рар.7z

Изменено пользователем endry81
Ссылка на комментарий
Поделиться на другие сайты

Сгенерируйте мне, пожалуйста, или дайте свой НЕХ для простейшего примера с 5110 с єтого топика, а то у меня белій екран.

Спасибо!

//атмега8А
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
void presets () {
Lcd_init();
Lcd_clear();
}
int main (void)
{
presets();
while (1)
{
Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hellow!"));
Lcd_prints(0, 1, FONT_1X, (unsigned char *) PSTR ("Привет!"));
Lcd_update();
}
}

endry81, убирайте, пожалуйста длинній код в спойлер, а то страница топика пропала под Вашим кодом.

Изменено пользователем Владимир Андрущенко
Ссылка на комментарий
Поделиться на другие сайты

void preset() // первоначальные настройки
Не обязательно выносить начальные установки за пределы main'а. Это имеет смысл для отдельных модулей (UART, SPI, ...), чтобы сгруппировать работу с каждым из них в отдельный блок кода или исходный файл. В остальных же случаях, на мой взгляд, это скорее мешает: приходится скакать туда-сюда по коду. Впрочем, это всего лишь частное мнение, субъективное как и выбор конкретного стиля форматирования.

Еще одно несущественное замечание по форматированию - отступы у вас великоваты. Когда вложенность блоков возрастет, придется прокручивать экран вправо-влево, что неудобно. Где-то я читал, что оптимальным считается отступ в 1 - 5 пробелов.

if (PORTB<PORTA) // если порт А не равен 0хС0 будет истина
Комментарий не соответствует коду. Стоит его исправить или хотя бы удалить.
PORTA = PORTA * 2;

PORTA = PORTA / 2;

умножения и деления крайне накладны для контроллера. Попробуйте проанализировать куски кода

PORTA = PORTA << 1;
PORTA = PORTA >> 1;

Они выполняют то же самое, что ваши, но работают не по полсотни тактов, а всего по 3.

PORTA =0x80;

PORTB =0x01;

Иногда лучше использовать двоичную запись PORTA = 0b10000000, либо, что лучше, опять-таки сдвиг PORTA = (1<<7).

_delay_ms(200); у вас используется в каждой ветке. Почему бы ее не вынести после блока if'ов?

if (PIND&(1<<PC0))
Вот же используется сдвиг! PC0 это всего лишь константа (const unsigned char PC0 = 0;, на самом деле там немного не так, но суть та же). Неужели вы используете эту "волшебную" формулу не понимая ее смысла? Впрочем я тут уже достаточно часто объяснял битовые операции на пальцах, чтобы этому не удивляться. Статью что ли написать уже чтобы не повторяться?!

Ну и пара советов по саморазвитию. Возможно, проще будет освоить язык высокого уровня (в данном случае, Си) не на контроллере, а на компьютере: и в отладчике пробежаться проще, и средства вывода лучше, и перепрошивать постоянно не надо.

К контроллерам, по крайней мере, 8-битным, лучше вообще подходить не со стороны Си, а со стороны ассемблера. Он проще: каждая команда делает ровно одно действие, да и самих команд не так уж много, хоть Atmel и хвастаются сотнями команд, на данном этапе хватит пары десятков. Опять-таки, лучше поймете внутренности контроллера, без чего моя фраза про умножения останется пустым звуком. Где-то на форуме я приводил куски кода, написанные по правилам Си, но именно на контроллерах работающие не так как надо, именно из-за особенностей архитектуры.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Есть прогресс у меня по тупому віводу информации на дисплей.

Появилось изображение, но я взял ЛСД не из проекта топикстартера (Козак), а из родной библиотеки Протеуса.

Соеденил два ЛСД в паралель и получил изображение на ЛСД из штатной библиотеки Протеуса.

Но не все слава Богу :(.

А именно. Данніе віводятся только в первую строку.

Почему?

И еще другие наблюдения.

Если я пишу код так:

//атмега8А
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
void presets () {
Lcd_init();
Lcd_clear();
}
int main (void)
{
presets();
while (1)
{
Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hello!"));
Lcd_prints(3, 9, FONT_1X, (unsigned char *) PSTR ("Привiт!"));
Lcd_update();
}
}

то получаю текст в ОДНУ верхнюю строчку. Рисунок прилагаю.

А если пишу так:

то получаю чистій екран:

//атмега8А
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
void presets () {
Lcd_init();
Lcd_clear();
Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hello!"));
Lcd_prints(3, 9, FONT_1X, (unsigned char *) PSTR ("Привiт!"));
Lcd_update();
}
int main (void)
{
presets();
while (1)
{

}
}

Разве я не должен біл получить текст в обеих случаях?

Спасибо!2.rar

Изменено пользователем Владимир Андрущенко
Ссылка на комментарий
Поделиться на другие сайты

а ну да, не внимательно посмотрел. после очистки дисплея и перед выводом вставте паузы ~20 милисикунд, и все выведется. это ко второму случаю относится

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

а ну да, не внимательно посмотрел. после очистки дисплея и перед выводом вставте паузы ~20 милисикунд, и все выведется. это ко второму случаю относится

//атмега8А
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
#include <util/delay.h>
void presets ()
{
Lcd_init();
Lcd_clear();
_delay_ms (20);
Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hello!"));
Lcd_prints(3, 9, FONT_1X, (unsigned char *) PSTR ("Привiт!"));
_delay_ms (20);
Lcd_update();
}
int main (void)
{
presets();
while (1)
{

}
}

При таком коде получаю чистій екран.

А точнее, один или два раза из 20-ти я успел увидеть мелькнувший текст.

Как будто-бі екран требует динамического обновления информации.

Єто, наверное, глюк Протеуса?

В железе, видимо, будет работать?

Ну и вівод у меня только в одну строку, напомню.

Изменено пользователем Владимир Андрущенко
Ссылка на комментарий
Поделиться на другие сайты

попробуйте протеус переустановить.

вообще странно, у меня проблем с этой либой и моделью не было.

в бесконечный цикл запишите несколько нопов, чтоб контроллер не зависал. или светодиодом моргайте.

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Спасибо огромное за помощь :thank_you2: , есть вопросы, буду признателен получив на них ответ.

Иногда лучше использовать двоичную запись PORTA = 0b10000000, либо, что лучше, опять-таки сдвиг PORTA = (1<<7).

Двоичную систему, я так предполагаю, лучше использовать для наглядности в случае со светодиодами?! А эта строчка мне не понятна...

PORTA = (1<<7)// это компилятор берет виртуальную единицу сдвигает на 7 и полученное записывает в portA, а откуда он ее берет и где хранит на период сдвига?

Да и в моем случае огонек из двух светодиодов...

_delay_ms(200); у вас используется в каждой ветке. Почему бы ее не вынести после блока if'ов?

Тоже не понятно как вынести после блока if'ов, тоесть создать переменную с данной задержкой и ее применять?

if (PIND&(1<<PC0)) Вот же используется сдвиг! PC0 это всего лишь константа (const unsigned char PC0 = 0;, на самом деле там немного не так, но суть та же)....

Я читал PC это регистр – указатель адреса, или это не то? я еще не совсем конечно разобрался с битовой маской (кажется так называется).

..... не на контроллере, а на компьютере: и в отладчике пробежаться проще, и средства вывода лучше, и перепрошивать постоянно не надо.

Так я на "протеусе" отжимаюсь, трудностей не вижу., или я что то не усмотрел?

.....лучше вообще подходить не со стороны Си, а со стороны ассемблера... Опять-таки, лучше поймете внутренности контроллера,......

Начинал изучать контроллеры на 51 камне с асемблером, вроде ))) понимаю о чем речь.

......я приводил куски кода, написанные по правилам Си, но именно на контроллерах работающие не так как надо, именно из-за особенностей архитектуры.

Это чувствуется когда читаешь книги типа "С++ для чайников" у них много что не сходится, но со своей стороны все несоответствия приходится перепроверять потому что вы правы во всем сказанном в той или иной степени.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, при симуляции кода в Proteus (урок 6) возникают следующие ошибки!

Ошибки.rar

Изменено пользователем Egormak
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...