ATmega8 a modeláøské servo

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

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
nekmil
Příspěvky: 780
Registrován: 06 bře 2005, 01:00
Bydliště: Havířov

#46 Příspěvek od nekmil »

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)

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#47 Příspěvek od michalino »

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

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#48 Příspěvek od popopepe »

michalino píše: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.

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#49 Příspěvek od michalino »

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

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#50 Příspěvek od popopepe »

michalino píše: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).

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#51 Příspěvek od michalino »

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

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#52 Příspěvek od popopepe »

michalino píše: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 :-)
A počítat můžeš jen s tím single, string je jenom pro zobrazení :-)
Bádání zdar

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#53 Příspěvek od michalino »

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(a) michalino dne 17 srp 2009, 13:39, celkem upraveno 1 x.

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#54 Příspěvek od popopepe »

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á :-). 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 :-) Bude ti stačit jeden single a jeden byte a nikoliv stádo single proměnných.
Naposledy upravil(a) popopepe dne 17 srp 2009, 13:42, celkem upraveno 1 x.

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#55 Příspěvek od michalino »

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 :)

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#56 Příspěvek od popopepe »

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.

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#57 Příspěvek od michalino »

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...

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#58 Příspěvek od popopepe »

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íš :-)
Samozřejmě na velké výpočty to není, pak použij single...

Uživatelský avatar
michalino
Příspěvky: 348
Registrován: 03 srp 2009, 02:00

#59 Příspěvek od michalino »

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

Odpovědět

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