ecoden
Leuke vacature! http://www.circuitsonline.net/aanbod/cat/8
Hoi allemaal,
Misschien weet iemand van jullie het, ik kom er niet uit. Ik gebruik een atmel attiny26 en Bascom AVR (basic) als compiler. Ik kan maar niet uitvinden waarom de instructies die ik doe zoveel meer vertraging hebben dan dat ik implementeer in de code. Mijn programma staat hieronder.
-wat er gebeurt is dat in plaats van om de 50milliseconden zoals hier in t programma onder gedefinieerd, gebeurt er eerder om de 5 seconden iets met mn servomotor. Hij gaat wel goed rechts, mid, links, rechts en weer overnieuw. Maar dan in een heel langzaam tempo
-extern crystal helpt niet, klokfrequentie omhoog ook niet
-als ik een normale instructie doe bijv maak poort A.0 hoog, wacht 1mS maak poort A.0 laag wacht 1mS dan doet de tiny dat EXACT. mbv t servocommand dus helemaal niet...
Misschien iets met de timer, de waarde erin oid? HELLEP!
CODE:
$regfile = "Attiny26.dat"
$crystal = 4000000
Config Servos = 1 , Servo1 = Portb.6 , Reload = 1
Config Portb.6 = Output
L Alias 17
R Alias 33
Midden Alias 24
Enable Interrupts
Do
Servo(1) = L
Waitms 50
Servo(1) = Midden
Waitms 50
Servo(1) = R
Waitms 50
Loop
End
hallo, ik heb gezien dat servo1 ook wordt geschreven als servo(1), dat is wat anders.
voorts is mij opgevallen dat het programma wat vreemd is opgebouwd, je zou beter om de 20mS een interrupt kunnen geven en in de interupt handler de puls genereren.
ik mis ook on interrupt label
ik wijs maar mogelijke oplossingen aan.
Marcel
AVR C tutorial http://expand.xs4all.nl/avr
Ik vraag mij af wat die Servo(1) routine precies doet. Blijkbaar stuurt die een servo (PWM) puls voor een bepaalde periode. Die routine kost dus ook tijd en is waarschijnlijk de verklaring van de extra vertraging. Verder is deze aansturing ook niet erg netjes. Tijdens de 50ms wait stop je namelijk met de synchronisatie puls en is de servo aan zijn lot overgeleverd.
De ATtiny26 beschikt over een timer1 met PWM module. Daarmee kan je dus een PWM signaal opwekken voor de servo wat door blijft lopen terwijl je programma wat anders aan het doen is. En dan hoef je je niet eens in interrupts te verdiepen. In C heb ik een tijd geleden een voorbeeld geschreven voor een ATtiny2313. Daar gebruik ik weliswaar de 16 bit timer, maar met de 8 bit van de ATtiny26 moet het ook te doen zijn. Dat voorbeeld is vast wel te porten naar Basic. http://expand.xs4all.nl/avr/servo.html
ecoden
Leuke vacature! http://www.circuitsonline.net/aanbod/cat/8
Dank jullie voor de reacties, zeer bruikbaar! Marcel ik ga kijken naar wat jij zegt/gedaan hebt. Ik had die 50ms wacht trouwens ingebouwd omdat ik de servo L,M,R en trug laat draaien, om zo te zorgen dat die servo niet "gek" word. de "reload" value zorgt ervoor dat de ISR elke keer in uS de waarde van reload word uitgevoerd. Reload is 10 geeft elke 10uS. Misschien moet ik die waitms 50 eens weghalen. Waar t dus om gaat, hij doet NIET 50mS wachten hij wacht gewoon ettelijke secondes. Voor mn gevoel staat dat los van de timer en isr
Maar ik ga morgen gelijk eens proberen met timer1, marcel.
Lugtigheid, een interrupt tabel is niet nodig. Ik snap dat ik niet heel helder ben, het komt door "het gemak van bascom" zal ik maar zeggen, hieronder is de uitleg voor de CONFIG SERVO routine, misschien als jij (of iemand anders) die ziet dat ie zegt OH JA nu snap ik wat jij fout doet ecoden... (ik heb zelfs letterlijk een keer gekopierd wat hieronder staat en alles voor de 2de servo weggehaald omdat ik maar 1 servo heb. T werkt NIET)
Syntax
CONFIG SERVOS = X , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = rl
Remarks
The CONFIG SERVOS directive will set up a
byte array with the servo pulse width values and will initialize an ISR that uses TIMER0.
X The number of servo’s you want to control. Each used servo will use one byte of SRAM.
PORT: The port pin the servo is attached too.
RL The reload value for the ISR in uS.
When you use for example :
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 then the internal ISR will execute every 10 uS.
An arrays named SERVO() will be created and it can hold 2 bytes : servo(1) and servo(2).
By setting the value of the servo() array you control how long the positive pulse will last.
After it has reached this value it will be reset to 0.
The reload value should be set to 10. After 20 mS, a new pulse will be generated.
///ecoden: kijk en dat gebeurt dus niet......
You can use other reload values but it will also mean that the repeat value will change.
The PORT pins specified must be set to work as an output pin by the user.
CONFIG PINB.0 = OUTPUT
Will set a pin to output mode.
Resources used
TIMER0 is used to create the ISR.
Example
'name : servos.bas
'copyright : (c) 1995-2005, MCS Electronics
'purpose : demonstrates the SERVO option
'micro : 90S2313
'suited for demo : yes
'commercial addon needed : no
$regfile = "2313def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
'as an option you can use TIMER1
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer
= Timer1
'we use 2 servos with 10 uS resolution(steps)
'we must configure the port pins used to act as output
Config Portb = Output
'finally we must turn on the global interrupt
Enable Interrupts
'the servo() array is created automatic. You can used it to set the time the servo must be on
Servo(1) = 10 '10 times 10 = 100uS on
'Servo(2) = 20 '20 times 10 = 200uS on
Do
Dim I As Byte
Do
For I = 0 To 100
Servo(1) = I
Waitms 1000
Next
For I = 100 To 0 Step -1
Waitms 1000
Next
Loop
End
Hebben jullie ook gemerkt dat de output niet exact is qua timing?
Stel ik heb het volgende:
[code=BASCOM]
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
Waitms 50
Config Servos = 1 , Servo1 = Portb.0 , Reload = 1
Config Portb = Output
Enable Interrupts
Do
Servo1 = 100
Servo(1) = Servo1
Loop
[/code]
Hieruit zou een exacte pwm puls van 1000uS moeten komen.
Nu meet ik op de scoop 1640uS
Enig idee wat de oorzaak kan zijn?
Hebben jullie wel een exacte timing?

