Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   503 / 840
(#) kurosaki hozzászólása Dec 30, 2012 /
 
senkise tudja az én problémámra a megoldást?
Idézet:
„Sziasztok.
Régen voltam erre fele.
Egy kisseb kihagyás utá elövettem a Atiny 2313 és a atiny 45 ömet es azt veszem észre, hogy bekötöm rendesen a programozoval és mintha zárlatot kapna.Programozon a led kialszik és a gép is elveszti a programozot.Kihuzom a Földelést ujra észleli a gép. Meghaltak a Chipjeim??? előre is köszönöm a segitséget.

UI: a programozomon csak 1 DB GND mükodik a többit nem is eszleli.. USBASP programozo.”
(#) zombee válasza kurosaki hozzászólására (») Dec 30, 2012 /
 
Próbáld egyesével rákötni a lábakat a programozóra. A GND-vel kezdd.
Bár van egy tippem: fordítva kötöd be a GND-t és a VCC-t! Ember! Megölöd az AVR-t és az USB-t is!

Az utolsó mondatodat szerintem nem sokan értik. Mi az hogy "csak 1 GND működik"?
A hozzászólás módosítva: Dec 30, 2012
(#) zombee válasza kiborg hozzászólására (») Dec 30, 2012 /
 
parancsolj:
  1. .MACRO CLRBIT
  2. ANDI @0, ~(1<<@1)
  3. .ENDMACRO
  4.  
  5. .MACRO SETBIT
  6. ORI @0, 1<<@1
  7. .ENDMACRO


A kukac(@) jel és az utána lévő szám a paramétereket jelölik a makrónál.
Ebből láthatod azt is hogy a makró pontosan két paraméterből áll.
A hozzászólás módosítva: Dec 30, 2012
(#) kurosaki válasza zombee hozzászólására (») Dec 30, 2012 /
 
a programozom 10 labas utolso 4 GND abbol csak 1 működik a többire nem reagál teszteltem leddel mind a 4 et. és csak egyen világított. nem köthettem be rosszul. mert előtte előszedtem mind az AVR lábkiosztását és a Programozóét is. Akkor meghaltak az AVR jeim? hurra...

UI: mikor rá kötöm a VCC vagy a GND ét (Földelést) akkor olyan efektet nyom le nekem mintha csak simán össze érintettem volna a +- ut. ha a maradék 3 Földelésbe dugom semmisem történik de még nem is tudom törölni az AVR se újra feltölteni a programot rá.
A hozzászólás módosítva: Dec 30, 2012
(#) zombee válasza sikolymester hozzászólására (») Dec 30, 2012 /
 
Nem egészen. Egy CDC vagy egy HID módban működő eszköz egyaránt mehet Win és Linux alól is!

HID: natív eszköz, csak a hozzá való könyvtárral érhető el, utasításokat lehet neki adni, stb.
Egy Visual C vagy Basic programból csak a library betöltése után érhető el.
Pl. HID eszköz a billentyűzet, egér, relayboard, de még a mai szünetmentes tápok is.

CDC: soros (COM) port emulátor, a szabvány sorosport kezelő algoritmusokkal, vagy rendszerhívással
lehet elérni. Visual C/Basic-ból a szabvány parancsokkal is el lehet érni.
Én. PureBasic-al tolom, ott OpenSerialPort, WriteSerialPort, stb...

Az MCP2200 emulátor jó példa mert benne mindkettő megtalálható és egyidejűleg használható is!
A CDC része a sorosport és vezérlővonalak, a HID pedig az általános portok kezelésére szolgál.
A hozzászólás módosítva: Dec 30, 2012
(#) zombee válasza kurosaki hozzászólására (») Dec 30, 2012 /
 
Szerintem Te összekevered a kimeneteket. Olyan nincs hogy "utolsó 4", mivel a 4 GND
csak a páros vezetékeknél van jelen: 4,6,8,10.
Lásd: ITT és ITT
(#) kurosaki válasza zombee hozzászólására (») Dec 30, 2012 /
 
ugyértem hogy az also 4 4,6,8,10 es ebből csak a 10 es müxik és nemértem miert.
meg nekem miso helyett moso van .
A hozzászólás módosítva: Dec 30, 2012
(#) kiborg válasza zombee hozzászólására (») Dec 30, 2012 /
 
Nagyon köszönöm.
(#) zombee válasza kurosaki hozzászólására (») Dec 31, 2012 /
 
5V-os táppal próbáltad már? Csak azt kösd be és mérj áramerősséget is!
(#) sector99 hozzászólása Dec 31, 2012 /
 
Sziasztok !

A segítségeteket szeretném kérni. Forrasztópáka szabályzómat szeretném egy kicsit korszerűsíteni. "vzoole" fórumtársunk kapcsolását választottam. Az a gondom, hogy nekem Atmega8 vezérlőm van és ehhez át kellene a programot írni, ami a tervező szerint nem nagy feladat, csak most Neki nincs ideje a programot módosítani. Nekem nulla gyakorlatom van ezen a területen...
Tehát szeretnék megkérni valakit közületek, hogy átírja nekem a forrást, ami ITT található. Természetesen a szerző hozzájárult a módosításhoz !

Előre is nagyon szépen Köszönöm !

És BUÉK Mindenkinek !
Üdv: sector99
A hozzászólás módosítva: Dec 31, 2012
(#) zombee válasza sector99 hozzászólására (») Dec 31, 2012 /
 
Mi a baj az eredetivel ha szabad megkérdeznem?
(#) sector99 válasza zombee hozzászólására (») Dec 31, 2012 /
 
Csak annyi, hogy a program TINY26S-hez készült, nekem pedig Mega8 vezérlőm van....És ha nem nagy munka volna átírni volna átírni akkor nem vennék másik procit azért.(egyébként a TINY26 lényegesen "drágább" is)

Idézet:
„vzoole
Szia!

Program átírással használható mega8-al is.
Lényegében csak a regiszterek megnevezéseit kell átírni.

üdv.:”
ezt írta nekem zoole privátban.
(#) zombee válasza sector99 hozzászólására (») Dec 31, 2012 /
 
Hát nem egészen, ha csak nem ismerem a tervező szándékait a programban.
Pl. a Tiny26-ban a Timer1 az egy rettenet, és azt is használja.
Az ADC még elmegy, de a portoknál sem mindegy hogy mi hová megy.
Szerintem ez annak a legegyszerűbb aki írta a progit.
(#) sector99 válasza zombee hozzászólására (») Dec 31, 2012 /
 
Ok, nagyon szépen Köszönöm, hogy fáradoztál vele ! (ráadásul Szilveszter estéjén, bulizás helyett...)
Akkor megvárom a szerzőt.

Üdv.: sector99
A hozzászólás módosítva: Dec 31, 2012
(#) csabeszq hozzászólása Jan 1, 2013 /
 
Sziasztok, lenne egy reflexív optó kérdésem (közel teszek egy CNY70-eshez egy fehér papírt, amit az AVR érzékel).

A kapcsolás egyszerű: CNY70 infra LED-je egy ellenálláson keresztül egy digitális kimeneti PIN-re csatlakozik, a fototranzisztor egy digitális inputra (+5V <=> ellenállás <=> digitális input, tranzisztor kollektor <=> tranzisztor emitter, föld).

Mindez szép és jó, csak a világ minden zajára az AVR érzékelni fog. Ahogy olvastam, a gyakorlatban ezt úgy oldják meg, hogy a kimenetre 5kHz-es frekvenciát raknak, a fototranzisztor bemenetén meg azt nézik, hogy megvan-e az 5kHz-es jel.

Innen a dolog kezd bonyolódni, mert gondolom analóg PIN-re lenne szükség és vagy sávszűrőre, vagy FFT-re.
Van-e tapasztalatotok ebben a témában? (FFT library, sávszűrő, lehetőleg floating-point nélkül,...)

Köszi,

Csaba
(#) zombee válasza csabeszq hozzászólására (») Jan 2, 2013 /
 
Szerintem tök ugyanaz kell mint a nyomógombok pergésmentesítésénél.
A legegyszerűbb ha X időnként lekérdezed(akár 50-100ms is lehet).
Ha a két legutóbbi lekérdezés 1-1 akkor egy változót beállítasz 1-re,
ha pedig 0-0 akkor beállítod 0-ra. Értelemszerűen a 0-1 és 1-0 esetén nem csinálsz semmit.

Bocs, egyszerűbben nem tudom:
  1. uint8_t elozo, mostani, allapot;
  2. allapot = 0;
  3. elozo = PINB&1;
  4. for(;;)
  5. {
  6.   _delay_ms(50);
  7.   mostani = PINB&1;
  8.   if(mostani == elozo) allapot = mostani;
  9.   elozo = mostani;
  10. }


Egy másik, finomabb megoldás ha sűrűbben veszel mintát, de több állapotot is tárolsz.
A legrégebbit mindig eldobod, helyére a legújabbat teszed. Ezt shifteléssel a legegyszerűbb.
Ha minden "0" vagy minden "1" akkor stabil a jel, amire reagálhatsz(be/kikapcsolás).

Még szebb, ha az időzítést interruptból kezeled, ekkor ügyelj arra hogy az interruptból
(is) kezelt változók optimalizálását ki kell kapcsolni a "volatile" jelzővel.

Szóval nem kell FFT meg lebegőpontos cucc, aki ilyet ajánl, annak üzenem hogy "Aki hülye haljon meg!"
A hozzászólás módosítva: Jan 2, 2013
(#) csabeszq válasza zombee hozzászólására (») Jan 2, 2013 /
 
Igen, én is gondolkoztam azon, hogy ágyúval próbálok verébre lövöldözni.

Nem kell FFT, csak azt kell megnézni, hogy ha a LED-et ki/be kapcsolgatom, akkor változik-e az analóg bemeneten valami.

Ha megváltozik, akkor biztos, hogy nem a külső fényviszonyokat mérem, hanem a reflexív opto elé került tárgyat.
(#) zombee válasza csabeszq hozzászólására (») Jan 2, 2013 /
 
Ez esetben csak annyit kell tenned, hogy x időnként be-majd kikapcsolod.
Csak annyi időre hogy a vevő éppenhogy érzékelhesse ha van ott valami.
Közvetlenül a kikapcsolás előtt kell csinálnod azt amit a fentiekben leírtam neked,
illetve ugyanezt bekapcsolás előtt, csak az egyik (bármelyik) esetben invertálod az eredményt.
A hozzászólás módosítva: Jan 2, 2013
(#) Sick-Bastard hozzászólása Jan 3, 2013 /
 
Üdv!

Azt szeretném megkérdezni, hogy a (C, C++) kódban szabad e ilyesmit írni:
  1. #define pup                     0x0F;
  2. unsigned char                   duty_cycle;
  3.  
  4. int(main)
  5. {
  6. value = IRC1/pup;
  7.  
  8. while()
  9. {
  10. duty_cycle = duty_cycle + value;
  11. }
  12.  
  13. }


Konkrétan azt szeretném megkérdezni, hogy lehet e bináris adatot binárissal, binárisat decimálissal, decimálisat hexadecimálissal (és ezek kombinációját) osztani szorozni, összeadni vagy éppen kivonni?

Egy másik kérdésem, hogy if feltételbe szabad e = vagy == kritériumot megadni?
pl: if(hour == presethour) // tehát, ha a jelenlegi óra = a beállított órával


SB
(#) zombee válasza Sick-Bastard hozzászólására (») Jan 3, 2013 /
 
Nem tudom eddig milyen nyelvekkel találkoztál, de itt C-ben teljesen mindegy hogy miben adod meg.
Egy "SZÁM" mindig ugyanúgy(binárisan) tárolódik, de a programozás szempontjából ez lényegtelen.
Inkább kódértelmezési jelentősége van annak hogy mit hogyan adsz meg.
DE: figyelni kell az automatikus kasztolásra. Ez azt jelenti hogy a fordító egy SZÁM értéket az elérhető
legkisebb egységbe teszi be(bájt, szó, stb.), de lehet hogy a következő műveletnél túlcsordul.

If: csak "=="-vel vizsgálhatsz, ez egy állítás. Az "=" jel nem állítás hanem parancs. Nem mindegy!
A hozzászólás módosítva: Jan 3, 2013
(#) csabeszq válasza zombee hozzászólására (») Jan 3, 2013 /
 
Hát ez valószínűleg nem fog fordulni:

#define után nincs pontosvessző
int(main) helyett int main() kellene.
A while-nak mindig van paramétere: while(1).

Finomítás (a rövidebb C-s forma illik, de a tied is jó):
duty_cycle += value

Jobb lenne tudni, hogy konkrétan mit szeretnél, mert a kódodat javítani sem tudjuk, annyira nem értjük mire kellene.
(#) zombee válasza csabeszq hozzászólására (») Jan 3, 2013 /
 
Ez most nekem szól? 18 éve programozom.
(#) Sick-Bastard válasza zombee hozzászólására (») Jan 3, 2013 /
 
Köszi szépen a segítséget, így már jobban átlátom a dolgokat.
(#) Sick-Bastard válasza csabeszq hozzászólására (») Jan 3, 2013 /
 
Jó elnézést.
Akárhányszor egy kódot írok ide hozzászólásba, 100% hogy elírok valamit.

A készülő kódot azért nem akartam kirakni, mivel tele van hiányosságokkal, még nem készült el.

Azt szeretem volna elérni, hogy AVR-rel Power LED-eket vezéreljek PWM segítségével.
A nehezebbik része most jön.
A PWM azért kell, mert a LED-et nem csak szimplán fel és le akarom kapcsolni, hanem fokozatosan akarom növelni a fényerejét.
Tehát egy picit bonyolultabb időkapcsolóról lenne szó.

elképzelés.:
6kor bekapcsol (1-2% os fényerő) és 6:15re eléri a 90-100%ot
este 7kor "lekapcsol" 7kor 100% a fényerő és 7:15kor lesz 0%

Remélem sikerült közérthetően elmondanom, mit is szeretnék. (Fogalmazásból nem vagyok jó.)
(#) csabeszq válasza Sick-Bastard hozzászólására (») Jan 4, 2013 /
 
Ez viszonylag könnyen megoldható, még egy 430Ft-os ATTINY25-tel is.

Használj 8Mhz-es kvarcot, az órajeled 1 MHz lesz, az alapértelmezett 8-as osztás miatt.

A PWM-et úgy kellene beállítanod, hogy a frekvenciája állandó legyen, csak a kitöltési tényező változzon. Minden körbefordulásnál hívjon meg egy interruptot, ami egy long változót növelget.

Ebből később ki fogod tudni számolni az időt.

1 MHz-es órajelnél ha a CK/4-as prescalert használod és 256-ig számolsz, akkor 976.5625 Hz-es PWM frekvenciát kapsz.

Ebből a long változó növelésével:
1 másodperc: 976.5625
1 perc: 58593.75
1 óra: 3515625
1 nap: 843750000

A legnehezebb rész az lesz, hogy hogyan állítod be az időt.
(#) Sick-Bastard válasza csabeszq hozzászólására (») Jan 4, 2013 /
 
Üdv!

Én arra gondoltam, hogy egy Timerrel mérem az időt, aminek az interruptjának segítségével növelem a sec, min, hour és day változókat. A timernek meg egy rendes 32,768kHz-es kristály adja az "ütemet".

Na a while(1) ciklussal bajlódtam és valami ilyesmit agyaltam ki. Lehet hogy a kód nem szép, nem spórol a hellyel, nekem az számít, hogy működjön (első körben).

Megpróbáltam érthetően kommentálni a kódot. Elnézést, ha mégsem sikerült

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5.  
  6. volatile unsigned char  duty_cycle;             // 0x00 = 0% 0xFF = 100%
  7.  
  8. volatile unsigned char  sec;
  9. volatile unsigned char  min;
  10. volatile unsigned char  hour;
  11. volatile unsigned char  day;                    //am or pm
  12.  
  13. unsigned char                   minpre;
  14. unsigned char                   ONpup;
  15. unsigned char                   OFFpup;
  16. unsigned char                   value;
  17.  
  18. #define ON                              0x80
  19. #define OFF                     0x90
  20. #define pup                     0x0F                    // PowerUP, világítás fel(0-100%) vagy lekapcsolási(100%-0%) ideje
  21.  
  22. int main(void)
  23. {
  24.         sei();
  25.        
  26.         //clock
  27.         ASSR |= (1<<AS2);                                       // 0x08 (1<<AS2)
  28.         TCCR2 |= 0x0F;                                  // 0x0F (1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21)
  29.         OCR2 = 0x1F;
  30.         TIMSK = (1<<OCIE2);
  31.        
  32.         //PWM
  33.         TCCR1A |= 1<<WGM11 | 1<<COM1A1 | 1<<COM1A0;
  34.         TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;
  35.         ICR1 = 255;
  36.        
  37.        
  38.         value = IRC1/pup;
  39.        
  40.         while(1)
  41.         {
  42.                 if(day < 0xFF)  // délelőtt van e vagy sem
  43.                 {
  44.                         if(hour == ON) // óra most = e a várt órával
  45.                         {
  46.                                 if(min <= 1) // ha óra most = várt órával, nézze meg hogy a perc 2nél kisebb e
  47.                                 {
  48.                                         minpre = min;
  49.                                         while(min < minpup) // a ciklus addig megy amnig a feltétel igaz, tehát kb 15 percig
  50.                                         {
  51.                                                 if(minpre < min) // ha az előző perc kisebb mint a mostani, akkor emelje meg a PWM kitöltését
  52.                                                 {
  53.                                                         duty_cycle += value;
  54.                                                         minpre = min; // így érem el, hogy csak percenként növelje a PWM kitöltését
  55.                                                 }
  56.                                                 if(min >= minpup)
  57.                                                 {
  58.                                                         duty_cycle = 254; // PWM 100%
  59.                                                 }
  60.                                         }
  61.                                 }
  62.                         }
  63.                 }
  64.                 else
  65.                 {
  66.                         if(hour == OFF)
  67.                         {
  68.                                 if(min <= 1)
  69.                                 {
  70.                                         minpre = min;
  71.                                         while(min < minpup)
  72.                                         {
  73.                                                 if(minpre < min)
  74.                                                 {
  75.                                                         duty_cycle -= value;
  76.                                                         minpre = min;
  77.                                                 }
  78.                                                 if(min >= minpup)
  79.                                                 {
  80.                                                         duty_cycle = 0;
  81.                                                 }
  82.                                         }
  83.                                 }
  84.                         }
  85.                 }
  86.         }
  87. }
  88.  
  89. ISR(TIMER2_COMP_vect)
  90. {
  91.         PORTB ^= 1<<PINB0;
  92.         sec++;
  93.                
  94.         if(sec > 59)
  95.     {
  96.                 sec = 0;
  97.                 min++;
  98.     }
  99.     if(min > 59)
  100.     {
  101.                 min = 0;
  102.                 hour++;              
  103.     }
  104.     if(hour > 12)
  105.         {
  106.                 day = (day^0b11111111);
  107.                 hour = 1;
  108.         }
  109. }


Egy kérdésem lenne.
Hogy az általad javasolt AVR képes lenne egy 32,768kHz-es vagy egy gyorsabb 3,2768MHz-es kristállyal működni és ezt elvégezni?
(#) zombee válasza Sick-Bastard hozzászólására (») Jan 5, 2013 /
 
Szia! Miért is akarsz 32.768kHz-es kristályt? - most csak magadat szivatod vele vagy minket is?
Megértem hogy pontos cucc kell az óra miatt és olyan kristályt teszel be amilyen jól esik,
de szerény véleményem szerint egy 4MHz-es is bőségesen meg fog felelni.
A Timer1-et felprogramozod CTC módra és 256-os előosztóra, OCR1A=15624, ez PONTOSAN 1 másodpercenként fog körbemenni, azt rád bízom hogy interrupttal oldod-e meg vagy sem.
A Timer0-t meg beállíthatod PWM-re és kész.
(#) Istvanpisti válasza Sick-Bastard hozzászólására (») Jan 5, 2013 /
 
Szia !

Néhány kérdés :
- milyen AVR-re írtad a kódot ? (szerintem MEGA8)
- az ON értékét tényleg 128-ra gondoltad definiálni ? (nem 8 ?)
- az OFF értékét tényleg 144-re gondoltad definiálni ? (nem 9?, lehet tízes számrendszerbeli számot is írni a #define részben)
- ebben a sorban
  1. value = IRC1/pup;
mi az IRC1 ? (nem ICR1-et akartál írni ?)
- jó ez a duty_cycle változó, de mi fogja a TIMER1 PWM-jét módosítani?
- nem lenne-e egyszerűbb a Fast PWM, 8-bit mode használata ? Ha úgyis 0xFF-re állítod az ICR1-et, így
  1. TCCR1A = (1<<WGM10) | (1<<COM1A1) ;
  2. TCCR1B = (1<<WGM12) | (1<<CS10);
, majd az OCR1A (0..255)változtatásával lehet a PWM-et változtatni.
De, ha a Fast PWM, 10-bit-es üzemmódot választod
  1. TCCR1A = (1<<WGM10) | (1<<WGM11) | (1<<COM1A1);
  2. TCCR1B = (1<<WGM12) | (1<<CS10);
akkor az OCR1A értéke 0..1023 között lehet, amivel akár másodpecenként növelhető-csökkenthető a kitöltési tényező.
- tudod-e azt, hogy az kontroller órajel forrása nem az általad alkalmazni kívánt 32,768 kHz-es kvarc lesz? A Timer2 ebben az üzemmódban (AS2=1), aszinkron módban működik, ez teljesen jó az idő mérésére, de NEM erről az órajelről jár az IC-d, hanem, a belső RC oszcillátorról, pl. ATMEGA8 esetén. Van olyan ATMEL termék, ahol lehet külső kvarc és aszinkron Timer2 egyszerre két külön kristályról is. De ehhez az egyszerű feladathoz nyilván nem kell ilyen. Zombee fórumtárs megoldási javaslata is jó, de ha akarod, akkor maradhat az órakvarcos dolog is.
- mi értelme van a day változónak ? Ha a hour változó 0..23 között változna (nem 0..12 között), akkor könnyű eldönteni, hogy délelőtt van, vagy délután
- be fog-e ide jönni a vezérlés ha a min változó nagyobb 1-nél?
  1. if(min <= 1)
  2. {
  3.     minpre = min;
  4.     while(min < minpup)
  5.     {
  6.          if(minpre < min)
  7.          {
  8.              duty_cycle += value;
  9.              minpre = min;
  10.          }
  11.          if(min >= minpup)
  12.          {
  13.                duty_cycle = 254; // PWM 100%
  14.           }
  15.       }
  16. }
Ugye, hogy nem !
Szerintem nem kellene semmit csinálni a főprogram végtelen while ciklusában, hanem mindent el lehet intézni a Timer2 innetrruptban, mert azt a kevés teendőt, minden további nélkül megoldaná.
Beteszek ide egy egyszerű kódot, amiből kindulhatsz :
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.    
  5. volatile unsigned char  sec;
  6. volatile unsigned char  min;
  7. volatile unsigned char  hour;
  8.    
  9. #define ON           8
  10. #define OFF          9
  11. #define MAX       1023
  12. int main(void)
  13. {
  14.         //clock
  15.         ASSR = (1<<AS2);                               // 0x08 (1<<AS2)
  16.         TCCR2 = (1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21);//CTC mód 1024-es osztó
  17.         OCR2 = 31;//0..31 az annyi mint 32-es osztás
  18.         TIMSK = (1<<OCIE2);
  19.         sei();  
  20.         //PWM
  21.         TCCR1A = (1<<WGM10) |(1<<WGM11) | (1<<COM1A1)//Fast PWM, 10-bit
  22.         TCCR1B = (1<<WGM12) | (1<<CS10);//nincs előosztó
  23.         OCR1A=0;//kitöltési tényező
  24.         DDRB|=(1<<PB0);
  25.         while(1)
  26.         {
  27.  
  28.         }
  29. }
  30.      
  31. ISR(TIMER2_COMP_vect)
  32. {
  33.     static unsigned char on =0;
  34.     static unsigned char off =0;
  35.  
  36.     PORTB ^= (1<<PINB0);
  37.     sec++;
  38.     if(on)
  39.     {
  40.         if(OCR1A < MAX) {OCR1A++;} else {on=0;}
  41.     }
  42.     if(off)
  43.     {
  44.         if(OCR1A) {OCR1A--;} else {off=0;}
  45.     }          
  46.     if(sec > 59)
  47.     {
  48.        sec = 0;
  49.        min++;
  50.      }
  51.      if(min > 59)
  52.      {
  53.         min = 0;
  54.         hour++;    
  55.         if(hour == ON)
  56.         {
  57.             on=1;
  58.             off=0;
  59.             OCR1A=0;
  60.         }
  61.         if(hour == OFF)
  62.         {
  63.            on=0;
  64.            off=1;
  65.            OCR1A=MAX;
  66.         }        
  67.     }
  68.     if(hour > 23)
  69.     {
  70.        hour = 0;
  71.     }
  72. }

Ez a kód - legalábbis szándékaim szerint - azt csinálja, hogy :
Amikor az óra eléri az ON értékét, akkor másodpercenként növeli az OCR1A értékét egészen a MAX értékéig. (MAX értéke most 1023, mert 10 bites PWM mód van beállítva). Amikor az óra eléri az OFF értékét, akkor minden másodpercben csökkenti az OCR1A értékét. (1023/60 másodpercig van PWM változás, ami 17 perc körüli idő)
(#) csabeszq válasza Sick-Bastard hozzászólására (») Jan 5, 2013 /
 
Sick-Bastard, annyit még hozzátennék, hogy kellene 2 db 7 szegmenses kijelző az órának és egy nyomógomb, amivel át tudod állítani.

Mert ugye egy áramszünet és minden megbolondul. Szóval a probléma neheze az idő egyszerű beállítása.
A hozzászólás módosítva: Jan 5, 2013
(#) Syrius hozzászólása Jan 5, 2013 /
 
Sziasztok,

Valaki tudja, hogy a bootloader miért a flash közepére van betéve?
Pl. ATMega64 esetén a flash az 64k, azaz a címtartomány 0x0000-0xffff.
A bootloader reset címet viszont 0x7000-0x7e00 címekre lehet beállítani DS szerint.

Vagy vmit félreértek?
A hozzászólás módosítva: Jan 5, 2013
Következő: »»   503 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem