Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

ATmega8 a modelářské servo
Jdi na stránku Předchozí  1, 2, 3, 4
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
nekmil



Založen: Mar 06, 2005
Příspěvky: 787
Bydliště: Havířov

PříspěvekZaslal: st prosinec 17 2008, 16:42    Předmět: Citovat

Já jsem si napsal zkušební program na servo a zjistil jsem nesrovnalosti zde:
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10

Reload jsem musel nastavit na hodnotu 1 abych dosáhl periody 20ms
(měřeno osciloskopem)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: po srpen 17 2009, 6:32    Předmět: Citovat

Nekmile a nemohla tato nesrovnalost být tím, že jsi místo interního oscilátoru použil externí krystal třeba 12MHz nebo 16MHz?

Používal jsem interní krystal u příkazu PULSEOUT :
Pulseout Portb.3, 400
http://avrhelp.mcselec.com/index.html?pulseout.htm

pak jsem nahradil interní oscilátor za externí krystal 16MHz a
příkaz: Pulseout Portb.3, 400 samozřejmě přestal fungovat z důvodu změny míry časování...

Abych získal stejný efekt, musím použít Pulseout Portb.3, 1
nebo Pulseout Portb.3, 0 , tedy hodnotu 0 a 1 a zde je problém:

Jak udělat se stábvajícím krystalem to, abych hodnotu PERIOD u PULSEOUT mohl měnit po desetinkách=
0,1 0,2 0,3 0,4 0,5 0,6 .......... 1

jak funguje přepočítávání hodnot při použití interního 1MHz a externího 16MHz krystalu pro zachování stejné funkčnosti programu?


děkuji
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
popopepe



Založen: Oct 26, 2005
Příspěvky: 549

PříspěvekZaslal: po srpen 17 2009, 7:40    Předmět: Citovat

michalino napsal(a):
Nekmile a nemohla tato nesrovnalost být tím, že jsi místo interního oscilátoru použil externí krystal třeba 12MHz nebo 16MHz?

Používal jsem interní krystal u příkazu PULSEOUT :
Pulseout Portb.3, 400
http://avrhelp.mcselec.com/index.html?pulseout.htm

pak jsem nahradil interní oscilátor za externí krystal 16MHz a
příkaz: Pulseout Portb.3, 400 samozřejmě přestal fungovat z důvodu změny míry časování...

Abych získal stejný efekt, musím použít Pulseout Portb.3, 1
nebo Pulseout Portb.3, 0 , tedy hodnotu 0 a 1 a zde je problém:

Jak udělat se stábvajícím krystalem to, abych hodnotu PERIOD u PULSEOUT mohl měnit po desetinkách=
0,1 0,2 0,3 0,4 0,5 0,6 .......... 1

jak funguje přepočítávání hodnot při použití interního 1MHz a externího 16MHz krystalu pro zachování stejné funkčnosti programu?


děkuji


Interní nebo externí krystal je jedno - pouze správně nastavit fuse bity. Jde o vnitřní takt procesoru. Při použití 16MHz prostě ten puls bude 4x kratší než při použití 4MHz krystalu, a 16 x rychlejší než při použití 1MHz, toť vše. Takže proměnnou Period vynásob 4 ( při použití 16MHz namísto 4MHz), a mělo by to běhat.
Jinak co tik krystalu, to jedna instrukce ( teda skoro vždy). Takže při 1MHz ti běží interní taktování sběrnice procesoru na 1MHz, při 16MHz krystalu ti běží interní taktování na 16MHz. Takže všechno je 16 x rychlejší.
Pokud jsi tedy například někde při krystalu 1MHz generoval nějakou časový údaj, např. 16 vteřin, tak pokud jenom vyměníš za krystal 16MHz, tak ta doba bude místo 16 vteřin pouze jedna vteřina.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: po srpen 17 2009, 9:00    Předmět: Citovat

Děkuji za osvětlení...

Po přidání ext. 16MHz krystalu se mi stalo, jak je uvedeno výše, že místo hodnoty na levé straně (pro názorný příklad jsou uvedeny vlevo náhodné hodnoty) musím psát hodnoty na pravé straně, které jsou reálné, tak to funguje, ale.......

400 je nyní 1
300 je nyní 0

hodnotě 350 tedy přísluší hodnota 0,5 ... mužu takovouto hodnotu nějak dostat do příkazu : PULSEOUT ? Jak se s desetinným číslem můžu poprat v PULSEOUT, pokud se jedná o jedno desetinné místo, třeba..takto?:

Dim Cil As String * 8

Cil = "123"
Print Format(cil , " 0.0") ' " 12.3"
'Print Cil


a ještě prosím otázka..

Jaký je obecně lepší příkaz a způsob pro ovládání serva?
PULSEOUT nebo něco jiného..PWM...? Z hlediska zatěžování procesoru, apod.?

děkuji
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
popopepe



Založen: Oct 26, 2005
Příspěvky: 549

PříspěvekZaslal: po srpen 17 2009, 9:56    Předmět: Citovat

michalino napsal(a):
Děkuji za osvětlení...

Po přidání ext. 16MHz krystalu se mi stalo, jak je uvedeno výše, že místo hodnoty na levé straně (pro názorný příklad jsou uvedeny vlevo náhodné hodnoty) musím psát hodnoty na pravé straně, které jsou reálné, tak to funguje, ale.......

400 je nyní 1
300 je nyní 0

hodnotě 350 tedy přísluší hodnota 0,5 ... mužu takovouto hodnotu nějak dostat do příkazu : PULSEOUT ? Jak se s desetinným číslem můžu poprat v PULSEOUT, pokud se jedná o jedno desetinné místo, třeba..takto?:

Dim Cil As String * 8

Cil = "123"
Print Format(cil , " 0.0") ' " 12.3"
'Print Cil


a ještě prosím otázka..

Jaký je obecně lepší příkaz a způsob pro ovládání serva?
PULSEOUT nebo něco jiného..PWM...? Z hlediska zatěžování procesoru, apod.?

děkuji


Nevím, pak ten příkaz pulseout funguj nějak divně. Nemám to teď jak ověřit, ale pokud je v návodu uvedeno, že pro 4MHz krystal je hodnota uvedena v us, pak např. pulseout portb,a,4000 by měl vygenerovat puls o délce 4ooous, čili 4 ms!. Pokud nahradíš krystalem 16MHz, pak by měl při stejné konfiguraci vygenerovat pulse 4 x kratší, čili 1ms. Pokud by to takhle fungovalo, pak nemusíš řešit žádné desetinky, protože vše budou násobky us, např. pro puls 1,25ms a krystelm 16MHz by jsi měl nastavit Pulseout portb,a,5000. (Pokud se teda nepletu).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: po srpen 17 2009, 10:20    Předmět: Citovat

Popopepe,

děkuji opět za osvětlení...vyzkouším to jak se dostanu ke stolu a dám vědět, jestli to dopadlo...

Jinak jsem teď koumal ty desetinky a přišel jsem ke krásnému příkladu......kdyby náhodou někdo tuto věc řešil

Dim S As Single , Z As String * 10

S = 12.36789
Print S ' mame 12.36789
Z = Fusing(s , "#.#")
Print Z ' mame 12.3

tak badani zdar
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
popopepe



Založen: Oct 26, 2005
Příspěvky: 549

PříspěvekZaslal: po srpen 17 2009, 11:26    Předmět: Citovat

michalino napsal(a):
Popopepe,

děkuji opět za osvětlení...vyzkouším to jak se dostanu ke stolu a dám vědět, jestli to dopadlo...

Jinak jsem teď koumal ty desetinky a přišel jsem ke krásnému příkladu......kdyby náhodou někdo tuto věc řešil

Dim S As Single , Z As String * 10

S = 12.36789
Print S ' mame 12.36789
Z = Fusing(s , "#.#")
Print Z ' mame 12.3

tak badani zdar


Jen pro upřesnění, výsledek
S=12.36789
Z=fusing(s,"#.#")
Print Z bude výsledek 12,4 a nikoliv 12,3, protože fusing s #.# na konci zaokrouhluje. Jinak viz help Bascom Smile
A počítat můžeš jen s tím single, string je jenom pro zobrazení Smile
Bádání zdar
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: po srpen 17 2009, 11:37    Předmět: Citovat

popopepe,

děkuji za upřesnění a za opravu....

A jak by se dalo počítat prosím dále s tím STRING = 12,4....
Kdybych chtěl toto číslo použit, tedy počítat dále s jedním desetinným místem, dosazovat jej do příkazů, apod?

Zatím jsem vykoumal toto, což převádí ze string na číslo... ovšem...desetinné místo zmizí..pokud tam je..chapu, kvuli Integer, ale i tak...jde to nejak obelstit?

Dim Instring as String*10
Dim Varval as Integer
Instring = " 781"
Varval = Val(Instring)
'Varval = 781


Děkuji


Naposledy upravil michalino dne po srpen 17 2009, 12:39, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
popopepe



Založen: Oct 26, 2005
Příspěvky: 549

PříspěvekZaslal: po srpen 17 2009, 12:39    Předmět: Citovat

String slouží pro uchovávání textu. Na začátku nadefinuješ nějakou proměnnou jako string, musíš určit její délku např. string*5 ti vytvoří v paměti místo pro 5 znaků.
Jelikož je to jenom textový řetězec, špatně se s ním počítá Smile. V některých případěch se sice dá přetypovat na jiný typ, ale většinou to moc nejde.
Takže ideál je vše nejdříve spočítat pomocí matematických typů proměnných (byte, word, long, single a podobně) a pak už jen přetypovat na string a ten zobrazit.
Jinak pokud je to možné, vyhni se počítání s desetinou čárkou. Zabírá to moc paměti, výpočty trvají dlouho, zaokrouhlování a pod. Lepší je se tomu vyhnout. Někdy to ale nejde, no...
Doporučuji číst v manuálu k Bascomu, většinou tam najdeš, co hledáš.

Jinak pokud chceš počítat např. s číslem 12,4, tak nejlepší je asi vynásobit 10, dostaneš 124 ( což je obyčejný byte), pak provedeš výpočty co chceš a na konci podělit výsledek zase deseti Smile Bude ti stačit jeden single a jeden byte a nikoliv stádo single proměnných.


Naposledy upravil popopepe dne po srpen 17 2009, 12:42, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: po srpen 17 2009, 12:41    Předmět: Citovat

popopepe, děkuji, zeditoval jsem výče psaný příspěvek o příklad převodu ze string na integer....podle bascomu navodu...

no...koumam dale...

děkuju Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
popopepe



Založen: Oct 26, 2005
Příspěvky: 549

PříspěvekZaslal: po srpen 17 2009, 13:04    Předmět: Citovat

No nejdřív bych si ujasnil, proč vlastně chci počítat se stringem. Vždyť tu původní hodnotu máš v tom single... tak použij tu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: po srpen 17 2009, 16:15    Předmět: Citovat

Tak popopepe, máš pravdu, při použití 16MHz krystalu jepři použití příkazu PULSEOUT nejlépe používat hodnoty od 6050 do 7200 ...

Tvůj výpočet tak byl správný v příspěvku výše, neboť odchylka je způsobena potenciometrem serva (buďto jeho natočením nebo zařazením pevného odporu místo toho potenciometru) a vše funguje mnohem s větším rozlišením a mnohem rychleji s tímto 16MHz krystalem, paráda

děkuju

PS: ty čísla s desetinnou čárkou mi moc nejsou jasná, hlavně zaokrouhlování, když dám číslo SINGLE

a mám třeba
12,5 + 12,5, tak mi to udělá: 12,600032+12,600032=25,000064 a já bych potřeboval dostat jen to 12,6+12,6=25,2 ...jedno desetinné místo ve formě čísla, které bych dále mohl zpracovat...

nepotřebuju to teď , jen mě zaujalo, že je to "problém" tak nad tím koumám...

díky...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
popopepe



Založen: Oct 26, 2005
Příspěvky: 549

PříspěvekZaslal: po srpen 17 2009, 17:29    Předmět: Citovat

Všeobecný problém výpočtů s desetinou čárkou. Zaokrouhlování a podobně. Pokud můžeš, tak se jim vyhni. Místo 12,5 +12,2 použij 125+122 a výsledek vyděl deseti.
Pokud to potřebuješ jen na zobrazení tak jukni na příkaz MOD.

Např.
dim a as byte
dim k as byte
dim c as word
Dim x as word
A=125 'ty chceš 12,5
k=122 'ty chceš 12,2
c=a+k 'výsledek je 247
lcd c

a teď ten trik

c=c/10 'výsledek je 24
cls
lcd c 'tady si ho zobraz
x=c mod 10 'výsledek je zbytek po dělení, tedy 0,7

lcd c;".";x 'zobrazí se ti výsledek 24.7

vyzkoušej a uvidíš Smile
Samozřejmě na velké výpočty to není, pak použij single...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalino



Založen: Aug 03, 2009
Příspěvky: 348

PříspěvekZaslal: út srpen 18 2009, 7:58    Předmět: Citovat

Popopepe,

tak jsem zkoušel Tvůj program, nicméně mi pořád vypadával zbytek po dělení (příkaz MOD) hodnota = 0,4 ... tak jsem koumal a koumal, až mě Tvůj program dokoumal z předchozí tvé varianty:

$sim
$regfile = "m8def.dat" ' specify the used micro
$baud = 9600
$hwstack = 100
$swstack = 64
$framesize = 64

Dim A As Byte
Dim K As Byte
Dim C As Word
Dim X As Word


Do
Input "Vlož X " , A ' vlozim 125 chci totiz 12,5
Input "Vloz Y " , K 'vlozim 122 chci totiz 12,2


C = A + K

Print C 'vyleze 247



c=c/10 'výsledek je 24
cls
Print "C/10 " ; C 'výsledek je 24

x=c mod 10 'výsledek je zbytek po dìlení, tedy 0,7

Print "C mod 10 " ; C ; "." ; X ' POZOR zobrazí se VYSLEDEK 24,4
' ma se zobrazit 24,7
Wait 1
Loop
End



*********************



na tuto novou variantu, která mi fakčí dobře:


$sim '!!!Odstranit pøi programování - zrychlení simulace (odstraní èasové prodlevy)
$regfile = "m8def.dat" ' specify the used micro
$baud = 9600
$crystal = 8000000 ' used crystal frequency
$hwstack = 100
$swstack = 64
$framesize = 64


''''''''''''''''''''''''''' HLAVNI PROGRAM '''''''''''''''''''''''''''''''''''

Dim R As Word
Dim B As Word
Dim U As Word
Dim Rest As Word
Dim Cest As Word

Input "Vlož R " , R
Input "Vloz B " , B

U = R + B
' Rest = R Mod B
Print "U=R+B = " ; U
Cest = U / 10
Print "U / 10 = " ; Cest
Rest = U Mod 10
Print "U mod 10 = " ; Rest

Print R ; "+" ; B ; "= " ; Cest ; "," ; Rest

End



vychytání následující tohoto programu spočívá v tom, že se do vstupních dvou čísel automaticky při následném výpisu Print R ; "+" ; B ; "= " ; Cest ; "," ; Rest zařadí desetinná čárka.. tedy když chci 12,3 napsat, tak napíšu do programu: 123 a na konci, by se měl nejen výsledek objevit s desetinnou čárkou, ale také zadávané hodnoty 12,3

to už ale si s tím nebudu tak hrát, zde přikládám program dle Tvých rad....princip je jasný, děkuji ti za pomoc a objasnění..

přeju dobré ráno
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3, 4
Strana 4 z 4

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.20 sekund