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   742 / 837
(#) Tomi_Bp válasza Tomi_Bp hozzászólására (») Aug 3, 2016 /
 
Mivel az Arduino-ból való többszörös hivatkozások kibogozását sokkal lehetetlenebbnek látom, így folytattam az eredeti posztomban szereplő KÓD további módosítását.

Már el jutottam odáig, hogy szoftveres soros porton küld karaktert és sztringet is, de fogadni nem fogad (!!!), pedig számomra ugye az lenne a fontos... itt végképp megakadtam.
Venné valaki a fáradságot és bele nézne a kódba, hogy mi lehet vele a baj?

0 Error, 0 Warning
(#) rolandgw válasza Tomi_Bp hozzászólására (») Aug 3, 2016 / 1
 
Itt egy sima C, 328p-re. (Makefile-ban is ez van beállítva) A header-ben írd át a baud-ot és ha szükséges a port/pin részt.
(#) Tomi_Bp válasza rolandgw hozzászólására (») Aug 4, 2016 /
 
Nagyon szépen köszönöm, ez kisebb átalakítás után már tökéletesen működik!
(#) Szabi1 hozzászólása Aug 4, 2016 /
 
Sziasztok! Segítséget szeretnék kérni valakiítől aki tud assemblyben programozni AVR-eket. Megépítettem egy DMX fényvezérlő modult: Bővebben: Link, de ugyanezen a weboldalon lévő strobo mod firmware kellene nekem rá, és miután letöltöttem a firmwaret azzal szembesültem, hogy a mellé csatolt kapcsolási rajz nemugyanaz mint a dimmer packnak. Valaki lenne szives átírni nekem a kódot úgy hogy kompatibilis legyen a dimmer pack kapcsolásával?
(#) kapu48 válasza Szabi1 hozzászólására (») Aug 4, 2016 /
 
Pontosan miben különbözik a kapcsolás a tiedtől?

Mert a kimeneteket a program elején javíthatod:
  1. .equ LED=                PB3
  2. .equ CNTRL_LED=  PD7
  3. .equ Strobo=     PB7
(#) kapu48 válasza kapu48 hozzászólására (») Aug 4, 2016 /
 
Ha csak a port pinek nem stimmelne?

Ha a portok sem? Akkor minden felhasználásnál azt is javítani kel!
(#) Szabi1 válasza Szabi1 hozzászólására (») Aug 5, 2016 /
 
Mellékelem a két kapcsolási rajzot, a logic.pdf-ben van meg a feltenni kívánt firmwarehez való kapcsolás, illetve az általam megépített kapcsolás az itt található: Bővebben: Link

logic.pdf
    
(#) kapu48 válasza Szabi1 hozzászólására (») Aug 5, 2016 /
 
Figyusz!

Se kedvem, se időm ki szedni a különbségeket!
Csináld meg magadnak, ha kel!

Ha meglesz a lista?

Aztán majd elmagyarázhatom mit hol kel javítanod!
Nem nagy ügy az egész, csak időt kel rá szánni.
  1. Így képzelem Áthelyezni:
  2. Innen             Ide
  3. PC0     ->       PA0
  4. …..
A hozzászólás módosítva: Aug 5, 2016
(#) csabeszq válasza kapu48 hozzászólására (») Aug 5, 2016 /
 
Lehet, hogy nagyon maximalista vagyok, de a UART szoftveres emulációról nincs nagy véleményem.

Kapitális probléma, hogy az Atmega328-ba csak 1 UART-ot tettek, ennél csak az rosszabb, hogy szoftveresen kezdek UART-olni az elbaltázott hardver kijavítására. A szoftveres UART nagyon leterhel mindent, nem késhet a mikrovezérlő, maximális bitráta valahol 9600-nál van megbízhatóságban,...

Mindenki eljut általában addig, hogy kevés 1 UART. Nálam a következő megoldások merülnének fel:
- Atmega2560-on van 4 UART, belerakom a hardvert rendesen, hadd szóljon
- Duplázom az AVR-t, egyik modul a GPS-t szűri és I2C-n csak a lényeget tolja át
- Kapcsolót rakok az UART-ra, ha épp feltölteném a kódot, akkor lekapcsolja a GPS-t, hogy ne zavarjon
- A GPS resetnél áramot sem kap, így nem tud az UART-ba belezavarni feltöltésnél. Amikor a kód elindul, akkor indítja a GPS-t, onnan kezd adni
- Nem USB-n töltöm fel a kódot, hanem Wifi-n, infán, RC-n, I2C-n,...

Rengeteg projektem volt, de szoftver UART-ot bevallom még nem használtam. Ha van más ésszerű opció, akkor azt használom.
A hozzászólás módosítva: Aug 5, 2016
(#) kapu48 válasza csabeszq hozzászólására (») Aug 5, 2016 /
 
Csak egyet érteni tudok veled!

Ezért nem is talált a Tomi_Bp barátunk hozzá minta kódot.
(#) Kovidivi válasza csabeszq hozzászólására (») Aug 5, 2016 /
 
Szia. Milyen hardveres hibákra gondolsz? Az uart perifériára érted? Én még nem vettem észre egyet sem, de ezentúl figyelni fogok rá. Mikor jön elő a hiba? Köszi.
(#) csabeszq válasza Kovidivi hozzászólására (») Aug 5, 2016 /
 
Szoftveres UART-ról beszélünk: Bit-Bang. Ez gondolom úgy megy, hogy egy pin change interrupt-ot ráállítasz valamelyik pin-re, amikor jön a start jel, akkor meghívódik egy interrupt, elindít egy timert és adott időpontokban mintavételezni kezdi a pin-t, lehetőleg az időintervallum közepén.

- Start jel -> PCINT, Timer indítás -> BIT7, BIT6, BIT5, BIT4, BIT3, BIT2, BIT1, BIT0, STOP bit

Mindezt szoftveresen. Commodore 64-en volt szoftveres az UART, semmi mást nem csinálhattál mellette, kizárólag a jelet fogadtad.

Mit nem tehetsz meg?
- nem tilthatsz interruptot hosszú időre cli(), mert bitet veszíthetsz
- minden interruptnak gyorsan be kell fejeződnie, nehogy feltartsa a vételt

Lehet szoftveresen 100%-ig megbízható UART-ot írni, csak utálom. Nagy munka, gondos odafigyelés, miközben egyszerűbb másik IC-t berakni, ahol 2 hardveres UART van. Kis energiát kell befektetni, egyszerűbb kód és cserében stabilabb működést kapsz.

AVR alatt az UART dupla pufferes, tehát amikor 1 byte-ot fogadott, elkezdi fogadni a másikat. 8 bitnyi időd van 1 helyett.
A hozzászólás módosítva: Aug 5, 2016
(#) Tomi_Bp válasza kapu48 hozzászólására (») Aug 5, 2016 /
 
Rolandgw linkelt nekem EBBEN a válaszban egy működőt. (Ismét köszönet érte!!!)
Picit kellett csak átszabnom.

Amúgy egyetértek veletek, én is jobban örülnék, ha (min.) két hardveres UART lenne benne...
Nekem eddig még nem volt szükségem több soros portra. Elég szokott lenni az I2C, az SPI és az egy soros.
A hely szűke miatt döntöttem a Atmega328p mellett a NANO panelen. Pár évvel ezelőtt, mikor minden adott volt a maratáshoz (otthon is nehéz volt HidrogénPerOxidot venni), simán mindennek saját nyákja volt. Mióta kiköltöztem, többnyire modulokat használok, dugdosós panellel, a véglegesnél pedig próba nyákba forrasztva. (Apropó: Egy haverom tudott pár éve egy talán angol céget, akik csináltak nyákot prototípus mennyiségben 1-2-3 db mennyiségben is, tűrhető áron. Nem tudtok hozzá valami elérhetőséget véletlenül, vagy másik céget, akikkel van jó tapasztalatotok? És postáz Svédországba.)
(#) csatti2 válasza Tomi_Bp hozzászólására (») Aug 5, 2016 / 1
 
http://pcbshopper.com/
Csak megadod, hova, mennyit és mekkorát és listázza honnan, mennyibe kerülne és mikorra várható...
(#) wbt hozzászólása Aug 6, 2016 /
 
Sziasztok!
Egy Ausztrál, kezdő srác kért segítséget AVR programfeltöltés problémájával. Van egy Attiny85 amibe a képen látható hex-file-t kellene feltöltenie úgy, hogy utána a FUSE biteknél az órajel PLL legyen. Mivel én még életemben nem használtam az avrdude-t, így csak pislogok, főleg az "invalid format" üzeneten. A "no such file"...talán nem abban az alkönytárban van a file, ahonnan indítja az avrdude-t? Maga a hex file Bascomból fordítódott, tehát annak formátuma jó.
Előre is köszönöm a helyes irányba való terelést.
(#) Kovidivi válasza csabeszq hozzászólására (») Aug 6, 2016 /
 
Szia. Azt hittem, a hardveres uart a bugos. A software-esnek rengeteg hátránya van, de néha muszáj használni, vagy uC-t váltani.
(#) david10 válasza wbt hozzászólására (») Aug 6, 2016 /
 
Szia,
A vu_mini85_328p.hex file valószinüleg nincs a C:/Users/Matt mappában.
A legegyszerübb, ha oda átteszed.
(#) wbt válasza david10 hozzászólására (») Aug 6, 2016 /
 
Köszönöm, megírtam neki, az volt a gond. Engem azért megzavart egy kicsit az a nem megfelelő formátum hibajelzés, érdekes...végül is ha nincs file, akkor az nem jó formátumú
Köszönöm az okosítást!
(#) csabeszq válasza Kovidivi hozzászólására (») Aug 7, 2016 /
 
Hardver bugról Atmega328P-n csak az I2C-ről tudok.

Amikor a specifikációt olvasod az I2C multimaster résznél (arbitráció,...), az egészet átugorhatod. Két hetem ment el rá, hogy megpróbáljam több mesteres módban járatni az Atmega-t eredménytelenül. Hardver bugok tömkelege teszi lehetetlenné a többmesteres módú használatot.

Ha több mestert akarsz egy I2C buszon, akkor más IC-t kell használni.
A hozzászólás módosítva: Aug 7, 2016
(#) wbt válasza david10 hozzászólására (») Aug 7, 2016 /
 
Ha már otthon vagy AVRdude témában: A FUSE bitek átállítására (is) ez így jó lesz?
avrdude -c usbtiny -p attiny85 -U flash:w:filenév.hex -U lfuse:w:0x61:m
A második -U-ban nem vagyok biztos, a fuse L értékét programmal számoltattam ki (PLL 16MHz kellene). Vagy külön, ha már felment a hex-file (az már sikerült neki), akkor:
avrdude ........????..... (csak a FUSE-bitek állítására)
Nagyon köszönöm, hogy ránéztél!!!
(#) rolandgw válasza wbt hozzászólására (») Aug 7, 2016 / 1
 
Nem kell még egyszer a flash, a fuse különálló rész.
Bővebben: Link
(#) wbt válasza rolandgw hozzászólására (») Aug 7, 2016 /
 
Köszönöm!
(#) david10 válasza wbt hozzászólására (») Aug 7, 2016 /
 
Ez kell neked:
avrdude -c usbtiny -p attiny85 -U lfuse:w:0x61:m
Viszont ha hfuse-t szeretnél:
avrdude -c usbtiny -p attiny85 -U hfuse:w:0x61:m

Amit szeretnél építeni, azt te tervezted vagy egy már kiprobált dolgot szeretnél megépíteni?
(#) wbt válasza david10 hozzászólására (») Aug 7, 2016 /
 
Elküldtem a hex-filet (én írtam a programot, de én más letöltőt használok) és a srác elég gyenge elektronikai tudással rendelkezik. Vett egy usbtiny programozót meg letöltötte az avrdude-t és előbb a path nem stimmelt, most már sikerült feltölteni a programot, de a program 16MHz-es órajelet igényel. Ehhez át kell állítani a fuse-biteket, na itt megállt a tudomány, mert én még életemben nem használtam a programot, elküldeni az erdőbe nem akartam (no meg véletlenül kizárja magát a uC-ből, akkor baj van), ezért kérdeztelek Titeket, már aki használja a feltöltő programot. Maga a hexa FUSE értéket a neten talált kis programmal számoltam (és számoltattam ki mással is), remélem, menni fog neki. persze majd bele jön, csak új dolog neki ez a vackolódás. Elég nehéz a távoli debug, ha valami nem megy majd neki, sajnos a környezetében nincs, aki segítsen. Tehát ez a történet és sokan összeraktátok a helyes parancssort. Most hajnal 2 körül van náluk, tehát kicsit lassan kapunk visszajelzést Még egyszer nagyon köszönöm a segítséget, remélem egy életre megjegyzi, mit-hogyan.
(#) kapu48 hozzászólása Aug 9, 2016 /
 
Üdv!
Megint van, ami meghaladja a jelenlegi tudásomat!
Cpp környezetből, hogyan tudom átrakni az ilyen többszörösen felül definiált függvényeket,
C környezetbe?
  1. void print(char c, byte color);
  2.     void print(char c);
  3.     void print(char *string, byte color);
  4.     void print(char *string);
  5.     void print(int i, byte color);
  6.     void print(int i);
  7.     void println();
  8.     void println(char c, byte color);
  9.     void println(char c);
  10.     void println(char *string, byte color);
  11.     void println(char *string);
  12.     void println(int i, byte color);
  13.     void println(int i);


(#) csabeszq válasza kapu48 hozzászólására (») Aug 9, 2016 /
 
Egyetemen ezt tanították:

print_char
print_int_color
println_float

A metódus szignatúrája a névbe kerül. Ez a hivatalos C++ átirat C-be.
(#) kapu48 válasza csabeszq hozzászólására (») Aug 9, 2016 /
 
Sajnos, pont ettől a választól féltem!

Mert így javítani kell az alkalmazásban mindenhol neveket!
(#) csabeszq válasza kapu48 hozzászólására (») Aug 9, 2016 /
 
A konvenció a következő:
A név 3 elemből áll, a csomaggal kezdődik, amit a név követ, legvégén a paraméter lista.

serial_println_int(int char);

Linuxos körökben a C++ átterjedt a C osztályokra is, szóval hasonló felépítésű C fájlokat láthatsz.

Nálad a következőképpen illene a kódnak kinézni:

  1. serial_println_int(129);


Amennyiben az osztálynak paraméterei is vannak (new MyClass) a következőképpen néz ki:
  1. typedef struct
  2. {
  3.   int p1;
  4.   int p2;
  5. } MyClass;
  6.  
  7. MyClass * mycls = myclass_new( 1,2 );
  8. myclass_set_p1( mycls, 123 );
  9. int p2 = myclass_get_p2( mycls );


Elsőre lehet, hogy szokatlan lesz.
A hozzászólás módosítva: Aug 9, 2016
(#) csabeszq válasza kapu48 hozzászólására (») Aug 9, 2016 /
 
Egyébként lehet C-t és C++-t keverni.
(#) kapu48 válasza csabeszq hozzászólására (») Aug 9, 2016 /
 
Próbálkoztam a kevert módszerrel, de előjött egy rakat hibajelzés!

És ez a formátum, hogy tetszik?:
  1. void LCD_printCharC(char c, u8 color);
  2.     void LCD_printChar(char c);
  3.     void LCD_printStringC(char *string, u8 color);
  4.     void LCD_printString(char *string);
  5.     void LCD_printIntC(int i, u8 color);
  6.     void LCD_printInt(int i);
  7.     void LCD_println(void);
  8.     void LCD_printlnCharC(char c, u8 color);
  9.     void LCD_printlnChar(char c);
  10.     void LCD_printlnStringC(char *string, u8 color);
  11.     void LCD_printlnString(char *string);
  12.     void LCD_printlnIntC(int i, u8 color);
  13.     void LCD_printlnInt(int i);
  14.  
  15.     void LCD_moveCursorW(u8 x, u8 y, u8 width);
  16.     void LCD_moveCursor(u8 x, u8 y);

A hozzászólás módosítva: Aug 9, 2016
Következő: »»   742 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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