Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятки с USART в mega162
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
golovin
Добрый день!

Есть такая прога :
Код
.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, то всё работает нормально. Соответственно в девайсе, по моему, происходит тоже самое.
Помогите кто чем может.
Спасибо
IceS
Код
    .org $026;прерывание по сигналу принятых данных USART0
    rjmp Uart0_Rx
    reti
    reti
    reti
    reti
; переименование регистров

Если в код добавить выше описанную конструкцию то шагать будет на последний reti.
У тебя прерывание какое-то происходит (какое именно не разбирался).
Или инициализируй все вектора прерываний (хотя бы reti) или запрещай все прерывания кроме тех у которых есть обработчики.
А еще может быть не правильно адреса обработчиков расставлены .org $026
В m162def.inc есть INTERRUPT VECTORS исользуй их, а не прямые адреса.
ae_
Вы разрешаете прерывание "USART0 Data Register Empty", вот оно и происходит по адресу 0x2A.
Там следовало бы указать переход на п/п передачи следующего байта, но вы там разместили код инициализации стека. Поэтому лучше всегда начинать программу после векторов прерываний:

.org INT_VECTORS_SIZE
reset:
crowler
[Длинное ненужное цитирование удалил, читайте правила! IgorKossak]

Делал сетку на ModBus RTU и покувыркался с USART. Отсюда и замечания:
1. В таблице прерываний используйте не RJMP, а JMP (прерывание использует двойное слово адреса)
2. В прерывании обработки опустошения буфера передатчика, запретите прерывание по опустошению
и установите "мой флаг требования загрузки передатчика".
golovin
Всем спасибо за ответы.
Переделал прямые адреса на те, которые описаны в .inc, всё заработало.
ahulap
На всякий случай: первые 256 байт в ОЗУ занимают копии регистров, так что хранить данные можно начиная с адреса 0x100.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.