Toon posts:

[C] Atmel timer

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben hier op school met een project bezig, we zitten nu al een behoorlijke tijd vast met een display aansturing.
(display gekoppeld aan atmega32 microcontroller) hiervoor is een interrupt nodig omdat het een bepaalde tijd duurt voordat het display de data die hem aangeboden wordt verwerkt heeft.

Daarom hebben we een delay functie nodig die een delay kan genereren van 1 tot 120 micro seconden. Het programmeer werk kom ik wel uit, een functie schrijven die dus van 1 tot 120 kan varieren. Waar de groep niet uitkomt is het volgende probleem: Het initialiseren van een timer die om de 1 microseconde uitgevoerd wordt, dus met een frequentie van 1 Mhz.

Kan iemand ons voordoen hoe de timer te initialiseren met een snelheid van 1 mhz? :?

We hebben hier met de projectgroep (man of 5 ervan) al 3 uur dus totaal 15 uur erin zitten en nog steeds geen resultaat. Waaronder het zoeken op GOT, Circuitsonline, AvrFreaks. Dit heeft geen concreet voorbeeld opgeleverd, en alleen maar meer onduidelijkheid. :?

K hoop hier verder mee te komen , alvast bedankt :) .

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:17

Robtimus

me Robtimus no like you

nanosleep(const struct timespec *req, struct timespec*rem)?
nanosleep delays the execution of the program for at least the time specified in *req. The function can return earlier if a signal has been delivered to the process. In this case, it returns -1, sets errno to EINTR, and writes the remaining time into the structure pointed to by rem unless rem is NULL. The value of *rem can then be used to call nanosleep again and complete the specified pause.

The structure timespec is used to specify intervals of time with
nanosecond precision. It is specified in <time.h> and has the form
C:
1
2
3
4
5
struct timespec
{
    time_t  tv_sec;         /* seconds */
    long    tv_nsec;        /* nanoseconds */
};
Een student die ik ken heeft zo elke seconde iets laten uitvoeren door het tweede argument 1 seconde te laten zijn.

Onder Linux/i386 is die alleen niet bruikbaar omdat de minimale periode 10ms is, op Linux/Alpha kan het 1ms zijn.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Als ik op de datasheet van die controller kijk, zie ik al 3 timers (twee 8-bits, een 16-bits, en een watchdog); dus over welke timer heb je het? (Er staan overigens code voorbeelden (zowel C als assembly) in die datasheet, op de site staan diverse ontwikkeltools.)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16:53
IceManX schreef op 04 oktober 2004 @ 12:44:
nanosleep(const struct timespec *req, struct timespec*rem)?

[...]
Onder Linux/i386 is die alleen niet bruikbaar omdat de minimale periode 10ms is, op Linux/Alpha kan het 1ms zijn.
Hmmm....is er een linux versie voor de Atmega32? ;)
.... atmega32 microcontroller ....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • jan-marten
  • Registratie: September 2000
  • Laatst online: 16-05 13:55
Een veel beproefde studenten manier is een eigen wacht functie te schrijven met daarin een for(i=0;i<=tijd;i++) - lus. Die tijd is dus een gecalibreerde waarde (even met oscilloscoop testen).

Let er wel op dat je hier problemen mee gaat krijgen zodra je in de slaap functie een interrupt voorgeschoteld krijgt...

[ Voor 3% gewijzigd door jan-marten op 04-10-2004 15:22 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:17

Robtimus

me Robtimus no like you

farlane schreef op 04 oktober 2004 @ 13:29:
Hmmm....is er een linux versie voor de Atmega32? ;)
Sorry, dacht dat het in sectie 3 van de man pages zat (meer standaard libraries), maar is 2 (Linux only). My bad.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Virgil
  • Registratie: November 2001
  • Laatst online: 17-05 20:10

Virgil

We're not alone

Wat je beter kan gebruiken is het volgende, wij hebben namelijk hetzelfde nodig.

Maak een while() loop, waarin je telt tot variabele x. En daarin zet je dan een if constructie, die kijkt op een bepaalde waarde of die gehaald is, en voert dan hetgeen uit wat jij uitgevoerd wilt hebben. Bijvoorbeeld een meetfunctie.

Op deze manier kan jij bepalen hoeveel er niet gemeten wordt, en juist hoeveel er wel gemeten wordt.

Voorbeeld:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
while(1) /* infinite loop */
{

   teller++

   if(teller == noem.maar.iets.geks)
   {

      voer hetgeen uit wat je uitgevoerd wilt hebben. (Bijvoorbeeld een functie)

   }

}


Als je bijvoorbeeld een delay wilt hebben van een paar uSecs. Kan je bijvoorbeeld ervoor kiezen om op een vrij hoge kloksnelheid te werken, en een vrij lage TOP value te hebben voor je timer/counter.

Let wel, dit geldt voor als je de 8bits timer/counter gebruikt. Waarbij je dus register OCR1A als TOP Value gebruikt. En de timer incremental laat 'tellen'.

-Ohja, wat ik vergeet te vermelden is. De snelheid waarmee de timer 'telt' kan je berekenen mbv de value die je in OCR1A stopt en de kloksnelheid.
De formule hiervoor staat ergens in de datasheet in de vorm f=blablabla.

Succes!

[ Voor 12% gewijzigd door Virgil op 07-10-2004 16:07 . Reden: Spelling :( ]

Ik was heel, heeeel vroeger SeRRveR


  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Die interrupt is in te stallen door in de juiste registers de aftelwaarde in te stellen. Verder moet je ook in de interrupt vector tabel het adres van de uit te voeren functie zetten. En uiteindelijk moet je de interrupts aanzetten. Dat zijn stuk voor stuk dingen die in de datasheet van je Atmel te vinden zijn hoor :)
Pagina: 1