Ви не увійшли.
Ось тут росписана теорія по вашим питанням. https://power-electronics.info/full-bridge.html#1
Не зрозумів цілі даного проекту. Автоматично вимкнути комп'ютер? Це можна зробити руками якщо людина за компом, достатньо вольтремра. Як на мене треба додати зарядний пристрій та функцію автоматичного вмиканя компа при появі світла.
Спробуйте підпаяти на вихід кемічний конденсатор 0.1 мкф та електроліт на 470-1000 мкф, можна також индуктивність додати.
Я вже писав раніше. Для того щоб знати з чого починати треба хоч щось знати. У мене немає ніяких знань і я не можу вчитись послідовно бо не знаю що за чим потрібно вчити. Щодо матеріалів в неті - справді багато. Але все розрізнені дані без будьякої послідовності. Це може вам здаватись диким чому я не знайшов через те що ви в темі. А для того кому це новинка - дуже важко зорзуміти порядок навчання.
Можливо вам треба спочатку навчитися правильно формувати запитання? Відкриваємо гугл вбиваємо фразу "уроки ардуино для начинающих", пропускаємо рекламу и перші ж посилання йдуть на уроки з послідовним вивченням платформи ардуіно. Там є абсолютно все для самостійного вивчення.
Приклад - нещодавно намагався розбрати як зробити щоб ргб діод при кожному натисканні кнопки змінював колір на інший. Витративши 2 години часу я нічого не знайшов. Проте, мав би вчителя, то отримав би відповідь за 10 хвилин або менше.
Тому не погоджусь з вами - вчитель це ефективніше ніж колупати самому те в чому зовсім не розбираєшся.Для того щоб отримати відповідь при самостійному пошуку - в перш чергу потрібно знати як вірно задати питання. А я того не знаю.
Ви намагаєтесь перестибнути через декілька тем, без їх вивчення нічого не вийде. Якщо вам потрібно зробити якусь одну конкретну річ - тоді, так, можна в когось спитати, якщо ви хочете розібратися в ардуіно - тоді тільки послідовно все вивчати не перестибуючи вперед. Всі навчальні посібники в гарній якості є у вільному доступі в інеті.
Я так розумію ви не хочете послідовно все вивчати, ви хочете щоб вам розтолкували якесь одне питання, що вас бентежить в даний час, ви знайдете людину і вона вам все розтлумачить, але крок вліво або вправо і ви знов опинитесь біля розбитого корита, так як теорії у вас не буде, буде тільки практика по окремому питанню. Житя буде вас постійно повертати на самий початок - на сві ті теми, що не вивчили.
Вирішувати вам: або вчити все довго, нудно, послідовно і бути гарним спеціалістом, або нахапатися якихось прикладів і нічого толком не знати.
Ні, не ефективніше: якщо розберетися самостійно - ви повністю вивчете тему питання, якщо спитаєте - отримаєте відповідь на своє питання, а слідом буде наступне питання і так далі поки повністью не зактиєте тему.
Проект получил продолжение?
Я пока не развиваю. Нет надобности.
Что-то типа DS1307 посоветуйте, но с будильником и выводом прерывания, чтоб ардуинку будить по расписанию.
Уважаемый alex_dol! Ответьте на "нубовский" вопрос пожалуйста! Не смог осилить вашу фразу "установка подстроечного резистора на коэффициент деления 1:4." То есть, к примеру если сопротивление между + и землей 40 то между землей и А0 10, а между А0 и + 30 или наоборот, или как? Если можно ответьте на электронную почту. Собрал Вашу схему, ползунок резистора установил на авось.
Да. так.
IVSEL в MCUCR устанавливается в начале майна.
Boot Lock bit BLB02 и остальные блокировки не стоят.
avr-objcopy -j .text -j .data ... , компилировал что с опциями -j, что без них - виснет одинаково.
Светодиод прерывание не зажигает, то есть типа заходит в прерывание, но куда оно заходит х.з.
Виснет собственно намертво, так что даже вачдог не спасает, причем, ручной ресет кнопкой помогает.
Не забыл, таблица векторов прерываний перенесена в область бута, исходник:
...
uint8_t m = MCUCR;
MCUCR = m | (1 << IVCE); //Enable change of Interrupt Vectors
MCUCR = m | (1 << IVSEL); //Move interrupts to Boot Flash section
...
ISR(USART_RX_vect) {
RxBuff[RxCount++] = UDR0;
}
Дисасемблер:
ATmegaBOOT_168_atmega328_pro_8MHz.elf: file format elf32-avr
Disassembly of section .text:
00007000 <__vectors>:
7000: 0c 94 34 38 jmp 0x7068 ; 0x7068 <__ctors_end>
7004: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7008: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
700c: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7010: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7014: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7018: 0c 94 48 38 jmp 0x7090 ; 0x7090 <__vector_6>
701c: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7020: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7024: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7028: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
702c: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7030: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7034: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7038: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
703c: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7040: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7044: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7048: 0c 94 52 38 jmp 0x70a4 ; 0x70a4 <__vector_18>
704c: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7050: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7054: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7058: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
705c: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7060: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
7064: 0c 94 46 38 jmp 0x708c ; 0x708c <__bad_interrupt>
00007068 <__ctors_end>:
7068: 11 24 eor r1, r1
706a: 1f be out 0x3f, r1 ; 63
706c: cf ef ldi r28, 0xFF ; 255
706e: d8 e0 ldi r29, 0x08 ; 8
7070: de bf out 0x3e, r29 ; 62
7072: cd bf out 0x3d, r28 ; 61
00007074 <__do_clear_bss>:
7074: 23 e0 ldi r18, 0x03 ; 3
7076: a0 e0 ldi r26, 0x00 ; 0
7078: b1 e0 ldi r27, 0x01 ; 1
707a: 01 c0 rjmp .+2 ; 0x707e <.do_clear_bss_start>
0000707c <.do_clear_bss_loop>:
707c: 1d 92 st X+, r1
0000707e <.do_clear_bss_start>:
707e: a8 31 cpi r26, 0x18 ; 24
7080: b2 07 cpc r27, r18
7082: e1 f7 brne .-8 ; 0x707c <.do_clear_bss_loop>
7084: 0e 94 80 39 call 0x7300 ; 0x7300 <main>
7088: 0c 94 19 3c jmp 0x7832 ; 0x7832 <_exit>
0000708c <__bad_interrupt>:
708c: 0c 94 00 38 jmp 0x7000 ; 0x7000 <__vectors>
00007090 <__vector_6>:
//прерывание по срабатыванию вачдога----------------------------------
ISR(WDT_vect) {
7090: 1f 92 push r1
7092: 0f 92 push r0
7094: 0f b6 in r0, 0x3f ; 63
7096: 0f 92 push r0
7098: 11 24 eor r1, r1
//здесь делать пока ничего не надо
}
709a: 0f 90 pop r0
709c: 0f be out 0x3f, r0 ; 63
709e: 0f 90 pop r0
70a0: 1f 90 pop r1
70a2: 18 95 reti
000070a4 <__vector_18>:
//Прерывание по приему байта последовательным портом------------------
ISR(USART_RX_vect) {
70a4: 1f 92 push r1
70a6: 0f 92 push r0
70a8: 0f b6 in r0, 0x3f ; 63
70aa: 0f 92 push r0
70ac: 11 24 eor r1, r1
70ae: 2f 93 push r18
70b0: 3f 93 push r19
70b2: 8f 93 push r24
70b4: 9f 93 push r25
70b6: ef 93 push r30
70b8: ff 93 push r31
//RxBuff[RxCount++] = UDR0;
70ba: 80 91 64 01 lds r24, 0x0164 ; 0x800164 <RxCount>
70be: 90 91 65 01 lds r25, 0x0165 ; 0x800165 <RxCount+0x1>
70c2: 9c 01 movw r18, r24
70c4: 2f 5f subi r18, 0xFF ; 255
70c6: 3f 4f sbci r19, 0xFF ; 255
70c8: 30 93 65 01 sts 0x0165, r19 ; 0x800165 <RxCount+0x1>
70cc: 20 93 64 01 sts 0x0164, r18 ; 0x800164 <RxCount>
70d0: 20 91 c6 00 lds r18, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
70d4: fc 01 movw r30, r24
70d6: ea 59 subi r30, 0x9A ; 154
70d8: fe 4f sbci r31, 0xFE ; 254
70da: 20 83 st Z, r18
}
70dc: ff 91 pop r31
70de: ef 91 pop r30
70e0: 9f 91 pop r25
70e2: 8f 91 pop r24
70e4: 3f 91 pop r19
70e6: 2f 91 pop r18
70e8: 0f 90 pop r0
70ea: 0f be out 0x3f, r0 ; 63
70ec: 0f 90 pop r0
70ee: 1f 90 pop r1
70f0: 18 95 reti
Есть программа, она компилируется и все работает со всеми прерываниями. Далее, мне необходимо ее использовать как загрузчик.
В атмеге238 загрузчик использует последние 4, 2 или 0,5 кБ флеши, выставляется фьюзами. Я использую 4 кБ. Следовательно устанавливаю оба фьюза размера бута и так же фьюз бутресета. Этот же адрес я даю компилятору: -Wl,--section-start=.text=0x7000. Все остальные опции компилятора я не меняю.
Еще переношу таблицу прерываний в область загрузчика:
uint8_t m = MCUCR;
MCUCR = m | (1 << IVCE); //Enable change of Interrupt Vectors
MCUCR = m | (1 << IVSEL); //Move interrupts to Boot Flash section
Батник для компиляции:
avr-g++ -g -Wall -Os -mmcu=atmega328p -DF_CPU=8000000L -DMAX_TIME_COUNT=F_CPU>>4 -DNUM_LED_FLASHES=1 -DBAUD_RATE=57600 -DDOUBLE_SPEED -c -o ATmegaBOOT_168.o ATmegaBOOT_168.c
avr-g++ -g -Wall -Os -mmcu=atmega328p -DF_CPU=8000000L -DMAX_TIME_COUNT=F_CPU>>4 -DNUM_LED_FLASHES=1 -DBAUD_RATE=57600 -DDOUBLE_SPEED -Wl,--section-start=.text=0x7000 -o ATmegaBOOT_168_atmega328_pro_8MHz.elf ATmegaBOOT_168.o
avr-objcopy -j .text -j .data -O ihex ATmegaBOOT_168_atmega328_pro_8MHz.elf ATmegaBOOT_168_atmega328_pro_8MHz.hex
Компилируется, работает до возникновения прерывания (прихода байта по компорту), если отключаю линию RxD все работает.
Что я делаю не правильно?
Загрузчик использует специальную область памяти программ, а не стандартную. Это требует специфического плана компоновки.
Специальная область памяти - это последние n кБ флеши. Специфический план компоновки - это что?
Посмотрите в бинарнике по каким адресам расположен код самого загрузчика, может один из них находится в не области памяти из которой разрешена запись на flash, то это и будут проблемы линковки.
Все начинается c 7000h и занимает чуть больше 2 кБ.
Скорее всего вы напутали в инстукциях линкера. Для программы и загрузчика планы размещения сегментов разные.
Можно чуть подробнее или ссылку?
Дисасемблировал 2 варианта компиляции: через ИДЕ (работает) и через avr-g++ (виснет на прерывании). Все одинаково за исключением строки:
ИДЕ:
2a4: e8 51 subi r30, 0x18 ; 24
avr-g++:
70d6: ea 59 subi r30, 0x9A ; 154
Код прерывания скомпилированный через ИДЕ:
00000272 <__vector_18>:
272: 1f 92 push r1
274: 0f 92 push r0
276: 0f b6 in r0, 0x3f ; 63
278: 0f 92 push r0
27a: 11 24 eor r1, r1
27c: 2f 93 push r18
27e: 3f 93 push r19
280: 8f 93 push r24
282: 9f 93 push r25
284: ef 93 push r30
286: ff 93 push r31
288: 80 91 14 03 lds r24, 0x0314 ; 0x800314 <RxCount>
28c: 90 91 15 03 lds r25, 0x0315 ; 0x800315 <RxCount+0x1>
290: 9c 01 movw r18, r24
292: 2f 5f subi r18, 0xFF ; 255
294: 3f 4f sbci r19, 0xFF ; 255
296: 30 93 15 03 sts 0x0315, r19 ; 0x800315 <RxCount+0x1>
29a: 20 93 14 03 sts 0x0314, r18 ; 0x800314 <RxCount>
29e: 20 91 c6 00 lds r18, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
2a2: fc 01 movw r30, r24
2a4: e8 51 subi r30, 0x18 ; 24
2a6: fe 4f sbci r31, 0xFE ; 254
2a8: 20 83 st Z, r18
2aa: ff 91 pop r31
2ac: ef 91 pop r30
2ae: 9f 91 pop r25
2b0: 8f 91 pop r24
2b2: 3f 91 pop r19
2b4: 2f 91 pop r18
2b6: 0f 90 pop r0
2b8: 0f be out 0x3f, r0 ; 63
2ba: 0f 90 pop r0
2bc: 1f 90 pop r1
2be: 18 95 reti
А это через avr-g++:
000070a4 <__vector_18>:
70a4: 1f 92 push r1
70a6: 0f 92 push r0
70a8: 0f b6 in r0, 0x3f ; 63
70aa: 0f 92 push r0
70ac: 11 24 eor r1, r1
70ae: 2f 93 push r18
70b0: 3f 93 push r19
70b2: 8f 93 push r24
70b4: 9f 93 push r25
70b6: ef 93 push r30
70b8: ff 93 push r31
70ba: 80 91 64 01 lds r24, 0x0164 ; 0x800164 <RxCount>
70be: 90 91 65 01 lds r25, 0x0165 ; 0x800165 <RxCount+0x1>
70c2: 9c 01 movw r18, r24
70c4: 2f 5f subi r18, 0xFF ; 255
70c6: 3f 4f sbci r19, 0xFF ; 255
70c8: 30 93 65 01 sts 0x0165, r19 ; 0x800165 <RxCount+0x1>
70cc: 20 93 64 01 sts 0x0164, r18 ; 0x800164 <RxCount>
70d0: 20 91 c6 00 lds r18, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
70d4: fc 01 movw r30, r24
70d6: ea 59 subi r30, 0x9A ; 154
70d8: fe 4f sbci r31, 0xFE ; 254
70da: 20 83 st Z, r18
70dc: ff 91 pop r31
70de: ef 91 pop r30
70e0: 9f 91 pop r25
70e2: 8f 91 pop r24
70e4: 3f 91 pop r19
70e6: 2f 91 pop r18
70e8: 0f 90 pop r0
70ea: 0f be out 0x3f, r0 ; 63
70ec: 0f 90 pop r0
70ee: 1f 90 pop r1
70f0: 18 95 reti
Разъясните мне бестолковому разницу.
Makefile родной. Правда в оригинальном загрузчике не используются прерывания, может там че дописать надо. Придется опять рыть инет.
Просто не было времени разбираться, надо было срочно скомпилировать и проверить, как говорится одной кнопкой. В общем этот этап уже пройден.
Сейчас возникла другая проблема: если компилирую свой бут через ИДЕ как обычную программу - все работает, собственного я его так и тестировал, а вот при компиляции через make + avr-gcc или avr-g++ программа зависает сразу же после приема первого байта.
Скорее всего неправильно компилируется прерывание. Не могу понять почему.
ISR(USART_RX_vect) {
RxBuff[RxCount++] = UDR0;
}
Пробовал так, результат тот же - зависает.
extern "C" void __vector_18 /* USART Rx Complete */ (void) __attribute__ ((signal,used, externally_visible)) ; void __vector_18 /* USART Rx Complete */ (void) {
RxBuff[RxCount++] = (*(volatile uint8_t *)(0xC6));
}
З.Ы. Размер бинарника при компиляции через ИДЕ меньше чем через avr-gcc.
Ничего крутого нет. Переписать его не сложно. А вот дальше начались приколы:
Утилита make в комплект ардуиновской ИДЕ не входит, ладно скачал, установил.
Запустил, на команду all - говорит что делать нечего. Ну, думаю, версия старая, порылся в инете - ничего новее нет. Значит будем компилировать выборочно, заработало.
Тут оказывается, что я переписал загрузчик на с++ и avr-gcc его не понимает, плюнул и переделал на с. Скомпилировалось.
В результате куча потерянного времени.
В общем переписал я загрузчик под свои нужды, теперь надо его скомпилировать. Кто знает как подскажите, дабы не рыть много инета.
А что здесь сложного?
if (millis() < save_millis) ...
А как сбросить таймер millis? Нужно что бы он считал не с начала включения ардуино, а с начала включения лампы.
А зачем сбрасывать millis? Можно запомнить его текущее значение, дальше думайте сами.
Начальной инициализации переменных нет.
Залейте другой скетч и убедитесь в работоспособности дисплея.
AT+DDET DTMF detection control
Команда достаточно подробно расписана во многих даташитах.
Диапазон измеряемых температур, точность, период опроса датчиков?
Что-то подобное я для себя и написал, только я оперирую не "ОК", а циферными кодами и с отключенным эхом (ATE0V0+CMEE=0), удобнее.
Это все я могу, просто не хотелось повторять команду в случае если ответ не подходит под ожидаемый шаблон. Это надо ее в цикл пихать и т.д. Просто это загрузчик - объем ограничен, там есть еще что делать, кроме общения с модемом.
NoName, я с модулем работаю так: отослал команду, очистил входной буфер, в ответ должно прийти, например, 5 символов, ждем прихода 5 символов, пришли - обрабатываем. Причем в момент очистки входного буфера я могу обрезать часть незапрашиваемого уведомления, которое в этот момент приходит, и тогда бывает что вместо ожидаемого приходит х.з. что.
Ладно, это лирика, я уже начал парсер писать.