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   611 / 837
(#) Droot válasza killbill hozzászólására (») Júl 6, 2014 /
 
Sziasztok!

Köszönöm a kimerítő válaszokat! Az strstr módszerrel semmi gond nincs, a programom másik részén működik, itt az atoi 0-val tér vissza, az rxbuffal van gond mert ha előtte manuálisan belerakom a csq: 19-et akkor megy. Nem q betűt, :ot hanem azt kell keresni hogy csq, mert más at parancsok is lesznek benne. Tehát a kérdésem az hogy ott amit bemásoltam miért nem megy.


Azért nem /nre várok mert nem küld, cr lfet küld minden csomag végén, de az időtúllépéses jól működik. Az a baj ha cr lfre várok hogy nem tudom hány csomag jön vissza.
(#) killbill válasza Droot hozzászólására (») Júl 6, 2014 /
 
Szia!

Az strstr modszerrel gond lesz, ha nincs a bufferben a keresett string, az biztos. Ilyen esetben inkabb strncmp()-t hasznalnek.

Nem ertem, hogy mi a gondod, mert elozoleg azt irtad, hogy a bufferben benne van a kivant szoveg. Most meg azt mondod, hogy ha beleteszed a szoveget, akkor mukodik. Akkor most benne van, vagy nincs? Az strstr meg az itoa ugy kellene mukodjon. Az RxBuffer hogyan van deklarava?

A '\r' a CR (0x0d), a '\n' meg az LF (0x0a). Tehat kuld a modem '\n'-t. Persze az idofigyeles is kell, de amikor mar az lejar, akkor az azt kellene jelentse, hogy elveszett a valasz. Meg illene figyelni az erkezett byte-ok szamat is, mert amig jon karakter, te csak rakod a pufferbe.
(#) zombee válasza yohnsee hozzászólására (») Júl 6, 2014 /
 
Dióda 1206-ban? Még nem láttam olyat, pedig naponta többszáz fajta alkatrésszel találkozom,
mivel SMD-beültető gépeket programozok. Szerintem SOD80 (hengeres) vagy SOD123 (lábas),
esetleg MELF lesz. Az 1N4148 létezik SOD80 és SOD123 tokozásban is, ezek ráférnek a 1206-ra.
A MELF diódák (pl. 1N4002) számára nagyobb fólia kell, én is szívtam vele mikor 1406-ra terveztem...
A hozzászólás módosítva: Júl 6, 2014
(#) yohnsee válasza zombee hozzászólására (») Júl 6, 2014 /
 
ööö...hengeres, és pont illik a 1206-os pad-ra. Ezt elírtam
Szerk.: most nézem, hogy amúgy létezik Katt!
A hozzászólás módosítva: Júl 6, 2014
(#) killbill válasza yohnsee hozzászólására (») Júl 6, 2014 /
 
Sőt, letezik 0805-ben is 1N4148.
A hozzászólás módosítva: Júl 6, 2014
(#) yohnsee válasza killbill hozzászólására (») Júl 6, 2014 /
 
Csak győzzem nagyítóval
(#) killbill válasza killbill hozzászólására (») Júl 6, 2014 /
 
Bolondokat beszeltem, helyesbitek. Az strstr() is NULL-t ad vissza, ha nem talalja a substringet.
(#) killbill válasza yohnsee hozzászólására (») Júl 6, 2014 /
 
Pici, nem mondom. De legalabb nem gurul el, mint a hengeres.
(#) yohnsee válasza killbill hozzászólására (») Júl 6, 2014 /
 
Végülis, ahol veszem, 1ft-al drágább a lapos. Lehet, ennyit megér a sok mérgelődés, mert az a kis piszok tényleg mindig megtalálja, hogy merre nem vízszintes az asztalom
(#) holex hozzászólása Júl 6, 2014 /
 
Nem igazán értem ezt az analog comparator dolgot az atmega328p adatlapjában. Van olyan lehetőség, hogy az ADC folyamatosan mér (de nem állandóan a programban kérdezem le az értékét, hanem megy magától, mint a timer), és ha az érték meghalad egy bizonyos, előre beállított értéket, akkor generál egy megszakítást? Mintakódot is elfogadok (ha lehet akkor az ADC0 beolvasásával együtt, mert még sosem csináltam ilyet).

Más: az AREF nekem egy 100nF-es kondival GND-re volt kötve, az AVCC pedig 5V-ra. Elvileg ha analóg bemenetet is használunk, akkor ezeken valamit módosítani kell. De pontosan mi is?
(#) zombee válasza yohnsee hozzászólására (») Júl 7, 2014 /
 
Ok, ma én is tanultam valami újat. A hengeres szerintem SOD80 lesz.
(#) Massawa válasza yohnsee hozzászólására (») Júl 7, 2014 /
 
Ezért dolgozok már évek ota egy gumi lábtörlön, amiben kis mélyedések vannak és erröl nem gurul messze semmi. (Autok hátso gumiszönyege még vékonyabb )
(#) Droot válasza killbill hozzászólására (») Júl 7, 2014 /
 
Köszönöm szépen az építő jellegű kritikákat! Hasznosnak találom, mivel saját magam szórakoztatására tanultam meg programozni, tehát saját magamtól senki sem tanított, így jól jönnek a javaslatok.

Tehát az az érdekes, hogy úgy tűnik mintha az strstr nem tudná feldolgozni az RxBuff változó értékét, ugyanis leteszteltem, hogy az RxBuff-t kiírattam LCD-re és benne volt az érték megfelelően, de az strstr nem dolgozta fel. Amikor az strstr előtt beleírtam az RxBuff-ba (így: RxBuff[0]='C'; RxBuff[1]='S'; stb...) akkor működött.

Így deklaráltam: char RxBuffer[150]="";

Az UART ISR-ben jó ötlet figyelni hogy ne írja bele folyamatosan a vett adatokat, hanem csak addig amennyi karakter van deklarálva az RxBuffer tömbben. (Bár nem kaphat annyi sokat a modemtől, de ártani nem árt, használni meg valamikor használhat... )

A modem kommunikáción sokat gondolkoztam, mondok egy példát bekapcsoláskor ezeket küldi el:
  1. RDY CR LF
  2. CR LF CFUN: 1 CR LF
  3. CR LF CPIN: Ready CR LF
  4. CR LF Call Ready CR LF
  5.  
  6. CR LF *PSNWID: ...... CR LF
  7. CR LF *PSUTTZ: ... CR LF

Tehát itt pl a PSNWID-től a DST-ig egy csomagként kezeli jelenleg, van hogy a PSNWID-t a Call Ready előtt küldi el.

Próbáltam csomagonként is feldolgozni, de kicsit bizonytalan volt a működése, mivel 0-24 órában működni fog ezért próbálom a lehető legstabilabbra megcsinálni.

Igen, az strstr NULL-t ad vissza ha nem szerepel, ezt pl a Call Ready vizsgálatakor is figyelem, amiket fentebb leírtam ha nem NULL-al egyenlő az strstr értéke akkor a GSMReady változót szépen egyesével növeli, és ez alapján ad hibaüzenetet is (pl nincs SIM, SIM PIN be) hogy mennyi a GSMReady értéke.
(#) csabeszq hozzászólása Júl 8, 2014 /
 
Lenne egy SPI-s kérdésem. A kommunikáció olyan, hogy a mester 1 byte-ot küld (vezérlés), 1 byte-ot fogad (érzékelő).

A kérdés, hogy az érzékelő adatait hogyan lehet megbízhatóan átküldeni a mester felé. A specifikáció szerint átvitel közben az SPDR-t nem lehet írni.

Mikor kell a slave-nek az SPDR-t beállítani?

- megvan az eredmény, beírja a slave az SPDR-be (de mi van, ha éppen átvitel van és felülvágom rossz adattal?)
- elküldök egy bájtot, hogy az érzékelő adata kell, elküldöm a következőt, amiben kiolvasom (interrupt is van, fogalmam sincs, hogy a slave feldolgozza-e amit elküldtem)

Hogyan szokták megoldani?
A hozzászólás módosítva: Júl 8, 2014
(#) papa22 hozzászólása Júl 8, 2014 /
 
Sziasztok napokban vásároltam az avr-tavir shopjábol egy arduino unot hozzá ezt a fedpanelt Bővebben: Link és egy 20X4 es LCD modult hozzá egy i2c ilesztöt Bővebben: Link a fedpanelen van i2c kivezetés elöször arra kötötem de semmi majd utána olvasva rájötem hogy az analog 4 és 5 re kell kötni ezt is megtettem de semmi nem jelenik meg az LCD-n vajon mit rontotam el esetleg valakinek valami ötlet minta program az ilesztö ic-je pcf8574t adress-t lekérdeztem 0x27 segitségeteket elöre is köszönöm .
(#) Ivan93 hozzászólása Júl 8, 2014 /
 
Üdv!
Van egy hc-sr04 ultrahangos távolságmérőm, amit Fizikus írása alapján input capture-el rákötöttem az atmega8-ra. Így magában szépen küldi soros porton a meglepően pontos adatokat.
Hogy forgatni tudjam, rászereltem egy szervóra, amit a timer2 pwm vezérel. A szervó rendesen mozog, de a távolságmérő csak nullákat küld addig, amíg egy mérés idejére össze nem zárom az echo és a gnd lábait. Ezután már jó adatokat kapok.
  1. void initPWM2servo()
  2. {TCCR2|=(1<<WGM21)|(1<<WGM20); //fast pwm
  3. TCCR2|=(1<<CS22)|(1<<CS21)|(0<<CS20); //256 prescaler,(kb 8ms és jó)[ocr2=22-72 ~150°]
  4. TCCR2|=(1<<COM21)|(0<<COM20); // non-inverting
  5. DDRB|=(1<<PB3); //oc2 kimenet
  6. }
  7.  
  8. int main(void)  // Foprogram
  9. {
  10. uart_init(9600);
  11. initPWM2servo();
  12. DDRD |= (1<<PD7); //Trigger pin kimenet
  13. DDRB &= ~(1<<PB0); //Echo pin bemenet
  14. sei(); //globalis megszakitasok engedelyezese
  15.  
  16. uart_puts("\n\rTavolsagok\n\rBalra\tElore\tJobbra\n\r");
  17.  
  18. while(1)
  19. {
  20. OCR2=Bal;
  21. _delay_ms(300);
  22. Trigger();
  23. _delay_ms(50);
  24. Tavolsag = Time*10/54;
  25. itoa(Tavolsag, tavol_bal, 10);
  26. ...
  27. strcat(adat, tavol_bal);
  28. strcat(adat, elv);
  29. ...
  30. uart_puts(adat);
  31. for(int i=0;i<20;i++){adat[i]=0;} // korábbi törlése (jó)
  32. _delay_ms(2000);
  33. }//while
  34. }//main
Ezt a kódot próbáltam, az ismétlődő részeket kipontoztam, nem szükséges részeket kitöröltem.
A segítséget előre is köszönöm!
Iván
(#) kapu48 válasza csabeszq hozzászólására (») Júl 8, 2014 /
 
Itt minden kérdésedre megtalálod a válaszokat:
SPI használata AVR-rel:
Bővebben: Link
(#) kapu48 válasza csabeszq hozzászólására (») Júl 8, 2014 /
 
A protokólt pedig ki kel találni!

Pl.: Ha nem használsz a Byteban minden Bitet a vezérlésre?
Akkor 1 kijelölt bitet invertál a Slave, és úgy küldi vissza a kapott adatot.
Ebből már megtudod, hogy az előző parancsot pontosan megkapta és végrehajtotta a címzett.

Vagy mindkét oldalon szinkronban fútt 1 – 1 számláló, és a slave ezt az értéket küldi vissza.
Ebből látod, ha lemaradt 1 utasítás végrehajtása.
...
(#) TavIR-AVR válasza papa22 hozzászólására (») Júl 8, 2014 /
 
Az fenn van a Shop letölthető mintái közt:
Bővebben: Link
Mellékeltem, és a bekötést is.
A hozzászólás módosítva: Júl 8, 2014
(#) papa22 hozzászólása Júl 8, 2014 /
 
TavIR AVR köszönöm a segitséged letöltötem a mintákat fel is töltötem az unora a helloworld_i2c minta programot mindenféle krix krax már megjelent de nem a program adott részében irt hallo arduino szöveg, és háttér világitást mért nem kapcsolja be? Vagy a háttér világitást nem az i2c ilesztö vezérli?
(#) TavIR-AVR válasza papa22 hozzászólására (») Júl 8, 2014 / 1
 
Felteszed a libraries alá.
Utána Arduino elindít.
File->Minták->Liquidcrystal->TavIR_I2C


Az általad hivatkozott programban a
  1. LiquidCrystal_I2C lcd(0x38);  // Set the LCD I2C address

sort cseréld ki
  1. LiquidCrystal_I2C lcd(0x27, 6, 5, 4, 3, 2, 1, 0, 7, POSITIVE);  // Set the LCD I2C address

sorra.


A külön háttérvezérlés a távolkeleti paneleken van. Itt ugyanúgy a PCF8574 bővítőchip vezérli és a lcd.backlight(); és az lcd.nobacklight(); sorokkal lehet ki/bekapcsolni.
A hozzászólás módosítva: Júl 8, 2014
(#) papa22 válasza TavIR-AVR hozzászólására (») Júl 8, 2014 /
 
Két nap szivás után végre müködik hála neked nagyon szépen köszönöm a segitséged további szép estét.
(#) csabeszq válasza kapu48 hozzászólására (») Júl 9, 2014 / 1
 
Köszi, a megoldás az interruptok körül lesz.

- az interruptnak adott időn belül ki kell lépnie (mondjuk 100 ciklus)
- egy PCINT-et felrakok az SS lábra
- Amikor az SS lábat alacsonyra állítom, a slave berakja a kívánt választ
- várok 200 ciklust, hogy biztosan végrehajtódjon
- elküldöm a parancsot és beolvasom a választ
- SS-t visszaállítom
(#) kapu48 válasza csabeszq hozzászólására (») Júl 9, 2014 /
 
Egészen jó, (tanítani kellene az ötletedet)!
(#) kapu48 válasza papa22 hozzászólására (») Júl 10, 2014 /
 
Kicsit keresel a Googlen: HU gcc string függvények

C string műveletek (string.h alkalmazása)

5. strchr – strrchr : karakter keresés stringben
Vagy:
8. strset – strnset : karakterek beállítása megadott karakterre

Mire válaszoltam törölték a hozzászólást!
A hozzászólás módosítva: Júl 10, 2014
(#) Massawa hozzászólása Júl 14, 2014 /
 
Nem akar müködni a szorzom:
  1. mul16x8:  
  2.    ; mu8x16: x= 16bit, a=8bit, [y] = result from freqcalc
  3.         mul xl,a                ; multiply xl and a
  4.         std y+1,mh              ; store direct to y+1 space
  5.         std y+2,ml
  6.         mul xh,a
  7.         ldd mt,y+1              ;load direct from y+1 data space
  8.         add ml,mt               ; add ml to mt
  9.         adc mh,zero             ; add with carry
  10.         stw y,m                 ; store word into
  11.         ret


Az mh és az ml regiszterekben még stimmel, de amikor átirom az y-be (stw y,m) már nem tudom helyesen visszaolvasni.
Az eredmény egy 3 bytes word.

Kösz minden segitséget.
(#) rolandgw válasza Massawa hozzászólására (») Júl 14, 2014 /
 
Esetleg a macro-t nem kéne megadni (stw),ha már rákérdezel a működésére ?
A dseg-ben hogy csináltad a byte foglalást,az Y mire mutat ?
(#) Massawa válasza rolandgw hozzászólására (») Júl 14, 2014 /
 
A RESULT mint változo definiálva van mint .byte 3.
Valahol hiányzik a RESULT meg az Y regiszterek viszonya. Azt hiszem átirom egyszerübb formába.
A macro jo, azt már használtam korábban is:

  1. .macro  stw
  2.         st      @0+,@1h
  3.         st      @0+,@1l
  4. .endmacro


A célom az lenne, hogy utánna a resultot betöltve egy regiszterbe tovább tudjam használni:

  1. ldiw y, result          ; load result into y (3 byte)


itt az ldiw macro (az is gyakran lett már használva a kodban)

kösz
A hozzászólás módosítva: Júl 14, 2014
(#) rolandgw válasza Massawa hozzászólására (») Júl 14, 2014 /
 
  1. ldi  YL (result)
  2. ldi  YH(result)

Ez lenne a viszonya.
(#) Massawa válasza rolandgw hozzászólására (») Júl 14, 2014 /
 
Itt keveredik el mindig az eredmény. Az mh, ml - ben még jo, de amikor az SRAM-ba elrakom oda már rossz számok kerülnek, igy az ldiw ami ugyanaz, mint a te 2 sorod, a rossz eredmény jelenik meg az Y regiszterekben, de az az érzésem hogy itt valamit rosszul írok vagy értelmezek.

Kösz megyek még rágodni, csak most nem tudom futtatni, mert nincs itt a HW.
Következő: »»   611 / 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