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   744 / 837
(#) zombee válasza Optimaster hozzászólására (») Szept 8, 2016 / 2
 
Először is:
  1. #include<avr/eeprom.h>

Egy olvasás:
  1. uint8_t temp = eeprom_read_byte((uint8_t*)i);

Egy írás:
  1. for(int i=0; i<codesize; i++) eeprom_write_byte((uint8_t*)i,code[i]);


Ez a "durva" használat, az EEPROM bájtjait sorszámmal indexelem. Létezik pointeres megoldás is, kicsit elegánsabb de gyakorolni kell:
  1. const uint8_t EEMEM x[1] = {127};
  2. uint8_t temp = eeprom_read_byte(x);

A tömbös deklarálás a pointerezést váltja ki.
A hozzászólás módosítva: Szept 8, 2016
(#) Optimaster hozzászólása Szept 9, 2016 /
 
Köszönöm a segítséget sikerült megoldani!
(#) alita hozzászólása Szept 10, 2016 /
 
Sziasztok !
Megépitettem a csatolt fájl szerinti MK II programozót.Sajnos a firmware-t nem tudtam többszöri
próbálkozásra betölteni a Flip rendszerrel.Mindent átvizsgáltam nagyitóval,müszerrel és mindent
rendben találtam.Két hasonló kapcsolási rajzot megnéztem és a resetek 10 K ellenállással,mig a
HWG egyik esetben 10 K,mig a másik esetben 1 K ellenállással csatlakozik a + táphoz.Az én
kapcsolásom 470 Ohm-al csatlakozik mindkét esetben.
Lehetséges,hogy ez okozza a problémámat,vagy valami más ?
Bizom segitő készségetekben.
(#) kapu48 válasza alita hozzászólására (») Szept 10, 2016 /
 
Inkább igy fogalmaznám:
Biztos ez okozza a problémádat!
(#) alita válasza kapu48 hozzászólására (») Szept 11, 2016 /
 
Köszönöm a tanácsot.Élek vele.
(#) zombee válasza alita hozzászólására (») Szept 11, 2016 /
 
Ez saját terv vagy így találtad? A HWB és RESET felhúzói jó ha 2k fölött vannak.
Nálam 4k7 biztos ami biztos alapon, amúgy 10k a standard, amit a gyártó ajánl.
A C1-C2 esetén nem biztos hogy egészséges a 16MHz és 33p párosítás, 18-22p kell oda!

Nálam egyébként akkor okoz hibát a FLIP-es letöltés, ha az UCAP kondit (nálad C3, 1uF)
elfelejtem beültetni. Ez nagyon fontos az USB-kommunikációhoz, és csak 1µF lehet(+/- 20%).
(#) suszitibi hozzászólása Szept 14, 2016 /
 
Sziasztok
Segítséget szeretnék kérni. Van egy Atmega32-höz való programom, amit szeretnék megváltoztatni. Ez egy midi harmonika, aminek a nyomásszenzor (fújtató dinamika) görbéjét kellene kicserélni. Valamiért nem tudom megoldani, a régi módszerrel. A programmer notepad és mfile nevű programokat használtam eddig, win7-en. Most win8.1 van, de már az Atmega88-ra sem tudom megcsinálni, ami régen működött. Meg van a függvény is, meg minden, csak annyi lenne, hogy az új függvény bekerüljön a programba és kapjak egy hex fájlt.
Köszönettel, ha valaki segítene.
Üdvözlettel: Tibi
(#) yodee hozzászólása Szept 15, 2016 /
 
Üdv Mindenki!

Szeretném a segítségetek kérni. Fel kellene programoznom egy ATTINY13-at. Atmel Studio 7-el próbálkozom, windows 7 alatt. Itt van a program, és le van írva hogy belső oszcillátor 9,6 MHz. Ez pontosan mit jelent? Felprogramoztam, de a hallhatatlan hangok helyett hallható a tartomány amit produkál. Mi lehet a baj?

Köszönöm
(#) rascal válasza yodee hozzászólására (») Szept 15, 2016 /
 
Az oszcillátora frekvenciáját a fuse biteken keresztül kell programoznod. Ezek nem a forráskódban állíthatóak, hanem külön felületen. A gyári beállítás általában 1MHz. Csak óvatosan, mert ha mást is elállítasz a fuse bitekben mint ami kell, akkor akár ki is zárhatod magad az AVR-ből. Kicsit olvass utána, ha még nem volt dolgod a fuse bitekkel.
(#) yodee válasza rascal hozzászólására (») Szept 15, 2016 /
 
Ezt látom, ha ránézek a fuse bitekre. Melyik kellhet nekem?

en.jpg
    
(#) rascal válasza yodee hozzászólására (») Szept 15, 2016 /
 
Maga az oszcillátor beállítás jó, a "CKDIV8"-ból vedd ki a pipát, mert ez a beállított órajelet a nyolcad részére osztja. Mielőtt átállítod, ha van ott "SAVE", akkor mentsd el a jelenlegit. Nekem eddig még nem nagyon kellett fuse bitekkel variálnom, ezért is javasoltam, hogy tanulmányozd a témát előtte.
(#) suszitibi hozzászólása Szept 16, 2016 /
 
Sziasztok
Mivel senkitől nem kaptam választ, tovább kérdezek.
Néhány oldallal előbb, ezt a választ kaptam:

A kulcs az hogy a programod "include" része HELYESEN hivatkozzon az összes külső forrásfájlra, különben nem fog lefordulni a programod. Nem utolsó dolog ha azonos mappában vannak, de nem feltétel! A kulcsszó a helyes útvonalmegadás(lásd: LUFA programok).
Fordítás: AVR Studio (4) esetén "Save All", F12 (clean), majd F7 (Make). A hex fájl ez után általában a "default" mappába kerül(AVR Studio) vagy ahová a makefile definiálja.

Mivel a WinAvr-rel nem jön össze a dolog, megpróbáltam ezt a módszert. A save all és a clean meg is van. A gond az, hogy nálam nincs make lehetőség. Az Avr Studio 4.18 van fent. Export makefile az van, de ez csak a makefilet generálja újra. Hogy a fenébe lesz ebből hex fájl? Már nagyon ideges vagyok, mert sok időt elszúrtam ezzel, a munkám meg nem halad. Tényleg olyan nagy dolog egy hex-et alkotni?
Valaki meg tudná mondani, hol van a make lehetőség az Avr Studioban?
Köszönöm.
(#) aticska válasza suszitibi hozzászólására (») Szept 16, 2016 /
 
Build
vagy F7
(#) rolandgw válasza suszitibi hozzászólására (») Szept 16, 2016 /
 
Szia!
Bővebben: Link
Ha létrehozol egy új projectet a studio automatikus generálja a make file-t.Externált is megadhatsz.Hozzá kell adnod a saját c-t ,h-t a projethez, aztán build. Ez nagy dolog?
(#) suszitibi válasza rolandgw hozzászólására (») Szept 16, 2016 /
 
Köszi mindkettőtöknek.
Igen nagy dolog, ha fogalmam nincs, mit kell nyomni.
Mivel nekem azt írták előzőleg, hogy make. Nem mindegy, hogy készíteni, vagy építeni. Amúgy annyira a make-re koncentráltam, hogy a buld-ot észre sem vettem.
Nagyon köszönöm, megpróbálom.
(#) suszitibi válasza suszitibi hozzászólására (») Szept 16, 2016 /
 
Ez nem akar összejönni. Valaki vállalkozna rá, hogy átküldeném és ránézne, mi lehet a gond. A jelenlegi hex fájl működik, mindössze a szenzor függvényét kellene felülírni. Nekem nem lesz belőle hex, csak makefilet generál.
A másik harmonikánál, az Atmega88-ra meg tudtam csinálni, a Win Avr-rel, de itt nem boldogulok.
(#) jimmi12 hozzászólása Szept 19, 2016 /
 
Sziasztok,

Bascom ill. AVR programozásban kérnék egy kis segítséget, készítettem egy egyszerű kis programot a megszakítás tanulására. A PORTB.2-re van kötve egy kapcsoló ami magas szintre emeli a lábat, ha megnyomom. Alapesetben a főprogram 2 másodpercenként soros port-on kiírja, hogy Hello. Ha megnyomom a gombot elugrik a megszakítás rutinra, de az ott levő szöveget duplán írja ki. Nem tudok rájönni miért, de nem csak egyszer kellene kiírnia?


  1. $regfile = "m1284pdef.dat"                                  ' specify the used AVR
  2.  
  3. $crystal = 16000000                                         ' used crystal frequency
  4. $hwstack = 32                                               ' default use 32 for the hardware stack
  5. $swstack = 20                                               ' default use 10 for the SW stack
  6. $framesize = 60                                             ' default use 40 for the frame space
  7.  
  8. $baud = 19200                                               ' use baud rate 19200 baud
  9.  
  10.  
  11. Dim Timer_flag As Bit
  12.  
  13.  
  14.  
  15. Enable Interrupts
  16.  
  17.  
  18. Timer_flag = 0
  19.  
  20.  
  21. Enable Int2
  22. Config Pinb.2 = Input
  23. Config Int2 = Rising
  24. On Int2 Isr_start_timer1
  25.  
  26.  
  27. '--------------- Fő program -----------------------------------
  28.  
  29. Do
  30.  
  31.     Wait 2
  32.  
  33.     Print "Hello"
  34.  
  35.  
  36.  
  37.  
  38. Loop
  39. End
  40. '------------- Megszakítás rutin -----------
  41.  
  42.  
  43.  
  44. Isr_start_timer1:
  45.  
  46.  
  47.  
  48.   Print "eddig ok"
  49.  
  50.    Timer_flag = 1
  51.  
  52. Return
(#) pont válasza jimmi12 hozzászólására (») Szept 19, 2016 /
 
Próbáld ezt: Bővebben: Link
(#) jimmi12 válasza pont hozzászólására (») Szept 19, 2016 /
 
Helo,

Köszönöm sikerült, csak az Amega1284-nél ezt EIFR regiszternek nevezik, itt az INTF2-es bitet 1-be állítva a return elött már jól működik.
(#) jimmi12 hozzászólása Szept 19, 2016 /
 
Helo mindenkinek,

Ismét segítséget kérnék, szeretnék csinálni egy kis programot aminek a következő lenne a feladata:
- PINB.2-re érkezik egy jel (felfutó él) ez generál egy INT2 megszakítást
- a megszakítás rutinban elindítja a Timer1-et és beállít egy bit-et (timer_flag) jelezvén, hogy megy a timer
- a PortA 0, 1, 2, 3, 4, 5 bemenetekre egymás után érkeznek sorban felfutó élek (amik magas szinten is maradnak), ezeket szeretném a pin change interrupt-al kezelni
- a lényeg, hogy a PortA-ra érkező jelek idejét szeretném megmérni az INT2-hez képest, majd ezeket az időket kiküldeni sorosport-on. (a PortA-ra érkező jelek ideje az INT2-hez képest, az első kb. 1,3ms, a többi ezután kb. 20ms-onként érkezik.

Az program első részét talán jól csináltam, viszont az időmérések nem akarnak sikerülni....

Ha esetleg valakinek lenne ötlete, hogy mit rontottam el, vagy mit kellene másként csinálnom azt megköszönném.

Üdv.: Imi

  1. $regfile = "m1284pdef.dat"                                  ' specify the used AVR
  2.  
  3. $crystal = 16000000                                         ' used crystal frequency
  4. $hwstack = 32                                               ' default use 32 for the hardware stack
  5. $swstack = 20                                               ' default use 10 for the SW stack
  6. $framesize = 60                                             ' default use 40 for the frame space
  7.  
  8. $baud = 19200                                               ' use baud rate 19200 baud
  9.  
  10. $sim
  11.  
  12. Const Maxinput = 10
  13.  
  14.  
  15.  
  16.  
  17. Dim I As Integer
  18. Dim K As Integer
  19. Dim Times(maxinput) As Word
  20. Dim Timer_flag As Bit
  21. Dim Command As String * 4
  22.  
  23. Config Timer1 = Timer , Prescale = 1024
  24. Config Porta = 0
  25.  
  26.  
  27. Enable Interrupts
  28. Enable Timer1
  29.  
  30. Timer_flag = 0
  31.  
  32. Enable Int2
  33. Config Pinb.2 = Input
  34. Config Int2 = Rising
  35. On Int2 Isr_start_timer1
  36.  
  37.  
  38.  
  39. Print "haha"
  40.  
  41.  
  42. '--------------- Fő program -----------------------------------
  43.  
  44. Do
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.   Command = ""
  53.  
  54.  
  55.   If Timer_flag = 1 Then
  56.         K = 0
  57.  
  58.         Enable Pcint0                                      'pin change interrupt engedélyezés pcint0-pcint7
  59.          'Enable Pcint1                                            'pin change interrupt engedélyezés pcint8-pcint10
  60.  
  61.           Pcmsk0 = &B00000001                               'enable pcint0-pcint7  (portA.0-portA.7)
  62.         'Pcmsk1 = &B00000011                                    'enable pcint8-pcint9  (portb.0-portb.1)
  63.  
  64.       On Pcint0 Isr_pcint0                                 'ugrás Isr_pcint0 megszakítás rutinra
  65.       'On Pcint1 Isr_pcint1                                  'ugrás Isr_pcint1 megszakítás rutinra
  66.  
  67.    Else
  68.  
  69.      Disable Pcint0
  70.  
  71.  
  72.  
  73.    End If
  74.  
  75.  
  76.  
  77. Input, Command
  78.  
  79.     If Command = "data" Then
  80.  
  81.  
  82.  
  83.      Print Times(1)
  84.      Print Times(2)
  85.      Print Times(3)
  86.      Print Times(4)
  87.      Print Times(5)
  88.      Print Times(6)
  89.  
  90.  
  91.  
  92.    End If
  93.  
  94.  
  95. Loop
  96. End
  97. '------------- Megszakítás rutinok -----------
  98. Isr_start_timer1:
  99.  
  100.  
  101. Timer1 = 0
  102.  
  103.  Start Timer1
  104.  
  105. ' Print "eddig ok"
  106.  
  107.   Eifr.intf2 = 1
  108.  
  109.    Timer_flag = 1
  110.  
  111.  'Waitms 0.6
  112.  
  113. Return
  114.  
  115. '--------------------------------------------------
  116. Isr_pcint0:
  117.      K = K + 1
  118.  
  119.    If K = 1 Then Times(1) = Timer1
  120.    If K = 2 Then Times(2) = Timer1
  121.    If K = 3 Then Times(3) = Timer1
  122.    If K = 4 Then Times(4) = Timer1
  123.    If K = 5 Then Times(5) = Timer1
  124.    If K = 6 Then Times(6) = Timer1
  125.  
  126.      Stop Timer1
  127.  
  128.    Timer_flag = 0
  129.  
  130.      Pcifr.pcif0 = 1
  131. Return
(#) kapu48 válasza jimmi12 hozzászólására (») Szept 19, 2016 /
 
Én igy csinálnám:
  1. dim times_ As Dword
  2. '------------- Megszakítás rutinok! -----------
  3.  
  4.  
  5. Isr_start_timer1:
  6.  
  7.  TCNT1 = 0 ' Timer1 = 0
  8.  
  9. 'Timer1 = 49911
  10. Start TIMER1
  11. Timer_flag = 1
  12.  
  13. Return
  14. '--------------------------------------------------
  15. Isr_pcint0:
  16.  
  17. '(
  18. 1 TICK = 1/16000000= 0,0000000625sec
  19. 1 Prescale=1024 * 0,0000000625sec = 0,000064sec
  20. ')
  21.  times_ = Timer1 * 64 'micro sec
  22. If Pina.0 = 1 Then Times(1) = time_  ' mis
  23. ...
(#) jimmi12 válasza kapu48 hozzászólására (») Szept 19, 2016 /
 
Az első elgondolásom hasonló volt, az első jel-ig még jónak tűnik, viszont amikor megérkezik a jel a Pina.1-re akkor a Pina.0 magasban van, tehát a Pina.0=1 feltétel is teljesül, ez nem okoz problémát?
(#) kapu48 válasza jimmi12 hozzászólására (») Szept 19, 2016 /
 
Ez elkerülte a figyelmemet!
Ez elkerülte a figyelmemet!
És mért nem mehetnek vissza 0-ba a pinek?
Ha biztosan sorban jönnek a megszakítások?
Jó az index számlálós megoldás.
Csak figyelni kel az index induló és végértékekre.

Igy viszont egyszerübb:
  1. Isr_pcint0:
  2.      K = K + 1
  3.  
  4.   Times(K) = Timer1
  5.  
  6.  
  7.      Stop Timer1
  8.  
  9.    Timer_flag = 0
  10.  
  11.      Pcifr.pcif0 = 1
  12. Return
(#) RoliNyh válasza jimmi12 hozzászólására (») Szept 19, 2016 /
 
Idézet:
„...viszont amikor megérkezik a jel a Pina.1-re...”


De sokból válogathat (azért nem kell rögtön dicsekedni), még sorszámozta is...
Használhattál volna valami szinonímát is...
A hozzászólás módosítva: Szept 19, 2016
(#) jimmi12 válasza kapu48 hozzászólására (») Szept 19, 2016 /
 
Ezt kipróbálom, valóban egyszerűbb, viszont az én verziómban valamiért nem működött az indexelés, fogalmam sincs miért, de nem léptette a K értékét.
(#) jimmi12 válasza RoliNyh hozzászólására (») Szept 19, 2016 /
 
Legközelebb jobban figyelek a fogalmazásra, nehogy félreértés legyen...
Pina.1 értsd.: Porta 1-es láb.
(#) kapu48 válasza jimmi12 hozzászólására (») Szept 19, 2016 /
 
De bemenet esetén Pina = PORT INput A
(Ez Angol!)
A hozzászólás módosítva: Szept 19, 2016
(#) worker hozzászólása Szept 20, 2016 /
 
Kedves Fórumtársak !

Az alábbi program AVR Studio-ban való szerkesztéséhez /szövegbeírás/, fordításához szeretnék segítséget kérni, kifogott rajtam.
Köszönöm
(#) Ivan93 válasza worker hozzászólására (») Szept 20, 2016 /
 
Szia! Mit szeretnél rajta átírni?
(#) rascal válasza Ivan93 hozzászólására (») Szept 20, 2016 /
 
Lehet, hogy csak meg akarja vele nyitni. Most próbálkozom vele én is. C-vel nincs semmi tapasztalatom, és ott tartok, hogy 7-es stúdióval projek/solution megnyitásnál nem talál semmi fájlt amit megnyithatna. Épp afelé mennék, hogy egyesével megnyissam a fájlokat és után esetleg projektként el lehetne menteni.
Következő: »»   744 / 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