Gå til innhold

Kan noen lage et enkelt AVR/PIC program for meg?


Anbefalte innlegg

Har ikke rukket å få satt meg inn i PIC/AVR-programmering (ikke aner jeg heller hvilken jeg vil lære meg), men lurte på om det er noen kloke hoder her som kunne tenke seg å lage et eksempelprogram.

 

Skal lage noe ála denne, men en "vennligere" versjon.

Fra strømmen kommer på, skal den vente i en time før den setter igang.

Deretter skal den pipe (i 1 sek) 6 ganger med 5 minutters mellomrom, for å deretter vente tre timer før den setter igang på nytt.

 

Kan noen lage programmet? Helst tilpasset en relativt liten IC (8 pins hadde vært supert).

 

Alt arbeide (bilder,handeliste,eaglelayout,etc) publiserer jeg til glede for alle som er interessert :-)

Lenke til kommentar
Videoannonse
Annonse

har nok ikke tid til å sette meg ned å kode på dette for deg akkurat nå ( har mer som 3-4 andre ting jeg må kode på skolen nå, i forskjellige språk...)

 

men her er kort og godt hva du må gjøre hvis du bruker en AVR:

 

finne ut hvilken timer som er egnet for å telle så langt (3 timer) , så fort igjennom noen data blad jeg hadde liggende, og det skal gå ann å bruke en 32kHz klokke på noen av timerne selv om chipen er i sleep-mode, noe du også bør bruke for å spare strøm. du må sikkert se igjennom noen datablader for å finne en krets som er egnet, dvs har den timeren du trenger o.l., men hardwaren er rimelig lik på de forskellige kretsene så har du lest om en ting i et datablad så har du lest om den i alle databladene (omtrent)... du må bare finne en krets som du synes passer, bør ikke være så vanskelig...

 

altså, les om timere, sleep-mode og hvordan du våkner fra sleep.

 

 

last ned f.eks. WinAVR (har alt du trenger) og AVR-studio. begynn å kode og simulere... (begynn med noe enkelt, som å få LED til å lyse o.l.)

 

 

(jeg skal ha noen poster med svar på grunnleggende AVR koding på forumet tidligere, så søk litt, kan sikkert skrive noe senere når jeg har tid og hvis du finner ut at du skal bruke AVR)

Lenke til kommentar
Når du nevner dette med å bruke en 32kHzklokke..

Dersom jeg lager en teller.. vil den da telle til 32 000 iløpet av et sekund?

8104362[/snapback]

 

 

Hei.

 

Bruk ett krystall på 32768 Khz og en 4060 Cmos krets. Da kan du få ut ett 2Hz signal som er enkelt for en PIC/AVR å telle.

 

Krystallet kan du finne på et gammelt hovedkort i nærheten av CMOS batteri og RTC (RealTimeClock) krets. Eller send meg en PM så kan jeg sende deg ett.

 

Eksempel på krets finner du her: http://www.kpsec.freeuk.com/components/cmos.htm

 

Om du vil ha "PIC/AVR" som er lett å programmere så bruk en STAMP fra parallaxinc. http://www.parallax.com/

 

Se hvordan du kopler en 4060 til en STAMP her: http://www.hth.com/filelibrary/PDFFILES/ST_APP2.PDF

 

 

Good Luck

Lenke til kommentar

4060 er ikke nødvendig, mikrokontrolleren kan ta seg av alt selv. Krystallet brukes som klokkekilde til mikrokontrolleren.

 

Jeg vil ikke anbefale basic stamp, de er dyre, trege, og har ingen fordeler over en mikrokontroller til 10kr. Hvis man absolutt skal programmere mikrokontrollere i basic så finnes det flere basic-compilere til PIC.

 

Basic stamp koster over 300kr på elfa, de har plass til ~80 instruksjoner og kjører 2000 instruksjoner i sekundet og har 14 byte RAM. PIC12F629 koster rundt 20kr, har plass til 1024 assemblyinstruksjoner, kjører opp til 5 000 000 assemblyinstruksjoner i sekundet og har 64 byte RAM. Jeg vet det blir feil å sammenligne basicinstruksjoner med assemblyinstruksjoner, men sammenligningen er hovedsakelig for å vise den store forskjellen mellom dem.

Endret av Mikkel194
Lenke til kommentar

32Khz klokken brukes som klokkekilde til telleren, og kan muligens preskalleres slik at den blir enda tregere (som sagt av andre). Det viktige er at det er en "treg" kokke da strømforbruket er proporsjonalt med klokkehastigheten. Ikke begyn med eksterne kretser i tillegg, det øker bare strømforbruket. du kan selvfølgelig bruke en variabel eller to i tillegg sammen med telleren for å styre hvor langt en skal telle, det viktige er bare at du går i sleep mode for å spare strøm.

 

nå er det ikke sikkert strømforbruket er veldig kritisk i din applikasjon, kommer jo litt an på hvilken type batteri du velger å bruke...

 

btw; kom på at om du ikke er veldig interessert i å bygge selv kan du kjøpe en AVR-butterfly, den har det du trenger for å lage en slik sak som du er ute etter, bare reprogrammere den med kode du skriver...

Lenke til kommentar

Er langt ifra noen ekspert på dette, men har kodet litt for AVR sommerfuglen og litt generell annen C programmering.

 

Er det ikke mulig å bruke time.h biblioteket? Hvis det er å få ting til å skje etter bestemte intervall fant jeg ut at dette virket bra (Kanskje noen som kjenner igjen heisprosjektet fra NTNU?)

#include <stdio.h>
#include <time.h>

int main(){
  time_t t1,t2;
  (void) time(&t1); //Initialiserer de to tidene
  (void) time(&t2);
  printf("Vennligst vent...\n");
     while(((int) t2-t1) < 5){  //Sjekker differanse
         (void) time(&t2);  //Evt. oppdaterer nr 2.
      }
      printf("Nå har det gått 5 sekunder\n");
      return 0;
}

 

Dersom du ikke ønsker å bruke tråden til den ene og alene while løkken kan det lett implementeres en metode med et lite flagg:

 

void testTid(void){

     //Dersom flagget ikke er satt, sett dette
     if(!initTid){  
           (void) time(&t1);
           initTid=1;
           printf("initTid satt\n");
     }//end if

     //oppdaterer tid og tester. Dersom sukksess, reset timer.
     (void) time(&t2);
     if(initTid && (abs((int) t2-t1))>BESTEMT_TID){	
     printf("Timer fullført\n");
     initTid=0;
     }//end if

}//end timer

 

Som sagt, er jeg dog ikke sikker på om time biblioteket lar seg bruke på AVR'en.

 

bt

 

EDIT: Tabulering ble litt rar.

I den andre metoden trenger du også stdlib.h dersom abs() skal brukes.

Endret av bevertann
Lenke til kommentar

Så dersom klokkefrekvensen er 1KHz og jeg lager noe ála;

 

while a >= 1000

inc a

loop

(syntakser og hele pakka er feil, men bare for å få frem et poeng).

 

Så vil altså dette tilsvare 1 sekund? Og da har man en begrensning på hvor mange sekunder man kan telle til da man ikke kan ha uendelige mengder med data i en variabel (long går vel fra 0 til 4,294,967,295, evt. long long 0 til 18,446,744,073,709,551,615?)?

Med en klokkefrekvens på 4MHz, vil jo en long være "full" iløpet av et kvarter? Dersom den teller 4 millioner i sekundet? hmm.. kan ikke stemme :S

Forstår noen hva jeg vil frem til?

 

vurderer å kjøpe inn en butterfly eller et eller annet development tool, men har ikke all verden av penger å bruke. har nok av andre kostbare hobbyer :(

 

Ang. kretsen i seg selv, så er det to ting som er svært viktige:

- Pris

- Størrelse

 

Bruker et 9voltsbatteri av typen som sitter i røykvarslere. Dette bør kunne irritere offeret i en god stund ;D

Endret av Melkekartong
Lenke til kommentar

Sett heller opp en av de innebygde 16 bits tellerne, la den gå på en nedelt versjon av system klokken (evt 32 KHz) når den ruller over setter den et flagg (eller trigger et interrupt) du kan teste, => inc en long som teller i xx ms ticks...

så kan du skjøte inn en til hvis din første long når rollover,

Skal ikke så mange slike til så ruller den siste aldri over i dette årtusenet.

Lenke til kommentar

eks; 8 bits teller med 32,768khz klokke; 10 bit prescaler (10bit => 1024)

 

klokke : 32,768/1024 = 32

8 bit teller => telle til 256

256 / 32 => 8 sek før du får overflow på telleren

 

bruk en interrupt rutinge som trigger ved overflow og som øker en tell-variabel og sjekker hvor langt du har kommet og eventuelt utfører andreting.

 

hvis gjort som over vil telle-variabelen øke med 1 hvert 8'ende sekund. dvs.

8-bits variabel kan brukes opp til 256*8 = 2048 sek = ca 34 min

16-bits => 65536*8 = 524288 sek = ca 145,6 timer

 

som du ser så vil ikke time-out være noe problem, du kan godt bruke internklokke på 1MHz i stede for 32kHz til telleren også... grunnen til at jeg foreslo 32kHz klokke var i grunn bare for å kunne spare en del strøm.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...