Fórum témák
» Több friss téma |
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
Sima portfigyelés és ki be kapcsolás allat nem igazán értem hogy mire gondolsz?
Config Portc = Output config pinb.1=input portb.1=1 Config Timer0 = Timer , Prescale = 1024 On Timer0 , Vilog: Enable Timer0 Enable Interrupts Do if pinb.1=1 then stop timer0 else start timer0 Loop Villog: Timer0 = 100 Toggle Portc.2 Return
Sziasztok!
Minden bizonnyal amatőr és egyszerű kérdéssel fordulok hozzátok, mégpedig az hogy 2 AVR-t SPI-n keresztül minden gond nélkül össze tudok úgy kötni, hogy MOSI > MISO (visszafele is), SCK>SCK? Még nem csináltam ilyet, és már nincsenek meg a fejlesztőpanelek, hogy ki tudjam próbálni. Aki már csinált ilyet, kérem ossza meg a tapasztalatait, véleményét! Ez mennyire befolyásolja a programozásukat, esetleg ellenállással kössem össze az órajel- és adatbuszokat?
Na ma már nem bírok tovább molyolni vele, bedobom ide hátha valaki rögtön meglátja a hibát.
ADC konvertálás ATMega8 PC5/ADC5 lábra egy poti középső lába kötve, másik kettő +5V és test. LCD kijelzőn próbálnám megjeleníteni az értéket, de semmit nem ír az = jel után.
Idézet: „ADMUX = 01000000;” Idézet: „ADCSRA = 10000111;” Ezeket ha jól látom binárisnak szántad, lehet ez az oka, jelenleg decimálisnak "hiszi".
Igen, igy van.
Olyat szeretnék csinálni, hogy egy Attiny13-al hajtsak egy push-pull invertert. A freki az valahol 1-1,5kHz körül lehetne, sima hálózati trafót használnék, az könnyen beszerezhető.
Nagyobb frekin kisebb méretben meg lehetne oldani, viszont a szekundernek olyan 3-350V-ot kéne leadnia, sok menet kell rá, kicsiben az vékony drót, és macerás megtekerni. Meg lusta is vagyok. Szóval, a kérdés az lenne, hogy a tiny13-al megoldható-e hardveresen a push-pull pwm meghajtás kis frekin? Tudtok-e esetleg valami jó leírást avr-pwm témakörben ami hülyéknek szól? Rám férne. Szoftverből meg tudnám csinálni, sok más dolga nincs is a procinak, csak feszt mérni, meg időnként 1-1 impulzust kiadni, viszont mégiscsak elegánsabb lenne hardverből. A doksiját olvasgattam, de hiába, gyakorlatiasabb infó kéne.
Azert eleg bugyuta dolog ez a 0b.... jelolesi modszer. Nem is ertem mert nem lehet egyszeruen hexaban megadni a szamokat, hisz nagyon egyszeru binarisbol hexaba atalakitani. Meg az oktalis jelolesi modszert is eleg furank tartom (talan egy fokkal meg nbugyutabb a 0b-nel is).
Na mindegy, azt tudja valaki, hogy az avr-gcc miert nem optimalizalja a bitfield-es bitmanipulaciokat ki? Tehat ha letre is hoznek egy bitfieldes deklaraciot az ADCSRA-ra, es igy hivatkoznek pl, hogy: ADCSRA.ADIE = 1; akkor abbol egy eleg borzalmas kod generalodik. Konkretan portokon probaltam ezt meg es ott a PORTB |= 1<<4; lefordul bitsetre mig a PORTB.b4 = 1; ossze vissza kodot csinalt. Letezik erre valami megoldas?>>
Régebben énis hasonló problémával küszködtem, de nem találtam más megoldást minthogy "VAGY"-olok a megfelelő bit-re egy 1-est, illetve "ÉS" művelettel az 1-es szám komplemensét. (8bit esetében 254: 0b11101111)
speciel így: PORTB.b4 = 1;
PORTB.b4 = 0;
Köszi
Ott volt a hiba, lehet sose találtam volna meg ui.: bocsi a hosszú kódért, eszembe se jutott, hogy mellékletbe is betehetném.
Nem problema ez nekem, csak csunya Es azonkivul nem ertem, hogy a gcc hogy kepes ezt jobban optimalizalni, mint a bitfieldet? Valahogy az az erzesem ez egy csunya hack lehet a gcc forrasaban, de majd megnezem...
Bugyuta, igaz es nem is szabvany C, de atlathatobb. Regebben en is hexaban irtam, de miota rajottem hogy tudja az avr-gcc ezt, binarisan irom.(Korabbi avr-gcc nem tudta, azt meg en forgattam volt linux ala, lehet lemaradt valami es azert ..?)
Atribute packed -el probaltad? Itt volt szo rola egyszer Bővebben: Link
Mekkora aram kell? Ha csak nehany mA, akkor nagyfesz push pull-ra ott a nixi orak kapcs uzemu tapja (visszacsatolast modositani kell). Ha nagyobb aram kell, szerintem jobban jarsz egy TL494 PWM ICvel, Lasd az adatlapban a 12-30V push pull peldat. (modositva)
Koszi, megnezem majd. Par honapja jatszadoztam el ezzel es akkor valamiert nekem nem SBI CBI lett az eredmeny, tehat odaig el sem jutottam, hogy mekkora a fogalalsi meret stb... De akkor ujra megnezem -- lehet azota faragtak a forditon is.
Koszi a tippet!
Nem nagy áram, pár W-ról van szó csak. Az a helyzet, hogy egyszerűsíteni akarom a dolgot, minél kevesebb alkatrészből megoldani, a tiny13 pont jó lenne a feladatra ha rádobok két logic level fet-et, kis frekin nem is annyira sarkalatos a meghajtó áramkör, meg nem kell ferritmagos tekercset tekernem hozzá. Villanypásztorról van szó amúgy, másodpercenként egyszer fel kell tölteni egy 4-30 mikrós kondit 500V-ra, ha kész van, akkor meg begyújtani egy tirisztort, mérni az akkufeszt, ha merül, akkor ritkítani az impulzusokat, végül kikapcsolni teljesen, ha adott érték alá ment. Persze meg tudom oldani analóg módon is, meg tl494-el, de jóval egyszerűbb így. Akkus üzemnél a hatásfok se mindegy.
Nincsmit Nekem kifejezetten semmi bajom a hosszú kódokkal, sőt lehet hogy elleshetek egy két trükköt az ügyesebbektől
Na sikerült is elrontani
mega88 Fuse biteknél az AVR studioba beállítottam: Ext. Low-Freq Crystal; Ezután megszünt a kapcsolatom az AVR-el. Próbáltam segédórajellel, de nem ment azzal se, vagy nem jól csináltam valamit. Rákötöttem az OSC1-re a jelet, mértem, megvan. Ki kéne venni a kvarcot?
Próbáld meg, hogy addig órakvarcot teszel bele.. elvileg kellene mennie.
Na közbe a számítógépem is meghalt (a másik)
Óra kvarccal elindult az AVR, látom hogy megy a kijelző, csak iszonyat lassú a multiplexelés De a Topi féle programozó így sem éri el, vagy nem jól használom.
Ha jól rémlik van azon egy Jumper, javítsatok ki ha tévedek de az nem a lassabb órajelhez van?
Igen van, rá is tettem, semmi változás nem lett.
Vagy akkor már nem avr studióból kéne programozni, habár felismerte a programozót? Nem találtam semmi konkrétat az alacsony sebességű programozásról.
Közben megoldódott a problémám, szóval már nem kell vele foglalkozni. Bújtam az adatlapot, és építettem 2 fejlesztőpanelt, majd kísérleteztem és közben rengeteg mindent megtanultam az SPI buszról.
A külső órajel max. 1/4-ével lehet prograozni, azaz a SCK lábon ennyi lehet.
A Nquist szabály alapján az órajel max 40%-s...
Most egy 32,768 KHz-es kvarc van a készülékbe.
Próbáltam AVRStudio-ban programozni úgy, hogy rátettem a SLOW_CLK jumpert és a programozó ablakban az ISP frekvenciát 4 KHz-re állítottam. (próbáltam 8 KHz, 1 KHz-el is) De nem találja meg a processzort a programozó. Leszedtem 3 féle windows-os AVRDude-t is. Csak az egyikben volt AVR Doper programozó, de abban sem sikerült. Még a programozót se látta. Már nincs több ötletem... hacsaknem STK 200 lesz belőle, de a gépemen meg nincs párhuzamos port
SLOW_CLK jumpert fel és utánna programozó kihúz-bedug.
Ha rajta van helyesen a kristály akkor mérj rá az XTAL1 és XTAL2-re. Fut-e egyáltalán a processzorod oszcillátora. Ha nem, akkor XTAL1-nél lévő kondi helyére tegyél egy 5-10 pF-os kerámiát, a XTAL2-re meg egy olyan 22pF környékit. Az órakvarcok kapacitása olyan 5-12pF között van, ezért lehet hogy a 22 vagy 33pF-os kondi már sok. Ha így sem, akkor fordítsd meg. 4 KHz-en már nem tudsz biztosíték biteket írni azt hiszem, az AVR Studio tiltja le. AVRDude-al pedig ne HID módban, hanem sima soros módban próbáld. avrdude -p m88 -P COMx -c stk500v2 -U hfuse:r:hfuse.txt -U lfuse:r:lfuse.txt -v -v -v-vel Verbose módba, kettő -v -v -vel meg nagyon-nagyon beszédes módba kapcsolod. Akkor mindent, még a szinkron hibát is kiírja. Emlékezetből írtam, elvileg jónak kell lennie. Én automatizált programozáshoz parancssorból hívott avrdude-ot használok és a saját programozóval. Szóval mennie kell. De arra figyelj, hogy lépj ki az AVRStudióból ha avrdude-al játszol, mert az AVRStudio nagy valószínűséggel fogja a com portot! Szerk: Meg ugye előtte kikapcsoltad a CKDIV8-at.
Köszönöm a választ.
Igen az volt az első, hogy kikapcsoltam a CKDIV8-at. Aztán sikrült alacsony frekire állítani. A proci az fut, megy rajta a program, megy a kijelző is. Mértem is, megy az oszcillátor (habár a 22p kondik maradtak rajta). stk500v2 módban már elértem windows-os felületen a programozót, de olvasákor ezt a hibaüzenetet kaptam: avrdude.exe: stk500v2_command(): command failed avrdude.exe: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check. avrdude.exe done. Thank you. Mindjárt megpróbálom prompt-ból is ahogy írtad. Mod: Mehpróbálom amit rájövök hogy tudnám elindítai az avrdude.exe-t, mert ha futtatom akkor csak egy pillanatra villan be az abla és el is tünik.
Közbe rájöttem, hogy kell prompt-ból csinálni.
De a 4. féle gui-avrdude programban meg lehet adni paramétereket is. Mind dos ablakban, mind win-es ablakban ezt írta nekem: avrdude.exe: Version 5.4, compiled on Jul 15 2007 at 12:37:51 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ System wide configuration file is "C:\Documents and Settings\VZ\Asztal\AVRdude\avrdude.conf" Using Port : com3 Using Programmer : stk500v2 AVR Part : ATMEGA88 Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PC2 RESET disposition : dedicated RETRY pulse : SCK serial program mode : yes parallel program mode : yes Timeout : 200 StabDelay : 100 CmdexeDelay : 25 SyncLoops : 32 ByteDelay : 0 PollIndex : 3 PollValue : 0x53 Memory Detail : Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- --------- eeprom 65 5 4 0 no 512 4 0 3600 3600 0xff 0xff flash 65 6 64 0 yes 8192 64 128 4500 4500 0xff 0xff lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00 calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 Programmer Type : STK500V2 Description : Atmel STK500 Version 2.x firmware Programmer Model: STK500 Hardware Version: 1 Firmware Version: 2.04 Topcard : STK501 Vtarget : 4.6 V Varef : 0.0 V Oscillator : 1.229 MHz SCK period : 2.2 us avrdude.exe: stk500v2_command(): command failed avrdude.exe: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check. avrdude.exe done. Thank you. Gondolom ez nem jelent jót: Oscillator : 1.229 MHz ezt hol lehet állítani? ui.: rajta van a SLOW_CLK jumper, de ha leveszem is ugyanez jön ki.
Ne telepíts mindenféle AVRDude-okat. Használd azt ami a WinAVR-ben van. Mivel az alap rendszer path-ban benne van a WinAVR, ezért bárhonnan path nélkül meghívhatod az AVRDude-ot. WinAVR bin könyvtárában.
A SlowSCK önmagában kevés, mert az a rendszer órajelhez kellhet. Az oszcillátor pedig teljesen más. Az az órajel generátora a programozónak. De neked az SCK periódust kell nézned. Ez 2,2 uS tehát ~ 450KHz. Neked "-i" kapcsoló kell a delay-hez. Ha 32,768 KHz a proci órajele, akkor ez max 8 KHz azaz legalább 125-150 uS kell. Azaz "-i 150" merthogy uS-ben kell megadni a paramétert.
Na most a WinAVR-ben található AVRdude-t használtam és beletettem az "i 150" kapcsolót is, de még mindig nem megy...
SCK period nem változott... Terminal Mode Operation fejezetben van erről valami írva, most azt fordítom. ------------------------------------------------------------------------------------------------------ D:\Prog\WinAVR\bin>avrdude -p m88 -P COM3 -c stk500v2 -U hfuse:r:hfuse.txt -U lf use:r:lfuse.txt -v -v -i 150 avrdude: Version 5.6cvs, compiled on Nov 10 2008 at 17:15:38 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ System wide configuration file is "D:\Prog\WinAVR\bin\avrdude.conf" Using Port : COM3 Using Programmer : stk500v2 Setting isp clock delay : 150 avrdude: stk500_2_ReceiveMessage(): timeout AVR Part : ATMEGA88 Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PC2 RESET disposition : dedicated RETRY pulse : SCK serial program mode : yes parallel program mode : yes Timeout : 200 StabDelay : 100 CmdexeDelay : 25 SyncLoops : 32 ByteDelay : 0 PollIndex : 3 PollValue : 0x53 Memory Detail : Block Poll Page Polled Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW Max W ReadBack ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- --- -- --------- eeprom 65 5 4 0 no 512 4 0 3600 36 00 0xff 0xff flash 65 6 64 0 yes 8192 64 128 4500 45 00 0xff 0xff lfuse 0 0 0 0 no 1 0 0 4500 45 00 0x00 0x00 hfuse 0 0 0 0 no 1 0 0 4500 45 00 0x00 0x00 efuse 0 0 0 0 no 1 0 0 4500 45 00 0x00 0x00 lock 0 0 0 0 no 1 0 0 4500 45 00 0x00 0x00 calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 Programmer Type : STK500V2 Description : Atmel STK500 Version 2.x firmware Programmer Model: STK500 Hardware Version: 1 Firmware Version Master : 2.04 Topcard : STK501 Vtarget : 4.6 V SCK period : 2.2 us Varef : 0.0 V Oscillator : 1.229 MHz avrdude: stk500v2_command(): command failed avrdude: stk500v2_command(): command failed avrdude: stk500v2_program_enable(): cannot get connection status avrdude: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check. avrdude done. Thank you. |
Bejelentkezés
Hirdetés |