реклама на сайте
подробности

 
 
> Мультипроцессорные режим ATmega88/168
Dёня
сообщение Oct 8 2008, 08:00
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 31-08-06
Пользователь №: 19 981



Здравствуйте господа!

На шине один передающий контроллер (PIC18F252, 10MHz+PLL), один принимающий (ATmega168, 20MHz). Установлен режим мультипроцессорный:
Должно быть:
мега принимает свой адрес, распознает его, выставляет прием данных (lds rh_ucsra, UCSR0A; andi rh_ucsra, ~(1 << MPCM0); sts UCSR0A, rh_ucsra) и далее принимает блок данных длиной 256 байт, после приема запрещает прием данных.
Что выходит:
мега распознает адрес... принимает данные, причем принимает только первых 89 (!) байт и далее перестает принимать данные, затем опять принимает свой адрес, причем у него установлен (!) бит MPCM0. Распознает адрес, сбрасывает MPCM0, и т.д.
Бит MPCM0 я не выставляю, т.к. выставляется он только при условии приема 256-ти байт.
Скорости обмена выставлял в разных диапазонах - от 19.2К до 1.25М.
Пробовал и по UARTу непосредственно и по RS485.
Данные при приеме не искажаются (проверяю цифровым осциллографом 100MHz), в контроллере 89 принятых байт верные.
Алгоритм передачи-приема работает в симуляторе при любых скоростях...
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
_dem
сообщение Oct 8 2008, 08:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Код в студию, может быть не там копаете, и ошибка в распределении памяти ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 8 2008, 08:36
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Dёня @ Oct 8 2008, 12:00) *
Установлен режим мультипроцессорный.

А может ну его это режим.
И по старинке modbus?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dёня
сообщение Oct 8 2008, 09:06
Сообщение #4





Группа: Новичок
Сообщений: 7
Регистрация: 31-08-06
Пользователь №: 19 981



Вот исходник...
Прикрепленные файлы
Прикрепленный файл  proj.asm.txt ( 6.93 килобайт ) Кол-во скачиваний: 72
Прикрепленный файл  proj.inc.txt ( 2.37 килобайт ) Кол-во скачиваний: 48
 
Go to the top of the page
 
+Quote Post
Dёня
сообщение Oct 8 2008, 11:23
Сообщение #5





Группа: Новичок
Сообщений: 7
Регистрация: 31-08-06
Пользователь №: 19 981



Те кто применял адресуемый UART,
вообще, принимает ATmega88/168 блоки данных, больше 100 байт??!?
Go to the top of the page
 
+Quote Post
GDI
сообщение Oct 8 2008, 11:39
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А даташит и эррата что ан этот счет говорят?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Oct 8 2008, 12:05
Сообщение #7


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Принимает без проблем, что-то у вас не то в коде...
Я использовал этот режим в обмене данными между модулями, все было без затык, размеры пакетов были от 16 до 150 байт.
Правда, использовалась связка Atmega64 -> Atmega8
Но между 8 и 88 мегами разница не глобальная, насколько я помню smile.gif
Go to the top of the page
 
+Quote Post
Dёня
сообщение Oct 8 2008, 12:22
Сообщение #8





Группа: Новичок
Сообщений: 7
Регистрация: 31-08-06
Пользователь №: 19 981



Эратты я не встречал на эти камни, а в даташите про адресуемый UART всего-то пару абзацев.
В пике похожим образом построен UART - там принимает по 256 байт, но производительности пика не хватает для проекта...
Кстати в даташите не все понятно: когда ведомый не получил все данные и не установил MPCM, и следующим байтом идет адрес, MPCM сам выставляется?!?!
Go to the top of the page
 
+Quote Post
Николай Иванович...
сообщение Oct 8 2008, 12:43
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



MPCM сбрасывается автоматом только при получении адресного байта (т.е. байта с установленным 9-м битом). А устанавливать его (ну в смысле бит MPCM (так же как и 9-й бит при передаче)) надо ручками. Вот и весь сказ. Что теперь не понятно? Какие-то ещё проблемы остались?

Сообщение отредактировал Николай Иванович Приходько - Oct 8 2008, 12:47
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Oct 8 2008, 12:57
Сообщение #10


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Нет, сам не выставляется. Бит MPCM должена устанавливать и очищать сама программа.
Смысл в следующем: устанавливаете этот бит и ждете прерывания от УАРТа (или просто ждете приема символа). Пока по шине не пройдет байт адреса (с выставленным старшим битом), УАРТ ничего не примет. Приняли байт адреса, сравнили со своим адресом, если совпал - очищаете бит MPCM и дальше принимаете весь пакет данных - фиксированной длины или переменной, но тогда в начале пакета должна быть обозначена его полная длина. Приняли пакет данных, опять установили бит MPCM и ждете следующего приема байта.
В процессе приема можно контролировать принимаемые данные на установленный старший бит в очередном принятом байте - флаг RXB8 в регистре UCSRB. Если установлен - значит пришел байт адреса, следовательно по каким-то причинам принят не весь пакет данных. Тогда действуете как Вам удобнее - или сразу сравниваете пришедший адрес со своим и далее как описывалось, или рапортуете хосту об ошибке...

Цитата
MPCM сбрасывается автоматом только при получении адресного байта (т.е. байта с установленным 9-м битом)

Где описано такое поведение этого флага?
Go to the top of the page
 
+Quote Post
Dёня
сообщение Oct 8 2008, 13:17
Сообщение #11





Группа: Новичок
Сообщений: 7
Регистрация: 31-08-06
Пользователь №: 19 981



Спасибо за разъяснение, впринципе так я и полагал:

Код
    lds    rh_ucsra, UCSR0A
    lds    rh_ucsrb, UCSR0B
    lds    rh_udr, UDR0

    sbrs    rh_ucsrb, RXB80
    rjmp    UARTInt_Data

UARTInt_Address:
UARTInt_Address_Err:
    ldi    rh_dataInt, BUFFER_bUART_SIZE
    cp    rl_countUARTRx, rh_dataInt
    breq    UARTInt_Address_Err_

Point1:
    sbr    rh_flags, 1 << BUFFER_bUART_RECEIVE_ERROR
    rjmp    UARTInt_
UARTInt_Address_Err_:

    cpi    rh_udr, MODULE_bADDRESS
    brne    UARTInt_

    andi    rh_ucsra, ~(1 << MPCM0)
    sts    UCSR0A, rh_ucsra
    rjmp    UARTInt_
UARTInt_Address_:

UARTInt_Data:
    st    rx+, rh_udr
    dec    rl_countUARTRx
    brne    UARTInt_

Point2:
    sbr    rh_flags, 1 << BUFFER_bUART_READ_DONE
    
    ori    rh_ucsra, 1 << MPCM0
    sts    UCSR0A, rh_ucsra
    rjmp    UARTInt_
UARTInt_Data_:
UARTInt_:


До точки Point2 прога доходит только если принимается < 90 байт
Если например ставить прием 100 байт из 256 приходящих то в точке Point1 rl_countUARTRx == 11
Go to the top of the page
 
+Quote Post
Николай Иванович...
сообщение Oct 8 2008, 13:24
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Цитата(AndyBig @ Oct 8 2008, 16:57) *
Где описано такое поведение этого флага?

Ой. И правда облажался. Действительно и сбрасвать его тоже ручками надо. Ентот MPCM. Прошу прощения, дядько. smile.gif И на старуху бывает проруха
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Oct 8 2008, 16:03
Сообщение #13


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Сорри, в ассемблере совсем не силен smile.gif
Go to the top of the page
 
+Quote Post
Николай Иванович...
сообщение Oct 8 2008, 17:49
Сообщение #14


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Цитата(Dёня @ Oct 8 2008, 17:17) *
До точки Point2 прога доходит только если принимается < 90 байт
Если например ставить прием 100 байт из 256 приходящих то в точке Point1 rl_countUARTRx == 11

А где Вы инИтите rl_countUARTRx ?
Go to the top of the page
 
+Quote Post
Dёня
сообщение Oct 8 2008, 20:11
Сообщение #15





Группа: Новичок
Сообщений: 7
Регистрация: 31-08-06
Пользователь №: 19 981



Инициализация счетчика в начале программы:
Код
Main_Init_UART:
; Addressed UART, Receive only (9 bit), 1Mbaud(1.25Mbaud)
    ldi    rh_init, 0
    sts    UBRR0L, rh_init
    sts    UBRR0H, rl_zero
    ldi    rh_init, 1 << MPCM0
    sts    UCSR0A, rh_init
    ldi    rh_init, 1 << RXEN0 | 1 << RXCIE0 | 1 << UCSZ02
    sts    UCSR0B, rh_init
    ldi    rh_init, 0b11 << UCSZ00
    sts    UCSR0C, rh_init
Main_Init_UART_:

И в подпрограммах:
Код
Main_BufferUARTSwap:    
    sbrs    rh_flags, BUFFER_bUART_READ_DONE
    rjmp    Main_BufferUARTSwap_

    rcall    BufferUARTSwap
Main_BufferUARTSwap_:

Main_BufferUARTError:
    sbrs    rh_flags, BUFFER_bUART_RECEIVE_ERROR
    rjmp    Main_BufferUARTError_
    
    cbr    rh_flags, 1 << BUFFER_bUART_RECEIVE_ERROR
    rcall    BufferUARTReset
Main_BufferUARTError_:

;*******************************

BufferUARTSwap:
; swap Rx<->Tx
    movw    rh_init, rl_pointUARTRx
    movw    rl_pointUARTRx, rl_pointUARTTx
    movw    rl_pointUARTTx, rh_init
; pointRx->indexRx
    movw    rh_indexUARTRx, rl_pointUARTRx
; pointTx->indexTx
    movw    rh_indexUARTTx, rl_pointUARTTx

    ldi    rh_init, BUFFER_bUART_SIZE
    mov    rl_countUARTRx, rh_init

    cbr    rh_flags, 1 << BUFFER_bUART_READ_DONE
    sbr    rh_flags, 1 << BUFFER_bUART_WRITE_DONE

BufferUARTSwap_:
    ret

BufferUARTReset:
    movw    rh_indexUARTRx, rl_pointUARTRx

    ldi    rh_init, BUFFER_bUART_SIZE
    mov    rl_countUARTRx, rh_init

BufferUARTReset_:
    ret
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016