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   794 / 794
(#) Sick-Bastard válasza alita hozzászólására (») Szo, 10:11 /
 
Üdv!

Feltételezem, hogy egy SPI/ISP-s felprogramozásra gondolsz.

Fuse Bit Low: 0xE1 ; Fuse Bit High: 0xD9 - gyári konfiguráció. SPI/ISP-n keresztül (is) programozható, de el ne felejtsd, hogy alacsony frekvenciás (~50kHz - javítást kérek ha tévedek) módban kell felprogramoznod.

A két legfontosabb Fuse Bit ez esetben a(z) SPIEN és a RSTDISBL.

SPIEN bit legyen 0 (programmed)
RSTDISBL bit legyen 1 (unprogrammed)

Ha ezek módosulnak (legalább az egyik), akkor SPI/ISP-n keresztül már nem lehet újra programozni, csak más típusú(HVPP - High Voltage Parallel Programmer) programozóval.

SB
(#) alita válasza Sick-Bastard hozzászólására (») Szo, 11:21 /
 
Köszönöm a tanácsot.Szép napot kívánok.
(#) Szasza9668 válasza pont hozzászólására (») Szo, 21:39 /
 
Köszönöm!

Sajnos nem vagyok egy lángelme ezen a téren. Tanulgatom ahogy időm energiám engedi.
A kitűzött cél egy idő kapcsoló amivel lehet a fogyasztót ki és be kapcsolgatni meghatározott idő intervallumban. Azonban ha úgy hozza kedvem bármikor ki és be tudjam kapcsolni a programtól függetlenül. Majd ha eljön az ideje akkor a beállított időkapcsolás vegye át a ki és be kapcsolgatást.

Remélem érthető voltam.

(#) Szasza9668 hozzászólása Szo, 22:33 /
 
Sziasztok!

Közben felmerült még egy kérdés. Ha az avr lábat külső felhúzóval felemelem vcc-re akkor az beolvasáskor 1 lesz, ha lehúzom gnd-re akkor az 0 lesz? Vagy hardveresen hogyan tudnék 1 és 0 eredményt kapni a láb beolvasásakor?
Bascom demót használok.

Bocsánat ha hülyeséget kérdeztem!
(#) kapu48 válasza Szasza9668 hozzászólására (») Vas, 0:52 /
 
Itt 1 demo:
  1. '-----------------------------------------------------------------------------------------
  2. 'name                     : port.bas
  3. 'copyright                : (c) 1995-2011, MCS Electronics
  4. 'purpose                  : demo: PORT access
  5. 'micro                    : Mega88
  6. 'suited for demo          : yes
  7. 'commercial addon needed  : no
  8. '-----------------------------------------------------------------------------------------
  9. '$RegFile = "m88def.dat"
  10. '$RegFile = "m8def.dat"
  11.  
  12. $regfile = "m48def.dat"                                     ' specify the used micro
  13. $crystal = 8000000                                          ' used crystal frequency
  14. '$baud = 19200                                               ' use baud rate
  15. $hwstack = 32                                               ' default use 32 for the hardware stack
  16. $swstack = 10                                               ' default use 10 for the SW stack
  17. $framesize = 40                                             ' default use 40 for the frame space
  18.  
  19.  
  20. Dim A As Byte , Count As Byte
  21.  
  22. 'configure PORT D for input mode
  23. Config Portd = Input
  24.  
  25. 'reading the PORT, will read the latch, that is the value
  26. 'you have written to the PORT.
  27. 'This is not the same as reading the logical values on the pins!
  28. 'When you want to know the logical state of the attached hardware,
  29. 'you MUST use the PIN register.
  30. A = PIND
  31.  
  32. 'a port or SFR can be treated as a byte
  33. A = A And Portd
  34.  
  35. Print A                                                       'print it
  36.  
  37. Bitwait Pind.7 , Reset                                        'wait until bit is low
  38.  
  39.  
  40. 'We will use port B for output
  41. Config Portb = Output
  42.  
  43. 'assign value
  44. Portb = 10                                                    'set port B to 10
  45. Portb = Portb And 2
  46.  
  47. Set Portb.0                                                   'set bit 0 of port B to 1
  48.  
  49. Incr Portb
  50.  
  51. 'Now a light show on the STK200
  52. Count = 0
  53. Do
  54.   Incr Count
  55.   Portb = 1
  56.   For A = 1 To 8
  57.     Rotate Portb , Left                                       'rotate bits left
  58.     Wait 1
  59.   Next
  60.   'the following 2 lines do the same as the previous loop
  61.   'but there is no delay
  62.   Portb = 1
  63.   Rotate Portb , Left , 8
  64. Loop Until Count = 10
  65. Print "Ready"
  66.  
  67. 'Again, note that the AVR port pins have a data direction register
  68. 'when you want to use a pin as an input it must be set low first
  69. 'you can do this by writing zeros to the DDRx:
  70. DDRB =&B11110000  'this will set portb1.0,portb.1,portb.2 and portb.3 to use as inputs.
  71.  
  72. 'So : when you want to use a pin as an input set it low first in the DDRx!
  73. '     and read with PINx
  74. '     and when you want to use the pin as output, write a 1 first
  75. '     and write the value to PORTx
  76.  
  77. End

PORTD a bemenet.
Kimenetek: Kössél 8 LEDet a PORTB-re.

Bővebben: Input
A hozzászólás módosítva: Vas, 0:59
(#) kapu48 válasza kapu48 hozzászólására (») Vas, 1:11 /
 
Rossz lett a link. Keres rá a: CONFIG PORT-ra.

Bővebben: gombok
A hozzászólás módosítva: Vas, 1:14
(#) pont válasza Szasza9668 hozzászólására (») Vas, 9:18 /
 
Szia!

A külső felhúzós eset úgy van ahogy mondod, ha utána gnd-t viszel közvetlenül a pin-re akkor meg nullának méri. Lehet belső felhúzót is használni, csak az nem olyan "erős", de normál esetekben teljesen megfelel, tehát ha egy inputként definiált portnak 1-et adsz azzal kapcsolod be a belső felhúzót.

config pinb.1= input
pinb.1=1
(#) Massawa hozzászólása Vas, 18:35 /
 
Egy kérdésem lenne. Alapbol egy ATmega328P irok egy programot, amihez egy meglehetösen bonyolult HW környezetet épitettem. Ekkor jöttem rá, hogy sajnos a 328P-nek nincs JTAG inteface. Anélkül meg közel lehetetlen összehangolni a hardwarrel mert nem tudom a pricesszorban szimulálni a müködést.
Ezért szereztem egy ATmega128-s procit, ami joval nagyobb mint a 328-s és van rajta JTAG csati igy sok konfliktus nem lehet.
Sajnos mégis lett.
Az m128def.inc-ben többek között a TCCR3A=0x8b vel van definiálva mig a 328-ban nincs, azaz ott én határozom meg a TCCR3A tartalmát.
Nos ez most nekem gondot okoz, mert természetesen konfliktus van a programban. Ez a része a 328-snak viszont a megszakitásokat kezeli igy nagyon nem szeretném változtatni. Az esetleg még meglehetne, hogy egy masik TCCRn-t használok, de nem vagyok benne biztos, hogy az menne-e.
Mit javasoltok az ilyen esetben?
Olyan megoldás kellene ami majd egyszerüen visszavonatkoztathato a 328P-re, mert a cél az, hogy a 128-n kifejlesztett programot majd visszairom a 328-ba.

Kösz
(#) kapu48 válasza Massawa hozzászólására (») Vas, 19:32 /
 
Csak azt nem jelezted, hogy milyen program nyelven akarod ín?

Mivel előzőleg itt Bascomról volt szó, keres rá a help-ben a feltételes fordítás kifejezésekre:
Syntax:
  1. #IF condition
  2.  
  3. #ELSEIF condition
  4.  
  5. #ELSE
  6.  
  7. #ENDIF


Ugyanez C-ben: Bővebben: Link
(#) Massawa válasza kapu48 hozzászólására (») Vas, 20:19 /
 
Kösz.

Én csak sajnos ASM-ben tudok irni.
(#) rolandgw válasza Massawa hozzászólására (») Vas, 20:28 /
 
Ott nincs preprocessor?
Bővebben: Link
Egyébként debugWIRE is van a 328-on.
(#) Massawa válasza rolandgw hozzászólására (») Vas, 20:53 /
 
Nincs.

Az AVR Studio olyan hibát jelez, hogy "Illegal to re-use the TCCR3 as label" és emiatt nem megy az IRQ.

A programban egyszer kell a TCCR3 ,byte 1
(#) rolandgw válasza Massawa hozzászólására (») Vas, 21:33 /
 
Mi nincs? Most linkeltem, hogy van feltételes fordítás ASM-ben. Ott a példaprogram is. Neked kell megírnod, a Studio nem fogja.
(#) Massawa válasza rolandgw hozzászólására (») Vas, 21:50 /
 
Bocs ez természetesen már régen meg van irva. És itt van a konfliktus, mert a 128-sban valahogy máskép kell használni a TCCR3-t. Azt nem tudom, hogy hogyan.. a program maga chip független, eredetileg egy 644-n futott. Onnan vettem át a 328-ra, és már akkor megirtam a feltételes forditást és a 328a-n megy.
(#) Szasza9668 hozzászólása Hé, 0:34 /
 
Sziasztok!

Köszönöm a segítséget mindenkinek!

Bascom szimulátorban tökéletesen fut a programocskám. Már csak a hardware teszt van hátra.

Üdv!
(#) kapu48 válasza Massawa hozzászólására (») Hé, 2:59 /
 
Ezt nem értem, Nem is lehet benne TCCR3A!:
Idézet:
„328-ban nincs, azaz ott én határozom meg a TCCR3A tartalmát.”


A 328-ban csak 3 timer van:
8-bit Timer/Counter0, 16-bit Timer/Counter1, 8-bit Timer/Counter2.
Nem is lehet benne TCCR3A
(#) Massawa válasza kapu48 hozzászólására (») Hé, 7:32 /
 
Az is igaz, ezért mondja, hogy duplán van használva a TCCR3A.
Valoban nincs is használva csak definiálva volt. Azt már kivettem. (A 328ban a definicio nem okozott gondot, mert ott nincs TCCR3A).
Most már csak a TCCR0A/B meg a TIMSK0 okoz gondot, ami van a 328ban is és ott nincs vele gond.

Itt az egész programrész ami megy a 328ban meg a 644-ben, de a 128-ban hibát jelez.
A setbio, outio parancsok jol müködö makrok.

Kösz

IMG_3275.PNG
    
(#) Istvanpisti válasza Massawa hozzászólására (») Hé, 19:35 /
 
Azért van baj a TCCR0A/B-vel, mert a 328 TIMER0 és a 128 TIMER0 nem egyforma funkcionalitású. A 128-nak csak 4 üzemmódja van (Normal, Phase correct PWM, CTC, FAST PWM) és ezek beállításához nem kell két TCCR0 regiszter, mint a 328 esetén, ahol a TIMER0-nak 8 üzemmódja van, amihez kell TCCR0A, és TCCR0B regiszter. A TIMSK is kicsit más a két kontrolleren, a 328-nál mind a három TIMER-hez van egy-egy TIMSK regiszter (TIMSK0,TIMSK1,TIMSK2), míg a 128-nál TIMSK regiszter, a TIMER0,TIMER1, és a TIMER2-höz, és ETIMSK regiszter, a TIMER3-hoz. A 644 és a 328 ebből a szempontból kompatibilisek.
(#) Massawa válasza Istvanpisti hozzászólására (») Hé, 20:17 /
 
Kösz, már én is itt kezdtem pedzegetni a dolgot. Most meg elrontottam az IRQ-t a 328-ban is, igy elöször azt kell rendbe tennem.
Itánna meg kitalálni valamit a 128-ra.
(#) Massawa válasza Istvanpisti hozzászólására (») Hé, 21:05 /
 
Lehetne olyan kapcsolokodot irni ami felismerné, hogy melyik prociban fut a program és az ahhoz valo TIMER rutint választaná (a 328P vagy a 128ashoz irottat)?

Kösz.
(#) Istvanpisti válasza Massawa hozzászólására (») Hé, 22:28 /
 
Azt nem tudom, hogy futás közben magától fel tudja-e ismerni a kontroller típusát, de amit rolandgw fórumtárs belinkelt aszerint lehet, ha a fordításkor megadod neki melyik kontrolleren kellene futnia.

  1. //a háromból kettőt ki kell kommentelni, csak az maradjon, amelyik éppen kell
  2. #define __ATmega328__
  3. //#define __ATmega644__
  4. //#define __ATmega128__
  5.  
  6. #if defined(__ATmega328__) || defined(__ATmega644__)
  7. // ide kellene az a kódrészlet, ami a 328 és 644-nek megfelelő TIMER-eket tartalmazza
  8. #elif defined (__ATmega128__)
  9. // ide kellene az a kódrészlet, ami a 128-nak megfelelő TIMER-eket tartalmazza
  10. #endif

Futásidőben is eldönthető melyik kontrolleren fut a program (én még ilyet nem csináltam), csak a 3 byte-os signature-t kell lekérdezni. Bővebben: Link
(#) Massawa válasza Istvanpisti hozzászólására (») Hé, 22:31 /
 
Köszönöm megprobálok valamit kiötleni. Az egyes rutinokban van olyasmi, hogy megkülönbözteti milyen a processzor ( természetesen manuálisan kell megadni) és az szerint kezeli a rutint.

Lehet, hogy azt használhatnám, hogy a proci defincios adatában keresek olyan változot ami a másikban nincs és ez szerint futna majd a program. De ilyet még soha sem csináltam.
A hozzászólás módosítva: Hé, 22:33
Következő: »»   794 / 794
Bejelentkezés

Belépés

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