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.

Program do odbierania danych i wysyłanaia przez rs232?

august_a 30 Paź 2005 16:54 3683 17
  • #1 30 Paź 2005 16:54
    august_a
    Poziom 21  

    Witam,
    Mam pewien problem, chodzi mi mianowicie o kawałek kodu w Bascom który jest odpowiedzialny za wysyłanie i odbieranie danych.
    Problem mój polega na tym, że gdy używam polecenia

    Code:
    INPUT
    to program czeka tak długo, aż nie wyśle mu pewnych danych z komputera, natomiast chodzi mi aby program działał w pętli przez cały czas, a gdy chcę mu coś wysłać to wtedy odbierze dane, a nie będzie czekał.

    Procesor który programuje to ATMega32
    BASCOM
    Pozdrawiam

    0 17
  • #2 30 Paź 2005 19:51
    Robot_
    Poziom 18  

    Witam,
    Nie znam BASCOM'a ale procesory AVR oferują przerwanie w momencie odebrania znaku.
    Wykorzystaj przerwania i bedziesz miał daną w momencie odbioru, a w tym czasie program może wykonywać co do niego należy
    Pozdrawiam

    0
  • #3 30 Paź 2005 21:24
    august_a
    Poziom 21  

    Właśnie o coś takiego by mi chodziło, tylko nie mam pojęcia jak to napisać.

    0
  • #4 30 Paź 2005 21:57
    Robot_
    Poziom 18  

    Musisz popatrzeć w helpie jak obsłużyć przerwanie od odbiornika UART, w jego obsłudze wpisać

    Code:

    flaga = 1;
    znak = UDR0;


    w kodzie gdzie oczekujesz danej z RSa (składnia C)

    Code:

    if (flaga == 1)
    {
    flaga = 0;
    cos_tam = znak;
    lub wywołanie funkcji
    }

    zmienna flaga została wprowadzona aby kilka razy nie użyć tej samej danej.

    0
  • #5 30 Paź 2005 22:19
    zumek
    Poziom 39  

    Nie wiem , co Twój program ma do roboty w pętli głównej , ale gdyby sprawdzanie czy nadszedł znak , było wykonywane rzadziej niż prędkość , z jaką dane mogą napływać do uC , to częśc napływających danych , niechybnie diabli wezmą ;) Radzę skorzystać z buforowania - zważywszy że RAM-u Ci chyba nie brakuje :D

    Piotrek

    PS
    A jakie dane spodziewasz się odbierać - stringi , czy binaria :?:
    Input nadaje się zasadniczo , tylko do stringów.

    0
  • #6 31 Paź 2005 13:10
    august_a
    Poziom 21  

    Cytat:
    Radzę skorzystać z buforowania


    W jaki sposob mam wrzucić dane do bufora i później je odczytywać?

    0
  • #7 31 Paź 2005 13:58
    zumek
    Poziom 39  

    august_a napisał:

    ...
    W jaki sposob mam wrzucić dane do bufora i później je odczytywać?

    Ty nic nie musisz wrzucać , o wszystko zadba kompilator.Zainteresuj się dyrektywą Config Serialin, funkcją Ischarwaiting(),zmiennymi systemowymi _RS_HEAD_PTR0,_RS_TAIL_PTR0,_RS232INBUF0.
    Bascom rulez :D

    Piotrek

    0
  • #8 31 Paź 2005 14:15
    august_a
    Poziom 21  

    Witam,
    chyba działa :D
    Tylko mam pewien jeszcze problem, ponieważ program mam napisany w Visual basic 6, i program wysyła dane do uP tylko procek nie zapisze danych kiedy nie dostanie entera, nie wiem jak mam wysłać znak entera, lub zrobić tak aby program nie potrzebował na końcu entera.
    Pozdrawiam

    0
  • #9 31 Paź 2005 15:34
    zumek
    Poziom 39  

    Nie korzystać z funkcji Input.Do dyspozycji masz Inputbin,Inkey().

    Piotrek
    Nadal nie wiem , jakie dane wysyłasz do uC z PC-ta.
    Można wysłać choćby tak:

    Code:

    Private Sub SendStr()
       MSComm1.Output = Text1.Text & Chr(13)
    End Sub

    0
  • #10 31 Paź 2005 16:59
    august_a
    Poziom 21  

    Program z Visual Basic:

    Code:

    Private Sub Command2_Click()
    MSComm1.CommPort = 4
    MSComm1.Settings = "9600,n,8,1"
    Debug.Print "----------"
    MSComm1.RThreshold = 1
    End Sub

    Private Sub Command3_Click()
    MSComm1.PortOpen = True

    End Sub

    Private Sub MSComm1_OnComm() ' procedura odbioru z koma
    Select Case MSComm1.CommEvent
    Case comEvReceive
    DANE = MSComm1.Input
    Label1 = Label1 & DANE ' daj zmienną string o nazwie "dane" i postaw label1 gdzie będziesz widział to co wraca z procesora
    End Select
    End Sub

    Private Sub Command1_Click() ' wysłanie rozkazu
    MSComm1.Output = "COS" & Chr(13)
    End Sub



    Program z procka:
    Code:

    $baud = 9600
    $regfile = "m32def.dat"
     Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
    'Najpierw spróbuj skompilować program, z umieszczoną w komentarzu
    'poniższą linią
    Config Serialin = Buffered , Size = 20
     Cls
    '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                                                    ' wlaczenie przerwan
    Enable Serial
    Print "Start"
    Locate 2 , 1 : Lcd "test"
    Do
    Locate 1 , 1 : Lcd Name
       'odczytamy znak z UART
       Name = Inkey()
          Print Name
    Locate 1 , 1 : Lcd Name
       If Err = 0 Then                                          'była jakiś znak?
         Print Name                                             'wydrukujemy go
         Locate 1 , 1 : Lcd Name
       End If

       Wait 1                                                   'czekaj 1 sekundę
    Loop



    Co tutaj może być źle??

    0
  • #11 31 Paź 2005 21:07
    zumek
    Poziom 39  

    Czy PC-et odbiera transmisję :?:
    Nie dostrzegam $crystal=xxxxx - czym taktujsz proca , wewnętrznym RC czy zewnętrznym kwarcem , a jeśli zewnętrznym , to jakim i czy fusy przestawione na "external cristal".
    Mógłbym tak jeszcze długo ... .
    To działa na M32 napewno:

    Code:

    $crystal = 11059200
    $regfile = "m32def.dat"
    $baud = 19200
    Config Serialin = Buffered , Size = 100 // mam z czego rządzić ;)

    Dim I As Byte , X As Byte
    Set Ddrd.1       '= 1
    Enable Interrupts

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.7 , Db7 = Porta.7 , E = Portc.3 , Rs = Portc.2

    Cls
    Print "atd+48607520051"
    I = 0
    While I <> &H0D
       I = Inkey()
       If I > 32 Then Lcd Chr(i);
    Wend
    Do
    Loop


    Piotrek

    0
  • #12 31 Paź 2005 21:54
    august_a
    Poziom 21  

    Witam,
    Zmieniłem fuse na external RC i chyba zblokowałem procka :/ jakie ustawienia fuse bit najlepiej mu ustawić??

    0
  • #13 04 Lis 2005 14:07
    august_a
    Poziom 21  

    Jak ustawić fuse bity na zewnętrzny kwarc??

    W bascomie mam opcje:

    1010: Crystal oscillator, slowly rising power
    1011: Crystal oscillator, fast rising power
    1100: Crystal oscillator, BOD enabled


    Zewnętrzny kwarc mam 8MHz.

    0
  • Pomocny post
    #14 04 Lis 2005 14:20
    zumek
    Poziom 39  

    august_a napisał:
    Jak ustawić fuse bity na zewnętrzny kwarc??

    W bascomie mam opcje:

    1010: Crystal oscillator, slowly rising power
    1011: Crystal oscillator, fast rising power
    1100: Crystal oscillator, BOD enabled


    Zewnętrzny kwarc mam 8MHz.

    Ustaw tak:
    Fusebits
    1:
    1:
    01:
    1110:
    Fusebits High
    1:
    1:
    0: -najważniejszy z bitów , jeśli chodzi o programowanie szeregowe ;)
    0:
    1:
    00: -mniej ważne ;)
    1: -ważny

    Piotrek

    0
  • #15 04 Lis 2005 14:39
    august_a
    Poziom 21  

    Działa OK - procesorek jest taktowany z zewnętrznego kwarca.
    Dzięki za pomoc.
    Tylko nadal mam problem z wysłaniem czego kolwiek do procka. Z procka jest ok. Ale "do" nie działa.
    Program do procka który mi podałeś wcześniej wgrałem i nadal nie działa.

    Fuse bity mam ustawione jak zalecałeś, rezonator 8MHz.

    0
  • #16 04 Lis 2005 20:07
    zumek
    Poziom 39  

    Czy procek ma odbierać dane , wysyłane przez jakiś PC-towy program :?:
    Jeżeli tak , to może spróbuj najpierw dogadać się z prockiem za pomocą terminala.Przytoczony powyżej programik działa w ten sposób , że po uruchomieniu terminala , włączam uC i w oknie pojawia się napis wysłany przez uC.Następnie , w terminalu wpisuję dowolne znaki z klawiatury , które pojawiają sie natychmiast na LCD i po zatwierdzeniu enterem , procek wpada w nieskończoną pętle i ... koniec.

    Piotrek

    0
  • #17 04 Lis 2005 20:44
    august_a
    Poziom 21  

    No właśnie na terminalu tez nic procesor nie dostaje z PC. W przeciwnym kierunku z uP-->PC jest wszystko ok.

    0
  • #18 04 Lis 2005 21:02
    zumek
    Poziom 39  

    To chyba masz coś ze sprzętem lub z połączeniami , co na jedno wychodzi ;)
    Połącz TX z RX za konwerterem i uruchom procka.Na LCD powinieneś otrzymać to co wysłałeś.Jeśli tak się nie stanie , to ... patrz 1-sze zdanie ;)
    Najlepiej połączyć ze sobą piny TX i RX proca , tylko to troszkę niebezpieczne.Normalnie nie powinno nic się stać z uC , ale ... ryzyko zawsze istnieje :D

    Piotrek

    0