Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.206.160.129] |
|
Сообщ.
#1
,
|
|
|
Код написан в AVR Studio 4.
Тело ветки if (bit_is_set(PIND,PD3)) и if (bit_is_set(PIND,PD2)) не выполняется или работает не корректно. На PD2 или PD3 подаю +5В. Должно на выходах PORTB постепенно на нагах появляться +5В или 0В. Чего не происходит. Не пойму в чем дело. В режиме эмуляции и отладки все нормально. А на деле после заливки не работает. #include <avr/io.h> #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> short int m[7] = {0x01, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F}; short int t = 0, ct = 30000, h = 4286; // 7 int main(void) { DDRB = 0xFF; PORTB = 0x00; DDRD = 0x00; PORTD = 0x00; while(1) { if (bit_is_set(PIND,PD1)) { PORTB = 0xFF; t = ct; } if (bit_is_set(PIND,PD0)) PORTB = t = 0x00; if (bit_is_set(PIND,PD2)) { // OPEN t = t + 1000; t = (t > ct) ? ct : t; if (t == ct) PORTB |= 0xFF; else PORTB = PORTB | m[t/h]; } if (bit_is_set(PIND,PD3)) { // CLOSE t = t - 1000; t = (t > 0) ? t : 0; if (!t) PORTB &= 0x00; else PORTB = PORTB & m[t/h]; } _delay_ms(1000); } } |
Сообщ.
#2
,
|
|
|
попробуй в фигурные скобки взять оператор второго if
{PORTB = t = 0x00;} |
Сообщ.
#3
,
|
|
|
short int на 8битном контролллере какую разрядность имеет? я бы с такими числами не ставил short, всё таки размер слова равен байту вроде
Цитата Onishare @ Должно на выходах PORTB постепенно на нагах появляться +5В или 0В. Чего не происходит. 30 секунд ждешь? Цитата Onishare @ PORTB = PORTB & m[t/h]; если хотел сбросить указанные биты, то нужно PORTB = PORTB & ~m[t/h]; Если я правильно понял такой код работает? while(1) { if (bit_is_set(PIND,PD1)) { PORTB = 0xFF; t = ct; } if (bit_is_set(PIND,PD0)) PORTB = t = 0x00; if (bit_is_set(PIND,PD2)) { // OPEN PORTB = 0xFF; } if (bit_is_set(PIND,PD3)) { // CLOSE PORTB = 0x00; } _delay_ms(1000); } |
Сообщ.
#4
,
|
|
|
Алгоритм: при нажатие кнопки (на вход PD0 подаем +5В) через каждые 4286мс загораются последующие светодиоды на выходе от PB0, PB1... до PB8
при нажатие кнопки (на вход PD1 подаем +5В) через каждые 4286мс тухнут последующие светодиоды на выходе от PB8, PB7... до PB0 Но первые тухнет и последний загорается при начале и конце отсчета. Интервал загорания всех светодиодов 30 сек. В эмуляции AVR Studio все нормально. На деле не работает (не загорается даже один светодиод). #include <avr/io.h> #include <util/delay.h> #define F_CPU 8000000UL int m[7] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F}; int t = 0, ct = 30000, h = 4286; int main(void) { PORTD = 0x00; DDRD = 0x00; PORTB = 0x00; DDRB = 0xFF; while(1) { if (PIND &(1 << PD0)) { // OPEN t = t + 300; if (t >= ct) { t = ct; PORTB = 0xFF; } else PORTB = PORTB | m[t/h]; } else if (PIND &(1 << PD1)) { // CLOSE t = t - 300; if (t < 0) t = 0; if (!t) PORTB = 0x00; else PORTB = PORTB & m[t/h]; } _delay_ms(300); } } |
Сообщ.
#5
,
|
|
|
С таким кодом 3 светодиода загораются/тухнут по кнопке?
#include <avr/io.h> #include <util/delay.h> #define F_CPU 8000000UL int m[7] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F}; int t = 0, ct = 30000, h = 4286; int main(void) { PORTD = 0x00; DDRD = 0x00; PORTB = 0x00; DDRB = 0xFF; t = 9000; while(1) { if (PIND &(1 << PD0)) { // OPEN PORTB = PORTB | m[t/h]; } else if (PIND &(1 << PD1)) { // CLOSE PORTB = PORTB & m[t/h]; } _delay_ms(300); } } |
Сообщ.
#6
,
|
|
|
Onishare, фьюзы прописаны в контроллер верные?
|