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   803 / 803
(#) gordonfreemN válasza rolandgw hozzászólására (») Márc 14, 2019 /
 
Ha kiolvasom akkor mutatja ezt, akkor beállítom E4-re. A write-ot be kell ehhez pipálni?
A bootloadert azért kérdeztem, mert gondolom enélkül nem működik a mikrovezérlő.
De ez alapból rajta van vagy első alkalommal nekem kell feltenni (akár az előzőekben kovidivi által leirt hex-el együtt módszerrel)?
A bootloader mindig a program szerves része?
Egyáltalán mihez kell?
Aztán nézegettem fejlesztőeszközöket. Az avrdragon tűnik kézen fekső megoldásnak, ára és tudása alapján. Ezzel lehet azonosulni? Találtam még butterfly nevezetű cuccot, de ez még nem derült ki számomra, hogy mire jó.
Programozás:
bascom - Basic nyelven de fizetős program, úgy 100eur kb
dude - linux-os
winavr - c nyelven a linuxos megfelelőjének win-es átportolása. Felteszem érdemes ezthasználni.
Ami még nem derült ki mire jó az atmelstudio és az avrstudio.
Egész nap olvasgattam a témában, merre induljak el. Egy biztos, ez az usbasp nagyo bizonytalan és lassu cucc, szoftveresen dekódolja az usb-t.
A hozzászólás módosítva: Márc 14, 2019
(#) gordonfreemN válasza rolandgw hozzászólására (») Márc 14, 2019 /
 
Biztos vagy a C1-ben?
Én ezt találtam:
A hozzászólás módosítva: Márc 14, 2019
(#) gordonfreemN válasza rolandgw hozzászólására (») Márc 14, 2019 /
 
És, hogy arra a kérdésre is válaszoljak, mikor dobja az extremeburner a hibaüzenetet:
nos, akkor ha a kérdéses, előzőekben emlegetett szemüveges clock menüt szeretném előhívni a képen jelölt gombbal. Ugyanis ezzel jönne elő az a menú, amit linkeltél:Bővebben: Link
Hát, nem egyszerű ez, már kezd is elmenni a kedvem na jó nem...
A hozzászólás módosítva: Márc 14, 2019
(#) Kovidivi válasza gordonfreemN hozzászólására (») Márc 15, 2019 / 1
 
A bootloader csak egy extra lehetőség. Nem szükséges, és nem kötelező. A bootloader segítségével a megszokott programozási mód mellett (Miso, Mosi, Sck, Res, +5V, Gnd használatával), lehetséges az AVR-t bármilyen más módon is felprogramozni, pl. soros port, wifi, stb.
(#) rolandgw válasza gordonfreemN hozzászólására (») Márc 15, 2019 /
 
Elnézést, igazad van! Nem vettem észre, hogy nem a default értéket dobja be a calculator.
Az E4-D9 viszont jó. Az eXtreme Burner-t inkább hanyagold, ha ennyire kusza.
Én ez szoktam használni:
Bővebben: Link
(#) gordonfreemN hozzászólása Márc 15, 2019 /
 
Köszönöm az eddigi segítségeket mindkettőtöknek, már világosabb.

Arra nem tudom a választ továbbra sem, hogy melyik fejlesztőpanel lenne kézenfekvő kezdésnek és melyik fejlesztőalkalmazás, melyik égető.
Felteszem, ami hasznos lenne a továbbiakban is, főleg a jelenlegi semmi sem örök világban, ha C-ben kezdeném el tanulni, mert azt tudom esetleg más vezérlőknél is hasznosítani.
De hogy mivel? Mert van egy pár lehetőség.
Win10 64bit-em van.
Nem tudom kezdőként majd szükségem lesz-e debugra, mert akkor talán a jtag-es atmel ice csupasz verziója érné meg. Vagy ez:JTAG ICE MK2?
Ha nem kell debug akkor viszont elveszek az infók kózt. pl:
AVR ISP MK2
STK500
ponyprog
STK200
Buspirate
klón, nem klón
stb
Ami biztos talán, hogy az usbasp felejtős lesz.
A hozzászólás módosítva: Márc 15, 2019
(#) rolandgw válasza gordonfreemN hozzászólására (») Márc 15, 2019 / 1
 
Atmel Studio 7, mkII klón - például, C nyelv.
Azt viszont nagyon nem javaslom, hogy a Studo-ban vagy bármilyen más uC fejlesztőkörnyezetben próbáld a C-t megtanulni.
Arra ott a Code Blocks és ez könyv, magyarul is levadászható.
Bővebben: Link
(#) Massawa hozzászólása Ápr 4, 2019 /
 
Egy kérdés. Hogyan kell kezelni az AVR ATTiny13A-a PB5, ami egyben egy RESET láb is. Ha egy NPN fokozatot kötök rá, akkor RESETben marad. (10 kOhm a bázis ellenállás). Ha egy másik 10 kOhm-l a +5V-ra huzom akkor megy, de nem kapcsol.
Most egy N-FET fokozatot kötöttem a PB5-re, most sem kapcsol de müködik a chip ( a többi port rendben van). Csak egy LED-t kellene kapcsolnia. A szimulatirban megy a panelon nem.

Kösz
(#) Kovidivi válasza Massawa hozzászólására (») Ápr 4, 2019 / 1
 
Át kell állítani a fuse biteknél a "reset disable" bit-et, de utána normál módon programozni nem fogod tudni, ugyanis a reset láb innentől csak rendes pin-ként funkcionál... Tehát először felprogramoz, majd fuse bit-ek írása, hogy a reset láb le legyen tiltva, és kész. Programozói módba már csak magas feszültségű programozóval tudsz belépni.
(#) Massawa válasza Kovidivi hozzászólására (») Ápr 4, 2019 /
 
Kösz közben én is megtaláltam ezt az infot. Kár, hogy korábban nem tudtam. Most már csak igy tudom használni. ( másképpen is tudtam volna a NYÁKot tervezn). Na mindegy. Az ember mindig tanul.
Kösz még egyszer.
(#) Vfr72 hozzászólása Ápr 6, 2019 /
 
Sziasztok!
Egy elméleti kérdés megoldásában kérem a segítségeteket. Milyen módol lehet a "multitasking" feladat végrehajtást C nyelven programozni? Pl.: a mikrovezérlő folyamatosan vagy meghatározott ideig adott frekvenciájú hangot generál, de közben pl.: ADC értéket dolgoz fel, az értéket megjeleníti. Nem a megszakításokra gondoltam.
(#) rolandgw válasza Vfr72 hozzászólására (») Ápr 6, 2019 /
 
Egyszerű, vannak korlátai, de nagyon ravasz.
C makrókat használ, pár példaprogramot át kell nézni a neten a megértéséhez, viszont megéri.
Bővebben: Link
(#) csatti2 válasza Vfr72 hozzászólására (») Ápr 6, 2019 /
 
Amit te leírsz, azt nem multitasking-gal szokás megoldani (nem is igazán lehet azzal egymagos uC-vel), hanem egy kimenet PWM-es meghajtásával (pl. buzzer meghajtás, vagy ha rendes hang akkor DAC és DMA).

Ha ténylegesen a multitasking a lényeg, akkor pedig léteznek különböző RTOS (Runtime Operating System) megoldások (pl. FreeRTOS, ChibiOS, stb.), amelyekkel megoldhatsz ilyen jellegű feladatokat. Természetesen ezek is megszakításokkal operálnak a háttérben (taskváltást mégis mihez kötnéd? ) de ezekhez viszonylag komoly mikrokontrollert is kell választani.

Ezen a ponton a videóban pontosan az történik, amit leírsz: https://youtu.be/ips9zyRMvF0?t=261
A hozzászólás módosítva: Ápr 6, 2019
(#) Kovidivi válasza Vfr72 hozzászólására (») Ápr 6, 2019 / 1
 
Én úgy írom meg a programjaimat, hogy előre megállapítom, milyen sűrűn kell lefutnia egy függvénynek. Pl. hőmérséklet mérés elég mp-ként, míg feszültséget és áramot "real time" akarok mérni, várakozás nélkül, az LCD-t elég csak 100-200ms-ként frissíteni, de a gombokat 20ms-ként ellenőrzöm. Minden függvénynek saját számlálója van, amit a bekapcsolás óta eltelt időhöz hasonlítok. Persze ehhez az is kell, hogy egyik függvényedbe se legyen semmi várakozás, vagy minimális legyen csak. Ez nem multitasking, de hasonló. Jól működik, azonnal reagál minden. A hardware-es perifériákat is használni kell, ezek maguktól működnek, rengeteg prociidőt tudsz megspórolni.
A hozzászólás módosítva: Ápr 6, 2019
(#) Vfr72 válasza csatti2 hozzászólására (») Ápr 8, 2019 /
 
Köszönöm a választ.
A multitasking megoldást csak példaként hoztam, hogy szemléltessem a problémát.
(#) Vfr72 válasza Kovidivi hozzászólására (») Ápr 8, 2019 /
 
Köszönöm a választ.
Igen, én is arra gondoltam, hogy más megoldás nem lehet, mint meghatározott időszeleteket használni. A másik, amit írtál, hogy "kiszervezni" a feladatokat más MCU-nak.
(#) Kovidivi válasza Vfr72 hozzászólására (») Ápr 9, 2019 /
 
Akkor a kommunikáció veszi el az időt feleslegesen, és a lábakat. Át kell gondolni, megéri-e.
(#) sector99 hozzászólása Ápr 15, 2019 /
 
Sziasztok !
Csak úgy halkan kérdezem, hogy ilyen terápia vezérlőegységéről tud-e valaki bővebb infót ?
Azért ide tettem föl a kérdést, mert Atmega 16 van benne. Néhány másodpercig működik a beállított program aztán hibát jelez. Nem az enyém, ismerős kapta kölcsön használatra.
Természetesen átrakatom a kérdést, ha nem idevaló.
(#) wbt válasza sector99 hozzászólására (») Ápr 15, 2019 /
 
Én régebbit ismerem, de ott van áramfigyelés egy söntön illetve ha szakadt (kontakthibás) a tekercs, akkor kiáll hibára. Mérj vagy áramot vagy ellenállást a tekercsen (no meg a tápfeszt).
(#) sector99 válasza wbt hozzászólására (») Ápr 15, 2019 /
 
Köszi! Kb. milyen nagyságrend lehet a párnában a tekercs ellenállása ?
(#) wbt válasza sector99 hozzászólására (») Ápr 15, 2019 /
 
kisebb mint 10 ohm, ha jól rémlik, de mérhető.
(#) Tomi_Bp hozzászólása Ápr 16, 2019 /
 
Szasztok!
Egy programom át kell ültetnem avr-gcc-ből arduino nyelvre a hardver perifériáinak bővülése miatt és mert abban már le van programozva az új periféria kezelése, viszont problémába ütköztem. A programom legfontosabb eleme, hogyha uart-on soros adat érkezik akkor azt haladéktanul fel kell dolgozni és amit amúgy csinál a főprogramban, lényegtelen, azt hagyja félbe. Erre a ISR(USART_RX_vect) használtam, de arduino-ban nem találtam a párját. Kitudna valaki segíteni? Előre is köszönöm! Azért itt teszem fel a kérdést, mert azt valószínűsítem, hogy több avr rajongó tud arduino-ul, mint arduino rajongó c-ül.
(#) kapu48 válasza Tomi_Bp hozzászólására (») Ápr 16, 2019 /
 
Nyugodtan átviheted a meglevő C kódodat arduinora!
Kevés módosítással működőképessé tehető.

Próbáld meg bele illeszteni a meglevő kódodat ebbe az interup rutinba:

  1. #define USART_BAUDRATE 9600
  2. #define MYUBRR (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
  3.  
  4. void setup() {
  5.  
  6.    UCSR0B = (1 << RXEN0) | (1 << TXEN0);   // Turn on the transmission and reception circuitry
  7.    UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); // Use 8-bit character sizes
  8.  
  9.    UBRR0H = (MYUBRR >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
  10.    UBRR0L = MYUBRR; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
  11.  
  12.    UCSR0B |= (1 << RXCIE0); // Enable the USART Recieve Complete interrupt (USART_RXC)
  13.  
  14.    sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed 
  15.  
  16. }
  17.  
  18. //intrerupt on receive
  19. ISR (USART_RXC_vect)
  20. {
  21.    char ReceivedByte;
  22.    ReceivedByte = UDR0; // Fetch the received byte value into the variable "ByteReceived"
  23.    UDR0 = ReceivedByte; // Echo back the received byte back to the computer
  24. }
  25.  
  26. //use eeprom function to read/write to EEPROM
  27. void loop() {
  28.  
  29. }
(#) kapu48 válasza Tomi_Bp hozzászólására (») Ápr 16, 2019 /
 
Serial Receive Interrupt Programming in Arduino:
Bővebben: Link
(#) Tomi_Bp válasza kapu48 hozzászólására (») Ápr 16, 2019 /
 
Köszönöm szépen, most működik!

  1. #define F_CPU 16000000UL
  2. #define HW_UART_BAUDRATE 57600
  3. #define UBRR_X ((F_CPU / (HW_UART_BAUDRATE * 16UL)) - 1)
  4.  
  5. #define CHAR 0
  6. #define INT  1
  7. #define LONG 2
  8.  
  9.  
  10. void setup()
  11. {
  12.   hw_UART_init();
  13.   sei();
  14.   pinMode(LED_BUILTIN, OUTPUT);
  15. }
  16. void hw_UART_init()
  17. {
  18.   UBRR0L = UBRR_X;
  19.   UBRR0H = (UBRR_X>>8);
  20.   UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
  21.   UCSR0B |= (1<<RXEN0)|(1 << RXCIE0)|(1<<TXEN0);
  22. }
  23.  
  24. ISR(USART_RX_vect)
  25. {
  26.   char data;
  27.   data = hw_receiveByte();
  28.   hw_transmitByte(data);
  29.   hw_transmitString_F (PSTR("\n\r"));
  30.   if ( data == 'b' )
  31.   {
  32.     digitalWrite(LED_BUILTIN, HIGH);
  33.   }
  34.   else if ( data == 'k' )
  35.   {
  36.     digitalWrite(LED_BUILTIN, LOW);
  37.   }
  38.   else
  39.   {
  40.     hw_transmitString_F (PSTR("Nem megfelelő adat!\n\rCsak a b és k karakterek az elfogadottak.\n\r"));
  41.   }
  42. }
  43.  
  44. unsigned char hw_receiveByte( void )
  45. {
  46.   unsigned char data, status;
  47.   while(!(UCSR0A & (1<<RXC0)));
  48.   status = UCSR0A;
  49.   data = UDR0;
  50.   return(data);
  51. }
  52. void hw_transmitByte( unsigned char data )
  53. {
  54.   while ( !(UCSR0A & (1<<UDRE0)) )
  55.   ;                       
  56.   UDR0 = data;             
  57. }
  58.  
  59. void hw_transmitHex( unsigned char dataType, unsigned long data )
  60. {
  61.   unsigned char count, i, temp;
  62.   unsigned char dataString[] = "0x        ";
  63.  
  64.   if (dataType == CHAR) count = 2;
  65.   if (dataType == INT) count = 4;
  66.   if (dataType == LONG) count = 8;
  67.  
  68.   for(i=count; i>0; i--)
  69.   {
  70.     temp = data % 16;
  71.     if((temp>=0) && (temp<10)) dataString [i+1] = temp + 0x30;
  72.     else dataString [i+1] = (temp - 10) + 0x41;
  73.     data = data/16;
  74.   }
  75.   hw_transmitString (dataString);
  76. }
  77.  
  78. void hw_transmitString_F(char* string)
  79. {
  80.   while (pgm_read_byte(&(*string)))
  81.   hw_transmitByte(pgm_read_byte(&(*string++)));
  82. }
  83.  
  84. void hw_transmitString(unsigned char* string)
  85. {
  86.   while (*string)
  87.   hw_transmitByte(*string++);
  88. }
  89.  
  90. void loop()
  91. {
  92.   digitalWrite(LED_BUILTIN, HIGH);
  93.   delay(2000);
  94.   digitalWrite(LED_BUILTIN, LOW);
  95.   delay(2000);
  96. }
(#) kapu48 válasza Tomi_Bp hozzászólására (») Ápr 16, 2019 /
 
Ezzel csak az a gond, hogy megszakításban várakozol, amíg beütnek egy megfelelő karaktert?
Azt tudod, hogy addig minden még a delay is álldogál?
Bár még most nem sok mindent csinálsz a loopban.
De később ezzel a hosszú megszakítással gondok lesznek!
Következő: »»   803 / 803
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu