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

aplikacja w C++Builder oraz atmega8 USART

pysiorek1985 05 Sty 2009 11:38 1915 5
REKLAMA
  • #1 5952799
    pysiorek1985
    Poziom 10  
    Witam
    Napisalem wstepną aplikacje w C++Builderze która przesyła przez RS232 bajt do atmegi8 a atmega odsyła ten sam bajt z powrotem do uC. Aplikacja w C++ działa co sprawdzałem zwierając TxD i RxD. Odczyt i wysłanie znaku w uP wykonuje poprzez przypisanie:
    zmienna=UDR
    UDR=zmienna
    Działanie sprawdzałem także na RS232Tester v0.77. Podczas wysyłania kolejnych cyfr występowało jakby przeskoczenie czego nie potrafie zupel;nie wytłumaczyć:
    zadane wartosci wartosci otrzymane
    1 253
    2 254
    3 255
    4 196 !!!!!
    Czy ktoś mógłby mi doradzić co się z nim dzieje, skąd to nagłe przeskoczenie. Błąd ten widać podczas kiedy ma nastapic zmiana przy kolejnych potegach 2. Probiwalem takze funkcje print w Bascomie ale wysyla ona nieco wiecej bajtow po danym bajcie wiec z niej zrezygnowalem. Za wszystkie sugestie serdecznie dziękuje.
  • REKLAMA
  • REKLAMA
  • #3 5954871
    pysiorek1985
    Poziom 10  
    Sorki juz dołączam mój kod z bascomAVR.
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Dim Hihi As Byte
    
    Ddrc = 255
    
    Ucsrc = &B10000011
    Ucsrb = &B00011000
    Ubrr = 207
    On Urxc Rx232
    Enable Urxc
    Enable Utxc
    Enable Interrupts
    Ucsra = &B00000010
    Do
    Loop
    End
    
    Rx232:
    Hihi = Udr
    Portc = Hihi
    Udr = Hihi
    Return
    
  • REKLAMA
  • Pomocny post
    #4 5955220
    mirekk36
    Poziom 42  
    Witam,

    zanim zabierzesz się za pisanie własnej obsługi przerwań do RS232 w Bascomie, to może najpierw spróbuj zrobić to w oparciu o dobrodziejstwa jakie daje ci Bascom.

    nie znasz poleceń INPUT, INKEY czy PRINT ????
    do tego jeszcze może Config Serialin

    bo w powyższym kodzie odstawiasz niezły "miszmasz" i nie ma co się dziwić, że ci nie działa.

    Oczywiście można w Bascomie zrobić własną obsługę RS232 na przerwaniach - tylko czy warto wyważać głową mur ? - skoro ktoś daje ci do tego (a szczególnie tak prostych celów) gotowe , dobre, sprawdzone procedury ?

    Jak będziesz już sobie dobrze radził z podstawowymi procedurami w Bascomie i po jakimś czasie zabraknie ci jednak w jakichś przypadkach rozszerzonej funkcjonalności to wtedy już z większą świadomością będziesz wiedział i czuł jak się do tego zabrać. A można to także zrobić w asemblerze co da ci jeszcze lepsze rezultaty
  • REKLAMA
  • #5 5955804
    pysiorek1985
    Poziom 10  
    Co prawda to prawda. Kiedys programowałem troche w asmeblerze i tez myslalem ze moge zrobic to na piechotke chociaz rzeczywyscie taka droga na piechote mogłaby dac rezultat jedynie w asmeblerze a tutaj okazuje sie ze3 to bylo takie banalne. Dziekuje koledze za trafna uwage i nakierunkowanie :) zamykam temat
  • #6 5959163
    chrupex
    Poziom 11  
    Podsyłam prosty programik z polskiego helpa do bascom-avr. Bardzo dobrze obrazuje zasade wysylania i odbierania sygnalu szeregowego. Wiem, że niby temat jest zamknięty, ale może kolega jeszcze tutaj zerknie, a jak nie, to będzie dla innych :)

    '--------------------------------------------------------------
    '                   RS232BUFFER.BAS
    '              (c) 2000-2002, MCS Electronics
    ' Przykład ten pokazuje różnicę pomiędzy pracą UART z buforem i bez bufora.
    '--------------------------------------------------------------
    $crystal = 4000000
    $baud = 9600
    
    'Najpierw spróbuj skompilować program, z umieszczoną w komentarzu
    'poniższą linią
    Config Serialin = Buffered , Size = 20
    
    'definiujemy zmienne
    Dim Name As String * 10
    
    'Włączenie przerwań nie jest wymagane dla normalnej pracy układu UART
    'Więc najpierw umieść ją jako komentarz, dla testów
    Enable Interrupts
    
    Print "Start"
    Do
       'odczytamy znak z UART
       Name = Inkey()
    
       If Err = 0 Then                   'była jakiś znak?
         Print Name                      'wydrukujemy go
    
       End If
    
       Wait 1                            'czekaj 1 sekundę
    Loop
    
    'Powinieneś zaobserwować efekty gdy powoli będziesz wprowadzał znaki
    'przez terminal. Wszystkie wprowadzone znaki powinny być odegnane.
    'Teraz jeśli w szybkim tempie będziesz wprowadzał znaki, powinno dać 
    'się zauważyć, że niektóre z nich będą gubione.
    
    'TERAZ USUŃ ZNAKI KOMENTARZA Z OPISANYCH LINII.
    'Skompiluj i uruchom program ponownie.
    'Teraz wszystkie wprowadzone znaki będą odbierane przez procedurę
    
    'obsługi przerwania i wprowadzane do bufora transmisji.
    'W ten sposób żaden ze znaków, przy szybkim ich wprowadzaniu, nie 
    'powinien być zgubiony.
    'Więc jeśli szybko wpiszesz abcdefg, będą one wydrukowane jeden po 
    'drugim z 1 sekundowym opóźnieniem.
    
    (c) Zbigniew Gibek, 2002-2003   (c) MCS Electronics, 1999-2003
REKLAMA