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   727 / 840
(#) zombee válasza p5efv hozzászólására (») Márc 10, 2016 /
 
A szimulátorra nem lehet építeni semmit, főleg időzítők esetén nem működik!
(#) zombee válasza zombee hozzászólására (») Márc 11, 2016 / 1
 
Ha jól emlékszem a korábbi hozzászólókra: a szimulátorban a TCNT nem indul el, innentől kakukk.
A hozzászólás módosítva: Márc 11, 2016
(#) rolandgw válasza zombee hozzászólására (») Márc 11, 2016 /
 
Elindul, viszont a mega162 szimulációja a studio4 óta nem támogatott.
@p5efv
Idézet:
„ha akkor jön egy megszakítás, aminek a jelzőbitje ugyanabban a regiszterben van, amelyikben éppen törlök egy másik jelzőbitet, akkor nem hajtódik végre a megszakítás.”

Végrehajtódik.A megszakítás kezelést nem ajánlott kód közepébe tenni.
A hozzászólás módosítva: Márc 11, 2016
(#) rolandgw válasza rolandgw hozzászólására (») Márc 11, 2016 /
 
Az utolsó mondat csak egy megjegyzés,nem a hiba oka.Ha az eredeti kóddal nem lép be, az szimulátor hiba.
(#) zsozsoX hozzászólása Márc 12, 2016 /
 
Sziasztok! SPI-n kellene vezérelnem 5v-os kontrollerrel 3v-os eszközt, lényegeben egy irányban. Használjak sima feszültségosztót vagy van valami más megoldás?
(#) kameleon2 válasza zsozsoX hozzászólására (») Márc 12, 2016 /
 
Szia! Ha az eszköz (a leírását meg kellene nézni) 5V toleráns, akkor nincs gond. De működik az ellenállásosztó is. Például így.. De használhatsz level translator chipet is, vagy optót, izolátort, pénztárcától és feladattól függően. De akár egy sima soros ledet is. Akkor visszajelzésed is lesz a kommunikációról. A leden ugyanis közel 2V esik.
(#) zsozsoX válasza kameleon2 hozzászólására (») Márc 12, 2016 /
 
Szia! Egy kijelzőt kellene vezérelni az 5v-ot nem tolerálja.
(#) FDAssasin válasza Sick-Bastard hozzászólására (») Márc 12, 2016 /
 
Az égvilágon semmit nem állítottam. De ha jól tudom, eleve a külső kristályt használja, ha nem írok át semmit. Bootloader nincs benne. Az usbasp egy isp programozó nem?
(#) csatti2 válasza zsozsoX hozzászólására (») Márc 13, 2016 /
 
Gondolom 16MHz vagy hasonló órajel mellett 8MHz-es SPI-t használnál. Ilyen sebességnél már IC-t kell használni, egy olcsó 74HC4050 még elég jó lehet. A CD4050 már nem elég gyors. Jó választás lehet még pl. az LVC család (74LVC541, vagy hasonló, ez a család kifejezetten alkalmas 5V és 3V3 illesztésére az 5V toleráns bemenetek miatt, sok ide tartozó IC open-drain kimenetekkel rendelkezik így Vcc feletti feszt is kiadhatunk felhúzó ellenállással, persze ez neked most épp nem kell ).
(#) csatti2 válasza FDAssasin hozzászólására (») Márc 13, 2016 /
 
A belső RC oszcillátort használják 8-as osztóval alapértelmezetten. Azaz 1MHz-en működik. Ha a külső kristályt akarná alapból használni, akkor nem lehetne visszakonfigurálni az IC-t olyankor, amikor nincs külső kristály.
(#) rolandgw hozzászólása Márc 13, 2016 /
 
Elnézést a C kérdésért, miért kapok syntax error-t,ha értékeket adok a tömbnek? Egyenlőre csak itt próbáltam.
  1. void (* const foo[])(void)

  1. void (* const foo[])(void)={.....}  //error
A hozzászólás módosítva: Márc 13, 2016
(#) FDAssasin válasza csatti2 hozzászólására (») Márc 13, 2016 /
 
12.000 van a programozó kristályára írva. Egyébként igen, a 328-as egy 16 megás kristályt kapott, de még nem tudtam beállítani. Szóval, most mit csináljak? csak smd kialakítású hex buffert tudok használni? Mert azzal elèg sokat szórakoznék mire ráforrasztanám a lapra... Raspberry Pi-vel sem tudnám programozni a 328-at? Csak mert ott elvileg megvan a magas órajel (850MHz nálam) és ott az avrdude + a gpio tűk. Vagy ez nem számít? Mert inkább veszek pár jumpert és programozok shellen keresztül, mint bénázok smd forrasztással
(#) kapu48 válasza rolandgw hozzászólására (») Márc 13, 2016 /
 
Kell a végére ;-jel!

  1. void (* const foo[])(void)={1,2,3,4};
(#) rolandgw válasza kapu48 hozzászólására (») Márc 13, 2016 /
 
Köszi, véletlen maradt le. A linkelt értelmezőn így is error-t kapok, de lehet hogy megvezet.
(#) Kovidivi válasza rolandgw hozzászólására (») Márc 13, 2016 /
 
Pointerrel lesz gondod. Miért kell a const elé a csillag? Értékadásnál nem a foo()=(1,2,3,4); kellene? Telefonról nincs semmi rendes zárójel.
(#) killbill válasza kapu48 hozzászólására (») Márc 13, 2016 / 2
 
Ez egy fuggvenypointer tomb. Ennek hogyan akarsz 1,2,3,4 ertekeket adni?
(#) csatti2 válasza FDAssasin hozzászólására (») Márc 13, 2016 /
 
A buffer IC-t nem neked írtam, hanem zsozsoX-nak.

Én egy Atmel-ICE-al (eredeti) programozom és debugolok. Korábban egy MkII-est (szintén eredeti) használtam de az ICE sokkal megbízhatóbb (az MkII gyakran kavart debugWire és ISP kapcsolgatáskor, illetve a PDI használatakor is voltak gondok), de egy 3-4 dolláros arduino UNO-t is fel lehet programozni programozónak. Annak a hogyanjait viszont inkább az Arduino fórumon kérdezd.
(#) rolandgw válasza killbill hozzászólására (») Márc 13, 2016 /
 
Az értékeket nem én írtam...nem ezeket akarom,csak bedobtam a linkre próbára.
(#) Sick-Bastard válasza FDAssasin hozzászólására (») Márc 13, 2016 /
 
Üdv!

Ha külső kristályt szeretnél használni, akkor előtte át kell állítani a fuse biteket.

Első lépés kapcsolat tesztelése. Ehhez kösd össze az usbasp-t és a 328ast ISP-n keresztül, majd parancssorban futtasd a következő parancsot:
L:\avrdude -c usbasp -p m328p
Nekem az avrdude.exe az L: meghajtóban található.

Ha minden ok, akkor kiírja az IC típus azonosítóját és a fuse bit beállításait.
Ha itt hibázott, nem sikerült, akkor a kapcsolást újra kell ellenőrizni.

A következő paranccsal átállítjuk a fuse biteket:
L:\avrdude -c usbasp -p m328p -U lfuse:w:0xff:m -U hfuse:w:0xd0:m -U efuse:w:0xff:m

Én itt még egyszer le szoktam futtatni az első parancsot, hogy lássam a fuse biteket, jól állította e be.

Aztán következhet a hex égetése:
L:\avrdude -c usbasp -p m328p -U flash:w:file_nev.hex

Itt kérnék egy kis felvilágosítást, ha rosszul tudnám:
A bootloader tartalmú hex fileokban, az address byte kezdete nem 0x0000, hanem (esetünkben) 0x3800-el kell kezdődnie, stimmel?
(#) rolandgw válasza rolandgw hozzászólására (») Márc 13, 2016 /
 
Bocs,benéztem, eddig még nem használtam a linket. A kifejezéseket már nem tudja értelmezni.
(#) killbill válasza rolandgw hozzászólására (») Márc 13, 2016 /
 
Idézet:
„Az értékeket nem én írtam...nem ezeket akarom,csak bedobtam a linkre próbára.”

Ok, igazad van. Viszont ez:
  1. void func1(void);
  2. void func2(void);
  3.  
  4. void (* const foo[])(void) = {func1, func2};

Minden gond nelkul lefordul. Inicializalja a const tombot. Hogy erre miert kapsz syntax error-t, azt el nem tudom kepzelni.
(#) kapu48 válasza killbill hozzászólására (») Márc 13, 2016 /
 

Igazad van! Nem gondoltam egészen át a problémát!

De a rossz beszolásom következménye, hogy végül meg találtad a helyes választ a kérdésre!
(#) rolandgw válasza killbill hozzászólására (») Márc 13, 2016 /
 
Még nem fordítottam, mert kuszaság van.Csak próbára beírtam ide, aztán rájöttem,hogy csak a deklarációkkal birkózik meg
Bővebben: Link
(#) kapu48 válasza rolandgw hozzászólására (») Márc 13, 2016 /
 
Én már teszteltem, az éppen gépen levő deszkán (Due).
tökéletesen müködik!
  1. // Arduino Due Timer Interrupt teszt
  2.  
  3. #include <DueTimer.h>
  4.  
  5. volatile void tooglePortA(uint8_t pin);
  6. volatile void tooglePortB(uint8_t pin);
  7. volatile void tooglePortC(uint8_t pin);
  8.  
  9. int ledPin = 13;
  10. int RXledPin = 72;      //      PC.30
  11. int TXledPin = 73;      //      PA.21
  12.  
  13. bool debugPrint = 1;
  14. uint32_t First = 0;
  15. uint32_t Second = 0;
  16. uint32_t Third = 0;
  17. uint32_t timer6 = 0;
  18.  
  19. volatile void (* const foo[])(uint8_t) = {tooglePortA, tooglePortB, tooglePortC};
  20.  
  21.  
  22. //************************************** TimerX.attachInterrupt() ***************************************************
  23. void firstHandler(){
  24.         First++;
  25.         //tooglePortA(21);      // Toogle TX_LED D73 PortA.21
  26.         foo[0](21);
  27.         if(debugPrint){
  28.                 Serial.print(F("[-   ] 500ms First Handler! "));
  29.                 Serial.println(First);
  30.         }
  31. }
  32.  
  33. void secondHandler(){
  34.         Second++;
  35.         //tooglePortB(27);      // Toogle D13 PortB.27
  36.         foo[1](27);
  37.         if(debugPrint){
  38.                 Serial.print(F("[ -  ] Freq  1, Second Handler! "));
  39.                 Serial.println(Second);
  40.         }
  41. }
  42.  
  43. void thirdHandler(){
  44.         Third++;
  45.         //tooglePortC(30);      // Toogle RX_LED D72 PortC.30
  46.         foo[2](30);
  47.         if(debugPrint){
  48.                 Serial.print(F("[  - ] Freq 10, Third Handler! "));
  49.                 Serial.println(Third);
  50.         }
  51. }
  52.  
  53. void Timer6Handler(){
  54.         timer6++;
  55.         //tooglePortC(30);      // Toogle RX_LED D72 PortC.30
  56.         if(debugPrint){
  57.                 Serial.print(F("[++++] Every 600_000ms, Timer6 Handler!    "));
  58.                 Serial.println(timer6);
  59.         }
  60. }
  61.  
  62. //************************************** setup() ***************************************************
  63. void setup(){
  64.         //Serial.begin(9600);
  65.         Serial.begin(57600);
  66.  
  67.         pinMode(ledPin, OUTPUT);
  68.         pinMode(RXledPin, OUTPUT);
  69.         pinMode(TXledPin, OUTPUT);
  70.  
  71.         Timer3.attachInterrupt(firstHandler).start(500000); // Every 500ms
  72.         Timer4.attachInterrupt(secondHandler).setFrequency(1).start();
  73.         Timer5.attachInterrupt(thirdHandler).setFrequency(10);
  74.         Timer6.attachInterrupt(Timer6Handler).start(600000000); // Every 600000ms
  75. }
  76.  
  77. //************************************** loop() ***************************************************
  78. void loop(){
  79.         delay(2000);
  80.  
  81.         //debugPrint = 0;
  82. }
  83.  
  84. //************************************** tooglePortX() ***************************************************
  85. /* Toogle D73 PortA.21
  86.  * PIOB_ODSR • PB0-PB31: Kimenet állapota?
  87.  *      0: Az adatok, hogy hajtott az I / O vonal 0.
  88.  *      1: Az adatok, hogy hajtott az I / O vonal 1.    */
  89. volatile void tooglePortA(uint8_t pin){
  90.         if(REG_PIOA_ODSR && (1 << pin)){
  91.                 // Turn off B27 (should be about equivalent to digitalWrite(13, 0))
  92.                 REG_PIOA_CODR = 1 << pin;
  93.         }else{
  94.                 // Turn on B27 (should be about equivalent to digitalWrite(13, 1))
  95.                 REG_PIOA_SODR = 1 << pin;
  96.         }
  97. }
  98.  
  99. /* Toogle D13 PortB.27
  100.  * PIOB_ODSR • PB0-PB31: Kimenet állapota
  101.  *      0: Az adatok, hogy hajtott az I / O vonal 0.
  102.  *      1: Az adatok, hogy hajtott az I / O vonal 1.    */
  103. volatile void tooglePortB(uint8_t pin){
  104.         if(REG_PIOB_ODSR && (1 << pin)){
  105.                 // Turn off B27 (should be about equivalent to digitalWrite(13, 0))
  106.                 REG_PIOB_CODR = 1 << pin;
  107.                 Timer5.stop();
  108.         }else{
  109.                 // Turn on B27 (should be about equivalent to digitalWrite(13, 1))
  110.                 REG_PIOB_SODR = 1 << pin;
  111.                 Timer5.start();
  112.         }
  113. }
  114.  
  115. /* Toogle D72 PortC.30
  116.  * PIOB_ODSR • PB0-PB31: Kimenet állapota
  117.  *      0: Az adatok, hogy hajtott az I / O vonal 0.
  118.  *      1: Az adatok, hogy hajtott az I / O vonal 1.    */
  119. volatile void tooglePortC(uint8_t pin){
  120.         if(REG_PIOC_ODSR && (1 << pin)){
  121.                 // Turn off B27 (should be about equivalent to digitalWrite(13, 0))
  122.                 REG_PIOC_CODR = 1 << pin;
  123.         }else{
  124.                 // Turn on B27 (should be about equivalent to digitalWrite(13, 1))
  125.                 REG_PIOC_SODR = 1 << pin;
  126.         }
  127. }


A beépített három LED villogtatása
A hozzászólás módosítva: Márc 13, 2016
(#) kapu48 válasza kapu48 hozzászólására (») Márc 13, 2016 /
 
Ha valaki tesztelné!
Bővebben: Link
A hozzászólás módosítva: Márc 13, 2016
(#) FDAssasin válasza Sick-Bastard hozzászólására (») Márc 13, 2016 /
 
  1. Microsoft Windows XP [verziószám: 5.1.2600]
  2. (C) Copyright 1985-2001 Microsoft Corp.
  3.  
  4. D:\AVRDUDE>avrdude -c usbasp -p m328p
  5.  
  6. avrdude: warning: cannot set sck period. please check for usbasp firmware update
  7. .
  8. avrdude: error: programm enable: target doesn't answer. 1
  9. avrdude: initialization failed, rc=-1
  10.         Double check connections and try again, or use -F to override
  11.         this check.
  12.  
  13.  
  14. avrdude done.  Thank you.
  15.  
  16.  
  17. D:\AVRDUDE>avrdude -c usbasp -p m328p
  18.  
  19. avrdude: warning: cannot set sck period. please check for usbasp firmware update
  20. .
  21. avrdude: error: programm enable: target doesn't answer. 1
  22. avrdude: initialization failed, rc=-1
  23.          Double check connections and try again, or use -F to override
  24.          this check.
  25.  
  26.  
  27. avrdude done.  Thank you.
  28.  
  29.  
  30. D:\AVRDUDE>


ezt kapom vissza... szakadásjelzővel pedig az összes forrasztás jó. Szóval nem értem...
(#) Sick-Bastard válasza FDAssasin hozzászólására (») Márc 14, 2016 /
 
Üdv!

Milyen USBasp-t használsz? Én ezt építettem meg.

  1. avrdude: warning: cannot set sck period. please check for usbasp firmware update

Ezt akkor írja ki, ha régebbi a benne lévő firmware, ami még nem kezeli az órajel sebességet software-esen. (Google keresgélésből ezt szűrtem le.) Ettől még működhet.

  1. avrdude: error: programm enable: target doesn't answer. 1
  2. avrdude: initialization failed, rc=-1
  3.         Double check connections and try again, or use -F to override
  4.         this check.
  5.  
  6.  
  7. avrdude done.  Thank you.


Ezt akkor kapom ha, nincs meg egy vagy több kapcsolat az USBasp és a cél AVR között.
Vagy ha: (remélem ez lesz a megoldás)
Alacsony órajelű AVR-t szeretnél programozni. Alacsony órajel, mint esetedben is a "szűz" AVR gyári fuse bitekkel, ahol a valós órajele csupán 1Mhz.

Megoldás: Az USBasp-n kell lennie egy jumpernek, amit össze kell kötni. Az én esetemben ez a JP3 (jumper 3) Slow SCK.
(#) FDAssasin válasza Sick-Bastard hozzászólására (») Márc 15, 2016 /
 
Nekem is van JP3 rajta (ebayről rendeltem), összekötöttem egy jumperrel. Ugyanazt kapom vissza sajnos.
(#) Sick-Bastard válasza FDAssasin hozzászólására (») Márc 15, 2016 /
 
Sajnos tanácstalan vagyok.
Kipróbáltam mindent a tesztpanelemen, ami eszembe jutott.
A hibát csak rossz bekötéssel, alacsony órajellel vagy annak hiányával tudtam reprodukálni.

Tudnál képeket küldeni a panelekről ill. kapcsolási rajzokat?
(#) p5efv válasza rolandgw hozzászólására (») Márc 16, 2016 /
 
Köszi a válaszokat. Közben sikerült kipróbálnom a valóságban is és valóban a szimulátor hibája.
Következő: »»   727 / 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