Sériová linka - příjem dat BASCOM

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
radar0101
Příspěvky: 20
Registrován: 15 čer 2010, 00:00

#16 Příspěvek od radar0101 »

ale furt je u inputbin problem s ti ze to na ty data ceka...to je taky na prd:(
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#17 Příspěvek od Andrea »

Pokud nechceš na ty data čekat, tak je přijímej asynchronně v přerušení od USARTu.
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#18 Příspěvek od AB1 »

Asi by bylo dobré vysílat synchronizační bajt, řekněme 255, a za ním vždy 8 hodnot 0-254 pro serva 1-8.
Přijímat pak můžeš třeba takto:

Kód: Vybrat vše

$hwstack = 128
$swstack = 64
$framesize = 64
$baud = 9600

Config Serialin = Buffered , Size = 40       ' set buffer on the USART input

Dim Servo(8) As Byte          'hodnoty pro serva 1-8
Dim Prijaty_bajt As Byte

   Enable Interrupts          'přijímací bufer používá přerušení

   Do
      If Ischarwaiting() = 1 Then
         Prijaty_bajt = Inkey()

           If Prijaty_bajt = 255 Then
              Inputbin Servo(1) , 8       ' přijmi 8 bajtů a ulož do pole "Servo"
           End If
      End If

   Loop

End
Uživatelský avatar
radar0101
Příspěvky: 20
Registrován: 15 čer 2010, 00:00

#19 Příspěvek od radar0101 »

Moc děkuju ale bohuzel bych to potreboval jeste trosicku upravit...ja mam synchronizační 255 potom mezera a hodnota 0 az 8 to je cislo serva pak zas mezera a je tu 3 byt a tem ma hodnotu 0 až 254...Tak jsem myslel že bych moh takhle upravit ten tvuj kod ale bohuzel to takhle nefaka..asi to bude tou mezerou mezi cislem serva a jeho nastavovaci hodnotou.
Jinak moc dik i za tohle řešeni.

Kód: Vybrat vše

If Ischarwaiting() = 1 Then
         Prijaty_bajt = Inkey()

           If Prijaty_bajt = 255 Then
              Inputbin Servo(1) , 2                         ' přijmi 8 bajtů a ulož do pole "Servo"
           End If
      End If

Select Case Servo(1)
Case 0 : Servo0 = Servo(2)
Case 1 : Servo1 = Servo(2)
Case 2 : Servo2 = Servo(2)
Case 3 : Servo3 = Servo(2)
End Select
Uživatelský avatar
radar0101
Příspěvky: 20
Registrován: 15 čer 2010, 00:00

#20 Příspěvek od radar0101 »

tak zase ja.. pokusil jsem se pro ten muj pripad vymyslet dalsi reseni ale zas nic _ nejde to:(

Kód: Vybrat vše

If Krok = 1 And Ischarwaiting() = 1 Then

    B = Inkey()
    If B = 255 Then Krok = 2

End If


If Krok = 2 And Ischarwaiting() = 1 Then

    C = Inkey()
    Krok = 3

End If


If Krok = 3 And Ischarwaiting() = 1 Then

    D = Inkey()

    Select Case C
    Case 0 : Servo0 = D
    Case 1 : Servo1 = D
    Case 2 : Servo2 = D
    End Select

    Krok = 0

End If
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#21 Příspěvek od AB1 »

Zdá se že kód zbytečně komplikuješ.
Předpokládám, že "mezera" při vysílání je časová prodleva, ne znak mezery (ascii 32).
Data tedy vypadají takto:
255 - cislo_serva - hodnota_serva - 255 - cislo_serva - hodnota_serva........

Kód: Vybrat vše

Dim Servo(8) As Byte
Dim Temp As Byte
Dim Cislo As Byte
Dim Hodnota As Byte

   Enable Interrupts
   Do
      If Ischarwaiting() = 1 Then
         Temp = Inkey()

           If Temp = 255 Then
              Inputbin Cislo
              Inputbin Hodnota
              Servo(cislo) = Hodnota
           End If

      End If

   Loop

End

Pro časování serv použij hodnoty z pole "Servo()".
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“