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

Port szeregowy i przerwanie

05 Lip 2006 19:00 1878 9
  • Poziom 15  
    Witam
    Pytanie moje brzmi , jak w bascomie zrobić , by procesor po odebraniu bajtu przez port szeregowy natychmiast odczytał , co to za bajt i od niego uwarunkował dalsze działenia. Dodam że procesor musi cały czas zajmowac się czymś innym. Wiem ze trzeba jakoś zapiąć do tego przerwanie od odbioru
    portu szeregowego , ale nie wiem jak to w bascomie zrobic. Dokładnie ma to wyglądać tak , że jeden porocesor coś sobie robi , a drugi poprzez port szregowy mowi mu co ma robic

    pozdrawiam Tasior
  • VIP Zasłużony dla elektroda
    włączasz przerwanie (kody dla FastAVR)
    Code:
    Declare Interrupt Urxc()
    
    Enable Interrupts
    Enable Urxc


    i czekasz na odebranie danych:
    Code:
    Interrupt Urxc()
    
    bufor=UDR
    End Interrupt
  • Poziom 15  
    ale jak to zrobic w bascomie ?
    narazie po odebraniu pierwszego bajtu , procek nie reaguje na następne
  • Moderator Programowanie
    Spróbuj czegoś takiego :
    Code:
    On Urxc Przerwa ' deklaracja procedury obsługi przerwania
    
    Enable Interrupts
    Enable Urxc

    Przerwa: ' przerwanko
    ' tu robisz z danymi to co chcesz
    Return ' RETI
    Return ' powrót z przerwania do normalnego programu
  • Poziom 15  
    oki sprubuje , chodzi o at mege 32

    wiec to też nie działa ... a jak wysyłam cały czas ze sterownika "input dana" a na pilocie ( na urządzeniu sterującym ) print dana to sie wiesza po pierwszym bajcie

    na kompie w terminalu urządzenie nadrzędne ładnie nadaje dane a urządzenie podrzędnie ładnie pobiera je z terminala , ale razem nie gadają
  • Moderator Programowanie
    Napisałem i wgrałem do ATMEGA16L (tylko taki mam na stanie :) ) coś takiego :
    Code:
    $baud = 1200
    
    $crystal = 1000000
    Enable Urxc
    Enable Interrupts
    On Urxc Przerwa
    Dim I As Byte

    Do
    Loop

    Przerwa:
    I = Udr
    Print "Wartosc = " ; I ' do testów czy cos odbiera
    Print "Znak    = " ; Chr(i) '  do testów czy cos odbiera
    Return
    End 

    Wszystko działa aż miło.
    Testowane z terminalem pod XP, ale to nie powinno stanowić różnicy.
    Pokombinuj też z $baud , przy 9600 ( u mnie, brak kwarcu itd. ) wypisywał mi straszne głupoty.
    Jeżeli nie zadziała, to rozkładam ręce :) Może coś w sprzęcie?
  • Poziom 15  
    no i działa ładnie , mój błąd polegał na tym , że nie wysyłałem danych instrukcją printbin i na drugim procku otrzymywałem wartosci w postaci kodu ASCII . Mam jeszcze jedno pytanie , jak tym sposobem odebrać kilka danych jednocześnie , czyli jak odebrać wartości od instrukcju printbin a ; b ; c ??
  • Pomocny post
    Moderator Programowanie
    Ustalasz długość odbieranych danych np. 2 bajty, wstawiasz licznik odliczający do 2 :) i łapiesz jeden bajt, potem drugi,
    Kasujesz licznik i od nowa :) wysyłasz następne 2 bajty itd. ...
  • Poziom 15  
    Bardzo dziękuję , kolega Arnoldziq bardzo mi pomógł :)