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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Все забыл...


Все забыл...

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

1

да и не знал ничего...
Так давно не занимался микроконтроллерами, что да же те крохи знаний, что были - и те улетучились.

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

Кнопка на прерывании, вот кусок кода:

Код:
Dim Pwr_on As Byte                                          'Флаг включения
Butt_pwr Alias Pina.0
Pwr_relay Alias Pinb.7

Enable Pcint0
Enable Interrupts
On Pcint0 Power_butt


'====================Основной цикл======================================
Do


Loop
'====================================================================

'==================Обработка кнопки питания=================================
Power_butt:
If Pwr_on = 0 Then Pwr_relay = 1
Else Pwr_relay = 0
Toggle Pwr_on
Return
'=====================================================================


Выдает ошибку 46 : Assigment error, unknown variable (DIM)
Потыкайте носом, пожалуйста.

0

2

rustr написал(а):

Потыкайте носом, пожалуйста.

Bascom 2.0.7.1  без ошибок

$map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"       'Документация Atmel - http://www.atmel.com/images/Atmel-8271- … mplete.pdf
  $crystal = 8000000
  $framesize = 128       ' Размер области используемой и необходимой для преобразований
  $hwstack = 128       ' Размер аппаратного стека
  $swstack = 128       ' Размер программного стека

Dim Pwr_on As Byte                                          'Флаг включения
Butt_pwr Alias Pina.0
Pwr_relay Alias Pinb.7

Enable Pcint0
Enable Interrupts
On Pcint0 Power_butt

'====================Основной цикл======================================
Do

Loop
'====================================================================

'==================Обработка кнопки питания=================================

  Power_butt:

    If Pwr_on = 0 Then
        Pwr_relay = 1
      Else
        Pwr_relay = 0
    End If

    Toggle Pwr_on

  Return
'=====================================================================

+1

3

Toggle Pwr_relay не проще ли сделать?

0

4

sasha_1973, спасибо огромное  :cool: , я, видно, ночью уже ничего не соображал  :confused: , ибо просто все
PS: только в Proteuse прерывание Pcint0 не обрабатывается, почему-то...
-NMi- мне для дальнейшей работы нужен флаг состояния Pwr_on

Отредактировано rustr (2017-08-05 10:46:55)

0

5

rustr написал(а):

только в симуляторе прерывание Pcint0 не обрабатывается, почему-то...

Посмотрите здесь

0

6

sasha_1973 Разобрался - в симуляторе самого Bascom все работает, а Proteus, по видимому, не умеет работать с прерываниями типа PCINTx.
Железа у меня пока нет под этот проект, приходиться в Протеусе код проверять.
Может, еще на несколько вопросов ответите - можно ли в графическом дисплее, на T6963c, в разных строках одновременно выводить текст разными шрифтами?
Пытаюсь делать так:

Код:
Do
Setfont Font_16x24
Locate 2 , 8 : Lcd Volume_ ; "dB"
 If Volume_ => 18 Then
       Volume_ = 18
       End If
 If Volume_ <= -67 Then
       Volume_ = -67
       End If

Loop
$include "Font_16x24.font" 

ругается Error 31: Invalid data type [[0011] fonttable]]

Отредактировано rustr (2017-08-05 14:16:04)

0

7

Флаги используют для этого

0

8

vanno44 написал(а):

Флаги используют для этого

Для чего? Речь о последнем вопросе?

0

9

rustr написал(а):

в симуляторе самого Bascom все работает, а Proteus, по видимому, не умеет работать с прерываниями типа PCINTx.


Вы по ссылке ходили, как раз в Протеусе всё и работает.

rustr написал(а):

можно ли в графическом дисплее, на T6963c, в разных строках одновременно выводить текст разными шрифтами?


Если именно в графическом и если Bascom его поддерживает, то можно. Иначе писать самому.

0

10

Все же разобрался - путём записи в регистр

Код:
Pcmsk0 = &B00000011 

Но, вот не понимаю я - разве эта запись, и вот эта:

Код:
Enable Pcint0
Enable Pcint1

не одинаковы для обработчика Bascom_а?

Отредактировано rustr (2017-08-05 21:52:44)

0

11

rustr написал(а):

не одинаковы для обработчика Bascom_а?

Читайте здесь

+1

12

sasha_1973, спасибо за науку  :cool:

0

13

Что-то у меня непонятное.
Вот код, все тот же:

Код:
$regfile = "m324pdef.dat"
$crystal = 12000000
$hwstack = 80
$swstack = 32
$framesize = 64

'$sim

$lib "glcdKS108.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 6 , Ce2 = 7 , Cd = 3 , Rd = 4 , Reset = 2 , Enable = 5

Dim Stat_pwr As Byte              'Флаг включения
Dim Stat_vol As Byte                                        
Dim State_lcd As Byte                                       
Dim State_input As Byte                                    
Dim State_mute As Byte                                    
Dim Volume_level As Integer                              
Dim Input_ As Byte                                          
Dim Volume_lcd As String * 5


Config Int0 = Falling
Enable Int0
Config Int1 = Falling
Enable Int1
Enable Pcint0
Enable Pcint1

Pcmsk0 = &B00000011

Config Pinb.0 = Output : Reset Pinb.0
Config Pinb.1 = Output : Reset Pinb.1
Config Pinb.3 = Output : Reset Pinb.3
Config Pinb.4 = Output : Reset Pinb.4
Config Pinb.5 = Output : Reset Pinb.5
Config Pinb.6 = Output : Reset Pinb.6
Config Pinb.7 = Output : Reset Pinb.7

Config Pind.2 = Input : Set Pind.2
Config Pind.3 = Input : Set Pind.3
Config Pind.4 = Input : Set Pind.4
Config Pind.5 = Input : Set Pind.5
Config Pind.6 = Input : Set Pind.6
Config Pind.7 = Input : Set Pind.7
Config Pina.0 = Input : Set Pina.0
Config Pina.1 = Input : Set Pina.1

Encoder1 Alias Pind.2
Encoder1_a Alias Pind.4
Encoder1_b Alias Pind.5
Encoder2 Alias Pind.3
Encoder2_a Alias Pind.6
Encoder2_b Alias Pind.7
Pwr_butt Alias Pina.0
Mute_butt Alias Pina.1
Relay_pwr Alias Pinb.7

On Int0 Volume_int
On Int1 Input_int
On Pcint0 Pwr_int
On Pcint1 Mute_int

'================================
Stat_pwr = 0
Stat_vol = 0
State_input = 0
Input_ = 1
State_mute = 0
State_lcd = 1
'================================
Volume_level = 1
Relay_pwr = 0
'====================Основной цикл======================================
Do

Setfont Font_25x32
Lcdat 1 , 1 , Volume_lcd
 If Volume_level => 18 Then
       Volume_level = 18
       End If
 If Volume_level <= -67 Then
       Volume_level = -67
       End If

If Stat_pwr <> 0 Then Goto Power_on_off

Loop
'=======================================================================

'==================Обработка кнопки питания=============================
Stat_pwr 
Return
'====================Управление питанием================================
Power_on_off:
Cls
If Relay_pwr = 0 Then
     Relay_pwr = 1
      Waitms 500
         Setfont Font_12x16
            Lcdat 1 , 2 , "Hello"
   Else
         Setfont Font_12x16
            Lcdat 1 , 2 , "Bay"
              Wait 1
                 Relay_pwr = 0
'              Config Powermode = Idle
End If
Return
'=======================================================================

$include "Font_25x32.font"
$include "Font_12x16.font"


Так вот, переменная "Stat_pwr " - это флаг прерывания кнопки Вкл.
По задумке - по умолчанию она установлена в 0, в прерывании устанавливается в 1 и в главном цикле, по  "ЕСЛИ" программа должна перепрыгнуть в "Power_on_off:"
Итак вот, в районе переменной "Volume_level ", им обеим присваивается 1. После чего в Протеус вылетает с ошибкой "Invalid opcode 0xFFFF at PC=0xB09C", а симуляция в Баскоме останавливается.
Прошу еще раз тыкнуть в ошибку. Ибо я не понимаю, где напортачил.

Отредактировано rustr (2017-08-07 22:03:09)

0

14

Не нашёл в вашем коде общее включение прерываний Enable Interrupts
Так же не понятно для чего вот этот кусок:

Код:
'==================Обработка кнопки питания=============================
Stat_pwr 
Return

Отредактировано Sergik07 (2017-08-08 09:32:54)

0

15

При копировании кусок не вставил. Правильно так будет:

Код:
Config Int0 = Falling
Enable Int0
Config Int1 = Falling
Enable Int1
Enable Pcint0
Enable Pcint1

Pcmsk0 = &B00000011
Enable interrupts


Тут также кусочек пропустил:

Код:
'==================Обработка кнопки питания=============================
Pwr_int:
Stat_pwr  = 1
Return

Вчера уже к вечеру  устал, пропустил. Просто второй день с этой проблемой бьюсь, уже весь код передергал. Причём, это проявилось неожиданно - вот только все работало, и раз , и протеус вылетать стал. А между этими событиями я ничего не добавлял.
PS: хотя нет, вспомнил. Вся эта чехарда началась после того, как я в прерывании только флаг оставил, о обработку вынес в отдельную подпрограмму и в главной последовательности поставил "If". Пока все в прерывании находилось - все работало. Потом как отрезало, причём возврат обратно не помог.

Отредактировано rustr (2017-08-08 10:20:43)

0

16

Ох и намучился я с этой загадкой!
После необъяснимых глюков в коде начал глючить сам компилятор - постоянно вылетал с ошибками. Его переустановка не то что не помогала, он просто не устанавливался правильно.
Помогла только переустановка винды!
Проверил винт, смарт говорит, что винту практически хана.
http://s6.uploads.ru/t/wPsoz.jpg

0

17

Блок питания нормальный? Такая же картина может наблюдаться при нестабильном питании диска.

0

18

БП Залман, 700 Вт, 2 года ему.

0

19

Блок питания нормальный? Такая же картина может наблюдаться при нестабильном питании диска.

Такая же беда. БП менял, не помогло. Дело в sata шлейфе. Но нормальный найти не могу.

0

20

У меня шлейфы с материнской Asus шли. Не думаю, что они плохого качества.
Но попробую поменять и на другой порт переставить. Если дело было в шлейфе, ошибки уберутся или винту уже все равно?

Отредактировано rustr (2017-08-11 09:19:36)

0

21

2 винта поменял уже - убиваются сектора, затем биос перестает видеть винт. Подключил через переходник USB-HDD 2.5", ноут видит. Можно вылечить софтом.
Для себя сделал вывод, что винты убивает data шлейф, тк в гнезде фиксируется кое-как, после перетыкания работает какое то время.

0

22

Софт - имеется в виду утилита низкоуровнего форматирования от производителя?

0

23

Это который перемагничивает сектора. На ночь оставляешь, оно трудится ) Например Victoria

0

24

Не знал, попробую, спасибо.
Думаю, возьму SSD, поставлю на него систему, а этот винт пропущу через эту прогу. Хуже, наверное, для него не будет уже.

0

25

MACTEPok написал(а):

Дело в sata шлейфе.

Посмотрите сколько ошибок чтения и позиционирования. Это не шлейф, а механика диска. Или диск имеет неисправность механической части, или некачественное питание (возможно не из-за блока питания, а из-за плохого контакта на каком-то разъеме).

0

26

проблема при пуске, битый сектор всего один и  в самом начале. С переходником работает на ура. А в одном и том же системнике это 3й убитый винт (перестает определяться).

0

27

Victoria мне очень помогла.Диск "вылечил" полностью,но для пущего эффекта загружать Victoria надо с диска и работать с ней в досе.Например

0

28

да. но у меня дело пока застопорилось на моменте НЕподдерживания материнкой загрузки с USB флешки.

0

29

Что она поддерживает? CD/DVD или может дискеты?

С таким количеством аппаратных ошибок, программно бесполезно что-то делать. Это все равно что вывести из строя МК и программно пытаться его восстановить.

0

30

Эксперименты пока прекратил по причине нахождения системника в деревне. Загрузиться, думаю, не сложно, если пошаманить.
В моем случае тестил викторией через переходник на ноуте два винта: "убитый" и новый пустой. У обоих красный (bad) сектор в самом начале области памяти. Может это у всех так. И "убитый" ничем особо не отличается от нового по результатам тестов, разве только чуть больше медленных секторов. БП родной схорел, хлопнув кондерами (возможно из за пыли). Затем поменял на древний 250W, предварительно припаяв разъем на 4-pin от сгоревшего БП (да, настолько древний БП). Системник работал. Затем, после глюков (через несколько месяцев), купил новый БП, думал, что винт не запускается из за слабого БП и просадки напряжения в сети. Не помогло.
Через переходник винт работает норм. Системник его даже не видит в биосе. Шлейфы в магазинах продаются одинаковые. Может и разъемы на материнке износил частым перетыканием.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Все забыл...