Sida 3 av 3
					
				
				Postat: 7 januari 2007, 21:14:14
				av JimmyAndersson
				Jag tycker du gör helt rätt i det fallet. Då tvingas man tänka lite själv och lär sig betydligt mer än om man varit bekväm och förväntat sig att få hela lösningen serverad.
Min elektronik/fysik/data-lärare i högstadiet gjorde likadant.
En del elever tyckte han var den jobbigaste läraren och andra (bl.a jag) tyckte raka motsatsen. Gissa vilka som lärde sig mest?  

  Enda nackdelen var att han aldrig gav någon en 5a (högsta betyg). Lite underligt med tanke på att jag alltid hade alla rätt på läxförhören i fysik. Det som möjligen skulle kunna dra ner betyget var väl att jag inte pratade mer än nödvändigt, men man var ju inte direkt där för att prata...
Oj, nu hamnade jag lite off-topic.  

 
			 
			
					
				
				Postat: 7 januari 2007, 21:43:32
				av oJsan
				JimmyAndersson skrev:För att servot ska stå stilla så är det absolut lättaste att helt enkelt sluta skicka pulser. Fungerade iallafall fint på min kamerarobot.
Men kom ihåg att servot då inte "håller" sitt läge utan med viss kraft kan vridast manuellt.. (bra att tänka på i vissa tillämpningar)
Sodjan:
Ok, som man frågar får man svar... kan hålla med till viss del, men man borde ju kunna höja sig lite genom att i allafall _försöka_ ge ett svar. 
Men men.. whatever...
 
			 
			
					
				
				Postat: 8 januari 2007, 15:30:07
				av sebbe
				hoppas att det går bra att låna din tråd litegrann
men om man ska skicka en puls på 1.5ms var 20 ms skulle det gå att göra det så här då i mikrobasic
Kod: Markera allt
program ServoSimple
Main:
TRISB.0 = 0
PORTB = 0
start:
  SetBit(PORTB,0)
  Delay_ms(1)
  Delay_us(500)
  ClearBit(PORTB,0)
  Delay_ms(20)
  goto start
End.
det kanske inte är så snygg men funkar det?
mvh 
sebbe
 
			 
			
					
				
				Postat: 8 januari 2007, 18:18:58
				av bengt-re
				Här är ett exempel på en 12F675, styr läget med två potar och välj läge med omkopplare.
	list      p=12F675       ; list directive to define processor
	#include <p12f675.inc>    ; processor specific variable definitions
	__CONFIG _CP_OFF & _WDT_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT
temp 	EQU 0x20
x	 	EQU 0x21
y	 	EQU 0x22
i		EQU 0x23
pot1	EQU 0x24
pot2	EQU 0x25
pot3	EQU 0x26
bas		EQU 0x27
stat	EQU 0x28
;*************************************
	org 0x3FF
	org 0x00
	banksel TRISIO			;Select RB1
	Call 0x3ff
	movwf OSCCAL			;Calibrate osc
    movlw b'00101111'
    movwf TRISIO			;GPIO,4 output, the rest inputs
	movlw b'00100000'
	movwf WPU				;Mask WPU on GP1
	bcf OPTION_REG,7
	banksel GPIO			;Turn on WPU
	movlw b'11111111'
	movwf CMCON				;Turn off comparator
	banksel ADCON0
	movlw b'00000001'
	movwf ADCON0			;Turn on AD
	banksel ANSEL
	movlw b'00010111'
	movwf ANSEL				;Setup AD AN0,AN1,AN2 to analog inputs
	banksel GPIO
	movlw b'00100000'
	andwf GPIO
	movwf stat
	goto MAIN
 	
; =========================================
MAIN
	movlw 0x14
	movwf i
	clrf temp
	Call longwait
	Call getPot
	banksel GPIO
	movlw 0x90
	movwf bas
	btfss GPIO,5
	call pos1
	btfsc GPIO,5
	call pos2
	call wait
	goto MAIN
; =========================================
longwait
	decfsz temp
	goto longwait
	decfsz i
	goto longwait
	return
; =========================================
pos1
	banksel GPIO
	bsf GPIO,4
baswait1
	decfsz bas,1
	goto baswait1
delay1
	nop
	decfsz pot1,1
	goto delay1
	bcf GPIO,4
	RETURN
; =========================================
pos2
	banksel GPIO
	bsf GPIO,4
baswait2
	decfsz bas,1
	goto baswait2
delay2
	nop
	decfsz pot2,1
	goto delay2
	bcf GPIO,4
	RETURN
; =========================================
wait
	nop
	decfsz i,1
	goto wait
	RETURN
; =========================================	
getPot
	banksel ADCON0
	movlw b'00000001'
	movwf ADCON0			;Start conversion on AN0
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bsf ADCON0,1
getAN0
	btfsc ADCON0,1
	goto getAN0	
	banksel ADRESH
	movfw ADRESH
	movwf pot1				;Put result in pot1
	banksel ADCON0
	movlw b'00000101'
	movwf ADCON0			;Start conversion on AN1
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bsf ADCON0,1
getAN1
	btfsc ADCON0,1
	goto getAN1	
	banksel ADRESH
	movfw ADRESH
	movwf pot2				;Put result in pot1
	banksel ADCON0
	movlw b'00001001'
	movwf ADCON0			;Start conversion on AN2
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bsf ADCON0,1
getAN2
	btfsc ADCON0,1
	goto getAN2	
	banksel ADRESH
	movfw ADRESH
	movwf pot3				;Put result in pot1
	retlw 0x23
	END
			 
			
					
				
				Postat: 8 januari 2007, 19:10:53
				av JimmyAndersson
				bengt-re: Trevligt med lite asm-kod så man får lite fler idéer.  
 
sebbe: Ungefär sådär gjorde jag med min fläktstyrning till servern. Fungerar fortfarande felfritt, så man *kan* göra så, men det finns noggrannare sätt. Timer t.ex.
Fast du behöver inte ha två delayrader (1ms + 500µs) efter varandra. Det fungerar fint med enbart:
Delay_us(1500)
MikroBasic har lite problem med tider som är ca 1-40ms när man kör med delay_ms(). Då är det bättre att använda delay_us() istället.
 
			 
			
					
				
				Postat: 8 januari 2007, 20:04:22
				av sodjan
				En detalj, men ändå... 
Så som bengt-re's kod ser ut *här* fungerar den inte.
Eftersom code-taggarna inte verkar vara använda, så ligger
allt i pos 1 på varje rad och MPASM kommer att ge en massa
varningar/errors. Det blir också lite svårläst.
Äh, va f-n, när vi ändå är på gång.... 
>  "bcf OPTION_REG,7" 
"bcf OPTION_REG, NOT_GPPU"
är bättre så vet man vad bit 7 är utan att slå upp det.
"NOT_GPPU" är definierad i p12f675.inc.
>  retlw 0x23 
Varför inte bara "return" ?
Return värdet h'23' används ju i alla fall inte i main. Betyder h'23' något speciellt ?
Sebbes kodexempel fungerar säkert/kanske, men problemet är att det
är väldigt sällan som koden *bara* ska göra det där, och då kommer
det att bli problem. Så pass långa hårdkodade delays är sällan
riktigt bra. Men som en snabb test, visst.
 
			 
			
					
				
				Postat: 8 januari 2007, 20:43:51
				av bengt-re
				Det blev fult när jag copy/pastade, det ligger i olika tablägen i filen...
retlw var en rest ifrån ett tidigare program och fyller aboult ingen funktion nu... 
Jo, har nog en del gamla synder i koden, det är lite fånigt att brhöva slå upp databladet för att veta vilken bit som gör vad...
Och när vi ändå är inne på "osnygghet" så är ju alla dessa nop ar lite fåniga för att få acq-time till A/D, men äää.. fann ju gott om minne kvar 

 
			 
			
					
				
				Postat: 8 januari 2007, 20:49:40
				av sodjan
				> så är ju alla dessa nop ar lite fåniga 
Tja, de fyller ju en funktion... 
Men visst, 10 st "NOP" kan ersättas av 5 st "GOTO $+1"... 

D.v.s 5x2 cykler istället för 10x1 cykler. Och halva programminnet...
 
			 
			
					
				
				Postat: 8 januari 2007, 20:55:21
				av bengt-re
				Yepp eller kanske en decsz runda.... men, men.... 
Jo, antalet är dock väl valt, acq-time är kortare än enligt databladet, men då jag bara använder 8-bitar så räcker 10us för att de 8 MSB skall vara på rätt nivå.