Перейти к содержанию

Помогите Адаптировать Прошивку


shev377

Рекомендуемые сообщения

Итак был некий проэкт мега 3д (вот тут про него http://radiokot.ru/circuit/light/run/27/

В нём применялся мк АтМега 42, и 8 светодиодов, (+2 оптотранзистора)

вся эта хрень управлялась с ком порта через один из оптотранзисторов.

Захотел сделать на основе стандартного МЕГА 3д проэкта, ту же фигню но на АтМега32 и 30 светодиоде (+2 опотранзистора)

Есть Код на асамблере исходного мега 3д с 8 светодиодами, помогите переделать под атмега32 с 30 светодиодом.

Прилагаю исходную схему, конечную схему, исходную прошивку...

Заранее спасибо!

исходная схема

post-116162-1265142695_thumb.jpg

конечная схема

post-116162-1265142701_thumb.jpg

исходный код (нужный .include есть)

;******************Mega3D project by YS*******************
;*              YeliseySystems © 2008-2009             *
;*              Device: ATmega48  XTAL: 8MHz             *
;*********************************************************
.include "M48DEF.INC"

.def t=R16
.def LEDS=R17
.def ARRIDX=R18
.def BUFNUM=R19
.def BUFMAX=R20
.def BUFPOS=R21
.def t1=R22

.dseg

buffer: .byte 180

.cseg
.org 0

rjmp RESET      ; Reset Handler
rjmp EXT_INT0   ; IRQ0 Handler
rjmp EXT_INT1   ; IRQ1 Handler
rjmp _PCINT0     ; PCINT0 Handler
rjmp _PCINT1     ; PCINT1 Handler
rjmp _PCINT2     ; PCINT2 Handler
rjmp WDT        ; Watchdog Timer Handler
rjmp TIM2_COMPA ; Timer2 Compare A Handler
rjmp TIM2_COMPB ; Timer2 Compare B Handler
rjmp TIM2_OVF   ; Timer2 Overflow Handler
rjmp TIM1_CAPT  ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF   ; Timer1 Overflow Handler
rjmp TIM0_COMPA ; Timer0 Compare A Handler
rjmp TIM0_COMPB ; Timer0 Compare B Handler
rjmp TIM0_OVF   ; Timer0 Overflow Handler
rjmp SPI_STC    ; SPI Transfer Complete Handler
rjmp USART_RXC  ; USART, RX Complete Handler
rjmp USART_UDRE ; USART, UDR Empty Handler
rjmp USART_TXC  ; USART, TX Complete Handler
rjmp ADC_CCPL   ; ADC Conversion Complete Handler
rjmp EE_RDY     ; EEPROM Ready Handler
rjmp ANA_COMP   ; Analog Comparator Handler
rjmp TWI        ; 2-wire Serial Interface Handler
rjmp SPM_RDY    ; Store Program Memory Ready Handler

EXT_INT1  :
_PCINT0   :
_PCINT1   :
_PCINT2   :
WDT       :
TIM2_COMPA:
TIM2_COMPB:
TIM2_OVF  :
TIM1_CAPT :
TIM1_COMPB:
TIM1_OVF  :
TIM0_COMPA:
TIM0_COMPB:
TIM0_OVF  :
SPI_STC   :
USART_UDRE:
USART_TXC :
ADC_CCPL  :
EE_RDY    :
ANA_COMP  :
TWI       :
SPM_RDY   :

reti

RESET:

;================================General settings============================

 ldi t,HIGH(RamEnd)    ;stack initialization
 out SPH,t
 ldi t,LOW(RamEnd)
 out SPL,t

;PortB settings

 ldi t,0xFF           ;configure portB for output
 out DDRB,t

 ldi t,0              ;initializing portB
 out portB,t

;Timer 1 settings

 ldi t,0x00           ;Fintr=2KHz
 sts OCR1AH,t
 ldi t,0x3E
 sts OCR1AL,t

 ldi t,0b00000010     ;interrupt on compareA match
 sts TIMSK1,t

 ldi t,0              ;initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

;Configure external interrupt 0

 ldi t,0b00000011     ;interrupt on rising edge on INT0 pin
 sts EICRA,t

 ldi t,0b00000001
 out EIMSK,t          ;enable INT0

;Configure UART

 ldi t,0b10010000
 sts UCSR0B,t         ;interrupt on RX complete enable,RX enable

 ldi t,0b00000110
 sts UCSR0C,t         ;8-bit character

 ldi t,0
 sts UBRR0H,t
 ldi t,34
 sts UBRR0L,t         ;14400bps


;Registers initialization

 ldi t,0
 ldi BUFMAX,180

 ldi ARRIDX,0
 ldi BUFPOS,0

 ldi YH,HIGH(buffer)
 ldi YL,LOW(buffer)


 ldi XH,HIGH(buffer)
 ldi XL,LOW(buffer)

;Enable interrupts

sei

;================================Main loop============================

LOOP:

rjmp LOOP

;============================Interupt handlers========================

;----------------------External interrupt 0 handler-------------------

EXT_INT0:

 cli

 ldi t,0              ;re-initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

 ldi t,0b00000011     ;Starting timer (timer clock=Fclk/64)
 sts TCCR1B,t

 sei

reti

;-------------------Timer 1 Compare A match interrupt handler---------

TIM1_COMPA:

 cli

 ldi t,0              ;re-initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

 rcall ReadArray

 out portB,t

 inc ARRIDX

 cp ARRIDX,BUFMAX
 breq RESIDX
 brne EXITCOMPA

RESIDX:

 ldi ARRIDX,0

 ldi t,0              ;Stopping timer
 sts TCCR1B,t

 out portB,t

EXITCOMPA:

 sei

reti

;-------------------------UART RX complete handler--------------------

USART_RXC:

 cli

 lds t,UCSR0A
 sbrc t,FE0           ;Error?
 rjmp FRAMING_ERROR

 lds t,UDR0

 rcall WriteArray

 rjmp CHECK_BUF

FRAMING_ERROR:

 ldi t,1

 rcall WriteArray

CHECK_BUF:

 inc BUFPOS

 cp BUFPOS,BUFMAX
 breq SBUF
 brne RX_END

SBUF:

 ldi BUFPOS,0

RX_END:

 sei

reti

;==============================Other routines=========================

ReadArray:

 ldi t,0

 ldi YH,HIGH(buffer)
 ldi YL,LOW(buffer)

 add YL,ARRIDX
 adc YH,t  

 ld t,Y

ret

WriteArray:

 ldi t1,0

 ldi XH,HIGH(buffer)
 ldi XL,LOW(buffer)

 add XL,BUFPOS
 adc XH,t1 

 st X,t

ret
;=====================================================================

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

составьте по программе алгоритм (программа вроде не сложная),

по алгоритму - новую программу.

а чем занимается устройство?

"отмигивает" число, полученное с компьютера?

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

да

компьютер шифрует сигнал (светик 1-0 светик 2-1 светик3-0......30-1 далее следущий столбик изображения светик 1-0 светик 2-0 светик3-1......30-1 итд....),

дальше это всё передаётся по ИК каналу,

дальше мк расшифровывает сигнал, пишет в ОЗУ,

выводит на нужные ножки 0 и 1 по данным из озу ОЗУ когда замыкается датчик НАЧАЛА.

Вывод происходит так,

1)замкнулся датчик начала

2)пошёл первый столбик изображения, прочитали из озу что нужно выполнить диод1=1 диод2=0 диод3=1 диод4=0 диод5=0 диод6=0......диод31=0

ждать хз милисекунд

3)пошёл второй столбик изображения, прочитали из озу что нужно выполнить диод0=1 диод2=1 диод3=1 диод4=0 диод5=0 диод6=0......диод31=1

ждать хз милисекунд

4)пошёл третий столбик изображения, прочитали из озу что нужно выполнить диод1=0 диод2=0 диод3=1 диод4=0 диод5=0 диод6=0......диод31=0

5)кончились данные в озу, ждём пока замкнёться датчик начала и всё заново

5.1)если данные не кончились а датчик уже замкнулся, то опять 1 шаг

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

предположим 30 светиков - 4 байта.

мк принимает по байтам, последовательно записывает в ОЗУ,

параллельно отображает эти столбики (кстати, сколько их?)

отображение:

запускается таймер, по истечении t-промежутка, считывает

по 4 байта даннных и выводит эти числа в порты

все верно?

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

сколько столбиков? как получиться....

примерно 75, но это не предсказуемо, тк в зависимости от скорости вращения конструкции может кардинально меняться количество столбиков....

отображение такое, только начинается с некого флажка, замыкание оптотранзистора, далее уже по 4 байта считывает и выводит

исходная конструкция

a5a791c4b262t.jpg

4652e1a268f1t.jpg

c5033471f7abt.jpg

17fcfa6df93ct.jpg

ffe3cb68df23t.jpg

3518af2ad8d5t.jpg

94b234b9cb45t.jpg

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

значит, задача ясна.

1)пишем программу для приема по uart

(по прерыванию записываем принятое в ОЗУ)

2)программу для внешниго прерывания

(по прерыванию - запускаем таймер)

2)программу для таймера

(по прерыванию - считываем 4 ячейки ОЗУ

и записываем их в порты)

все.

П.С.

в чем проблема?

Изменено пользователем skef

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

в асамблере :(

нашёл неплохой прокомментированный код, много полезного оказалось, привариваю

http://www.microchip.su/showthread.php?t=4829

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

не пойдет.

там прерывания не используются, там не только прием, но и передача, и еще много всяких косяков...

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

//итак, пишем программу. составляем "заготовку":

.include "m32def.inc"

.cseg

.org $000

jmp RESET ; Reset Handler

.org $002

jmp EXT_INT0 ; IRQ0 Handler

.org $00E

jmp TIM1_COMPA ; Timer1 CompareA Handler

.org $01A

jmp USART_RXC ; USART RX Complete Handler

RESET:

ldi r16,high(RAMEND) ; Main program start

out SPH,r16 ; Set Stack Pointer to top of RAM

ldi r16,low(RAMEND)

out SPL,r16

sei ; Enable interrupts

enter:

rjmp enter

EXT_INT0: ; IRQ0 Handler

reti

TIM1_COMPA: ; Timer1 CompareA Handler

reti

USART_RXC: ; USART RX Complete Handler

reti

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

;=======================

ldi r16,(1<<isc01);настройка прерывания по падающему фронту на PD2

out mcucr,r16

ldi r16,(1<<int0);разрешение прерывания по падающему фронту на PD2

out gicr,r16 ;при перепаде 1-0 на ноге PD2 будет прерывание EXT_INT0

;========================

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за заготовку,

кок раз добыл прокомментированный на русском код,

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

;******************Mega3D project by YS*******************
;*              YeliseySystems © 2008-2009             *
;*              Device: ATmega48  XTAL: 8MHz             *
;*********************************************************
.include "M48DEF.INC"

.def t=R16      ; временный регистр
.def LEDS=R17   ; unused
.def ARRIDX=R18 ; номер текущего выводимого элемента
.def BUFNUM=R19 ; изначально планировалось сделать два буфера... В текущей версии - unused.
.def BUFMAX=R20 ; регистр - константа с размером буфера
.def BUFPOS=R21 ; номер текущего записываемого элемента
.def t1=R22     ; еще один временный регистр

.dseg

buffer: .byte 180 ;резервируем память под картинку

.cseg
.org 0   ;таблица векторов прерываний - один в один как в двтвшите

rjmp RESET      ; Reset Handler
rjmp EXT_INT0   ; IRQ0 Handler
rjmp EXT_INT1   ; IRQ1 Handler
rjmp _PCINT0     ; PCINT0 Handler
rjmp _PCINT1     ; PCINT1 Handler
rjmp _PCINT2     ; PCINT2 Handler
rjmp WDT        ; Watchdog Timer Handler
rjmp TIM2_COMPA ; Timer2 Compare A Handler
rjmp TIM2_COMPB ; Timer2 Compare B Handler
rjmp TIM2_OVF   ; Timer2 Overflow Handler
rjmp TIM1_CAPT  ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF   ; Timer1 Overflow Handler
rjmp TIM0_COMPA ; Timer0 Compare A Handler
rjmp TIM0_COMPB ; Timer0 Compare B Handler
rjmp TIM0_OVF   ; Timer0 Overflow Handler
rjmp SPI_STC    ; SPI Transfer Complete Handler
rjmp USART_RXC  ; USART, RX Complete Handler
rjmp USART_UDRE ; USART, UDR Empty Handler
rjmp USART_TXC  ; USART, TX Complete Handler
rjmp ADC_CCPL   ; ADC Conversion Complete Handler
rjmp EE_RDY     ; EEPROM Ready Handler
rjmp ANA_COMP   ; Analog Comparator Handler
rjmp TWI        ; 2-wire Serial Interface Handler
rjmp SPM_RDY    ; Store Program Memory Ready Handler

EXT_INT1  :
_PCINT0   :
_PCINT1   :
_PCINT2   :
WDT       :
TIM2_COMPA:
TIM2_COMPB:
TIM2_OVF  :
TIM1_CAPT :
TIM1_COMPB:
TIM1_OVF  :
TIM0_COMPA:
TIM0_COMPB:
TIM0_OVF  :
SPI_STC   :
USART_UDRE:
USART_TXC :
ADC_CCPL  :
EE_RDY    :
ANA_COMP  :
TWI       :
SPM_RDY   :

reti

RESET:

;================================General settings============================

 ldi t,HIGH(RamEnd)    ;инициализация стека
 out SPH,t
 ldi t,LOW(RamEnd)
 out SPL,t

;PortB settings

 ldi t,0xFF           ;portB - выход
 out DDRB,t

 ldi t,0              ;пишем в portB ноль. Для порядка.
 out portB,t

;Настройка таймера/каунтера 1, по прерыванию от него данные поступают в порт

 ldi t,0x00           ;Fintr=2KHz
 sts OCR1AH,t
 ldi t,0x3E
 sts OCR1AL,t

 ldi t,0b00000010     ;interrupt on compareA match
 sts TIMSK1,t

 ldi t,0              ;initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

;Конфигурируем внешнее прерывание (от оптопары). По нему начинается вывод в порт.

 ldi t,0b00000011     ;interrupt on rising edge on INT0 pin
 sts EICRA,t

 ldi t,0b00000001
 out EIMSK,t          ;enable INT0

;конфигурируем UART

 ldi t,0b10010000
 sts UCSR0B,t         ;interrupt on RX complete enable,RX enable

 ldi t,0b00000110
 sts UCSR0C,t         ;8-bit character

 ldi t,0
 sts UBRR0H,t
 ldi t,34
 sts UBRR0L,t         ;14400bps


;инициализируем регистры начальными значениями

 ldi t,0
 ldi BUFMAX,180 ;всего 180 элементов

 ldi ARRIDX,0   
 ldi BUFPOS,0

 ldi YH,HIGH(buffer) ;регистровая пара с адресом для чтения
 ldi YL,LOW(buffer) 

 ldi XH,HIGH(buffer) ; регистровая пара с адресом для записи
 ldi XL,LOW(buffer)

;Enable interrupts

sei

;================================Main loop============================

LOOP:

rjmp LOOP

;============================Interupt handlers========================

;----------------------External interrupt 0 handler-------------------

EXT_INT0:

 cli

 ldi t,0              ;re-initializing timer, чтобы он продолжал считать с нуля
 sts TCNT1H,t
 sts TCNT1L,t

 ldi t,0b00000011     ;Starting timer (timer clock=Fclk/64)
 sts TCCR1B,t

 sei

reti

;-------------------Timer 1 Compare A match interrupt handler---------

TIM1_COMPA:

 cli

 ldi t,0              ;re-initializing timer, чтобы он считал с нуля
 sts TCNT1H,t
 sts TCNT1L,t

 rcall ReadArray     ;читаем из массива и выводим в порт очередное значение

 out portB,t

 inc ARRIDX

 cp ARRIDX,BUFMAX  ;массив не кончился?
 breq RESIDX
 brne EXITCOMPA

RESIDX:            ;если кончился, останавливаем вывод и сбасываем номер элемента для вывода

 ldi ARRIDX,0

 ldi t,0              ;Stopping timer
 sts TCCR1B,t

 out portB,t

EXITCOMPA:

 sei

reti

;-------------------------UART RX complete handler--------------------

USART_RXC:

 cli

 lds t,UCSR0A
 sbrc t,FE0           ;Error?
 rjmp FRAMING_ERROR

 lds t,UDR0

 rcall WriteArray      ; приняв байт, записываем его в массив.

 rjmp CHECK_BUF

FRAMING_ERROR:

 ldi t,1             ;если возникла ошибка приема - записываем число 1 вместо байта

 rcall WriteArray

CHECK_BUF:           ;массив не кончился?

 inc BUFPOS

 cp BUFPOS,BUFMAX
 breq SBUF
 brne RX_END

SBUF:                    ;если кончился - начинаем сначала...

 ldi BUFPOS,0

RX_END:

 sei

reti

;==============================Other routines=========================

ReadArray:                ;чтение из массива - стандартно

 ldi t,0

 ldi YH,HIGH(buffer)
 ldi YL,LOW(buffer)

 add YL,ARRIDX
 adc YH,t 

 ld t,Y

ret

WriteArray:               ;запись в массив - стандартно

 ldi t1,0

 ldi XH,HIGH(buffer)
 ldi XL,LOW(buffer)

 add XL,BUFPOS
 adc XH,t1

 st X,t

ret
;=====================================================================

Модератору: в код не вставил сознательно, чтоб читать удобнее было, а не в скролл окошке.

Изменено пользователем shev377
Научитесь использовать ТЕГИ!!!! Кто эт ожолжен читать? Wowa.
Ссылка на комментарий
Поделиться на другие сайты

;========================
//int0 in PD2 + RXD in pd0 - is in 
ldi r16,0b11111010
out ddrd,r16
ldi r16,(1<<pd2)+(1<<pd0)
out portd,r16
;=======================
ldi r16,(1<<isc01);настройка прерывания по падающему фронту на PD2
out mcucr,r16
ldi r16,(1<<int0);разрешение прерывания по падающему фронту на PD2
out gicr,r16;при перепаде 1-0 на ноге PD2 будет прерывание EXT_INT0
;========================

ldi r16,(1<<rxcie)+(1<<rxen);ключение и разрешение работы приемника UART
out ucsrb,r16
ldi r16,(1<<ursel)+(1<<ucsz1)+(1<<ucsz0);формат кадра
out ucsrc,r16
ldi  r16,103
out ubrrl,r16;fosc = 4.0000 MHz, 2400 bps, это значение надо буде 
;корректировать(а лучше просто взять из исходника)
;========================
;на сегодня все. баиньки. великие подвиги будут завтра

Изменено пользователем wowa

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

Вот конечный код:


.include "АТМЕГА32"

.def t=R16
.def BUFPOSH=R17
.def ARRIDXH=R18
.def BUFMAXH=R19
.def BUFMAXL=R20
.def BUFPOSL=R21
.def t1=R22
.def ARRIDXL=R23

.dseg

buffer: .byte 720

.cseg
.org 0

rjmp RESET      ; Reset Handler
rjmp EXT_INT0   ; IRQ0 Handler
rjmp EXT_INT1   ; IRQ1 Handler
rjmp _PCINT0     ; PCINT0 Handler
rjmp _PCINT1     ; PCINT1 Handler
rjmp _PCINT2     ; PCINT2 Handler
rjmp WDT        ; Watchdog Timer Handler
rjmp TIM2_COMPA ; Timer2 Compare A Handler
rjmp TIM2_COMPB ; Timer2 Compare B Handler
rjmp TIM2_OVF   ; Timer2 Overflow Handler
rjmp TIM1_CAPT  ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF   ; Timer1 Overflow Handler
rjmp TIM0_COMPA ; Timer0 Compare A Handler
rjmp TIM0_COMPB ; Timer0 Compare B Handler
rjmp TIM0_OVF   ; Timer0 Overflow Handler
rjmp SPI_STC    ; SPI Transfer Complete Handler
rjmp USART_RXC  ; USART, RX Complete Handler
rjmp USART_UDRE ; USART, UDR Empty Handler
rjmp USART_TXC  ; USART, TX Complete Handler
rjmp ADC_CCPL   ; ADC Conversion Complete Handler
rjmp EE_RDY     ; EEPROM Ready Handler
rjmp ANA_COMP   ; Analog Comparator Handler
rjmp TWI        ; 2-wire Serial Interface Handler
rjmp SPM_RDY    ; Store Program Memory Ready Handler

EXT_INT1  :
_PCINT0   :
_PCINT1   :
_PCINT2   :
WDT       :
TIM2_COMPA:
TIM2_COMPB:
TIM2_OVF  :
TIM1_CAPT :
TIM1_COMPB:
TIM1_OVF  :
TIM0_COMPA:
TIM0_COMPB:
TIM0_OVF  :
SPI_STC   :
USART_UDRE:
USART_TXC :
ADC_CCPL  :
EE_RDY    :
ANA_COMP  :
TWI       :
SPM_RDY   :

reti

RESET:

;================================General settings============================

 ldi t,HIGH(RamEnd)    ;stack initialization
 out SPH,t
 ldi t,LOW(RamEnd)
 out SPL,t

;PortB settings

 ldi t,0xFF           ;configure PortA,portB,portC,portD for output
 out DDRB,t

 ldi t,0              ;initializing portA,portB,portC,portD
 out portB,t



;   RXD INTO for input
 out DDRD0,RXD
 out DDRD2,INT0



;Timer 1 settings

 ldi t,0x00           ;Fintr=2KHz
 sts OCR1AH,t
 ldi t,0x3E
 sts OCR1AL,t

 ldi t,0b00000010     ;interrupt on compareA match
 sts TIMSK1,t

 ldi t,0              ;initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

;Configure external interrupt 0

 ldi t,0b00000011     ;interrupt on rising edge on INT0 pin
 sts EICRA,t

 ldi t,0b00000001
 out EIMSK,t          ;enable INT0

;Configure UART

 ldi t,0b10010000
 sts UCSR0B,t         ;interrupt on RX complete enable,RX enable

 ldi t,0b00000110
 sts UCSR0C,t         ;8-bit character

 ldi t,0
 sts UBRR0H,t
 ldi t,34
 sts UBRR0L,t         ;14400bps


;Registers initialization

 ldi t,0
 ldi BUFMAXH,0x02
 ldi BUFMAXL,0xD0

 ldi ARRIDXH,0
 ldi ARRIDXL,0
 ldi BUFPOSH,0
 ldi BUFPOSL,0

 ldi YH,HIGH(buffer)
 ldi YL,LOW(buffer)


 ldi XH,HIGH(buffer)
 ldi XL,LOW(buffer)

;Enable interrupts

sei

;================================Main loop============================

LOOP:

rjmp LOOP

;============================Interupt handlers========================

;----------------------External interrupt 0 handler-------------------

EXT_INT0:

 cli

 ldi t,0              ;re-initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

 ldi t,0b00000011     ;Starting timer (timer clock=Fclk/64)
 sts TCCR1B,t

 sei

reti

;-------------------Timer 1 Compare A match interrupt handler---------

TIM1_COMPA:

 cli

 ldi t,0              ;re-initializing timer
 sts TCNT1H,t
 sts TCNT1L,t

 rcall ReadArray

 out portB,t

 ldi t,1
 ldi t1,0
 add ARRIDXL,t
 adc ARRIDXH,t1

 rcall ReadArray

 out portA,t

 ldi t,1
 ldi t1,0
 add ARRIDXL,t
 adc ARRIDXH,t1

 rcall ReadArray

 out portC,t

 ldi t,1
 ldi t1,0
 add ARRIDXL,t
 adc ARRIDXH,t1

 rcall ReadArray

 out portD,t

 ldi t,1
 ldi t1,0
 add ARRIDXL,t
 adc ARRIDXH,t1


 cp ARRIDXL,BUFMAXL
 brne EXITCOMPA
 cp ARRIDXH,BUFMAXH
 breq RESIDX
 brne EXITCOMPA

RESIDX:

 ldi ARRIDXL,0
 ldi ARRIDXH,0

 ldi t,0              ;Stopping timer
 sts TCCR1B,t

 out portB,t

EXITCOMPA:

 sei

reti

;-------------------------UART RX complete handler--------------------

USART_RXC:

 cli

 lds t,UCSR0A
 sbrc t,FE0           ;Error?
 rjmp FRAMING_ERROR

 lds t,UDR0

 rcall WriteArray

 rjmp CHECK_BUF

FRAMING_ERROR:

 ldi t,1

 rcall WriteArray

CHECK_BUF:

 ldi t,1
 ldi t1,0
 add BUFPOSL,t
 adc BUFPOSH,t1

 cp BUFPOSL,BUFMAXL
 brne RX_END
 cp BUFPOSH,BUFMAXH
 breq SBUF
 brne RX_END

SBUF:

 ldi BUFPOSL,0
 ldi BUFPOSH,0

RX_END:

 sei

reti

;==============================Other routines=========================

ReadArray:

 ldi t,0

 ldi YH,HIGH(buffer)
 ldi YL,LOW(buffer)

 add YL,ARRIDXL
 adc YH,ARRIDXH 

 ld t,Y

ret

WriteArray:

 ldi t1,0

 ldi XH,HIGH(buffer)
 ldi XL,LOW(buffer)

 add XL,BUFPOSL
 adc XH,BUFPOSH

 st X,t

ret
;=====================================================================

Пофиксите пожалуйста!

Допустимо ли такое обозначение пина 14 и 16 на ввод?

; RXD INTO for input

out DDRD0,RXD

out DDRD2,INT0

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

 Нет так не пойдет. А вот так можно по-пробовать:

cbi   DDRD,0

cbi   DDRD,2

Сам код лучше несколько переделать.

.include "АТМЕГА32"

.def t=R16
.def BUFPOSH=R17
.def ARRIDXH=R18
.def BUFMAXH=R19
.def BUFMAXL=R20
.def BUFPOSL=R21
.def t1=R22
.def ARRIDXL=R23

.dseg

buffer: .byte 720

.cseg
.org 0

rjmp RESET      ; Reset Handler
rjmp EXT_INT0   ; IRQ0 Handler
 reti   ; IRQ1 Handler
 reti     ; PCINT0 Handler
 reti     ; PCINT1 Handler
 reti     ; PCINT2 Handler
 reti     ; Watchdog Timer Handler
 reti     ; Timer2 Compare A Handler
 reti     ; Timer2 Compare B Handler
 reti     ; Timer2 Overflow Handler
 reti     ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
 reti     ; Timer1 Compare B Handler
 reti     ; Timer1 Overflow Handler
 reti     ; Timer0 Compare A Handler
 reti     ; Timer0 Compare B Handler
 reti     ; Timer0 Overflow Handler
 reti     ; SPI Transfer Complete Handler
rjmp USART_RXC  ; USART, RX Complete Handler
 reti     ; USART, UDR Empty Handler
 reti     ; USART, TX Complete Handler
 reti     ; ADC Conversion Complete Handler
 reti     ; EEPROM Ready Handler
 reti     ; Analog Comparator Handler
 reti     ; 2-wire Serial Interface Handler
 reti     ; Store Program Memory Ready Handler

;нет смысла "прыгать" на команду reti, если ее можно использовать сразу же  

RESET:



;================================General settings============================

  ldi t,HIGH(RamEnd)    ;stack initialization
  out SPH,t
  ldi t,LOW(RamEnd)
  out SPL,t

;PortB settings

  ldi t,0xFF           ;configure PortA,portB,portC,portD for output
  out DDRB,t

  ldi t,0              ;initializing portA,portB,portC,portD
  out portB,t



;   RXD INTO for input
  out DDRD0,RXD
  out DDRD2,INT0

  

;Timer 1 settings

  ldi t,0x00           ;Fintr=2KHz
  sts OCR1AH,t
  ldi t,0x3E
  sts OCR1AL,t

  ldi t,0b00000010     ;interrupt on compareA match
  sts TIMSK1,t

  ldi t,0              ;initializing timer
  sts TCNT1H,t
  sts TCNT1L,t

;Configure external interrupt 0

  ldi t,0b00000011     ;interrupt on rising edge on INT0 pin
  sts EICRA,t

  ldi t,0b00000001
  out EIMSK,t          ;enable INT0

;Configure UART

  ldi t,0b10010000
  sts UCSR0B,t         ;interrupt on RX complete enable,RX enable

  ldi t,0b00000110
  sts UCSR0C,t         ;8-bit character

  ldi t,0
  sts UBRR0H,t
  ldi t,34
  sts UBRR0L,t         ;14400bps
   

;Registers initialization

  ldi t,0
  ldi BUFMAXH,0x02
  ldi BUFMAXL,0xD0

  ldi ARRIDXH,0
  ldi ARRIDXL,0
  ldi BUFPOSH,0
  ldi BUFPOSL,0

  ldi YH,HIGH(buffer)
  ldi YL,LOW(buffer)


  ldi XH,HIGH(buffer)
  ldi XL,LOW(buffer)

movw r2,r28

ldi r24,0


ldi r25,0


;Enable interrupts

sei

;================================Main loop============================

LOOP:

rjmp LOOP

;============================Interupt handlers========================

;----------------------External interrupt 0 handler-------------------

EXT_INT0:

  cli

  ldi t,0              ;re-initializing timer
  sts TCNT1H,t
  sts TCNT1L,t

  ldi t,0b00000011     ;Starting timer (timer clock=Fclk/64)
  sts TCCR1B,t
  sei
  reti

;-------------------Timer 1 Compare A match interrupt handler---------

TIM1_COMPA:

  cli

  ldi t,0              ;re-initializing timer
  sts TCNT1H,t
  sts TCNT1L,t

 ;**т.к. ReadArray исключен, то вся подготовка адреса к чтению и последующий вызов ReadArray для чтения меняем на чтение с постинкрементом 

 ld t,Y+
 out portB,t
ld t,Y+
 out portA,t
 ld t,Y+
 out portC,t
 ld t,Y+
 out portD,t
movw r28,r24

subi r25,r3

sbci r24,r2

cp r25,0x0D

cpc r24,0x02

;cp ARRIDXL,BUFMAXL


;brne EXITCOMPA
;cpc ARRIDXH,BUFMAXH
breq RESIDX
brne EXITCOMPA

RESIDX:

  ldi YH,HIGH(buffer)
  ldi YL,LOW(buffer)
;  ldi ARRIDXL,0
;  ldi ARRIDXH,0

  ldi t,0              ;Stopping timer
  sts TCCR1B,t

  out portB,t

EXITCOMPA:

  sei

reti

;-------------------------UART RX complete handler--------------------

USART_RXC:

  cli

  lds t,UCSR0A
  sbrc t,FE0           ;Error?
  rjmp FRAMING_ERROR

  lds t,UDR0

  rcall WriteArray

  rjmp CHECK_BUF

FRAMING_ERROR:

  ldi t,1

  rcall WriteArray

CHECK_BUF:

  ldi t,1
  ldi t1,0
  add BUFPOSL,t
  adc BUFPOSH,t1

  cp BUFPOSL,BUFMAXL
  brne RX_END
  cp BUFPOSH,BUFMAXH
  breq SBUF
  brne RX_END

SBUF:

  ldi BUFPOSL,0
  ldi BUFPOSH,0

RX_END:

  sei

reti

;==============================Other routines=========================

;***** ReadArray можно спокойно исключить полностью, чтобы уменьшить кол-во тактов чтения и вывода  

  ;ReadArray:
  ;ret

WriteArray:

  ldi t1,0

  ldi XH,HIGH(buffer)
  ldi XL,LOW(buffer)

  add XL,BUFPOSL
  adc XH,BUFPOSH

  st X,t

ret
;=====================================================================

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

может, сначал лучше смоделировать (в протеусе например)

p.s.

протеус и печатку разведет.

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

Ссылка на комментарий
Поделиться на другие сайты

мне специфическая плата нужна, в форме дуги.

что-то у меня сомнения что симулятор создаст необходимые условия, хотя проверить код на наличие ошибок и опечаток это тоже польза

Ссылка на комментарий
Поделиться на другие сайты

Если честно, то мне кажется код не заработает. Мои изменения не совсем полны. Я лишь дал направление, но все-же придется еще доработать. Например обработка позиции в буфере, проверка буфера на достижение окончания данных. Придется поработать с индексным регистром для вычисления позиции. Что еще меня "смущает", так это отсутствие в Меге32 некоторых служебных регистров, которые используются в коде. Например, EICRA, EIMSK, UCSR0B и др. Надо еще раз внимательно все проверить.

Ссылка на комментарий
Поделиться на другие сайты

прошивки на мегах пыйдее взаимозаменяемые, пробуйте...

Ну разводка наверное уже не поменяется с изменением кода,

порты B - светодиоды 1-8

порты A светодиоды 9-16

C - 17-24

D - D0 - датчик разрыв начала отображения

____D1 - светодиод 25

____D2 - оптоприёмник изображенрия

____D3.... - оставшиеся светодиоды

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

shev377, твоя задумка понятна, но... Ты делаешь визуальный эффект, а поэтому все задержки вывода изображения на вращающемся дисплее будут очень заметны. Это будет выглядеть как ступенчатое смещение изображения в каждом столбце. Все лишние такты МК при обработке кода будут вносить задержку между выводом в порты. Может быть взять Мегу8, добавить 4 (или более) тактируемых регистров. Делать в них запись столбца (через один порт), а потом включать их разом. Конечно, "веселее" было бы брать по 2 регистра на слово. Тогда, пока в первую четверку (столбец) пишется новая инфа, вторая будет отображать предыдущий столбец. После полной записи столбца, одним тактом переносить его во второй блок регистров, занимающийся видоевыводом на светодиоды. Конечно, это усложняет схему, но сам эффект будет четче. А можно поискать более подходящую периферию для этого и упростить схему.

Ссылка на комментарий
Поделиться на другие сайты

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

Сверху вариант Геннадия

Снизу конечный "неоптимизированный" вариант

C:\Program Files\Atmel\AVR Tools\AvrAssembler\tavrasm.122>tavrasm -l programma.a
sm -o programma.hex
C:\Program Files\Atmel\AVR Tools\AvrAssembler\tavrasm.122\m32def.inc:364: Error
: Expected ID = expression
C:\Program Files\Atmel\AVR Tools\AvrAssembler\tavrasm.122\m32def.inc:364: '.equ
OR      =3              ; old name kept for compatibilty'
programma.asm:84: Error : Undefined variable referenced in address
programma.asm:84: '  sts TIMSK1,t'
programma.asm:93: Error : Undefined variable referenced in address
programma.asm:93: '  sts EICRA,t'
programma.asm:96: Error : Undefined variable referenced in I/O port address
programma.asm:96: '  out EIMSK,t          ;enable INT0'
programma.asm:101: Error : Undefined variable referenced in address
programma.asm:101: '  sts UCSR0B,t         ;interrupt on RX complete enable,RX e
nable'
programma.asm:104: Error : Undefined variable referenced in address
programma.asm:104: '  sts UCSR0C,t         ;8-bit character'
programma.asm:107: Error : Undefined variable referenced in address
programma.asm:107: '  sts UBRR0H,t'
programma.asm:109: Error : Undefined variable referenced in address
programma.asm:109: '  sts UBRR0L,t         ;14400bps'
programma.asm:187: Error : Invalid register or immediate
programma.asm:187: 'subi r25,r3'
programma.asm:189: Error : Invalid register or immediate
programma.asm:189: 'sbci r24,r2'
programma.asm:191: Error : Register expected
programma.asm:191: 'cp r25,0x0D'
programma.asm:193: Error : Register expected
programma.asm:193: 'cpc r24,0x02'
programma.asm:227: Error : Undefined variable referenced in constant
programma.asm:227: '  lds t,UCSR0A'
programma.asm:228: Error : Undefined variable referenced in bit number
programma.asm:228: '  sbrc t,FE0           ;Error?'
programma.asm:231: Error : Undefined variable referenced in constant
programma.asm:231: '  lds t,UDR0'










C:\Program Files\Atmel\AVR Tools\AvrAssembler\tavrasm.122>tavrasm -l programma.a
sm -o programma.hex -w
m32def.inc:364: Error : Expected ID = expression
m32def.inc:364: '.equ   OR      =3              ; old name kept for compatibilty
'
programma.asm:103: Error : Undefined variable referenced in address
programma.asm:103: '  sts TIMSK1,t'
programma.asm:112: Error : Undefined variable referenced in address
programma.asm:112: '  sts EICRA,t'
programma.asm:115: Error : Undefined variable referenced in I/O port address
programma.asm:115: '  out EIMSK,t          ;enable INT0'
programma.asm:120: Error : Undefined variable referenced in address
programma.asm:120: '  sts UCSR0B,t         ;interrupt on RX complete enable,RX e
nable'
programma.asm:123: Error : Undefined variable referenced in address
programma.asm:123: '  sts UCSR0C,t         ;8-bit character'
programma.asm:126: Error : Undefined variable referenced in address
programma.asm:126: '  sts UBRR0H,t'
programma.asm:128: Error : Undefined variable referenced in address
programma.asm:128: '  sts UBRR0L,t         ;14400bps'
programma.asm:253: Error : Undefined variable referenced in constant
programma.asm:253: '  lds t,UCSR0A'
programma.asm:254: Error : Undefined variable referenced in bit number
programma.asm:254: '  sbrc t,FE0           ;Error?'
programma.asm:257: Error : Undefined variable referenced in constant
programma.asm:257: '  lds t,UDR0'

Изменено пользователем shev377
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Да. Если нет задачи сбрасывать конденсаторы именно мосфетом и скорость оптопары устраивает -  идеально.
    • Ну понятно, вам так проще, да и понимание что и как будет менее абстрактным. У вас после приема есть массив символов rx_buf, представляющий собой строку, например: "AT+M2\r\n". Вам нужно эту строку сравнить с другой. Следовательно у вас будет функция, получающая два аргумента (массива строк). Один массив полученная строка, второй строка с которой нужно сравнить. Внутри функции вам нужно сравнивать байт за байтом, перебирая весь массив rx_buf и если все символы совпали вернуть из функции 1, если хоть один из символов не совпал, можно прерывать выполнение функции и возвращать 0. Попробуйте реализовать этот алгоритм.
    • Вот здесь надеюсь поможешь. Вот из за чего и поднимался весь этот вопрос с UART что какой то приём тут не полноценный получился вначале. Это для меня очень сложно с функциями, а тем более библиотеками ещё сложней. Далеко не каждая библиотека встаёт в программу и начинаются ошибки в следствии этого. Поэтому я конечно выберу вариант с функцией и без библиотек. Весь код в одном файле. Когда несколько файлов тоже какие то ошибки часто вылетают.
    • Я нигде и не говорил о 250 ваттах.  Именно из-за никой мощности и хотел соединить мостом.
    • Подключайте. Только не забывайте что у вас получится инверсный сигнал управления.
    • Подключал сегодня к плате защиты акустику (как оно должно быть собственно). Хлопка на старте нет - реле включает АС после 3 сек и этого достаточно. Выводные провода подключил на плате в amp и gnd, акустический прикрутил к терминалам. Единственно что - есть небольшой фон при простое, но его не слышно с музыкой. Может от длинных проводов какие то наводки ловит. Не знаю. Музыку подавал с телефона через кабель. Хочу сказать спасибо всем кто помогал мне разобраться с проблемой! Второй канал к сожалению проверить пока не могу - он в ремонте.    
×
×
  • Создать...