Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Микроконтроллеры для начинающих
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2, 3, 4, 5
Kuzmi4
На ресиве не спроста 1 висит а потом в 0 проваливается - это как раз стартовый бит - сигнал того, что началася транзакция.
Кстати, а что это за клаиватура что через UART работает ? Клавы ж на PS/2 интерфейсе...
_Ie0nid
короче штука такая. РС/2 - клавиатура имеет всего 4 провода, питание, земля, строб, и данные. Я конечно мог сделать через вход прерывания ИНТ0, посаженную на строб клавиатуры, и коротенькую функцию которая во время прерывания считывает один из входов атмела.
НО у меня тогда приемник вообще мертвый получается. Ведь вроде все также, один стартовый, один стоповый, бит четности, 8 бит данных, все проверил, скорость устанавливать не стал, строб на ХСК, данные к УСАРТУ на прием. Но почему-то не принимает, кто подскажет, в чем дело?

Вот коротенький листинг программы.

INTERRUPT(SIG_UART0_RECV)
{
PORTA = UDR;
_delay_loop_2(10000000000);
}


int main (void) //начало программы
{
DDRA = 0xFF; // A выход

UCSRB = 0x90; // регистр состояния UARt. RXEN=1б D.1-вых, d.0-вход, в соотвествующие состояние, передача 8 бит данных
UCSRC = 0x46;//синхронный режим, спадающий фронт сигнала. формат посылок восьмибитный, что соответствуют клавиатуре.
UCSRA = 0x00;//режим работы USART
sei(); // разрешаем общие прерывания

while (1);

}
Kuzmi4
Да.. извращение есчё то....
По теме:
во первых
Код
_delay_loop_2(10000000000);

в прерывании не есть гут.

Во вторых - вы думаете там от хорошей жизни линия клока существует ?

И вообсче - попробуйте осцилом посмотреть на сигналы..
А после измерте на какой частоте идёт передача.. UART то настраивается на определённый Baudrate - а не на фронт.. Ниспадающим фронтом только ловится сатртовый бит..
_Ie0nid
ДОбрый день, я смотрел осцилогрофом, и вроде все так и должнно быть. Попробую рисунок вставить.
рисунок загрузить не получилось. 07.gif
Но я смотрел осцилом. Там, предположим, идет 11 импульсов строба, и штук 5 данных разной длительности. Я нажимал разные клавиши, при этом скан код данных, относительно фронта строба, действительно меняется. Так что, вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ.
Но вот, что по стробу он считывает лишь стартовый бит, это новость. Насколько она достоверна? ГДе можно почитать, прошу, подскажите.
И еще, если он читает лишь стартовый бит по стробу, как же все остальные, они синхрятся от внутреннегго ЗГ, или как?
Заранее благодарю.
Kuzmi4
2 _Ie0nid - делаете *.GIF и грузите сколько душе угодно wink.gif
Касательно
Цитата
по стробу он считывает лишь стартовый бит

Я такого не говорил -> я говорил что ниспадающий фронт на RX в UART`е и нужен для детектирования так сказать начала транзакции.

Касательно того как устроен UART - попытайтесь его на каком нить HDL`е реализовать - реальная реализация не сильно будет отличаться wink.gif ..
Цитата
..вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ.

Так а в чём вопрос то ??
_Ie0nid
Ладно, попробую реализовать приемник на другом примере.
Но теперь у меня другой вопрос? lol.gif
РЕшил запаять кварц в 16 мегу на 11 мегагериков, выставил все биты конфигурации, опять же, как по книжке. 1011 СКSEL (еще пробовал 1111), и SUT 11. МК дурит по страшному, работает не так как надо, но всегда одинаково, причем если биты менять, его дурь также меняется. У меня такое уже было, и мне пришлось ставить кварц на 400 кГц. Заранее благодарю.
На всякий случай, записываю я МК с генератором на 1 МГц.
_Ie0nid
Хотя все, разобрался, проблема в PONY PROG, оказалась.
garbuz
прошивайте проги из CVAVR (он 2 Мб всего) и в нем же их разрабатывайте - проблем будет МАЛО совсем.
jeka7
Написал программу для настройки портов AVR.Нажмите для просмотра прикрепленного файла
shuks
Все преподаватели с которыми я общался мне не советовали писать в CodeVisionAVR с его всевозможными "мастерами", т.к. за тебя всю настройку и инициализацию периферии делает программа, а если будет какая-либо ошибка в настройках, то её трудно будет обнаружить, потому как ты сам по сути нифига не знаешь (за тебя всю настройку производил мастер CVAVR).
p.s. - сам пишу на ассемблере в AVRStudio и пока проблем не испытывал, главное внимательно даташит читать.
jeka7
Программа для расчета времени таймеров на AVR. Для asm.Нажмите для просмотра прикрепленного файла
drozd
Цитата(shuks @ Nov 15 2008, 09:56) *
Все преподаватели с которыми я общался мне не советовали писать в CodeVisionAVR с его всевозможными "мастерами", т.к. за тебя всю настройку и инициализацию периферии делает программа, а если будет какая-либо ошибка в настройках, то её трудно будет обнаружить, потому как ты сам по сути нифига не знаешь (за тебя всю настройку производил мастер CVAVR).
p.s. - сам пишу на ассемблере в AVRStudio и пока проблем не испытывал, главное внимательно даташит читать.

CodeVision - хорошая тема. Богатый инструментарий. Может, я подотстал, но когда-то в нем обнаружилась неприятность. Компилятор при входе в прерывание не сохраняет статусный регистр. Если делать это самому программно, то CodeVision - хорошая тема. Без шуток.
VladimirYU
Цитата(drozd @ Jan 7 2009, 07:56) *
CodeVision - хорошая тема. Богатый инструментарий. Может, я подотстал, но когда-то в нем обнаружилась неприятность. Компилятор при входе в прерывание не сохраняет статусный регистр. Если делать это самому программно, то CodeVision - хорошая тема. Без шуток.

Инструментарий, может быть и богатый, но...
1. язык "похожий на С"
2. не ++
3. не предсказуем в дальнейшем (см п.1)

На этапе ознакомления, м. б. и имеет смысл с CV поработать, но не подсесть на него, ИМХО.
jeka7
Программа для настройки АЦП AVR для Atiny15 Atmega8,16,32,64 для asm.Нажмите для просмотра прикрепленного файла
Иван_Я
Если рассматривать вопрос какой МК универсальнее, то я думаю, что все таки ПИКи!!! Хотя они и проигрывают в скорости ( команда за два такта генератора), зато периферия по богаче будет и, что не маловажно, практически все доступны в корпусах DIP. Например ПИК24 имеет до нескольких компараторов: два, три, а то и четыре. Аналогичная ситуация с таймерами. А что у АТМЕЛ? У Атмел в основном по 1 компаратору во всех семействах исключение составляет МЕГА ( и то не все) где и то их 2 не более.

Ближайшим аналогом к ПИК24 видится ХМЕГА, но ХМЕГА не выпускается в корпусах DIP в отличии от ПИК24....вроде большинство применяют АТМЕЛ, но мне лично кажется,что даже если и ПИК24 не такой быстродействующий, зато аппаратные функции имеются - тот же аппаратный делитель! Если на АВР это делать программно, то в принципе их возможности уравняются.....

Конечно все определяется задачей...

И потом, АТМЕЛ не производит чипов подобных dsPIC!!! Это тоже имеет значение, если приложение разрабатываемое имеет хоть какие-то мало мальские вычисления. Например тот же контроль переполнения, в АВР это надо делать программно!
SasaVitebsk
Цитата(Иван_Я @ Apr 25 2009, 17:21) *
Если рассматривать вопрос какой МК универсальнее, то я думаю, что все таки ПИКи!!! Хотя они и проигрывают в скорости ( команда за два такта генератора), зато периферия по богаче будет и, что не маловажно, практически все доступны в корпусах DIP.

Практически, с точностью "до наоборот".
1. Atmel в своём семействе AVR пошли по пути универсальности. То есть малая номенклатура кристаллов с богатой переферией. Microchip - богатая номенклатура кристаллов с разной переферией.
2. Не следил за последними кристаллами PIC, но у первых 16 было 4 такта на команду. По-моему сейчас применяется умножитель тактовой, что обеспечивает производительность по тактам сопоставимую с ядром AVR. Грубо говоря это кристаллы одного уровня. И находятся в одной нише.
3. Некоторый проигрыш в скорости на определённых задачах (как правило математике) возникает из-за значительно более слабой системы комманд. При этом есть задачи, на которых проявляется выигрыш Пиков.
4. Вообще говорить об универсальности МК практически бессмысленно. Они все достаточно универсальны. Сопоставимое изделие можно реализовать как та том, так и на этом. В то же время они неуниверсальны по своему назначению. Это не центральный процессор. Каждый обладает своей переферией и корпусом.
5. Корпус DIP скоро уйдёт в прошлое как таковой. Даже для радиолюбительства. Даже в поделках в единичном изделии лазерно-утюжным методом легко ложатся микрухи типа ATMEGA8. Хотя есть и дипы, но я применяю PLCC. Кроме того, совершенно непонятно чего вам не хватает у AVR по корпусам? В дипе есть кристаллы DIP8 (ATTiny25), DIP14 (ATTiny24), DIP20 (ATTiny2313), DIP28 (ATMega8), DIP40 (ATMega16). Я по одному кристаллу приводил для примера, на самом деле их море. Так какого дип кристалла вам не хватает???

Цитата
Например ПИК24 имеет до нескольких компараторов: два, три, а то и четыре. Аналогичная ситуация с таймерами. А что у АТМЕЛ? У Атмел в основном по 1 компаратору во всех семействах исключение составляет МЕГА ( и то не все) где и то их 2 не более.

За всю мою практику я единожды применил компаратор. Было это правда на семействе x51 ещё до AVR. smile.gif
С моей точки зрения абсолютно бесполезная переферия. Во-первых всё равно в пределах AVCC работает, что ограничивает а во вторых 2 ноги занимает. На AVR можете юзать ADC от 8 входов и порог регулировать цифровым способом и предварительную обработку делать.

Цитата
Ближайшим аналогом к ПИК24 видится ХМЕГА, но ХМЕГА не выпускается в корпусах DIP в отличии от ПИК24....вроде большинство применяют АТМЕЛ, но мне лично кажется,что даже если и ПИК24 не такой быстродействующий, зато аппаратные функции имеются - тот же аппаратный делитель! Если на АВР это делать программно, то в принципе их возможности уравняются.....

Конечно все определяется задачей...

Ну к примеру у ATMega640 при очень удобном корпусе TQFP100 = 86 свободных портов, 16 каналов АЦП, 4 16-битных таймера, 2 8-ми битных, 16 каналов PWM, 2 SPI, I2C, 4 USART.
Мега8 - малый корпус (PDIP28, tqfp32) 23 порта, 6/8 АЦП, 1 16таймер, 2 8таймер, 3PWM, 1SPI, 1UART. Цена меньше 1$
xMega16a4(слабенький) 34 порта, 5 16таймер, 16PWM, 2SPI, 2I2C, 5UART, 12 12-ти битных АЦП, 2 12-ти битных ЦАП, 4DMA + куча разной хрени типа частота тактирования таймеров превышает тактовую что даёт высокоскоростной PWM и прочее.

Назовите сопоставимые кристаллы у микрочип.

Цитата
И потом, АТМЕЛ не производит чипов подобных dsPIC!!! Это тоже имеет значение, если приложение разрабатываемое имеет хоть какие-то мало мальские вычисления. Например тот же контроль переполнения, в АВР это надо делать программно!

Atmel производит и производила кучу кристалов, подобных которым microchip никогда не производила. Например кристаллы семейств ARM7, ARM9, ARM920T. Плюс кучу спец микрух типа радиоканала и т.п., но какое это имеет отношение к обсуждаемым вопросам? dsPIC с пиками роднит только имя. Кристалл хороший. Но совершенно из другой оперы. В этой нише у него целая куча конкурентов среди других фирм кроме Atmel.

А подытоживая - применяйте то, что вам удобно и то что вам нравится. И не надо это обосновывать, а то впросак попадёте. smile.gif
_Pasha
Цитата(Иван_Я @ Apr 25 2009, 17:21) *
Конечно все определяется задачей...

Маркетинговые изЫски шутят над нами злую шутку, потому что все продумано так, что на 100% ни один камень на задачу не идет. Везде будут компромиссы, иногда весьма некрасивые. Либо избыточное решение (лично мне тоже не нравится, хоть это и несовременная точка зрения). Это я к тому, что сравнивать PIC vs AVR итд уж поднадоело до зеленого п.ца.
SasaVitebsk
bb-offtopic.gif
Цитата(_Pasha @ Apr 30 2009, 01:59) *
Маркетинговые изЫски шутят над нами злую шутку, потому что все продумано так, что на 100% ни один камень на задачу не идет.

biggrin.gif
Кстати я бы отнёс эту формулировку не только к кристаллам, а .... ко всему спектру товаров продаваемому на прилавках. Раньше был один хлеб - "хлеб обычный". smile.gif Теперь 15 модификаций, в каждом 15 наполнителей, ни одного с нормальным вкусом. smile.gif "Хлеб с зелёным чаем".... это зачем?
swagger
Добрый день!
Начал осваивать С и начал с CCS. проработал книгу шпака , вроде получается. Теперь стоит задача сделать модбас устройство. Надо опрашивать по мобдас слейв по 485 и принимать ответ с него. Подскажите выложены ли живые примеры похожие. Кристалл PIC16F876A уарт апарартный. Или может есть примеры приема передачи нескольких байт для начала.

В примерах нашел драйвера для 485 и модбаса. Вопрос: компилятор вырезает ли неиспользуемые фукнкции из откомплированнго файла?
x736C
Цитата(jeka7 @ Dec 10 2008, 13:30) *
Программа для расчета времени таймеров на AVR. Для asm.

Похвально, конечно, да не особо нужно. Компиляторы с этим прекрасно справляются.
Код
.equ    Time  = 100;ms
.equ    FClk  = 10000000;Hz
.equ    Pre   = 1024
.equ    Timer = 0xFFFF - (Time * (FClk / Pre) / 1000)
    outiw TCNT1,Timer
jeka7
Нажмите для просмотра прикрепленного файла Текстовый блокнот для написания программ для AVR на ассемблере с подсветкой синтаксиса и завершение автодополнения.
injener
Доброго всем! Прошу помощи. Поставлена задача написания программы для СИФУ управляемого выпрямителя (3 фазы, мостовая схема, стабилизация тока, синхронизация). Выбор элементной базы не критичен. Опыт программирования только АВР, но совсем на начальном уровне. Где можно прочесть по поводу построения СИФУ? Может кто-то поделится алгоритмом? Заранее спасибо
Caruso
Всем привет. Начал осваивать МК ATmega16.
Написал первую программу в AVR studio.
После подачи питания на МК запускается счетчик Т1 После того случается совпадение В, генерируется прерывание. Оно запускает АЦП. Когда АЦП закончило преобразование, оно тоже генерирует прерывание. Далее сохраняем результат и пытаемся его выдать по SPI. После того как последний байт передан все повторяется сначала. Но где - то что - то не работает. Вот сам код программы


CODE
.INCLUDE "m16def.inc"

;*********Определяем макрос*********
.MACRO OUTI
LDI R25,@1
OUT @0,R25
.ENDMACRO

;*********Определяем константы*********
.equ SettingsADC_1 = 0x8A
.equ SettingsADC_2 = 0x60
.equ SettingsADC_3 = 0xB0
.equ SetPortCOut = 0xFF
.equ SetFirstStatePortC = 0xFF
.equ SetPortBOut = 0xFF
.equ SetFirstStatePortB = 0x00
.equ SettingsTimT1_1 = 0x00
.equ SettingsTimT1_2 = 0x0D
.equ SettingsTimT1_3 = 0x0C
.equ SettingsSPI_1 = 0x10
.equ SettingsSPI_2 = 0x00

.equ SetTimeWaitT1_H = 0xFF; Сравнение в Т1 по этому значению
.equ SetTimeWaitT1_L = 0xFF; Сравнение в Т1 по этому значению

;*********Назначим новые имена для регистров*********
.def acc_1 = r16;Назначаем аккумулятор 1
.def acc_2 = r17;Назначаем аккумулятор 2

;*********Начальный адрес*********
.CSEG
.org $0000;Начальный адрес
jmp RESET;Перепрыгиваем таблицу векторов

;*********Описание векторов прерываний*********
.ORG INT0addr ; External Interrupt Request 0
RETI
.ORG INT1addr ; External Interrupt Request 1
RETI
.ORG OC2addr ; Timer/Counter2 Compare Match
RETI
.ORG OVF2addr ; Timer/Counter2 Overflow
RETI
.ORG ICP1addr ; Timer/Counter1 Capture Event
RETI
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RETI
.ORG OC1Baddr ; Timer/Counter1 Compare Match B
rjmp START_ADC
.ORG OVF1addr ; Timer/Counter1 Overflow
RETI
.ORG OVF0addr ; Timer/Counter0 Overflow
RETI
.ORG SPIaddr ; Serial Transfer Complete
RETI
.ORG URXCaddr ; USART, Rx Complete
RETI
.ORG UDREaddr ; USART Data Register Empty
RETI
.ORG UTXCaddr ; USART, Tx Complete
RETI
.ORG ADCCaddr ; ADC Conversion Complete
rjmp OUTDATA
.ORG ERDYaddr ; EEPROM Ready
RETI
.ORG ACIaddr ; Analog Comparator
RETI
.ORG TWIaddr ; 2-wire Serial Interface
RETI
.ORG INT2addr ; External Interrupt Request 2
RETI
.ORG OC0addr ; Timer/Counter0 Compare Match
RETI
.ORG SPMRaddr ; Store Program Memory Ready
RETI


;*********Начало основной программы*********
.ORG INT_VECTORS_SIZE; отсюда пошла сама программа
RESET:
OUTI SPL,low(RAMEND) ; Это мы загружаем в двубайтный регистр указателя
OUTI SPH,High(RAMEND); стека SPH:SPL адрес конца оперативной памяти

;*********Инициализация АЦП*********
OUTI ADCSRA,SettingsADC_1
OUTI ADMUX,SettingsADC_2
OUTI SFIOR,SettingsADC_3

;*********Инициализация портов*********
OUTI DDRC,SetPortCOut ;Конфигурируем порт C как выход
OUTI PORTC,SetFirstStatePortC;Начальное состояние порта 0
OUTI DDRB,SetPortBOut ;Конфигурируем порт B
OUTI PORTB,SetFirstStatePortB;Начальное состояние порта 0



;*********Инициализация таймера/счетчика Т1*********
OUTI TCCR1A,SettingsTimT1_1
OUTI TCCR1B,SettingsTimT1_2
OUTI TIMSK,SettingsTimT1_3

OUTI OCR1AH,SetTimeWaitT1_H; С этим надо разобраться, без этих строк счетчик несчитает
OUTI OCR1AL,SetTimeWaitT1_L

OUTI OCR1BH,SetTimeWaitT1_H
OUTI OCR1BL,SetTimeWaitT1_L

;*********Инициализация SPI*********
;OUTI SPCR,SettingsSPI_1;



MAIN:
sei ; Общее разрешение прерываний
nop
rjmp MAIN

START_ADC:
sei ; Общее разрешение прерываний
sbi ADCSRA,ADSC
WAIT:
nop
rjmp WAIT

OUTDATA:
in acc_1,ADCH
in acc_2,ADCL
sbi SPCR,SPE
sbi SPCR,MSTR
out SPDR, acc_1
WAIT_TR_DATA_1:
SBIS SPSR,SPIF
rjmp WAIT_TR_DATA_1
out SPDR, acc_2
WAIT_TR_DATA_2:
SBIS SPSR,SPIF
rjmp WAIT_TR_DATA_2
rjmp MAIN

Если не трудно покритикуйте
Палыч
Цитата(Caruso @ Dec 16 2009, 17:45) *
Но где - то что - то не работает. Вот сам код программы

Может быть - оно и будет работать... Но, недолго! Так, как это делаете Вы, работать с прерываниями - нельзя. Обработчик прерывания должен заканчиваться командой reti, иначе стек быстро переполниться: по каждому прерыванию в него заносится адрес возврата из прерывания!
Цитата
OUTI OCR1AH,SetTimeWaitT1_H; С этим надо разобраться, без этих строк счетчик несчитает
OUTI OCR1AL,SetTimeWaitT1_L

Выбран режим счетчика 4. В этом режиме счетчик считает до значения OCR1A, сбрасывается в ноль и взводится флаг переполнения. Поэтому занести в регистр OCR1A что-то обязательно нужно. Воспользоваться лучше прерыванием по переполнению, а не по сравнению.
Ещё совет. Посмотрите как в примерах записывают в регистры значения при инициализации устройств МК и придерживайтесь такого же стиля: вместо Вашего
Код
OUTI TCCR1B,SettingsTimT1_2

гораздо удобнее запись
Код
OUTI TCCR1B, (1<<WGM12)|(1<<CS12)|(1<<CS10)

во всяком случае - удобнее для тех, кто захочет Вам помочь и посмотреть Вашу программу: не надо прыгать по программе вверх-вниз и заглядывать в документацию на МК.
Caruso
Палыч, спасибо за ответ!!! Сам пишу программу первый раз, много не знаю. Вот второй вариант той же программы. Вроде как работает. Но мне не понятно, как формировать сигнал SS (SPI), или сигнал SS должен сам формироваться т. е. аппаратно. И как в этом режиме (SPI) передать сразу несколько байт, т. е. передать за одну посылку, или аппаратно контроллер такого сделать не может?
CODE


.INCLUDE "m16def.inc"

;*********Определяем макрос*********
.MACRO OUTI
LDI R25,@1
OUT @0,R25
.ENDMACRO

.MACRO SETBIT
IN R25,@0
SBR R25,(1<<@1)
OUT @0,R25
.ENDMACRO


;*********Определяем константы*********
.equ TimeWait_H = 0x00
.equ TimeWait_L = 0x00
.equ SettingsSPI_1 = 0x10
.equ SettingsSPI_2 = 0x00

;*********Назначим новые имена для регистров*********
.def acc_1 = r16 ;Назначаем аккумулятор 1
.def acc_2 = r17 ;Назначаем аккумулятор 2

;*********Начальный адрес*********
.CSEG
.org $0000 ;Начальный адрес
JMP RESET ;Перепрыгиваем таблицу векторов

;*********Описание векторов прерываний*********
.ORG INT0addr ; External Interrupt Request 0
RETI
.ORG INT1addr ; External Interrupt Request 1
RETI
.ORG OC2addr ; Timer/Counter2 Compare Match
RETI
.ORG OVF2addr ; Timer/Counter2 Overflow
RETI
.ORG ICP1addr ; Timer/Counter1 Capture Event
RETI
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RETI
.ORG OC1Baddr ; Timer/Counter1 Compare Match B
RETI
.ORG OVF1addr ; Timer/Counter1 Overflow
RJMP STARTADC
.ORG OVF0addr ; Timer/Counter0 Overflow
RETI
.ORG SPIaddr ; Serial Transfer Complete
RJMP TRANSMISSIONSPI2BYTE
.ORG URXCaddr ; USART, Rx Complete
RETI
.ORG UDREaddr ; USART Data Register Empty
RETI
.ORG UTXCaddr ; USART, Tx Complete
RETI
.ORG ADCCaddr ; ADC Conversion Complete
RJMP TRANSMISSIONSPI1BYTE
.ORG ERDYaddr ; EEPROM Ready
RETI
.ORG ACIaddr ; Analog Comparator
RETI
.ORG TWIaddr ; 2-wire Serial Interface
RETI
.ORG INT2addr ; External Interrupt Request 2
RETI
.ORG OC0addr ; Timer/Counter0 Compare Match
RETI
.ORG SPMRaddr ; Store Program Memory Ready
RETI


;*********Начало основной программы*********
.ORG INT_VECTORS_SIZE ; отсюда пошла сама программа
RESET:
OUTI SPL,low(RAMEND) ; Это мы загружаем в двубайтный регистр указателя
OUTI SPH,High(RAMEND) ; стека SPH:SPL адрес конца оперативной памяти

;*********Инициализация АЦП*********

OUTI ADCSRA, (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;АЦП разрешен, прерывание от него тоже,
;коэффициент делитедя 128
OUTI ADMUX, (1<<REFS0)|(1<<ADLAR) ;AVcc - источник опорного напряжения,
;результат преобразования выравниваем влево
OUTI SFIOR, (1<<ADHSM) ;Увеличиваем скорость АЦП

;*********Инициализация портов*********

OUTI PORTC, (1<<PORTC0)|(1<<PORTC1)|(1<<PORTC2)|(1<<PORTC3)|(1<<PORTC4)|(1<<PORTC5)|(1<<PORTC6)|(1<<PORTC7) ;Начальное состояние порта C 1
OUTI DDRC, (1<<DDC0)|(1<<DDC1)|(1<<DDC2)|(1<<DDC3)|(1<<DDC4)|(1<<DDC5)|(1<<DDC6)|(1<<DDC7) ;Конфигурируем порт C как выход
OUTI PORTB, (1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2)|(1<<PORTB3)|(1<<PORTB4)|(1<<PORTB5)|(1<<PORTB6)|(1<<PORTB7) ;Начальное состояние порта B 1
OUTI DDRB, (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6)|(1<<DDB7) ;Конфигурируем порт B как выход

;*********Инициализация таймера/счетчика Т1*********
OUTI TCCR1B, (1<<CS11) ;Режим работы 0 (Normal), частоту делим на 8

OUTI TIMSK, (1<<TOIE1) ;Разрешение прерывания таймера Т1 по переполнению

OUTI TCNT1H, TimeWait_H ;задаем начальное значение счетчика (старший байт)
OUTI TCNT1L, TimeWait_L ;задаем начальное значение счетчика (младший байт)

;*********Инициализация SPI*********
OUTI SPCR, (1<<SPIE)|(1<<MSTR)|(1<<SPI2X)|(1<<SPR1)|(1<<SPR0) ;Разрешаем прерывание SPI, выбран режим мастера, скорость передачи делим на 64


;*********Сама программа*********

SEI
MAIN:
NOP
RJMP MAIN

STARTADC:
SETBIT ADCSRA,ADSC ;Старт АЦП
OUTI TCNT1H, TimeWait_H ;повторно задаем начальное значение счетчика (старший байт) для синхронизации
OUTI TCNT1L, TimeWait_L ;повторно задаем начальное значение счетчика (младший байт)
SEI ;разрешаем прерывания
RETI

TRANSMISSIONSPI1BYTE:
IN acc_1,ADCH ;Сохраняем значение АЦП (старший байт)
IN acc_2,ADCL ;Сохраняем значение АЦП (младший байт)
SETBIT SPCR,SPE ;Включение SPI
OUT SPDR,acc_1 ;Заносим в регистр данных старший байт АЦП
OUTI TCNT1H, TimeWait_H ;повторно задаем начальное значение счетчика (старший байт) для синхронизации
OUTI TCNT1L, TimeWait_L ;повторно задаем начальное значение счетчика (младший байт)
SEI
RETI

TRANSMISSIONSPI2BYTE:
SETBIT SPCR,SPE ;Включение SPI
OUT SPDR,acc_2 ;Заносим в регистр данных младщий байт АЦП
OUTI TCNT1H, TimeWait_H ;повторно задаем начальное значение счетчика (старший байт) для синхронизации
OUTI TCNT1L, TimeWait_L ;повторно задаем начальное значение счетчика (младший байт)
SEI
RETI

demiurg_spb
1. sei перед reti - не нужно
2. в обработчиках прерываний принято сохранять в стеке регистры, используемые в этом обработчике.
ведь ваша фоновая программ не будет пустой как сейчас, а ваши макросы используют r25, поэтому как минимум надо было писать так
Код
ISR_XXX:
    push r25
    ....
    pop r25
    reti

Цитата(Caruso @ Dec 22 2009, 10:19) *
Вроде как работает. Но мне не понятно, как формировать сигнал SS (SPI), или сигнал SS должен сам формироваться т. е. аппаратно. И как в этом режиме (SPI) передать сразу несколько байт, т. е. передать за одну посылку, или аппаратно контроллер такого сделать не может?
SS формирует мастер. Настройте эту ножку на ввод от греха подальше (я не шучу).
Аппаратный интерфейс SPI у AVR может работать только с байтами.
Поэтому для передачи других данных, больших чем байт, программист должен немного подумать над тем, как их передать побайтно.
Палыч
Цитата(Caruso @ Dec 22 2009, 10:19) *
Но мне не понятно, как формировать сигнал SS (SPI), или сигнал SS должен сам формироваться т. е. аппаратно.
Сигнал SS в МК используется при работе SPI в режиме Slave. Поскольку у Вас SPI - в режиме Master, то эту ножку Вы можете использовать по своему усмотрению как Вам нужно/удобно. Если, соединённое с МК по SPI устройство требует определённого состояния сигнала на своей ноге SS, то необходимо подключить её к свободной ноге МК (не обязательно к SS МК), настроить её (ногу МК) на вывод и программно формировать на ней необходимый сигнал.
Цитата(Caruso @ Dec 22 2009, 10:19) *
И как в этом режиме (SPI) передать сразу несколько байт, т. е. передать за одну посылку, или аппаратно контроллер такого сделать не может?
В SPI: одна посылка - один байт. Для передачи нескольких байт, обычно, организуют буфер, в который складывают байты готовые для передачи, и, по мере их передачи - последовательно выбирают их из буфера. Можно считать, что у Вас такой буфер из двух байт уже есть: acc_1 и acc_2. Необходимо завести некие указатели/флаги, по состоянию которых можно было бы судить в прерывании от SPI о том, что уже сделано и что нужно сделать (например, флаги: "передавался первый байт из двух", "вывод байтов закончен" или что-то подобное; или реализавать очередь типа FIFO с указателями на начало и конец очереди).

Цитата(demiurg_spb @ Dec 22 2009, 21:17) *
2. в обработчиках прерываний принято сохранять в стеке регистры, используемые в этом обработчике.
Добавлю, что помимо General Purpose Working Registers принято также сохранять регистр SREG...
demiurg_spb
Цитата(Палыч @ Dec 23 2009, 11:27) *
Добавлю, что помимо General Purpose Working Registers принято также сохранять регистр SREG...
Ой, как же я забыл об этом упомянуть. Нет мне прощенияsmile.gif
Prevan
Зравствуйте! Подскажите как присвоить значение отдельным битам порта содержимое какой-нибудь переменной?
например:

out PORTD,temp ;будет просто установлено значение переменной temp в порт D

а мне надо в порт С на 3ю ножку установить значение такое же как на 6м бите перменной temp и таким же образом раскидать другие переменные.

И наоборот. Как можно сделать обратную операцию, т.е. из разных битов портов составить содержимое переменной temp?
например:

in temp,PINC ;будет просто скопировано значение состояния порта С переменную temp

Дело в том, что мне необходимо "мягко" изменить код программы, не прибегаю к полному переписанию кода программы. Переменные, указанные в программе работают со старым подключением проводов к ножкам МК.
т.е. мне надо будет изменить следующий код:

out PORTD,scancod
clc
ldi rots,4
in temp,PINC

где:
PD0 <->PD4
PD1 <->PD5
PD4 <->PC0
PD5 <->PC1
PD6 <->PC2
PD7 <->PC3
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
PDA
Есть плата, похожая на программатор - на плате есть FT232BM и установлен Attiny2313. При установке драйверов FT232BM появляется USB Serial Converter и виртуальный COM-порт.

Микросхема FT232BM по линиям от контактов #25 TXD и #24 RXD связана с Attiny2313 к контактам #2 PD0(RXD) и #3 PD1(TDX), через которые и собственно организован обмен данными. Вопрос: можно ли прошить МК через FT232BM, используя эти линии (похоже на UART?) - то есть ли возможность перепрошивать МК без подключения программатора (к SPI выводам МК), а только программными средствами по имеющимся линиям UART?
Дмитрий К.
Цитата(PDA @ Jul 27 2010, 16:32) *
Вопрос: можно ли прошить МК через FT232BM, используя эти линии (похоже на UART?) - то есть ли возможность перепрошивать МК без подключения программатора (к SPI выводам МК), а только программными средствами по имеющимся линиям UART?

в обычном режиме невозможно перепрошивать МК через TXD/RXD,
теоретически для этого необходимо написать для Attiny2313 загрузчик flash через UART,
т.е. Вы посылаете через FT232BM байты , МК их получает и сам себя перепрошивает
PDA
Я правильно понимаю, что обещание, что устройство будет программироваться только через USB, не выполнимо, то есть при производстве устройства всё равно придется хоть раз программировать МК по SPI каналу, а потом скреплять корпус?

update:
Цитата(Дмитрий К. @ Jul 27 2010, 16:48) *
в обычном режиме невозможно перепрошивать МК через TXD/RXD,
теоретически для этого необходимо написать для Attiny2313 загрузчик flash через UART,
т.е. Вы посылаете через FT232BM байты , МК их получает и сам себя перепрошивает
разве у Attiny2313 есть возможность создания лодера? всего 2К памяти, насколько я понял описание
Дмитрий К.
Цитата(PDA @ Jul 27 2010, 16:53) *
Я правильно понимаю, что обещание, что устройство будет программироваться только через USB, не выполнимо, то есть при производстве устройства всё равно придется хоть раз программировать МК по SPI каналу, а потом скреплять корпус?

первый раз конечно по SPI
Цитата(PDA @ Jul 27 2010, 16:53) *
update:разве у Attiny2313 есть возможность создания лодера? всего 2К памяти, насколько я понял описание

"The device provides a Self-Programming mechanism for downloading and uploading program code by the MCU itself."
2k мало, но вроде возможно
PDA
Цитата
первый раз конечно по SPI
Тогда подскажите, возможно ли такая ситуация, что микросхема уже имеет какой-либо загрузчик? В моем случае, например, что микросхема уже имеет в себе загрузчик по UART?
Savrik
Attiny2313 флеша маловато.. Есть ли на плате какие-либо кнопки? Если есть, можно попробовать зажать ее, перезапустить МК, и смотреть в терминал(или записать туда что-то), возможно, увидите бутлоадер.
Как вариант можно создать свой. Я использую(правда, для Mega AVR)AVR911, загружаю через Avr-Osp II. Очень удобно, код для меги16 занимает около 1кб.
MMMika
Господа специалисты.
Помогите новичку!
Имеется блок с PIC18F6520, который после сбоя по питанию
ЧАСТИЧНО перестал нормально функционировать.
На блоке есть разъем (DB9), далее MAX232, дальше USART2 выводы контроллера (6;8;5;4).
Мои попытки связаться с контроллером из различных программ (MPLAB, PCWHD Compiler)
с ноутбука безрезультатны. (пишет нет связи, или проверьте кабель)
Кабель и MAX232 исправны.
В блоке есть возможность установки нескольких перемычек, возможно какие-то
использовались для организации связи через USART2.
Помогите установить связь с ноутбука с PIC18F6520.
С уважением Mika

Marto
1 - не тот раздел.
2 - а через какой интерфейс связываетесь?
3 - что за блок такой секретный?
Claw
А для чего нужны подтягивающие резисторы на портах в PIC?
Tanya
Цитата(Claw @ Mar 22 2011, 14:39) *
А для чего нужны подтягивающие резисторы на портах в PIC?

Внутренние - для того, чтобы не ставить внешние.
Claw
Как я понимаю они нужны для работы портов в режиме output?
Tanya
Цитата(Claw @ Mar 22 2011, 15:40) *
Как я понимаю они нужны для работы портов в режиме output?

Нет. Совсем наоборот. Уменьшают помехочувствительность входов.
Claw
Ясно,спасибо,а в принципе их обязательно подключать или нет? у меня просто стоит задача позажигать светодиоды и я ещё не разобралась как мне собственно это сделать 05.gif
Tanya
Цитата(Claw @ Mar 22 2011, 16:14) *
стоит задача позажигать светодиоды и я ещё не разобралась как мне собственно это сделать 05.gif

Красивая задача -
-----------------------------
Послушайте!
Ведь, если звезды зажигают -
значит - это кому-нибудь нужно?
Значит - кто-то хочет, чтобы они были?
Значит - кто-то называет эти плевочки
жемчужиной?
--------------------------
Жаль только, что подтяжки не будут тут нужны.
Claw
Цитата
Послушайте!
Ведь, если звезды зажигают -
значит - это кому-нибудь нужно?
Значит - кто-то хочет, чтобы они были?
Значит - кто-то называет эти плевочки
жемчужиной?

Это всё для меня?Спасибо biggrin.gif

А вот если у нас есть 8 портов RB,можно использовать 4е из них как кнопки, а оставшиеся как светодиоды или тут надо использовать ещё проты RA? И вообще в чём отличие между RA и RB?
sargein
Цитата(Claw @ Mar 22 2011, 15:47) *
Это всё для меня?Спасибо biggrin.gif

А вот если у нас есть 8 портов RB,можно использовать 4е из них как кнопки, а оставшиеся как светодиоды или тут надо использовать ещё проты RA? И вообще в чём отличие между RA и RB?


Можно только RB, на RA еще аналоговая периферия висит, чтобы использовать RA как кнопку нужно дополнительно выключить все аналоговые модули.
Tanya
Цитата(Claw @ Mar 22 2011, 16:47) *
Это всё для меня?Спасибо biggrin.gif

А вот если у нас есть 8 портов RB,можно использовать 4е из них как кнопки, а оставшиеся как светодиоды или тут надо использовать ещё проты RA? И вообще в чём отличие между RA и RB?

Можно только PORTB. Только нужно даташит читать на конкретный контроллер. Там все должно быть написано.
Claw
А нужно использовать регистры ANSEL,ANSELH?Насколько я поняла они используются для переключения цифровых I/O в аналоговые?
sargein
Все зависит от конкретного мк, надо даташит читать.
Claw
А зачем нужен предварительный делитель?
Tanya
Цитата(Claw @ Mar 22 2011, 18:39) *
А зачем нужен предварительный делитель?


Для предварительного деления. Читайте лучше английский вариант даташита.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.