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   108 / 840
(#) TavIR-AVR válasza wg_kezdo hozzászólására (») Márc 6, 2009 /
 
A Config INT0=
portirány beállítás, enable INT0, Enable Interrupts sorok mind hiányoznak....
(#) TavIR-AVR válasza lyukasora12 hozzászólására (») Márc 6, 2009 /
 
Ott a bascom körbejárás is:
Bascom magyarul....

Illetve 1-2 dolog már Arduinoként is:
Arduino / AVR-Duino
(#) wg_kezdo válasza TavIR-AVR hozzászólására (») Márc 6, 2009 /
 
Igazad van elfelejtettem bemásolni, de ott vannak .
Kipróbáltam, ha nem állítom le powerdown-al akkor jól működik a megszakítás, csak akkor van gond, ha lekapcsolom a procit.
(#) mcganyer hozzászólása Márc 7, 2009 /
 
Üdv!
megépítettem az Attiny13-as ni-mh töltőt topi nyolc lábbal c. cikkéből. Működik is annyi szépséghibával hogy a töltés nem 6sec hanem 40 körül a sönt bekapcsolásának ideje pedig 1sec helyett 7 körül van.

Nem tudom mit ronthattam el

a segítséget előre is köszönöm!

(#) Topi válasza mcganyer hozzászólására (») Márc 7, 2009 /
 
Megint, a nem kikapcsolt CLKDIV8 és nem beállított órajel forrás a Fuses-ban.
(#) mcganyer válasza Topi hozzászólására (») Márc 7, 2009 /
 
Értem, úgy emlékeztem pedig, hogy beállítottam. Lehet , hogy mégse. :no: Megpróbálom még egyszer.

Köszönöm a gyors segítséget és köszönet a 8lábú sorozatért!
(#) zsuscsinyo hozzászólása Márc 7, 2009 /
 
Sziasztok!

A következő problémával küszködök éppen: Adott egy mátrix billentyűzet (USB Numerikus billentyű volt fénykorában), a fóliáról kitérképeztem hogy hogy vannak a sorok és oszlopok. Viszont a kiolvasásuk bonyolultabb mint gondoltam... Mellékeltem egy mórickarajzot amin ábrázolt a bekötés, (azért ezt választottam mert ilyet már láttam más kapcsolásban)
Az áramkör már elkészült és gondolom meg lehet valahogy írni a progiját, ebben is kérném a segítségeteket. (WinAVR-ben programozok)

A válaszokat előre is köszönöm!

Matrix.jpg
    
(#) zsuscsinyo válasza zsuscsinyo hozzászólására (») Márc 7, 2009 /
 
No, mint ahogy az lenni szokott megoldódott a probléma. Azért leírom, hogy is néz ki hátha más is esik ebbe a helyzetbe

  1. int gomb(void){
  2. char i;
  3. i= PIND;
  4.  
  5. PORTC = 0x3E;
  6. _delay_ms(1);
  7.     if (!(PIND & (1<<0))){
  8.         return 17;
  9.     }
  10.  
  11.     if (!(PIND & (1<<4))){
  12.         return 12;
  13.     }
  14.  
  15.  
  16. PORTC = 0x3D;
  17. _delay_ms(1);
  18.     if (!(PIND & (1<<3))){
  19.         return 10;
  20.     }
  21.  
  22.     if (!(PIND & (1<<4))){
  23.         return 11;
  24.     }
  25.  
  26.  
  27. PORTC = 0x3B;
  28. _delay_ms(1);
  29.     if (!(PIND & (1<<3))){
  30.         return 0;
  31.     }
  32.  
  33.     if (!(PIND & (1<<4))){
  34.         return 16;
  35.     }
  36.  
  37.  
  38. PORTC = 0x37;
  39. _delay_ms(1);
  40.     if (!(PIND & (1<<2))){
  41.         return 1;
  42.     }
  43.  
  44.     if (!(PIND & (1<<3))){
  45.         return 2;
  46.     }
  47.    
  48.     if (!(PIND & (1<<4))){
  49.         return 3;
  50.     }
  51.  
  52.     if (!(PIND & (1<<5))){
  53.         return 15;
  54.     }
  55.  
  56.  
  57. PORTC = 0x2F;
  58. _delay_ms(1);
  59.     if (!(PIND & (1<<2))){
  60.         return 4;
  61.     }
  62.  
  63.     if (!(PIND & (1<<3))){
  64.         return 5;
  65.     }
  66.    
  67.     if (!(PIND & (1<<4))){
  68.         return 6;
  69.     }
  70.  
  71.     if (!(PIND & (1<<1))){
  72.         return 14;
  73.     }
  74.  
  75.  
  76. PORTC = 0x1F;
  77. _delay_ms(1);
  78.     if (!(PIND & (1<<2))){
  79.         return 7;
  80.     }
  81.  
  82.     if (!(PIND & (1<<3))){
  83.         return 8;
  84.     }
  85.    
  86.     if (!(PIND & (1<<4))){
  87.         return 9;
  88.     }
  89.  
  90.         if (!(PIND & (1<<5))){
  91.         return 13;
  92.     }
  93.  
  94.  
  95.  
  96. return 18;
  97.  
  98. }
(#) ATtiny válasza zsuscsinyo hozzászólására (») Márc 7, 2009 /
 
Össze dobtam neked egy kis kódot. Nem garantálom, hogy jó.

  1. uint8_t matrix_lekerdezes(void)
  2. {
  3.  uint8_t sor, oszlop;
  4.  uint8_t gomb_szam = 0;
  5.  
  6.  for(sor = 0; sor<6; sor++)
  7.  {
  8.   PORTD = (1<<sor); //kiválasztjuk a sort
  9.   for(oszlop = 0; oszlop<6; oszlop++)
  10.   {
  11.    gomb_szam++;
  12.    if(PINC & (1<<oszlop))   // gomb le van nyomva a kiválasztott sor kiválasztott oszlopában?
  13.     return gomb_szam; //ha levan nyomva akkor visszaadjuk a gomb sorszámát
  14.   }
  15.  }
  16.  return 0; // nem volt lenyomva gomb
  17. }


Mit is csinál ez? HA meghívod a fügvényt akkor az szépen egymás után magas szintre huzza a mátrixod sorait. Mindíg csak 1-et. És amíg magas szinten van 1 sor, addig végig szalad az oszlopokon. Elvileg akár 1 olvasó utasítás is elég lenne. Nem kéne így ciklusban végigolvasni. Ha valamelyik lábon magas szintet talál, akkor az a gomb le van nyomva és visszatér a fügvény a lenyomott gomb sorszámával. A sorszám a bal felső sarokból számolódik a rajzod alapján és a jobb alsó gomb az utolsó. Hibája a kódnak hogy csak 1gombot tud egyszerre érzékelni. Mindíg a legelső megtalált lenyomott gombal tér vissza. De majd te tovább fejleszted.


UI: inkább csatoltam, mert a remek forum motor elcseszi...

pelda4.c
    
(#) zsuscsinyo válasza ATtiny hozzászólására (») Márc 7, 2009 /
 
Köszönöm szépen a fáradozásodat! Ahogy elnézem ugyanazt csináltuk és mindegyik megoldja az említett problémat! (az enyém picit hosszabb....
)
(#) ATtiny válasza zsuscsinyo hozzászólására (») Márc 7, 2009 /
 
Igazán nincs mit. Ma még úgy sem írtam 1 sor kódot sem. Jól jött egy kis gondolkodás.
(#) gtk válasza zsuscsinyo hozzászólására (») Márc 7, 2009 /
 
A
  1. _delay_ms(1);
prell mentesitesnek van?
Egy rakas proci idot megeszik a sok delay. Osszetettebb kodnal nem lesz proci ido. Vagy csak "neha" olvasod be a gombok allapotait?
Inkabb csinalj egy >50 Hz-es idozitest, es abban hivd be a gomb olvaso fuggvenyedet.

ATiny : Az ertekes kodot megette a forum motor.
C kod beszurasnal lehet hasznalni :
[ code = c ] [ / code ]
Szokozok nelkul.

(#) ATtiny válasza gtk hozzászólására (») Márc 7, 2009 /
 
Nahát, ezt nem is tudtam Én meg nézem hova lesz a kódom fele... Kénytelen voltam csatolni a filet. Na majd legközelebb így próbálok berakni kódot.
(#) zsuscsinyo válasza gtk hozzászólására (») Márc 7, 2009 /
 
Na ez jó kérdés minek van ott, a lényeg hogy nem működik nélküle (4-es helyett 7-est ír, nincs 0 stb...) Vicces egy jószág
(#) GTI hozzászólása Márc 7, 2009 /
 
Sziasztok a segítségeteken szeretném kérni az
www.obdev.at/ oldalon található firmware kapcsolatban. Akármit csinálok nem tudom winavr-ben felprogramozni vele az AVR-t. A makefile ben kellene módosítani gondolom a programozot, stb.
De valahogy nem akar összejönni. Tudnátok segíteni?
(#) gtk válasza GTI hozzászólására (») Márc 8, 2009 /
 
Konkretan egy linket a file -ra adhatnal..
(#) herzsolt hozzászólása Márc 8, 2009 /
 
Az volna a kérdésem, hogy c-ben íródott progi esetében, amikor tápot kap az AVR akkor jó volna, ha eőször egy kis szöveget írna ki, mielőtt a tényleges programra tér rá az LCD. Ezt hogyan tudom megvalósítani?
(#) ATtiny válasza herzsolt hozzászólására (») Márc 8, 2009 /
 
A "tényleges" programot kell átalakítanod, hogy először írja ki az LCD-re amit akarsz és egy kis várakozás után induljon csak el a program többi része. Nyilván kell hozzá a program forrása és miután átítad a kódot le is kell tudnod fordítani. Ezek a minimális feltételek. Azt nem számolva, hogy persze C-ben is kell tudnod programozni, hogy meg tudd írni a kódot.
(#) herzsolt válasza ATtiny hozzászólására (») Márc 8, 2009 /
 
Itt van mellékelve a progi eleje, itt kellene módosítani?

main.c
    
(#) gtk válasza herzsolt hozzászólására (») Márc 8, 2009 /
 
Szerintem kezd valami egyszerubbel..
(#) ATtiny válasza herzsolt hozzászólására (») Márc 8, 2009 /
 
Nem... ez még angyon az eleje Valahol a main() fügvény elején kéne belenyulni, mikor már fel van inicializálva az egész rendszer és él az LCD komunikáció is.
(#) GTI válasza gtk hozzászólására (») Márc 9, 2009 /
 
Erről a programról van szó. Az Example projektek közül egyet se tudok feltölteni az AVR-re.

AVR - USB
(#) gtk válasza GTI hozzászólására (») Márc 9, 2009 /
 
usbdrv

Csinalsz egy projekt-konyvtarat, atmasolod az usbdrv konyvtarat (nem csak a tartalmat !) ide. Az examples -bol amit szeretnel forditani szinten atmasolod a projekt konyvtarba (csak tartalmat)

A Makefileokban beallitod amit kell.
Onmagaert beszel ..

  1. DEVICE  = atmega168
  2. F_CPU   = 16000000      # in Hz
  3. FUSE_L  = # see below for fuse values for particular devices
  4. FUSE_H  =
  5. AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer


A Makefileban nehany eszkoz L/H Fuse beallitasai is megtalalhatok.

Mikor megvannak a beallitasok kiadod a megfelelo parancsot (forditas, fuse bitek betoltese, hex betoltese) Meg kell nezni a readme-t, vagy valahol biztosan airja hogy milyen parancsokkal dolgozik a Makefile.

(#) Sir-Nyeteg hozzászólása Márc 9, 2009 /
 
Van ez a nagyon jól megkreált Videó.
Én is csináltam hasonlót AVR-rel, de a gondom az, hogy a századmásodperc a videóban még felgyorsítva is villog, nekem meg "kalibrálva" is állandóan ég. Nem látni semmi villogást. Ez mitől lehet? Multiplexálva vannak a kijelzők.
(#) Topi válasza Sir-Nyeteg hozzászólására (») Márc 9, 2009 /
 
Fel van gyorsítva a videó és az nem századmásodperc, hanem frame. 0-24-ig számol.
Multiplexálva van nagyjából olyan 300Hz-el.

A videón a csapó rendesen be volt világítva, így a kamera alacsony "exponálási" idővel dolgozott. Emiatt a videón természetesen villogott, annak ellenére, hogy direkt kerültem az egész, többszörös frekvenciákat.

Ezen egy egyszerű módon segítettem. A gyorsítás nem egésszámú többszörös, így a frame-ek átmosódnak.

Multiplexált kijelző csak akkor nem fog villogni, hogyha jócskán több a frissítési freki, mint a felvételi frekvencia.
Tehát konkrétan közepes megvilágítás esetén KHz-es tartomány.
(#) Sir-Nyeteg válasza Topi hozzászólására (») Márc 9, 2009 /
 
Hogy én milyen ügyes vagyok!
Annyira tetszett, hogy egyedül azt nem vettem észre, hogy nem is százig számol... Lehet h újra kéne tanulnom a számokat.
Köszönöm, így már érthető! Frekvenciámat én is osztogattam, és kb az 3-század másodperces frekivel villogó kijelző már gyönyörűen villódzik. Azaz a tizedmásodperces kijelzőrész a szép benne.
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Márc 9, 2009 /
 
Ebböl egy szót nem értek, próbáld meg megfogalmazni mit akarsz kérdezni. Mi az hogy kalibrált? Mi az hogy villog? Ha multiplexálva van persze hoyg villogni fog, de a multiplexálás sebességét emelve olyan gyorsan villog hogy nem látja a szemed.
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Márc 9, 2009 /
 
Elnézést!
Kalibrálva: 1 másodperc, az tényleg 1 másodperc.
Nem a multiplexálás miatt villog, hanem a századmásodperc szegmenseinek változása által villog.
Nekem egyfolytában 8-as látszik olyan sebességgel pörög az utolsó karakter. Tehát egy időzítőnél felesleges a századmásodpercet is mutatni, mivel egyetlen 8-ast látok mindig a kijelzőn. A tizedmásodperces kijelzőn már kivehetőek a számok.
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Márc 9, 2009 /
 
Na mostmár értem Valóban lehet olyan frekvenciát találni, hogy a kamera mintavétele és a számláló ledjei szinkronba vannak és "mintha álna" Érdemes nem egész számú töbszörösére választani a multiplexálás sebességét a kamera kép frissítésének. Akkor mindenképpen változni fog az utolsó szám is.
(#) Slope hozzászólása Márc 9, 2009 /
 
Szia Mindenki!

Valaki nem tudná véletlenül, hogy WinAVR-nél hogyan deklarálhatok változót a fejlécfájlban anélkül, hogy a fejlécfájl újbóli betöltésekor (pl. egy másik forrásból) ne legyen többszörös deklarálás miatt error?

A többi fejécben is használt módszert próbáltam, konkrétan:
#ifndef LEFUTOTTAM
#define LEFUTOTTAM 1
//Deklarációk
#endif

#warning beszúrással néztem, hogy ennek ellenére többször becsatolja azt amit már nem kéne.
Mintha eltűnne a LEFUTOTTAM bejegyzés. Tán külön külön fordít és aztán linkel? Ötlet?

Köszi!
Következő: »»   108 / 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