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   708 / 840
(#) zombee válasza tursaba hozzászólására (») Nov 27, 2015 /
 
VCC és AVCC is kap tápot? Ilyenkor az lehet hogy nem...
(#) tursaba válasza zombee hozzászólására (») Nov 27, 2015 /
 
A lábakon mértem(2 Vcc, AVcc, és 2+1 Gnd! Kizártam ezzel az esetleges nyák, forrasztási hibát.
Előtte ohm mérőztem is a lábakon. Ilyennel nem futottam még össze. Ha befut, cserélek uP-t ATmega8-ra.
(#) Kovidivi válasza tursaba hozzászólására (») Nov 27, 2015 /
 
Ha a lábat nem állítod kimenetnek, és csak a 10-100kohmos felhúzó ellenállást kapcsolgatod, akkor kapsz terhelhetetlen kimenő feszültséget.
(#) zombee válasza Kovidivi hozzászólására (») Nov 27, 2015 /
 
de ő azt írja, hogy terheletlenül is 2V-ot mér...
(#) Kovidivi válasza zombee hozzászólására (») Nov 27, 2015 /
 
Ő csak azt írja: "out esetén csak ~2V szintet ad ki, ami alig terhelhető, mert még tovább csökken ?" - én ebből arra következtetek, hogy van rajta egy LED, vagy valami ohmikus terhelés (=alig terhelés), és ha tovább terheli, tovább csökken.
(#) tursaba válasza Kovidivi hozzászólására (») Nov 28, 2015 /
 
Köszönöm, de ilyen alapvető hibát nem szeretnék véteni.
A port DDRd- re "inicializáláskor" kiküldöm a 0b11111111-et. (a lefordított asm-ben lefuttatja a függvényt)
Ha pl.: portd=0xFF; ~ua. a jelenség és feszültség, üres port, kissé terhelt (~1mA) port lábakon is, szkóppal és multiméterrel mérve.
(#) fecus hozzászólása Nov 28, 2015 /
 
Segítséget kérek! Attiny25, 32Khz kvarcról jár, 1sec IT-vel tesz bármit is. A progi csak próba. Az IT-t és azt akartam tesztelni, hogy milyen értelmes, megkülönböztethető jeleket tudok adni egy szál leddel.
E helyett 2 napja töprengek, hogy ha elindítom, miért csak a default State+1 állapot működik azaz miért nem lép körbe: 1 és 2 és 3 és 0 és 1 stb. villanás?
  1. #define F_CPU 32768                                                             // AVR quartz clock frequency in Hz
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/sleep.h>
  6. #include <avr/interrupt.h>
  7.  
  8. #define LED      PB1
  9.  
  10. volatile int State = 0x00;                                              // LED állapota
  11.  
  12. void Init_Timer1(void)                                                                                                                                                  // timer1
  13.         {
  14. //              TCCR1 |= ( ( 1 << CS10 ) | ( 1 << CS11 ) | ( 1 << CS12 ) | ( 1 << CS13 ) );             // start the timer clock/16384
  15.                 TCCR1 |= ( 1 << CS13 );                                                                                                                 // start the timer clock/128
  16. //              TCNT1 = 0x00;                                                                                                                                   // induló érték
  17.                 TIMSK |= (1 << TOIE1);                                                                                                                  // enable overflow interrupt
  18. //              OCR1A = 0x01;                                                                                                                                   // max
  19.         }
  20.  
  21. int main(void)
  22. {
  23.        
  24.         DDRB = (1<<LED);                                                        // Set LED as an output
  25.         PINB &= ~( 1 << LED );                                          // write 0 to disable internal pullup
  26.         PORTB |= (1<<LED);                                                      // Turn off LED
  27.         Init_Timer1();
  28.         set_sleep_mode(SLEEP_MODE_IDLE);
  29.        
  30.     while (1)
  31.     {
  32.                
  33.                 cli();
  34.                                                
  35.                         State ++;
  36.                                
  37.                 if (State > 0x03) {
  38.                                 State = 0x00;
  39.                         }
  40.  
  41.                 switch (State)
  42.                 {
  43.                         case 0x01:
  44.                                 PORTB &= ~(1<<LED);                                     // Turn on LED
  45.                                 _delay_ms(50);                                          // 50 ms on
  46.                                 PORTB |= (1<<LED);                                      // Turn off LED
  47.                                 break;
  48.                
  49.                         case 0x02:
  50.                                 PORTB &= ~(1<<LED);                                     // Turn on LED
  51.                                 _delay_ms(50);                                          // 50 ms on
  52.                                 PORTB |= (1<<LED);                                      // Turn off LED
  53.                                 _delay_ms(250);                                         // 250 ms off
  54.                                 PORTB &= ~(1<<LED);                                     // Turn on LED
  55.                                 _delay_ms(50);                                          // 50 ms on
  56.                                 PORTB |= (1<<LED);                                      // Turn off LED
  57.                                 break;
  58.  
  59.                         case 0x03:
  60.                                 PORTB &= ~(1<<LED);                                     // Turn on LED
  61.                                 _delay_ms(50);                                          // 50 ms on
  62.                                 PORTB |= (1<<LED);                                      // Turn off LED
  63.                                 _delay_ms(250);                                         // 250 ms off
  64.                                 PORTB &= ~(1<<LED);                                     // Turn on LED
  65.                                 _delay_ms(50);                                          // 50 ms on
  66.                                 PORTB |= (1<<LED);                                      // Turn off LED
  67.                                 _delay_ms(250);                                         // 250 ms off
  68.                                 PORTB &= ~(1<<LED);                                     // Turn on LED
  69.                                 _delay_ms(50);                                          // 50 ms on
  70.                                 PORTB |= (1<<LED);                                      // Turn off LED
  71.                                 break;
  72.                 }
  73.                 sei();
  74.                 sleep_mode();
  75.     }
  76. }


Hogy lehet összébb nyomni a sorokat a Kód-ban?

Köszi.
(#) csabeszq válasza zombee hozzászólására (») Nov 28, 2015 /
 
Ugyanarról az FTDI hibáról beszélünk. Ötször kell bedugni, hogy egyszer felismerje.

Én pontosan ezért nem rendelek olyan cuccot, amiben FTDI van.
(#) Gj hozzászólása Nov 28, 2015 /
 
Üdv!
Valaki tudna példakódot adni SPI-s digitális potméter vezérlésére AVR-hez?
Konkrétan ezt a potit szeretném használni. Googlizással nem jutok sehova

Nem is feltétlen kell példakód, elég lenne az is, hogy bitről-bitre mit és miért küldjek neki SPI-n, ha be akarok állítani egy értéket.

Előre is köszönöm!
(#) tursaba válasza Gj hozzászólására (») Nov 28, 2015 /
 
Szia! Az adatlapja (.pdf) nem elég hozzá?
(#) Gj válasza tursaba hozzászólására (») Nov 28, 2015 /
 
Hát nekem sajnos nem
Megpróbáltam megérteni és igazából minden egyéb rendben is van, de azt a részt, ahol az SPI-t magyarázzák, nem értem
(#) Vacok hozzászólása Nov 28, 2015 /
 
Sziasztok!

Tudnátok nekem abban segíteni, hogy egy Atmega328 eepromja miért felejti el az elmentett adatokat?
Egy óra programja úgy van megírva, hogy minden ciklusban az avr az eepromba elmenti az időt, áramszünet esetén ezt tárolja magában, ha visszatér az áram az eepromból betölti. A program biztos jó, mert másik két avr-nél működik. Egy harmadiknál meg, hogy megjegyzi, hogy nem.
(#) Gj válasza Vacok hozzászólására (») Nov 28, 2015 /
 
Nekem olyan hibám volt egyszer egy mega8-cal, hogy az egyik ADC-je folyton hülyeségeket mért. Felprogramoztam egy másikat, betettem a helyére és tökéletesen működött, pedig mind két MCU zsír új volt. Szerintem nincs különösebb oka, egyszerűen gyári hibás...
A hozzászólás módosítva: Nov 28, 2015
(#) Vacok válasza Gj hozzászólására (») Nov 28, 2015 /
 
Ez szomorú, akkor megyek veszek új avr-t.
(#) Bakman válasza Vacok hozzászólására (») Nov 28, 2015 /
 
Egy ciklus mennyi időt takar? Magyarán milyen gyakorisággal történik írás az EEPROM-ba?
(#) Gj hozzászólása Nov 28, 2015 /
 
Üdv!
Ma elég sok mindent olvastam az I2C-ről, UART-ról és az RS485 buszról és kissé összezavarodtam.

Úgy szeretném kihasználni az RS485 által nyújtott távolságot, hogy közben I2C jeleket küldök rajta.
Ha fogok egy Max 232 IC-t (például ezt) és az AVR-en lévő I2C busz SDA-ját a max232-n keresztül rátolom egy csavart érpárra, az SCL-jét pedig egy másikra és így építek fel belőle egy rendszert, az működne? Van valami probléma/buktató?
A hozzászólás módosítva: Nov 28, 2015
(#) Vacok válasza Bakman hozzászólására (») Nov 28, 2015 /
 
Erre sajnos nem tudok válaszolni. A program 769 sorból áll, 8MHz az órajel.
(#) kendre256 válasza Gj hozzászólására (») Nov 28, 2015 /
 
Milyen távolságról lenne szó? Egy régi berendezésünkben az I2C minden különösebb gond nélkül elment 2-3 méterre, pedig eredetileg nem erre találták ki.
Szerk: A jelek lapos 8 eres vezetéken mentek RJ45-ös csatlakozón.
A hozzászólás módosítva: Nov 28, 2015
(#) Gj válasza kendre256 hozzászólására (») Nov 28, 2015 /
 
Ide tuti nem lesz elég
30-50m
(#) pont válasza Gj hozzászólására (») Nov 28, 2015 /
 
Ha esetleg az MCP41010 is megfelel, annál egyszerűen két byte-on, először dec17-et (B XX01XX01)kell küldeni a második byte meg a beállítandó érték. Kicsit bonyolultabban: az első byte bináris egyes és kettes helyi értéke adja, láncba kapcsolt potiknál a kijelölést, hogy melyik potinak szól a parancs, ha ez 01 akkor a 0. A 16-os és 32 helyi érték adja a parancsot, 01, hogy beírás következik, a többi helyi értéknek nincs szerepe. Tehát mondjuk a fél állásba hozatal (dec128)az Binárisan10000000,00010001 kell küldeni. Bascomban ez ennyi:

W(1) = 17
W(2) = 128
Spiout W(1) , 2
A hozzászólás módosítva: Nov 28, 2015
(#) zombee válasza Vacok hozzászólására (») Nov 29, 2015 /
 
Ha minden másodpercben mentesz akkor bukó, mert az EEPROM minden egyes bitje csak 100000 írást bír el hivatalosan. Biztosan lehet több is, aztán lesz pár bithiba, de még megy egy darabig aztán kuka. A többi is így fog járni, hidd el.
(#) Bakman válasza Vacok hozzászólására (») Nov 29, 2015 /
 
Eléggé fura megoldás az időt EEPROM-ban tárolni. zombee leírta a lényeget. Nem lett volna jobb egy RTC használata? Azt éppen ilyenre találták ki.
(#) zombee válasza Bakman hozzászólására (») Nov 29, 2015 /
 
Én anno az RTC-t magában az AVR-ben oldottam meg, egy akvárium világítás dimmeléséhez és kapcsolásához kellett. A lényeg hogy az AVR érzékelje ha elmegy az áram, és akkor nem hajtja sem a kijelzőt, sem a meghajtókimenetet, csak az óra megy...
(#) Bakman válasza zombee hozzászólására (») Nov 29, 2015 /
 
Ha van benne RTC, akkor úgy a legésszerűbb.
(#) Vacok válasza Bakman hozzászólására (») Nov 29, 2015 /
 
Egy már kész kapcsolás építettem meg, amihez a program is meg volt írva. Annyira még nem vagyok otthon a program írásban, hogy magam írjam meg.
Mindegy is, akkor ez így ragadt, ez legyen a legnagyobb baj, max. nem jegyzi meg az időt, az óra ettől függetlenül működik.
(#) Gj válasza Gj hozzászólására (») Nov 29, 2015 /
 
Valaki tudna nekem válaszolni?
Idézet:
„Üdv!
Ma elég sok mindent olvastam az I2C-ről, UART-ról és az RS485 buszról és kissé összezavarodtam.

Úgy szeretném kihasználni az RS485 által nyújtott távolságot, hogy közben I2C jeleket küldök rajta.
Ha fogok egy Max 232 IC-t (például ezt) és az AVR-en lévő I2C busz SDA-ját a max232-n keresztül rátolom egy csavart érpárra, az SCL-jét pedig egy másikra és így építek fel belőle egy rendszert, az működne? Van valami probléma/buktató?

Kb. 30-50m lenne a vezeték hossza.

Előre is köszönöm!
A hozzászólás módosítva: Nov 29, 2015
(#) fecus válasza fecus hozzászólására (») Nov 29, 2015 /
 
Senki? Valami evidens hülyeséget csináltam?
(#) rolandgw válasza fecus hozzászólására (») Nov 29, 2015 /
 
Első ránézésre: uint8_t State=0x00; a 9. sorban,volatile nélkül.
(#) kapu48 válasza fecus hozzászólására (») Nov 29, 2015 /
 
Szerintem, nincsen ami kihozza a sleepböl a procit!

Atyn25 nél ezek lehetnének:
  1. #define SLEEP_MODE_IDLE         0      // tétlen
  2.     #define SLEEP_MODE_ADC          _BV(SM0)     // ADC
  3.     #define SLEEP_MODE_PWR_DOWN     _BV(SM1)   // PoWeR Down
  4.     #define SLEEP_MODE_PWR_SAVE     (_BV(SM0) | _BV(SM1))


Vagy ha már indítottál timert? A túlcsordulás megszakítás rutint meg kellene írni! abban ki léphetnél Sleep-böl!
A hozzászólás módosítva: Nov 29, 2015
(#) rolandgw válasza kapu48 hozzászólására (») Nov 29, 2015 /
 
Szerintem is így gondolta,akkor viszont kell a volatile és 35.-39.-ig megy a megszakításba.
Következő: »»   708 / 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