Свежие обсуждения
Микроконтроллеры

Фазометр на AVR программа на Си

Хочу ещё раз поднять тему фазометра на МК. Я толко недавно начал заниматься микроконтроллерами . Начал с сайта 123 avr, набросал програмку ( не полностью) . Посмотрите, если есть косяки, подскажите где и почему. --- такие тонкие вещи можно узнать только от опытных людей. CAVR почему то ругается - почему не пойму.

200311.c

 

Касаемо вот этого участка кода:

while ( h ) {
if (PORTB&0x01 ) {
TCCR1B = 0b10000101 } ; // запускаем таймер если пошёл положительный полупериод 1/1024

if ( PORTB&0x01 ) {
TCCR1B = 0b10000000} ; // останавливаем таймер если начался // следующий положительный полупериод
h = 0
} ; // Выходим из цикла

1. Для чего здесь нужен цикл, если он выполняется заведомо ровно один раз (посмотрите внимательно код - сами поймете).
2. Второй if нейтрализует первый if.

Насчет ошибок - выложите листинг, потому что не все работают с CVAVR.

И еще совет - сайт, который вы упомянули, больше не поминать. Могут быть неприятности.

 

Доброго времени суток ! Да, нащёт " h" Вы правы , это я не досмотрел. Мне нужно чтобы в пределах основного цикла этот цикл выполнялся 1 раз и дальше выполнялся код записаный ниже. Наверное в конце программы надо "h" опять присвоить -1. Немного непонятно почему одно " if " нейтрализует другое " if " , по этому поводу никакой информации не нашол. Извините за дурацкий вопрос --как должен выглядеть листинг , какое у него расширение, а то CAVR много файлов наделало , там и hex. и c. и asm. и др.
Наащёт сайта эээ...... это я не знал , боле не буду.

 

Насчет расширения я тоже не знаю, в разных системах по-разному. Как правило, что-то навроде *.lst, *.lss. Один if нейтрализует другой if, потому что в обоих if-ах одно и то же условие, а промежуток времени между их последовательной работой - от силы 2..3 микросекунды. Получается, что они всегда (или уж практически всегда) отрабатывают парой. В одном if вы включаете таймер, в другом - тут же выключаете. Результат получается нулевой

 

Понятно. Переделал. Можно ли в цикле while использовать if . А внутри цикла if ещё одно if ? Будет ли программа реально стоять в таком цикле - while ( PINB.0<<1 ) { } ; // Отрицательный ? Ждать и ничего не делать ( чтоб не выскочить из цикла при отрицательном полупериоде) ?????? Нужно ли в самом прерывании указывать причину его возникновения

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{ ;
if ( PINB.1 >>0 ) { - ВОТ ЭТО
azz = ICR1 ; // Перемещаем содержимое регистра захвата в переменную "azz"
ICR1 = 0 ; // Очищаем регистр захвата
TIMSK= 0b00000000 ; // Запрещаем прерывания
}
} ;

Или не надо?

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{ ;
azz = ICR1 ; // Перемещаем содержимое регистра захвата в переменную "azz"
ICR1 = 0 ; // Очищаем регистр захвата
TIMSK= 0b00000000 ; // Запрещаем прерывания
} ;

Написал так :

200537.c

 

Вот файл листинга

200538.lst

 

Теперь по другому !!!

200545.c