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   321 / 840
(#) L_Maqvus hozzászólása Ápr 15, 2011 /
 
Rajta volt a kristály mikor programoztam
(#) kovacsj válasza Ricsi89 hozzászólására (») Ápr 15, 2011 / 1
 
Miért nem így csinálod?
  1. while ((ch = uart_getch()) != '\n') {
  2.          buf[i ]= ch;
  3.                 ++i;
  4.  
  5. }
(#) Ricsi89 hozzászólása Ápr 15, 2011 /
 
Nos gondolkoztam, hogy hogyan lehetne sorvége jeltől, sorvége jelig olvasni. Ez lett belőle:
  1. while(k==0){
  2.         if(uart_getc()=='\n'){
  3.         do{
  4.                 buf[i]=uart_getc();
  5.                 ++i;
  6.                 }while(!(buf[i-1]=='\n'));
  7.         k=1;
  8.         }
  9. }

Szerintetek működőképes lenne? Az én véleményem szerint működhet, de nem vagyok biztos magamban. Már csak azt remélem, hogy nem fog kimaradni egy karakter sem. Azt nem tudom, hogy a kontrollernek lesz-e elég ideje a két karakter között megvizsgálni a while feltételt. A kontroller Atmega8, 4,096MHz-ről fut majd és az adatok 9600baud-al jönnek.
(#) trudnai válasza Ricsi89 hozzászólására (») Ápr 15, 2011 /
 
Legegyszerubb:

  1. int i = 0;
  2. while ( (ch = usart_getch()) != '\n' ) {
  3.     buf[i++] = ch;
  4. }
  5. buf[i] = '\0'; // lezarjuk a stringet!


vagy:

  1. char *ptr = buf;
  2. while ( (ch = usart_getch()) != '\n' ) {
  3.     *ptr++ = ch;
  4. }
  5. buf[i] = '\0'; // lezarjuk a stringet!


NADE! Ezek nem vedettek buffer tulcsordulas ellen!

Tehat szerencsesebb lenne:

  1. int i;
  2. for ( i = 0; i < MAXBUF; i++ ) {
  3.     char ch = usart_getch();
  4.     buf[i] = ch; // ez igy bele teszi a sorveg jelet is!
  5.     if ( '\n' == ch ) {
  6.         break;
  7.     }
  8. }
  9. buf[i] = '\0'; // lezarjuk a stringet!
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Ápr 16, 2011 /
 
Elkezdtem tesztelni a gps-t. lcd-re íratnák ki valamit, amit éppen vesz, de semmi eredmény. Olyan, mintha rá sem lenne dugva az uart-ra a gps. Ha kihúzom, akkor sem csinál mást, csak ilyen fura 3 pontból álló karaktert ír ki. Ha rá van dugva a gps, akkor is. Baudrate beállítva 4800-ra, ugyanúgy, mint ahogyan terminálban is volt. Processzor egy atmega8, 4,096MHz-es kristállyal és a Fleury féle uart library-t használom. Csak egyszerűen egy karaktert szeretnék látni, hogy egyáltalán működik a kommunikáció, de semmi. Ennyi lenne az egész, amit csinálna a program.
  1. while(1){
  2.                 lcd_putch(uart_getc());
  3.                 j++;
  4.                 _delay_ms(500);
  5.                 if(j==20){
  6.                 j=0;
  7.                 lcd_cls();
  8.                 }
  9.         }
(#) huba válasza Ricsi89 hozzászólására (») Ápr 16, 2011 /
 
Ha csak egyféle karaktert írsz ki? akkor működik?
(#) Ricsi89 válasza huba hozzászólására (») Ápr 16, 2011 /
 
Most próbáltam, hogy kiküldök egy "a" betűt, összekötöm az uart rx és tx lábát, majd fogadom a jelet, de semmi változás. mintha nem is élne az uart.
  1. while(1){
  2.                 uart_putc('a');
  3.                 ch=uart_getc();
  4.                 lcd_putch(ch);
  5.                 j++;
  6.                 _delay_ms(500);
  7.                 if(j==20){
  8.                 j=0;
  9.                 lcd_cls();
  10.                 }
  11.         }
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Ápr 16, 2011 /
 
Sikerült megcsinálni. Rossz volt a Fleury féle uart kezelés rutinja. Az atmega adatlapjából kimásolva a gyári uart kezelő rutinokat egyből életre kelt és már ki is írja a kijelzőre a gps-ből jövő adatokat.
(#) Robi98 hozzászólása Ápr 16, 2011 /
 
Sziasztok!
Lenne egy pár kérdésem amire sehol sem tudtam meg a választ.Lehet ,hogy kezdőként túl egyszerűket kérdezek de azért örülnék akármiféle válasznak.
Először is :Mit jelent a a kettő kereszt és a kettő minusz ?
Például:
  1. case 1:    if(R_duty<0xFF) R_duty++;
  2.                            else val = 2;
  3.                            break;
  4.                    case 2:    if(B_duty) B_duty--;
  5.                            else val = 3;
  6.                            break;

Másodszor :Mit jelentenek ezek: "val" , "break" ?

Köszi!
(#) Ricsi89 válasza Robi98 hozzászólására (») Ápr 16, 2011 / 1
 
A ++ növeli az adott változó értékét eggyel, a -- pedig csökkenti. A val az egy változó(gondolom máshol még fontos a programban), a break meg megszakítja az adott rész futását és kilép abból.
(#) Robi98 válasza Ricsi89 hozzászólására (») Ápr 16, 2011 /
 
Köszi! Sokat segített.
(#) sgt válasza Robi98 hozzászólására (») Ápr 16, 2011 /
 
++ abban a kontextusban post-inkrementálás (növeli eggyel a változó értékét), -- pedig post-dekrementálás (csökkenti eggyel az értékét).

Amit kimásoltál az az un. switch-case szerkezet. Break pedig azért kell, mert case 1: és a case 2: a két lehetőség, és ha case 1-re ugrik a program, és nincs a végén a break, akkor a case 2 is lefut, de ha ott van akkro csak a case 1 fog, és ezután megy tovább a program kihagyva a case 2-t.
(#) musika hozzászólása Ápr 18, 2011 /
 
Sziasztok ! Segítséget szeretnék kérni mert még kezdő vagyok az AVR ben. Van egy project amelyben ATmega 324p proci található és a kapcsolás szerint külső kvarc kristályt (7,37 Mhz) használ a proci illetve az óra oszcillátort is (32 khz). minden szépen le van írva a projectben de sajnos a fuse bitekre még utalás sincs illetve azt írja az oldal , hogy használjak bootloader t (avr109) amit átírtak ehhez a procihoz és a feltöltendő programhoz de fuse bit et ott sem tudom, hogy hogyan kellene beállítani.Van valami tippetek, hogy hogyan csináljam ? Előre is köszi.
(#) labu01wx hozzászólása Ápr 18, 2011 /
 
Sziasztok!

Tudtok mondani egy olyan elektronika szimulátort, ami futtatja a Mega644 programját és van benne egy adó/vevő ami a számítógép egyik COM portjáról küldi az adatot UARTon az AVRnek?
(#) bzolitb hozzászólása Ápr 19, 2011 /
 
sziasztok, olyan problémám lenne, hogy van egy programkódom, de nem találom benne a hibát. a Kódot csatoltam, és hiba jelensége pedig az, hogy a PD4 belső felhúzó ellenállása nem kapcsol be valamiért, a PD5 PD6 PD7 bit igen. Kipróbáltam, és ha külön kapcsolom be a PD4 felhúzó R-t, akkor felkapcsol.

Köszi a segítséget.

ez.c
    
(#) bzolitb válasza bzolitb hozzászólására (») Ápr 19, 2011 /
 
Ez lemaradt, talán kellhet
  1. #define b_pin   PIND   
  2.  
  3. #define b_row1  PD4
  4. #define b_row2  PD5
  5. #define b_row3  PD6
  6. #define b_row4  PD7
(#) dc001 válasza bzolitb hozzászólására (») Ápr 19, 2011 /
 
Egyrészről a send_string("3\n") előtti sorban lemaradt a '~' a b_pin elől.
Másrészről az első beolvasó résznél a PD7 kimenet, ennek ellenére a PD5,PD6 és PD7 !!! kerül olvasásra,
másodiknál a PD6 kimenet, olvasva: PD4, PD6 !!! és PD7,
harmadiknál PD5 kimenet, olvasva: PD4, PD5 !!! és PD7,
negyediknél PD4 kimenet, olvasva: PD4 !!!, PD5, PD6.

Első ránézésre hirtelen ezek tüntek fel.
(#) bzolitb válasza dc001 hozzászólására (») Ápr 20, 2011 /
 
Köszi, a rend helyre állt, tökéletesen működik
(#) adamtui_93 hozzászólása Ápr 20, 2011 /
 
Hali
Lenne egy amatőrnek mondható kérdésem most szeretnék először smd avr el foglalkozni ATmega 16 ot választottam a projektemhez, de van neki 3db Vcc és 1db AVcc és 4db GND csatlakozása na már most ezek az avr-en belül össze vannak kötve tehát elég 1 lábra adni áramot és mindenhol lesz vagy mindegyikre külön kell tenni áramot?
(#) TavIR-AVR válasza adamtui_93 hozzászólására (») Ápr 20, 2011 /
 
Összeset be kell kötni. (Illik, attól függetlenül, hogy belül is össze vannak (lehetnek) kötve.
A Vcc és a VccA pedig az analóg és digitális rndszerek tápja (az analógot illik szűrni). De ha nem kell precíznek lenni, akkor az analóg és digitális tápokat (mindegyiket) be kell kötni.
(#) szabo.tivadar válasza adamtui_93 hozzászólására (») Ápr 20, 2011 /
 
Ne tessék elfelejteni minden Vcc-hez kondit rakni. Kezdésnek 100nF kerámia elég lesz.
(#) adamtui_93 válasza szabo.tivadar hozzászólására (») Ápr 21, 2011 /
 
eddig én mindig úgy csináltam hogy stab ic és utána kondi muszáj minden vcc hez külön kondi nem elég ha összekötöm őket és úgy kap 1 kondit?
(#) bedoweb hozzászólása Ápr 21, 2011 /
 
Szaisztok!

Pár hete felraktam egy videót arról, amit sikerült létrehoznom egy ATMega168 és 5 LED segítségével. Most kicsit átdolgoztuk a programot mert nem volt tökéletes, de mostmár minden tökéletes és annyi efektet tudok belesűríteni amennyit a memória csak bír

Itt a végeredmény: Bővebben: Link
(#) szabo.tivadar válasza adamtui_93 hozzászólására (») Ápr 21, 2011 /
 
Nem elég. Azért kell közel rakni minden Vcc-hez, mert ezeknek a kondiknak az egyik funkciója az, hogy helyi energiaforrásként szolgáljon az ICnek. A távolabb rakott kondi / áramforrás és az IC lába között ott van egy vezető, aminek induktanciája (és ellenállása) van, ez meggátolja a gyors áramleadást.

Másik funkciója ezeknek a kis kondiknak a zajcsökkentés: a kimeneti jelek változásának sebességéből eredő frekvenciát (nem az órajel frekije!) illik leszűrni, ezt igyekszik a kondi kis impedanciával a föld felé vezetni.

Állítólag azért nem rakják a kondikat az IC-kbe, mert nem tudják (olcsón) megoldani.

Ha analógot is akarsz mérni, akkor illik szeparálni a digitális tartománytól. Tápot pl PI szűrővel.

Bővebben:
Murata: Noise Suppression Techniques
Murata: Application Manual for Power Supply Noise Suppression and D...tal IC
Avrfreaks: noise problem in in-built ADC of atmega32
(#) Csopak hozzászólása Ápr 21, 2011 /
 
Haliho!

AVR-rel szeretnénk kommunikálni soros porton akár hyperterminal-lal, akár hercules-sel küldünk neki egy karaktert, akkor pl a számjegyekre ugyanazt adja vissza, de pl a r és b betűre ugyanúgy r jön vissza.
Ha az AVR programban egy if-fel LEDet szeretnénk villogtatni, pl r-rel, akkor nem történik semmi.

  1. /*
  2. UART hasznalata megszakitasokkal
  3. Hardver:    ATmega8 @ 7.372800MHz
  4. PC Szoftver: Hyper terminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control = NONE
  5. */
  6.  
  7. #define F_CPU 7372800UL  // rendszer orajel: 7.3728 MHz
  8. #define USART_BAUDRATE 9600  // soros kommunikacio sebessege: 9600 bps
  9. #define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)  // UBRR
  10.  
  11. #include <avr/io.h>
  12. #include <avr/interrupt.h>
  13. #include <inttypes.h>
  14. #include <util/delay.h>
  15.  
  16. #define LED_PIN 0  // LED a PC0-as labon
  17.  
  18. void KonfigUART()  // UART beallitasa
  19. {
  20.     // 9600 bps soros kommunikacio sebesseg beallitasa
  21.     UBRRL = UBRR_ERTEK;        // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  22.     UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  23.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  24.     UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  25.    //Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
  26.     UCSRB |= (1 << RXEN) | (1 << RXCIE) | (1 << TXEN);   //
  27.     UCSRA=(1<<U2X);
  28. }
  29.  
  30. char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
  31. {
  32.    while(!(UCSRA & (1<<RXC)))  // Varakozas amig nincs uj bejovo adat
  33.    {
  34.       //  Varakozas
  35.    }
  36.    //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  37.    return UDR;
  38. }
  39.  
  40. void UARTAdatKuld(char data)  // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
  41. {
  42.    while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  43.    {
  44.       //   Varakozas
  45.    }
  46.    // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  47.    UDR=data;
  48. }
  49.  
  50. int main(void) // Foprogram
  51. {
  52.     DDRC = _BV(LED_PIN); // PC0 kimenet (LED)
  53.     PORTC = 0x00;  
  54.  
  55.     KonfigUART(); // UART Konfiguralasa
  56.    
  57.     // A LED-et eloszor nehanyszor ki- es bekapcsoljuk, hogy ellenorizzuk minden rendben
  58.     PORTC &= ~(_BV(LED_PIN)); // LED be
  59.     _delay_ms(300); // Varakozas 100 ms-ig
  60.     PORTC |= _BV(LED_PIN); // LED ki
  61.     _delay_ms(300);
  62.     PORTC &= ~(_BV(LED_PIN));
  63.     _delay_ms(300);
  64.     PORTC |= _BV(LED_PIN);
  65.     _delay_ms(300);
  66.  
  67.     // Elkuldjuk a "Hello" uzenetet, hogy a soros kommunikaciot leellenorizzuk
  68.     UARTAdatKuld('r');
  69.  
  70.     sei();    // Altalanos megszakitasok engedelyezese
  71.    
  72.     while(1)
  73.     {
  74.         // Ures ciklus (mindent az ISR-en belul kezelunk)
  75.     }
  76.     return 0;
  77. }
  78.  
  79.  
  80. ISR(USART_RXC_vect)  // RX interrupt, ezek az utasitasok futak le ha adat erkezik a TX vonalon
  81. {
  82.         char data;    
  83.  
  84.     data = UARTAdatFogad();     // A berekezo bajt fogadasa
  85.  
  86.     /*PORTC &= ~(_BV(LED_PIN)); // LED be
  87.     _delay_ms(100); // Varakozas 100 ms-ig
  88.     PORTC |= _BV(LED_PIN); // LED ki*/
  89.         if(data == 'r'){PORTC &= ~(_BV(LED_PIN)); _delay_ms(100);} // Ha a fogadott bajt 'b'-vel egyezik meg, bekapcsoljuk a LED-et
  90.    
  91.              //UARTAdatKuld('[');
  92.              UARTAdatKuld(data);
  93.              //UARTAdatKuld(']');
  94. }


A kondik, fuse bit-ek, frekvencia, baud rate, meg minden ilyesmi jó(szerintünk). Valamint egy Atmega 8-ról lenne szó.
Várjuk válaszotokat, ötleteiteket.

Üdv: Norbi
(#) szabo.tivadar hozzászólása Ápr 21, 2011 /
 
UC3A0/1 PLL-el kapcsolatban vannak tapasztalatok? Szokott vele stabilitási probléma lenni? Külső, 25MHz-es órajelről menne. Egy adott órajelhez mit érdemes beállítani: kisebb DIV és nagyobb MUL vagy fordítva?

Magának a procinak a sebességéről van tapasztalat, mit bírnak tartósan, hiba nélkül? Doksi szerint 66MHz, dehát a doksi nem mindig mérvadó ugye. PortA, PortB frekinél tapasztalat? A 'freaksen néztem, de ott főleg az első verziókra panaszkodtak, többiről nem találtam infót. Az enyém K, azt hiszem ez az utolsó széria.

Ha 50-60 MHz-et akarok külső 25 MHz-ből, akkor jól értettem-e a következőket?
- PLL DIV-vel és MUL-al addig bűvészkedek, amíg 80-240 MHz közé varázsolom az órajelet
- utána opcionálisan leosztom 2-vel PLLOPT[1] által
- CKSEL-lel pedig beállítom a CPU, HSB, PBA, PBB végső leosztását max 66 MHz-ig
Van valamilyen szabály még, amit lehagytam? Stabilitáson kívül mindegy, hogy milyen frekit állítok be CKSEL-lel? SPI-nál van freki limitáció, erre már felhívtátok a figyelmemet. MACB, ADC, SPI és DMA lesz, meg talán flash-be irogatás.

Előre is köszi!
(#) Csopak válasza Csopak hozzászólására (») Ápr 21, 2011 /
 
Megoldódott.
Egyelőre legalábbis úgy tűnik.
(#) labu01wx hozzászólása Ápr 21, 2011 /
 
Sziasztok!

Valaki meg tudja mondani, hogy milyen kapcsolókkal kell meghívni a compilert, linkert, assemblert winavrben ha bootloadert szeretnék fordítani?

Másik kérdés, hogy ha egy assemblybe szeretném fordítani a főprogramot és a bootloadert, akkor hogyan adom meg, hogy melyiknek mi legyen a kezdő függvénye?
(#) H.Boti hozzászólása Ápr 21, 2011 /
 
Sziasztok!
Nemrég kezdtem foglalkozni az AVR-el, a pwm szabályozással pedig pár napja.
Ebben a cikkben találtam egy kódot, ami úgy gondoltam, hogy jó lenne kiindulásnak: Bővebben: Link
De az a baj, hogy a lefordításánál elakadtam.
A GTCCR, a TCCR0A, TCCR0B részeknél valami "undeclared ..." meg "first use in function" hibákat kapok. AVRStudio-val próbálkoztam.
Vagy egy egyszerű kódnak is örülnék, amin megtanulhatnám a pwm-et.
Google-ban már kerestem, de nem sokra jutottam.
Légyszi segítsetek!
(#) Fizikus válasza H.Boti hozzászólására (») Ápr 22, 2011 /
 
Milyen AVR procit hasznalsz? ATtiny45-ot mint a cikkben? Mert ha mas AVR-t, akkor mas lesz a Timert beallito regiszterek neve, es mas lehet a Timer "tudasa" is...
Következő: »»   321 / 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