Måling af hastighed med AVR

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
Hejsa
Jeg F8%nsker at mE5%le en hastighed vha. 2 IR-sender/modtagere og en
ATmega32. Det skal gF8%res, sE5% man starter med at mE5%le tiden, nE5%r f=
F8%rste
sensor passeres og stoppes, nE5%r den anden passeres. Jeg har kigget pE5%
dette eksempel: http://winavr.scienceprog.com/avr-gcc-tutorial/program-16-b =
it-avr-timer-with-winavr.html,
men her virker det til, at man starter mE5%lingen, nE5%r B0-indgangen gE5%r
hF8%j og stopper den, nE5%r den gE5%r lav igen. Hvordan E6%ndrer man det
lettest, sE5% den starter/stopper pE5% hvert sit input?

PE5% forhE5%nd tak

T.

Re: Måling af hastighed med AVR

Hejsa
Jeg ønsker at måle en hastighed vha. 2 IR-sender/modtagere og en
ATmega32. Det skal gøres, så man starter med at måle tiden, når første
sensor passeres og stoppes, når den anden passeres. Jeg har kigget på
dette eksempel:
http://winavr.scienceprog.com/avr-gcc-tutorial/program-16-bit-avr-timer-with-winavr.html ,
men her virker det til, at man starter målingen, når B0-indgangen går
høj og stopper den, når den går lav igen. Hvordan ændrer man det
lettest, så den starter/stopper på hvert sit input?

På forhånd tak

T.
----------------------
Nu har jeg ikke lige nærstuderet eksemplet, men det er da bestemt et program
der er til at overskue :o)
Og i den grad overkill med en Mega32, men det kan jo være lige meget.

Eksemplet er lavet med en Capture indgang, det er ofte smart, men i dit
tilfælde skal du bruge to forskelige indgange, og så er det lettere at bruge
almindelge indgange eller interrupt indgange.
Jeg gætter på at du ikke skal måle mikrosekund nøjagtighed, og at
processoren ikke skal lave ret meget andet end at måle hastigheden/tiden
mellem to pulser ?.
Så kan du snildt klare den med helt simple input pins. Det er ekstremt let
at sætte op, og ekstremtlet at arbejde med. Der er ikke så meget register
setup.
Men du skal jo kunne programere lidt selv. Kan du programmere selv? Ellers
kan du godt få noget hjælp herfra.

mvh
Kåre



Re: Måling af hastighed med AVR
Quoted text here. Click to load it

Hej KE5%re

Helt klart. Ja, det er lidt overkill med en mega32, men nu var det
lige den, eksemplet var lavet ud fra ;-)
Eksemplet er jo lavet med en Captureindgang for at kunne benytte
interrupt - det vil jeg ogsE5% gerne lave det med, men som jeg forstE5%r
eksemplet, sE5% starter timeren, nE5%r ICP gE5%r hF8%j og stopper, nE5%r de=
n gE5%r
lav igen - er det ikke rigtigt forstE5%et?
Jeg vil jo netop have een fotosensor til at starte timeren og en anden
til at stoppe den. Det lyder nE6%sten som en S/R Flip-flop, men hvorfor
skulle man dog blande en F/F ind i det, nE5%r det da bF8%r laves i SW'en -
der er vel andre, der har haft behov for at lave et lignede projekt
fF8%r? :-)
Det skal faktisk bruges til at aflE6%se "mundingshastigheden" fra en
katapult, sE5% lidt tidskritisk er det da.
Jo, jeg kan godt programmere, men man kan jo altid blive dygtigere af
andres erfaringer :-)

Mvh.

T.

Re: Måling af hastighed med AVR
Quoted text here. Click to load it

Kan softwaren ikke lave en S-R FlipFlop?


Klaus
--
  Modelbane Europas hjemmeside: http://www.modelbaneeuropa.hadsten.dk
     Min egen hjemmeside nu med nyt domæne http://www.moppe.dk
We've slightly trimmed the long signature. Click to see the full one.
Re: Måling af hastighed med AVR
Hej Kåre

Helt klart. Ja, det er lidt overkill med en mega32, men nu var det
lige den, eksemplet var lavet ud fra ;-)
Eksemplet er jo lavet med en Captureindgang for at kunne benytte
interrupt - det vil jeg også gerne lave det med, men som jeg forstår
eksemplet, så starter timeren, når ICP går høj og stopper, når den går
lav igen - er det ikke rigtigt forstået?
Jeg vil jo netop have een fotosensor til at starte timeren og en anden
til at stoppe den. Det lyder næsten som en S/R Flip-flop, men hvorfor
skulle man dog blande en F/F ind i det, når det da bør laves i SW'en -
der er vel andre, der har haft behov for at lave et lignede projekt
før? :-)
Det skal faktisk bruges til at aflæse "mundingshastigheden" fra en
katapult, så lidt tidskritisk er det da.
Jo, jeg kan godt programmere, men man kan jo altid blive dygtigere af
andres erfaringer :-)

Mvh.

T.
-------------------------------
Du har jo nok pins nok, så jeg ville bare vælge en fotosensor ind på hver
sin interruptindgang.
Bland Capture funktionen ude af det.

Start en timer når det ene interrupt trigger, og stop timeren og udfør
beregning, sende data osv når det andet interrupt kommer.
Det kræver ingen ekstra ekstern hardware, og koster vel ikke mere end 10-20
linier kode, for selve interrupt/timing delen.

Du kan jo bruge Mega32'erens 16 bit timer 1, sætte prescaler så du får en
tilpas opløsning. Hvis de 16 bit ikke er nok må du jo så enable overflow
interrupt for timeren, så du kan tælle til mere end 65535 ticks.
Nulstil timeren på INT0 (fotocelle1), og aflæs den på INT1 (fotocelle 2).

mvh
Kåre



Re: Måling af hastighed med AVR
Quoted text here. Click to load it
r

Hej KE5%re

Det lyder ikke helt tosset. Det prF8%ver jeg. LF8%ber jeg panden imod, mE5%
jeg jo lige vende tilbag - hE5%ber det er ok :-)

Mvh.

T.

Re: Måling af hastighed med AVR

Quoted text here. Click to load it

Hej Kåre

Det lyder ikke helt tosset. Det prøver jeg. Løber jeg panden imod, må
jeg jo lige vende tilbag - håber det er ok :-)

Mvh.

T.
----------------------
Du siger bare til!

mvh
Kåre



Re: Måling af hastighed med AVR
Quoted text here. Click to load it
r
r den gE5%r
Quoted text here. Click to load it
Til...

Dette lille program:

#include <avr\io.h>
#include <avr\iom8.h>
#include <avr/interrupt.h>
#define outp(a, b) b 3D% a
#define inp(a) a

uint8_t led;
typedef unsigned char  u08;

ISR(INT0_vect) { /* signal handler for external interrupt int0 */
    led 3D%  0x01;
   }

ISR(INT1_vect) {    /* signal handler for external interrupt int1 */
    led 3D%  0x00;
           //   PORTB 3D% 0x00;
   }

int main(void) {
    outp(0x01, DDRB);      /* use PortB for output (LED) */
    outp(0x00, DDRD);      /* use PortD for input (switches) */
    outp((1<<INT0)|(1<<INT1), GIMSK); // enable external int0, int1
    sei();       /* enable interrupts */
    led 3D%  0x01;
    for (;;) {
    outp(led, PORTB);
    }                      /* loop forever */
}

skulle netop benytte INT0 og INT1, hvor B0 skulle gE5% hF8%j, hvis INT0
gE5%r hF8%j, og lav, hvis INT1 gE5%r hF8%j. Det synes jeg blot ikke er
tilfE6%ldet...
Hvis derimod, jeg sE6%tter PORTB lav (Fjerner udkommenteringen i
ISR(INT1_vect) rutinen) fE5%r jeg noget, der minder lidt om det, men
udgangen forbliver ikke hF8%j som forventet.

Re: Måling af hastighed med AVR
Quoted text here. Click to load it
Til...

Dette lille program:

#include <avr\io.h>
#include <avr\iom8.h>
#include <avr/interrupt.h>
#define outp(a, b) b = a
#define inp(a) a

uint8_t led;
typedef unsigned char  u08;

ISR(INT0_vect) { /* signal handler for external interrupt int0 */
led =  0x01;
   }

ISR(INT1_vect) {    /* signal handler for external interrupt int1 */
led =  0x00;
           //   PORTB = 0x00;
   }

int main(void) {
    outp(0x01, DDRB);      /* use PortB for output (LED) */
    outp(0x00, DDRD);      /* use PortD for input (switches) */
    outp((1<<INT0)|(1<<INT1), GIMSK); // enable external int0, int1
    sei();       /* enable interrupts */
    led =  0x01;
    for (;;) {
    outp(led, PORTB);
    }                      /* loop forever */
}

skulle netop benytte INT0 og INT1, hvor B0 skulle gå høj, hvis INT0
går høj, og lav, hvis INT1 går høj. Det synes jeg blot ikke er
tilfældet...
Hvis derimod, jeg sætter PORTB lav (Fjerner udkommenteringen i
ISR(INT1_vect) rutinen) får jeg noget, der minder lidt om det, men
udgangen forbliver ikke høj som forventet.
´---------------------------------------------------------------------------
Som udgangspunkt så bruger vi ikke samme compiler og mde at kode på  :o)
Jeg kender ikke GIMSK...

Min kode ville nok ligne følgende:

int main( void )
{
    DDRB = 0x01; // PB0 er output.

  // Setup interrupts:
   MCUCR |= 0x0A; // Falling edge = interrupt.
   GICR |= 0xC0; // Enable INT1 og INT0 irq

    sei(); // Enable interrupts

  while( 1 )
  {
    // ....
  }
}

SIGNAL(SIG_INTERRUPT0)
{
  // PB0 høj
  PORTB |= 0x01;
}

SIGNAL(SIG_INTERRUPT1)
{
  // PB0 lav
  PORTB &= ~0x01;
}

Det er ikke testet.... men bør være tæt p noget der virker.

mvh
Kåre



Re: Måling af hastighed med AVR

Quoted text here. Click to load it

Jeg bruger WinAVR

Quoted text here. Click to load it

GIMSK bruges i forbindelse med aktivering af interrupt.

Quoted text here. Click to load it


Det vil jeg da kigge pE5% - takker!
Jeg skriver koden til et STK500 board. Her er det lidt trE6%lst, at
knapperne er aktiv lave, nE5%r nu interruptvektorerne trigger pE5% et hF8%j=
t
signal, sE5% man er nF8%dt til at holde knapperne nede og sE5% slippe dem
for at generere interruptet - men det er selvfF8%lgelig kun sE5% lE6%nge je=
g
befinder mig i testfasen :-)

Mvh.

T.

Re: Måling af hastighed med AVR


Quoted text here. Click to load it

Jeg bruger WinAVR

Quoted text here. Click to load it

GIMSK bruges i forbindelse med aktivering af interrupt.
---------------------------------------------------------
Bruger også WinAVR, men den kender altså ikke GIMSK, ej heller kan jeg finde
den i databladet.
...ups, kom lige til at tænke på at jeg lige pt sidder og fusker med et
lille 168 projekt. Kan godt se den eksisterer i Mega32. Jeg har dog aldrig
brugt den direkte, men har altid sat hele GICR registret op. GIMSK kan jeg
faktisk heller ikke finde i databladet...nå det er en detalje, bare du
sørger for at få den sat rigtigt op.


Quoted text here. Click to load it


Det vil jeg da kigge på - takker!
Jeg skriver koden til et STK500 board. Her er det lidt trælst, at
knapperne er aktiv lave, når nu interruptvektorerne trigger på et højt
signal, så man er nødt til at holde knapperne nede og så slippe dem
for at generere interruptet - men det er selvfølgelig kun så længe jeg
befinder mig i testfasen :-)

Mvh.

T.
---------------------------------------
Det er helt normalt med aktive lave knapper. Bruger aldrig andet...
Men du kan jo styre om din irq indgang skal trigges af falling, rising eller
level med MCUCR, nederste fire bit.

mvh
Kåre



Re: Måling af hastighed med AVR
Quoted text here. Click to load it

Det er ogsE5% "en underlig fisk" Jeg lavede pE5% et tidspunkt lidt kode
til en 90S8515, hvor jeg aktiverede GIMSK til brug for interrupt. Da
den gik ud af produktion, skiftede jeg selvfF8%lgelig over til
ATmega8515 - pludselig kunne jeg ikke lE6%ngere compile koden - Det
viste sig sE5%, at GIMSK pE5% en mega8515 hedder GICR - hvorfor???

Quoted text here. Click to load it

Okay! At kigge. Det virkede ogsE5% tumpet, at det var nF8%dvendigt at gF8%r=
e
sE5%dan - takker.

Re: Måling af hastighed med AVR
Jeg mangler et SIMPELT C-program til WINAVR, der forbinder et 2x24
karakters LCD display til een port og bare kan skrive en linje tekst i
hver linje. Bare for at se, at der er hul igennem.

Har nogen et godt link?

PE5% forhE5%nd tak

T.

Re: Måling af hastighed med AVR
Quoted text here. Click to load it

Kan du ikke bruge assembler ?

http://www.avr-asm-tutorial.net/avr_en/LCD4_500.html



Re: Måling af hastighed med AVR
Benny Nissen skreiv:
Quoted text here. Click to load it

Dette blir som å banne i kirken. Tenk å anbefale assembler. Det er like
idiotisk som å hevde at en monokrom skjerm fungerer bra til ren
dostekst-behandling. Hør her. Det er like vanvittig som å anbefale å
snakke rent norsk / dansk uten å spe opp språket med fremmedord. Har
fader Holberg snakket forgjeves?

HM

Jeg programmerer selv i assembler, og jeg vet hvor "idiotisk" det er.

Re: Måling af hastighed med AVR
Quoted text here. Click to load it

Jeg ved godt assembler har sine fordele, men opgav det for mange E5%r
siden til fordel for C. SE5% jeg vil vE6%re glad for et eksempel til
WinAVR i C. Brugte tidligere CodeVision. Her bruger du bare wizarden.
2 min. SE5% er du klar. Det skal dog vE6%re til WinAVR, da denne desvE6%rre
ikke forstE5%r mange af kommandoernde fra CodeVision :-(

Mvh.

T.

Re: Måling af hastighed med AVR

Quoted text here. Click to load it

Jeg ved godt assembler har sine fordele, men opgav det for mange år
siden til fordel for C. Så jeg vil være glad for et eksempel til
WinAVR i C. Brugte tidligere CodeVision. Her bruger du bare wizarden.
2 min. Så er du klar. Det skal dog være til WinAVR, da denne desværre
ikke forstår mange af kommandoernde fra CodeVision :-(

Mvh.

T.
-----------------------------------------------------
Har du en mail kan jeg sende dig noget.
Men det er "as is", og du skal nok selv lige ind og kigge i koden og pille
det ud du vil bruge.

mvh
Kåre



Re: Måling af hastighed med AVR
Quoted text here. Click to load it

S'fF8%lli - Det tilbud, tager jeg gerne imod :-)
skott at festudvalget dot dk

Site Timeline