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   202 / 841
(#) frankopeter válasza trudnai hozzászólására (») Márc 27, 2010 /
 
köszi mindkettőtöknek. leesett hogy maximum mekkora lehet.
és igen ha max 255 akkor az 500 tulcsordulás, vagy nemérti.
JÓnagy papírra fel kell írnom a változók méretét.

következő kérdés:

"
WARNING: FLASH byte addres 0x0011 is 0xFF (should be 0x94(.. FAILED!
"
azért sem értem mert közben meg jól megy a mit ráraktam az ic-re...
???
(#) Ricsi89 válasza Szobiati hozzászólására (») Márc 27, 2010 /
 
Megnéztem. Én igazából összekötném rendesen, mivel ő sima stk200-al programozott és lehet, hogy itt meg nem tetszik az avr studionak valami. Azt a pár vezetéket ideiglenesen is rá lehet forrasztani az IC-re és a programozóról táplálni az áramkört a programozás alatt, nem pedig, ahogy a leírásban van.
(#) Szobiati válasza Ricsi89 hozzászólására (») Márc 27, 2010 /
 
Én örülnék a legjobban, ha azt mondhatnám ez volt a baja, de nem. Azaz, hogy valamit csinált, mert mostmár csak 10-ből 2 DeviceID rossz.
A biztonság kedvéért a tápot is átkötöttem az USB-ről a programozóéra, hogy az se zavarja, hogy közben egy számítógép akar hozzá csatlakozni a másikoldalról, ha ez lenne a baja.
(#) trudnai válasza frankopeter hozzászólására (») Márc 27, 2010 /
 
Az, hogy "jol mukodik", vagy, hogy "meg eddig nem jott elo a hiba" ket kulonbozo dolog... Sot, ott van meg a "nem venni eszre a hibat" is...
(#) toMI-DBT válasza ATtiny hozzászólására (») Márc 28, 2010 /
 
Szia! Köszönöm a segítséget, a hiba a változókban volt DE azért mert a gcc okoskodik és ki optimalizálja a változómat és procceszor regiszterébe tárolja és nem memóriába!
(#) (Felhasználó 4577) hozzászólása Márc 28, 2010 /
 
C-ben hogyan lehet 16 bitet kétfelé "szedni"?

Pl.:
xy = 0b1010101010101010;

Azt szeretném, hogy legyen két új változóm, amiben az xy 16 bitje 8-8 bitben van jelen, így:
x = 0b10101010;
és
y = 0b10101010
(#) trudnai válasza (Felhasználó 4577) hozzászólására (») Márc 28, 2010 /
 
  1. unsigned short bit16 = 0x1234;
  2. unsigned low, high;
  3.  
  4. low  = bit16; // felso resz automatan levagva...
  5. high = bit16 >> 8; // felso resz leshiftelve alulra...

Eredmeny:

low == 0x34;
high == 0x12;

Megjegyzes:
Ez csak little endian (LSB) tarolasnal mukodik helyesen!
(#) (Felhasználó 4577) válasza trudnai hozzászólására (») Márc 28, 2010 /
 
Köszönöm!
Nem tudom milyen a little endian tárolás.

ATmega8-ban az SPI-vel egyszerre csak 8 bitet küldhetek el, mert a regiszter maximum csak akkora értéket vehet fel. Azt szeretném megcsinálni, hogy először elküldöm az első 8-at, majd az utolsó 8-at.

Pl.:
  1. unsigned short bit16 = 0x1234;
  2. unsigned low = bit16, high = bit18 >> 8;
  3. SPDR = low;
  4. while (!(SPSR & (1<<SPIF)));
  5. SPDR = high;
  6. while (!(SPSR & (1<<SPIF)));


Így működhet?
(#) gtk válasza (Felhasználó 4577) hozzászólására (») Márc 28, 2010 /
 
Mukodnie kell. Az unsigned-et egyedul, alapbol nem int-nek forditja?
(#) (Felhasználó 4577) válasza gtk hozzászólására (») Márc 28, 2010 /
 
Köszönöm!
De, int-nek fordítja.
(#) Ricsi89 válasza Szobiati hozzászólására (») Márc 28, 2010 /
 
Más procinál nem csinál ilyet? Esetleg kivett procira rákötni a programozót és úgy programozni.
(#) trudnai válasza (Felhasználó 4577) hozzászólására (») Márc 28, 2010 /
 
Idézet:
„Nem tudom milyen a little endian tárolás.”


Olvass utana, es lehet akkor a szamabrazolasnak is mint kapcsolodo temanak. Ezek nelkul nagyon nehez a kesobbiekben.

  1. while (!(SPSR & (1<<SPIF)));

Egy megjegyzest ha szabad:

Kodot mindig ugy irdd, hogy az konyen olvashato legyen. Sajnos a C szintaktikaja eleg laza, igy sok felekeppen le lehet benne irni ugyanazt. Ugy is lehet forrast benne irni, hogy kesobb alig lehet megerteni a kodot mit is csinal. Itt pl. nem egyertelmu, hogy a shile egy ures ciklus, ill. hogy a "SPDR = ..." az benne van-e a ciklus magban vagy sincs. Azonkivul egy pontosvesszo hiba es maris hibasan mukodik a programod, holott szintaktikailag helyes marad.

Tehat szerencsesebb lenne valahogy igy irni:

  1. SPDR = low;
  2. while ( !( SPSR & ( 1 << SPIF ) ) )
  3. {
  4. // varunk ameddig a buffer ki nem urul
  5. }


Ambar en igy irnam:
  1. for ( SPDR = low; !( SPSR && ( 1 << SPIF ) );  )
  2. {
  3. // varunk ameddig a buffer ki nem urul
  4. }


Azonkivul ha igy kell neked, akkor erdemesebb a valtozok helyett inkabb makrokat letre hozni, es igy meg olvashatobb lesz a kod:
  1. #define LOWBYTE (x) ((x) & 0xFF)
  2. #define HIGHBYTE (x) (((x) >> 8) & 0xFF)
  3.  
  4. #define isBufFull () ( !( SPSR & (1 << SPIF) ) )
  5.  
  6. unsigned short bit16 = 0x1234;
  7.  
  8. for ( SPDR = LOWBYTE(bit16); !( SPSR & (1 << SPIF) ); )
  9. {
  10.     // varunk ameddig a buffer ki nem urul
  11. }
  12.  
  13. for ( SPDR = HIGHBYTE(bit16); isBufFull(); )
  14. {
  15.     // varunk ameddig a buffer ki nem urul
  16. }

Tehat igy mar a kodod eleg jol olvashato es karbantarthato... Pl ha a HIGHBYTE vagy LOWBYTE nem jo akkor eleg egyetlen helyen modositani a kodot es az osszes helyen ahol hasznaltad automatan megjavul a kod...
(#) trudnai válasza gtk hozzászólására (») Márc 28, 2010 /
 
Idézet:
„Mukodnie kell. Az unsigned-et egyedul, alapbol nem int-nek forditja?”


int-nek? Az nem lenne szerencses, mert az int az elojeles, mig az unsigned elojel nelkuli... Vagy arra gondolsz az "unsigned"-et "unsigned int"-nek veszi -- mert arra a valasz igen.
(#) gallz hozzászólása Márc 28, 2010 /
 
Hello,

Szeretnék 10 bites PWM-et beállítani egy Attiny2313-ason.

  1. TCCR1A = (1<<WGM11) | (1<<WGM10); //fáziskorrekt 10 bites
  2.         TCCR1B |= (1<<CS10); // nincs előosztás
  3.         DDRB |= (1<<PINB3);
  4.            
  5.            OCR1A=pwm érték;


Ez így mégsem működik. Valami kimaradt, vagy rossz?
(#) (Felhasználó 4577) válasza gallz hozzászólására (») Márc 28, 2010 /
 
Szia!

10 biteset nem fogsz beállítani, mert csak 8 bites van benne.

Az adatlap 75. oldalán láthatod a regiszter címzéseket.

Ha megírtad, nullázd a Timer Counter 0-t a regiszterek beállítása után.
(#) Ideiglenes hozzászólása Márc 28, 2010 /
 
Az AVR-es próbapanel ismertetése jól indul, de nekem azért hiányérzetem van, miután a cikk végére értem. A kapcsolási rajz szerintem lehetne egy kicsit precízebb, annak ellenére, hogy a szerző azt írja, ennek nincs jelentőssége. A panelen látható egy rövidzár sorozat ( jumperek ), ami a rajzon nem szerepel és emiatt a kijelző vezérléséhez vagy végigolvassa a cikket a felhasználó, vagy a panelrajzon kibogarássza, hogy a kijelző vezérlőlábai hogyan is kapcsolódnak a mikrovezérlőhöz. Jelenlegi állapotában a cikk arról sem győzött meg, hogy ez egy működőképes eszköz, mivel az életjeleket semmi sem mutatja. Jó lenne látni, hogyan is lehet például egy sor szöveget kiírni az LCD kijelzőre vagy esetleg egy LED-et villogtató kis példaprogram segíthetné a kezdő lépést.
(#) puli122 válasza Ideiglenes hozzászólására (») Márc 28, 2010 /
 
Hello!
Nem biztos hogy értem a -remélem építő- kritikád.
A kapcsolási rajznak itt több okból sincs szerepe: egyrészt mert nem lehet megrajzolni ( mindenki úgy drótozza be az adott feladathoz ahogy akarja, másrészt az értékek mindenhol változhatnak, nagyon kevés dolog van amihez ragaszkodni kell, azt viszont részletezem. )
Igen, a kijelző vezérléshez valóban végig kell olvasni a cikket, de nem merült fel bennem hogy az első oldal után akarja valaki megépíteni. Ha használni akarod, hasznos lehet amit írok róla, és akkor nem kell kibogarászni semmit, mert leírtam részletesen.
HA végigolvastad a cikket láthattad hogy a végén leírtam hogy készül egy következő írás, ennek a cikknek a folyatása, ahol példákon keresztül bemutatom a működést.
És végül: egyáltalán semmiről nem akartalak meggyőzni a cikk megírásakor! Aki úgy gondolja hogy segíthet neki a mikrovezérlők alkalmazásának elsajátításában, az megépíti, vagy átalakítja saját ízlésére, aki pedig nem lát benne fantáziát, az gyakorol máshogy.

Üdv: V.Peti
(#) gallz válasza (Felhasználó 4577) hozzászólására (») Márc 29, 2010 /
 
A 110. oldalon lévő táblázatból gondoltam, hogy lehet 10 bites is.
Egy DC motor fordulatszám szabályozásához kellene és a 8 bites nem elég.
(#) ATtiny válasza gallz hozzászólására (») Márc 29, 2010 /
 
Természetesen lehetséges akár 16bites Fast PWM üzemmód az ATtiny2313 -as AVR-el. Az adatlap mindent leír. A sebességre érdemes figyelni, hogy elég lesz-e. Pl. 8Mhz-es belső osc. -ról a 16bites PWM alap frekvenciája 122Hz -re adódik. Ami kb. semmire nem elég. Természetesen a megfelelő TOP érték beállításával lehet csökkenteni a 16 bitet, így meg lehet találni a kompromisszumot a felbontás és a sebesség között.
(#) mario1111 hozzászólása Márc 29, 2010 /
 
Üdv!

Problémába ütköztem. Újra. Az 5-ös külső megszakítást próbálom használni atmega128-on. Szimulátorban próbálgattam mert a valóságban nem ment. Az történik,h érzékeli a megszakítást elugrik a címére bebillenti a "megszakitas" változót de amikor az ifhez ér mégse megy bele. Ráviszem a kurzort és írja,h az értéke 1, de nem megy bele. Ha a kezdeti értékére vizsgálok ( if(!megszakitas) ) akkor bemegy. Mintha mégse változna meg... Előre is köszönöm, ha valaki segít!

Üdv: Márió
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include "lcd.h"
  4. #include <avr/interrupt.h>
  5.  
  6. void tarcsa(void);
  7. void portdef(void);
  8. int megszakitas=0;
  9.  
  10. int main()
  11. {
  12.         DDRF  = 0b00110000;
  13.         PORTF = 0b00000000;
  14.         DDRE  = 0b00000000;
  15.         PORTE = 0b00110000;    
  16.         EICRB  |= (1<<ISC51);//  INT5 lefutó él érzékelés
  17.         EIMSK  |= (1<<INT5);
  18.         sei();
  19.  
  20.                 while(1)
  21.                         {
  22.                         if(megszakitas)
  23.                                 {
  24.                
  25.                                 _delay_us(1);  
  26.                                 }
  27.                         _delay_us(1);
  28.                         }
  29.  
  30. return 0;      
  31. }
  32.  
  33. void portdef(void)
  34. {
  35.         DDRA  = 0b00000000;
  36.         PORTA = 0b11111111;
  37.         DDRB  = 0b11111101;
  38.         PORTB = 0b00000000;
  39.         DDRC  = 0b00000000;
  40.         PORTC = 0b00001100;
  41.         DDRD  = 0b11111100;
  42.         PORTD = 0b00000001;
  43.  
  44. }
  45.  
  46. ISR(INT5_vect)
  47.  
  48. {
  49.            cli(); //megszakítások kikapcsolása
  50.            megszakitas=1;
  51.            sei(); //megszakítások be
  52. }
(#) ATtiny válasza mario1111 hozzászólására (») Márc 29, 2010 /
 
Már nem is tudom hányszor lett leírva itt a fórumban, hogy KELL a volatile előtag a megszakításban használt változók dekralárásához.
(#) frankopeter hozzászólása Márc 29, 2010 /
 
Hello.
Kérdés:
A "AVR-Doper, USB-s ISP programozó"-n van egy CLK nevü láb a TARGET nevü alkatrészen. Mire szolgál?
Ez egy órajel? Lehet használni külsö oszcillátornak, vagy csak akkor van szerepe, ha ic-t éget az ember?
peti
(#) (Felhasználó 4577) válasza frankopeter hozzászólására (») Márc 30, 2010 /
 
Azt össze kell kötni az AVR-el.
(#) frankopeter válasza (Felhasználó 4577) hozzászólására (») Márc 30, 2010 /
 
Bocs. Nemértem.
Hogy összekötni?
Szoftveresen?
Hárdveresen?
(#) edison14 válasza frankopeter hozzászólására (») Márc 30, 2010 /
 
Helló !

Van az AVR doperen egy csatlakozósor. Amikor valamilyen AVR-t rá akarsz csatlakoztatni a doperre mindig legyen előtted az adott AVR adatlapja melyen megnézheted hogy melyik lábnak mi a neve és arra rácsatlakoztatni a csatlakozósor adott lábát például próbapanelen. Remélem érthető voltam

Sok sikert a kötözgetéshez.
(#) adamtui_93 hozzászólása Márc 30, 2010 /
 
Hali mindeninek végre sikerült összetennem a topi féle programozót és abban szeretném segitségeteket kérni hogy ponyprogban valaki fotoza már le a fuse bitek beálitásait mert ott ugyebár sajna valahogy máséppvan és nem szeretném magam izárni belöle
(#) (Felhasználó 4577) válasza adamtui_93 hozzászólására (») Márc 30, 2010 /
 
Az adatlapot elolvasva be tudod állítani őket. Arra figyelj, hogy ha jól emlékszem a Pony Prog-ban a Fuse bitek pont invertálva vannak.
(#) adamtui_93 válasza (Felhasználó 4577) hozzászólására (») Márc 30, 2010 /
 
jaja invertálva vannak és ez véget már egy pár avr böl ki is zártam magam azért szeretnék 1 biztosat ami 1000% hogy müködik.
(#) (Felhasználó 4577) válasza adamtui_93 hozzászólására (») Márc 30, 2010 /
 
Az a biztos, amit az adatlapból kiolvasol.
Gondolom még nem néztél bele, hogy ne kelljen keresned itt van: http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
A Memory Programming Fuse bit fejezetben találod.
(#) adamtui_93 válasza (Felhasználó 4577) hozzászólására (») Márc 30, 2010 /
 
De belenéztem de ponyprog invártálós marhsága végett kértem egy képet róla.
Következő: »»   202 / 841
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