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

89c2051, rs232, przerwania - juz nie moge! pomocy!

relbmesa 27 Lut 2005 00:20 1994 8
REKLAMA
  • #1 1269598
    relbmesa
    Poziom 2  
    Posty: 3
    Witam,
    Chcialem sobie napisac programik w bascomie do komunikacji po rs232.
    Najpierw poczytalem doc i napisalem prosty programik:
    
    $crystal = 4433619
    $regfile = "89c2051.dat"
    $baud = 2400
    
    
    Open "com3.1:2400" For Output As #1
    Open "com3.0:2400" For Input As #2
    
    S = "test this"
    Dum = Len(s)
    For I = 1 To Dum
    
      A = Mid(s , I , 1)
      Put #1 , A
    Next
    
    Do
      Get #2 , A
      Put #1 , A
    '  Print A  - wyremowalem bo wychodzily krzaczki ?!
    Loop
    
    
    Close #1
    Close #2
    End
    


    Po wyremowaniu PRINT A wszystko ladnie chodzilo. Jak wyrzucilem cos na COM'a to dostawalem to samo (echo).

    Potem chcialem napisac sobie programik ktory wykonuje sobie cos tam w tle i czeka na nadeslanie czegos z COM'a i przerywa program skaczac do podprogramu... i tu zaczely sie schody. Siedze nad tym juz drugie popoludnie i nic. Juz nie moge:
    
    
    $crystal = 4433619
    $regfile = "89c2051.dat"
    $baud = 2400
    
    Dim I As Byte
    Dim Znaki(19) As Byte
    Dim Licznik As Byte
    Licznik = 0
    Enable Interrupts
    Enable Serial
    Open "com3.1:2400" For Output As #1
    Open "com3.0:2400" For Input As #2
    On Serial Odbierz                                          przerwanie
    Do
    
    
    Loop
    
    close #2
    close #1
    End
    
    Odbierz:
    Disable Interrupts
    Disable Serial
    Znaki(licznik) = Inkey()
    Incr Licznik
    If Licznik = 20 Then
    Licznik = 0
    End If
    Enable Serial
    Enable Interrupts
    Return
    
    

    Programik znalazlem na forum ale niestety nie chodzi:( Z tego co sprawdzalem to w ogole nie wpada do przerwania. Juz nie mam sily do tego.
    Chcialem napisac program ktory np do tablicy zaduje np 5 znakow, a potem w programie glownym mozna sie nimi bawic i odpowiednio interpretowac. Czy moglby mi ktos pomoc napisac taki programik (ew. poprawic ten wyzej ) z gory wielkie dzieki
  • REKLAMA
  • #2 1270771
    relbmesa
    Poziom 2  
    Posty: 3
    hmmm, czyzby to bylo tak proste ze nikomu sie nie chce odpowiadac ??
  • REKLAMA
  • #3 1270954
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Sugeruje napisać co się dzieje z podanym wyżej programem.
  • #4 1271256
    relbmesa
    Poziom 2  
    Posty: 3
    Program II:
    Podczas symulacji zaraz na stacie jest skok do podprogramu odbierz (wartosc scon=0x52). Nastepuje wyskoczenie z podprogramu
    Potem w symulacji reaguje na przerwanie i wskakuje do podprogramu odbierz ale po zaprogramowaniu procka nie wskakuje (wprowadzilem sobie mala instukcje ktora mruga dioda - dioda nie mrugala wiec w ogole nie wskoczyl do funkcji)
    Juz prubowalem wszystkiego i nie mam juz do tego ani nerwow ani sily. Teoretycznie program powinien dzialac a nie dziala, nie wiem czemu
  • REKLAMA
  • #5 1271364
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    Ja proponuję dodać jedno zaklęcie :wink:
    
    ...
    Licznik = 0
    Reset Scon.0    ' owo zaklęcie
    Reset Scon.1      
    Enable Interrupts 
    ...
    
    Odbierz:
    ...
    Reset Scon.0     '  ponownie zaklęcie 
    Reset Scon.1  
    ...
    


    Piotrek
  • #6 1275045
    Adalber
    Poziom 12  
    Posty: 13
    Bascom 51 przy instrukcjach input,inputbin itd. nie korzysta z przerwań lecz cyklicznie odczytuje rejestr SBUF .Dlatego bardzo rzadko to działa.Jeśli chcesz mieć pewny odbiór to korzystaj z przerwań.
    A-r.
  • REKLAMA
  • #7 1275149
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Witam
    Kiedyś pisałem że nieda sie uruchomić przerwań rs w bascomie. Ostatnio usiadłem nad tym i jakoś mi sie udało ale nie ze standardowymi komendami tylko zoperacjami na rejestrach - coś jak asm. Ale spoko wszystko jest jasne i proste. Doszedłem do tego że jeżeli w programie niema komendy print w jakiej kolwiek formie to kompilator wogóle niezainicjalizuje rs'a. Poniżej któraś z koleji wersja ostatniego mojego problemu - komunikacja po HART - znaczy ma to zasymulować urządzenie dla komputera - narazie odebrana jest ramka danych z zapytaniem z komputera. Przy okazji w programie jest sprytny fragment do wykrywania zbocza sygnału bez używania przerwania - może sie komuś przyda. Acha to sotatnie nie używa komendy debounce więc też nie kożysta z żadnych innych zasobów.
    
    $regfile = "89c2051.dat"
    $crystal = 14745600
    '$crystal = 11059200
    '-------------------------------------------------------------------------------
    Th1 = &HE0                                                    '1200 dla kwarcu 14MHZ
    'Th1 = &HFC                                                    '9600 dla kwarcu 14MHz
    Tmod = &B00100000                                             'tajmer 1 jako baud generator mode 1
    Scon = &B01010000                                             'zalaczenie odbioru i mode 1
    Tcon.6 = 1                                                    'wlaczenie tajmera 1
    On Serial Rs_przerwanie
    Ie = &B10010000                                               'wlacz przerwania i rs
    '-------------------------------------------------------------------------------
    Config Lcd = 16 * 1 : Cursor Off
    Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7 , E = P1.3 , Rs = P1.2
    '-------------------------------------------------------------------------------
    Dim Ala As Byte
    Dim Ela As Byte
    Dim Ola As Byte
    Dim P32_pomoc As Bit
    Dim P37_pomoc As Bit
    Dim Hart_telegram(28) As Byte
    Dim Hart_licznik As Byte
    Dim P35_pomoc As Bit
    Dim Hart_telegram_powrotny(26) As Byte
    '-------------------------------------------------------------------------------
    For Hart_licznik = 1 To 26
       Hart_telegram_powrotny(hart_licznik) = Hart_licznik
    Next Hart_licznik
    Cls : Locate 1 , 4 : Lcd "Test  HART"
    'Wait 1 : Cls
    P32_pomoc = P3.2
    Do
       If P3.2 <> P32_pomoc Then
          If P3.2 = 0 Then                                        'narastajace zbocze sygnalu RTS
             Ie = &B10010000                                      'wlacz przerwania i rs
             Cls : Lcd "RTS aktywny" : Ala = 0 : Ela = 0 : Incr Ola
          Else                                                    'opadjace zbocze sygnalu RTS
             Cls : Lcd "B:" ; Ala ; ",<>FF:" ; Ela ; ",n:" ; Ola
    '         Ie = &B10000000                                      'wylacz przerwanie rs
             Scon.0 = 0 : Scon.1 = 0
             Sbuf = &HFF
          End If
          P32_pomoc = P3.2
       End If
    
       If P3.7 <> P37_pomoc Then
          If P3.7 = 0 Then
             Cls
             If P3.4 = 1 Then
                For Hart_licznik = 1 To 8
                   Lcdhex Hart_telegram(hart_licznik)
                Next Hart_licznik
             Else
                For Hart_licznik = 9 To 16
                   Lcdhex Hart_telegram(hart_licznik)
                Next Hart_licznik
             End If
          End If
          P37_pomoc = P3.7
       End If
    
       If P3.5 <> P35_pomoc Then
          If P3.5 = 0 Then
             Cls
             If P3.4 = 1 Then
                For Hart_licznik = 17 To 24
                   Lcdhex Hart_telegram(hart_licznik)
                Next Hart_licznik
             Else
                For Hart_licznik = 25 To 28
                   Lcdhex Hart_telegram(hart_licznik)
                Next Hart_licznik
             End If
          End If
          P35_pomoc = P3.5
       End If
    Loop
    End
    '-------------------------------------------------------------------------------
    Rs_przerwanie:
      If Scon.0 = 1 Then                                          'przerwanie od odbioru
       If Sbuf <> &HFF Then Incr Ela
       Hart_licznik = Ala + 1
       Hart_telegram(hart_licznik) = Sbuf
       Incr Ala
       Scon.0 = 0
      End If
    
      If Scon.1 = 1 Then                                          'przerwanie od nadawania
         If Hart_licznik < 26 Then
          Sbuf = Hart_telegram_powrotny(hart_licznik)
         Else
          Incr Hart_licznik
         End If
       Scon.1 = 0
      End If
    Return
    '-------------------------------------------------------------------------------
    
  • #8 1277298
    Adalber
    Poziom 12  
    Posty: 13
    Programiki ciekawe ale można jednocześnie używać instrukcji Print i przerwań w Bascomie ,wymaga to pewnego małego zabiegu.
    pzdr
  • #9 1277310
    Dareks
    Poziom 20  
    Posty: 288
    Pomógł: 30
    Ocena: 29
    A cóż to za zabieg?

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z implementacją komunikacji RS232 w Bascomie na mikrokontrolerze Atmel AT89C2051. Autor próbował napisać prosty program do wysyłania i odbierania danych po RS232, który działał poprawnie bez wyświetlania odebranych znaków (usunięcie komendy PRINT). Następnie podjął próbę obsługi przerwań UART, aby program mógł reagować na dane przychodzące w tle, jednak przerwania nie działały po zaprogramowaniu mikrokontrolera (brak wskoku do podprogramu obsługi przerwania, brak migania diody sygnalizującej przerwanie). W odpowiedziach zasugerowano resetowanie bitów SCON.0 i SCON.1 przed i po obsłudze przerwania oraz włączenie przerwań globalnych. Podkreślono, że standardowe instrukcje Bascoma takie jak INPUT czy INPUTBIN nie korzystają z przerwań, lecz cyklicznie odczytują rejestr SBUF, co jest mniej niezawodne. Jeden z uczestników potwierdził, że Bascom nie inicjalizuje UART bez użycia komendy PRINT, co może powodować problemy z przerwaniami. Zaproponowano również rozwiązania oparte na bezpośredniej manipulacji rejestrami mikrokontrolera, przypominające asembler, aby uzyskać stabilną obsługę przerwań RS232. W dyskusji pojawiła się także wzmianka o możliwości jednoczesnego używania instrukcji PRINT i przerwań w Bascomie, wymagającego jednak specjalnego zabiegu konfiguracyjnego.
Wygenerowane przez model językowy.
REKLAMA