PWM vezérlés RS485 buszon át

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2012. szeptember 27. csütörtök, 6:15

Üdv!
Velem van a baj, a bascom verziómmal vagy tényleg nem lehet atmega 8 nál használni a soros megszakítást?

Kód: Egész kijelölése

Config Serialin = Buffered , Size = 30 , Bytematch = 10

A fordító folyton panaszkodik a "10" re.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 27. csütörtök, 6:52

&H10 ?

Melyik verzió? DEMO alatt mit csinál?
Igaz nem gyógyított?

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2012. szeptember 27. csütörtök, 7:05

&H10 ugyan az, mókolt, 1.11.7.4

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 27. csütörtök, 7:16

A Bascom a 2.0.74-nél jér már!
A 11.7.4 kb. 4-4,5 éves kiadás. és a gyógymodulja sokszor hibás és/vagy nem is létezett akkor még a bytematch funkció.


Morializálás on:
U.i.: ha munkára használod és/vagy zsebpénz van belőle, illik megvenni. Támogatás van hozzá, és veziókövetés folyamtos (ingyenesen)
U.i.2: Hazai forgalmazója is van már!

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2012. szeptember 27. csütörtök, 7:24

Értem akkor a verzió a probléma. Nézek frissebbet. De csak hobbi célra használom, saját bohóckodásra.

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2012. szeptember 27. csütörtök, 13:00

Tényleg ez volt a baj. Köszi!
Viszont más problémába ütköztem.
Valamiért nem akarja átadni az értéket a hívás.
Ebben tudnátok segíteni hogy mit rontok el?
teszt.bas:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 11059200
$baud = 9600
$hwstack = 110
$swstack = 110
$framesize = 60

Config Sda = Portc.4
Config Scl = Portc.5
Config Serialin = Buffered , Size = 64 , Bytematch = &H10

Enable Interrupts
$include "init_rs485.inc"
Reset Rs485dir
Dim Tempmsb As Byte
Dim Templsb As Byte
Dim Olvas As Byte
Mytype = "slave"
Const Myname = "[01_slave]"
Thisslave = "01"

Olvas = 0


'******** Main program **************************
Call Startconvert
Do
If Olvas > 0 Then Gosub Rs485cmd



'Call Readtemp(tempmsb)

    Print Tempmsb
      Waitms 500
Loop
'******** end main program **********************
Rs485cmd:
Call Get_line(tmp_line , Flag , Error)


   If Flag = 1 Then
           Select Case G_cmd
            Case "[what]" : Call Send_line(thisslave , Myname )
            Case "[temp]" : Call Readtemp(tempmsb)
            Case "[restart]" : Call Send_line(thisslave , "[Init. done]")
           End Select
   End If
   Decr Olvas
Return
End

$include "subs_rs485.inc"

Serial0charmatch:
   Incr Olvas
Return


subs_rs485.inc:

Kód: Egész kijelölése

'Include file
'
'*********************************************************************************
'
Sub Checksumm(chk_line As String)
Chk_a = 0
For Chk_n = 1 To Len(chk_line)
   Chk_cs = Mid(chk_line , Chk_n , 1)
   Chk_c = Val(chk_cs)
   Call Calccrc
Next Chk_n
Chk_as = Hex(chk_a) : Chk_tmp2 = "0000" + Chk_as : Chk_as = Right(chk_tmp2 , 4)
Chk_tmp1 = Right(chk_as , 2) : Chk = Chk_tmp1 : Chk_tmp1 = Left(chk_as , 2)
Chk = Chk + Chk_tmp1
End Sub
'
'*********************************************************************************
'
Sub Calccrc
For Chk_v = 1 To 8
   Chk_tmp4 = Chk_a Mod 2 : Chk_tmp3 = Chk_c Mod 2 : Chk_cy = Chk_tmp4 + Chk_tmp3
   Chk_a = Chk_a / 2 : Chk_c = Chk_c / 2
   If Chk_cy = 1 Then Chk_a = Chk_a Xor 40961
Next Chk_v
End Sub
'
'*********************************************************************************
'
Sub Send_line(s_slave As String , S_cmd As String)
   Print
   Waitms 100                                               'to get rid of garbage
   If Type = "Master" Then
      Tmp_line = "{" + S_slave + Sep + Master + Sep + S_cmd + Sep
   Else
       Tmp_line = "{" + Master + Sep + S_slave + Sep + S_cmd + Sep
   End If
   Call Checksumm(tmp_line)
   Tmp_line = Tmp_line + Chk + "}" : Print Tmp_line : Tmp_line = " "
End Sub
'
'*********************************************************************************
'
Sub Get_line(tmp_line As String)
Error = 0
Flag = 1
If Type = "Master" Then
       'Input Tmp_line Timeout = 40000                       ' was 65436
   Else
       'slave
       Input Tmp_line                                       ' no timeout
End If
Chkstart = Left(tmp_line , 1)
If Chkstart = "{" Then
Dd = Mid(tmp_line , 2 , 2)
   If Dd = Thisslave Or Dd = "99" Then
      If Tmp_line = "" Then
         Error = 4 : Flag = 0
         Else
         ' {<dd>#<ss>#<cmd>#<crcl><crch>}
         Tel = Len(tmp_line) : Tmp = Left(tmp_line , 1)
         If Tmp = "{" Then
            Tmp = Mid(tmp_line , 4 , 1)
            If Tmp = Sep Then
               Tmp = Mid(tmp_line , 7 , 1)
               If Tmp = Sep Then
                  Teltmp = Tel - 5 : Tmp = Mid(tmp_line , Teltmp , 1)
                  If Tmp = Sep Then
                     Tmp = Right(tmp_line , 1)
                        If Tmp = "}" Then
                           Dd = Mid(tmp_line , 2 , 2)
                           If Type = "Master" Then
                              If Dd <> Master Then Flag = 0
                              Else
                              If Dd <> Thisslave And Dd <> "99" Then Flag = 0
                           End If
                           Ss = Mid(tmp_line , 5 , 2) : Teltmp = Tel - 13 : G_cmd = Mid(tmp_line , 8 , Teltmp)
                           Teltmp = Tel - 4 : S_chk = Mid(tmp_line , Teltmp , 4)
                           If Type = "Master"then
                              Tmp_line = "{" + Dd + Sep + Ss + Sep + G_cmd + Sep
                              Else
                              If Dd = "99" Then
                                 Ddh = "99"
                                 Else
                                 Ddh = Thisslave
                              End If
                              Tmp_line = "{" + Ddh + Sep + Master + Sep + G_cmd + Sep
                           End If
                           Call Checksumm(tmp_line)
                           Tmp_line = Tmp_line + Chk + "}"
                           If Chk <> S_chk Then
                              Error = 3 : Flag = 0
                           End If
                         Else
                           Error = 9 : Flag = 0
                        End If
                   Else
                     Error = 8 : Flag = 0
                  End If
                Else
                  Error = 7 : Flag = 0
               End If
             Else
               Error = 6 : Flag = 0
            End If
          Else
            Error = 5 : Flag = 0
         End If
      End If
      If Flag = 0 Then G_cmd = ""
   Else
   Flag = 0
   End If
   Else
   Flag = 0
End If

End Sub

'******** start convert *************************
Sub Startconvert()
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
End Sub
'************************************************

'******** read temperature **********************
Sub Readtemp(tempmsb As Byte)
'-------------
I2cstart
I2cwbyte &H90                                               'send adress byte
I2cwbyte &HAA                                               'send register byte
I2cstop

I2cstart
I2cwbyte &H91                                               'read register
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
Tempmsb = Tempmsb - 3
Call Send_line(thisslave , Tempmsb)

End Sub Readtemp
'************************************************

init_rs485.inc :

Kód: Egész kijelölése

'include-file init_benbus.inc

Dim Chk As String * 4
Dim Chk_a As Word
Dim Chk_as As String * 10
Dim Chk_c As Byte
Dim Chk_cs As String * 1
Dim Chk_cy As Word
Dim Chk_line As String * 100
Dim Chk_n As Word
Dim Chk_tmp1 As String * 8
Dim Chk_tmp2 As String * 8
Dim Chk_tmp3 As Word
Dim Chk_tmp4 As Word
Dim Chk_v As Word
Dim Chkstart As String * 1
Dim Dd As String * 2
Dim Ddh As String * 2
Dim Error As Byte
Dim Flag As Byte
Dim G_cmd As String * 20
Dim S_chk As String * 2
Dim S_cmd As String * 20
Dim S_slave As String * 2
Dim Ss As String * 2
Dim Tel As Integer
Dim Teltmp As Integer
Dim Tmp As String * 1
Dim Tmp_line As String * 255
Dim Mytype As String * 6
Dim Thisslave As String * 2


Declare Sub Calccrc
Declare Sub Checksumm(chk_line As String)
Declare Sub Get_line(tmp_line As String , Flag As Byte , Error As Byte)
Declare Sub Send_line(s_slave As String , S_cmd As String )
Declare Sub Readtemp(tempmsb As Byte)
Declare Sub Startconvert()

Const Master = "00"
Const Sep = "#"


'Activate RS485 driver (MAX485 DE)
Rs485dir Alias Pind.3
Config Rs485dir = Output


A

Kód: Egész kijelölése

 Call Send_line(thisslave , Myname )
résszel van a baja ahogy a választ szeretném küldeni.
Köszi

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 27. csütörtök, 13:58

Milyen értéket nem ad át? Nem értem a kérdést! :(

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. szeptember 27. csütörtök, 16:24

A : Sub Get_line(tmp_line As String) 1 argumentumot vár.

Te meg meghívod: Call Get_line(tmp_line , Flag , Error) 3-al?

Ez 1 szörnyszülött program!
Annyi benne az if, then, else, hogy olvashatatlan!

Nekem lesem fordul! Hiányol 1 endif-et és 1 end selectet?
:?

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. szeptember 27. csütörtök, 18:42

A rutin meghívás valóban helytelen. A program viszont számomra tökéletesen átlátható, nem értem, mi a baj a szerkezetével. Én is gyakran használok több, egymásba ágyazott "If then elseif"-et, meg select case-eket, komolyan nem értem, hogy ettől miért lesz szörnyszülött. Szerintem csak a példaprogramokban, meg a ledvillogtatókban találkozhatunk életszerűen egy-két szintű elágazással. Aki nem áll meg a hello world-nél, az használni fog több szintű feltételvizsgálatot.

Persze minden feltételvizsgálatot kiszervezhetett volna külön címke alá, vagy külön rutinba, amiket call-al, vagy goto-val köt össze, de szerintem meg az lett volna a szörnyszülött, mert az valóban átláthatatlan lenne, honnan, mikor, hova ugrik, vagy mit hív meg.

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2012. szeptember 27. csütörtök, 19:16

Igen de azzal még nem is volt baja, ott átadok neki egyet és cserébe várok tőle 3at.
Az a szörnyszülött rész az eredeti benbus-os forrásból származik amiben állítólag működött.
Nekem a Call Send_line(thisslave , Myname )
nál van bajom itt átadok neki 2 értéket amivel dolgoznia kéne de nem fordítja le mert erre a sorra panaszkodik hogy :
byval should be used in declaration
utánna irja azt is hogy hiányolja az if és end select részt, de gondolom csak mert az ifben lévő select közepém áll fejre.
csak ezt nem értem miért amikor ő ott két értéket vár és át is adom.
De mind1 ez egy nagy kuszaság feladom.
Megpróbálom ezzel a kóddal http://avr.tavir.hu/modules.php?name=Content&pa=showpage&pid=128#v5 (Gyugel Zsolt (strigo):BenBus Plusz) kicsit rövidebbre venni hogy bele férjen a M8 ba. Csak az a baj hogy ezt is megpróbálom lefordítani anélkül hogy bele piszkálnék és mégis azt írja hogy "Member expected [thisslave = 01]"... "Member expected [thisslave = 00]".... "if then expected"...."end if expected"

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. szeptember 27. csütörtök, 19:22

Azért akad ki, mert a "Myname" a programodban konstans, és szerintem csak változót lehet megadni sub rutin híváskor paraméterként.

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2012. szeptember 27. csütörtök, 19:29

Mindegy végül is az már meguntam mert 3 napja csak szivat.
Ebben viszont a "Dim Thisslave As String * 2 " mint változó szerepel, nem tudom milyen csoportot vagy tagságot hiányol...
Ezzel próbálkozott már valaki?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 27. csütörtök, 19:53

Slave vagy Master az eszközöd...

Hülye tipp:
A Bascomban ott van (elvileg) a ModBus prototokoll. Hasonlót tud, csak _sokkal_ rövidebb egyszerűbb a kód...

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. szeptember 28. péntek, 7:52

A: Type, kék színű!

Tehát időközben foglalt kulcs szó lett!

Válasz helyette más változó nevet.
8)

Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

HozzászólásSzerző: zb83 » 2012. szeptember 28. péntek, 14:12

Deklarálva sincs egyébként a Type nevű változó. Van viszont deklarálva Mytype változó, én úgy látom, hogy azt szeretted volna használni ott, ahol a Type változót használod.


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég