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   359 / 840
(#) AxaGame hozzászólása Szept 10, 2011 /
 
Hali!
Egy kicsit elakadtam a Tiny861 IC és dokumentációjának ellentmondásában. Szerintem.
A probléma a PWM6 üzemmóddal van. A doksi szerint -és az én értelmezésem szerint- TCCR1E regiszter alsó 6 bitje kiengedi OCR1A szerint komparált értéket. Teszi ezt úgy, hogy nem foglalkozik a negált láb működésével.
Ezzel szemben az IC és a AvrStudio bizony a negált lábakon csak akkor ad H szintet, amikor az a komparálási értékből következik.
Kérdésem: Az én értelmezésem rossz a dokumentáció alapján, vagy van valami cseles bit, amit még be kell állítani?
Előre is köszönöm, akik foglalkozol a kérdéssel!
(#) zombee válasza Damian666 hozzászólására (») Szept 10, 2011 / 1
 
Sajna ez elég régi és azért elég mókás hogy pl. a bcd.h-t nem adják mellé. Az "#asm" rész is rosszul van megoldva,
meg nincsen "bit" nevű változótípus szóval igazán csatolhatták volna a HEX fájlt is az egészhez mert így nem jó...
(#) Damian666 válasza zombee hozzászólására (») Szept 10, 2011 /
 
Akkor ezzel nem megyek semmie se. Köszönöm a segítséget.

Esteleg nem tudjátok hogyan vezéreljek 2 soros lcd-t a mega 16-al?
(#) yoman917 válasza zombee hozzászólására (») Szept 10, 2011 /
 
Hello,
Nem sikerült, mert én PWM-ként definiáltam, elfelejtettem mondani. A lényeg, hogy pwm-el vezérelem a ventillátort, de ha a PD2-t letestelem, le kéne állítani az automata vezérlést, és átállni kézire, ehhez a PD0, PD1, PD2 -t kellene 5V-ra kapcsolni. Bocsánat az értetlenkedést, de nem nagyon találom a kiutat. (A PORTx.y nem működik nekem, vagy nem is kellene)
Üdv,
yoman
(#) TavIR-AVR válasza Damian666 hozzászólására (») Szept 10, 2011 / 1
 
Bascomul:
  1. '*********************************************
  2. '* Title:      LCD minmaltest                *
  3. '* Filename:   lcd-2.bas                     *
  4. '* Compiler:   Bascom-AVR 1.11.9.8 Demo      *
  5. '* Size:       538 byte                      *
  6. '*                                           *
  7. '* Author:     Robert Cseh                   *
  8. '* E-mail:     avr /kukac/ tavir /pont/ hu   *
  9. '* Homepage:   http://avr.tavir.hu           *
  10. '*********************************************
  11.  
  12. ' This program demonstrate the LCD test with CONFIG LCD
  13.  
  14.  
  15. $crystal = 16000000                                         'orajel
  16. $regfile = "m168def.dat"                                    'chip
  17.  
  18. Config Lcd = 16 * 2 , Chipset = Ks077
  19. Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.7 , Db6 = Portb.0 , Db7 = Portb.1 , E = Portd.5 , Rs = Portd.4
  20.  
  21. Initlcd
  22. Cls
  23. Initlcd
  24. Cls
  25.  
  26. Lcd "TavIR"
  27.  
  28.  
  29. End                                                         'end program



Arduino:

  1. /*
  2.   LiquidCrystal Library - Hello World
  3.  
  4.  Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
  5.  library works with all LCD displays that are compatible with the
  6.  Hitachi HD44780 driver. There are many of them out there, and you
  7.  can usually tell them by the 16-pin interface.
  8.  
  9.  This sketch prints "Hello World!" to the LCD
  10.  and shows the time.
  11.  
  12.   The circuit:
  13.  * LCD RS pin to digital pin 12
  14.  * LCD Enable pin to digital pin 11
  15.  * LCD D4 pin to digital pin 5
  16.  * LCD D5 pin to digital pin 4
  17.  * LCD D6 pin to digital pin 3
  18.  * LCD D7 pin to digital pin 2
  19.  * LCD R/W pin to ground
  20.  * 10K resistor:
  21.  * ends to +5V and ground
  22.  * wiper to LCD VO pin (pin 3)
  23.  
  24.  Library originally added 18 Apr 2008
  25.  by David A. Mellis
  26.  library modified 5 Jul 2009
  27.  by Limor Fried (http://www.ladyada.net)
  28.  example added 9 Jul 2009
  29.  by Tomy Igoe
  30.  modified 22 Nov 2010
  31.  by Tomy Igoe
  32.  
  33.  This example code is in the public domain.
  34.  
  35.  http://www.arduino.cc/en/Tutorial/LiquidCrystal
  36.  */
  37.  
  38. // include the library code:
  39. #include <LiquidCrystal.h>
  40.  
  41. // initialize the library with the numbers of the interface pins
  42. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  43.  
  44. void setup() {
  45.   // set up the LCD's number of columns and rows:
  46.   lcd.begin(16, 2);
  47.   // Print a message to the LCD.
  48.   lcd.print("hello, world!");
  49. }
  50.  
  51. void loop() {
  52.   // set the cursor to column 0, line 1
  53.   // (note: line 1 is the second row, since counting begins with 0):
  54.   lcd.setCursor(0, 1);
  55.   // print the number of seconds since reset:
  56.   lcd.print(millis()/1000);
  57. }
(#) Damian666 válasza TavIR-AVR hozzászólására (») Szept 10, 2011 /
 
Nagyon szépen köszönöm
(#) Reggie válasza zombee hozzászólására (») Szept 10, 2011 /
 
De van, csak nem GCC alatt. Az a kod Codevision-nal keszult.
(#) dB_Thunder hozzászólása Szept 10, 2011 /
 
Előrebocsájtom hogy még mindig nem tudok programozni A mellékletben található kóddal nem jutok dűlőre. Az analóg digital rész, és a "bekapcsolási animáció" működik, csak a kikapcsolási rész nem. Számításaim szerint kb fél óra múlva , ( ha az ADC nem kap megfelelő nagyságú jelet) a PB3-ra kötött lednek ki kellene aludnia (erre a portra csatlakozik a kikapcsoló áramkör), de ez nem történik meg. Megköszönném ha valaki rávezetne mit rontottam el !

mégnemjó.c
    
(#) zombee válasza dB_Thunder hozzászólására (») Szept 10, 2011 /
 
Az EREDETI kódot Codevision-al próbáld fordítani, azt írták hogy az alatt írták, nem GCC-re...
(#) dB_Thunder válasza zombee hozzászólására (») Szept 10, 2011 /
 
Kösz az ötletet !
De ez honnan derült ki számodra ??
(#) Reggie válasza dB_Thunder hozzászólására (») Szept 11, 2011 /
 
Google-be beirod, hogy ""mega16.h" "bcd.h" avr", akkor a negyedik talalat a codevision avr manualja. Az altalad feltoltod programban minden olyan elem megtalalhato ebben a leirasban, ami gcc alatt nem letezik.
(#) dB_Thunder válasza Reggie hozzászólására (») Szept 11, 2011 /
 
Néztem ezt a Codevisiont, de több gondom is van vele: először is fizetős és a demója csak 4k-ig dolgozik. A programom pedig nagyobb. A másik hogy nagyon nem szeretem az ilyen "varázslós" dolgokat, aztán meg ennek is meg kellene tanulnom a kezelését, amire végkép nem füllik a fogam.
Tehát úgy döntöttem, hogy inkább átírom a programot GCC-re ( ha már ezt is én írtam, nem lehet az akkora ördöngösség) De ehhez tudnom kellene mi nem tetszik a GCC-nek. A codevisionnak megtaláltam a manualját, De a GCC-hez nem találtam még számomra is értelmezhető leírást.
Ha valaki tudna nekem ebben segíteni azt megköszönném !
az meg végképp nem értem hogy a fordító miért nem hisztizett az általa nem ismert elemek miatt
(#) Reggie válasza dB_Thunder hozzászólására (») Szept 11, 2011 /
 
Senki sem mondta, hogy hasznald, csak leirtam, hogy miert nem tudod leforditani.
Az avr-libc leirasahoz a linket megtalalod a topic cimeben.
A fordito hisztizett, nezd meg amit feltoltottel kepet.
(#) dB_Thunder válasza Reggie hozzászólására (») Szept 11, 2011 /
 
Hát ez az, hogy lefordul!! minden hiba és warn nélkül.
Fel is töltöttem a Tinyre, működik is, csak a a kikapcsolási rész nem, azaz time0 környékén van a gond. A stúdióban szimuláltam a működést, a TCNT0 szépen emelkedik.
Szerintem nem történik meg túlcsorduláskor a megszakítás, mert valamiért nem állítja be a TOV0 bitet ez az utasítás: TIFR = 0b00000010; . Javítson ki valaki ha tévedek!
(#) neogeo2 hozzászólása Szept 11, 2011 /
 
http://hotfile.com/dl/82199807/7239a20/atmel-uygulama-notlari-ve-ka...r.html

Hátha valaki másnak is tetszik majd ez a csomag...
(#) zombee válasza dB_Thunder hozzászólására (») Szept 11, 2011 /
 
Tiny-re töltötted, miközben mega16-ra lett írva? Ééérdekes!
(#) Ricsi89 válasza zombee hozzászólására (») Szept 11, 2011 /
 
Nem értitek. Ő nem arról beszél, amiről ti. Olvassátok már el mit akar!
(#) dB_Thunder válasza zombee hozzászólására (») Szept 11, 2011 /
 
Jogos egy pont, mégha mégsem igaz, ugyanis az egy régi komment, nem javítottam (ellenben a program rész módosítva lett tinyre az adatlapja alapján). Mivel a projetben be van állítva az ATiny45, és kommenttel meg nem foglalkozik a fordító, illetve akár a jó istent is inkludolhatnám, ha nem kell, szintén nem foglalkozik vele a fordító.
A másik hogy az io.h nem csak a mega16ról szól, ha jól gondolom, sőt most olvasom ott van benne az ATtiny45 is..
Akkor most szorítkozhatunk arra a megszakításra.
Szóval tesztként írtam már egy timer0-t használó progit, ez tökéletesen csinálta a dolgát a próbanyákon. Ezt módosítottam egy kicsit ( nyilván rosszul). Most ha a b változó eléri az 1100-as értéket le kellene futnia a 104. sortól kezdődő résznek.

Viszont most jut az eszembe ! Igazából egy leddel figyelem azt a kimeneten, erősen gyanús, hogy olyan gyorsan kialszik , és mivel nincs még rákötve a kikapcsoló áramkör, olyan gyorsan vissza is kapcsol...
de hülye vagyok teszek rá egy relét ami tényleg lekapcsolja...hátha sokat javít a dolgokon.

Azért köszönöm a tanácsokat és a türelmet!!
(#) Reggie válasza dB_Thunder hozzászólására (») Szept 11, 2011 /
 
Bocsanat, reggel osszekevertelek Damian666-al.
(#) pityu_lite hozzászólása Szept 12, 2011 /
 
Sziasztok!
Tudnátok valami tippet adni hogy az AVR TWI hardverét hogy tudnám gyorsítani ? Ezeket a funkciókat használom hozzá :
Masternél :
  1. uint8_t TWIM_Init (uint32_t TWI_Bitrate)
  2.         {
  3. /*
  4. ** Set TWI bitrate
  5. ** If bitrate is too high, then error return
  6. */
  7.         TWBR = ((F_CPU/TWI_Bitrate)-16)/2;
  8.         if (TWBR < 11) return FALSE;
  9.  
  10.         return TRUE;
  11.         }
  12.  
  13. uint8_t TWIM_Start (uint8_t Address, uint8_t TWIM_Type)
  14.         {
  15.         uint8_t         twst;
  16. /*
  17. ** Send START condition
  18. */
  19.         TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  20. /*
  21. ** Wait until transmission completed
  22. */
  23.         while (!(TWCR & (1<<TWINT)));
  24. /*
  25. ** Check value of TWI Status Register. Mask prescaler bits.
  26. */
  27.         twst = TWSR & 0xF8;
  28.         if ((twst != TWI_START) && (twst != TWI_REP_START)) return FALSE;
  29. /*
  30. ** Send device address
  31. */
  32.         TWDR = Address<<1 + TWIM_Type;
  33.         TWCR = (1<<TWINT)|(1<<TWEN);
  34. /*
  35. ** Wait until transmission completed and ACK/NACK has been received
  36. */
  37.         while (!(TWCR & (1<<TWINT)));
  38. /*
  39. ** Check value of TWI Status Register. Mask prescaler bits.
  40. */
  41.         twst = TWSR & 0xF8;
  42.         if ((twst != TWI_MTX_ADR_ACK) && (twst != TWI_MRX_ADR_ACK)) return FALSE;
  43.  
  44.         return TRUE;
  45.         }
  46.  
  47. uint8_t TWIM_Write (uint8_t byte)
  48.         {
  49.         uint8_t   twst;
  50. /*
  51. ** Send data to the previously addressed device
  52. */
  53.         TWDR = byte;
  54.         TWCR = (1<<TWINT)|(1<<TWEN);
  55. /*
  56. ** Wait until transmission completed
  57. */
  58.         while (!(TWCR & (1<<TWINT)));
  59. /*
  60. ** Check value of TWI Status Register. Mask prescaler bits
  61. */
  62.         twst = TWSR & 0xF8;
  63.         while (twst != TWI_MTX_DATA_ACK)
  64.         {twst = TWSR & 0xF8;};
  65.  
  66.         }
  67.  
  68. void TWIM_Stop (void)
  69.         {
  70. /*
  71. ** Send stop condition
  72. */
  73.         TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
  74. /*
  75. ** Wait until stop condition is executed and bus released
  76. */
  77.         while (TWCR & (1<<TWINT));
  78.         }


Slave-nél :

  1. uint8_t TWIS_Init (uint8_t Address, uint32_t Bitrate)
  2.         {
  3. /*
  4. ** Set the TWI bitrate
  5. ** If TWBR is less 11, then error
  6. */
  7.         TWBR = ((F_CPU/Bitrate)-16)/2;
  8.         if (TWBR < 11) return FALSE;
  9. /*
  10. ** Set the TWI slave address
  11. */
  12.         TWAR = (Address<<1) | 0;
  13. /*
  14. ** Activate TWI interface
  15. */
  16.         TWCR = (1<<TWEN)|(1<<TWEA) | (1<<TWIE);
  17.  
  18.         return TRUE;
  19.         }
  20.  
  21. void TWIS_Stop (void)
  22.         {
  23.         TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA);
  24.         }
  25.  
  26. uint8_t TWIS_ReadAck (void)
  27.         {
  28.         TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  29.         while (!(TWCR & (1<<TWINT)));
  30.         return TWDR;
  31.         }


MASTER főprogramban :
while(!TWIM_Start (cim1, 0));
TWIM_Write (xx);

SLAVE főprogramban:
if ((TWCR & (1< {
if (TWSR==0x60)
{ adat=TWIS_ReadAck();
}
TWIS_Stop();
}

Ezekután ha sok eszköz van rádugva akkor szemmel láthatóan lassú. Szkóppal vizsgálva maga az adatfolyam olyan gyors amilyennek beállítom(100kHz vagy 400kHz) de utána van egy csomó üresjárati idő, majd újra egy gyors adatmozgás a következő címre..
Semmilyen delay, vagy más művelet nincs a következő címre ugrás között, és a slave "teszt" program is csak az adatra vár és mégis 'lassú' . Esetleg tippetek lenne?
(#) Reggie válasza pityu_lite hozzászólására (») Szept 12, 2011 /
 
A hibaleirasod lehetne kvantitativ.
(#) zombee válasza pityu_lite hozzászólására (») Szept 12, 2011 /
 
A lassabb Slave eszközök elvileg elnyújthatják az átvitelt(SCL vezetéket lehúzzák), így sasold meg az SCL-t. Amúgy az átvitel mindig hibameltes?

Pár apróságot másképp csinál az én könyvtáram a Master oldalon:
  1. void TWIM_Stop (void)
  2.         {
  3.         TWCR |= (1<<TWSTO);
  4.         }
  5.  
  6. //TWI start legelején:
  7. while (!(TWCR & (1<<TWSTO)));



Magyarázat: STOP feltétel kiadása után nem kell megvárni annak befejezését, rögtön visszatérhetünk a programunkhoz számolni. Így processzoridőt nyerünk. Ennek az az ára hogy az új START feltétel kiadása előtt rá kell sasolni a TWSTO bitre. Amíg be van állítva addig nem adhatunk ki újabb START feltételt! A hardver ezt is elintézi, hiszen a TWSTO addig nem törlődik amíg az esetleges lassú Slave el nem engedi az SCL vonalat.
(#) yoman917 hozzászólása Szept 12, 2011 /
 
Sziasztok!
Az lenne a kérdésem, hogy az Attiny26-nak hány pwm kimenete van? Én úgy látom kettő, és még kettő invert?. Tudnám ezt úgy használni, hogy 3 pwm kimenetem legyen?
Üdv,
(#) zombee válasza yoman917 hozzászólására (») Szept 12, 2011 / 1
 
Nem tudod használni. Csak 2 (pár) OC kimenet van, mindkettő a 8 bites Timer1-en. Ha nem fontos hogy legyen ADC, használj ATTiny2313-at. Ha ADC is kell és elegendő a 6 csatorna akkor ATMega48-at ajánlok.
(#) sikolymester válasza yoman917 hozzászólására (») Szept 12, 2011 / 1
 
Jol megirt interrupttal lehet 3 pwm kimeneted. Persze csak szoftveres.
(#) zombee válasza sikolymester hozzászólására (») Szept 13, 2011 /
 
Igen, kb. én is így csinálom: ATMega48-al 18 csatornás PWM.
LED-es futófányhez, knight rider effekthez több mint tökéletes a 120Hz-es PWM. A hardveres csak annyival jobb
hogy ott jóval nagyobb frekik is lehetnek(akár 100kHz) miközben nem eszi a processzoridőt.
(#) zombee válasza zombee hozzászólására (») Szept 13, 2011 /
 
Az előző hozzászólást nem engedte módosítani a rendszer...
A hardveres annyival jobb, hogy ott jóval nagyobb frekik is lehetnek(akár 100kHz) miközben nem eszi a processzort.
Tápegységeknél, frekvenciagenerátoroknál elengedhetetlen a hardveres PWM. Ráadásul ATTiny26 esetében
a PWM számlálója akár 64MHz is lehet a beépített PLL-nek köszönhetően, így a PWM frekvencia 250kHz lehet!
3 csatorna esetében csak a 3. csatornát érdemes szoftveresre csinálni ami szinkronban fut a másik kettővel.
A PWM számlálója értelemszerűen minimum 16-os előosztás mellett futhat korrekten, azaz a számláló
órajele 8MHz-es processzor mellett 500kHz, a PWM frekvencia pedig kb. 2kHz.
Persze lehet az OCR1C beállításával nagyobb frekiket elérni, de akkor a PWM felbontása is csökken!

Szoftveres PWM, ahogy én csinálom: ATMega48-al 18-csatornás LED-es futófény, knight rider effekthez: VIDEÓ
(#) luxmanpower hozzászólása Szept 16, 2011 /
 
Hello! Atmega128A-t próbálok programozni, AVR dragonnal, AVR studio 5 ben, de nem akar menni normálisan. A programot bele tudom írni a mikrovezérlőbe, de az ellenőrzésnél mindig hibát ír ki:
"Verifying Flash...Failed! address=0x0000 expected=0x0c actual=0xff"

Ha kiolvastatom a flasht, akkor látszik hogy tényleg nem írt az elejére.
  1. :10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
  2. :10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
  3. :10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
  4. :10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
  5. :10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
  6. :10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
  7. :10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
  8. :10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
  9. :10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
  10. :10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
  11. :1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
  12. :1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
  13. :1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
  14. :1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
  15. :1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
  16. :1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
  17. :100100000000100000000042C8013F00C8001007B6
  18. :100110000F03389AC1C3019C3F004CC0000000018E
  19. :10012000004000000000000C00200000400008001B
  20. :1001300000203000280018580614000C2C010A007A

Valamilyen beállítási hiba lehet szerintem, de nem tudok rájönni hogy mi. Előre is köszi a segítséget!

Ja és JTAG-on keresztül próbálkozok.
(#) luxmanpower válasza luxmanpower hozzászólására (») Szept 17, 2011 /
 
Megoldottam, programozó kábel volt a hiba.
(#) Reggie válasza luxmanpower hozzászólására (») Szept 17, 2011 /
 
Vannak meg csodak
Következő: »»   359 / 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