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   620 / 840
(#) kapu48 válasza whit33r hozzászólására (») Szept 30, 2014 /
 
Ezt nem igazán értem!
Saját magát akarod botloaderen felprogramozni? Ezt nem támogatja az AtmelS.

Ha már tovább akarsz lépni ajánlott valamilyen támogatott Jtag programozót beszerezni, mert azon tudsz debugolni is.
(#) whit33r válasza kapu48 hozzászólására (») Szept 30, 2014 /
 
Arduino megát szeretném használni programozóként.

edit:

Egy ilyen megfelelő lenne? JTAG, és a leírás szerint támogatja az AVRstudio.
A hozzászólás módosítva: Szept 30, 2014
(#) kapu48 válasza whit33r hozzászólására (») Szept 30, 2014 /
 
Elvileg igen. (Gyakorlatilag ocó kici kinai?)

Esetleg ha valakinek már van ilye, vélemény?
(#) whit33r válasza kapu48 hozzászólására (») Szept 30, 2014 /
 
De ha csak az ott felsorolt típusokat tudja programozni akkor ez nekem nem jó.
(#) steelgoofy hozzászólása Szept 30, 2014 /
 
Üdv!

Egy háromfázisú hidat szeretnék meghajtani atmega 2560 mikrovezérlővel és DRV8303 driver IC-vel eddig sajnos nem sok sikerrel. Megvettem hozzá minden alkatrészt, szépen bekötöttem, az egyetlen dolog amit nem használok az IC-ből az a 2db erősítő ami a fázisok jeleit csatolja vissza ADC re (ezt máshogy oldanám meg). A probléma hogy az IC-be bemenő PWM jel nem jön ki egyáltalán, nemhogy erősítve. Van valakinek tapasztalata ezzel az IC vel, vagy esetleg tudna ajánlani egy másikat ? (gyakorlatilag olyan IC is jó lenne ami 4-6 PWM jelet tudna erősíteni)
(#) holex hozzászólása Okt 1, 2014 /
 
Sziasztok. Belefutottam egy számomra érthetetlenek tűnő hibába.

Adott a
  1. uint32_t dateToSecs(uint8_t ev, uint8_t ho, uint8_t nap, uint8_t ora, uint8_t perc, uint8_t sec){
  2.         const uint16_t table[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  3.         return ((ev * 365 + ((ev + 3) >> 2) + table[ho - 1] +  (!(ev & 4) && ho > 2) + nap-1)*86400 + ora*3600 + perc*60 + sec);
  4. }


függvény, ami bizonyos bemenő paramétereknél (14,10,1,13,21,0) hülyeséget számol (465419324).

Napok óta szenvedek vele, hogy mi lehet a hiba, és rájöttem, hogy ha átkonvertálom az értékeket 32 bitesre, attól megjavul:

  1. uint32_t dateToSecs(uint8_t ev, uint8_t ho, uint8_t nap, uint8_t ora, uint8_t perc, uint8_t sec){
  2.         const uint16_t table[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  3.         return ((ev * 365 + ((ev + 3) >> 2) + table[ho - 1] +  (!(ev & 4) && ho > 2) + nap-1)*86400 + (uint32_t)ora*3600 + (uint32_t)perc*60 + (uint32_t)sec);
  4. }


Ugyanolyan bemenő paraméterek mellett így már 465484860-at számol. Az lenne a kérdésem, hogy mi okozza ezt? Miért nem tud típuskonverziók nélkül is jól számolni? Továbbá ahová nem írtam be a konverziót (pl az ev és a table elé), oda is érdemes beírni, mert okozhat még meglepetéseket?
(#) tursaba válasza steelgoofy hozzászólására (») Okt 1, 2014 /
 
Szia! Milyen szint van a /FAULT lábon?
(#) Hp41C válasza holex hozzászólására (») Okt 1, 2014 /
 
A C fordítók a kifejezések kiszámításánál vagy egy default típusból (16 bites int) vagy a paraméterek típusát tekintik az eredmény típusának, ha nincs más előírva.
Itt már az ev * 365 -nél gondok lehetnek, hiszen az ev 8 bites. A 86400 -zal való szozásról nem is beszélve. Tovább kellene folytatni a konverzió előírását. (uint16)ev * 365 ... stb.

A saját másodperces idő helyett célszerűbb egy szabványosat használni. Pl. Julian Day Number. Még a hét napja is kiszámolható belőle egy mod 7 művelettel. Bővebben: Link
A hozzászólás módosítva: Okt 1, 2014
(#) holex válasza Hp41C hozzászólására (») Okt 1, 2014 /
 
Rendben, így lesz, csak arra gondoltam, hogy mivel a fgv visszatérési értéke 32 bites, ezért 32 biten fogja végigszámolni a kifejezést. De úgy tűnik mégsem...
(#) steelgoofy válasza tursaba hozzászólására (») Okt 1, 2014 /
 
A FAULT egyszerűen csak Vcc-re van kötve egy 10kOhm-os ellenálláson keresztül.
(#) KDavid753 hozzászólása Okt 1, 2014 /
 
Sziasztok!
ATtiny2313 miért melegszik?
Egy óra kijelzőt hajt meg, de a szegmensek vannak meghajtva tranzisztorral. Ez az oka, vagy a gyors órajellel egybekötött lábkapcsolgatás? (van az ic-n kristály, de ennek kell valami külön script, hogy azt használja?)
Üdv: Dávid
(#) holex válasza KDavid753 hozzászólására (») Okt 2, 2014 /
 
Fuse biteket be kell állítanod, különben a belső RC oszcillátort használja.
(#) tursaba válasza steelgoofy hozzászólására (») Okt 2, 2014 /
 
Az egy kimenet. Milyen szint van a /FAULT lábon?
(#) killbill válasza Hp41C hozzászólására (») Okt 2, 2014 / 1
 
A C fordito eleve minden int-nel kisebb adatot int-re konvertal, tehat a 8 bites ev-et elobb 16 bites intre konvertalja, azutan szoroz vele. Mivel a napok szama boven elfer 16 biten, ezzel nincs semmi baj. A 86400-zal valo szorzassal sincs semmi baj, mert az eleve egy 32 bites int konstans, es ezert az ezzel szorzott operandust is 32 bites intre fogja konvertalni szorzas elott. Ezert persze a szorzas eredmenye is 32 bites lesz. Ennek eredmenyekeppen az utana kovetkezo osszeadasok is 32 bitesek lesznek, mert a muvelet mindket operandusat egyforma tipusra hozza a fordito a muvelet elott.

A baj abbol adodik, hogy az ora, ami jelen esetben 13, int-re konvertalas utan meg mindig 13, de a * 3600 utan 16 bites int-kent ertelmezve mar negativ szam, (50400 = -15136), es ezert jon ki rossz eredmeny. Eleg lenne a 3600 utan irni egy u-t, tehat ora * 3600u, mert akkor az orat int-rol unsigned int-re konvertalja a fordito (mert ha egy muveletben signed es unsigned operandus keveredik, akkor az int-bol unsigned int lesz), es csak utana szoroz.
(#) steelgoofy válasza tursaba hozzászólására (») Okt 3, 2014 /
 
Alacsony szint van. (0,1 V)
(#) vzoole válasza Droot hozzászólására (») Okt 3, 2014 /
 
Összedobtam itthon a kapcsolást... ez a kód megy nekem. (atmega8, belső 8MHz, max6675)
  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.  
  16.  
  17. void USART_Init(void)
  18. {
  19.     // Set baud rate
  20.     UBRRL = BAUD_PRESCALE;// Load lower 8-bits into the low byte of the UBRR register
  21.     UBRRH = (BAUD_PRESCALE >> 8);
  22.     // Load upper 8-bits into the high byte of the UBRR register
  23.     //Default frame format is 8 data bits, no parity, 1 stop bit
  24.     //to change use UCSRC, see AVR datasheet
  25.     // Enable receiver and transmitter and receive complete interrupt
  26.     UCSRB = ((1<<TXEN) | (1<<RXCIE));
  27. }
  28.  
  29.  
  30.  
  31. void USART_SendByte(uint8_t u8Data)
  32. {
  33.   // Wait until last byte has been transmitted
  34.   while((UCSRA &(1<<UDRE)) == 0);
  35.  
  36.   // Transmit data
  37.   UDR = u8Data;
  38. }
  39.  
  40.  
  41.  
  42. uint8_t spi_readwrite(uint8_t cData)
  43. {
  44.     SPDR = cData;
  45.     while(!(SPSR & (1<<SPIF))); // Wait for transmission complete
  46.     cData = SPDR;
  47.     return cData;
  48. }
  49.  
  50.  
  51.  
  52. uint16_t ReadTemp6675(void)
  53. {
  54.     uint16_t temperature;
  55.     uint8_t byte_0;
  56.     uint8_t byte_1;
  57.  
  58.     PORTB &=~(1<<PB0); //MAX6675_CS_ENABLE;
  59.     byte_1 = spi_readwrite(0x00);
  60.     byte_0 = spi_readwrite(0x00);
  61.     PORTB |= (1<<PB0); //MAX6675_CS_DISABLE;
  62.  
  63.     //USART_SendByte(byte_1);
  64.     //USART_SendByte(byte_0);
  65.  
  66.     temperature  = (byte_1<<8);
  67.     temperature |= byte_0;
  68.  
  69.     temperature = (temperature>>5);
  70.     return temperature;
  71. }
  72.  
  73.  
  74.  
  75. int main(void)
  76. {
  77.     uint16_t data;
  78.  
  79.     USART_Init();
  80.     DDRB  = (1<<PB5) | (1<<PB3) | (1<<PB0);
  81.     PORTB = (1<<PB0);
  82.     //Init SPI
  83.     SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
  84.     PORTB = (1<<PB2);  //Pull up SS
  85.  
  86.     while(1)
  87.     {
  88.  
  89.         _delay_ms(500);
  90.         data = ReadTemp6675();
  91.         USART_SendByte(data);
  92.     }//while(1)
  93.     return 0;
  94. }//main
A hozzászólás módosítva: Okt 3, 2014
(#) kala1982a hozzászólása Okt 4, 2014 /
 
Forgatok egy tárcsát, van rajta 4 db kis mágnes. Kontroller megszakítható lábára egy Hall ic-t kötök. Tud valaki olyan kapcsolást, ami a HALL ic kimenetét csak egy impulzusra szűkíti le? Mert ha épp' úgy áll meg a tárcsa, hogy a mágnes az IC előtt van akkor folyamatosan van kimenet, és ilyenkor gondolom a megszakítás is folyamatosan menne.
(#) Zsolt2 válasza kala1982a hozzászólására (») Okt 4, 2014 /
 
Monostabil aramkorrel el lehet erni, hogy csak egy impulzlust adjon, de ez csak akkor szukseges, ha pergese van a Hall cellanak. A megszakitas felfuta (vagy lefuto) elre tortenik, ha folyamatosan egy szinten van, akkor nem marad a megszakitasban.
(#) kala1982a válasza Zsolt2 hozzászólására (») Okt 4, 2014 /
 
Akkor AVR-nél ha int0-át magas szinten tartom akkor is csak egyszer fut le, hiába van folyamatosan rajta jel? Akkor jó, mert akkor nem kell foglalkoznom vele. De akkor viszont 2 szer fog megszakítani? (fel és lefutó élre is)
(#) Zsolt2 válasza kala1982a hozzászólására (») Okt 4, 2014 /
 
Csak egyszer hivodik meg a megszakitas. Atmega tipusu AVR-nel az MCUCR regiszterben tudod beallitani, hogy milyen esemenyre tortenjen megszakitas, itt a te esetetben az utolso keto hasznalhato, vagyis valamelyik elre tortenjen a megszakitas.
(#) kala1982a válasza Zsolt2 hozzászólására (») Okt 4, 2014 /
 
Köszönöm a segítséget, nincs szükségem akkor külső áramkörre, szoftveresen kell beállítani majd hogy fel vagy lefutóélre reagáljon. Köszi még egyszer!
(#) fecus hozzászólása Okt 4, 2014 /
 
Az Atmel gyári PID szabályzó algoritmusával (AVR221) próbálok majd egy adott területen egyenletes megvilágítást tartani egy ledsor segítségével. Most a kisérlet egy ledből és a fényérzékelő ellenállásból áll. Az ellenállás éppen fordítva ad jelet, mert így egyszerűbb a kapcsolás, tehát ha nő a fény akkor csökken az ADC mért értéke. Ezt a 10 bites számot kellene megfordítanom, hogy 0 esetén 3FF és 3FF esetén 0 legyen a változó.
Biztos egyszerű de nem tudok rájönni. Az algoritmus int16 változókkal dolgozik.
Van egy kis segítségetek?
A hozzászólás módosítva: Okt 4, 2014
(#) vzoole válasza fecus hozzászólására (») Okt 4, 2014 / 1
 
x = 3FF - adc;
(#) fecus válasza vzoole hozzászólására (») Okt 4, 2014 /
 
Köszi. Na ezt hívják blokknak. Már reciprokot vadásztam feleslegesen.
(#) holex válasza fecus hozzászólására (») Okt 5, 2014 /
 
Bitenkénti invertálás nem működne? Az egyszerűbb és szerintem ugyanaz az eredménye (de persze lehet, hogy nem).
(#) Droot válasza vzoole hozzászólására (») Okt 5, 2014 /
 
Csupa nullákat küld sajnos.
(#) vzoole válasza holex hozzászólására (») Okt 5, 2014 / 1
 
Mivel int szám így negatív eredményt kapsz invertálásra.
De uint számnál se lenne jó, mert akkor 65525-böl vonná ki.
(#) MGaa73 hozzászólása Okt 5, 2014 /
 
Sziasztok!

Lehet, hogy nem a legjobb helyen teszem fel a kérdésem, ezért előre is elnézést kérek mindenkitől ha így lenne. Arduino fejlesztő panelt szeretnék vásárolni, de nem tudom pontosan, hogy melyiket lenne érdemes. Amivel szemezgatek az ebay-ről "New SainSmart Mega2560 R3 ATmega2560-16AU + ATMEGA16U2 + USB Cable For Arduino". ebay link Így rögtön két kérdésem lenne. Érdemes-e erre a panelre beruházni vagy van jobb választás is? Másik ebay-ről vettetek-e már ilyet és bejött-e a vásárlás. Az ár töredéke az itthoni áraknak. Korábban már foglalkoztam PIC fejlesztéssel akkor a saját magam szórakoztatására. Ezzel a lehetőséggel a gyermekeimet szeretném rávenni egy kis kreatív alkotásra
(#) whit33r válasza MGaa73 hozzászólására (») Okt 5, 2014 /
 
Szia, én már vettem, méghozzá ilyet (nem ettől az eladótól, de gondolom ugyan azok). Tökéletesen működik, semmi probléma vele.
A hozzászólás módosítva: Okt 5, 2014
(#) MGaa73 válasza whit33r hozzászólására (») Okt 5, 2014 /
 
Szia, ezeket az ebay kompatibilisnek írja. Programozásnál 100% a kompatibilitás?
Következő: »»   620 / 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