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   547 / 840
(#) ThompsoN válasza elektros90 hozzászólására (») Júl 5, 2013 /
 
Nekem működik ilyen nagy értékekre is.
(#) ThompsoN válasza dokidoki hozzászólására (») Júl 5, 2013 /
 
Nem tudtam, hogy fel kell húzni. De köszönöm a segítséget!

A MOSFET kérdés még adott marad. Miért van az, hogy néha nem indulnak el a ventilátorok, se a LED-ek?
(#) zombee válasza fifadani hozzászólására (») Júl 5, 2013 /
 
_delay_ms(1000) - ez miért nem jó?
(#) fifadani hozzászólása Júl 5, 2013 /
 
Ezt néztem.

  1. void m_delay_10ms(unsigned char val)
  2.          {
  3.         unsigned char i;
  4.  
  5.         for(i=0;i<val;i++)
  6.                 {
  7.  
  8.             _delay_ms(10);
  9.  
  10.         }
  11.  
  12.      }


Majd később:
  1. m_delay_10ms(100);   //x*10ms = Késleltetés



De ctrl+c / v volt... Valaki leírná pontosan, hogy is műkszik ez?
Illetve, az 1 másodperc nem 1 sec.
Attiny13a-val dolgozom, a studioban a fogaskerékben, 4.8Mhz-t, O1-et állítottam be.
F_CPU 4800000
Égetéskor, belső oszci 4,8mhz 14CK+64ms.
De valahogy mégsem jó... Csúszik..
Valaki tud picit segíteni ezekben? Mi miért van. Akár priviben is.

Köszi!
A hozzászólás módosítva: Júl 5, 2013
(#) fifadani válasza zombee hozzászólására (») Júl 5, 2013 /
 
Azért nem akartam, mert azt olvastam, hogy csak 65ms-t képes várni a _delay_ms.
(#) ThompsoN válasza fifadani hozzászólására (») Júl 5, 2013 /
 
Szerintem azért késik, mert a for() lefuttatása is idő.

_delay_ms(1000); teljesen jó lesz.
(#) fifadani hozzászólása Júl 5, 2013 /
 
Nos itt a progi.
  1. //Függvények
  2. #include <avr/delay.h>
  3. #include <avr/io.h>
  4.  
  5. //Processzor órajele
  6. #define F_CPU 4800000
  7.  
  8.  
  9. //Program kezdete
  10.  
  11. int main (void)
  12. {
  13.    DDRB = (1<<PINB3); //Kimenet B3 -> Kimenet
  14.  
  15.    while(1)
  16.     {
  17.  
  18.      PORTB = (1<<PB3);   //PB3 -> "1"
  19.  
  20.        _delay_ms(1000);  
  21.  
  22.          PORTB &= ~(1<<PB3); //PB3 -> "0"
  23.  
  24.            _delay_ms(1000);  
  25.  
  26.  
  27.     }
  28.  
  29.  
  30. }

Ugye 1 ledes villogóval kezdtem az egészet. Valamiért nem 1 másodperc az időzítés.
(#) fifadani hozzászólása Júl 5, 2013 /
 
Ezt égettem most be az attiny-be.

  1. //*********************************
  2. //
  3. // Cím: Első programom
  4. // Leírás: 1 led villogtatása
  5. // Dátum: 2013.07.05.
  6. // Verziószám: 1.0
  7. //
  8. //*********************************
  9.  
  10.  
  11. //Függvények
  12. #include <avr/delay.h>
  13. #include <avr/io.h>
  14.  
  15. //Processzor órajele
  16. #define F_CPU 4800000UL
  17.  
  18. //Késleltetés bővítés
  19. //a _delay_ms max 65.535 ms-et képes sleepelni,
  20. // tehát nagyobb idozítést többol lehet "összerakni"
  21.   void m_delay_10ms(unsigned char val)
  22.   {
  23.        unsigned char i;
  24.  
  25.         for(i=0;i<val;i++)
  26.        {
  27.             _delay_ms(10);
  28.         }
  29.    }
  30.  
  31.  
  32. //Program kezdete
  33.  
  34. int main (void)
  35. {
  36.    DDRB = (1<<PINB3); //B3 -> Kimenet
  37.  
  38.    while(1)
  39.     {
  40.  
  41.      PORTB = (1<<PB3);   //PB3 -> "1"
  42.  
  43.       m_delay_10ms(10);   //10*10ms = 100ms
  44.  
  45.          PORTB &= ~(1<<PB3); //PB3 -> "0"
  46.  
  47.            m_delay_10ms(10);  //10*10ms = 100ms
  48.  
  49.  
  50.     }
  51.  
  52.  
  53. }


4.8mhz, O1. Fuse bit-eknél szintén 4.8Mhz van kiválasztva.
De a led-ecském tuti nem 100ms-el billeg... Mit rontottam el?
Vagy ennyire nem tuti a belső oszc.?

up1.:
átraktam mindent 9.6Mhz-re és kivettem próbaképpen a CKDIV8 pipát. Megy rendesen...
Mi az a bizonyos CKDIV8?
A hozzászólás módosítva: Júl 5, 2013
(#) johny999 válasza fifadani hozzászólására (») Júl 5, 2013 /
 
Char helyett int típusú változót használj.
(#) fifadani hozzászólása Júl 5, 2013 /
 
Most akkor használható a késleltetés simán így is?
_delay_ms(1000) ? Műkszik.
(#) pluto válasza fifadani hozzászólására (») Júl 5, 2013 /
 
Az annyit jelent, hogy 8-al osztja az órajelet. Tehát, ha 8MHz az órajel és a CKDIV8 aktív, akkor valójában 1MHz-el fut a processzor.
(#) fifadani hozzászólása Júl 5, 2013 /
 
Értem.
9,6/8. Mindenhol átírom 1,2mhz-re.
Ha 1,2mhz-el próbálok 1 másodpercenként villogtatni. Pontatlan lesz. Miért?
(#) aticska válasza fifadani hozzászólására (») Júl 6, 2013 /
 
_delay_ms() != delay_ms()
(#) fifadani hozzászólása Júl 6, 2013 /
 
Ezt nem értöm. Nem mindegy, hogy írom?
(#) elektros90 válasza ThompsoN hozzászólására (») Júl 6, 2013 /
 
Ha feldobnád a kódot, lehet többet tudnának neked segíteni. Esetleg kapcs. rajzot is.
(#) Robi98 hozzászólása Júl 6, 2013 /
 
Sziasztok!
Pár hete rendeltem egy ATmega 16a mikroprocesszort, hogy tovább kísérletezhessek a 7 szegmenses kijelzőimmel, de elképzelhető, hogy hibás a processzor, mert a PORTC lábai közül csak 3 darab működik. Készítettem egy olyan tesztprogramot, hogy a port minden lábára kötött ledet villogtatja, de csak három darab villog a nyolc közül. Mitől romolhatott el, most mitévő legyek? Csak mert egy ilyen processzor nagyon drága ám.
A hozzászólás módosítva: Júl 6, 2013
(#) elektros90 válasza Robi98 hozzászólására (») Júl 6, 2013 /
 
Valószinűlég kikell kapcsolnod a JTAG-et, a JTAGEN Fuse-val teheted meg.
(#) Robi98 válasza elektros90 hozzászólására (») Júl 6, 2013 /
 
Köszi, majd ha ráérek kipróbálom!
(#) TavIR-AVR válasza Robi98 hozzászólására (») Júl 7, 2013 /
 
Alapesetben a JTAG BE van kapcsolva. A Fusebiteknél kapcsold ki!
(#) johny999 hozzászólása Júl 7, 2013 /
 
Sziasztok!
Adott a következő program.

  1. //#define F_CPU 8000000
  2.  
  3. #include <avr/io.h>
  4.  
  5. // ATtiny45/85 Pin map
  6. //                       +-\/-+
  7. // Reset/Ain0 (D5) PB5  1|o   |8  Vcc
  8. //       Ain3 (D3) PB3  2|    |7  PB2 (D2) Ain1
  9. //       Ain2 (D4) PB4  3|    |6  PB1 (D1) pwm1/0c0b
  10. //                 GND  4|    |5  PB0 (D0) pwm0/oc0a
  11. //                       +----+
  12.  
  13. int main(void)
  14. {
  15.         //Set pin PB0 as output and LOW
  16.         DDRB = (1 << PINB0);
  17.         PORTB = 0b00000000;
  18.        
  19.         //Set up timer0 for generating freq with 50% duty
  20.         TCCR0A = 0;
  21.         //CTC Mode
  22.         TCCR0A = (0 << COM0A1) | (1 << COM0A0) | (1 << WGM01);                                         
  23.        
  24.         TCCR0B = 0;
  25.         //No prescaling
  26.         TCCR0B = (1 << CS00);                                                                          
  27.        
  28.         //TCNT0 = 0;
  29.        
  30.         //200 -> 19,9kHz; 66 -> 59,7kHz
  31.         OCR0A = 66;    
  32.         OCR0B = 0;
  33.        
  34.         for(;;) {
  35.        
  36.         }
  37. }


Az adatlapban szereplő képlet alapján 59,7kHz-es négyszögjelet kellene előállítania. Viszont amit kapok az feltehetően 20kHz alatt van, mert nagyon irritáló hangot ad ki ha piezot kötök a kimenetre.

Valakinek valami ötlet hogy miért csinálja ezt.
A hozzászólás módosítva: Júl 7, 2013
(#) Robi98 válasza TavIR-AVR hozzászólására (») Júl 8, 2013 /
 
Elmagyaráznád pontosan mi is az a JTAG ? Mert nem igazán értem.
Köszi!
(#) Topi válasza Robi98 hozzászólására (») Júl 8, 2013 /
 
Debugolásra (hibakeresésre és nyomkövetésre) való protokoll, ami akkor is ül és fogja a proci lábat, ha nem használod. Google -> JTAG!
(#) fifadani hozzászólása Júl 8, 2013 /
 
Sziasztok!
Most próblákozom egy rendőrlámpa projektel.
Attiny13a.
Az SCK, MISO, MOSI lábakra kötött ledek haloványan "égnek". Miért?
Mi tévő legyek?

Köszi!
A hozzászólás módosítva: Júl 8, 2013
(#) fifadani hozzászólása Júl 8, 2013 /
 
Közben rájöttem, hogy elfelejtettem megadni, hogy kiemenet.
Viszont másik kérdés.
PB0 0x00 / 0b000000
PB1 0x01 / 0b000001
PB2 0x02 / 0b000010
PB3 0x03 / 0b000100
PB4 0x04 / 0b001000
PB5 0x05 / 0b010000

Ez így elvileg nem jó.

A helyes ez:
PB0 0x01 / 0b000001
PB1 0x02 / 0b000010
PB2 0x03 / 0b000100
PB3 0x04 / 0b001000
PB4 0x05 / 0b010000
PB5 0x06 / 0b100000

Ugye?

up1.:
Grr ez is badarság.
Úgy műkszik már hogy (1<<PB3) vagy PORTB = 0b001000 stb. De, hogy kell ezeket hexába át írni?
A hozzászólás módosítva: Júl 8, 2013
(#) Robi98 válasza Topi hozzászólására (») Júl 8, 2013 /
 
Köszi a választ!
(#) fifadani válasza fifadani hozzászólására (») Júl 8, 2013 /
 
up2.:
0x04 a PB3-mas láb.
De ha ezt írom PORTB = 0x04;
majd késleltetés után PORTB &=~ 0x04;
Nem "gyullad ki a led"..

Illetve hogy tudok egyszerre két bitet 1-be állítani?
Ugye azt szeretném, hogy a piros és a sárga egyszerre kezdjen el világítani.
  1. int main (void)
  2. {
  3.    DDRB = DDRB | 0b011001 ; // B0,B3,B4 -> Kimenet
  4.    
  5.  
  6.    while(1)
  7.     {
  8.  
  9.         //PB3 Piros
  10.         //PB4 Sárga
  11.         //PB0 Zöld
  12.  
  13.          
  14.      PORTB = (1<<PB3);   //PB3 -> "1"  Piros be
  15.  
  16.          PORTB = (1<<PB4);   //PB4 -> "1" Sárga be
  17.                  
  18.             m_delay_10ms(200);   //200*10ms = 2 sec
  19.  
  20.      PORTB &=~ (1<<PB3);  //Piros ki
  21.  
  22.         m_delay_10ms(200);   //200*10ms = 2 sec
  23.  
  24.      
  25.                  
  26.            
  27.  
  28.      PORTB &=~ (1<<PB4);  //Sárga ki
  29.  
  30.         m_delay_10ms(200);   //200*10ms = 2 sec
  31.  
  32.          PORTB = (1<<PB0);   //PB0 -> "1" Zöld be
  33.                  
  34.             m_delay_10ms(200);   //200*10ms = 2 sec
  35.  
  36.      PORTB &=~ (1<<PB0); //Zöld ki
  37.  
  38.         m_delay_10ms(200);   //200*10ms = 2 sec
  39.      
  40.  
  41.          
  42.  
  43.     }
  44.  
  45.  
  46. }
A hozzászólás módosítva: Júl 8, 2013
(#) johny999 válasza fifadani hozzászólására (») Júl 8, 2013 /
 
Miért kell neked pont hexa, miért nem jó a bináris forma.

DDRB = 0b00000000;
PORTB = 0b00000000;

0x04 az 00000100 vagyis 2es pin.
A hozzászólás módosítva: Júl 8, 2013
(#) fifadani hozzászólása Júl 8, 2013 /
 
Közben megvan az is.
Piros és Sárgát: 0b011000;
Ha így szeretném leírni hogy:
PORTB = (1<<PB3); plusz a sárgát?

up1.:
Nah csak sikerült.
  1. PORTB = 0b001000;
  2.  
  3.            m_delay_10ms(200);
  4.  
  5.          PORTB = 0b011000;
  6.  
  7.            m_delay_10ms(200);
  8.  
  9.          PORTB = 0b000001;
  10.  
  11.            m_delay_10ms(200);
  12.  
  13.      PORTB = 0b010000;
  14.  
  15.        m_delay_10ms(200);


Ebben a formában, hogy (1<<PB3) stb.. Hogy kell megírni?
A hozzászólás módosítva: Júl 8, 2013
(#) johny999 válasza fifadani hozzászólására (») Júl 8, 2013 / 1
 
Teszel egy | -t. PORTB = (1<<PBx) | (1<<PBy) | (1<<PBz);
De ha azt akarod hogy a többi pin változatlan maradjon akkor elvileg PORTB |= kell.
(#) fecus hozzászólása Júl 10, 2013 /
 
Kizártam magam egy Attiny 44A-ból a fusebit-tel. Melyik a legegyszerűbb programozó amivel vissza tudom hozni az életbe?
Van soros és párhuzamos port is a gépemben. Avrdude-t használok Ubuntu Linuxon, parallel programozóval.
Következő: »»   547 / 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