|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Pet Maj 31, 2019 8:29 pm Naslov sporočila: Bascom Printbin ali kako drugače |
|
|
Hi
Imam radijska modula HM-TRP868. Rad bi prenašal nekaj temperaturnih podatkov iz enega modula do drugega. Pa se je pojavil problem, ker ne znam napisati prave kode. Za en podatek ni problem.
Kako napisati kodo, da bom vedel na sprejemni strani katero spremenljivko je sprejel.
Koda za oddajnik:
Koda: |
$baud 9600
Dim T1 As byte
Dim T2 As byte
Dim T3 As byte
T1=13
T2=54
T3=86
Do
Printbin T1
Wait 1
Printbin T2
wait 1
Printbin T3
Wait 1
Loop
|
Sprejemni del:
Koda: |
x=Inkey()
If x>0 Then
Locate 1,1 : LCD "T1: "; x
waitms 100
End If
|
Ta koda deluje tako, da vsako sekundo izpiše eno temperaturo na LCD.
Kako pa sedaj napisati, da bom izpisal T1,T2,T3 na različna mesta na LCD.
Mogoče nisem preveč dobro opisal problema, upam da veste kaj bi rad.
LP,marko |
|
Nazaj na vrh |
|
|
rudiP Član
Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 6.05 Kraj: KOPER
|
Objavljeno: Pet Maj 31, 2019 10:02 pm Naslov sporočila: |
|
|
Opisal SI kaj želiš, vendar tako enostavno pa spet ne gre. (pa tudi težko ne bo).
jutri ali v nedeljo ti pošljem vzorec kode. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.01
|
Objavljeno: Sob Jun 01, 2019 12:21 am Naslov sporočila: |
|
|
Kolikšno je območje temperatur?
Najlažje je temperaturam pred pošiljanjem prišteti konstanto in jo po sprejemu spet odšteti.
Ampak podatek mora biti po novem Unsigned 16-biten (ne poznam tipov spremenljivk v Bascomu).
Na oddajni strani:
T1 = 1100 + IzmerjenaT1
T2 = 2200 + IzmerjenaT2
T3 = 3300 + IzmerjenaT3
Na sprejemni strani:
NapakaTemp=0
If (Tsprejeta - 3300) > 0
T3 = Tsprejeta - 3300
Else if (Tsprejeta - 2200) > 0
T2 = Tsprejeta - 2200
ElseIf (Tsprejeta - 1100) > 0
T1 = Tsprejeta - 1100
Else
NapakaTemp = 1 (sprejeto je nekaj čudnega, potrebno je ignorirati)
Če so možne tudi negativne T, pač na sprejemni strani preveriš z za 100 manjšo številko
If (Tsprejeta - 3200) > 0
T3 = Tsprejeta - 3300
... _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
rudiP Član
Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 6.05 Kraj: KOPER
|
Objavljeno: Sob Jun 01, 2019 7:04 am Naslov sporočila: |
|
|
Spodnji primer dela v interuptih, je osnova za tvoje nadaljne delo.
Če ti kaj ni jasno vprašaj.
Koda: |
$regfile = "m168pdef.dat"
$crystal = 8000000 '
$baud = 9600
$hwstack = 100
$swstack = 100
$framesize = 100
Dim Temp_arr(50) As Byte
Dim Temp_arr_s As String * 50
Dim St_rx As Byte
Dim Rs_rx_f As Bit
Dim D As Byte
Dim S1_1ms As Word
Dim Zacasni_str As String * 20
Dim Sek_f As Bit
Dim T1 As Single
Dim T2 As Single
Dim T3 As Single
St_rx = 1
Const Oddajnik = 0
'-------------------------------------------------------------------------------
Const Timer0reload = 125
Config Timer0 = Timer , Prescale = 64
Load Timer0 , Timer0reload
On Ovf0 Timer0_isr
Enable Ovf0
Start Timer0
'-------------------------------------------------------------------------------
Enable Urxc 'RxD interrupt flag
On Urxc Rec_isr 'define serial receive ISR
St_rx = 1
'-------------------------------------------------------------------------------
Enable Interrupts
'-------------------------------------------------------------------------------
Do
If Sek_f = 1 Then
Reset Sek_f
Zacasni_str = Fusing(t1 , "#.##")
Print "T1 = " ; Zacasni_str
Zacasni_str = Zacasni_str + Fusing(t2 , "#.##")
Print "T2 = " ; Zacasni_str
Zacasni_str = Zacasni_str + Fusing(t3 , "#.##")
Print "T3 = " ; Zacasni_str
End If
If Rs_rx_f = 1 Then
Reset Rs_rx_f
If Left(temp_arr_s , 2) = "T1" Then
Locate 1 , 1
Lcd Temp_arr_s
End If
If Left(temp_arr_s , 2) = "T2" Then
Locate 1 , 8
Lcd Temp_arr_s
End If
If Left(temp_arr_s , 2) = "T3" Then
Locate 1 , 14
Lcd Temp_arr_s
End If
End If
Loop
'-------------------------------------------------------------------------------
Rec_isr:
D = Inkey()
Temp_arr(st_rx) = D
Incr St_rx
If D = 13 Then
Set Rs_rx_f
St_rx = 1
End If
If St_rx > 10 Then St_rx = 1
Return
'-------------------------------------------------------------------------------
'
'-------------------------------------------------------------------------------
Timer0_isr:
Load Timer0 , Timer0reload
Incr S1_1ms
If S1_1ms = 1000 Then
S1_1ms = 0
Set Sek_f
End If
Return |
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Ned Jun 02, 2019 11:58 am Naslov sporočila: |
|
|
igo je napisal/a: |
Kolikšno je območje temperatur?
Najlažje je temperaturam pred pošiljanjem prišteti konstanto in jo po sprejemu spet odšteti.
Ampak podatek mora biti po novem Unsigned 16-biten (ne poznam tipov spremenljivk v Bascomu).
Na oddajni strani:
T1 = 1100 + IzmerjenaT1
T2 = 2200 + IzmerjenaT2
T3 = 3300 + IzmerjenaT3
Na sprejemni strani:
NapakaTemp=0
If (Tsprejeta - 3300) > 0
T3 = Tsprejeta - 3300
Else if (Tsprejeta - 2200) > 0
T2 = Tsprejeta - 2200
ElseIf (Tsprejeta - 1100) > 0
T1 = Tsprejeta - 1100
Else
NapakaTemp = 1 (sprejeto je nekaj čudnega, potrebno je ignorirati)
Če so možne tudi negativne T, pač na sprejemni strani preveriš z za 100 manjšo številko
If (Tsprejeta - 3200) > 0
T3 = Tsprejeta - 3300
... |
Območje temperatur bo: T1 bo tudi v minus
T2 in T3 pa samo v plus od 10 do 100 stopinj C
Igor sem se ukvarjal s tvojim primerom, ki se mi je zdel preprost.
Je pa problem, Bascom ali pa jaz ne znam, ker z ukazom Printbin lahko oddajam samo vrednosti od 0-255. Če je spremenljivka integer dobim na drugi strani dve različni števili.
Problem pa je tudi na sprejemni strani in to je oblika If stavka.
V tej obliki If (Tsprejeta - 3300) > 0, javi napako, mora biti brez oklepaja recimo takole If Tsprejeta > 0.
iz Kopra Rudi tvoj primer, pa mi je zelo kompliciran, ne vem kaj je v oddajnemu delu, kaj pa je v sprejemnemu delu.
Prosim za res kakšno preprosto rešitev, naprimer kot je od Igorja, samo da bo Bascom AVR prebavil. Hvala.
LP,marko |
|
Nazaj na vrh |
|
|
rudiP Član
Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 6.05 Kraj: KOPER
|
Objavljeno: Ned Jun 02, 2019 2:02 pm Naslov sporočila: |
|
|
Boš moral še malo naštudirat deklariranje spremenljivk ali v C-ju ali Bascom
Ker želiš pošiljati temperature v plusu ali pod ničlo rabiš signed tip podatkov.
Ko boš tip definiral boš videl, da je teh podatkov(bytov lahko več) kot le eden, razen v tipu Byte. Zato sem definiral Dim T1 as single. Single ima 4 byte.
Igo piše v C-ju ti pa v Bascomu zato Igo-tov primer Bascom prevajalnik ne prežveči. V obeh jezikih je potrebno imeti več začetnega znanja.
V mojem primeru se za oddajnik uporabi prvi if stavek, za sprejem pa drugi IF stavek.
Tistega ki ne rabiš pobrišeš. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.01
|
Objavljeno: Ned Jun 02, 2019 3:32 pm Naslov sporočila: |
|
|
Podrobnosti Bascoma ne poznam.
Teoretično znam predelati delujoč program, ki vsebuje vse tipe spremenljivk in vse oblike vsega možnega, da lahko vidim primere strukture programa, potem pa vstavim svoje spremenljivke, kopiram kose podprogramov in nekako sestavim delujoč program.
Ampak s telefonom tega ne počnem ...
Oddajna stran:
T1 = IzmerjenaT1 + konstantaT1
T2 = IzmerjenaT2
T3 = IzmerjenaT3
Oddajno zaporedje:
Pribtbin 251
Printbin T1
Printbin 252
Printbin T2
Printbin 253
Printbin T3
in to lepo kroži
Na sprejemni strani pa veš, da sprejetemu številu
(251) sledi (T1)
T1 = T1 - konstantaT1
za številom
(252) sledi (T2)
za številom
(253) pa sledi (T3)
Program od @rudiP je v bistvu preveč enostaven, saj ne vsebuje vseh razpoložljivih ukazov, struktur, podatkovnih tipov, ..., da bi lahko vzel posamezne dele ter jih predelal po svoje.
Koda: |
sprejeto = Inkey() (8-bitni podatek 0 ... 255)
;========== Preverjanje sprejetega podatka
If sprejeto = 251 Then
Naslov = 251
End If
If sprejeto = 252 Then
Naslov = 252
End If
If sprejeto = 253 Then
Naslov = 253
End If
If sprejeto < 250 Then
If Naslov = 251 Then
T1 = sprejeto - konstantaT1
End If
If Naslov = 252 Then
T2 = sprejeto
End If
If Naslov = 253 Then
T3 = sprejeto
End If
End If
;==========
Sedaj je možno izpisati T1, T2 in T3 na LCD
|
S tem ko ima vsaka Tx svoj naslov, lahko pošlješ T1, T2 in T3 v poljubnem zaporedju in poljubno pogosto.
Lahko pošlješ Naslov 251 in potem 10-krat zapored samo T1, nato Naslov 252 in T2, nato spet Naslov 251 in 10-krat zapored T1, nato pa še Naslov 253 in T3. In spet Naslov 251, ...
Osnovni pogoj je samo, da je sprejeto < 250 za podatek in sprejeto > 249 za Naslov 6-ih možnih spremenljivk (250, 251, 252, 253, 254, 255).
Daj poleg svoje kode piši komentarje !!! (da jih bom lahko tudi jaz).
Sedaj namreč ne vem s katerim znakom jih ločim od kode
// komentar
; komentar
/* komentar
... _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
rudiP Član
Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 6.05 Kraj: KOPER
|
Objavljeno: Ned Jun 02, 2019 9:04 pm Naslov sporočila: |
|
|
Igo, moj program je enostaven vendar delujoč. Za Marka11 pa preveč zahteven !
Da ga ne bom preveč mešal odstopam od nadaljne debate. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Tor Jun 04, 2019 6:55 pm Naslov sporočila: |
|
|
Hi
Igor in ostali, sedaj sem rešil ta problem, toda z manjšimi popravki v programu.
Ne vem zakaj je tako, da s tem radijskim modulom HM-TRP868, lahko pošiljam samo Byte spremenljivke (0-255). Vse se mora odvijati v temu razponu, ali pa jaz neznam.
Ne vem kako poslati večje število (integer), ali pa negativno število preko radijskega modula, prosim za nasvet.
Popravljena koda:
Koda: |
;Oddajna stran:
T1 = Tb + 121 ; IzmerjenaT1 + konstantaT1
T2 = Tp + 122
T3 = Tz + 123
;Oddajno zaporedje:
Pribtbin 121
Printbin T1
Printbin 122
Printbin T2
Printbin 123
Printbin T3
;in to lepo kroži
;-------------------------------------------------------------
sprejeto = Inkey() (8-bitni podatek 0 ... 255)
;========== Preverjanje sprejetega podatka
If sprejeto = 121 Then
Naslov = 121
End If
If sprejeto = 122 Then
Naslov = 122
End If
If sprejeto = 123 Then
Naslov = 123
End If
If Naslov = 121 Then
T1 = sprejeto - konstantaT1
End If
If Naslov = 122 Then
T2 = sprejeto
End If
If Naslov = 123 Then
T3 = sprejeto
End If
End If
;==========
Sedaj je možno izpisati T1, T2 in T3 na LCD
|
Pa šeto:
Kako napisati kodo, da bi se pošiljali podatki temp. samo takrat ko se vrednost spremeni, sedaj pošiljam vsako minuto.
lp, marko |
|
Nazaj na vrh |
|
|
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2105 Aktiv.: 10.08 Kraj: Krško
|
Objavljeno: Tor Jun 04, 2019 8:24 pm Naslov sporočila: |
|
|
Mogoče ti dam samo idejo;
Shraniš zadnjo prebrano vrednost in jo vsako minuto primerjaš z novo vrednostjo in pod pogojem, da se je spremenila za XX vrednost pošlješ podatek in shraniš vrednost na isto mesto kot prejšnjo. To vse skupaj ponavljaš. To velja na oddajni strani. _________________ Denis |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.01
|
Objavljeno: Tor Jun 04, 2019 8:43 pm Naslov sporočila: |
|
|
Od kod 121, 122 in 123?
Zakaj si izpustil If sprejeto < 250 ?
Potem daj tam kvečjemu If sprejeto < 120 , da ločiš temperature in naslove.
Seveda je po tem največji dovoljen razpon od T1 manjši od 120°C.
In zakaj na oddajni strani prišteješ 121, 122 in 123, na sprejemni strani jih pa ne odšteješ?
If (T1stara različna od T1izmerjena) Then
Printbin 121
Malo počakaj, da sprejemnik sprejme Naslov
T1 = T1izmerjena + konstantaT
Printbin T1
T1stara = T1izmerjena
End If
If (T2stara različna od T2izmerjena) Then
Printbin 122
Malo počakaj, da sprejemnik sprejme Naslov
T2 = T2izmerjena
Printbin T2
T2stara = T2izmerjena
End If
If (T3stara različna od T3izmerjena) Then
Printbin 123
Malo počakaj, da sprejemnik sprejme Naslov
T3 = T3izmerjena
Printbin T3
T3stara = T3izmerjena
End If
KonstantaT1 mora biti večja od abslutne vrednosti najbolj negativne T1izmerjena.
Če je T1izmerjena lahko -30°C, mora biti konstantaT1 vsaj 35, da bo vsota vedno pozitivna. _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Pon Jun 24, 2019 5:58 pm Naslov sporočila: |
|
|
igo je napisal/a: |
Od kod 121, 122 in 123?
Zakaj si izpustil If sprejeto < 250 ?
Potem daj tam kvečjemu If sprejeto < 120 , da ločiš temperature in naslove.
Seveda je po tem največji dovoljen razpon od T1 manjši od 120°C.
In zakaj na oddajni strani prišteješ 121, 122 in 123, na sprejemni strani jih pa ne odšteješ?
KonstantaT1 mora biti večja od abslutne vrednosti najbolj negativne T1izmerjena.
Če je T1izmerjena lahko -30°C, mora biti konstantaT1 vsaj 35, da bo vsota vedno pozitivna. |
Od kje, kar spomnil sem se, saj temperatura vode ne presega 120 stopinj.
Tu spodaj je koda, ki sem jo napisal za odd. in spr. Zaenkrat dela pravilno.
Koda za oddajnik:
Koda: |
If Stevec_odd => 60 Then
T1 = Tb + 121
T2 = Tz1 + 122
T3 = Tp + 123
Printbin 121
Waitms 100
Printbin T1
Waitms 100
Printbin 122
Waitms 100
Printbin T2
Waitms 100
Printbin 123
Waitms 100
Printbin T3
Waitms 100
Stevec_odd = 0
End If
|
Koda sprejemnika:
Koda: |
Sprejeto = Inkey()
Waitms 100
If Sprejeto = 121 Then
Naslov = 121
End If
If Sprejeto = 122 Then
Naslov = 122
End If
If Sprejeto = 123 Then
Naslov = 123
End If
If Sprejeto > 120 Then
If Naslov = 121 Then
T1 = Sprejeto - 121
End If
If Naslov = 122 Then
T2 = Sprejeto - 122
End If
If Naslov = 123 Then
T3 = Sprejeto - 123
End If
End If
Locate 1 , 1 : Lcd "Tb: "
Locate 1 , 5 : Lcd T1 ; Spc(2)
Locate 1 , 8 : Lcd "Tz1: "
Locate 1 , 13 : Lcd T2 ; Spc(2)
Locate 2 , 1 : Lcd "Tp: "
Locate 2 , 5 : Lcd T3 ; Spc(2)
|
Zdaj pa ne razumem kako naj izračunam na oddajni strani, da pošlje negativno vrednost.
Lp, |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.01
|
Objavljeno: Pon Jun 24, 2019 6:40 pm Naslov sporočila: |
|
|
Nedelja, 2. Junij ob 14:32
Tam lepo piše, da izmerjeni temperaturi T1izmerjena prišteješ konstantoT1, da postane pozitivna.
Če je najnižja T1izmerjena -40°C, naj bo konstantaT1 enaka 45, da bo vsota vedno pozitivna.
Ko na sprejemni strani sprejmeš vrednost, ki spada na naslov 251 , od nje odšteješ konstantaT1 in spet dobiš T1izmerjena.
Ko je T1izmerjena najvišja možna, mora biti vsota T1izmerjena + konstantaT1 manjša od naslova T1. V vsakem primeru morajo biti poslane vrednosti temperatur manjše od njihovih naslovov, zato je tam dodaten pogoj
If sprejeto < 250 Then
... so to temperature, sicer so pa naslovi.
Preberi program po slovensko.
If (Če je)
... je pogoj, ki mora biti izpolnjen
Then (Potem se zgodi)
... kar se mora
End If (konec If stavka)
Znotraj If pogoja:
Naslov = 251 (naslov enak 251)
sprejeto < 250 (manjše od 250)
V navadni vrstici:
Naslov = 251 (naslov postane enak 251)
sprejeto = Inkey() (sprejeto postane enako tistemu, kar je vrnila funkcija Inkey()) .
Obstaja pa še možnost, da po 5 sekundah brez komunikacije na sprejemni strani Naslov sam postane enak 0. V tem primeru je prva sprejeta vrednost vedno Naslov od 0 do 255, druga pa vedno vrednost od 0 do 255. Če naslednja vrednost sledi prej kot čez 5 sekund, se shrani na Naslov+1, naslednja na Naslov+2, ... dokler ne nastane 5 sekund prekinitve pošiljanja. _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 85 dni
Powered by phpBB © 2001, 2005 phpBB Group
|