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   757 / 837
(#) uedit válasza Ivan93 hozzászólására (») Jan 7, 2017 /
 
Szia. köszönöm a gyors választ. Az előző hozzászólásomban próbáltam leírni a programozó nevét, de a pontatlanság miatt rosszul sikerült: USB-s STK500-m van. Az op rendszerem Windows 7.
Az eszközkezelőmben a virtuális portnak a COM3 írja. Mivel sem párhuzamos, sem soros portom nincs, így csak az USB maradt. Nekem tulajdonképpen valószínű egy idevaló driver kellene. Egyszer már az STK500 volt telepítve (kb 2éve) De nemrégen újra kellett az op. renszert telepítenem és az akkori megoldásra nem emlékszem. Olyanra emlékszem, hogy az eszközkezelőben valahol az STK500 név is szrepelt, de ebben viszont nem vagyok egészen biztos.
(#) Ivan93 válasza uedit hozzászólására (») Jan 7, 2017 /
 
Érdekes, szerintem működnie kellene mivel felismerte a gép a portot. Én egy saját készítésű STK500-at használok, ch340-es soros-USB IC-vel. Annak a driverét kellett feltenni, utána nekem is így nézett ki eszközkezelőben, a Studio pedig elfogadta a portot (W7 nálam is). Esetleg nézd meg milyen átalakító IC vav a programozódon, és annak a driverét tedd fel. Lehet, hogy atmel chip végzi az átalakítást, akkor az ő oldalukon kellene keresni valamit.
(#) uedit hozzászólása Jan 7, 2017 /
 
Üdv.
Csak délben jöttem haza, így csak most tudtam írni.
Én vettem anno a programozót és a dobozba be van ragasztva, így nem tudom megnézni a nyák oldalt, sajnos. Két kvarcot látok (lehet, hogy rosszul sejtem) De több kapcsolási rajzon láttam az FTDI 232-vel való megépítést, amin szintén 2 kvarc volt. Letöltöttem ennek az IC-nek a driverét, Viszon futtati (telepíteni nem tudom) Ugyhogy így állok, nem tudom, hogy tudsz még ötletet adni.
Csatoltam 3 képet, hátha... A ch340 driver meg kínai amin eligazodni nem tudok.
A hozzászólás módosítva: Jan 7, 2017
(#) RoliNyh válasza uedit hozzászólására (») Jan 7, 2017 /
 
A második képen az bizony nem driver, az valami programozó alkalmazás...
(#) uedit válasza RoliNyh hozzászólására (») Jan 7, 2017 /
 
üdv.
A következő tömörítt file lett letöltve: CH340_WINDOWS.zip.Kicsomagolás után kaptam két file-t
az egyik- INSTALL, a másik pedig ez: CH341SER. Az INSTAL futtatáskor jött a kinai valami. A CH341SER- nél pedig ez (1 kép), a setup 32.exe után pedig a (2 kép) De a STK500-t sajnos nem ismeri fel az AVRStudio 4. Lázsd fentebb. Az észrevételt köszönöm. Az eszközkezelő a fuuttatás után pedi ez (3kép)
(#) Sick-Bastard válasza uedit hozzászólására (») Jan 8, 2017 /
 
Ha jól értem még nem tudjátok pontosan milyen USB<->Soros átalakító van az STK500-asban?
Mivel megjelenik az eszközkezelőben, így egyszerű megtudni:
Jobb klikk a COM3-ra -> Tulajdonságok (Gyártó

Így legalább meg lehet tudni, hogy jó driverrel próbálkozol vagy sem.
STK500-asom nincs, csak ennyit tudok segíteni.
(#) TavIR-AVR válasza Sick-Bastard hozzászólására (») Jan 8, 2017 /
 
Ha meg driverből mást _készerítesz_ mint ami hozzá való, nagyobb katsóyvasz lesz belőle.
Az eszköz legelőször minek jelent meg? Amikor kérdéjeles volt még?
Illetve ami a névnén fontosabb: Azonosító VID/PID.
Az soros illesztő "nyomozás" lépései és programjai: Sorosport és ami mögötte lehet
(#) uedit válasza TavIR-AVR hozzászólására (») Jan 9, 2017 /
 
Üdv.
Az eszközkezelő tulajdonságok - alapján a VID/PID a következő: USB\VID_04D8&PID_00DF&.
A linkeltben levő soros átalakítókkal nem azonítható nálam.
A hozzászólás módosítva: Jan 9, 2017
(#) zombee válasza uedit hozzászólására (») Jan 9, 2017 /
 
VID/PID alapján egyértelműen MCP2200. INNEN telepítheted.
A hozzászólás módosítva: Jan 9, 2017
(#) petikkkeee hozzászólása Jan 9, 2017 /
 
Sziasztok,
Atmel AVR studio 4-et szeretnék használni AVR ISP MK2-es programozóval. A programon belül nem csatlakozik a programozó, tudna valaki segíteni? ( sajnos nagyon sürgős lenne ) :/
(#) rascal válasza petikkkeee hozzászólására (») Jan 9, 2017 /
 
Próbáld meg a link alján lévő leírás szerint: Bővebben: Link
(#) uedit válasza zombee hozzászólására (») Jan 13, 2017 /
 
Szia.
Köszönöm az infót. Sikerült életre kelteni az STK500-as programozót.
Viszont lenne még egy kérdésem? A legtöbb AVR-es projektben, csak a HEX file van megadva, viszont az (STK500) programozóban vannak Fuses és Lock bitek. Ha ezek nincsenek megadva honnan tudom meg, hogy mit kell odaírnom? Előre is köszönöm a segítséget.
(#) istvanpepe hozzászólása Jan 14, 2017 /
 
Sziasztok!
Segítséget kérnék.Nagyon kezdő vagyok
A csatolt fjl feltölthető ATmega328P-PU ra?
A szöveges része a fájlnak mire való?
A hex fájlokat még értem ,de a szövegessel nem tudok mit kezdeni.
Köszönöm a segítséget
(#) fifadani hozzászólása Jan 14, 2017 /
 
Sziasztok!

Szeretnék Tőletek segítséget kérni. Próbálok kommunikálni egy atmega128-al UART-on keresztül.
Szépen küldi a nevemet soros porton keresztül a PC-mre. Ezzel nincs gond. DE! (megszakítással szeretném a fogadást létrehozni) Amikor byte érkezik a uC-re lefagy... Abból az állapotból csak a reset lendíti ki.

A kód:
  1. /*atmega128@16Mhz UART-perl kommunikacio gyakorlas*/
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6.  
  7. #define F_CPU 8000000UL
  8. #define baud_rate 9600
  9. #define UBRR_ertek F_CPU/16/baud_rate-1
  10.  
  11. void port_init(void);
  12. void uart_init(unsigned int UBRR_);
  13. void uart_kuld(unsigned char data0);
  14. unsigned char uart_fogad(void);
  15. volatile unsigned char data1;
  16.  
  17. int main(void)
  18. {
  19.         port_init();
  20.         uart_init(UBRR_ertek);
  21.  
  22.         sei();
  23.  
  24.         while(1)
  25.         {              
  26.                 uart_kuld('D');
  27.                 uart_kuld('a');
  28.                 uart_kuld('n');
  29.                 uart_kuld('i');
  30.                 uart_kuld('\n');
  31.  
  32.                 _delay_ms(60);
  33.                 PORTA ^=(1<<PA0);
  34.         }      
  35.  
  36. return 0;
  37. }
  38.  
  39. void uart_init(unsigned int UBRR_)
  40. {
  41.         UBRR0H |= (unsigned char) (UBRR_>>8);
  42.         UBRR0L |= (unsigned char) UBRR_;
  43.         UCSR0B |= (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
  44.         UCSR0C |= (1<<UCSZ0) | (1<<UCSZ1);
  45.         UCSR0A |= (1<<RXC0);
  46. }
  47.  
  48. void port_init(void)
  49. {
  50.         DDRA |= 0x03;
  51. }
  52.  
  53. void uart_kuld(unsigned char data0)
  54. {
  55.         while(!(UCSR0A & (1<<UDRE)));
  56.         UDR0 = data0;  
  57. }
  58.  
  59. unsigned char uart_fogad(void)
  60. {
  61.         while ( !(UCSR0A & (1<<RXC0)) );
  62.  
  63.         return UDR0;
  64. }
  65.  
  66. ISR (USART0_RXC0_vect)
  67. {
  68.         PORTA ^= (1<<PA1);
  69. }


Köszi szépen!
(#) Sick-Bastard válasza fifadani hozzászólására (») Jan 14, 2017 /
 
Adatlap 182. oldal:
Idézet:
„The Receive Complete (RXC) flag indicates if there are unread data present in the
receive buffer. This flag is one when unread data exist in the receive buffer, and zero
when the receive buffer is empty (i.e., does not contain any unread data).”


A kódban az UART megszakításban csak a Port A 1-es lábát "billegteted".
Mivel nem olvasod ki a UART adat regiszterét(UDR0) ezért a megszakítás folyamatosan aktív marad és csak az ISR fog futni.

  1. ISR (USART0_RXC0_vect)
  2. {
  3.         PORTA ^= (1<<PA1);
  4.         data1 =  uart_fogad();
  5. }
(#) kapu48 válasza fifadani hozzászólására (») Jan 14, 2017 /
 
Elsőnek tisztázni kellene, hogy milyen frekin járatod az uC-t?

Mert végig 16MHz-vel számolsz, mégis 8MHz-nek definiáltad:
#define F_CPU 8000000UL ?
Ez alapján rosszul kalkulálja a fordító a baudRate értékét.
(#) fifadani válasza kapu48 hozzászólására (») Jan 14, 2017 /
 
Az első sorban elírtam, most vettem észre. (megszokásból írtam 16-ot, ebben az alkalmazásban 8Mhzről üzemel)
Mit rontottam még el?
A hozzászólás módosítva: Jan 14, 2017
(#) Sick-Bastard válasza istvanpepe hozzászólására (») Jan 14, 2017 /
 
Igen. A BIN mappában a 2 hex közül az egyiket. Egyik görög, másik angolul írja ki az infókat a kijelzőre. (Gondolom) Neked a main_EN.hex kell.

A szöveges file-ok azok a forráskódok, amikből a fordító a hex(gépi) kódot készíti. Ha nem akarsz/nem kell a kódban módosításokat végezni, akkor azokkal nem is kell foglalkoznod.
Pl.: át lehet írni magyarra a kijelzőn szereplő szövegeket.
(#) istvanpepe válasza Sick-Bastard hozzászólására (») Jan 14, 2017 /
 
Köszönöm.
Milyen fordítóval tudom beolvastatni a forráskódokat?
(#) fifadani válasza fifadani hozzászólására (») Jan 14, 2017 /
 
Javítottam pár dolgot. De még mindig nem működik.

  1. /*atmega128@8Mhz UART-perl kommunikacio gyakorlas*/
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6.  
  7. #define F_CPU 8000000UL
  8. #define baud 9600
  9. #define baudrate ((F_CPU)/(baud*16UL)-1)
  10.  
  11. void port_init(void);
  12. void uart_init(void);
  13. void uart_kuld(unsigned char data0);
  14. unsigned char uart_fogad(void);
  15. volatile unsigned char data1;
  16.  
  17. int main(void)
  18. {
  19.         port_init();
  20.         uart_init();
  21.         sei();
  22.  
  23.         while(1)
  24.         {                      
  25.                 uart_kuld('D');
  26.                 uart_kuld('a');
  27.                 uart_kuld('n');
  28.                 uart_kuld('i');
  29.                 uart_kuld('\n');
  30.  
  31.                 _delay_ms(60);
  32.                 PORTA ^=(1<<PA0);
  33.         }      
  34.  
  35. return 0;
  36. }
  37.  
  38. void uart_init(void)
  39. {
  40.         UBRR0H |= (unsigned char) (baudrate>>8);
  41.         UBRR0L |= (unsigned char) baudrate;
  42.         UCSR0B |= (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
  43.         UCSR0C |= (1<<UCSZ0) | (1<<UCSZ1);
  44.         UCSR0A |= (1<<RXC0);
  45. }
  46.  
  47. void port_init(void)
  48. {
  49.         DDRA |= 0x03;
  50. }
  51.  
  52. void uart_kuld(unsigned char data0)
  53. {
  54.         while(!(UCSR0A & (1<<UDRE)));
  55.         UDR0 = data0;  
  56. }
  57.  
  58. unsigned char uart_fogad(void)
  59. {
  60.         while ( !(UCSR0A & (1<<RXC0)) );
  61.         return UDR0;
  62. }
  63.  
  64. ISR(USART0_RXC0_vect)
  65. {
  66.         PORTA ^= (1<<PA1);
  67.         data1 =  uart_fogad();
  68. }
(#) fifadani válasza fifadani hozzászólására (») Jan 14, 2017 /
 
Megvan!

Ennyit számít ha nincs ott a C betű?! Nincs valahol egy táblázat amiben össze vannak gyűjtve ezek az ISR makrók?
  1. ISR(USART0_RX_vect)
  2. {
  3.         unsigned char data1;
  4.  
  5.         data1 =  uart_fogad();
  6.         if(data1=='A')
  7.         {       PORTA |= (1<<PA1); }
  8.         if(data1=='a')
  9.         {       PORTA &= ~(1<<PA1); }
  10. }
(#) benjami válasza fifadani hozzászólására (») Jan 14, 2017 /
 
De van. A fordító include könyvtárában a te esetedben az "iom128.h" file.
  1. #define USART0_RX_vect  _VECTOR(18)
(#) simona hozzászólása Jan 14, 2017 /
 
Sziasztok! Kezdő vagyok az AVR-hez, segítséget szeretnék kérni.

Programozóm: USBasp V2.0
Egy orosz videóból találtam egy "Khazama AVR" nevű programot, amivel a kész .hex fájlt bele tudom égetni az AVR-be, és ez működik is! Az egyik AVR-es alapkapcsolásos cikkben lévő LED-es villogót megépítettem, illetve az előre lefordított .hex fájlt felhasználtam és azóta villog a LED.

Az én problémám viszont az, hogy nem tudok fordítani c-ből hex-be. Két úton is elindultam:

1. WinAVR: Programmer's Notepad-ben összeállítom a main.c-t, elmentem, hozzáadom a project-hez, MFile-al elkészítem a Makefile-t, és a [WinAVR] Make All-ra kattintva: FATAL ERROR hibaüzenet.

2. AVR Studio 4: Előkészítve mindent, Build-ra kattintva: "Build failed with 1 errors and 1 warnings..."

Itt akadtam el, előre köszönöm a segítséget!
(#) Sick-Bastard válasza istvanpepe hozzászólására (») Jan 14, 2017 /
 
Én WinAVR-t használok, de AVR Studio-t (4-7 verziók)is lehet használni. A Studio funkcionalitásban gazdagabb.
(#) Sick-Bastard válasza simona hozzászólására (») Jan 14, 2017 /
 
A kezdéshez én Patrick Hood-Daniel videóit használtam.

Newbiehack

Newbiehack - YouTube

Szépen lépésről lépésre mindent elmond, igaz angolul.
(#) toma3757 hozzászólása Jan 15, 2017 /
 
Sziasztok!

Elkezdtem írni egy programot, de sajnos kb a felénél kiderült hogy a kommunikáció része sem megy.
Atmega48pa-ről van szó, a kódot próbáltam leegyszerűsíteni amennyire lehetett, sokadik próbálkozás után sem megy. Legutóbb a cikkek között található Egyszerű soros kommunikáció alapján akartam kipróbálni de nem igazán jött össze.

Jelenleg csak szimplán tovább kellene küldenie amit kap, de helyette az eredmény a képen látható(lentebb).Putty COM4(USB->TTL átalakító) keresztül az RX-TX el összekötve, Arduino az avr TX lábán. (Maga az átalakító működik)
Bármilyen karaktert küldök ez az eredménye.
Valaki találkozott már ilyennel? Mi lehet a probléma?
A kód tudom hogy nem szép, nem korrekt sok helyen, de mennie kellene valamint sokféle variációt is próbáltam már.
Maga a kód:
  1. #define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
  2. #define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
  3. #define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
  4.  
  5.  
  6. #include <avr/io.h>
  7. #include <inttypes.h>
  8.  
  9. void USART_Init()
  10. {
  11.         UBRR0L = UBRR_ERTEK;
  12.         UBRR0H = (UBRR_ERTEK>>8);
  13.         UCSR0C =  (1<<UCSZ00)|(1<<UCSZ01);
  14.         UCSR0B = (1<<RXEN0) | (1<<TXEN0);
  15. }
  16. void USART_Transmit(char data )
  17. {
  18.         while ( !( UCSR0A & (1<<UDRE0)) );
  19.         UDR0 = data;   
  20. }
  21. char USART_Receive( void )
  22. {
  23.         /* Wait for data to be received */
  24.         while ( !(UCSR0A & (1<<RXC0)) );
  25.         /* Get and return received data from buffer */
  26.         return UDR0;
  27. }
  28. int main(void)
  29. {
  30.  
  31.         char data;
  32.         USART_Init();
  33.  
  34.         while (1)
  35.         {
  36.                 data = USART_Receive();
  37.                 USART_Transmit('[');
  38.                 USART_Transmit(data);
  39.                 USART_Transmit(']');
  40.         }
  41. }

Hiba:
Kép: Hivatkozás
A hozzászólás módosítva: Jan 15, 2017
(#) rascal válasza toma3757 hozzászólására (») Jan 15, 2017 / 1
 
Nem látszik, hogy a többi adat, pl paritás, stop bitek száma egyeznek-e. Az biztos jó? Én már jártam úgy, hogy csak akkor működött a kommunikáció, ha az AVR és az átalakító RX-TX kivezetései köze egy-egy 1KOhm-os ellenállást tettem. A probléma pontos okát nem tudom. Az
Update:
Az AVR neked is 7.37...MHz-n megy?
A hozzászólás módosítva: Jan 15, 2017
(#) Sick-Bastard válasza toma3757 hozzászólására (») Jan 15, 2017 / 1
 
Ahogy rascal is kérdezi: Külső 7,37Mhz-es kristályt használsz?
Én még a fuse bitekre is rákérdezek, hogy mik a beállításaik?
Ha ezeket nem módosítottad, akkor a belső 8Mhz-es oszcillátort használja, amit még 8-al el is oszt. Ekkor valójában csak 1Mhzen megy az AVR.

Ha nem módosítottál a fuse biteken, akkor az F_CPU-t írd át:
  1. #define F_CPU 1000000UL // rendszer orajel: 1 MHz


ill az USART_Init()-nél kapcsold be a dupla sbességet:
  1. UCSR0A |= (1<<U2X0);


csak így lesz elfogadható a hibaszázaléka(1Mhz-en).
(#) janikukac hozzászólása Jan 15, 2017 /
 
Sziasztok!
Akad-e köztetek valaki szegedi, aki fel tudna nekem programozni egy ATMega kontrollert?
Üdv!
(#) simona válasza Sick-Bastard hozzászólására (») Jan 15, 2017 /
 
Nagyon köszönöm, 5 perc alatt be tudtam állítani az AVR Studio-t, és sikerült minden!
Következő: »»   757 / 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