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

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

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

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


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


как быстро освоить BASCOM-AVR?

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

1

Здравствуйте!
Я хочу освоить AVR'ы. Для начала скачал BASCOM-AVR  1.11.8.3, купил МК (какой был в магазине - ATtiny12L) и собрал тест-плату.

Моя первая программа, которая почему-то не захотела работать, выглядит так:

  $regfile = "at12def.dat"
  $crystal = 1000000
  Config Portb.0 = Output
  Config Portb.1 = Output
  Config Portb.2 = Output
  Dim Dl As Eram Byte
  Dl = 255
  Do
  Portb = 0
  Waitms Dl
  Portb = 1
  Waitms Dl
  Loop
 
Я ожидал, что светодиодик на нулевом разряде порта B замигает (255мс горит, 255мс - нет). Ничего подобного не произошло.
Когда я дизассемблировал бинарник, чтобы полюбопытствовать, чего же там накомпилилось, то увидел, что вовсю употребляются команды, отсутствующие у ATtiny12:  PUSH, POP, ST X,Rr. При этом ошибок во время компиляции не обнаружено.
Компилятор не знает, что у ATtiny12 нет регистра X ? Или я должен был как-то сообщить ему это? Зачем тогда существует файл at12def.dat?

Вот, например, кусок дизассемблированного кода:

00000000: C005                rjmp    0000000C
  00000002: 9518                reti
  00000004: 9518                reti
  00000006: 9518                reti
  00000008: 9518                reti
  0000000A: 9518                reti
  0000000C: 2466                clr     r6
  0000000E: 9AB8                sbi     $17,0
  00000010: 9AB9                sbi     $17,1
  00000012: 9ABA                sbi     $17,2
  00000014: E0E0                ldi     r30,#0
  00000016: E0F0                ldi     r31,#0
  00000018: E1A0                ldi     r26,#16
  0000001A: 27BB                clr     r27
  0000001C: EF8F                ser     r24
  0000001E: 938C                st      x,r24
  00000020: E77B                ldi     r23,#123
  00000022: D02A                rcall   00000078

по адресу 1Е стоит команда st x,r24.
Или ещё:

0000004C: 93EF                push    r30
  0000004E: 93FF                push    r31

Ну и так далее... Что делать?

Отредактировано Русик (2007-03-13 05:18:24)

0

2

Видать, никто не знает, то ли я дурак, то ли лыжи не едут.
Единственное место в "хелпе", которое, как мне показалось, даёт правдоподобный ответ, это BASCOM Language Reference / $TINY. Там в ремарках сказано, что данный компилятор пока слабо поддерживает чипы без ОЗУ и выдаёт код, не оптимизированный под "tiny" (некоторые сгенерированные инструкции могут не поддерживаться "tiny"-чипами).
Тогда интересно, начиная с какой версии всё поддерживается как надо?

0

3

Откомпилировал Ваш код, в симуляторе всё работает. Может быть проблема в контроллере? Иногда попадаются битые - что стоит тому же продавцу подменить. Надо попробовать на другом контроллере. Также посмотрите полярность включения светодиода.

0

4

1. А что за симулятор? Из BASCOM'а? Боюсь, что если компилятор не учитывает особенности серии TINY, то симулятор их также не учитывает и
выполняет все инструкции подряд, какие знает. Иначе как быть с теми инструкциями, что я дизассемблировал (POP, PUSH и пр.)?
2. А светодиод стоит плюсом к плюсу питания и минусом к выводу ИМС. Если отсоединить вывод LED'а от микрухи и коснуться им минусовой шины, то светодиод светится.
Купить ещё одну микруху могу только в субботу (раньше в магазин не попасть), поэтому быстрее напишу прогу на ассемблере, которая будет делать то же самое и станет всё ясно.

0

5

Честно сказать, никогда с тиньками не работал. AT90S2313 и ATMEGA практически все, проблем небыло. Симулировал в баскоме.

0

6

Код:
$regfile = "at12def.dat"
$crystal = 1000000
$tiny
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output

Main:
Portb = 1
Waitms 255
Portb = 2
Waitms 255
Portb = 4
Waitms 255
Goto Main

0

7

Ну и что? Чистенькая, умытая, причёсаная программка, можно вставить в книжку для начинающих в качестве иллюстрации. Она даже работает! Проверено на железе.
Но, к сожалению, она не даёт ответа на вопрос:"Почему моя программа не работает?"
Переменную Dl выкинул? Если задача была бы только написать бегущие огоньки, переменная, конечно, не нужна. А если задача другая: проверить, может ли BASCOM обращаться с "тинькиным" EEPROM'ом? Ведь в другом, более сложном приложении, мне это может понадобиться... Как тогда быть?

0

8

Не могу говорить категорично, но проверьте настройки опций проекта, у меня была другая немного залипуха, но ИМХО иногда возникает конфликт между
$regfile = "at12def.dat"
$crystal = 1000000
$tiny
и тем, что проставлено в настройках проекта.

З.Ы.

Русик написал(а):

Переменную Dl выкинул?

Скорее DO ... LOOP

Отредактировано TomaT (2007-04-09 12:15:14)

0

9

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

проверьте настройки опций проекта

SPIEN сбросил по неосторожности. Починю микруху - попробую ещё.

0

10

А byte у нас до скольки считает?????? не до 254. чесно говоря не помню. Чтоб наверняка я бы либо тип переменной изменил, либо число меньше поставил

Код:
Dim Dl As Eram Byte
  Dl = 200

0

11

1. васик умеет работать с тиньками тока на уровне асемблера, т.е. в васике нужно писать на асме.
2. про переменные, где будут хранится переменные в тиньке в которой нет озу?
3. соответсвенно Do ... Loop тоже не катит.

4. бери мегу8 и не мучай ни себя не нас... :)

0

12

Ну народ....я с вас ........
Простейшая ошибка. У него переменная как ерам - еепромная. Лечится просто, заводишь еще одну переменную, скидываешь в нее значение еепрома ....всё!
а такие варианты как waitms di, где переменная di как еепром не катят. Так уж устроен басик.

0


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