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

Замерить сигналл Hi-Tech PICC Lite

1 3 4

Это по книге михаила предко наверно.

 

Ааа. Я её не читал. ИМХО, та строка только память почём зря занимает, если оптимизатор её не выкинул.

 

OPTION = OPTION = 0b11010000; /* использовать предделитель

По ошибке два раза OPTION скопировал,но компилируется без ошибок(и так и так работает нормально)

 

Это "ин-лайн Си" в IAR-е зовется.

 

Почему то ШИМ подергивается-подскажите пожалуйста,где ошибка?
Думаю проблема в строке исходника выделенной красным цветом?
кто знает,подскажите что в исходнике криво?

217296.rar

 

Посмотрел код по диагонали, ошибка у вас в том, что переменная А у вас имеет размер 8 бит (char), а переменная RTC - 16 бит (integer), ну и когда вы делаете присвоение А=RTC, вы теряете старший байт. И вычисление Dlitel=(A*13-80), если А>13, тоже неправильное, поскольку выходит за пределы байта.

Ну и по мелочам. В приведённом ниже фрагменте первая и возможно пятая строки не нужны вообще, 4-я тотчас переписывает 3-ю, зачем тогда нужна 3-я?


if(T0IF) //сбросить флаг
{
TMR0=0; //сброс TMR0
TMR0=ZAPIS_TMR0; //Запись (256тиков-236тиков=20тиков)
T0IF=0; //сбросить флаг прерывания ТМR0

 

Neman2000: Думаю проблема в строке исходника выделенной красным цветом?

if(RB5>0)//Если на 11ноге не ноль(есть сигнал!)

По логике пройдёт, а для однозначности понимания можно просто записать:
if(RB5) или же if(RB5==1) /* если на выв. 11 присутствует лог. "1" (т.е. любой уровень, отличный от лог. "0" <=> есть сигнал!) */

Neman2000: Почему то ШИМ подергивается-подскажите пожалуйста,где ошибка?
В железе или в симуляторе? Можно скрин выложить, интересно как именно подёргивается?

***

// Вход управляющего сигнала-6я нога 
Или 11-я?

if(RTC>500)//Если более 1000 переполнений TMR0
А в этой строке, почему-то в комментарии цифра со сравниваемым значением в коде расходится?

if (Ciklov < = Dlitel)/* Если значение счетчика
циклов меньше заданной ширины импульса*/
И здесь тоже в комментарии расхождение. А надо " < " или "< ="?

 


Digital: По логике пройдёт, а для однозначности понимания можно просто записать:
if(RB5) или же if(RB5==1) // если на выв. 11 присутствует лог. "1" (т.е. любой уровень, отличный от лог. "0" <=> есть сигнал!).

Да в принципе можно и приравнять к единице,но я про то что в даташите указано что если определено прерывание на один из пинов RB4......7 то нельзя не считывать не записывать в порт-B????,при записи или считывании в порт B негарантируется правильность работы проца?

Digital: if(RTC>500)//Если более 1000 переполнений TMR0
А в этой строке, почему-то в комментарии цифра со сравниваемым значением расходится?

Здесь просто "стоп" через 500.....1000 переполнений ,если пропадет сигнал с передатчика(например чтоб модель нестала подводной лодкой когда случайно нырнет в волну)

Digital: if (Ciklov < = Dlitel)/* Если значение счетчика
циклов меньше заданной ширины импульса*/
И здесь тоже в комментарии расхождение. А надо " < " или "< ="?

Этот кусок полностью у М.Предко содрал.

Всеже непойму почему так дергается.
креплю два исходника для сравнения,тот что на тиньке постабильней,но ШИМ высокий и перекатка нестандартная и только хекс.

217434.rar

 

Neman2000: Да в принципе можно и приравнять к единице
Точнее проверить на равенство лог. единице. Приравнять звучит всё равно что присвоить, т.е. записать в регистр порта значение, но не сравнить с ним, ничего не меняя при этом.

 

Neman2000: перекатка нестандартная
Что такое перекатка в управлении, в двух словах (не понял этого толком из проекта)?

Neman2000: Всеже непойму почему так дергается.

Вот же вам советовали: GM: когда вы делаете присвоение А=RTC, вы теряете старший байт.

А в прикреплённом исходнике так и осталось:

unsigned char A ;

Ну сами посмотрите в протеусе, значения RTC выходят за тип char (см. скрин). И если A=RTC; ,то от типа int останется один char. Если по логике программы это не требуется, так может в этом и проблема?

В протеусе, если шагать по программе с самого начала, на строке Dlitel=(A*13-80); мы имеем А равное нулю. Математически, после выполнения этой строки, переменная Dlitel будет иметь значение "-80". Но такое значение соответствует типу signed. Т.е. переменную А получается вообще надо назначать типом signed int.