titel zegt eigenlijk alles al..

ik heb het kort al een keer gezegd in tab 10 van "show your projects 14"

ik ben een toerenteller aan het maken voor dit ding:
http://sevenengineering.web-log.nl/mijn_weblog/images/2009/05/28/img_1690.jpg

Ik gebruik een Hall sensor voor het signaal, deze geeft 1 puls per omwenteling en is gewoon een blokspanning.

Verder wil ik over periodes van 2 tot 3 seconden meten en daarmee vaststellen wat het toerental is.
die waarde moet dan op het LCD terechtkomen en dan 2 tot 3 seconden statisch blijven staan, anders wordt het aflezen echt een ramp.

dit is eigenlijk alles wat hij moet doen, maargoed ik ben zelf nu al weer een dikke 2 tot 3 jaar uit de microcontrollers en mijn kennis van Assembly is laag, ik heb ooit wel een display routine geschreven dus het display heb ik al werkend, maar dat deel van de timers en counters heb ik nog niet echt begrepen..

is er iemand die mij opweg wil helpen of die zegt dat hij zulks een programmatje binnen een paar tellen maakt dan graag, alle hulp is welkom :)

alvast bedankt.

post eens wat je al (werkend) hebt, dat hoeven we dan niet over te doen.

Als je code te lang is, even ergens uploaden en de link hier posten.

Bij deze

.include "m8def.inc"
;control bits quicklinks
.equ	E	= 	PC0	;LCD Enable
.equ	RW	=	PC1	;LCD Read Write
.equ	RS	=	PC2	;LCD Register Select
.equ	BF	=	PB7	;LCD Busy Flag
;button quicklinks

;data port quicklinks
.equ	dispdata	=	PortB
.equ	DDRdata		=	DDRB
.equ	Pindata		=	PinB
;control port quicklinks
.equ	dispcont	=	PortC
.equ	DDRcont		=	DDRC
.equ	Pincont		=	PinC
;register quicklinks


.def 	charactar	=	r0
.def	buffer		=	r16
.def	counter		=	r17
.def	temp		=	r18
.def	move		=	r19	;Move register to store data of line to write r20
.def	move2		=	r20	;Move register to store data of line to wirte r19

.cseg
.org 0x0000
rjmp reset


;LCD initiation and subtoutines
init:
ldi temp, 0xff
out DDRcont, temp
cbi dispcont, E
cbi dispcont, RW
cbi dispcont, RW
ret

busy:
ldi temp, 0x00
out DDRdata, temp
cbi dispcont, RS
sbi dispcont, RW
sbi dispcont, E
nop
sbic Pindata, BF
rjmp busy
cbi dispcont, E
ret

write_data:
rcall busy
ldi temp, 0xff
out DDRdata, temp
sbi dispcont, RS
cbi dispcont, RW
sbi dispcont, E
out dispdata, buffer
cbi dispcont, E
ret

write_instr:
rcall busy
ldi temp, 0xff
out DDRdata, temp
cbi dispcont, RS
cbi dispcont, RW
sbi dispcont, E
out dispdata, buffer
cbi dispcont, E
ret

line1:
lpm
mov buffer, charactar
rcall write_data
inc ZL
dec counter
brne line1
ret

;bootscreen with delayed lines
start:
ldi	counter,16
    ldi	buffer,0x00	    ;LCD naar 1e regel zetten
    rcall	write_instr	;Verstuur instructie
ldi	ZL,LOW(line000*2)	
ldi	ZH,HIGH(line000*2)	
rcall line1
ldi	counter,4
    ldi	buffer,0xc3	    ;LCD naar 2e regel zetten
    rcall	write_instr	;Verstuur instructie
ldi	ZL,LOW(line001*2)	
ldi	ZH,HIGH(line001*2)	
rcall line1
ret



;end of Subroutines part
;Start of normal program sequence


reset:
ldi r16, low(RAMEND)	;init, stack
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
rcall init

ldi buffer, 0b00111000	;8 bit 4 lines 5x7 dots
rcall write_instr
ldi buffer, 0b00001100	;activate LCD
rcall write_instr
ldi buffer, 0b00000001  ;clear LCD
rcall write_instr
ldi buffer, 0b00000110  ;cursor On
rcall write_instr

;writing data to LCD




;timmmer shzzzle 
;timmer 2.5 sec tellen 
;timmer dan data inlezen
;timmer dan wegschrijven naar positie 10 11 12 13 op lcd
;moet kunnen zou je zeggen
;data 2.5 sec op LCD
;1MHZ clock 
;prescaler /256 
;9765 HZ voor 2,5 sec = 0x2625
;inlezen multipleren met 24
;dan RPM wegschrijven
;op locaties 0xc9 0xca 0xcb 0xcc


;ldi	counter,4
;    ldi	buffer,0xc9	    ;LCD naar 2e regel zetten 10de karakter
;    rcall	write_instr	;Verstuur instructie
;ldi	ZL,data voor RPM
;ldi	ZH,data voor RPM
;rcall line1
;ret




rcall start
Endless:

rjmp Endless

;menu
line000: .db "Motor Toerental "
line001: .db "Rpm:"

Hoe nauwkeurig moet de meting worden? 0.00 omw/min? (twee decimalen?)
Het meten gaat zo, een timer starten bij een opgaande flank op een INT pin (je kan externe interrupt instellen op rising edge.) een teller ophogen (inc), en dit 2 tot 3 sec lang blijven ophogen, dan waarde naar LCD sturen, en dan timer en teller resetten, dan weer de volgende meting.
Je kan ook nog de snelheid hieruit bepalen (via van te voren berekende tabel) via de hoeksnelheid, blabla (http://www.wetenschapsforum.nl/index.php?showtopic=6191)
Precaler van een 16-bit timer instellen op 1024, dan laten tellen tot 11718 voor 3 sec (11718*256us=3 sec) als ie op 4MHz draait.

het gaat hier niet om decimalen het blokje loopt tussen de 500 en 7000 tpm als ik maar duidelijk kan zien waar hij ongeveer zit zelfs een nauwkeurigheid van 10 vind ik voldoende.

ik zal eens kijken wat ik kan met je advies..
ik zat zelf al met een waarde van 9768 hz prescaler van 256 op 1 Mhz clock maar jou versie is iets nauwkeuriger

nou ik heb me is bezig gehouden met die timers/counters enzoverder :) en het is me gelukt ik heb een counter die begint met tellen tot 1.5 sec door een interupt en dan een tweede die opgaande flanken telt van het signaal.

dit geheel wordt dan ingelezen en dat gaat ook goed..

maar dan. :S nu moet ik de waarde die ik inlees welke dus 60/1.5=40x te klein is.
MAW de ingelezen waarde moet dus vermenigvuldigt worden met 40 en dan omgezet naar een 4 digit code voor het LCD.. iemand suggesties want hier raak ik de draad kwijt.

.cseg
.org 0x000
rjmp reset

.org 0x001
rjmp start_count

.org 0x007
rjmp compare


;interrupt routines
start_count:
cli
							;push items
push buffer
push temp
							;clear external int
ldi r16, 0b00000000
out GICR, r16
							;start counting to 1.5 sec
ldi buffer, 0b00010000
out TIMSK, buffer
ldi buffer, 0b00000101  	;set prescaler for counting to 1,5 sec prescaler = 1024@4MHz 101
out TCCR1B, buffer				
ldi buffer, 0x00			;set compare register for 1,5 sec
ldi temp, 0x26
out OCR1AH, buffer
out OCR1AL, temp
							;start counting pulses on rising edge
ldi buffer, 0b00000111  	;counting rising edges
out TCCR0, buffer
							;pop back items
pop temp
pop buffer
reti


compare:
cli
							;push items
push buffer
push temp
							;stop counting
ldi buffer, 0b00000000
out TCCR1B, buffer
ldi buffer, 0b00000000  
out TCCR0, buffer

							;data to LCD
							;data is binary in TCNT0 
in buffer, TCNT0





							;clear timers
ldi buffer, 0x00
out TCNT0, buffer
out TCNT1H, buffer
out TCNT1L, buffer
							;set external int
ldi r16, 0b01000000
out GICR, r16
							;pop back items
pop temp
pop buffer
reti



reset:
ldi r16, low(RAMEND)	;init, stack
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, 0b01000000
out GICR, r16
ldi r16,0b0000010
out MCUCR, r16
SEI

Met een pic zou ik het ongeveer zo doen:

start:
g = 0
x = 0
G = COUNTER FREQIngang , 1000
x = g x 60
PRINT AT 1 , 1, DEC x , " Omw/min " ,

goto start

Ongeveer dan he ;)

ja maar met pic's kan ik helemaal...!!! niks.. en alle talen anders dan gewoon assembly gaan mij wel een beetje boven de pet..

Op 4 juni 2009 21:22:52 schreef Fredjuhh:
Met een pic zou ik het ongeveer zo doen:

start:
g = 0
x = 0
G = COUNTER FREQIngang , 1000
x = g x 60
PRINT AT 1 , 1, DEC x , " Omw/min " ,

goto start

Ongeveer dan he ;)

Ik zou het basic noemen.

Mischien heb je hier wat aan?

http://www.avr-asm-tutorial.net/avr_en/calc/MULTIPLICATION.html
http://www.avr-asm-tutorial.net/avr_en/calc/HARDMULT.html

Hoe je dit vervolgens op een scherm krijgt zou ik ook zo niet weten.

nou ik ben weer een avondje verder en heb de multiplier ook aan de gang..

ik heb 40 * 40 = 1600 uitgevoerd in hex 0x28*0x28=0x640
nu moet ik dus alleen nog zien hoe ik die hex/bin naar een fatsoenlijk decimaal krijg zodat ik heb kan wegschrijven naar het LCD..

stukje bij beetje kom ik er wel :)

iig bedankt voor alle hulp alvast.. ik hoop nog een beetje hulp wel te ontvangen

Mijn antwoord was i.d.d. basic: proton software gebruik ik daarvoor, en persoonlijk vind ik dat erg makkelijk ;)
Ik zeg niet dat het goed is, maar voor eenvoudige dingen werkt dat perfect.
In asm kan ik namelijk niks :(

Nou, goed nieuws :D

het is me gelukt en nog voor de absolute deadline ook.. ik zag het heel even somber in, maar met pijn en moeite en een paar late avondjes en een aantal keer een 12volts vonk die een printbaantje deed verwijderen (toch maar een behuizingkje maken) is het me eindelijk gelukt..

zie hier het resultaat Linkje

Ja, dat begint er op te lijken ;)
Maar zit er niet ergens een afwijking in?
92Hz X 60 = 5520 RPM

En ik zie op je display 5320 rpm staan ??
Maar je bent lekker op weg :)

er zit idd een afwijking in, komt omdat ik telkens met 1,5 seconden meet en vermenigvuldig met 40 om TPM te krijgen, MAW een nauwkeurigheid van 40.. dus zowiezo al niet super nauwkeurig.. daarnaast meetje 1,5 sec en de 1,5 sec daarna staat de gemeten waarde op het scherm dus een delay van 1,5 seconden...
maar voor het doel is het goed genoeg dus we doen het er maar mee..

voor mijn eigen auto ga ik wel een stapje verder, daarvoor wil ik op basis van een 8515 een heel digitaal dashboard maken.. maar dat zal nog wel een jaartje duren schat ik zo :P

Aha,
maar hoe doet een fluke dat dan: die meet toch gewoon tussen de pulsen? Dus dan zou ik bedenken dat DIE onnauwkeuriger is ;) (maar dat zal ik wel weer fout hebben ;) )
Enige wat nog zou kunnen: kristal afwijking i.c.m. programma tijd?
Dat je waarden op het display 1,5 sec. later komen moet geen 200rpm schelen.

Maar misschien dat, de beter opgeleiden onder ons, daar wat nuttigs over kunnen zeggen ;)

achja, voor verbeteringen is nog tijd, misschien de hele omrekenprocedure er eens uithalen en kijken wat hij aan Hz meet..

verder nu eerst maar eens racen met dat racemonster uit de eerste post ;)