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   197 / 840
(#) puli122 válasza (Felhasználó 4577) hozzászólására (») Márc 16, 2010 /
 
szerintem az Atmel-nak üzleti érdeke hogy megjelenjen minél több nyelven, legalábbis nekem ez lenne a logikus.
(#) NagyKrisz válasza (Felhasználó 4577) hozzászólására (») Márc 16, 2010 /
 
[OFF]Igen, tudok rá megoldást a pdf szerkesztésre, de az szétszedi a rajzokat darabokra, sok munka visszaterelni a régi formátumra.
(#) IMi válasza NagyKrisz hozzászólására (») Márc 16, 2010 /
 
Hello!
Ajánlhatom FoxIt termékeit ilyen célra !
Még 1 szavazat a magyarosításra !
(#) Ricsi89 válasza trudnai hozzászólására (») Márc 17, 2010 /
 
Ez nem is hülyeség, csak még nem vagyok olyan "fejlettségi" szinten, hogy menjen. Nem is sikerült elsőre megcsinálni. Nem tudom, hogy a timer beállításánál, vagy az interrupt kezelésében van-e a hiba, de nem csinál semmit.
  1. int main(void){
  2.   MCUCR=0x00;
  3.   TIMSK= (1<<TOIE0);
  4.   TCNT0= 0x00;
  5.   TCCR0= (1<<CS00);
  6.   sei();
  7.   ...
  8. }
  9. ISR(TIMER0_OVF_vect){
  10. kijelzes(i,k);
  11. }

Eddig jutottam vele, szerintem valami a timer beállításával lehet... Nem találtam konkrét példát sehol erre.
Szerk.: Mega8-al dolgozok.
(#) adamtui_93 hozzászólása Márc 17, 2010 /
 
Hali
Lenne egy nagy problémám a topi féle avrdopler panelét megcsináltam kimarattam minden, de forrasztásnál a vacak pisztoly pálkám véget nem ment és elcsesztem az egészet ezért azt kérdezném hogy nem tudna valaki csinálni egyet nekem ( persze nem ingyen de a bolti drága és az alkatrészek megvannak csak 1 nyák kéne amibe már a 2icfoglalat benne van )?
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Márc 17, 2010 /
 
Rájöttem a hibára. Valami oknál fogva atmega128-ra volt a proci beállítva és ezért nem ment. Így működik a megszakításból vezérelt kijelzés, de nem fut a főprogram. Egyenlőre csak értéket adok a két változónak, amit ki akarok jeleztetni, de ugyanúgy nullát jelez a kijelző, mintha be sem lépne a végtelen ciklusba. Itt a komplett programom.
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. unsigned int seg[10]={0x3F, 0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  6. uint8_t i=0, k=0;
  7.  
  8. void kijelzes(unsigned int szam1, unsigned int szam2){
  9.   DDRD=0xFF;
  10.   DDRC=0xFF;
  11.   PORTD= ~seg[szam1];
  12.   PORTC= (1<<0);
  13.   _delay_us(100);
  14.   PORTD= ~seg[szam2];
  15.   PORTC= (1<<1);
  16.   _delay_us(100);
  17. }
  18.  
  19.  
  20.  
  21. int main()
  22. {
  23.     TCCR0 = (1<<CS00);
  24.     TCNT0 = 0x00;
  25.     TIMSK = (1<<TOIE0);
  26.     sei();
  27.    
  28.     while(1){
  29.           i=2;
  30.           k=5;
  31.         }
  32.  
  33. return 0;
  34. }
  35.  
  36. ISR(TIMER0_OVF_vect){
  37.   kijelzes(i,k);
  38.   TCNT0=0x00;  
  39. }
(#) (Felhasználó 4577) válasza Ricsi89 hozzászólására (») Márc 17, 2010 /
 
Próbáld meg így!
  1. volatile unsigned int i=0, k=0;


Ezeket tedd a main-be:
  1. DDRD=0xFF;
  2.   DDRC=0xFF;
(#) Ricsi89 válasza (Felhasználó 4577) hozzászólására (») Márc 17, 2010 /
 
Köszi, így már megy.
(#) (Felhasználó 4577) válasza Ricsi89 hozzászólására (») Márc 17, 2010 /
 
Szívesen!
(#) gtk válasza Ricsi89 hozzászólására (») Márc 17, 2010 /
 
Interruptban nem szokas delay-ezni. Ajanlatos a megszakitasban egy flag-et beallitani, majd a main loop-ban figyelni, (es torolni), flag allapotanak megfeleloen program elagazast irni.
(#) Ricsi89 válasza gtk hozzászólására (») Márc 17, 2010 /
 
Hát ő ennyire még nem vágom a dolgot, nem igazán tudom hogy is nézne ez ki, amit leírtál.
(#) Poki hozzászólása Márc 18, 2010 /
 
Sziasztok!
Eddig PIC-ekkel foglalkoztam.
Most lenne egy nagyobb lélegzetvételü feladatom amit AVR-rel szeretnék megoldani.
Az AT32UC3 családot néztem ki. (nehogymár egyszerüvel kezdjek.)
Használt már valaki ilyet?
Esetleg az USB részét is?
Üdv: Poki
(#) magitor hozzászólása Márc 19, 2010 /
 
Üdv urak az alábbi programot próbálgattam átirogatni attyni4520 ra de sajnos sikertelenül, segítene benne valaki hogy mit kellene változtatni hogy működjön a kapcsolással ha 4520 ra építem ugyanezzel a lábkiosztással?
Előre köszönöm!
  1. #include <io.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4.  
  5.  
  6.  
  7. #define F_CPU                           11059200                        // CPU clock frequency
  8. #define PRESCALER                       64                                      // CPU prescaler value
  9.  
  10.  
  11.  
  12. #define BASE_FREQUENCY          (F_CPU/PRESCALER)       // counter frequency   
  13.  
  14. #define TUNING_FORK_A           440.0                           // "base" A
  15. #define NOTE_DIFF                       1.05946309436           // the 12'th root of 2
  16.  
  17.  
  18. #define E_STRING        164.81                                          // top string (1)
  19. #define A_STRING        220.00
  20. #define D_STRING        293.66
  21. #define G_STRING        391.99
  22. #define B_STRING        493.88                         
  23. #define EH_STRING       659.26                                          // bottom string (6)
  24.  
  25.  
  26. // The guitar note span
  27. //  # # #  # #  # # #  # #
  28. //EF G A BC D EF G A BC D E
  29. //1    2    3    4 * 5    6
  30. //
  31.  
  32. unsigned int Center_Count[] =
  33. {
  34.         BASE_FREQUENCY/EH_STRING,                       // High E
  35.         BASE_FREQUENCY/B_STRING,                        // B
  36.         BASE_FREQUENCY/G_STRING,                        // G
  37.         BASE_FREQUENCY/D_STRING,                        // D
  38.         BASE_FREQUENCY/A_STRING,                        // A
  39.         BASE_FREQUENCY/E_STRING,                        // Low E
  40. };
  41.  
  42. unsigned int Transition_Count[] =
  43. {
  44.         BASE_FREQUENCY/(B_STRING+(EH_STRING-B_STRING)/2),       // E to B
  45.         BASE_FREQUENCY/(G_STRING+(B_STRING-G_STRING)/2),                // B to G
  46.         BASE_FREQUENCY/(D_STRING+(G_STRING-D_STRING)/2),                // G to D
  47.         BASE_FREQUENCY/(A_STRING+(D_STRING-A_STRING)/2),                // D to A
  48.         BASE_FREQUENCY/(E_STRING+(A_STRING-E_STRING)/2),                // A to E
  49. };
  50.  
  51.  
  52.  
  53.  
  54. volatile unsigned char count_hi;        // overflow accumulator
  55.  
  56. //
  57. //timer 0 overflow interrupt
  58. //
  59. SIGNAL(SIG_OVERFLOW0)  
  60. {
  61.         count_hi++;                                             // increment overflow count
  62. }
  63.  
  64.  
  65. //----------------------------------------------------------------------------
  66. // Main Lupe
  67. //----------------------------------------------------------------------------
  68.  
  69.  
  70. int main(void)
  71. {
  72.         unsigned int i;
  73.         unsigned int count;
  74.        
  75.  
  76.  //------------------------------
  77.  // Initialize
  78.  //------------------------------
  79.  
  80.         cbi("DDRB", 1);                 // PB1 is input
  81.         cbi("PORTB", 1);                        // no pullups active
  82.  
  83.        
  84.         sbi("DDRB", 0);                 // PB0 is ouput, High LED
  85.         sbi("DDRB", 2);                 // PB2 is ouput, Low LED
  86.  
  87.  
  88.         outp(0x03,"TCCR0");             // set prescaler to f/64 (172.8 kHz @ 11.0592 MHz)
  89.  
  90.         sbi("TIMSK","TOIE0");           // enable interrupt on timer overflow
  91.         asm volatile ("sei");   // global interrupt enable
  92.  
  93.  
  94.  
  95.  //----------------------------------------------------------------------------
  96.  // Let things loose
  97.  //----------------------------------------------------------------------------                        
  98.  
  99.  
  100.         while (1)                                                               // loop forever
  101.         {
  102.                 count = 0;                                                      // clear sample count
  103.                 loop_until_bit_is_set("PINB",1);                // wait for something to happen
  104.  
  105.                 // got a high edge
  106.                 // start sampling
  107.                
  108.                 outp(0,"TCNT0");                                                // clear counter                 
  109.                 count_hi = 0;                                           // clear hi count
  110.  
  111.                
  112.                 // sample loop
  113.                
  114.                 for (i=0;i<32;i++)
  115.                 {
  116.                         while (bit_is_set("PINB",1))            // ignore hi->lo edge transitions
  117.                                 if (count_hi > 80)                      // skip if no edge is seen within
  118.                                         break;                                  // a reasonable time
  119.  
  120.                         while (bit_is_clear("PINB",1))  // wait for lo->hi edge
  121.                                 if (count_hi > 80)                      // skip if no edge is seen within
  122.                                         break;                                  // a reasonable time
  123.  
  124.                         count += (count_hi << 8) + inp("TCNT0"); // get counter value
  125.                         outp(0,"TCNT0");                                        // clear counter                 
  126.  
  127.                         if (count_hi > 80)                              // skip if counter has accumulated a
  128.                                 break;                                          // too high value
  129.  
  130.                         count_hi = 0;                                   // clear hi count
  131.                 }
  132.  
  133.  
  134.  
  135.  
  136.                 // initially turn off both leds
  137.                 sbi("PORTB",0);
  138.                 sbi("PORTB",2);
  139.  
  140.                 if (count_hi <= 80)                                     // if count is reasonable
  141.                 {
  142.  
  143.                         count = count >> 5;                             // average accumulated count by dividing with 32
  144.        
  145.                         // now we have to find the correct string
  146.                                                
  147.                         // go through transition frequencies
  148.                        
  149.                         for (i=0;i<sizeof(Transition_Count)/sizeof(Transition_Count[0]);i++)
  150.                         {
  151.                                 if (count < Transition_Count[i])        // stop if lower than this transition count
  152.                                         break;
  153.                         }                              
  154.                        
  155.                         // i now holds the string index
  156.                        
  157.                         // check the count for a match, allowing
  158.                         // 1 extra count "hysteresis" to avoid too
  159.                         // much LED flickering
  160.                        
  161.                         if (count-1 <= Center_Count[i])                 // if count <= this string count
  162.                                 cbi("PORTB",0);                                         // light "Too High" LED
  163.        
  164.                         if (count+1 >= Center_Count[i])                 // if count >= this string count
  165.                                 cbi("PORTB",2);                                         // light "Too Low" LED
  166.                 }
  167.         }
  168.  
  169.  
  170. }

És ez a kapcsolás linkje Bővebben: Link
(#) labu01wx hozzászólása Márc 20, 2010 /
 
Sziasztok!
Meg tudnátok mondani, hogy hogyan lehetne illeszteni(3,3V<->5V) egy BTM-112 bluetooth modult egy avrhez?
Tudnátok pár előnyét/hátrányát mondani az UART, SPI, UART-SPI interfésszel való kommunikációnak?
A segítséget előre is köszönöm.
(#) Fizikus válasza labu01wx hozzászólására (») Márc 20, 2010 /
 
Valami ilyesmit kellene építened:Logic Level Converter
Kapcs.rajz
(#) Fizikus válasza Fizikus hozzászólására (») Márc 20, 2010 /
 
Itt meg is veheted a BSS138-at:
BSS138
(#) dokidoki válasza magitor hozzászólására (») Márc 20, 2010 /
 
Szia!

Ez a ATtiny45-20 akart lenni? , Én ezt a programot sikeresen adaptáltam, ATtiny13-ra. Szépen működik.
Az Fcpu értékét kellet még módosítani a programban, mert lusta voltam külső kvarcot tenni rá...
Szerintem lefordítható lenne a 45 -re is, majd megpróbálom.
(#) dokidoki válasza dokidoki hozzászólására (») Márc 20, 2010 /
 
AVR-studioval, simán lefordul, bár nem jelenti azt, hogy működik is, le kellene tesztelnem.
Írd le, hogy mivel fordítod, és milyen hibaüzenet keletkezik, ha nem sikerül a fordítás?
(én nem vagyok penge a témában, de ilyen apró programokon szoktam gyakorlatozni, hogy megértsem a működésüket. Sajnos, analógnak születem... most kezdek ráharapni a digitális logikára...)
(#) Szobiati hozzászólása Márc 20, 2010 /
 
Sziasztok!
Egy héten belül sikerült magam kizárni a 2. AVRből, most egy ATTiny13V az elszenvedője a barbárságomnak: átállítóttam az oszcillátort belső 4.8Mhz-re, a program fut rajta mert hallom egy piezzon, csak programozni nem tudom valószínű túl gyors a programozóm mert szerintem még le is osztja 8al az órajelet, elfelejtettem kivenni a pipát a CKDIV8-tól.
Viszont ha valaki meg tudná mondani, hogy mit kell kiírni az SPI lábakra a fusbitek állításához felprogramoznék magamnak egy rögtönzött programozót, hogy visszaállítsam a fuse-biteket olyanra, hogy megint 9.6Mhz-en fusson.
Tudom, hogy elvileg AVR Studióban lehet állítani a programozó sebességét, de úgy észleltem, hogy az nem állít semmit.
Előre is köszönöm,
Attila
(#) (Felhasználó 4577) válasza Szobiati hozzászólására (») Márc 20, 2010 /
 
Szia!

Lehet állítani az SPI frekvenciát és jól is működik, feltéve ha nem valami házi összetákolt égetőd van, ami fix ISP frekvenciával dolgozik.
Az AVR Studio-s 9.6MHz-es Fuse bit beállításra nem tudok mit mondani. Olvasd el a lehetőségeket. Annyit segítek, hogy az Int. rövidítése Internal, az Ext. rövidítése External.
(#) labu01wx válasza Fizikus hozzászólására (») Márc 20, 2010 /
 
Köszönöm a választ.
Tudnál mondani BSS138 megfelelő nem smd FET-et?
A 3,3V-os oldalon a tápcsatlakozók be vagy kimenetek?
(#) magitor válasza dokidoki hozzászólására (») Márc 20, 2010 /
 
AVR studio WinGCC vel, C ben lefordul simán, viszont avstudióban valamiért már nem éppen, holnap reggel leírom mert a laptopot amin progizok benhagytam munkahelyen véletlenül.
(#) Szobiati válasza (Felhasználó 4577) hozzászólására (») Márc 21, 2010 /
 
Szia!
Ilyen égetőm van, de nem tudom ezen működik-e a sebesség állítás, szerintem nem.
(#) dokidoki válasza magitor hozzászólására (») Márc 21, 2010 /
 
Lehet, hogy WinAVR -t akartál írni?
Ott is megnéztem, lefordult hiba nélkül. Igaz macerásabb, van egy koreográfiája a forditás menetének.
Én mindig ott rontom el, hogy elfelejtem elmenteni a beállított makefilet a projekt könyvtárban. És csak nézek pár percig, hogy ennek már megint mi a baja
(és persze a telepítési könyvtárak, és a projektek is keverve vannak több meghajtón, nehogy egyszerű legyen)
(#) dokidoki válasza Szobiati hozzászólására (») Márc 21, 2010 /
 
Szia.
Nem tudom, hogy itt: ezt a videót nézted -e? Mert a programozódhoz megmutatja a sebesség állítást.
Én jobb híján, ponyprog-al piszkáltam ezeket az AVReket, USB -sorosport átalakítóval, és a legegyszerűbb programozó kapcsolással.
(#) Fizikus válasza labu01wx hozzászólására (») Márc 21, 2010 /
 
Sajnos nem tudok mondani a BSS138-nak megfelelő nem SMD FET-et.
Erre a lapkára is csak a netet böngészve találtam rá.
Az alábbiábrán látszik, hogy melyik csatlakozók a be-/kimenetek.
(#) Szobiati válasza dokidoki hozzászólására (») Márc 21, 2010 /
 
Igen, így próbáltam én is, de még 1kHz-en se tudom belőle, még a DeviceID-t se kiolvasni. Ebből gondoltam, hogy nem állít semmit.
Pedig menni megy a proci mert egy piezzo folyamatosan pittyeg (ez volt az utolsó amit beleírtam), mikor programoznám elhalgat (RESET jó) és kiírja, hogy "Entering programming mode.. FAILED!". Ezt pedig azután kezdte, hogy 4.8Mhz-re átállítottam.
Viszont, be van állítva Brown-out reset 1.8V-ra ha valaki tudna linkelni egy kapcsolást, hogy hogyan kell megvalósítani azt ráengedném. Sajnos Gooogle-el én nem találtam.
USB-sorosport átalakítóm pedig sajnos nincs, pedig, de jó lenne néha, épp most dolgozok rajta...
(#) dokidoki válasza Szobiati hozzászólására (») Márc 21, 2010 /
 
Hát, nem tudom.
Nálam akkor voltak ilyesmi problémák, mikor az áramkörbe építve szerettem volna programozni, és a hozzá kapcsolt áramkör terhelte a programozó lábakat.
Nálad, nem biztos, hogy ez a baj.
Szerintem még akkor lehet ilyen hiba, ha véletlenül külső órajelet állítottál be neki, és nem kap kvarcot az IC és ezért bizonytalan, kiszámíthatatlan a működése.
Nem tudom, pontosan milyen kapcsolást keresel.
(amit használsz programozót, az nálam is tervbe van véve. de majd akkor jön el az ideje ha a meglévővel nem boldogulok egyszer végképp.)ez már PIC-el előfordult, és egyből áttértem a pickit2-re. megérte.
(#) (Felhasználó 4577) válasza labu01wx hozzászólására (») Márc 21, 2010 /
 
BS170 TO92
(#) Szobiati válasza dokidoki hozzászólására (») Márc 21, 2010 /
 
Áramkörbe van téve, de mérgemben már mindent kiforrasztottam, habár azelőtt jó volt a többi (többi.. hát az az 1 piezzo többinek számít ) alkatrésszel mielőtt átállítottam. Tervezek amúgy a közeljövőben egy AVR Dragont egy huszárvágással elintézendő az összes elkövetkezendő problémámat és egyebeket, csak még gyüjtenem kell rá.

A külső órajeles ötletben viszont van valami, bár fogalmam sincs mit csinál egy AVR ha nem kap külső órajelet mikor az van beállítva neki.
Az biztos, hogy most kipróbálom, felprogramozok egy külső órajelgenerátort és bekötöm. Bár csak enny lenne a baja!
Következő: »»   197 / 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