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   281 / 839
(#) Horv hozzászólása Nov 19, 2010 /
 
Sziasztok!
Elkezdtem ügyködni egy bináris órán atmega8-al.
A program kész is, megy az egész, csak a multiplexerbe tört ki a bicskám

10db led-t használok a kijelzésre, 4 az órákat a többi 6 a perceket mutatja. A két sor közt NPN tranzisztorokkal váltok(BC 182) úgy, hogy a kollektoraikba mennek a sorok negítatív lábai, és a PORTBre kötve a bázisaik, és így kapcsolgatom őket.

Így néz ki a kód:
  1. uint8_t szamok[59]={
  2.     //.... 0-59-ig a számok hexbe....
  3. };
  4.  
  5. void kiiras(int i,int a){
  6.     /** A - Percek
  7.           I - Órák
  8.     */
  9.     DDRB=0b00000011; //Tranyók
  10.     DDRD=0b01111111; //Led-k
  11.  
  12.     PORTB=0b0000010;
  13.         PORTD=szamok[i];
  14.     _delay_ms(5);
  15.         PORTB=0b0000001;
  16.         PORTD=szamok[a];
  17.     _delay_ms(5);
  18.    
  19. }
  20.  
  21. //Main program
  22. int main(void)
  23. {
  24.     PORTC=0b00000101; //PC5,PC4 Bemenet gombok
  25.     //DDRD=0;  //D port Kimenet kijelző
  26.     //DDRB=0; //B port kimenet tranyók
  27.     uint8_t i,a;
  28.  
  29.    while(1){
  30.         for(i=0;i<12;i++){
  31.             for(a=0;a<59;a++){
  32.                kiiras(i,a);
  33.              _delay_ms(950);
  34.            }
  35.         }
  36.  
  37.     }
  38.  
  39.     return 0;
  40. }


A perceket nagyon szépen kijelzi, viszont az órákat, az első sort ami a PB1, azt nem akarja, csak felvillannak. :no:
Tudnátok segíteni, hogy lehetne ,hogy egyszerre szépen látszódjon a két érték?

Válaszotokat előre köszönöm!

Horv
(#) Reggie válasza Horv hozzászólására (») Nov 19, 2010 /
 
Az a problema, hogy a kiiras utan aktiv marad a legutolso meghajtas, es mivel a kiiras utan 950ms-t varsz, ezert ez fog dominalni. A kiiras fuggveny vegere rakjal egy PORTB=0 sort. Ha ez megvan akkor viszont mind a ketto ugyan olyan halvany lesz, mint eddig az orak. Ezt ugy tudod kompenzalni, hogy a 950ms varakozast csokkented es a kiiras fuggvenyen belul pedig a ket 5ms-ot egyforman noveled ugy, hogy ezeknek az osszege ugyan ugy 960 maradjon vegeredmenyben.
(#) Horv hozzászólása Nov 19, 2010 /
 
Szia! Köszi megpróbálom!
az 5ms-t használhatok egy változót? pl nov
és 950msnek meg csoK?
Valahogy így kelljen kinézzen:
  1. if((nov+csok)<950){
  2.                          nov++;
  3.                          csok--;
  4.                 }
  5.    _delay_ms(csok); //950 ms
  6.  
  7.  //Kiárásnál 5ms:
  8.  _delay_ms(nov);

?

Horv
(#) Reggie válasza Horv hozzászólására (») Nov 19, 2010 /
 
Nem igy gondoltam, ezek legyenek konstansok. A fenyerot az fogja meghatarozni, hogy a kiirason kivuli kesleltetes es a kiiras fuggvenyen beluli kesleltetes aranya mekkora. Pl most azert csak egy pillanatra felvillanonak - azaz nagyon halvanynak - latod az orakat mert ez az arany ott 5/(960+5). Szerintem kezdetnek vedd le a 960-at mondjuk 0-ra. es a ket 5-5 ms varakozast 500-500-ra.
(#) Horv válasza Reggie hozzászólására (») Nov 19, 2010 /
 
Kezdem érteni

Ha 500-500re felveszem ,akkor olyasmit kapok mint a két ledes villogó Hol az egyik-másik sor váltogatja magát.
(#) Reggie válasza Horv hozzászólására (») Nov 19, 2010 /
 
Pontosan. Ha viszont megcsinalod, hogy a ket kiiras felvaltva sokszor ismetlodjon, akkor egyre jobban fog interpolalni a szemed es atlagfenyerot latni a villogas helyett. Tehat ha most pl az 500-at leveszed 10-re, es 50szer berakod egymas utan a kiirast(vagy sokkal szebb, ha egy ciklusba rakod, ami 50szer meghivja), akkor nem villogast fogsz latni, hanem 50%-os folyamatos fenyerot.
(#) Horv válasza Reggie hozzászólására (») Nov 19, 2010 /
 
áhá! Értem már! Köszi! Most Egyszerre kijelzi a két értéket A percek jók, viszont az órákat is másodpercenként számlája :/ De ha várakozok, akkor megint nem lesz jó... Szóval ezért kellenek az arányok?
(#) Reggie válasza Horv hozzászólására (») Nov 19, 2010 /
 
Masold be ide, hogy mit alkottal, elvileg jol kene most szamolnia.
(#) Horv válasza Reggie hozzászólására (») Nov 19, 2010 /
 
  1. void kiiras(int i,int a,int nov){
  2.     /** A - Percek
  3.         I - Ă“rák
  4.     */
  5.     DDRB=0b00000011;
  6.     DDRD=0b01111111;
  7.    
  8.     PORTB=0b0000010;
  9.         PORTD=szamok[i];
  10.     _delay_ms(5);
  11.         PORTB=0b0000001;
  12.         PORTD=szamok[a];
  13.     _delay_ms(5);
  14.  
  15.    
  16. }
  17.  
  18. //Main program
  19. int main(void)
  20. {
  21.     PORTC=0b00000101; //PC5,PC4 Bemenet gombok
  22.     uint8_t i=0,a=0,nov=5,csok=950,b;
  23.     while(1){
  24.         for(i=0;i<12;i++){
  25.             for(a=0;a<59;a++){
  26.            
  27.             for(b=0;b<50;b++){
  28.                kiiras(i,a,nov);
  29.                            }
  30.              /*_delay_ms(csok);
  31.                          if((nov+csok)<950){
  32.                          nov++;
  33.                          csok--;
  34.                          }*/
  35.            }
  36.         }
  37.  
  38.     }


Így van most, minden másodpercbe növeli az i-t meg az a-t is. Majdnem egyszerre jelzi ki. Az órákat(i) lekapcsolja amikor az a-t írja ki
(#) Reggie válasza Horv hozzászólására (») Nov 19, 2010 /
 
A kiiro fuggvenyt ird at ilyenre:
  1. void kiiras(uint8_t ora,uint8_t perc){
  2.     DDRB=0b00000011; // ezt at kene rakni a main elejere
  3.     DDRD=0b01111111; // es ezt is.
  4.    
  5.     PORTD=szamok[ora];
  6.     PORTB=0b0000010;
  7.     _delay_ms(10);
  8.     PORTB=0;
  9.     PORTD=szamok[perc];
  10.     PORTB=0b0000001;
  11.     _delay_ms(10);
  12.     PORTB=0;
  13. }


Amugy perceknek es az oraknak aranyosan kene most lepkedniuk es nem egyszerre.
(#) Horv válasza Reggie hozzászólására (») Nov 19, 2010 /
 
PORTB=0 minden lépésnél lekapcsolja, így nem lesz folyamatos, bocsánat,hogy mindig gondom van vele
(#) Reggie válasza Horv hozzászólására (») Nov 19, 2010 /
 
Igen, azert van ott, hogy minden fuggvenyhivasnal 10 ms-ig legyen bekapcsolva. Igy, ha 50x hivod meg egy masodpercben akkor mind a ket szam 500ms-ig vilagit egy masodpercben.
(#) (Felhasználó 56240) hozzászólása Nov 20, 2010 /
 
Sziasztok
Kérdésem van
Lenne egy ATtiny2313 a felprogramozásához kel kvarc?
Segítséget köszönöm
(#) Reggie válasza (Felhasználó 56240) hozzászólására (») Nov 20, 2010 /
 
Alapbol nem, de ha atallitod a fuse biteknek kvarcra, akkor onnantol kelleni fog.
(#) (Felhasználó 56240) válasza Reggie hozzászólására (») Nov 20, 2010 /
 
Eredetileg egy programozó panelt készítek, amibe csak beteszem és felprogramozás után ki is veszem
De ha hozzá tervezem nem lesz problémája vele, hogy van külső kvarc és a belső az AVR-BEN?
(#) Reggie válasza (Felhasználó 56240) hozzászólására (») Nov 20, 2010 /
 
Nem, azt a kvarcot hasznalja, amit megadsz neki. Viszont onnantol programozashoz is azt hasznalja.
(#) zolee1209 válasza Reggie hozzászólására (») Nov 20, 2010 /
 
Sőt, ha külső kvarcra akarjuk állítani, akkor már ez előtt rá kell kötni a kvarcot a kondikkal, különben "kizárjuk" magunkat a prociból, és csak külső órajellel tudjuk átprogramozni a megfelelő órajelre. De gondolom ezt már tudod, csak Te voltál az utolsó, így a tiedre írtam.
(#) Reggie válasza zolee1209 hozzászólására (») Nov 20, 2010 /
 
Hat celszerubb, de utolag is lehet, csak a visszaolvasas nem fog menni
(#) Ricsi89 válasza zolee1209 hozzászólására (») Nov 20, 2010 /
 
Külső kvarcra beállítani be lehet kvarc nélkül is. Csak utána nem fog menni már kvarc nélkül.
(#) zolee1209 válasza Reggie hozzászólására (») Nov 20, 2010 /
 
Csak a visszaolvasás?! Ha elsőnek belső RC-ről megy a proci, majd kvarc nélkül állítom külső kvarcra, akkor jön a szokásos hibaüzenet... De ha ezután teszek rá kvarcot, akkor sem lesz utána programozható, mindig kell külső órajelet rákötnöm. Olyan, mintha az AVR nem tudná berezgetni a kvarcot.
(#) Reggie válasza zolee1209 hozzászólására (») Nov 20, 2010 /
 
Nekem eddig nem volt ilyen gondom, mindig eleg volt csak a kvarcot rakotni utolag (ilyen esetben). Raadasul amit mondasz annak erosen ellentmond az adatlap ezen resze is:
"The fuse values are latched when the device enters programming mode and changes of the
fuse values will have no effect until the part leaves Programming mode. This does not apply to
the EESAVE Fuse which will take effect once it is programmed. The fuses are also latched on
Power-up in Normal mode."
(#) zolee1209 válasza Reggie hozzászólására (») Nov 20, 2010 /
 
Érdekes... De majd kipróbálom a tuti kedvéért, ha a kezem alá kerül a próbapanel, most nem ezzel foglalkozom. De a másik amit nem értek akkor: Ha most igaz lenne, amit az adatlapból kimásoltál, akkor miért történik sokakkal az, hogy külső kvarcra állítás után (gondolom ezek szerint kvarc nélkül) kizárják magukat a prociból, és csak külső órajel hatására tudják újraprogramozni az AVR-t? Ahogy megfigyeltem, Te inkább 32 bites procikon dolgozol. Amit bemásoltál idézetet, az 32, vagy 8 bites proci adatlapjából származik?
(#) Reggie válasza zolee1209 hozzászólására (») Nov 20, 2010 /
 
8272A–AVR–01/10
164A/164PA/324A/324PA/644A/644PA/1284/1284P

De mega128x/256x szeriaval is sokat foglalkozok(mega128-al tobb mint 8 eve), es azoknal is ugyan ez van.
(#) lajos1969 hozzászólása Nov 21, 2010 /
 
Sziasztok!
Az lenne a kérdésem, hogy az Attyni13A-SU és
az Attyni13-20SSU teljesen egyforma, ha nem akkor miben tér el egymástól?
Kösztök!
(#) Reggie válasza lajos1969 hozzászólására (») Nov 21, 2010 /
 
Lenyegeben ugyan az maradt, viszont csokkent a fogyasztas, a megengedett tapfeszultseg(alacsonyabb orajelrol mar 1.8V-rol is megy), errata nem valtozott es egy masik fab-ban gyartjak. (ATtiny13A a fiatalabb tipus, ATtiny13 kifuto lesz nemsokara). Ezen felul az SSU vegu 150 mil szeles tokban van, az SU vegu 209 mil szeles tokban van.
(#) lajos1969 válasza Reggie hozzászólására (») Nov 21, 2010 /
 
Köszönöm.
(#) zacc hozzászólása Nov 21, 2010 /
 
Sziasztok.
Asambly -nyelvezetett probálok tanulni .
A kérdésem az lenne hogy "OUT DDRA+0, R27" instrukcioba a DDRA után a "+0" mit csinál ?
(#) Reggie válasza zacc hozzászólására (») Nov 21, 2010 /
 
Az a DDRA cimehez hozzaad nullat(forditasi idoben), es erre a cimre hajtja vegre az utasitast.
(#) lajos1969 válasza Reggie hozzászólására (») Nov 21, 2010 /
 
Szia!
Megépítettem ezt a programozót.
Milyen szoftver kell ehhez, hogy tudjam használni?
(#) gtk válasza lajos1969 hozzászólására (») Nov 21, 2010 /
 
WinAVR, ponyprog, bascom,.. barmilyen, ami az stk200-at kezeli.
Következő: »»   281 / 839
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