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   773 / 837
(#) pont válasza csabeszq hozzászólására (») Máj 5, 2017 /
 
Kipróbáltam. Igazatok van, az alsó sornak 10,02 méternek kell lenni. Úgy kezdtem a kérdést, hogy nagyon kezdő...csak annyi info kellett, hogy a single helyett használjak double-t, Köszönöm mindenkinek.
A hozzászólás módosítva: Máj 5, 2017

2.png

3.jpg
   
(#) killbill válasza pont hozzászólására (») Máj 5, 2017 /
 
Mit probaltal ki? Atirtad az avr.h-t, es ettol barmi is valtozott?
(#) simona hozzászólása Máj 6, 2017 /
 
Sziasztok! Topi cikke alapján sikerült elindulnom és az LED-ek futófény-szerűen villognak, viszont szeretném, ha ez a 3 állapotos (case) ciklus csak egyszer futna végig, és csak akkor, ha egy nyomógombot rövidre zárok egy pillanatra.

Segítenétek, hogy ezt hogyan oldjam meg? Mellékeltem a kódot! (ATTiny45-öt használtam, de van ATMega16, ATTiny44 is itthon)

KÖSZÖNÖM!

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define LED1_ON()    PORTB |=  (1<<PB0)
  5. #define LED1_OFF()    PORTB &= ~(1<<PB0)
  6.  
  7. #define LED2_ON()    PORTB |=  (1<<PB3)
  8. #define LED2_OFF()    PORTB &= ~(1<<PB3)
  9.  
  10. #define LED3_ON()    PORTB |=  (1<<PB4)
  11. #define LED3_OFF()    PORTB &= ~(1<<PB4)
  12.  
  13. void m_delay_10ms(unsigned long val) {
  14.  
  15.     while(val--) _delay_ms(10);
  16. }
  17.  
  18. int main(void) {
  19.  
  20. uint8_t state;
  21.  
  22.     DDRB = (1<<PINB0)|(1<<PINB3)|(1<<PINB4);
  23.     state = 0;
  24.     while(1) {
  25.         switch(state) {
  26.             case 0: LED1_ON();
  27.                     LED2_OFF();
  28.                     LED3_OFF();
  29.                     m_delay_10ms(100);
  30.                     state++;
  31.                     break;
  32.             case 1: LED1_OFF();
  33.                     LED2_ON();
  34.                     LED3_OFF();
  35.                     m_delay_10ms(100);
  36.                     state++;
  37.                     break;
  38.             case 2: LED1_OFF();
  39.                     LED2_OFF();
  40.                     LED3_ON();
  41.                     m_delay_10ms(100);
  42.                     state++;
  43.                     break;
  44.             default: state = 0;
  45.         }
  46.     }
  47.     return 0;
  48. }
(#) Kari55 hozzászólása Máj 8, 2017 /
 
Sziasztok mesterek!

Megépíttettem egy korábbi hozzászólásomban említett AVR-Dopert. Egyik fórumtársunk beprogramozta az Atmegát, de az istennek sem akarja felismerni az eszközt a win10! Az eszközkezelőben a HID menüben megjelenik mint "USB beviteli eszköz", de sem az Atmel-studio, sem az AVR-studio, sem a winavr nem látja.

A NYÁK-ot többször is alaposan átvizsgáltam, kicsöngettem az esetleges zárlat miatt, de semmi változás.
Már nem tudom mit tegyek.

Kérném aki tud segítsen rajtam.

Köszönöm előre is.
(#) rolee900 hozzászólása Máj 8, 2017 /
 
Sziasztok.
Egy programozási problémában szeretnék segítséget kérni.
AVR-ek programozásával foglalatoskodok 3-4 éve, viszont eddig minden projektemet assembly nyelven írtam. Pár ismerősöm unszolására elkezdtem foglalkozni a c nyelv és az AVR-ek összeolvasztásával és rögtön belefutottam abba az idegesítő problémába, hogy nem tudom minden egyes bitnek a helyét meghatározni, így a hiba keresés is problémás :S
A jelenlegi projektem egy led mátrix kijelző. A kijelző kezelést úgy oldottam meg, hogy van egy tömböm, ami az oszlopok és sorok számában pontosan megegyezik a ledek elrendezésével ezt léptetem ki a kimenetre. Ez az Atmega 8-as mikrovezérlőnél be is jött, viszont bővítenem kellett egy 128-as típusra és felborult a dolog. Csak arra tudok gondolni, hogy a tömb olyan memória területre mentődik, amihez tartozik egy fizikai periféria, mert hiába nullázom a tömböt, "szemét" adatok jelennek meg benne.
A tömb deklarálása és feltöltése a main függvényben történik, lokális tömbként.
Úgy is próbáltam, hogy globális ként deklarálom, a program elején, volatile-ként, de ugyan az a tünet. (ha statikus-ként hoztam létre, akkor nem került bele nem kívánt dolog, viszont ugye én sem tudtam módosítani)

Előre is köszönöm a segítséget.
(#) Ivan93 válasza simona hozzászólására (») Máj 9, 2017 /
 
Szia! Gombnyomásra így várhatsz:
  1. while (!(PINB & (1<<PB3))); // gombnyomásra vár
Ezt illeszd be oda ahol várni szeretnél, persze írd át a megfelelő lábra és állítsd bemenetnek. Fontos, hogy ez a program futását megállítja addig, amíg nem nyomod meg a gombot. A szebb és helyes megoldás, ha a gombnyomás generál egy külső megszakítást, ez beállít egy bitet, amit egy if feltétel vizsgál a főprogramban, ha teljesül akkor törli a bitet és lefuttatja a kódot, egyébként mást csinál a program.
Ami nekem nem egyértelmű: ledenként szeretnéd léptetni (ehhez elég a fenti kód), vagy egy gombnyomásra fusson le egy hármas ciklus.
(#) Ivan93 válasza Kari55 hozzászólására (») Máj 9, 2017 /
 
Szia! Sajnos a doper winXP felett nehezen bírható működésre, én inkább készítettem egy stk500-at amikor win7-re költöztem. Ne haragudj, hogy nem említettem ezt múltkor, már teljesen elfelejtettem ezt a problémát, illetve nem is gondoltam arra, milyen OS-t használsz majd.
Ha van rá lehetőséged, próbáld ki xp-s gépen, azzal mennie kell.
(#) Ivan93 válasza rolee900 hozzászólására (») Máj 9, 2017 /
 
Szia! Mivel a tömb a ram-ban tárolódik, szerintem azt nem írhatná át magától egy periféria, azok csak a saját regisztereiket módosítják, bár nem ismerem a 128 felépítését. Ha lehet, tedd fel a kódot, akkor a többiek is könnyeben tudnak majd segíteni.
(#) rolee900 válasza Ivan93 hozzászólására (») Máj 13, 2017 /
 
Köszönöm a választ. A kód elég nagy terjedelmű, megpróbáltam egy kicsit rövidíteni.
  1. #define F_CPU 16000000UL // 16 MHz CPU clock
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <util/delay.h>
  5. #include <math.h>
  6. #include <avr/io.h>
  7. #include <avr/interrupt.h>
  8. #include <avr/sleep.h>
  9.  
  10. #define SDataOut         PA3       
  11. #define Clock            PA4           
  12. #define Latch            PA5           
  13. #define ShiftOutPort PORTA             
  14. #define ShiftOutDDR      DDRA          
  15.  
  16. typedef static volatile unsigned int globalint;
  17. //Változók------------------------------------------
  18. static globalint sectimer=0;    //61* timer interrupt = 1sec
  19.  globalint dot=0;          //dot blinker
  20.  globalint hours=0;             //0-24
  21.  globalint minutes=0;           //0-60
  22.  globalint mode=1;              //mode=1 : timer,  mode=2, ....
  23.  globalint charposition=0;
  24. //Függvények------------------------------------------
  25. //----------------------------------------------------
  26. void screenout(/*volatile*/ unsigned int *kijelzo,unsigned int reverse){
  27.         int i,rowenable;
  28.  
  29.         for(rowenable=0;rowenable<18;rowenable++){
  30.                 //row enable data shift out
  31.                 for(i=0;i<18;i++){
  32.                         if (rowenable==i){
  33.                                 //Siftout1();
  34.                                 PORTA |=  (1<<SDataOut);
  35.                                 PORTA |=  (1<<Clock);
  36.                                 PORTA &= ~(1<<Clock);
  37.                                 PORTA &= ~(1<<SDataOut);
  38.                         }else{
  39.                                 //Siftout0();
  40.                                 PORTA &= ~(1<<SDataOut);
  41.                                 PORTA |= (1<<Clock);
  42.                                 PORTA &= ~(1<<Clock);
  43.                         }
  44.                 }
  45.                 //row shift out
  46.                 for(i=0;i<20;i++){
  47.                         if (kijelzo[i*18+rowenable]){
  48.                                 if (!reverse){//Siftout1();
  49.                                         PORTA |=  (1<<SDataOut);
  50.                                         PORTA |=  (1<<Clock);
  51.                                         PORTA &= ~(1<<Clock);
  52.                                         PORTA &= ~(1<<SDataOut);
  53.                                 }else{//Siftout0();
  54.                                         PORTA &= ~(1<<SDataOut);
  55.                                         PORTA |= (1<<Clock);
  56.                                         PORTA &= ~(1<<Clock);
  57.                                 }
  58.                         }else{
  59.                                 if (!reverse){//Siftout0();
  60.                                         PORTA &= ~(1<<SDataOut);
  61.                                         PORTA |= (1<<Clock);
  62.                                         PORTA &= ~(1<<Clock);
  63.                                 }else{//Siftout1();
  64.                                         PORTA |=  (1<<SDataOut);
  65.                                         PORTA |=  (1<<Clock);
  66.                                         PORTA &= ~(1<<Clock);
  67.                                         PORTA &= ~(1<<SDataOut);
  68.                                 }
  69.                         }
  70.                 }
  71.                 Latchout();             //Shift regiszter Latch out
  72.                 _delay_us(500);
  73.         }
  74. }
  75. //init------------------------------------------------
  76. void init(){
  77.                 DDRA = (1<<SDataOut)|(1<<Clock)|(1<<Latch);
  78.                 TCCR0=(1<<CS02)|(1<<CS01)|(1<<CS00);    //prescaler 1024
  79.                 TIMSK=(1<<TOIE0);       //owerflow interrupt enable
  80.                 sei();  //Global Interrupt Enble
  81. }
  82. int main(void){
  83.          unsigned int kijelzo[20][18]=  
  84.                {{0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1},                                         ........        
  85.          init();
  86.          while(1){      //MainBody
  87.                screenout(kijelzo,0);   
  88.                if (dot){
  89.                                 kijelzo[1][8] = 1;     
  90.                                 kijelzo[2][8] = 1;     
  91.                                 kijelzo[4][8] = 1;     
  92.                                 kijelzo[5][8] = 1;     
  93.                         }else{
  94.                                 kijelzo[1][8] = 0;     
  95.                                 kijelzo[2][8] = 0;     
  96.                                 kijelzo[4][8] = 0;     
  97.                                 kijelzo[5][8] = 0;     
  98.                         }
  99.         }                       //MainBodyEnd
  100.         return 0;
  101. }
  102. //TM0_OVF---------------------
  103. ISR(TIMER0_OVF_vect){
  104.         if (sectimer<61){
  105.                 sectimer++;
  106.         }else{
  107.                 sectimer=0;
  108.                 dot = ~ dot;    //Blinker
  109.         }
  110. }
(#) Sick-Bastard hozzászólása Máj 13, 2017 /
 
Üdv!

Mivel az AVR 8bites, igy célszerűbb 8bites változókat használni, ahol csak lehet.
Próbáld csak volatile unsigned char -ként a változókat használni, ahol a változó nem haladja meg a 255-öt.
A Shiftelést miért saját kóddal végzed? SPI nem lenne jobb? (Vagy foglaltak azok a lábak?)
Mekkora ez a led mátrix(20x18db), RGBs?

Miért ilyen nagy(720byte) a kijelző változó mérete? Ha csak 0-1-et tárolsz benne, akkor 6 byte is elég lenne... 3-3 soronként/oszloponként.
(#) akosnagy hozzászólása Máj 15, 2017 /
 
Sziasztok!

Két ATMEGA328P közt szeretnék kommunikációt megvalósítani, rádióval. Gyakorlatilag távirányító és jármű a cél. Az RX,TX lábakat szeretném fenntartani az USB-nek, tehát I2C-ben gondolkodok (RS-fenetudja milyen port). Van ötletetek? Lehetséges a dolog? Tudnia kell a adó-vevő párnak az I2C-t, vagy elég ha 2 irányú és csak rátolom az adatot?
Köszönöm.
(#) csatti2 válasza akosnagy hozzászólására (») Máj 15, 2017 /
 
Elsőként oszd meg velünk, milyen modullal valósítod meg a rádiókommunikációt. Ennek ismerete nélkül nehéz tanácsot adni.
(#) alita hozzászólása Máj 15, 2017 /
 
Sziasztok!

Tanácsaitokat várom a következő problémám megoldásához:

Véletlen folytán ATXMEGA32A4-UA helyett ATXMEGA32A4U-UA procit rendeltem.Nem tudom
hogyan programozzam fel.Ugyanis a fusebitek: FF,00,7F,EE,EA/0-1-2-4-5/ az első tipushoz.A 32A4U
tipushoz csak 1-2-4-5 tehát 4 féle kell.
Hogyan tovább?

köszönettel a segitségeket.
(#) csatti2 válasza alita hozzászólására (») Máj 15, 2017 /
 
Tessék. Mondjuk tényleg ki akarod kapcsolni a resetet?
Megj.: Közben észrevettem, hogy a 16-osakat jelöltem ki, de ugyanaz mint a 32.
A hozzászólás módosítva: Máj 15, 2017
(#) akosnagy válasza csatti2 hozzászólására (») Máj 15, 2017 /
 
Pont ez a kérdés. Van e erre alkalmas modul?
(#) csatti2 válasza akosnagy hozzászólására (») Máj 15, 2017 /
 
Van. Szétnézhetsz a buta 315 és 433MHz-es modulok környékén (filléresek, de itt bitbangolnod kell). Az elegánsabb bluetooth kiesik, mert elhasználod az RX, TX-et (bár megoldható, hogy több dologra használd).
(#) Ivan93 válasza rolee900 hozzászólására (») Máj 15, 2017 /
 
Nem tudom mi okozhatja a szemetelést, a screenout függvény működését nem látom át. Amikor shifteled az adatokat, én tennék bele egy minimális késleltetést, mert ez így nagyon gyors, hogy bekapcsolod a lábat és a következő utasítás pedig kikapcsolja. Persze ha a shift-regiszter fel tudja dolgozni, akkor nem gond.
(#) killbill válasza csatti2 hozzászólására (») Máj 15, 2017 /
 
Azon felul vannak az SPI-sek, amiket siman lehet meg hasznalni. Van egyiranyu, de vannak ketiranyuak is.
(#) csatti2 válasza killbill hozzászólására (») Máj 15, 2017 /
 
Biztosan van, csak olyat még nem használtam.
(#) akosnagy válasza killbill hozzászólására (») Máj 15, 2017 /
 
Utána néztem hírtelen. Jól gondolom, hogy ez a MISO/MOSI/SCK lábakkal operál?
(#) csatti2 válasza akosnagy hozzászólására (») Máj 15, 2017 /
 
Azok az SPI lábak.
(#) akosnagy válasza csatti2 hozzászólására (») Máj 15, 2017 /
 
Ma is tanultam valamit. Köszönöm!
(#) csabeszq válasza akosnagy hozzászólására (») Máj 15, 2017 /
 
I2C max 2m távolságig használható, viszont 2 kábel elég.
(#) akosnagy válasza csabeszq hozzászólására (») Máj 16, 2017 /
 
2 méter nekem kevés és a kábel sem opció.
Köszönöm mindenkinek!
(#) Primary hozzászólása Máj 17, 2017 /
 
Sziasztok!

Van valakinek esetleg DMX512 dimmerhez (fázishasítás nullátmenet figyeléssel) C kódja magán felhasználásra? Olyan kellene, ami már bevált. Vagy esetleg külön-külön (DMX fogadó, dimmer).

Hendrik Hölscher-nek van egy szépen dokumentált megoldása, hardverileg azt veszem alapul, de a kód assemblyben íródott. Szeretnék módosítani rajta pár dolgot, ami számomra C-ben triviális, asm-ben nem annyira.

Főleg az időhiány miatt nem szeretném 0-ról megírni (bár abból lehet a legtöbbet tanulni), meg nem teljesen egyedi problémához keresek megoldást.

Ez a DMX receiver jó lehet?
(#) wbt hozzászólása Máj 17, 2017 /
 
2db XMEGA osztozna egy SPI-RAM-on. Ezt agyaltam ki, a biztonság kedvéért, ha valaki rápillantana, mielőtt elmegyek az erdőbe... Alapban A_ker/B_ker=1, nulla szinttel kéri a buszt, ha a lefutó él után az A_ok/B_ok=1, akkor megkapta, ha nem, akkor foglalt, visszamegy 1-be, majd újra próbálkozik. Ha megkapta a buszt, akkor folyamatosan 0-ban tartja a kérés patát. Vélemény?

dualpram.jpg
    
(#) csabeszq válasza wbt hozzászólására (») Máj 17, 2017 /
 
AVR alatt mindenképp furcsa egy NAND kaput és demultiplexert látni.

SPI alatt nem látom akadályát, hogy két mikrovezérlő ugyanazt az eszközt használja, igazából a buszhasználatról kell döntened. Ki vezérli a buszt?

- a legnehezebb a kölcsönös kizárás megvalósítása, ki állítja a SEL bitet a multiplexereden
- ha van mondjuk UART/I2C/... kommunikáció a két mikrovezérlő között, akkor
-> 'A' mikrovezérlő megkéri 'B' mikrovezérlőt, hogy olvass az SPI RAM-ból helyettem...
-> vagy 'A' mikrovezérlő megkéri 'B' mikrovezérlőt, hogy engedje el az SPI buszt

Amit akarsz, azt tisztán szoftveresen is meg lehet csinálni, NAND/DEMUX varázslás nélkül. Semmi nem akadályoz, hogy összekösd a két mikrovezérlő MISO/MOSI/SCK/CS vonalait. Amikor egyik vezérel, a másik nem vezérel.

Az interneten SPI multimaster alatt érdemes keresni. Nekem ágyúval verébre lövöldözésnek tűnik ez a megoldás. A feladat legnehezebb része az arbitráció, amelyik eldönti, hogy melyik mesternek van joga adni. Ezt a NAND/DEMUX esetben is meg kell valahogy oldanod.
A hozzászólás módosítva: Máj 17, 2017
(#) wbt válasza csabeszq hozzászólására (») Máj 17, 2017 /
 
Azért döntöttem a hardver mellett, mert mindkét oldalt szakad vagy 3-4 INT aminek lekezelése akár 1msec is lehet és pl. megnézi A, hogy szabad-e az SPI, örül, elkezdi állítani a port irányregisztereit, ekkor bekap egy INTet, közben a másik is még azt látja, hogy szabad, B is nekiesik. INTből vissza meg azt hiszi, hogy nem történt semmi és csinálná A a dolgát, miközben már B fogja a buszt. Biztos meg lehet oldani többszörös ellenőrzéssel, bár az sem alap, mert itt DMA-val birizgálom az SPI-t, szóval az esetleges ütközéseket nem is tudom detektálni. Tehát:
-A: szabad a port?
-Igen
-na, itt esik be egy INT
B: szabad a port?
- Igen, akkor hajrá
- A visszajön INTből. Pfffff
Persze biztos van valami pofonegyszerű megoldás, még túrok egy kicsit.
Köszi a véleményezést!!!
(#) killbill válasza wbt hozzászólására (») Máj 17, 2017 /
 
Amig csak ket eszkoz kuzd a buszert, addig a legegyszerubben ugy tudod megoldani a dontest, hogy az egyik AVR elkeri a masiktol azt. Ha A-nak kell, akkor elkeri B-tol. Ha B odaadja, akkor hajra. Ha egyszer odaadta, akkor addig B nem nyul a buszhoz, amig A vissza nem adja. Ha B-nek kell, akkor egyszeruen hasznalja, es ha kozben A keri, akkor nem adja neki oda. Tehat kell egy REQ A->B iranyba, es kell egy ACK vagy GRANT B->A iranyba. Es ezek utan fizikailag a buszt valoban tudod port engedelyezessel valtogatni, bar nekem tetszik a multiplexer, csak itt tenyleg felesleges.
(#) wbt válasza killbill hozzászólására (») Máj 17, 2017 /
 
Igen, közben én is rájöttem, hogy az MX nem fontos...talán azért tettem bele, hogy a közös SCK ne fusson be az inaktív uCbe és ott INTet okozva, de itt most úgy sem kap kívülről vezérlést (nem slave).
Köszönöm!
Következő: »»   773 / 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