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

 
 
> Непонятки с USART в mega162
golovin
сообщение Jun 27 2007, 13:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012



Добрый день!

Есть такая прога :
Код
.include "m162def.inc"

.dseg

DataIn:    .BYTE 1

.cseg
    .org $000

    rjmp    RESET    
    .org $022
    rjmp TC0Proc

    .org $026    ;прерывание по сигналу принятых данных USART0
    rjmp Uart0_Rx
; переименование регистров
.def    temp1            =r16        
.def    temp2            =r17
.def    blink            =r18
.def    ButPress        =r19
.def     CountInOut        =r20
.def     Count            =r21
.def     Tx_Now            =r22
.def     preByte            =r23
.def     CurData            =r24
.def     s1                =r25

RESET :

    cli

    ldi temp1,LOW(RAMEND)        ; установка стекa
    out spl,temp1
===>       ldi temp1,High(RAMEND)        ; установка стекa
    out sph,temp1

    rcall UART0_Init

    ldi temp1, $FF
    out DDRB, temp1                ; порт B - весь на выход
    out PortB, temp1
    out DDRC, temp1                ; порт C - весь на выход
    ldi temp1, $F0
    out PortC, temp1
    ldi temp1, $00
    out DDRA, temp1                ; порт A - весь на вход
    ldi temp1, 0b00000010
    out TIMSK, temp1        ; разрешение прерывания по переполнению Т/С0
    ldi Blink, 0
    ldi ButPress, 0
    ldi CountInOut, 1
    ldi Count, 0
    ldi CurData, 0
    ldi s1, 0
    ldi Tx_Now, 0
    ldi yl, Low(DataIn)
    ldi yh, High(DataIn)

    sei

    nop
    nop
    nop
    nop
main:                            ; ОСНОВНОЙ ЦИКЛ
    rjmp main

; Инициализация UART
UART0_Init:

; Set baud rate
    ldi temp1, 0
    out UBRR0H, temp1    
    ldi temp1, 71                ; 9600 при 11,0592
    out UBRR0L, temp1

    ldi temp1, 0b11111000
    out UCSR0B, temp1

    ldi temp1, 0b10000111
    out UCSR0C, temp1
ret


Если в Studio проводить отладку, то сразу после sei программа перескакивает по АДРЕСУ строки
ldi temp1,High(RAMEND) (т.е. это не связанно со стеком). Если убрать инициализацию USART, то всё работает нормально. Соответственно в девайсе, по моему, происходит тоже самое.
Помогите кто чем может.
Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
IceS
сообщение Jun 27 2007, 14:46
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 17-10-06
Из: Санкт Петербург
Пользователь №: 21 387



Код
    .org $026;прерывание по сигналу принятых данных USART0
    rjmp Uart0_Rx
    reti
    reti
    reti
    reti
; переименование регистров

Если в код добавить выше описанную конструкцию то шагать будет на последний reti.
У тебя прерывание какое-то происходит (какое именно не разбирался).
Или инициализируй все вектора прерываний (хотя бы reti) или запрещай все прерывания кроме тех у которых есть обработчики.
А еще может быть не правильно адреса обработчиков расставлены .org $026
В m162def.inc есть INTERRUPT VECTORS исользуй их, а не прямые адреса.
Go to the top of the page
 
+Quote Post
ae_
сообщение Jun 27 2007, 15:05
Сообщение #3


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Вы разрешаете прерывание "USART0 Data Register Empty", вот оно и происходит по адресу 0x2A.
Там следовало бы указать переход на п/п передачи следующего байта, но вы там разместили код инициализации стека. Поэтому лучше всегда начинать программу после векторов прерываний:

.org INT_VECTORS_SIZE
reset:
Go to the top of the page
 
+Quote Post
crowler
сообщение Jun 27 2007, 15:25
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 27-06-07
Пользователь №: 28 745



[Длинное ненужное цитирование удалил, читайте правила! IgorKossak]

Делал сетку на ModBus RTU и покувыркался с USART. Отсюда и замечания:
1. В таблице прерываний используйте не RJMP, а JMP (прерывание использует двойное слово адреса)
2. В прерывании обработки опустошения буфера передатчика, запретите прерывание по опустошению
и установите "мой флаг требования загрузки передатчика".

Сообщение отредактировал IgorKossak - Jun 27 2007, 19:50
Go to the top of the page
 
+Quote Post
golovin
сообщение Jun 28 2007, 08:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012



Всем спасибо за ответы.
Переделал прямые адреса на те, которые описаны в .inc, всё заработало.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Jun 28 2007, 09:14
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



На всякий случай: первые 256 байт в ОЗУ занимают копии регистров, так что хранить данные можно начиная с адреса 0x100.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 10:17
Рейтинг@Mail.ru


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