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   405 / 840
(#) zombee válasza dr prof hozzászólására (») Jan 31, 2012 / 1
 
Csak egy betűt írtál el: a 6. sor bal oldalára is TCCR1A-t tegyél...
Más: a kódot be tudod másolni ide is, nem kell képként feltölteni és akkor a segítség is hamarabb érkezik...
(#) zombee válasza szdani hozzászólására (») Jan 31, 2012 /
 
Persze, csak a cikkek közt kell keresni: Intelligens LCD modulok...
(#) dr prof válasza zombee hozzászólására (») Jan 31, 2012 /
 
Kösz a gyors választ, müködik és megfogadom a tanácsod. Mégegyszer kösz.
(#) L_Maqvus hozzászólása Jan 31, 2012 /
 
Sziasztok!

Gondom támadt az UART-al. Atmega8-ra müködött jól. Atmega164-re viszont nem. A regisztereket átírtam, a megszakítás emghívódik de nem értelmes karaktereket dolgoz fel.

A kód:

  1. #define F_CPU 7372800UL  // rendszer orajel: 7.3728 MHz
  2. #define USART_BAUDRATE 9600  // soros kommunikacio sebessege: 9600 bps
  3. #define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)  // UBRR
  4.  
  5. #include <avr/io.h>
  6. #include <avr/interrupt.h>
  7. #include <inttypes.h>
  8. #include <util/delay.h>
  9.  
  10. void KonfigUART()  // UART beallitasa
  11. {
  12. // 9600 bps soros kommunikacio sebesseg beallitasa
  13. UBRR0L = UBRR_ERTEK;        // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  14. UBRR0H = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  15.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  16. UCSR0C |= (0 << UMSEL00) | (0 << UMSEL01) | (1 << UCSZ00) | (1 << UCSZ01);
  17.    //Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
  18. UCSR0B |= (1 << RXEN0) | (1 << RXCIE0) | (1 << TXEN0);   //
  19. clearbuffer(); // toroljuk a buffert
  20. }
  21.  
  22. char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
  23. {
  24.    while(!(UCSR0A & (1<<RXC0)))  // Varakozas amig nincs uj bejovo adat
  25.    {
  26.       //  Varakozas
  27.    }
  28.    //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  29.    return UDR0;
  30. }
  31.  
  32. void UARTAdatKuld(char data)  // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
  33. {
  34.    while(!(UCSR0A & (1<<UDRE0))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  35.    {
  36.       //   Varakozas
  37.    }
  38.    // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  39.    UDR0=data;
  40. }
  41.  
  42. int main(void) // Foprogram
  43. {
  44. DDRB = _BV(LED_PIN) | _BV(Servo); // PC0 kimenet (LED)
  45.  
  46. // A LED-et eloszor nehanyszor ki- es bekapcsoljuk, hogy ellenorizzuk minden rendben
  47. PORTB |= _BV(LED_PIN);
  48. _delay_ms(100);
  49. PORTB &= ~(_BV(LED_PIN));
  50. _delay_ms(100); // Varakozas 100 ms-ig
  51. PORTB |= _BV(LED_PIN);
  52. _delay_ms(100);
  53. PORTB &= ~(_BV(LED_PIN));
  54. _delay_ms(100);
  55.  
  56.  
  57.     KonfigUART(); // konfiguráljuk az Uartot
  58.  
  59. sei();// Altalanos megszakitasok engedelyezese
  60.  
  61. while(1)
  62. {
  63.  //led_vill();
  64.  if (ready==1){ // Ha a puffer kesz feldolgozasra
  65.   //debug_led();
  66.   _delay_ms(UART_DELAY); // NE VEDD KI!
  67.    adat_feldolg(); // feldolgozzuk az adatokat
  68.   clearbuffer(); // toroljuk a buffert
  69.   ready=0; // termeszetesen nem kesz
  70.  }
  71. }
  72. return 0;
  73. }
  74.  
  75.  
  76. ISR(USART0_RX_vect)  // RX interrupt, ezek az utasitasok futak le ha adat erkezik a TX vonalon
  77. {
  78. char data;
  79. data = UARTAdatFogad(); // A berekezo bajt fogadasa
  80. UARTAdatKuld('[');
  81. UARTAdatKuld(data);
  82. UARTAdatKuld(']');
  83. if(data == 'a') { led_vill(); }
  84. if(data != '!') // Ha a fogadott bajt nem '!' Akkor betoltjuk a bufferbe
  85. {
  86.  buff[n_b]=data;
  87.  if(n_b<MAX_PUFFER_SIZE) {n_b=n_b+1;} // Pufer OverLOAD?
  88. }
  89. else { ready=1; }
  90.  
  91. }


Puffer kezelőfügvényeket kihagytam.

Csak az UART van benne.

a-ra nem vilogtatja a ledet. Ha nem kötöm feltételhez, csak a megszakításhoz akkor felvillog. Tehát nem értelmes karaktert kap az Uart.

Mi lehet a gond?

Választ előre is köszönöm!

Z.
(#) szdani válasza zombee hozzászólására (») Jan 31, 2012 /
 
köszöm.
(#) zombee válasza L_Maqvus hozzászólására (») Jan 31, 2012 /
 
Először ott keresném a problémát hogy a CKDIV8 nevű FUSE bit kivan-e kapcsolva?

A másik hibalehetőség(de látom erre ügyeltél), hogy nem tudni miért, de az ATMega8/16/32 esetében az UCSRC és az UBRRH regiszterek azonos I/O memóriacímen vannak.
Tehát ha kicseréled a két megnevezést, a kód nem változik!
Az elérésnél úgy tesz különbséget a hardver, hogy a legfelső, URSEL nevű bit helyére 1-et kell beírni.
(#) Reggie válasza blackdog hozzászólására (») Jan 31, 2012 /
 
GCC eseten ilyen nem letezik. ANSI C sem ismeri.
(#) blackdog hozzászólása Feb 1, 2012 /
 
Sziasztok!
Ez lehetséges ?

Ennyire veszélyes lenne 0-val osztani?
(#) aticska válasza blackdog hozzászólására (») Feb 1, 2012 /
 
Igen. Én már többször jártam így. Azóta jobban odafigyelek.
(#) L_Maqvus válasza zombee hozzászólására (») Feb 1, 2012 /
 
Nagyon este volt már ezek szerint!

A fuse bit volt a hibás! köszönöm szépen!

A közös memóriacím használatra nem találtam utalást atmega 164P esetén
(#) trudnai válasza szdani hozzászólására (») Feb 1, 2012 /
 
Mit jelent az, hogy HTML szimulator?
(#) L_Maqvus válasza blackdog hozzászólására (») Feb 1, 2012 /
 
Szia!

Eléggé "parasztvakításos" szaga van. Szerintem csak rákapcsoltak forditott tápot jónagy feszültséggel. Én öltem már meg Atmega8-at fordított táppal. Nem picit felmelegedett. De nem hinném hogy egy iparban alkalmazott mikrovezérlő ilyet művelhessen nullával osztás miatt. De javítsatok ki ha tévedek
(#) kiborg válasza blackdog hozzászólására (») Feb 1, 2012 /
 
Nem gondoltam, hogy ezt valaha valaki komolyan veszi. :no:
Egy ATMega vezérlő NEM TUD OSZTANI !!! Innentől fogva a képzeletedre bízom a lehetséges okokat, hogy mi okozta ezt!

Üdv Kiborg
(#) zolee1209 válasza kiborg hozzászólására (») Feb 1, 2012 /
 
Azért, mert nincs benne hardveres osztó, még tud osztani...
(#) kiborg válasza zolee1209 hozzászólására (») Feb 1, 2012 /
 
Szia!
Ha nincs benne hardveres osztó nem tud osztani, hiszen nem azt a műveletet végzi el (hanem lebontod TE (vagy másik program)a programban elemi műveletekre) A programfutásának eredménye tényleg a hányados de azt 2 órajelciklus alatt nem kapod meg. Míg amit hardveresen támogat (szorzás 2 órajelciklus, az összeadások és kivonások általában 1 órajelciklus alatt megvannak)
Csak elemi műveletek tud elvégezni.(najó meg a szorzás)
(#) zolee1209 válasza kiborg hozzászólására (») Feb 1, 2012 /
 
Egy jobbra siftelés csak 1 órajel...
(#) kiborg válasza zolee1209 hozzászólására (») Feb 1, 2012 /
 
Igen, de ott fix az osztód

Te is rosszul éreznéd magad, ha csak kettővel tudnál osztani mindig. Bár elismerem sokszor elég annyi is
(#) sgt válasza zolee1209 hozzászólására (») Feb 1, 2012 /
 
De aritmetikai shiftelést nem tud tudtommal.
(#) kiborg válasza sgt hozzászólására (») Feb 1, 2012 /
 
De tud.
ASR - Arithmetic Shift Right
Description:
Shifts all bits in Rd one place to the right. Bit 7 is held constant. Bit 0 is loaded into the C Flag of the SREG. This operation
effectively divides a signed value by two without changing its sign. The Carry Flag can be used to round the result.

+LSL,LSR, ROL,ROR

Kiborg
(#) zombee válasza blackdog hozzászólására (») Feb 1, 2012 /
 
Egy kis érdekesség: x86-nál a nullával osztás interruptot generál(ha jól emlékszem, az 5-öst)!

Aki csak egy pillanatra elhitte, esetleg ki is próbálta csak a videó miatt, annak ajánlom
hogy sürgősen keressen másik melót. Egyébként fordítótól függ az eredmény,
de általában az adott felbontás (előjelesnél negatív)maximuma lesz.
Lebegőpontosnál pedig INF lesz ha sztringgé alakítod de ebben nem vagyok teljesen biztos.
(#) trudnai válasza kiborg hozzászólására (») Feb 1, 2012 /
 
Nem ugy van veletlen, hogy ez csak bizonyos regisztereken hajthato vegre? Azaz ha nincs ebben a tartomanyban akkor elobb be kell olvasni, elvegezni a shiftelest majd vissza irni?
(#) kiborg válasza trudnai hozzászólására (») Feb 2, 2012 /
 
Szia!

Vannak bizonyos műveletek amiket tényleg csak eza R16 és R31 regiszterekkel lehet elvégezni, de ez a művelet olyan, amit bármelyik (R0-R31) regiszterrel el tud végezni.
Ajánlott olvasmány, ha szereted az ASM-t:ATMEL Instruction Set

Üdv Kiborg
(#) kovacsj válasza zombee hozzászólására (») Feb 2, 2012 /
 
0-ás. Az 5-öst nyomtatásra használtam (Print Screen) ezelőtt 17 évvel egy Turbo Pascal programban.
(#) zombee válasza kovacsj hozzászólására (») Feb 2, 2012 /
 
Igen, valóban a 0-s(egész pontosan: "int 00h", míg az 5-ös a "fizikai" IRQ5, amihez "int 0Dh" tartozik.
(#) zombee válasza trudnai hozzászólására (») Feb 2, 2012 /
 
Az r0-r15 regisztereken csak azok a műveletek hajthatók végre amelyeknél nem szerepel konstans érték.
Lényegében az "i"-végűek(i==immediate) nagy része kizárva: andi, ori, cpi, sbi, ldi, stb.
(#) dinnyextra hozzászólása Feb 3, 2012 /
 
Sziasztok!
Nagyon új vagyok a témában és felmerült 1-2 kérdésem az AVR-ekkel kapcsolatban. Keresek valami e-book-ot, amiből az alapoktól el lehetne kezdeni megérteni a nyelvet. Tudtok tippet adni?

A másik, hogy ezen a linken: szobanövény szárazság ellenőrző egy elvileg működő kód van. De amikor le akarom fordítani, azt írja, hogy deklarálnom kéne egy csomó változót!? (COM0A1, COM0A0, WGM01...). A "beinclude-ált" .h fájlok elvileg rendben vannak.

Előre is köszi a segítséget!

Üdv: dinnyextra
(#) Axel válasza dinnyextra hozzászólására (») Feb 4, 2012 /
 
Hello!
Készítettél már mfile-t a programhoz? Ha igen akkor jól választottad ki a proci típusát? Az ebook-hoz annyit, hogy ha nem vagy tisztában a C nyelv alapjaival akkor először azokat érdemes átnézni mert anélkül bizony nehézkes lehet. Egyébként van az AVR Butterfly-hoz írt könyv, azt talán érdemes beszerezni (angol nyelvű).
(#) Suncorgo hozzászólása Feb 4, 2012 /
 
Ezt láttátok már?

ATmega8 51Mhz-en

Csak hogy a többi hardware egység hogy viseli az nem derül ki
(#) zombee válasza dinnyextra hozzászólására (») Feb 4, 2012 /
 
AVR Toolchain-t telepítsd fel!
Egyébként én létrehotram egy új projektet AVR Studio-ban (AVR GCC kiválasztva), majd bemásoltam az egész kódot. Mint a parancsolat, egyből lefordult! Egyedül az F_CPU miatt sírt, de azt is seperc beállítom.
(#) lacicor hozzászólása Feb 4, 2012 /
 
Kedves szakertok!

Egy problema merult fel a HEKIT 301-el kapcsolatosan.Ugyanis gondosan osszeszereltem a kutyut - csatlakoztatom a gephez - felismeri(Hobbielektronika.hu: AVR-Doper) - telepitem a drivert - sikeres es hasznalatra kesz! De ezeken a muveleteken kivul semmilyen kommunikacio nem tortenik a szerkezettel - sem az AVR studio 5 sem a Code Vison AVR nem latja - (Error opening COM port...)....se nem pislog se nem morrog. Windows Vista Home Premium 32-bit-en tortenik az egesz.Elore is koszonom a valaszt!
Következő: »»   405 / 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