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   491 / 840
(#) girhes.main válasza Reggie hozzászólására (») Okt 25, 2012 /
 
Köszönöm szépen! Délután megnézem, és informállak titeket, hogy mi miatt van reset!
Mindig tanul valamit az ember
(#) boomerang hozzászólása Okt 25, 2012 /
 
Sziasztok,

128-as atmegához illesztek éppen lm-75-ös i2c hőszenzorokat. Az oké, hogy a buszra többet is fel lehet tenni, de megoldható hogy még egy RTC is legyen rajta amiből kiolvasom az időt ?
(#) zombee válasza boomerang hozzászólására (») Okt 25, 2012 /
 
Ha mindegyik más címen van akkor semmi akadálya!
(#) kala1982a válasza boomerang hozzászólására (») Okt 26, 2012 /
 
Kettő db lm75 és egy ds1307-es rtc-vel csináltam én is egy hő- és időmérőt, menti naponta a legalacsonyabb és legmagasabb hőmérsékletet időponttal, ha már óra is egyben... ) RTC-nek általában fix címe van, legalábbis ennek a ds nek. az LM75-ön tudsz változtatni. Beleszaladtam olyan hibába, hogy RTC nagyon lassan megy hűtő tetején Vagy a kristály nem bírja a hűtőt vagy az elem, talán az utóbbi...
(#) Adam329 hozzászólása Okt 26, 2012 /
 
Sajnos nem tudom az itoa-t működésre bírni, pedig elolvastam a leírását.
'14' helyett egy 'Ú' jelenik meg a hiperterminálon.

  1. int main(void)
  2. {
  3.         UART_Config();
  4.        
  5.         int num=14;
  6.         char buffer[30];
  7.         itoa(num,buffer,10);
  8.        
  9.         while (!(UCSR0A & (1 << UDRE0)));
  10.         UDR0 = buffer;
  11. }
(#) sikolymester válasza Adam329 hozzászólására (») Okt 26, 2012 /
 
Egyfelöl használd a szimulátort, nem fogod megbánni, másfelől nem is működhetne így a kódod.
Első képen látszik, hogy az itoa köszöni, jól működik.

Itt:
  1. UDR0 = buffer;

Gondolom dob eleve egy warningot is.
És igen, lásd második kép

Helyesen így lenne:
  1. UDR0 = buffer[0];

vagy
  1. UDR0 = *buffer;


Tehát te tulajdonképpen a buffer változód memória címének az első byte-ját küldted ki az UARTon.

Nézd meg itt az 5-ik fejezetet.
C programozási nyelv
A hozzászólás módosítva: Okt 26, 2012
(#) girhes.main válasza Adam329 hozzászólására (») Okt 27, 2012 /
 
Hali!

Atmega168pa-t használok, hogy kell beállítani, hogy aszinkron módon küldjön a uart? Sajnos nem találok olyan regisztert...
(#) blackdog válasza girhes.main hozzászólására (») Okt 27, 2012 /
 
  1. UCSR0C


De az MCU adatlapján is le van írva a 192. oldal kötül.
A hozzászólás módosítva: Okt 27, 2012
(#) blackdog válasza girhes.main hozzászólására (») Okt 27, 2012 /
 
Még valami ami sokat segíthet:Bővebben: Link
Bővebben: Link
Bővebben: Link
(#) girhes.main válasza blackdog hozzászólására (») Okt 27, 2012 /
 
Köszi!
Találtam egy ilyen pdf-et közben:

http://www.gaw.ru/pdf/Atmel/app/avr/AVR094.pdf

Leírja benne, hogy lehet átportolni egy atmega8-as programot atmega168-ra!
(#) jeges hozzászólása Okt 28, 2012 /
 
sziasztok!

Neten ami felelhetö sample kod ds18b20 szinte ugya az a hibajelenséget produkálja a ds18b20 szériája ami hozám került egy vásárláskor!
Vagyis valos 24C környezetben -32 c ad visza monitorozás közben soros porton növelem a hömérségletet a ds18b20 chip körül a -32c az csökkenö értékbe zuhan ahogy a videon is!

ds18b20 mérési hibba

Bele szalatam volna egy hamisitot szériába?

ds18b20 normál modban használt
1 gnd
2 out
3vcc
2..3-láb 4,7K közöt
(#) jeges válasza (Felhasználó 15355) hozzászólására (») Okt 28, 2012 /
 
Felraktam a linknél a forrást kodot is bele néznél?
Nagyon kezdö vagyok C# ben!
(#) Sick-Bastard hozzászólása Okt 28, 2012 /
 
Üdv!

Egész jól megy az adat fogadás és küldés a MCP23s17-el.
Most az interruptját szerettem volna használni csak egy gondba ütköztem.

Az adatlap szerint, ha kiolvasom vagy a INTCAPn vagy GAIOn regisztert, akkor az intterupt reszetteli magát.

Egyszer ki tudom olvasni az adatot, akármelyik lábat aktiválom.
A gond, hogy az interruptja nem esik vissza 0V-ra, hanem fenn marad 5V-on.

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <MCP23S17.h>
  4. #include <avr/interrupt.h>
  5.  
  6. volatile unsigned char KP;
  7.  
  8. int main(void)
  9. {
  10.         SPI_DDR |= (1<<SCK)|(1<<MOSI)|(1<<CE)|(1<<CS0)|(1<<CS1)|(1<<CS2)|(1<<CS3);
  11.         SPCR |= (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0);
  12.         SPCR &= ~(1<<DORD);
  13.         SPSR |= (1<<SPI2X);
  14.        
  15.         sei();
  16.         GICR |= (1<<INT0);
  17.         MCUCR |= (1<<ISC00)|(1<<ISC01);
  18.         DDRD &= ~(1<<PIND2);
  19.         PORTD &= ~(1<<PIND2);
  20.        
  21.         DDRD |= 1<<DDD4;
  22.        
  23.         MCPWR(IOCON,    0x6A);
  24.         MCPWR(IODIRB,   0xFF);
  25.         MCPWR(GPINTENB, 0xFF);
  26.         MCPWR(INTCONB,  0xFF);
  27.         MCPWR(DEFVALB,  0x00);
  28.         MCPWR(IODIRA,   0x00);
  29.         /*
  30.         MCPWR(IODIRA,   0xFF);
  31.         MCPWR(GPINTENA, 0xFF);
  32.         MCPWR(DEFVALA,  0x00);
  33.         MCPWR(INTCONA,  0xFF);*/
  34.        
  35.         while(1)
  36.         {
  37.                 MCPWR(GPIOA, KP);
  38.                 _delay_ms(1000);
  39.         }
  40. }
  41.  
  42. ISR(INT0_vect)
  43. {
  44.         PORTD ^= 1<<PIND4;
  45.         KP = 0x00;
  46.         KP = MCPRD(GPIOB);
  47.         GIFR |= (1<<INTF0);
  48. }
(#) Schnitt hozzászólása Okt 29, 2012 /
 
Sziasztok!

Építettem egy avrdopert, ami a kapcsolások közt van, és a vezérlő felprogramozásában szeretném a segítségeteket kérni.
A hex beégetését avrdude val megcsináltam, vissza is olvastam, az rendben, de a fuse biteket nem tudom hogy kell a dude parancssorral belőni.
A következőkre lenne szükségem:
Külső kristály oszcillátor, SUT legmagasabb, BOD disabled.

Ki tudna segìteni valaki ennek a szintaktikájával?
Eddig ennyi van meg, ezzel égettem be a hex-t

Avrdude -p m8 -c stk500v2 -P COM5 -U flash:w:avr_isp.hex

Megpróbáltam így is éleszteni a szerkezetet, de a windows nem tudja felismerni az eszközt így nem erőltettem.
Ez lehet a hiányzó fuse bitek miatt?

Előre is köszi
(#) zsuscsinyo válasza Schnitt hozzászólására (») Okt 29, 2012 /
 
Ezt próbáld meg:

Bővebben: Link
(#) Schnitt válasza zsuscsinyo hozzászólására (») Okt 29, 2012 /
 
Hohó, ez király, köszi szépen!
Be is ment a kedvencekbe.

Este megpróbálom, remélem, csak ennyi volt a gond.
(#) Sick-Bastard válasza Sick-Bastard hozzászólására (») Okt 29, 2012 /
 
Valakinek valami ötlete, hogy mi lehet a baj?

Még azt tapasztalom, hogy ha az AVR interrupt és az MCP23S17 interuptját megszakítom, amikor folyamatosan 5Vot ad az MCP, majd ismét összekötöm őket, akkor megint fut a program a következő beolvasásig.
A hozzászólás módosítva: Okt 29, 2012
(#) zombee válasza Schnitt hozzászólására (») Okt 29, 2012 /
 
FUSE HIGH:LOW = D9:FF
(#) zombee válasza Sick-Bastard hozzászólására (») Okt 29, 2012 /
 
Most én nem értem vagy senki sem?
(#) Schnitt válasza zombee hozzászólására (») Okt 29, 2012 /
 
És tényleg.
Most, hogy már tudom a beállítandó értékeket, értelmet nyert az élesztési leírás csatolt képernyőfotójának alsó szegmense:
Bővebben: Link

Köszönöm neked is, és bocs a lámaságért, de épp csak elkezdtem foglalkozni a témával, még minden info új.
Eddig csak egy ledvillogó hexet írtam bele egy attiny13-ba sikeresen ponyproggal, soros égetővel, de ott nem kellett FUSE biteket matatni a sikerhez.

Közben megtaláltam az avrdude szintaktikát is:

-U lfuse:w:0xff:m -U hfuse:w:0xd9:m

Remélem, ezzel már sikerre viszem a dolgot, mert a mostani gépemen már nincs soros port, kénytelen leszek ezt az USB-s avrdopert működésre bírni.
(#) sikolymester válasza zombee hozzászólására (») Okt 29, 2012 /
 
Én sem értem.
(#) Sick-Bastard hozzászólása Okt 29, 2012 /
 
Bocs, megfogalmazásban nem vagyok valami jó.

AVR: ATMEGA8535
MCP: MCP23S17

Azt szerettem volna elérni, hogy ha az MCP PORTA-jának valamelyik bemenetére(GPA0-7) logikai 1-et (5V-ot) adok, akkor az MCP beépített interruptja szintén logikai 1-et küldjön (INTA-n keresztül) az AVR egyik (INT0) bemenetére.

Ezzel eddig nincs is gond. Ha 5V-ra elemel az egyik bemenetet, akkor megkapom a jelet, az AVR interrupt rutinja lefut és itt jön a csak/de: ezt csak egyszer végzi el.

A problémám, hogy az INTA logikai 1-en marad.
Az MCP adata szerint (ha jól értetem), amikor kiolvasom vagy az INTCAPA vagy a GPIOA regiszter utolsó bitjét, akkor az interruptnak vissza kéne állnia logikai 0-ra. Úgy tűnik ezt nem hajtja végre.

Eddig két félmegoldást találtam:
1 reszettelem az egész áramkört (AVR, MCP)
2 megszakítom egy picit az AVR és az MCP közötti INT0-INTA összekötést, majd ismét összekötöm őket

A 2. rövid megszakítással elértem, hogy az INTA visszaessen logikai 0ra, így az interrupt ismét üzemképes. Ezt csak azért nem használnám, mert így kénytelen lennék egy kapuzott-tároló? (gated-buffer) használatára, ami mellé még egy lábat fel kell használnom az AVRből.

Remélem most már sikerült közérthetően megfogalmaznom problémámat.

A mellékelt kép nem teljes!
(#) Schnitt hozzászólása Okt 29, 2012 /
 
zsuscsinyo, zombee:

Köszi a segítséget, megoldotta a problémát.
Így már rendesen működik.
(#) svandras0404 hozzászólása Okt 30, 2012 1 /
 
Üdv Mindenkinek!
Alkalmi munka lehetőséget szeretnék ajánlani.
C8051 f04-et kellene assemblyben programozni.
Kettő kártya lenne ugyan olyan procival Master és slave.
Silabs fejlesztő környezetben minden adott csak nem értek hozzá.
Feladat: Master kártyán gomb nyomásra a portról beállított értéket CAN sínnel küld slave-nak és
analóg fesz kiadására utasítja.
Master kártya megméri, hogy mekkora az eltérés a kért és kapott fesz között.
Az eltérést küldi slave-nak előjeltől függően ledet kigyújt és az értéket 8 bites ledsoron megjelenít.
Ha akad olyan jelentkező aki össze tudja hozni a programot annyi pénzt fizetek neki amennyit csak szeretne.
Előre is köszönöm.
svandras0404@freemail.hu
(#) zombee válasza svandras0404 hozzászólására (») Okt 30, 2012 /
 
Csak nem Mikrokontroller Laboratórium lesz?
Az én (megoldott) házim eredménye a csatolt képen látható.

PICT0013.JPG
    
(#) Pacikoma hozzászólása Okt 31, 2012 /
 
Sziasztok

Kicsi segítséget szeretnék kérni egy ATMega 328 vezérlőt szeretnék megírni már meglévő programmal milyen eszközökkel, milyen lehetőségeim vannak rá mert kimondottan ezt a megnevezést egy írónál sem találom

Előre is köszönöm
(#) Schnitt válasza Pacikoma hozzászólására (») Okt 31, 2012 /
 
A lehetőségek szinte korlátlanok, soros, párhuzamos, USB porti írókkal (mindből van kismillió változat), arduino-val, illetve Szoftveresen pl ponyprog, avrdude, avrstudio, stb.
Ha van a gépeden soros port, egy ilyen írót 200 forintból ki lehet hozni:
Bővebben: Link

De ha később is tervezed, hogy AVR-t programozol, akkor érdemes egy USB-s hardverben gondolkodni, az gyorsabb, és újabb gépeken is működik, amin már nincs soros port.

Ha nem szeretnél ilyet, akkor kérj meg valakit, hogy égesse be a szoftvert.

(#) girhes.main hozzászólása Okt 31, 2012 /
 
atmega168pa+ds1621

Hőmérsékletet próbálok lemérni, de nullát kapok vissza! Miért?
Ezt kapom vissza: +00.0

SDA, SCL lábon 2,8K-s felhúzóellenállások vannak.

  1. #define F_CPU 8000000UL
  2. #define USART_BAUDRATE 9600
  3. #define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)
  4.  
  5. #define  DS1621_W                       0x90
  6. #define  DS1621_R                       0x91
  7.  
  8. #define  START_CONVERT          0xEE
  9. #define  STOP_CONVERT           0x22
  10. #define  READ_TEMP                      0xAA
  11. #define  READ_COUNTER           0xA8
  12. #define  READ_SLOPE                     0xA9
  13. #define  ACCESS_CONFIG          0xAC
  14.  
  15. #define  START                          0x08
  16. #define  REPEAT_START           0x10
  17. #define  MT_SLA_ACK                     0x18
  18. #define  MT_SLA_NACK            0x20
  19. #define  MT_DATA_ACK            0x28
  20. #define  MT_DATA_NACK           0x30
  21. #define  MR_SLA_ACK                     0x40
  22. #define  MR_SLA_NACK            0x48
  23. #define  MR_DATA_ACK            0x50
  24. #define  MR_DATA_NACK           0x58
  25. #define  ARB_LOST                       0x38
  26.  
  27. #define  ERROR_CODE                     0x7e
  28.  
  29. #define SCL_CLOCK  100000L
  30.  
  31. #include <avr/io.h>
  32. #include <inttypes.h>
  33. #include <util/delay.h>
  34. #include <avr/interrupt.h>
  35. #include <compat/twi.h>
  36.  
  37.  
  38. void KonfigUART()
  39. {
  40.         UBRR0H = (unsigned char)(UBRR_ERTEK >> 8);
  41.         UBRR0L = (unsigned char)UBRR_ERTEK;
  42.         UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);
  43.         UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
  44. }
  45.  
  46. char UARTAdatFogad() {
  47.    while(!(UCSR0A & (1<<RXC0))) {
  48.  
  49.    }
  50.    return UDR0;
  51. }
  52.  
  53. void UARTAdatKuld(char data) {
  54.    while(!(UCSR0A & (1<<UDRE0))) {
  55.    
  56.    }
  57.    UDR0=data;
  58. }
  59. //*************************************************
  60. //Function to start i2c communication
  61. //*************************************************
  62. unsigned char i2c_start(void)
  63. {
  64.  
  65.         TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);                 //Send START condition
  66.        
  67.     while (!(TWCR & (1<<TWINT)));       //Wait for TWINT flag set. This indicates that the
  68.                                                                                 //START condition has been transmitted
  69.     if ((TWSR & 0xF8) == START)                 //Check value of TWI Status Register
  70.            return(0);
  71.         else
  72.            return(1);
  73. }
  74.  
  75. //*************************************************
  76. //Function for repeat start condition
  77. //*************************************************
  78. unsigned char i2c_repeatStart(void)
  79. {
  80.  
  81.     TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  //Send START condition
  82.     while (!(TWCR & (1<<TWINT)));                //Wait for TWINT flag set. This indicates that the
  83.                                                                                          //START condition has been transmitted
  84.     if ((TWSR & 0xF8) == REPEAT_START)           //Check value of TWI Status Register
  85.            return(0);
  86.         else
  87.            return(1);
  88. }
  89. //**************************************************
  90. //Function to transmit address of the slave
  91. //**************************************************
  92. unsigned char i2c_sendAddress(unsigned char address)
  93. {
  94.    unsigned char STATUS;
  95.    
  96.    if((address & 0x01) == 0)
  97.      STATUS = MT_SLA_ACK;
  98.    else
  99.      STATUS = MR_SLA_ACK;
  100.    
  101.    TWDR = address;
  102.    TWCR = (1<<TWINT)|(1<<TWEN);            //Load SLA_W into TWDR Register. Clear TWINT bit
  103.                                                                            //in TWCR to start transmission of address
  104.    while (!(TWCR & (1<<TWINT)));           //Wait for TWINT flag set. This indicates that the
  105.                                                                            //SLA+W has been transmitted, and
  106.                                                                            //ACK/NACK has been received.
  107.    if ((TWSR & 0xF8) == STATUS)            //Check value of TWI Status Register
  108.           return(0);
  109.    else
  110.       return(1);
  111. }
  112.  
  113. //**************************************************
  114. //Function to transmit a data byte
  115. //*************************************************
  116. unsigned char i2c_sendData(unsigned char data)
  117. {
  118.    TWDR = data;
  119.    TWCR = (1<<TWINT) |(1<<TWEN);           //Load SLA_W into TWDR Register. Clear TWINT bit
  120.                                                                            //in TWCR to start transmission of data
  121.    while (!(TWCR & (1<<TWINT)));           //Wait for TWINT flag set. This indicates that the
  122.                                                                            //data has been transmitted, and
  123.                                                                            //ACK/NACK has been received.
  124.    if ((TWSR & 0xF8) != MT_DATA_ACK)   //Check value of TWI Status Register
  125.           return(1);
  126.    else
  127.       return(0);
  128. }
  129.  
  130. //*****************************************************
  131. //Function to receive a data byte and send ACKnowledge
  132. //*****************************************************
  133. unsigned char i2c_receiveData_ACK(void)
  134. {
  135.   unsigned char data;
  136.  
  137.   TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWEN);
  138.  
  139.   while (!(TWCR & (1<<TWINT)));            //Wait for TWINT flag set. This indicates that the
  140.                                                                            //data has been received
  141.   if ((TWSR & 0xF8) != MR_DATA_ACK)    //Check value of TWI Status Register
  142.           return(ERROR_CODE);
  143.  
  144.   data = TWDR;
  145.   return(data);
  146. }
  147.  
  148. //******************************************************************
  149. //Function to receive the last data byte (no acknowledge from master
  150. //******************************************************************
  151. unsigned char i2c_receiveData_NACK(void)
  152. {
  153.   unsigned char data;
  154.  
  155.   TWCR = (1<<TWINT)|(1<<TWEN);
  156.  
  157.   while (!(TWCR & (1<<TWINT)));            //Wait for TWINT flag set. This indicates that the
  158.                                                                            //data has been received
  159.   if ((TWSR & 0xF8) != MR_DATA_NACK)   //Check value of TWI Status Register
  160.           return(ERROR_CODE);
  161.  
  162.   data = TWDR;
  163.   return(data);
  164. }
  165. //**************************************************
  166. //Function to end the i2c communication
  167. //*************************************************    
  168. void i2c_stop(void)
  169. {
  170.   TWCR =  (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);        //Transmit STOP condition
  171. }  
  172.  
  173. unsigned char tempDisplay[] = "+xx.x";
  174.  
  175. //******************************************************************
  176. //Function to send command
  177. //******************************************************************    
  178. void ds1621_init()
  179. {
  180.   unsigned char errorStatus, data;
  181.  
  182.   errorStatus = i2c_start();
  183.    if(errorStatus == 1)
  184.    {
  185.          i2c_stop();
  186.          return;
  187.    }
  188.    
  189.    errorStatus = i2c_sendAddress(DS1621_W);
  190.    
  191.    if(errorStatus == 1)
  192.    {
  193.          i2c_stop();
  194.          return;
  195.    }
  196.    
  197.    errorStatus = i2c_sendData(ACCESS_CONFIG);
  198.    if(errorStatus == 1)
  199.    {
  200.          i2c_stop();
  201.          return;
  202.    }
  203.    
  204.    errorStatus = i2c_sendData(0x03);   //commmand to set o/ppolarity high, single shot conversion
  205.    if(errorStatus == 1)
  206.    {
  207.          i2c_stop();
  208.          return;
  209.    }
  210.    i2c_stop();
  211. }
  212.  
  213. //******************************************************************
  214. //Function to send command
  215. //******************************************************************    
  216. void ds1621_sendCommand(unsigned char command)
  217. {
  218.   unsigned char errorStatus, i, data;
  219.  
  220.   errorStatus = i2c_start();
  221.    if(errorStatus == 1)
  222.    {
  223.          i2c_stop();
  224.          return;
  225.    }
  226.    
  227.    errorStatus = i2c_sendAddress(DS1621_W);
  228.    
  229.    if(errorStatus == 1)
  230.    {
  231.          i2c_stop();
  232.          return;
  233.    }
  234.    
  235.    errorStatus = i2c_sendData(command);
  236.    if(errorStatus == 1)
  237.    {
  238.          i2c_stop();
  239.          return;
  240.    }
  241.  
  242.    i2c_stop();
  243. }
  244.  
  245. //******************************************************************
  246. //Function to read
  247. //******************************************************************    
  248.  
  249. unsigned char ds1621_readValue(unsigned char value)
  250. {
  251.   unsigned char errorStatus, data;
  252.  
  253.   errorStatus = i2c_start();
  254.    if(errorStatus == 1)
  255.    {
  256.          i2c_stop();
  257.          return (0);
  258.    }
  259.    
  260.    errorStatus = i2c_sendAddress(DS1621_W);
  261.    
  262.    if(errorStatus == 1)
  263.    {
  264.          i2c_stop();
  265.          return (0);
  266.    }
  267.    
  268.    errorStatus = i2c_sendData(value);
  269.    if(errorStatus == 1)
  270.    {
  271.          i2c_stop();
  272.          return (0);
  273.    }
  274.  
  275.     errorStatus = i2c_repeatStart();
  276.    if(errorStatus == 1)
  277.    {
  278.          i2c_stop();
  279.          return (0);
  280.    }
  281.    
  282.     errorStatus = i2c_sendAddress(DS1621_R);
  283.    
  284.    if(errorStatus == 1)
  285.    {
  286.          i2c_stop();
  287.          return (0);
  288.    }
  289.  
  290.    data = i2c_receiveData_NACK();
  291.    
  292.    i2c_stop();
  293.    
  294.    return (data);
  295. }        
  296.  
  297. //******************************************************************
  298. //Function to read
  299. //******************************************************************    
  300. unsigned char* getTemperature(void)
  301. {
  302.   char temperature, counter, slope;
  303.   int temp;
  304.   float actualTemp;
  305.  
  306.   ds1621_sendCommand ( START_CONVERT );
  307.  
  308.   _delay_ms(1000);
  309.  
  310.   temperature = ds1621_readValue ( READ_TEMP );
  311.   counter = ds1621_readValue ( READ_COUNTER );
  312.   slope = ds1621_readValue ( READ_SLOPE );  
  313.  
  314.   actualTemp = (float)temperature - 0.25 + ((float)(slope - counter) / (float)slope);
  315.  
  316.         temp=(int)(actualTemp * 10.0);   //to include decimal point for display
  317.        
  318.         if((actualTemp*10.0 - temp) >= 0.5) temp=temp+1;
  319.        
  320. //    tempDisplay[8]=0xdf;                      //Symbol of degree
  321.  
  322.         if(temp < 0)
  323.         {
  324.           tempDisplay[0] = '-';
  325.           temp *= -1;
  326.         }
  327.         else
  328.         {
  329.           tempDisplay[0] = '+';
  330.         }    
  331.        
  332.         tempDisplay[4] = ((unsigned char)(temp%10)) | 0x30;
  333.         temp=temp/10;
  334.        
  335.         tempDisplay[2] = ((unsigned char)(temp%10)) | 0x30;
  336.         temp=temp/10;
  337.        
  338.         tempDisplay[1] = ((unsigned char)(temp%10)) | 0x30;
  339.         temp=temp/10;
  340.        
  341.         return tempDisplay;
  342. }
  343. void TWI_Inicializalas() {
  344.         TWCR= 0x00;
  345.         TWBR= ((F_CPU/SCL_CLOCK)-16)/2;
  346.         TWSR= 0x00;
  347.         TWAR= 0x00;
  348.         TWCR= 0x44;    
  349. }      
  350. void SPI_Inicializalas() {
  351.         SPCR = 0x58;
  352. }
  353. void ESZKOZOK_Inicializalas()
  354. {
  355.         cli();
  356.         SPI_Inicializalas();
  357.         TWI_Inicializalas();
  358.         Port_Inicializalas();
  359. }
  360. void Port_Inicializalas() {
  361.         DDRB = (1<<PINB0);
  362.     PORTB = 0x00;
  363.         PORTC = 0x00; //m103 output only
  364.         DDRC  = 0x00;
  365.         PORTD = 0x00;
  366.         DDRD  = 0xFF;
  367. }
  368. int main(void) // Foprogram
  369. {
  370.         unsigned char* tempDisplay;
  371.         KonfigUART();
  372.         init_interrupts();
  373.         ESZKOZOK_Inicializalas();
  374.         sei();
  375.         ds1621_init();
  376.         _delay_ms(100);
  377.         while(1) {  
  378.           if(PORTB & (1<<PINB0)) PORTB &= ~(1<<PINB0);
  379.           else PORTB |=  (1<<PINB0);
  380.                  tempDisplay = getTemperature();
  381.                  _delay_ms(200);
  382.                  for(int i = 0;i< 5; i++) {
  383.                         UARTAdatKuld(tempDisplay[i]);
  384.                  }
  385.                  UARTAdatKuld('\n');
  386.                  UARTAdatKuld('\r');
  387.           _delay_ms(3000);       
  388.    }
  389. }
A hozzászólás módosítva: Okt 31, 2012
(#) girhes.main válasza girhes.main hozzászólására (») Okt 31, 2012 /
 
Kapcsolási rajz hozzá

Nem hiszem, hogy annyi mindent el lehetne b@szni
Olvastam egy ilyet, hogyha 00 a válaszjel akkor SDA vonal GND-re húzva.
A hozzászólás módosítva: Okt 31, 2012
(#) girhes.main válasza girhes.main hozzászólására (») Okt 31, 2012 /
 
OK, meg van oldva!
TWBR értéke rosszul volt beállítva!
Következő: »»   491 / 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