Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление ШИМ, косяк с eeprom


Управление ШИМ, косяк с eeprom

Сообщений 1 страница 12 из 12

1

Ребят, я уже замучался. Вторые сутки не могу заставить читать и писать в eeprom.
Самое удивительное: все работает отлично, если закомментить строки чтения/записи eeprom.

В таком виде двигатель раскручивает на максимум, щелкаешь кнопками, толку ноль)

Код:
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Down
Config Watchdog = 2048

'----
Config Lcd = 16 * 2



Config PinD.3 = Input
Config PinD.2 = Input

PinD.3 = 1
PinD.2 = 1

Dim Count As Byte
Dim Col(6) As Byte

Readeeprom Count , &H0      
Col(1) = 255
Col(2) = 190
Col(3) = 165
Col(4) = 120
Col(5) = 60
Col(6) = 0

'Count = 1

Pwm0B = Col(Count)

Do

If PinD.3 = 0 and Count > 1 Then
Count = Count - 1
Writeeeprom Count , &H0
Locate 2 , 1
Lcd "SPEED:       " ; Count
Waitms 500
Pwm0B = Col(Count)
End If

If PinD.2 = 0 and Count < 6 Then
Count = Count + 1
Writeeeprom Count , &H0
Locate 2 , 1
Lcd "SPEED:       " ; Count
Waitms 500
Pwm0B = Col(Count)
End If
Reset Watchdog
Loop
End

Крайне важно запоминать последнее состояние и начинать с него при запуске. Как победить?)

Отредактировано iliakozodoi (2016-07-27 15:36:51)

0

2

При первом запуске при чтении EEPROM Count  будет равен 255. Потому и не реагирует на кнопки. Либо предварительно записать значение в EEPROM или в программе добавить запись нужного значения Count в EEPROM при чтении оттуда значения 255

0

3

Попробовал так:

Код:
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Down
Config Watchdog = 2048

'----
Config Lcd = 16 * 2



Config PinD.3 = Input
Config PinD.2 = Input

PinD.3 = 1
PinD.2 = 1

Dim Count As Byte
Dim Col(6) As Byte

Readeeprom Count , &H0

If Count > 6 Then
Count = 1
Writeeeprom Count , &H0
End If

Col(1) = 255
Col(2) = 190
Col(3) = 165
Col(4) = 120
Col(5) = 60
Col(6) = 0

Pwm0B = Col(Count)

Do

If PinD.3 = 0 and Count > 1 Then
Count = Count - 1
Writeeeprom Count , &H0
Locate 2 , 1
Lcd "SPEED:       " ; Count
Waitms 500
Pwm0B = Col(Count)
End If

If PinD.2 = 0 and Count < 6 Then
Count = Count + 1
Writeeeprom Count , &H0
Locate 2 , 1
Lcd "SPEED:       " ; Count
Waitms 500
Pwm0B = Col(Count)
End If
Reset Watchdog
Loop
End

Эффекта ноль :/

Так же пробовал, как в официальном мане, после объявления переменных:

Код:
$eeprom
Counttdefault:
Data 1
$ data

А дальше в коде пользоваться

Код:
Readeeprom / Writeeeprom Count , Countdefault

И вместе с прошивкой *.hex прошивать *.eep, но тоже не помогло

P.S. уточню, фьюзы: SELFPRGEN=0 , EESAVE = 1

Отредактировано iliakozodoi (2016-07-27 16:43:29)

0

4

Довольно много клацал кнопками после прошивки и теперь переключения процента заполнения ШИМ кнопками через раз работают, но такое ощущение, что значения пишутся и читаются в случайные ячейки eeprom, т.к. значения до и после перезагрузки совпадают 50 на 50  :confused:

0

5

укажите алгоритм и версию компилятора
что-то мне подсказывает, сосед, что дело в неверной инициализации переменной и неверной обработке нажатия: у вас просто пауза 500мы, а если палец не успели отпустить, то будет постоянное изменение переменной и адреса записи зрачения...

0

6

Александр Д. написал(а):

укажите алгоритм и версию компилятора

Код:
Compiler version :2.0.7.8
Compiler build   :2.0.7.8.004
IDE version      :2.0.7.8.003
Windows OS       :Windows 10 Pro
Windows SP       :
Company          :
Owner            :ilia
Windows dir      :C:\Windows
App data dir     :C:\Users\ilia\AppData\Local\MCS Electronics\BASCOM-AVR
System dir       :C:\Windows\system32

Дело в том, что без манипуляций с eeprom все работает великолепно. И в симуляторе и на плате)
Мало того, с последней, выложенной версией прошивки даже с eeprom переключения режимов работают почти всегда.

Но вот после включения/выключения значение в половине случаев считывается не верное. Первый, второй, третий уровни обычно совпадают, а вот если выключить на четвертом, то после включения прыгаем сразу на шестой. Будто бы значение пишется в несколько ячеек по очереди и читается так же, хотя явно указана первая (точная закономерность пока не найдена)

P.S. Закономерность: Верно запоминает только 1-3 режимы, при работе на 4-6 - после ресета перманентно шестой максимальный режим. При том кнопка уменьшения не работает, а кнопка увеличения возвращает нас на первый режим. Т.е. судя по всему, переменная Count во время глюка каким-то чудесным образом становится нулем)

Отредактировано iliakozodoi (2016-07-27 18:15:52)

0

7

в обработчике нажатия заместо waitms 500 добавьте цикл:
while pinb.x = 0: waitms 100: wend
после объявления переменной обнулите её принудительно: Count =0

0

8

Почистил от мусора. Выкладываю текущий код. Проблема не ушла  :(

Код:
$swstack = 16
$framesize = 32

Config Timer0 = Pwm , Prescale = 1 , Compare B Pwm = Clear Down

Config PinD.3 = Input
Config PinD.2 = Input

PinD.3 = 1
PinD.2 = 1

Dim Count As Byte
Count =0
Dim Col(6) As Byte

Readeeprom Count , &H0

If Count > 6 Then
Count = 1
Writeeeprom Count , &H0
End If

Col(1) = 255
Col(2) = 190
Col(3) = 165
Col(4) = 120
Col(5) = 60
Col(6) = 0
Pwm0B = Col(Count)

Do
If PinD.3 = 0 and Count > 1 Then
while pinD.3 = 0: waitms 100: wend
Count = Count - 1
Writeeeprom Count , &H0
Pwm0B = Col(Count)
End If

If PinD.2 = 0 and Count < 6 Then
while pinD.2 = 0: waitms 100: wend
Count = Count + 1
Writeeeprom Count , &H0
Pwm0B = Col(Count)
End If

Loop
End

Попробовал на всякий сменить 2 разных микрухи. Поведение идентичное. (Правда партия одна у них)

Работу продолжу завтра. Буду  отписываться здесь по решению проблемы.

Отредактировано iliakozodoi (2016-07-27 20:20:42)

0

9

iliakozodoi
Может не писать в нулевую ячейку?Случалось после дергатни по питанию нулевая ячейка затиралась волшебным образом.Раз уж вы адрес указываете вручную,то можно попробовать писать,например,во вторую. При старте можно (до основного цикла цикла)проверять что там записано в ячейке с данными.Бывало,что в пустой еепром при чтении из заданной ячейки было что-то неясное,типа -002(минус002). Может попробовать запись в еепром вывести в отдельную подпрограмму и обращаться к ней из конструкции If-End If?Примерно так:

Код:
If PinD.3 = 0 and Count > 1 Then
   Waitms 150
   Count = Count - 1
   Locate 2 , 1
   Lcd "SPEED:       " ; Count
   Waitms 10
   Gosub Wrteeprom
   Pwm0B = Col(Count)
End If

Wrteeprom:
   Writeeeprom Count , &H0
   Waitms 20
Return

0

10

да, кстати, про нулевую ячейку верно говорят
но то было лет 12 назад... Вроде эту проблему решили (но я в своих программах помня это пишу не ниже 10го адреса ))

0

11

Не мешало бы делать ещё "защиту от дурака", перед тем как писать в ЕЕПРОМ, проверяйте наличие изменений, т.е. новое значение должно быть отличное от имеющегося (чтобы лишний раз не изнашивать).

0

12

Чтобы людям попусту мозг не сношать, я завтра  испробую все предложенные варианты, а еще на всякий случай осцилографом всю плату пройдусь на уровень помех. Нагрузка не слабая ~ 10А все таки.
О результатах к вечеру отпишусь )

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление ШИМ, косяк с eeprom