logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AT89C4051: UART wchodzi w przerwanie bez powodu, Bascom, oscylacje na RXD

kleki 17 Maj 2009 19:32 1351 6
REKLAMA
  • #1 6541890
    kleki
    Poziom 28  
    Posty: 1350
    Pomógł: 95
    Ocena: 142
    Mam pewien drobny kłopocik z UART-em w 89C4051. Piszę w jedynie słusznym Bascom, sprzętową stronę przedsięwzięcia sprawdzałem trzy razy.

    Do rzeczy:
    $large
    $crystal = 12000000
    $baud = 300
    Dim X As Byte
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7 , E = P1.3 , Rs = P1.2
    Config Timer0 = Timer , Gate = Internal , Mode = 2
    
    
    Cursor Off
    
    Cls
    Lcd "test dzialania UART"
    Wait 1
    
    Enable Serial
    Enable Interrupts
    On Serial Wyswietl Nosave
    
    Do
    Lcd "komunikuje..."
    Loop
    
    Wyswietl:
    Cls
    Lcd "int "
    Input X , Noecho
    Disable Interrupts
    Lcd X
    Wait 1
    Return


    Rzecz w tym, że pojawia się "test działania UART", później mikroklocek momentalnie wskakuje w obsługę jego przerwania. Pomiar napięcia na nóżce P3.0/RXD ujawnia stan wysoki. Próba wysłąnai znaków z terminala - daje się zaobserwować oscylogram. Mikroklocek mimo wszystko cały czas próbuje obsłużyć przerwanie z UART-a.

    Może znajdzie się ktoś, kto miał podobny przypadek? Na razie myślimy z kumplem na dwie głowy, ale nadal zima... Może to już starość?

    Z góry dzięki za pomoc.
  • REKLAMA
  • #2 6545590
    J_Bravo
    Poziom 28  
    Posty: 1373
    Pomógł: 36
    Ocena: 161
    Myślę że 300 baud przy 12MHz jest raczej nierealne .... zmień prędkość albo zmień kwarc ...
  • REKLAMA
  • #3 6551551
    kleki
    Poziom 28  
    Posty: 1350
    Pomógł: 95
    Ocena: 142
    Próby z prędkością 9600 również niepomyślnie. Nadawanie z prędkością 300 baud świetnie wychodzi na tym konkretnie kwarcu.
    Szukam czegoś dalej, jak zadziałą dam znać.

    pzdr
  • REKLAMA
  • #4 6561101
    J_Bravo
    Poziom 28  
    Posty: 1373
    Pomógł: 36
    Ocena: 161
    A może zamiast input użyjesz inkey ??

    Co ci sie na wyświetlaczu wyświetla ?
  • REKLAMA
  • #5 6561119
    kleki
    Poziom 28  
    Posty: 1350
    Pomógł: 95
    Ocena: 142
    Na LCD mam tylko
    "int ", ale znalazłem już rozwiązanie problemu - kłopot w tym, że nie wiedziałem, że powinienem sam wyzerować bit scon.0.

    Problem rozwiązany. Dzięki za pomoc.
  • #6 6621268
    sq6ade
    Poziom 40  
    Posty: 6855
    Pomógł: 482
    Ocena: 284
    J_Bravo napisał:
    Myślę że 300 baud przy 12MHz jest raczej nierealne .... zmień prędkość albo zmień kwarc ...


    Ciekawe dlaczego?

    Dla wpisu w TH1 wartości 98H prędkość uarta wynosi około 300,48 bps przy 12.000000MHz
    Czyli pasi.

    Klekuś - wylecz się z BASDOWNA ;)
  • #7 6624569
    kleki
    Poziom 28  
    Posty: 1350
    Pomógł: 95
    Ocena: 142
    Już mu dałem rady. Dałem sobie spokój z irq, zrobiłem skanowanie flagi i cześć. ;-) Czemu mam dać sobie spokój z Bassromem?

    Daje się zaprogramować i spoczko. Jak na '51 to może być. Nawet PIC-ki programuję w Basicu, tylko jak potrzeba pałera z ARM7 to warto zainteresować się C. Wydaje mi się, że jakpotrzeba zrobić licznik czy coś równie mało ambitnego, to Bascom w zupełności wystarczy.

    pzdr

Podsumowanie tematu

✨ Problem dotyczył nieoczekiwanego wywoływania przerwania UART w mikrokontrolerze AT89C4051 przy pracy z Bascom i kwarcem 12 MHz oraz prędkością transmisji 300 baud. Pomiar na linii RXD wskazywał stan wysoki, a mikrokontroler stale obsługiwał przerwanie UART, mimo że sygnał z terminala był widoczny na oscyloskopie. Próby zmiany prędkości na 9600 baud nie przyniosły poprawy, jednak nadawanie przy 300 baud działało poprawnie na tym kwarcu. Ostatecznie rozwiązaniem okazało się ręczne zerowanie bitu SCON.0 (RI) w procedurze obsługi przerwania, co zapobiegło ciągłemu wywoływaniu przerwania. Dyskusja zawierała także sugestię zastąpienia funkcji INPUT funkcją INKEY do odczytu danych z UART oraz uwagi dotyczące konfiguracji rejestru TH1 dla uzyskania właściwej prędkości transmisji. Autor zdecydował się zrezygnować z obsługi przerwań na rzecz skanowania flagi odbioru, co w jego zastosowaniu okazało się wystarczające.
Wygenerowane przez model językowy.
REKLAMA