Soros port (rs232)
- rosszpelda
- DrótVégénSzéndarab
- Hozzászólások: 30
- Csatlakozott: 2009. február 8. vasárnap, 7:00
Sziasztok !
A soros porttal szívok már két hete, de egyre rejtélyesebb hibák úsznak a felszínre.Beollózom először a vevő oldalának a kódját, hátha Ti megmondjátok mi a hiba. A mega8 külső 8MHz-ről jár, baud 9600 (az adó oldalon is). A vevő veszi a küldött karaktereket szépen, ennek megfelelően rá is fut az adott címkére és visszaküldi az adónak a vett karaktert, ám a ledet meg a kimenetet nem kapcsolja. A kód elején a ledet kapcsolgatja szépen, a kimenetek jól működnek, erre összehegesztettem egy tesztprogit, az rendben fut. De ennek valami kínja van:
Hajam tépem .....
Előre is köszi.
A soros porttal szívok már két hete, de egyre rejtélyesebb hibák úsznak a felszínre.Beollózom először a vevő oldalának a kódját, hátha Ti megmondjátok mi a hiba. A mega8 külső 8MHz-ről jár, baud 9600 (az adó oldalon is). A vevő veszi a küldött karaktereket szépen, ennek megfelelően rá is fut az adott címkére és visszaküldi az adónak a vett karaktert, ám a ledet meg a kimenetet nem kapcsolja. A kód elején a ledet kapcsolgatja szépen, a kimenetek jól működnek, erre összehegesztettem egy tesztprogit, az rendben fut. De ennek valami kínja van:
Kód: Egész kijelölése
Config Portd.3 = Output
Config Portb.1 = Output
Config Portd.7 = Output
Config Portb.2 = Output
Config Portb.7 = Output
Config Portb.5 = Output
Config Portb.3 = Output
Config Portb.0 = Output
Config Portb.4 = Output
Config Portd.6 = Output
Config Portd.5 = Output
Config Serialin = Buffered , Size = 10
Egy Alias Portb.1
Ketto Alias Portd.7
Harom Alias Portb.2
Negy Alias Portb.7
Ot Alias Portb.5
Hat Alias Portd.6
Het Alias Portb.3
Nyolc Alias Portb.0
Kilenc Alias Portb.4
Tiz Alias Portd.5
Led Alias Portd.3
Dim A As Byte
Dim Bejovo As String * 1
Dim I As Byte
Dim Meres As Word
Dim Akkufesz As Single
Dim Meresieredmeny As String * 6
Config Adc = Single , Prescaler = Auto , Reference = Off
Stop Adc
Echo Off
Enable Interrupts
For I = 1 To 5
Set Led
Waitms 100
Reset Led
Waitms 500
Next
Eleje:
Do
Clear Serialin
Do
Loop Until Ischarwaiting() = 1
A = Inkey()
Bejovo = Chr(a)
If Bejovo = "A"then
Goto Csat1
Elseif Bejovo = "B"then
Goto Csat2
Elseif Bejovo = "C" Then
Goto Csat3
Elseif Bejovo = "D" Then
Goto Csat4
Elseif Bejovo = "E" Then
Goto Csat5
Elseif Bejovo = "F" Then
Goto Csat6
Elseif Bejovo = "G" Then
Goto Csat7
Elseif Bejovo = "H" Then
Goto Csat8
Elseif Bejovo = "I" Then
Goto Csat9
Elseif Bejovo = "J" Then
Goto Csat10
Elseif Bejovo = "K" Then
Goto Akku
End If
Loop
Csat1:
Set Egy
Set Led
Waitms 100
Reset Egy
Reset Led
Print Bejovo;
Goto Eleje
Csat2:
Set Ketto
Set Led
Waitms 100
Reset Ketto
Reset Led
Print Bejovo;
Goto Eleje
Csat3:
Set Harom
Set Led
Waitms 100
Reset Harom
Reset Led
Print Bejovo;
Goto Eleje
Csat4:
Set Negy
Set Led
Waitms 100
Reset Negy
Reset Led
Print Bejovo;
Goto Eleje
Csat5:
Set Ot
Set Led
Waitms 100
Reset Ot
Reset Led
Print Bejovo;
Goto Eleje
Csat6:
Set Hat
Set Led
Waitms 100
Reset Hat
Reset Led
Print Bejovo;
Goto Eleje
Csat7:
Set Het
Set Led
Waitms 100
Reset Het
Reset Led
Print Bejovo;
Goto Eleje
Csat8:
Set Nyolc
Set Led
Waitms 100
Reset Nyolc
Reset Led
Print Bejovo;
Goto Eleje
Csat9:
Set Kilenc
Set Led
Waitms 100
Reset Kilenc
Reset Led
Print Bejovo;
Goto Eleje
Csat10:
Set Tiz
Set Led
Waitms 100
Reset Tiz
Reset Led
Print Bejovo;
Goto Eleje
Akku:
Start Adc
Waitms 200
Meres = Getadc(0)
Akkufesz = Meres * 0.0147
Meresieredmeny = Str(akkufesz)
Print Meresieredmeny;
Stop Adc
Goto Eleje
End
Előre is köszi.
ElseIf-eket felejtsd el Használj:
Menyivel 1*űbb, és gyorsabb!
Kód: Egész kijelölése
Select Case Bejovo
Case "A" : Gosub Csat1
Case "B" : Gosub Csat2
.......
END SELECT
Most én is mondjam, hogy felejtsd el?:)
Na jó...azért sem.
Betűk helyett, küld számokat! Elegánsabb!!!!
Később pedig ezért jó:
Még egyszerűbb, és bármikor bővíthető![/code]
Na jó...azért sem.
Betűk helyett, küld számokat! Elegánsabb!!!!
Később pedig ezért jó:
Kód: Egész kijelölése
dim csatik(10) as string * 8
csatik(0) = "nulla"
.
.
csatik(10) = "tiz"
declare sub csatlakozok (adat as byte)
.
.
.
.
do
If inkey() =>0 and inkey() <= 10 then
bejovo = inkey()
call csatlakozok (bejovo)
else
Print "Hibás adat érkezett"
end if
.
.
.
.
loop
sub csatlakozok (adat as byte)
Set csatik(adat)
Set Led
Waitms 100
Reset csatik(adat)
Reset Led
Print Bejovo;
end sub
Még egyszerűbb, és bármikor bővíthető![/code]
- rosszpelda
- DrótVégénSzéndarab
- Hozzászólások: 30
- Csatlakozott: 2009. február 8. vasárnap, 7:00
Köszi a gyors reakciót, este átfaragom, bár ami nem teljesen tiszta :
Robi : Ha a Bascomban a compiler menüpontban beállítom az m8def.dat-ot (mint eddig is tettem mindig), akkor kitölti a stackméreteket meg a frameméretet magától, ugyanitt állítom a baudrate-t is. Ezek ellenére be kell kézzel írnom az említett direktívákat a kód elejére ? A goto valahogy elsőre átláthatóbbnak tűnt, de a gosub valóban elegánsabb és rendezettebb is ... múlhat ezen egyébként ? Valami veremgondom lehet ?
Kapu48: a case-select már megvolt, de este újra átírom, mert tényleg szebb
Remélem este nem panaszkodni jövök, hanem csak egy nagy köszönetet mondani...
Robi : Ha a Bascomban a compiler menüpontban beállítom az m8def.dat-ot (mint eddig is tettem mindig), akkor kitölti a stackméreteket meg a frameméretet magától, ugyanitt állítom a baudrate-t is. Ezek ellenére be kell kézzel írnom az említett direktívákat a kód elejére ? A goto valahogy elsőre átláthatóbbnak tűnt, de a gosub valóban elegánsabb és rendezettebb is ... múlhat ezen egyébként ? Valami veremgondom lehet ?
Kapu48: a case-select már megvolt, de este újra átírom, mert tényleg szebb
Remélem este nem panaszkodni jövök, hanem csak egy nagy köszönetet mondani...
- rosszpelda
- DrótVégénSzéndarab
- Hozzászólások: 30
- Csatlakozott: 2009. február 8. vasárnap, 7:00
A kód a sok ugrálás meg karakterküldözgetés miatt valóban elég kőkori monster benyomást kelt, egyelőre jobban olvashatóbbnak meg követhetőbbnek tűnt nekem, amint megcsinálja amit kell tökéletesen, tervezem, hogy puha bundába gyömöszölöm a belsejét. Jobban szeretem én is, ha a kód inkább cuki kutyusra hasonlít nem pedig félbevágott lóra
Aztán lehet, hogy ami az elején szörny, azt csomagolhatom bármibe, az is marad... szóval újratervezés...
Aztán lehet, hogy ami az elején szörny, azt csomagolhatom bármibe, az is marad... szóval újratervezés...
Hi kovacsna!
Sajnos ez így nem OK!
Eredetilen Kimeneteket akarunk billegtetni.
dim csatik(10) as string * 8 Hogyan jön ide string tömb?
Set csatik(adat) Stringn tömbnek az index változójára nem lehet Set/Reset utasítás küldeni!
És a bilentyű vizsgálat is inkább Igy:
Sajnos ez így nem OK!
Eredetilen Kimeneteket akarunk billegtetni.
dim csatik(10) as string * 8 Hogyan jön ide string tömb?
Set csatik(adat) Stringn tömbnek az index változójára nem lehet Set/Reset utasítás küldeni!
És a bilentyű vizsgálat is inkább Igy:
Kód: Egész kijelölése
bejovo = inkey()
If Bejovo => 0 And Bejovo <= 10 Then
A hozzászólást 2 alkalommal szerkesztették, utoljára kapu48 2012. március 24. szombat, 15:49-kor.
Azért kellett a string tömb, hogy az aliasok meglegyenek,és azt feltételezzük, hogy a sorosporton számok érkeznek.
A SET -el kapcsolatban igazad van. Elnézést a félrevezetésért. C-ben nem gond:)
Be kell tenni egy select-case-t és kész.
Az inkey egy sorban miért nem jó? Sokkal tömörebb. Bár ezek már ízlések és pofonok!
A lényeg, hogy subrutinban meg lehet csinálni. Szerintem felesleges 10 külön subrutint hívogatni ezért!
Majd ha lesz időm megírom a kész progit.
A helyreigazítást pedig köszönöm!
A SET -el kapcsolatban igazad van. Elnézést a félrevezetésért. C-ben nem gond:)
Be kell tenni egy select-case-t és kész.
Az inkey egy sorban miért nem jó? Sokkal tömörebb. Bár ezek már ízlések és pofonok!
A lényeg, hogy subrutinban meg lehet csinálni. Szerintem felesleges 10 külön subrutint hívogatni ezért!
Majd ha lesz időm megírom a kész progit.
A helyreigazítást pedig köszönöm!
A hozzászólást 1 alkalommal szerkesztették, utoljára kovacsna 2012. március 24. szombat, 15:55-kor.
Tessék:)
megfeleltetés :
1 = portb.0
2 = portb.1
.
.
15 = portc.7
megfeleltetés :
1 = portb.0
2 = portb.1
.
.
15 = portc.7
Kód: Egész kijelölése
$regfile = "m168def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 80
$swstack = 80
$framesize = 80
$sim
config com1 = dummy
Config Portb.0 = Output
Config Portc.0 = Output
Declare Sub Csatik(byval Adat As Byte)
Dim Bejovo As Byte
Do
If Inkey() > 0 And Inkey() <= 17 Then
Bejovo = Inkey()
Call Csatik(bejovo)
End If
Loop
Sub Csatik(byval Adat As Byte)
If Adat <= 8 Then
Adat = Adat - 1
Portb = 2 ^ Adat
Wait 1
Portb = 0
Else
Adat = Adat - 9
Portc = 2 ^ Adat
Wait 1
Portc = 0
End If
Print Bejovo
Bejovo = 0
End Sub
Kód: Egész kijelölése
If ischarwaitting()> then
Bejovo = Inkey()
if bejovo>0 and bejovo<18 then
Call Csatik(bejovo)
End If
mert mi van ha a dupla if inkey esetén a lenyomott gomb megvaltozik?
Es ha az elso if az inkey()-t kiolvasa, a masodik esetben tuti "" lesz az inkey() erteke.
A kész kódodból a $sim-t vedd ki!