Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

usart atmega 128 nic nie wysyła na TxD

att55 22 Maj 2012 07:55 2036 3
  • #1 22 Maj 2012 07:55
    att55
    Poziom 2  

    Może ktoś pomoże, dlaczego usart atmega 128 nie wysyła nic na wyjście RS TxD.
    Uart jest ustawiony, po wpisie do UDR0 nie wychodzi nic na wyjście TxD,
    nie wchodzi również w obsługę przerwania od nadajnika.
    SP.
    oto program:
    [syntax

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0 3
  • #2 22 Maj 2012 15:23
    atom1477
    Poziom 43  

    To:

    att55 napisał:

    ldi r16, (1<<RXCIE0) | (1<<RXEN0) | 1<<TXEN0

    Nie powinno być w nawiasie? Nie wiem jaki to kompilator, może ten nie akceptuje tego bez nawiasów.

    I tutaj:
    att55 napisał:

    ldi r17, 0x00
    ldi r16, USART_Speed ;transmisja 4800 b/s


    ldi r16, 0x00
    sts UCSR0A, r16

    ldi r16, (1<<RXCIE0) | (1<<RXEN0) | 1<<TXEN0
    sts UCSR0B, r16 ;włączenie odbiornika RS + przerwania

    ldi r16, (1 << URSEL) | (1<<UCSZ01) | (1<<UCSZ00)
    sts UCSR0C, r16 ;ustawienie 8bitów, jeden bit stopu

    sts UBRR0H, r17
    sts UBRR0L, r16 ;ustawienie transmisji
    na 4800

    Wpisujesz prędkość do R17:R16, ale później nadpisujesz te rejestry innymi wartościami zanim wpiszesz je do rejestrów UBRRH:UBRRL.
    I wtedy zapisujesz jakieś śmieci do UBRR.
    Możliwe też że bit URSEL jest wtedy ustawiony i nawet śmieci nie zapisujesz, bo ustawiony bit URSEL przekierowuje Ci zapis do UCSRC.
    Jak by nie było wartość UBRR będzie zła.

    0
  • #3 22 Maj 2012 17:36
    att55
    Poziom 2  

    Dziękuję za zainteresowanie moim problemem.
    W ferworze walki poplątałem wiersze, ale było dobrze jak jest teraz i problem nadal
    istnieje. Program piszę w studio4, nazwy bitów były umieszczone w nawiasach i bez
    też nie pomogło.
    SP
    oto program:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    0
  • #4 30 Maj 2012 15:04
    LordBlick
    VIP Zasłużony dla elektroda

    1. Czemu służy ustawianie flagi przeniesienia w przerwaniu, po co w ogóle je włączasz, skoro nie obsługuje ono transmisji i po powrocie natychmiast jest wywoływane z powrotem ?
    2. Czemu używasz liczb przy ".org" zamiast zdefiniowanych nazw w "m128def.inc" ?
    Przykład definicji z w/w pliku:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Uzycie tej definicji:
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    3. Czemu zamiast "ldi r16, 0x0b" czytelniej byłoby "ldi r16, (1<<PD0)|(1<<PD1)|(1<<PD3)" ? (nawiasy używaj zawsze...)
    4. Nie prościej użyć makra samodzielnie obliczającego UBBR ? (zakładam, ze używasz avrasm2)
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    5. Co użyłeś, aby stwierdzić, że "nie działa" ?

    0