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   372 / 840
(#) sikolymester válasza mambonr5 hozzászólására (») Okt 30, 2011 /
 
Ezt a kérdést már feltetted egyszer.

Megadtam neked az adatlapját az lcd kontrollernek. Ha alaposan átnézed, akkor ráakadsz arra a részre, ahol írja, hogy milyen parancsokat lehet neki adni, és arra mik történnek benne. Nincsen más dolgod, mint függvényeket írni arra, hogy ezeket a parancsokat elküldje.

Először is inicializálod, majd küldesz neki dolgokat, amiket ki kell írjon.

Ha valamiben elakadsz, akkor kérdezz.

Van egy olyan sanda gyanúm, hogy ez a sürgős feladat valamiféle iskolai házi feladat, amit lusta vagy magad megcsinálni, ezért szeretnéd, ha az öledbe pottyanna a kész program.
Ha nem iskolai feladat lenne, hanem munkahelyi feladat, akkor már rég repültél volna, ha lusta lennél átnézni egy adatlapot. Ezt a jövőre vonatkozóan sem árt fejbe vésni.
(#) Reggie válasza UbiLinux hozzászólására (») Okt 30, 2011 /
 
Eleg bunkon reagalsz, ahhoz kepest, hogy en probalok meg neked segiteni, ugyhogy inkabb radhagyom az egeszet. De lasd milyen jofej vagyok, annak ellenere, hogy nem mondom meg a megoldast, annyit azert elarulok, hogy a C-ben labelt csak a fuggvenyekben lehet elhelyezni, adatstrukturaban nem. Sok sikert!
(#) sgt válasza sikolymester hozzászólására (») Okt 30, 2011 /
 
Igazából meg sem lepődök ezen. Annyiféle fajta kommuniukáció van a mikrokontroller és a programozó/debuggoló eszköz között, hogy eddig a feléről nem tudtam, amíg most utána nem néztem. De legalább lehetővé tették, hogy egy közzel többféle módon is csatlakozhassunk.

Ennél már csak a PIC háromezer féle programozója/debuggolója tud megzavarni.

Nekem elég a programozó része, amikor anno volt lehetőségem, akkor sem igazán használtam ki az online debuggolás lehetőségét. De ha esetleg kellene, akkor is sorosporton hasonlót el lehet érni, ha az ember jól írja meg a progarmot.

Lényeg, hogy tisztába kerültek a dolgok .
(#) kiborg válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Valaki ?
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Milyen uC?
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Az adatlapok osszehasonlitasa alapjan szerintem neked CPHA=1, CPOL=1 kene.
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Az utolso blokk 5. soraban:
  1. ldi data,0b01011000;[7] - 0 mindig

helyett
  1. ldi data,0b01010100;[7] - 0 mindig

kell.
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
Hali!
ATMega16.
Kipróbálom és jelentkezem.
Addig is köszi.
Kiborg
(#) UbiLinux válasza Reggie hozzászólására (») Okt 30, 2011 /
 
Inkább ne "segítsél", hiszen három mail után sem értetted meg a lényeget.
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
Szia!

Megnéztem, amit te javasoltál, ott te csak a másik regiszter címét mondtad. 4hex címet 2 byte-s módban.
Nézd meg a command byte-t és ott pontosan le van írva, hogy miként kell elküldeni a címet.
MSB: 0 mindig, 6.bit r/W -nálam 1 mert olvasom, 3 bit a regiszter cím, 011bin ->3hex, ami az ID regiszter címe, 2.bit szintén 0, mert csak 1 byte-t kérek tőle, 0-1 bit pedig 0,mert annak kell lenni.
Ezt elküldöm neki a mellékelt kódrészlettel és nem ad rá választ Csak nem tudom, hogy miért.
A többit átfutottad és működnie kellene?
Üdv Kiborg
(#) kiborg válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Sorry, túlléptem az időkeretet.
Szóval 010bin az 2hex, azaz a hőmérséklet regiszter címe. Ez ok, tudom, hogy onnan kell kiolvasni, de én kezdésnek csak az ID regisztert szerettem volna kiolvasni, aminek Cx hex adatot kellene visszaadnia. De nem az jön, hanem csak egy 0
Amúgy ha azt használtam, amit te is javasoltál, akkor is szintén 0-t olvasok ki a SPDR-ből.
Kiborg
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Folyamatos olvasast csak a homersekleti regiszternel lehet engedelyezni (adatlap 18. oldal, utolso bekezdeseben irja.)

A CPOL=1, CPHA=1 modban probaltad?

(Raadasul a homerseklet olvasasanal 16 bites olvasast kell vegrehajtani.)
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
SZia!
Nem akarok folyamatos olvasást(még), egyszer szeretném kiolvasni a 03hex ID reg tartalmát. Aminek Cx hex értéket kellene visszaadnia eredményképpen.
Minden CPOL és CPHA variációt (4féle) kipróbáltam, de nem hajlandó Cx hex értéket visszaadni egyik sem. 0A hex vagy 15 hex értéket kapok, de nem tudom miért.
Kiborg
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Igen, ertem en, csak azert irtam, hogy lasd olvastam az adatlapot

Amugy ha a VFD-vel latod a megfelelo kimeno jelet es viszont a MISO-n nem latod a valaszt, az egyertelmuen azt jelenti, hogy az IC nem vette a parancsot, tehat ha a kikuldott adat jo, akkor csak az idozitesekkel lehet gond. (Vagy a MISO labat kimenetnek allitottad esetleg, bar a veges kimeno ellenallasok miatt egy nagyon kis amplitudoju valtozast ekkor is latsz szkopon.)

Esetleg a VFD outputjat nem tudod mellekelni?

(Amugy a 0xA majdnem 0xC, csak lehet hogy rossz idopillanatban mintavetelez.)
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
A VFD outputja alatt mit értesz ?
( az SPI inicializálása végén beállítom a portot is a harmadik részben) Bemenetnek van állítva és felhúzóellenállás nincs aktiválva.
(A 0A az 0x0A akart lenni.)
(#) kiborg válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Átírtam az olvasási kódot, hogy a 0x02címról olvasson és folyamatos olvasásra.
Az első válasznak a t_h-ban kellene lennie, a másodiknak pedig a t_l-ben. De nem
Megpróbálok egy kicsit szórakozni az időzítésekkel, bár nemtudom, hogy hol és mit lehetne neki csinálni.
  1. temp_sens_init:
  2. call SPI_MasterInit_temp
  3.  
  4. cbi T_SEN_port,T_SEN_SEL; Temperature Sensor engedélyezése
  5. ldi data,0b01010100;[7] - 0 mindig;0b01010100
  6. ;[6] - R/W : 1-Read  0-Write
  7. ;[5:4:3] - Register adress
  8. ;[2] - Cont.Read csak TEMP Reg-hez,egymás után 2 byte olvasása
  9. ;[1:0] - 0 mindig
  10. call spi_send
  11.  
  12. ldi data,0xff
  13. call spi_send
  14. mov t_h,datain
  15.  
  16. ldi data,0xff
  17. call spi_send
  18. mov t_l,datain
  19.  
  20. sbi T_SEN_port,T_SEN_SEL; Temperature Sensor tiltása
  21. ret
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Szkoppal kene megnezni a jeleket. Amugy 99% biztos vagyok, hogy CPOL=1, CPHA=1 kell neked.

De amit mindenkeppen meg lehet probalni: Bekapcsolas utan varakozzal nehany ms ideig, majd reseteld a homero soros interfeszet ugy, hogy kikuldesz 32 db 1-est. Ezutan varjal 1ms ideig, majd utana probald meg kiolvasni az ID regisztert.
(Mivel nem lattam az egesz kodot, ezert nem tudom, hogy bekapcsolas utan mennyi ideig varsz vagy mit csinalsz.)
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
Bekapcsolás után (mindig be van kapcsolva, csak töltöm le az új progit, ezalatt minden feszültség alatt van) a proci lábait beállítom, változókat töltök fel, majd várok 10ms-t, kimegy a SPI reset (4szer 0xff) majd ójra várok 10ms-t és után olvasok regisztert, majd 1 mp múlva újra olvasok. Ezzel a kóddal:
  1. temp_sens_read:
  2. call SPI_MasterInit_temp
  3.  
  4. cbi T_SEN_port,T_SEN_SEL; Temperature Sensor engedélyezése
  5.  
  6. ldi data,0b01011000;[7] - 0 mindig;0b01010100
  7. ;[6] - R/W : 1-Read  0-Write
  8. ;[5:4:3] - Register adress
  9. ;[2] - Cont.Read csak TEMP Reg-hez,egymás után 2 byte olvasása
  10. ;[1:0] - 0 mindig
  11. call spi_send
  12.  
  13. ldi data,0xff
  14. call spi_send
  15.  
  16. sbi T_SEN_port,T_SEN_SEL; Temperature Sensor tiltása
  17. ret


Az SPI beállítása:
  1. SPI_MasterInit_temp:
  2.  
  3. lditemp,0b01011111
  4. outSPCR,temp;[7] - SPIE: SPI Interrupt Enable
  5. ;[6] - SPE: SPI Enable
  6. ;[5] - DORD: Data Order
  7. ;[4] - MSTR: Master/Slave Select
  8. ;[3] - CPOL: Clock Polarity
  9. ;[2] - CPHA: Clock Phase
  10. ;[1:0] - SPR1,SPR0: SPI Clock Rate Select
  11. ; SPI2X SPR1 SPR0 SCK Frequency
  12. ;   0    0    0      fosc/4
  13. ;   0    0    1      fosc/16
  14. ;   0    1    0      fosc/64
  15. ;   0    1    1      fosc/128
  16. ;   1    0    0      fosc/2
  17. ;   1    0    1      fosc/8
  18. ;   1    1    0      fosc/32
  19. ;   1    1    1      fosc/64
  20.  
  21. ldiR16,0b00000000
  22. outSPSR,R16;[7] - SPIF: SPI Interrupt Flag
  23. ;[6] - WCOL: Write COLlision flag
  24. ;[5:1] - Res: Reserved Bits
  25. ;[0] - SPI2X: Double SPI Speed Bit
  26. ;**** port B inic
  27. lditemp,0b10111011
  28. out DDRB,temp;B port kimenet és bemenet(MISO és PB2(INT2))
  29. ret


Ami furcsa az egészben, hogy 0x03-as regisztert olvasok és pár érték van ami cserélgeti egymást a 0x80 és a 0x78 és a 0x70.
Ha hozzáérek a chiphez, akkor meg teljesen vad értékek jönnek ki belőle.
Kiborg
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Soros programozast hasznalsz? Ha igen, akkor nem lehet, hogy a programozas zavarja meg az IC-t, vagy a csatlakoztatott programozo a kommunikaciot? Probald meg lehuzni a programozot es csinalni egy tap elvetelt, majd visszaadast.
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
Félsiker, már kitudom olvasni a temp reg. értékét (és az ID-t is), de csak ha olvasás után resetelem az IC-t SPI buszon keresztül. Lehet, hogy túl gyorsan akarom kiolvasni belőle az értéket és még nincs kész vele a chip ?
Ezen dolgozom tovább.
Kiborg

mod: JTAG-on programozok. Elkzdtem csak a hőmérő tápját megszüntetni, utána az első olvasás jó volt, ezután már nem. Ha újra elvettem akkor első olvasás megint jó volt. És ezután jött az ötlet, hogy resetelem, de nem értem, hogy miért kell resetelni, hiszen folyamatos mód-ban van.
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Akkor a letolto nem lehet.
240ms egy konverzio, tehat ket olvasas kozott celszeru legalabb ennyit varni.
Mondjuk en ezekben a software resetekben sosem biztam igazan, lehet, hogy akar programozaskor vagy a uC indulasakor(amikor a port iranyait allitod) kijut valami olyan jelalak az SPI buszra, amitol megzavarodik. Ezert is celszeru a labak iranyat az SPI inicializacoja utan elvegezni.
(#) Reggie válasza Reggie hozzászólására (») Okt 30, 2011 /
 
elvegezni=beallitani.
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
NEM !!!
Megvan, hogy mi volt a gond.
Ha először kiküldöm neki, hogy 0x02-ről olvasson folyamatos módban, akkor végrehajtja (és 2 bytet küld vissza(tehát összesen 3 byte kommunikáció 24 órajel alatt), viszont amikor másodjára fordulok hozzá, hogy kérem a 0x02-ről az aktuális értéket, akkor mialatt kiküldöm a 0x02 címet, ő már átadja a hőmérséklet felső byteját, ad adatlappal ellentétben !!! (3 byte kommunikáció 16 órajel alatt).
Emiatt volt nagyon fals értékem és ha reseteltem a buszon keresztül, akkor alaphelyzetbe állt és minden olvasás elsőnek bizonyult (24 órajel kellett hozzá).
Imádom a pontos adatlapokat.... azt hittem, hogy ezeknek lehet hinni.... de mégsem Úgyhogy a témát lezártnak minősíthetjük
Kiborg

ui:még egy kérdésem lenne: ehhez az RCT-hez milyen beállításokat használjak ? CPOL és CPHA ?
(#) Reggie válasza kiborg hozzászólására (») Okt 30, 2011 /
 
Gratula. Rossz belegondolni, hogy szkoppal v analizatorral ez negyed ennyi ido sem lett volna
Amugy ez jol van dokumentalva, a folyamatos modbol kulon paranccsal kell kilepni, es ebben a modban te mindegy mit kuldesz, o 16 orajel alatt kuldi az adatot.

11 szinten.
(#) kiborg válasza Reggie hozzászólására (») Okt 30, 2011 /
 
Nagyon szépen köszönöm a segítséget.
Remélem az RTC már nem lesz számomra ilyen trükkös.

Üdv Kiborg
(#) mrgrassy hozzászólása Okt 30, 2011 /
 
sziasztok
azt szeretném kérdezni tőletek hogy ez a
AVRDragon jó e AVR programozásra és tud e majd valaki segíteni hogy hogyan használjam ?
Ha esetleg nem jó akkor mit ajánlotok kezdő vagyok de profi szintig akarok fejlödni ebben a témában szoval balami olyan progzamozó kéne ami sok fajta AVR-hez jó.
Eddig még csak PIC -eztem arra találtam egy jó programozot de az AVR máshogy müködik.
(#) szdani hozzászólása Okt 30, 2011 /
 
Sziasztok!

Egy olyan kérdésem lenne hogy ATtiny45 be beégettem a programot, egy darabig azt is csinálta amit kellett, (1 led villog) aztán abbamaradt. Megnéztem és a program nem látja az IC-t. Lehet hogy tönkretettem? AVR910-es programozót használok! Előre is köszönöm a segítséget!
(#) kovacsj hozzászólása Okt 30, 2011 /
 
Sziasztok!
Egy Quectel GSM modullal küzdök éppen. Az inicializálás rendben lezajlik, de a Call ready kiírása után még a végtelen ciklus sem hajtódik végre. Mi lehet ennek az oka? Köszönöm előre is a segítséget!

  1. #define F_CPU 7372800UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #define BAUD 9600
  8. #define SPEED (F_CPU/16/BAUD-1)
  9. volatile unsigned char mutato = 0;
  10. volatile char szoveg[160];
  11.  
  12. void USART_init(unsigned int mybaud) {
  13. UBRR0H = (unsigned char) (mybaud >>8);
  14. UBRR0L = (unsigned char) mybaud;
  15. UBRR1H = (unsigned char) (mybaud >>8);
  16. UBRR1L = (unsigned char) mybaud;
  17. UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
  18. UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE1);
  19. UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
  20. UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
  21.  
  22. }
  23.  
  24. void USART1_Transmit(unsigned char data) {
  25. while (!(UCSR1A & (1<<UDRE1)));
  26. UDR1 = data;
  27. }
  28.  
  29. void USART0_Transmit(unsigned char data) {
  30. while (!(UCSR0A & (1<<UDRE0)));
  31. UDR0 = data;
  32. }
  33.  
  34. unsigned char USART1_Receive(void) {
  35. while (!(UCSR1A & (1<<RXC1)));
  36. return UDR1;
  37. }
  38.  
  39. void USART1_string(char* string) {
  40. unsigned char i = 0;
  41. for (i=0;i<sizeof(string);i++) {
  42. USART1_Transmit(string[i]);
  43. }
  44. }
  45.  
  46. void USART0_string(char* string) {
  47. unsigned char i = 0;
  48. for (i=0;i<sizeof(string);i++) {
  49. USART0_Transmit(string[i]);
  50. }
  51. }
  52. ISR(USART1_RX_vect) {
  53.  
  54. szoveg[mutato] = USART1_Receive();
  55. UDR0 = UDR1;
  56. mutato++;
  57.  
  58. }
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. void bekapcsol(uint16_t time) {
  66. DDRD = 0b11111011;
  67. PORTD = 0x01;
  68.  
  69. while (time--) _delay_ms(1);
  70. PORTD = 0b00100001;
  71.  
  72. }
  73.  
  74. void GSM_init(void) {
  75. unsigned char i;
  76. const char baudrate[]="AT+IPR=9600\r\n";
  77.  const char smsformat[]="AT+CMGF=1\r\n";
  78.  const char kozpont[]="AT+CSCA=\"+36709996500\"\r\n";
  79.  const char azonositas[] = "AT+CLIP=1\r\n";
  80.  const char smstarol[] = "AT+CPMS=\"SM\"\r\n";
  81.  const char smstorol[] = "AT+QMGDA=\"DEL ALL\"\r\n";
  82.  
  83. for(i=0; i<sizeof(baudrate); i++){ USART1_Transmit(baudrate[i]);  _delay_ms(10); }
  84. _delay_ms(1000);
  85. for(i=0; i<sizeof(smsformat); i++){ USART1_Transmit(smsformat[i]);  _delay_ms(10); }
  86. _delay_ms(1000);
  87. for(i=0; i<sizeof(kozpont); i++){ USART1_Transmit(kozpont[i]);   _delay_ms(10); }
  88. _delay_ms(1000);
  89. for(i=0; i<sizeof(azonositas); i++){ USART1_Transmit(azonositas[i]);  _delay_ms(10); }
  90. _delay_ms(1000);
  91. for(i=0; i<sizeof(smstarol); i++){ USART1_Transmit(smstarol[i]);  _delay_ms(10); }
  92. _delay_ms(1000);
  93.  
  94. for(i=0; i<sizeof(smstorol); i++){ USART1_Transmit(smstorol[i]);   _delay_ms(10); }
  95. for (i=0;i<20000;i++){
  96. _delay_ms(1);
  97. }
  98. }
  99.  
  100. ISR(INT1_vect) {
  101.  
  102. }
  103.  
  104. int main() {
  105.  char szam[5];
  106.  
  107. sei();
  108. bekapcsol(500);
  109. _delay_ms(10000);
  110. USART_init(SPEED);
  111. GSM_init();
  112.  
  113. while(1) {
  114. itoa(mutato, szam,10);
  115. USART0_string(szam);
  116. _delay_ms(1000);
  117. }
  118. }
(#) kovacsj válasza kovacsj hozzászólására (») Okt 30, 2011 /
 
Tovább megyek, a nem végtelen ciklus sem hajtódik végre.
A GSM_init() után kiadtam egy AT-parancsot, de már az sem kell neki.
(#) sgt hozzászólása Okt 30, 2011 /
 
Technical Library DVD 2011.10-es kiadása. Csak eléggé lassan jön.

Szerk: jön csak néha be lassul 90kB/s-ra.
Következő: »»   372 / 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