HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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:
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.
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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:"
RES
RES
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.
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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.
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
SEIFredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
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 
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
ja maar met pic's kan ik helemaal...!!! niks.. en alle talen anders dan gewoon assembly gaan mij wel een beetje boven de pet..
Gerwin
An amplifier is just a modulator for a power supply |Toffe Gebruiker
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.
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
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 
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
Nou, goed nieuws 
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
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
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 
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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 
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
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 
HBontekoe
iets zonder duidelijke functie is vaak meer waard als iets nuttigs...
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 