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   619 / 840
(#) holex válasza Istvanpisti hozzászólására (») Szept 24, 2014 /
 
Köszi, ez jó ötlet, legközelebb így csinálom, de sajnos már kész a NYÁK, úgyhogy ez már így maradt. De megfogadom a tanácsot.
(#) rolandgw válasza lajos1969 hozzászólására (») Szept 24, 2014 /
 
Kapcsold ki a CKDIV8-at (1),mert 1 Mhz-en megy:Bővebben: Link
(#) killbill válasza holex hozzászólására (») Szept 24, 2014 /
 
Felesleges a ket megszakitas. A legelejen a foprogram felprogramozza az A/D-t. Aztan amikor a timer megszakitas bejon, akkor az kiolvassa az A/D erteket, elteszi valahova es ujbol elinditja a konverziot. A foprogram meg kiertekeli a valtozobol a mert adatot. Ettol persze 20ms-ot "kesik" a meres, de pont senkit nem erdekel, mert nyomogombot mersz vele. Az elso eredmeny ervenytelen lesz, ezt el kell dobni.
Azt is megteheted, hogy a timer megszakitas nem piszkalja az A/D-t egyaltalan, csak jelzi a foprogramnak, hogy ismet eltelt 20ms az eletunkbol. A foprogram meg majd beolvassa az A/D-t, ujrainditja a merest es feldolgozza a mert adatot. Ez nem idokritikus dolog, 1-2ms lotyoges (jitter) boven belefer. De meg 10 is.
(#) holex válasza killbill hozzászólására (») Szept 24, 2014 /
 
Rendben, köszi. Az első eredmény miért lesz érvénytelen?
(#) killbill válasza holex hozzászólására (») Szept 24, 2014 /
 
Mert azelott olvasod ki az A/D-t, hogy elinditanad. Elobb olvasod, aztan inditod. Mindig 20ms mulva olvasod ki az elozo inditas (meres) eredmenyet. Ezert van 20ms keses, ami egy nyomogombnal nem szamit, viszont nem kell kulon varni a konverziora. Ha az inicializalasnal inditasz egy konverziot akkor a timer ISR mar ervenyes adatot fog kiolvasni az A/D-bol, ha az inditas es a timer ISR kozott eltelt egy konverzionyi ido. Az nem tudom, hogy mennyi lehet, gondolom par us.
(#) Ivan93 válasza killbill hozzászólására (») Szept 24, 2014 /
 
Megoldódott!
For ciklusokkal szimuláltam az órát és itt is hibázott -> tényleg a brakeup() volt rossz (lehet nekem sem kéne mások könyvtárait, programjait felhasználni).
Az eredeti kód:
  1. while (num!=0)
  2.     {
  3.         digits[i]=num%10;
  4.         num=num/10;
  5.         i++;
  6.     }

Jelenlegi:
  1. digits[3]=(num/1000)%10;
  2. digits[2]=(num/100)%10;
  3. digits[1]=(num/10)%10;
  4. digits[0]=num%10;

A hibát okozó különbség, hogy az eredeti addig bontja amíg van karakter illetve nem 0 a szám, ez éjfélkor ugye 0, így fel sem bontja, hanem kiírja az előzőt, és a sok 0 még néhány hasonló hibát okoz a késői/korai órákban.

Mindenkinek köszönöm a segítséget!
Iván
(#) holex válasza killbill hozzászólására (») Szept 24, 2014 /
 
Jaa, oké, leesett, köszönöm.
(#) lajos1969 válasza rolandgw hozzászólására (») Szept 24, 2014 /
 
Köszönöm !!
(#) fecus hozzászólása Szept 25, 2014 /
 
Egy "érdekes" kérdésem van. A nixie-s órám kijelzőjének, éjszakára leveszem a feszültségét, hogy ne vakítson annyira. A nixie működési elve miatt egy szint alatt nem csak a fényerő, hanem az olvashatóság is csökken, elmosódik. A kijelzés nem multiplexelt.
Arra gondoltam, hogy mit szólna a szemünk ahhoz, ha este a 100ms-os frissítési ciklus során pl. 5 ms-ra kikapcsolnám a kijelzést? A frissítés túl lassú, hogy a szem ne vegye észre, de a kikapcsolt idő meg túl gyors lenne hogy észrevegye. Jól gondolom?
(#) kala1982a hozzászólása Szept 26, 2014 /
 
Sziasztok, Attiny2313, Atmega328, Bascom. Szeretném UART-on összekötni a két AVR-t. Ugyanazon az órajelen kell járniuk ahhoz, hogy működjön a kommunikáció, vagy elég a kiválasztott adatátviteli sebességhez tartozó kvarc (14,7456 MHz) amivel a hiba 0%? És ez a kvarc lehet mindegyik AVR-hez külön-külön? Gondolom az adatátviteli sebességnek kötelezően egyformának kell lennie.

Bascom: Megszakításos UART kezelés, ha van bejövő adat, akkor egy értékadás lenne majd csak. Kérdésem az lenne ezzel kapcsolatban, hogy ilyenkor a bejövő puffer automatikusan törlődik? Vagy valamelyik regisztert nullázni kell pl?

+1: 2313-asnál, hardveres PWM-et használnék, timer0-n és timer1-en is. Int0 és Int1 megszakítást tudom közben használni? Van-e köze a timer-nek a két megszakítható lábhoz?
(#) killbill válasza kala1982a hozzászólására (») Szept 26, 2014 / 1
 
Az UART-os kommunikaciohoz az kell, hogy a ket UART ugyanarra a baudrate-re es ugyanolyan formatumra (pl: 9600 buad, 8 bit, 1 stop, nincs paritas) legyen programozva. Az mindegy, hogy ezt hogyan ered el. A hibaszazalek nem kell 0% legyen, de azert 3-nal tobb mar nem egeszseges.

Az interrupt es a timer egymastol fuggetlen, tudod hasznalni az INT0, INT1 megszakitast.
(#) Toyoo válasza benjami hozzászólására (») Szept 27, 2014 /
 
Sikerült, újraélesztést követően úgy mőködik, ahogy a másik. Valószínűleg a konfigurációs bitekkel volt a gond. Köszi
(#) ThompsoN hozzászólása Szept 28, 2014 /
 
Sziasztok.

A DebugDisplay áramkörhöz használhatok ATMEGA48PA-PU-t is?
(#) holex hozzászólása Szept 29, 2014 /
 
Mi a különbség a brown-out reset és a power-on reset között? Már egy órája nézegetem a neten a dolgokat, de nem bírok rájönni.
(#) rolandgw válasza holex hozzászólására (») Szept 29, 2014 /
 
A brown-out-nak hiszterézise van,hogy kiszűrje a tüskéket,valamint a feszültség szintje magasabb. A brown-out biztosítja,hogy hibás működés ne következzen be a VCC egy szint alá esése miatt,ahol ez már nem garantált.
(#) holex válasza rolandgw hozzászólására (») Szept 29, 2014 /
 
Köszi!

Na már csak egy gondom van: nem tudom bekapcsolni a brown-out-ot.
  1. avrdude -p atmega328p -c usbasp -P COM9 -U efuse:w:0xfc:m

parancsra azt írja, hogy
  1. Writing | ################################################## | 100% 0.03s
  2.  
  3. avrdude: 1 bytes of efuse written
  4. avrdude: verifying efuse memory against 0xfc:
  5. avrdude: load data efuse data from input file 0xfc:
  6. avrdude: input file 0xfc contains 1 bytes
  7. avrdude: reading on-chip efuse data:
  8.  
  9. Reading | ################################################## | 100% 0.00s
  10.  
  11. avrdude: verifying ...
  12. avrdude: verification error, first mismatch at byte 0x0000
  13.          0xfc != 0x04
  14. avrdude: verification error; content mismatch
  15.  
  16. avrdude: safemode: efuse changed! Was fc, and is now 4
  17. Would you like this fuse to be changed back? [y/n]


Na most ha erre y-t nyomok, akkor lefagy, ha n-et, akkor kilép... hfuse-t és lfuse-t be tudtam állítani de erre hibát dob. Miért?
(#) Droot hozzászólása Szept 29, 2014 /
 
Sziasztok!

MAX6675-öt próbálok feléleszteni az alábbi kód alapján.
Az IC SO lába az AVR MISO-ba megy egy 470 Ohm-os ellenálláson és az IC CLK lába az AVR CLK lábába szintén 470 Ohm-on keresztül. A CS a PB0-n van. Az AVR ISP mkII-t lehúztam a tesztig hogy ne zavarja. Az IC Vcc és GND között egy 100nF-os kondi van, a T+ és T- "open", nincs rajta szenzor, de rárakott szenzorral is próbáltam. A fogadott adatot UARTon a gépemnek küldi el, ami akár hogy próbálom csupa nulla. Többféle SPI órajelet is kipróbáltam 4,3MHz alatt, az adatlap ezt ajánlja max órajelnek. Szoftveres SPI-vel sem működött. Próbáltam saját lassú órajelet előállítani, 50, 25 és 5ms-ig tartó alacsony és magas szintekkel próbálkoztam, az SO lábra egy BS170-et és egy LED-et kötöttem, bizonytalanul működött, a LED néha villgotott néha nem, néha csak egy ideig.
Erre a kérésre írom be ide is a problémámat.
Lent található a forráskód.


  1. #include <inttypes.h>
  2. #include <avr/io.h>
  3. #include <avr/pgmspace.h>
  4. #include <avr/interrupt.h>
  5. #include <avr/eeprom.h>
  6. #include <util/delay.h>
  7. #include <stdio.h>
  8.  
  9.  
  10.  
  11. // Define baud rate
  12. #define USART_BAUDRATE 9600
  13. #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
  14.  
  15. void USART_Init(void){
  16.    // Set baud rate
  17.    UBRRL = BAUD_PRESCALE;// Load lower 8-bits into the low byte of the UBRR register
  18.    UBRRH = (BAUD_PRESCALE >> 8);
  19.          /* Load upper 8-bits into the high byte of the UBRR register
  20.     Default frame format is 8 data bits, no parity, 1 stop bit
  21.   to change use UCSRC, see AVR datasheet*/
  22.  
  23.   // Enable receiver and transmitter and receive complete interrupt
  24.   UCSRB = ((1<<TXEN) | (1<<RXCIE));
  25. }
  26. void USART_SendByte(uint8_t u8Data){
  27.  
  28.   // Wait until last byte has been transmitted
  29.   while((UCSRA &(1<<UDRE)) == 0);
  30.  
  31.   // Transmit data
  32.   UDR = u8Data;
  33. }
  34.  
  35. uint8_t spi_readwrite(uint8_t cData)
  36. {
  37.  
  38. SPDR = cData;
  39. /* Wait for transmission complete */
  40. while(!(SPSR & (1<<SPIF)));
  41. _delay_ms(20);
  42. return SPDR;
  43.  
  44. }
  45.  
  46. uint16_t ReadTemp6675(void)
  47. {
  48.     uint16_t temperature;
  49.     uint8_t byte_0;
  50.     uint8_t byte_1;
  51.  
  52.     PORTB &=~(1<<PB0); //MAX6675_CS_ENABLE;
  53.  
  54.     byte_1 = spi_readwrite(0x00);
  55.         USART_SendByte(byte_1);
  56.     byte_0 = spi_readwrite(0x00);
  57.         USART_SendByte(byte_0);
  58.  
  59.     PORTB |= (1<<PB0); //MAX6675_CS_DISABLE;
  60.  
  61.     temperature  = (byte_1<<8);
  62.     temperature |= byte_0;
  63.  
  64.     temperature = (temperature>>5);
  65.     return temperature;
  66. }
  67.  
  68.  
  69. int main(void)
  70. {
  71. USART_Init();
  72. DDRD |= (1<<PD1);
  73.  
  74. DDRB = (1<<PB5) | (1<<PB0);
  75.  
  76. PORTB = (1<<PB0);
  77.  
  78. SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
  79.  
  80.  
  81.  
  82. uint16_t data;
  83.  
  84.         while(1)
  85.         {
  86.  
  87. _delay_ms(500);
  88. data = ReadTemp6675();
  89.         }
  90.  
  91.  
  92. return 0;
  93. }
(#) vzoole válasza Droot hozzászólására (») Szept 29, 2014 /
 
spi_readwrite függvényből kivenném a 20ms késleltetést, felesleges.

UART túloldalán milyen adatokat vársz? Mert ha karaktereket, akkor előtte át kéne alakítani a számot. Le tudod tesztelni fix számokkal?

A chip olvasása közben nem küldözgetnék adatokat... inkább így:

  1. PORTB &=~(1<<PB0); //MAX6675_CS_ENABLE;
  2. byte_1 = spi_readwrite(0x00);
  3. byte_0 = spi_readwrite(0x00);
  4. PORTB |= (1<<PB0); //MAX6675_CS_DISABLE;
  5.  
  6. USART_SendByte(byte_1);
  7. USART_SendByte(byte_0);


ui.: mi az AVR típusa?
A hozzászólás módosítva: Szept 29, 2014
(#) vzoole válasza Droot hozzászólására (») Szept 29, 2014 /
 
Még a 470 Ohm ellenállásokat is kiszedném, és a CS lábat tápra húznám 10k-val.
(#) kapu48 válasza Droot hozzászólására (») Szept 29, 2014 /
 
Én hiányolom az elejéröl a: #define F_CPU xxxxxxx // kristály freki

Így a fordító általában 1000000Hz-re állítja.

A sima karakter kiíratás mükxik?
(#) Massawa válasza Istvanpisti hozzászólására (») Szept 29, 2014 /
 
Tetszik a megoldás!

Amit viszont megjegyeznék, és nem vagy az elsö akinél ilyen esztetikus hibát látok, az a 2. Láb bekötése. Jo lenne, ha ilyesmire vigyáznátok. A csatlakozások csak az alkatrészen kivül lehetnek.
Csak azért szolok mert itt a HE-n fordul ez leginkább elö, pedig nem szép és nem is felel meg az irott vagy iratlan szabályoknak..
Állitsuk meg mielött még elterjedne!
Kösz!
A hozzászólás módosítva: Szept 29, 2014
(#) Droot válasza vzoole hozzászólására (») Szept 29, 2014 /
 
Az avr atmega8 8mhz-en. Leteszteltem az uartot fix számokkal, jól működik. Win7-en a Realterm-ben be lehet állítani hogy milyen formában jelenjen meg. A 20ms-os időzítés egy kísérletemből maradt benn. Az uart küldést próbáltam a chip kiolvasáson kívül is, vagyis először így próbáltam. A 470ohm-os ellenállások nélkül sem megy, kísérletképp raktam be hátha így tudom programozni miközben az ic be van kötve, mert dugogatós próbapanelon is összeraktam, mert már a céláramkörben sem működött. A cs lábat felhúzni holnap kipróbálom.
A biztonság kedvéért a kapcsolási rajzodból az idevágó részletet megmutatod? Tényleg már csak hardveres hibára tudok gondolni, vagyis szeretném kizárni.

A define cpu f-et az avr studio megoldja, a project settings-ben ahol a procit kiválasztod oda beírhatod. Ha definiálom a forráskódban ki is írja hogy kétszer lett definiálva.
(#) Istvanpisti válasza Massawa hozzászólására (») Szept 29, 2014 /
 
Igazad van! Igénytelen megoldás.
Mentségem - ha annak jó -, hogy saját célra készült a rajz, csak mikor felmerült a kérdés, akkor gyorsan bemásoltam, hátha sikerül ötletet adni.
(#) Massawa válasza Istvanpisti hozzászólására (») Szept 29, 2014 /
 
Tudom, hogy gyakran sietünk, gyakran kell valamit gyorsan rajzolni, de a mai programok már olyan jók és gyorsak, hogy pillanatok alatt rendbe lehet rakni a rajzot még kizárólag saját céljainkra is. Szemet gyönyörködtet egy szép elrendezésü rajz, még akkor is hacsak a kapucsengö vázlatát tartalmazza. Ne feledjük, hogy itt mindenki ért egy kicsit az ilyen rajzokhoz, igy jo lenne igényesebbnek lenni, sokaknak az ilyen forumok töltik be az iskola szerepét!
(#) vzoole válasza Droot hozzászólására (») Szept 29, 2014 /
 
Itt a teljes rajz, igazából semmi extra.
(#) holex hozzászólása Szept 30, 2014 /
 
Ha van a kódban egy olyqn feltétel, ami sosem teljesül, pl if (0){...}, azt lefordítja az avr-gcc kikapcsolt optimalizáció mellett?
(#) holex hozzászólása Szept 30, 2014 /
 
És még egy kérdés: milyen optimalizációt érdemes használni? Az alapbeállítás O1. Azt gondoltam, hogy érdemes kikapcsolni... Ugyanakkor felül a sárga részben azt írják, hogy O0 kerülendő.
(#) rolandgw válasza holex hozzászólására (») Szept 30, 2014 /
 
AVR4027 Application Note
(#) holex válasza rolandgw hozzászólására (») Szept 30, 2014 /
 
EZt már olvastam, de nincs benne, hogy melyik mit jelent. Meg amúgy is inkább a tapasztalatok érdekelnek.
(#) whit33r hozzászólása Szept 30, 2014 /
 
Üdv!

Eddig arduino platformon programoztam, többnyire ATmega328-at. Szeretném elhagyni az Arduino platformot és belekezdeni a "normális" AVR programozásba.

Jelenleg van egy Arduino Mega 2560 fejlesztőpanelom, ezt lehetne használni programozóként AtmelStudioval, vagy muszáj beszereznem egy AVR programozót?
Következő: »»   619 / 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