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   364 / 840
(#) Robi98 válasza Ricsi89 hozzászólására (») Okt 4, 2011 /
 
Köszönöm szépen az érthető választ.
(#) luxmanpower válasza luxmanpower hozzászólására (») Okt 4, 2011 /
 
Egyébként ez egy gsm modemmel való kommunikációra van. Annyira rájöttem hogy valószínűleg összeakad amikor küld és fogad egyszerre, mert ha a szoftveres flow controlt bekapcsolom, akkor 2-3szor működik, de utána már megint nem, míg újra nem indítom a modemet.
(#) covek válasza KSTEFFY hozzászólására (») Okt 6, 2011 /
 
Humm... ezzel foglalkoztam én is 1-2 hete. Viszont nem emlékszem a target board feszültségének mérésére egy általam látott kapcsoláson sem. Tudnál példát mutatni rá?
(#) norbigal hozzászólása Okt 6, 2011 /
 
Hali

AVR-rel és assembly programozással kapcsoaltban lenne kérdésem, szerintem ide illik legjobban a kérdés :S
8051-es mikrokontrollerről van szó. 2 programot akarnék megírni.
Tehát az egyik egy olyan programamely a nyomógombsor alsó 3 gombjához hozzárendeli a bináris szám helyiértékeit, és a gombok lenyomásának lehetséges kombinációinál a megfelelő LED világít.
A LED-sor címe az XDATA memória 0C001H címe és a megfelelő LED 0 vezérlésre világít,
továbbá a nyomógombsor címe pedig az XDATA: 0C000H és a nyomógomb lenyomásakor ad 0 értéket.
8db LED és 8db nyomógomb van.
(ha a gomb le van nyomva, akkor 0-át jelez, a LED pedig akkor világít ha 0-án van)


A LEDsor és nyomógombok címei, és működése ugyanúgy érvényesek a következő programban is, de itt azt akarnám elérni, hogy a középső gomb lenyomásakor a P1 prthoz csatlakoztatott nyomógombsor beállított értékét írja ki a V1 változóba, felengedéskor pedig a V2 változóba. A gomb felengedése után pedig a LED-soron binárisan jelenjen meg a V1-V2 különbság abszolút értéke.

Már rengeteget agyaltam rajta, de nem tudom megírni. Ha tudtok kérlek segítsetek!
Előre is köszi a választ.
(#) Robi98 hozzászólása Okt 6, 2011 /
 
Sziasztok!
Készítettem egy LED-es futófényt( potméter tekerésére gyorsul), de sajnos az ADC mérés nem tud mindig lépést tartani a potméter tekerésével emiatt sokszor lefagy és ilyenkor mindig muszáj vagyok hardveresen resetelni az AVR-t( a reset lábat földre húzni).Azt szeretném kérdezni, hogy létezik-e olyan megoldás ami ezt szoftveresen megtenné?Azt hiszem, hogy a watchdog timer pont erre való vagy nem? Mert van olyan fuse, hogy watchdog on azt kellene bepipálni? Mert eddig nem nagyon mertem a fuse-kal kisérletezni.
köszi mindenkinek.
(#) sikolymester válasza Robi98 hozzászólására (») Okt 7, 2011 /
 
Hogy erted, hogy nem tud lepest tartani? Az adc ben van sample hold. Tehat ha te olyan gyorsan tekergeted, hogy az adc muvelet elejen mashol allt mint a vegen, akkorsem lenne gond. De elarulok egy titkot: Nincsenek stabil feszultsegek. A logikadbol kiindulva minden adc muveletnek kifagyassal kellene vegzodnie.
Forraskodot kerunk. Kodolasi hiba okozza a fagyast.
(#) Reggie válasza Robi98 hozzászólására (») Okt 7, 2011 /
 
ADC bemeneten levo gyors valtozastol nem fagy ki. Ez programozasi hiba lesz.
(#) Reggie válasza norbigal hozzászólására (») Okt 7, 2011 / 1
 
Hat, ezek eleg egyszeru feladatok, ugyhogy valoszinuleg neked nem is a 8051-el van problemad, hanem az ASM programozassal. Hogy esetleg fejlodj is, a kozvetlen megoldas odaadasa helyett inkabb azt javaslom, hogy az altalad leirt feladatot probald meg pszeudokodkent leirni es ha abban hiba van, akkor szolok. Aztan mehet a kovetkezo lepes.
(#) Robi98 válasza sikolymester hozzászólására (») Okt 7, 2011 /
 
Úgy értem, hogy ha elkezdem a potmétert tekerni a futófény csak később fog változni(kivéve ha nagyon lassan tekerem).
Íme a kód:
  1. #include<avr/io.h>
  2. #include<util/delay.h>
  3.  
  4. int main(){
  5.  
  6. DDRD|=0xFF;
  7. ADMUX=(1<<REFS0)|(1<<ADLAR);
  8. ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);
  9.  
  10. uint8_t ADConverter(unsigned char csatorna)
  11. {
  12. ADMUX|=csatorna;
  13. ADCSRA|=(1<<ADSC);
  14. while(ADCSRA&(1<<ADSC));
  15. ADCSRA|=(1<<ADSC);
  16. while(ADCSRA&(1<<ADSC));
  17. return ADCH;
  18. };
  19.  
  20. unsigned char potmeter,i,j;
  21.  
  22. void szunet(unsigned char n)
  23. {
  24.  
  25. for(j=1;j<=n;j++) _delay_ms(2);
  26. }
  27.  
  28. while(1){
  29.  
  30. i=0b10000000;
  31.  
  32. potmeter=ADConverter(1);
  33.  
  34. while(i){
  35. i=i>>1;
  36. PORTD=i;
  37. szunet(potmeter);
  38. }
  39.  
  40. i=0b00000001;
  41. while(i)
  42. {
  43. i=i<<1;
  44. PORTD=i;
  45. szunet(potmeter);
  46. }
  47.  
  48. };
  49.  
  50. };
(#) Ricsi89 válasza Robi98 hozzászólására (») Okt 7, 2011 /
 
Mi a jó fenét keres a main-ban az adc meg a szünet függvénye? Függvényt írsz függvénybe? Ezeket a main-en kívülre kellene rakni és nem a főprogramba.
(#) sikolymester válasza Robi98 hozzászólására (») Okt 7, 2011 /
 
Azt hiszem értem a problémád.
A gond itt rejlik:
  1. while(i){
  2. i=i>>1;
  3. PORTD=i;
  4. szunet(potmeter);
  5. }
  6.  
  7. i=0b00000001;
  8. while(i)
  9. {
  10. i=i<<1;
  11. PORTD=i;
  12. szunet(potmeter);
  13. }


Tartasz egy jó nagy delayt. Amíg ezen a kettőn nem lép túl a program, addig nem olvassa be az új adc értéket. Ergo: nem is fog reagálni a potméter tekergetésre. De ez azt hiszem magától értetődik.

Megoldás: Az adc -zést interrupttal csináld, és akkor maradhat ez a két delayes while ciklusod.

A függvényeket meg tényleg ne a mainben deklaráld. Kész csoda, hogy nem dobott hibát a fordító.
(#) Reggie válasza Ricsi89 hozzászólására (») Okt 8, 2011 /
 
Nem szamit. A C nyelv nem ismeri a begyazott fuggvenyt es fuggvenyek kozotti hierarchiat, igy nem okoz problemat, ugyan annak minosul, mintha az int main() { ele irta volna a tobbi fuggvenyt.
(#) vagnerjazon hozzászólása Okt 8, 2011 /
 
Üdv.!
Hogyan lehet float-ot elküldeni sorosan? Vagy string-et csinálni belőle, és azt küldeni?
(#) trudnai válasza Robi98 hozzászólására (») Okt 8, 2011 /
 
Nem kell ehhez interruptoznod, csak meshova tenned a beolvasast:

  1. while(i) {
  2.     i=i>>1;
  3.     PORTD=i;
  4.     szunet(ADConverter(1));
  5. }
  6.  
  7. i=0b00000001;
  8. while(i) {
  9.     i=i<<1;
  10.     PORTD=i;
  11.     szunet(ADConverter(1));
  12. }
(#) zombee válasza vagnerjazon hozzászólására (») Okt 8, 2011 /
 
Így nyerheted ki a float "nyers" értékét, pointerrel, ahol az "F" a float változó. Ez bináris érték,
nem küldheted ki String-ként", de ha lassú az átvitel akkor a leghatékonyabban így küldheted át.
Ugyanis csak 4 bájtot foglal. Az adat visszaállítása hasonló, ott is pointerezni kell...
  1. char C[4];
  2. for(uint8_t i=0; i<4; i++) C[i] = (uint8_t)(*(&F+i));
(#) sikolymester válasza vagnerjazon hozzászólására (») Okt 8, 2011 /
 
Ha egyszerűen szeretnéd megoldani, akkor használhatod a fedélzeti eszközöket.
sprintf AVR-ben

Persze ez megnöveli alaposan a lefordult programod, de biztos, hogy működik. Érdemes mindig körülnézni az avrlibc oldalon, ha valami triviálisnak tűnő probléma van. Jó eséllyel megtalálható ott.

  1. #include <avr/io.h>
  2. #include <stdio.h>
  3.  
  4. #define STRING_HOSSZ 9
  5.  
  6. int main(void)
  7. {
  8. float lebegopontos = 12.12457;
  9. char string[STRING_HOSSZ];
  10. snprintf(string,STRING_HOSSZ, "%f" ,lebegopontos);
  11.     while(1)
  12.     {
  13.         //TODO:: Please write your application code
  14.     }
  15. }


Ez így fordult le:

Device: atmega16
Program: 3272 bytes (20.0% Full)
(.text + .data + .bootloader)
Data: 4 bytes (0.4% Full)
(.data + .bss + .noinit)
(#) vagnerjazon válasza zombee hozzászólására (») Okt 8, 2011 /
 
Köszönöm, de arra szeretném használni, hogy fejlesztés alatt számítógépre küldje a részeredményeket, és ezzel a módszerrel, amit írtál, valamiért csak egy N betű jelenik meg a sorosportfigyelő programban. A float-ot nem lehet valahogy stringgé konvertálni, amit aztán elküldene?
(#) sikolymester válasza vagnerjazon hozzászólására (») Okt 8, 2011 /
 
Akkor erre van szükséged:
Using Standard IO streams in AVR GCC
(#) vagnerjazon válasza sikolymester hozzászólására (») Okt 8, 2011 /
 
Köszönöm, nem tudom, mit rontok el, mert nem megy, a szám helyett egy B betű érkezik meg.
(#) vagnerjazon válasza sikolymester hozzászólására (») Okt 8, 2011 /
 
Az a helyzet, hogy én nem az avrstudiot használom, hanem a winavr programmers notepad-ját, és a linkelt oldalon meg ott is állítani kell valamit ha jól látom. De ha ilyen bonyolult, akkor inkább megkérdezem, hogy ha int-et küldenék (kerekíteném a float-ot, mert csak arra kell az egész, hogy fejlesztési fázisban lássak néhány részeredményt, így nem kell teljesen pontosnak lennie), az nem lenne-e egyszerűbb?
(#) sikolymester válasza vagnerjazon hozzászólására (») Okt 8, 2011 /
 
Azért nem megy, mert egy két linker paramétert át kell állítani a Makefileban. A Makefilet gondolom nem nullárol írtad, hanem esetleg a WINAVR-hez kapható mfile programot használtad. Ha utóbbi igaz, akkor itt láthatod, hogy mit kellene állítanod: Bővebben: Link

A kerekítéses dolog természetesen egyszerűbb lenne, meg gyorsabb is, illetve kisebb hex-et eredményezne.

Én azon is elgondolkodnék, hogy nem tudod-e kiváltani a floatokat egészekre. Pl : 1,23 helyett 123-t használsz, de a programod írásánál tudsz róla, hogy a tizedes vessző igazából az 1 után van.

Hogy érthetőbb legyen. Teszem azt távolságokkal dolgozol. És SI rendszerben dolgozol, ezért métert használsz. A legkisebb értéked pedig 0,01m. Ekkor jobban jársz, ha átváltasz cm-re hiszen, akkor nem kellenek tizedesek.

Persze lehet olyan az alkalmazásod, ahol ez nem lehetséges.

Az egész azért fontos, mert a 8 bites AVR-ek nem rendelkeznek utasításokkal, amik kezelnek lebegőpontos értékeket, ezért minden művelet velük nagyságrendekkel több időbe telik.
(#) vagnerjazon válasza sikolymester hozzászólására (») Okt 8, 2011 /
 
Annyit állítottam rajta, hogy a printf() options-nál beállítottam a floating pointot, ahogy a képen van, de nem működik, csak a B betű jön.
(#) zombee válasza vagnerjazon hozzászólására (») Okt 8, 2011 /
 
Igen, csak egy N betű, mert bináris érték, nem String. Egy terminál pedig String-et vár, '\n\r'-el a végén.
Ahogy sikolymester kolléga írja, a konverzió nem túl hatékony, de legalább működik...
(#) luxmanpower hozzászólása Okt 8, 2011 /
 
Hello! soros portból jövő adatokat tárolok egy bufferben, és onnan szeretném kihalászni azt ami kell nekem.

Meg lehet ezt oldani strstr függvénnyel?
(#) vagnerjazon válasza zombee hozzászólására (») Okt 8, 2011 /
 
Jelenleg ott tartok, hogy keresgéltem, és egyenlőre annyit sikerült összeollóznom, hogy pl. ha a float az "12,12457" akkor annyit elküld, hogy "12". A program így néz ki:
  1. #include <avr/io.h>
  2. #include <util/soros_14745600_115200.h>
  3. #include <avr/interrupt.h>
  4.  
  5. float eredmeny = 12.12457;
  6. int er;
  7.  
  8. int main(void)
  9. {
  10.  
  11. KonfigUART();
  12. sei();
  13.  
  14. while(1);
  15.  
  16. }
  17.  
  18. ISR(USART_RX_vect)
  19. {
  20. char data;
  21. data = UARTAdatFogad();
  22.  
  23. er = eredmeny;
  24.  
  25.  UARTAdatKuld('0'+(er/10) % 10);
  26.  UARTAdatKuld('0'+er % 10);
  27.  UARTSzovegKuld("\n\r");
  28. }
Innen még mindig nagy lépés lenne a tizedesvessző, és az utána lévő számok elküldése?
(#) vagnerjazon hozzászólása Okt 9, 2011 / 1
 
Siker! Közben találtam egy oldalt, ahol ugyanaz a megoldás van, amit sikolymester is írt, de valamiért csak azon az oldalon talált működik(az amelyik egy lejjebb lévő hozzászólásban van). Viszont nagyon jól! Most már szépen megjelenik a float úgy ahogy van. Köszönöm mindenkinek aki segített!
(#) Robi98 válasza trudnai hozzászólására (») Okt 9, 2011 /
 
Köszönöm szépen!
Kipróbáltam, most már működik ahogyan a potit tekerem, úgy nő a futófény gyorsasága.
Viszont ha túl letekerem a futófény megáll egy helyben és se ki se be; még ha a potmétert felfelé tekerem akkor sem.Ezért mindig kénytelen vagyok ressetelni(hardveresen).
(#) trudnai válasza Robi98 hozzászólására (») Okt 9, 2011 /
 
Nem jo a 'szunet' fuggvenyed sem!

Ha ezt csinalod:
  1. void szunet(unsigned char n)
  2. {
  3.     for(j=1;j<=n;j++) _delay_ms(2);
  4. }

...akkor mivel 'j<=n' a feltetel, ezert ha n = 255, akkor a feltetel mindig igaz lesz, azaz vegtelen ciklusba kerul... Ugyanis ha j is 255, akkor ugye 'j = n' -nel, utana j-t noveled ugyan, de mivel byte (unsigned char) meretu, azert tul csordul es 0 lesz az erteke. Ekkor pedig 'j < n' feltetel teljesul...

Tehat vagy ez kell:
  1. void szunet( unsigned char n )
  2. {
  3.     for( j = 1; j < n; j++) {
  4.         _delay_ms(2);
  5.     }
  6. }

... vagy amit szoktam javasolni, hogy egyszerubben leirva meg jobb a helzet (nincs felesleges valtozo sem!):
  1. void szunet( unsigned char n )
  2. {
  3.     while ( n-- ) {
  4.         _delay_ms(2);
  5.     }
  6. }
(#) norbigal hozzászólása Okt 9, 2011 /
 
Hali
ELég tanácstalan vagyok, mert nem tudom melyik AVR fejlesztő rendszert válasszam. Két AVR rendszert ismerek, az egyik az AVR Dragon a másik a Thunderbird. A Thunderbird-del az a bajom, hogy - már amennyire én tudom - beépítétett mikrokontroller van, magyarán a fejlesztő panelt kell felhasználnom ha más kapcsolásban akarom használni a mikrokontrollert. A másik, az AVR Dragon amiről viszont semmit nem tudok :S Én személy szerint 8051-es mikrokontrollereket szeretnék programozni, de az AVR Dragon nem értem hogy működik. Én olyat várnék tőle, hogy ebbe már lehet külön-külön mikrokontrollert tenni amit aztán kivehetek és más kapcsolásba tehetek. Ha bővebben tudtok ezekről, vagy rosszul tudom a jellemzőiket, kérlek javítsatok ki, mert nem tudok dönteni, hogy melyik felelne meg nekem :S

Csak egy olyan rendszer kellene ami beleégeti a egy 8051-es mikrokontrollerbe a .hex állományt. Ha tudtok pls segítsetek!
(#) zombee válasza norbigal hozzászólására (») Okt 9, 2011 /
 
A Dragon "csak" programozó. Ezeket tudja: ISP, HVPP/HVSP, JTAG Debugger, debugWire.
Fejlesztőeszköznek a legjobb ha építesz valamit, vagy breadbardon játszadozol.
Esetleg veszel egy hasonlót ami a képen van, egyébként ezt is én építettem.

PICT0220.JPG
    
Következő: »»   364 / 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