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
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   691 / 691
(#) Sick-Bastard válasza killbill hozzászólására (») Kedd, 17:26 /
 
Jelenleg ha ezt beegetem:
- avrdude: writing flash (123984 bytes):
Writing | ################################################## | 100% 68.85s
-avrdude: verification error, first mismatch at byte 0x1e000 0x0c != 0xff
avrdude: verification error; content mismatch
- a kod viszont fut
- ha visszaolvasom csak End Of Filet kapom
(#) killbill válasza Sick-Bastard hozzászólására (») Kedd, 20:06 /
 
Itt az en tudomanyom megall. Miert eget be 123984 byte-ot, amikor a hex-ben csak 1k van. Hacsak nem azert, mert akkora gyökér, hogy nullatol kezdve eget es nem onnan, ahonnan a hex file-ban kezdodik a kod. Biztos is, mert a hexfile utolso byte-janak a cime + 1 az pontosan 123984. Raadasul az elso hibat pont azon a cimen talalja, ahol az elso hasznos byte van. Teljesen nem ertem. Az AVRDUDE-t nem ismerem, sosem hasznaltam. Meg kellene nezned az AVRDUDE leirasat, hogy esetleg nem kell-e valamit maskepp megadni, ha nem a 0 cimre egeted a dolgot.
(#) Sick-Bastard válasza killbill hozzászólására (») Sze, 11:29 /
 
Koszonom szepen a segitsegedet! Tegnap keso estere ugy nez ki, hogy sikerult feltolteni ket programot. Egyet a Boot Sectorba es egyet a 0x0000 cimre es mindketto futni is kepes.

A gond szerintem a Make file-ban lesz, mivel ha kulon futtatom az AVRDUDE-ot parancssorban, akkor csak azt tolti fel amit kell. Igaz ott is azt irja ki, hogy 124xxx byte feltoltve, de ott mar 1mp alatt vegez is a muvelettel.
(#) Gj hozzászólása Sze, 14:59 1 /
 
Üdv!

Ez az antenna használható BTM-222 BlueTooth modulhoz? Ha igen, hogyan kell bekötni?
(#) roland8811 hozzászólása Sze, 23:19 /
 
Sziasztok!
Egy arduino Uno-val feltöltöttem a bootloader-t egy ATMEGA328P-PU-ra.

Honnan tudom meg hogy életképes ? (elméletileg le elenőrizte feltöléskor , bár az uno-n is volt blink teszt villogás , tudom csak a bootloadert teszi rá .. de egy próbát megért)

És hogy tehetem rá a programom?

Uploading Using an Arduino Board
A központi avr nem kivehető..

És a V-usb -vel valaki boldogult esetleg?
(Kezdő vagyok)
A hozzászólás módosítva: Sze, 23:19
(#) Kovidivi válasza roland8811 hozzászólására (») Sze, 23:27 /
 
Megpróbálhatod, hogy a két Atmega328 RX TX lábait összekötöd, RX-RX , és TX-TX sorrendben.
Az UNO-n el kellene vágni a reset vezetősávot (esetleg kikapcsolható lenne jumperrel?) , ezt a reset-et rákötöd a második AVR-ed reset-jére, a fő AVR-t meg folyamatosan reset-ben tartod. Olyan, mint ha ott sem lenne. Ha nem akarod a vezetősávot átvágni, akkor bonyolultabb lesz, kell egy USB-soros átalakító, és avrdude programmal tudsz programot küldeni az AVR-edre. Lehet, hogy a reset-et neked kell nyomnod programfelöltéskor, de ne aggódj, kb. 3x próbál feltölteni kb. 500mS-os szünettel, tehát lesz időd megnyomni a gombot.
(#) magery hozzászólása Sze, 23:51 /
 
Sziasztok!

Aki már használta a BASCOM-ban az 'inputbin' parancsot és fogadott vele értelmezhető adatokat, az kérem mondja el hogy mi a pontos beállítása. ATmega8-at használok és csak nullákat kapok vissza.

Köszi.
(#) csabeszq válasza roland8811 hozzászólására (») Csü, 10:30 /
 
Rányomod a kakaót és az optiboot 3-at villant, külső RESET-re.
A hozzászólás módosítva: Csü, 10:38
(#) kapu48 válasza magery hozzászólására (») Csü, 12:15 /
 
És mért nem müködik ami a Helpben van?
  1. '------------------------------------------------------------------------------
  2. 'name                     : printbin.bas
  3. 'copyright                : (c) 1995-2005, MCS Electronics
  4. 'purpose                  : demonstrates PRINTBIN
  5. 'micro                    : Mega48
  6. 'suited for demo          : yes
  7. 'commercial addon needed  : no
  8. '------------------------------------------------------------------------------
  9. $regfile = "m8def.dat"                                     ' we use the M48
  10. $crystal = 8000000
  11. $baud = 19200
  12.  
  13. $hwstack = 32
  14. $swstack = 8
  15. $framesize = 24
  16.  
  17.  
  18.  
  19. Dim B As Byte
  20. B = 65
  21.  
  22. 'this will convert the value 65 to a string "65" and print it
  23. Print B
  24.  
  25. 'this will print the character itself
  26. Print Chr(b)
  27.  
  28. 'this will write the byte value
  29. Printbin B
  30.  
  31. 'when using a word, it will write to 2 bytes
  32. Dim W As Word
  33. W = &H4142
  34. Printbin W
  35.  
  36. Dim Ar(4) As Byte
  37.  
  38. 'test inputbin too
  39. Inputbin Ar(1) , 4 ' will fill 4 bytes starting at index 1.
  40. For B = 1 To 4
  41.   Print Ar(b) ; Spc(4);
  42. Next
  43.  
  44. End
A hozzászólás módosítva: Csü, 12:17
(#) Gj válasza Gj hozzászólására (») Csü, 14:47 1 /
 
Valaki?
(#) Hooligan01 válasza Gj hozzászólására (») Csü, 17:37 /
 
Kicsit sem zavar, hogy ez nem az a topic?
(#) Droot hozzászólása Csü, 18:39 /
 
Sziasztok!

BMP180-al próbálok kommunikálni. A szenzor biztos, hogy jó, mert a Raspberry PI-vel működik.
Inicializálom az I2C buszt:
  1. /* I2C clock in Hz */
  2. #define SCL_CLOCK  10000L
  3.  
  4.  
  5. /*************************************************************************
  6. Initialization of the I2C bus interface. Need to be called only once
  7. *************************************************************************/
  8. void i2c_init(void)
  9. {
  10.   /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
  11.  
  12.   TWSR = 0;                         /* no prescaler */
  13.   TWBR = ((F_CPU/SCL_CLOCK)-16)/2/* must be > 10 for stable operation */
  14.  
  15. }/* i2c_init */

És a main-ben, de még nem a végtelenciklusban indítanám a kommunikációt:
  1. // send START condition
  2.         TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
  3.  
  4.     // wait until transmission completed
  5.     while(!(TWCR & (1<<TWINT)));

És a while-nál megáll minden, pedig itt még nem is címeztem.

Amit még tudni kell:
Valójában ez a kapcsolás, mert GY-68-as modulban vettem a BMP180-at: Bővebben: Link
Egy ATmega8-al próbálkozok, amit egy Li-Po akkuról táplálok aminek a jelenlegi feszültsége 4.02V.
A BMP180 modulon van egy feszstab, de elvileg -szerintem- ez nem zavar most.
A Raspberry-n 3.3V-ról járt, de a faszstab miatt 5V-ról is járhatna.

Van valami ötletetek? Mert már a falat kaparom.
(#) Droot válasza Droot hozzászólására (») Csü, 19:19 /
 
Megvan a hiba. Egy mindenttúlélős ATmega8-al kísérleteztem, amiben a TWI halott... kicseréltem és jó.
(#) Droot hozzászólása Csü, 20:27 /
 
Long típusú változót szeretnék átküldeni bájtonként. A long az 4 bájtos.
Küldeni így próbálom:
  1. uint8_t buf[4];
  2. long l = 0;
  3. buf[3] = (uint8_t)(l>>24);
  4.                 buf[2] = (uint8_t)(l>>16);
  5.                 buf[1] = (uint8_t)(l>>8);
  6.                 buf[0] = (uint8_t)(l);


Fogadni pedig így:
  1. long l = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);


Kiírni így:
  1. sprintf(buf, "%ld\n\r", l);


Valamiért mégis azt az eredményt írja ki, hogy -4113.

Hogyan kellene helyesen szétbontogatni?
(#) Kovidivi válasza Droot hozzászólására (») Csü, 20:32 /
 
Találd ki, hogy signed, vagy unsigned lesznek a változók. Legyen unsigned, azzal könnyebb dolgozni (nekem). buf[0]=szam&0xff; buf[1]=(szam&0xff00)>>8; buf[2]=(szam&0xff0000)>>16; buf[3]=(szam&0xff000000)>>24;
A fogadás szerintem jó lesz. Tényleg be tud kavarni, ha signed a változó!
(#) csatti2 válasza Droot hozzászólására (») Csü, 20:36 / 1
 
Felesleges így szétszedned a változót.
  1. uint8_t *buf;
  2. long l=0;
  3. buf = (uint8_t*)&l;
  4.  
  5. Ezután pedig egyesével megkapod a bájtokat, ha négyszer így hivatkozol rá:
  6. bytetosend = *buf++;
  7. Fogadásnál pedig:
  8. *buf++ = bytereceived;
(#) Droot válasza csatti2 hozzászólására (») Csü, 20:40 /
 
Köszönöm a válaszokat!
A hozzászólás módosítva: Csü, 20:42
(#) Droot válasza csatti2 hozzászólására (») Csü, 20:52 /
 
A sprintf működik, de sajna a bájtok szétdobálása nem. :/
Csatoltam egy képet, amin látszik hogy mit kapok és mit kellene kapnom.
(#) csatti2 válasza Droot hozzászólására (») Csü, 21:39 /
 
Ezt a megoldást nem én írtam neked. Egyébként pedig rosszul állítod össze a long-ot.
Nem írhatsz le ilyet, hogy buf[0] << 24 ha a buf[0] típusa uint8_t. Szerintem a fordító is panaszkodott. Előtte castolnod kellene. (long)buf[0] << 24 már helyes, mivel az összegnek is long-nak kell lennie az összes elemet castolni kell.
Még egy érdekes adalék az operátorok precedenciája. Azok a zárójelek feleslegesek ahol összevagyolod a buffer elemeit.

Valahogy így:
  1. long output = (long)buf[0] << 24 | (long)buf[1] << 16 | (long)buf[2] << 8 | (long)buf[3];
A hozzászólás módosítva: Csü, 21:49
(#) Kovidivi válasza Droot hozzászólására (») Csü, 22:06 /
 
Kizárhatnád az sprintf függvényt is, küldd át több részben, először ellenőrizd le, hogy a részek jók-e egyáltalán. Lépésről lépésre ellenőrizz!
(#) Droot hozzászólása 0:12 /
 
Köszönöm mindkettőtöknek!
Kiszámoltam binárisan, hogy pontosan melyik lépésben mit is csinálok és így megértettem, jó lett!
(#) csabeszq válasza csatti2 hozzászólására (») 11:09 / 1
 
Idézet:
„Azok a zárójelek feleslegesek ahol összevagyolod a buffer elemeit.”


Elég régóta programozom, de a zárójeleket mindig következetesen kirakom. Ártani semmiképpen sem árt, mert ha kirakod, akkor is ugyanaz a kód fordul le (jó esetben), mintha nem raknád ki őket.

Vannak, akik szeretik fejben tartani mind a 30 akárhány művelet precedenciáját, mások zárójeleznek. Volt szerencsém napokat eltölteni precedencia hibák miatt, legalább saját magamat nem szivatom vele.
(#) Kovidivi válasza csabeszq hozzászólására (») 12:06 /
 
Így van. Engem a valtozo<<2+4 vert át rendesen, mert az összeadás precedenciája magasabb, mint a shiftelésé! Meg a posztfix és prefix is okozott már többször galibát, főleg ha így dolgoztam vele: if (szamlalo++>10) ... Ez mikor le lesz fordítva, úgyis két művelet, először növelés, majd if, tehát én mindig úgy csinálom: szamlalo++; if(szamlalo>10) ... Bénának tűnik, de kód szempontjából ugyanaz fordul le.
(#) Max26 hozzászólása 13:26 /
 
Sziasztok!

Engedjétek meg, hogy feltegyek egy kérdést. Van ez a kapcsolás. Megépítettem többször breadbordon eszerint a kapcsolás szerint működött. Annyi eltérés van az Eagle-ben megtervezett NYÁK és a próbapanel közt, hogy a maratott NYÁK-on a Q1..Q7 tranzisztorok BS170-esek és nem pedig 2N7000 esek.

Ami az én problémám, hogy az áramkör áramfelvétele ingadozik. Többször rámértem multiméterrel, sehol nem találtam rövidzárat. Az áramkör nem indul be, pedig minden jól van bekötve. A mért feszültség-áram értékeket feltüntettem a kapcsoláson. (Breadboardon 40..55mA mörüli áramfelvételt mértem és nem ingadozott)

Miért ingadoznak a feszültség értékek adott határon belül?
A hozzászólás módosítva: 13:30

kapcs.jpg
    
(#) csatti2 válasza Max26 hozzászólására (») 14:18 /
 
A C3-on lévő tápfeszt nézted szkóppal? Próbáltad resetben tartani a mikrokontrollert, hogy akkor is ingadozik-e a tápfesz?
(#) Kovidivi válasza Max26 hozzászólására (») 14:32 /
 
A lithium-ion cella feszültségét úgy méred, hogy az AVR tápfeszültsége sem stabil? Ebből csak saccolni tudsz! Kapcsold át az AVR 1.1-2.5V referenciára, vagy amelyik van neki, és feszültség osztóval mérjed a cellát úgy, hogy 4.5V-os cellafeszültség esetén érje el a feszültségosztón mérhető feszültség a referenciafeszültség szintjét. A biztosítékot kicserélném, ha 0.56V esik rajta. Ez óriási pazarlás! Gondolom valami PTC, vagy automata biztosíték, ami visszakapcsol, ha megszűnt a rövidzárlat. Ehelyett egy normál üvegcsöves sokkal jobb választás lenne, mondjuk 500mA-re. Ha ennél nagyobb áram folyik, az már biztos, hogy káros. A relé azért kell, ha kívülről megtáplálod 5V-tal, akkor leválassza a cellát? Elvileg felesleges, mert a DC-DC konverter figyeli a kimenetét, és ha megvan rajta az előírt feszültség, akkor lekapcsolja magát. Plusz össze is diódáztad, tehát az 5V felől a DC-DC felé nem tud áram folyni. Ehhez megjegyezném, hogy a diódán is óriási feszültség esik, ha nagyon bent akarod hagyni, akkor schottky-t rakj be, 0.1V körül esik rajta. Esetleg megoldható lenne FET-es logikával is, akkor még relé sem kattogna, és nem is fogyasztana. A hibára nincs ötletem, valószínűleg elkötés, vagy programhiba. Ezt csak te tudod leellenőrizni. A két GND miért így van összekötve? Az ott egy áramgenerátor 180mA-re beállítva? Ez az áram csak a GND2-től a GND felé folyik?
A hozzászólás módosítva: 14:33
(#) roland8811 hozzászólása 22:27 /
 
Digitális lábakkal hogy lehet ventillátor sebességel változtatni?
uln2003an-em van segédnek
(#) Kovidivi válasza roland8811 hozzászólására (») 22:39 /
 
Google: fan speed control avr, és PWM-re képes lábbal tudsz sebességet szabályozni. Vagy szoftveres PWM-mel.
Következő: »»   691 / 691
Bejelentkezés

Belépés

Hirdetés
Frissek
2015. Szept, 04. Pé
22:56:46
Jelenleg 399 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu