Доброго времени суток, уважаемые радиокоты! о/
Подниму эту тему, потому как другой темы по этой обучалке поиск не показал :-/
с некоторых пор балуюсь микроконтроллерами фирмы атмел, начал с ардуино, потом писал немного на Сях всякие простенькие РГБ-мигалки... кое-что повторял...
вобщем как фтыкать программатор и откомпилировать хекс, да какие фьюзы лучше выставить я разобрался...
захотелось более конкретно разобраться в работе микроконтроллера, дорожки гугла привели меня в вышеназванную обучалку, которая мне очень понравилась по стилю изложения, однако же остались некоторые вопросы, так сказать, начального уровня.
первоначально возник вопрос по стеку из
этой статьи:
Дело в том, что в контроллере 2313 разрядность адреса ОЗУ не превышает 8 бит. Значит, и указатель стека должен быть 8-битным. Для его хранения, соответственно, используется один 8-битный регистр. У некоторых других контроллеров объем ОЗУ больше, и для его адресации используют два 8-битных регистра. Соответственно, младшие разряды указателя стека в таком случае будут храниться в регистре SPL, а старшие - в SPH (Stack Pointer High). В целях унификации кода для всех контроллеров, в 2313 у SPL оставили на конце букву L, хотя никакого SPH в данном контроллере нет и быть не может.
я использую контроллер Atmega8A, но в его даташите указано примерно тоже самое, если я правильно понимаю ангельские иероглифы:
The AVR Stack Pointer is implemented as two 8-bit registers in the I/O space. The number of
bits actually used is implementation dependent. Note that the data space in some implementa-tions of the AVR architecture is so small that only SPL is needed. In this case, the SPH Register will not be present.
не совсем понятно как может адрес в ОЗУ размещаться в 8-ми битах? ведь 8 бит это от 0 до 255, но у нас же памяти не 255 байт?
или всетаки это актуально только для 2313 у которого 127 байт рама? а в атмеге8а при 1 килобайте уже используется SPH?
опять же, вопрос по регистрам из
этой статьи:
Итак, как вы помните, в нашем контроллере 16 РОН (регистров общего назначения): R16…R31. С любым из них мы можем сделать все что угодно. Просто полная анархия! Однако, я бы не рекомендовал злоупотреблять количеством используемых регистров. Это очень усложняет процесс написания программы. Я обычно использую 4 или 5 регистров - только самое необходимое в данный момент. Остальное - в оперативке (ОЗУ).
хотя в даташите(как на 2313, так и на атмега8) четко указано:
32 x 8 General Purpose Working Registers
так что же случилось с первыми 16-ю регистрами?
Следующий вопрос по
прерываниям и переходами по ним:
Interrupt Vectors - это ни что иное, как указатели на адрес ПЗУ, на который мы переходим в результате прерывания. Все векторы расположены в самом начале адресного пространства, и занимают первые 11 адресов ПЗУ (с $000 по $00A). Это прекрасно видно из таблицы. То есть, если мы, скажем, хотим активизировать прерывание Timer1_comp1, то мы должны по адресу $004 поставить ссылку на подпрограмму - обработчик этого прерывания. А вообще, лучше расставить в начале программы ссылки на все прерывания. Так как эти команды стоят в самом начале программы, значит они как раз таки будут расположены в ПЗУ по первым 11-ти адресам. Таким образом, при каждом прерывании, будет вызываться соответствующий обработчик.
но ведь в начале программы у нас в этих адресах были другие команды... почему они не выполнялись постоянно по прерыванию?
Прошу прощения, если мои вопросы совсем уж глупые для котосообщества, но я хочу разьяснить для себя эти моменты для полного понимания...
Зарание, спасибо за ответы.
и огромный респект автору за написание столь интересных статей.