Fórum témák
- • Mosógép vezérlők és általános problémáik
- • Videoton RT7300S
- • Felajánlás, azaz ingyen elvihető
- • GSM adatátvitel
- • TV hiba, mi a megoldás?
- • Audiofil, High End Audio
- • Aszinkron motorok tekercselése
- • Műveleti erősítő
- • Műhelyünk felszerelése, szerszámai
- • Akkumulátor töltő
- • Klíma szervizelés, javítás
- • Energomat mosógép
- • Villanyszerelés
- • Bluetooth kérdések
- • Alternativ HE találkozó(k)
- • Mosogatógép hiba
- • Vezeték nélküli csengő más célra
- • CNC építése házi alkatrészekből az alapoktól
- • V-FET és SIT erősítő kapcsolások
- • Hegesztő inverter javítás
- • EL84 kimenő trafó
- • Magnetométer építése
- • Elektromágneses terek kockázatértékelése
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • Rádió áthangolása, OIRT - CCIR konverter
- • Porszívó javítás
- • Kombikazán működési hiba
- • Kapcsolóüzemű tápegység
- • Vicces - mókás történetek
- • Riasztószerelés tapasztalatok, ötletek (kizárólag haladóknak)
- • Erősítő mindig és mindig
- • Kávéfőzőgép hiba
- • Muzeális készülékek-alkatrészek restaurálása
- • Vag-com-hex interfész (kábel hibák)
- • Kamerás megfigyelőrendszer
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Mágnes
- • Szintetizátor javítás
- • Házilag építhető fémkereső
- • Villanypásztor
- • Takarítógép problémák
- • Autóelektronika
- • Kapcsolóüzemű táp 230V-ról
- • LED-es kivezérlésjelzők
- • Tranzisztorok helyettesítése
- • Adatlapot keresek
- • Elfogadnám, ha ingyen elvihető
- • VU meter probléma
- • Vásárlás, hol kapható?
- • Kaputelefon
- • Labortápegység készítése
- • Elektronyika orosz digitális órák
- • Műterhelés építése
- • Boombox javítás
- • Mobiltelefon hiba
» Több friss téma
|
Fórum » AVR - Miértek hogyanok
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
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
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 ?
Ha mindegyik más címen van akkor semmi akadálya!
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...
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.
int main(void)
{
UART_Config();
int num=14;
char buffer[30];
itoa(num,buffer,10);
while (!(UCSR0A & (1 << UDRE0)));
UDR0 = buffer;
}
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:
Gondolom dob eleve egy warningot is.
És igen, lásd második kép
Helyesen így lenne:
vagy
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
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...
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
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!
Ü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.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char KP;
int main(void)
{
SPI_DDR |= (1<<SCK)|(1<<MOSI)|(1<<CE)|(1<<CS0)|(1<<CS1)|(1<<CS2)|(1<<CS3);
SPCR |= (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0);
SPCR &= ~(1<<DORD);
SPSR |= (1<<SPI2X);
sei();
GICR |= (1<<INT0);
MCUCR |= (1<<ISC00)|(1<<ISC01);
DDRD &= ~(1<<PIND2);
PORTD &= ~(1<<PIND2);
DDRD |= 1<<DDD4;
MCPWR(IOCON, 0x6A);
MCPWR(IODIRB, 0xFF);
MCPWR(GPINTENB, 0xFF);
MCPWR(INTCONB, 0xFF);
MCPWR(DEFVALB, 0x00);
MCPWR(IODIRA, 0x00);
/*
MCPWR(IODIRA, 0xFF);
MCPWR(GPINTENA, 0xFF);
MCPWR(DEFVALA, 0x00);
MCPWR(INTCONA, 0xFF);*/
while(1)
{
MCPWR(GPIOA, KP);
_delay_ms(1000);
}
}
ISR(INT0_vect)
{
PORTD ^= 1<<PIND4;
KP = 0x00;
KP = MCPRD(GPIOB);
GIFR |= (1<<INTF0);
}
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
Hohó, ez király, köszi szépen! 
Be is ment a kedvencekbe.
Este megpróbálom, remélem, csak ennyi volt a gond.
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
Most én nem értem vagy senki sem?
É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.
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!
zsuscsinyo, zombee:
Köszi a segítséget, megoldotta a problémát.
Így már rendesen működik.
Ü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
Csak nem Mikrokontroller Laboratórium lesz?
Az én (megoldott) házim eredménye a csatolt képen látható.
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
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.
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.
#define F_CPU 8000000UL
#define USART_BAUDRATE 9600
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)
#define START_CONVERT 0xEE
#define STOP_CONVERT 0x22
#define READ_TEMP 0xAA
#define READ_COUNTER 0xA8
#define READ_SLOPE 0xA9
#define ACCESS_CONFIG 0xAC
#define START 0x08
#define REPEAT_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NACK 0x58
#define ARB_LOST 0x38
#define ERROR_CODE 0x7e
#define SCL_CLOCK 100000L
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <compat/twi.h>
void KonfigUART()
{
UBRR0H = (unsigned char)(UBRR_ERTEK >> 8);
UBRR0L = (unsigned char)UBRR_ERTEK;
UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);
UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
}
char UARTAdatFogad() {
while(!(UCSR0A & (1<<RXC0))) {
}
return UDR0;
}
void UARTAdatKuld(char data) {
while(!(UCSR0A & (1<<UDRE0))) {
}
UDR0=data;
}
//*************************************************
//Function to start i2c communication
//*************************************************
unsigned char i2c_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Send START condition
while (!(TWCR & (1<<TWINT))); //Wait for TWINT flag set. This indicates that the
//START condition has been transmitted
if ((TWSR & 0xF8) == START) //Check value of TWI Status Register
return(0);
else
return(1);
}
//*************************************************
//Function for repeat start condition
//*************************************************
unsigned char i2c_repeatStart(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Send START condition
while (!(TWCR & (1<<TWINT))); //Wait for TWINT flag set. This indicates that the
//START condition has been transmitted
if ((TWSR & 0xF8) == REPEAT_START) //Check value of TWI Status Register
return(0);
else
return(1);
}
//**************************************************
//Function to transmit address of the slave
//**************************************************
unsigned char i2c_sendAddress(unsigned char address)
{
unsigned char STATUS;
if((address & 0x01) == 0)
STATUS = MT_SLA_ACK;
else
STATUS = MR_SLA_ACK;
TWDR = address;
TWCR = (1<<TWINT)|(1<<TWEN); //Load SLA_W into TWDR Register. Clear TWINT bit
//in TWCR to start transmission of address
while (!(TWCR & (1<<TWINT))); //Wait for TWINT flag set. This indicates that the
//SLA+W has been transmitted, and
//ACK/NACK has been received.
if ((TWSR & 0xF8) == STATUS) //Check value of TWI Status Register
return(0);
else
return(1);
}
//**************************************************
//Function to transmit a data byte
//*************************************************
unsigned char i2c_sendData(unsigned char data)
{
TWDR = data;
TWCR = (1<<TWINT) |(1<<TWEN); //Load SLA_W into TWDR Register. Clear TWINT bit
//in TWCR to start transmission of data
while (!(TWCR & (1<<TWINT))); //Wait for TWINT flag set. This indicates that the
//data has been transmitted, and
//ACK/NACK has been received.
if ((TWSR & 0xF8) != MT_DATA_ACK) //Check value of TWI Status Register
return(1);
else
return(0);
}
//*****************************************************
//Function to receive a data byte and send ACKnowledge
//*****************************************************
unsigned char i2c_receiveData_ACK(void)
{
unsigned char data;
TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))); //Wait for TWINT flag set. This indicates that the
//data has been received
if ((TWSR & 0xF8) != MR_DATA_ACK) //Check value of TWI Status Register
return(ERROR_CODE);
data = TWDR;
return(data);
}
//******************************************************************
//Function to receive the last data byte (no acknowledge from master
//******************************************************************
unsigned char i2c_receiveData_NACK(void)
{
unsigned char data;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))); //Wait for TWINT flag set. This indicates that the
//data has been received
if ((TWSR & 0xF8) != MR_DATA_NACK) //Check value of TWI Status Register
return(ERROR_CODE);
data = TWDR;
return(data);
}
//**************************************************
//Function to end the i2c communication
//*************************************************
void i2c_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //Transmit STOP condition
}
unsigned char tempDisplay[] = "+xx.x";
//******************************************************************
//Function to send command
//******************************************************************
{
unsigned char errorStatus, data;
errorStatus = i2c_start();
if(errorStatus == 1)
{
i2c_stop();
return;
}
errorStatus = i2c_sendAddress (DS1621_W );
if(errorStatus == 1)
{
i2c_stop();
return;
}
errorStatus = i2c_sendData(ACCESS_CONFIG);
if(errorStatus == 1)
{
i2c_stop();
return;
}
errorStatus = i2c_sendData(0x03); //commmand to set o/ppolarity high, single shot conversion
if(errorStatus == 1)
{
i2c_stop();
return;
}
i2c_stop();
}
//******************************************************************
//Function to send command
//******************************************************************
void ds1621_sendCommand (unsigned char command )
{
unsigned char errorStatus, i, data;
errorStatus = i2c_start();
if(errorStatus == 1)
{
i2c_stop();
return;
}
errorStatus = i2c_sendAddress (DS1621_W );
if(errorStatus == 1)
{
i2c_stop();
return;
}
errorStatus = i2c_sendData(command);
if(errorStatus == 1)
{
i2c_stop();
return;
}
i2c_stop();
}
//******************************************************************
//Function to read
//******************************************************************
unsigned char ds1621_readValue (unsigned char value )
{
unsigned char errorStatus, data;
errorStatus = i2c_start();
if(errorStatus == 1)
{
i2c_stop();
return (0);
}
errorStatus = i2c_sendAddress (DS1621_W );
if(errorStatus == 1)
{
i2c_stop();
return (0);
}
errorStatus = i2c_sendData(value);
if(errorStatus == 1)
{
i2c_stop();
return (0);
}
errorStatus = i2c_repeatStart();
if(errorStatus == 1)
{
i2c_stop();
return (0);
}
errorStatus = i2c_sendAddress (DS1621_R );
if(errorStatus == 1)
{
i2c_stop();
return (0);
}
data = i2c_receiveData_NACK();
i2c_stop();
return (data);
}
//******************************************************************
//Function to read
//******************************************************************
unsigned char* getTemperature(void)
{
char temperature, counter, slope;
int temp;
float actualTemp;
ds1621_sendCommand ( START_CONVERT );
_delay_ms(1000);
temperature = ds1621_readValue ( READ_TEMP );
counter = ds1621_readValue ( READ_COUNTER );
slope = ds1621_readValue ( READ_SLOPE );
actualTemp = (float)temperature - 0.25 + ((float)(slope - counter) / (float)slope);
temp=(int)(actualTemp * 10.0); //to include decimal point for display
if((actualTemp*10.0 - temp) >= 0.5) temp=temp+1;
// tempDisplay[8]=0xdf; //Symbol of degree
if(temp < 0)
{
tempDisplay[0] = '-';
temp *= -1;
}
else
{
tempDisplay[0] = '+';
}
tempDisplay[4] = ((unsigned char)(temp%10)) | 0x30;
temp=temp/10;
tempDisplay[2] = ((unsigned char)(temp%10)) | 0x30;
temp=temp/10;
tempDisplay[1] = ((unsigned char)(temp%10)) | 0x30;
temp=temp/10;
return tempDisplay;
}
void TWI_Inicializalas() {
TWCR= 0x00;
TWBR= ((F_CPU/SCL_CLOCK)-16)/2;
TWSR= 0x00;
TWAR= 0x00;
TWCR= 0x44;
}
void SPI_Inicializalas() {
SPCR = 0x58;
}
void ESZKOZOK_Inicializalas()
{
cli();
SPI_Inicializalas();
TWI_Inicializalas();
Port_Inicializalas();
}
void Port_Inicializalas() {
DDRB = (1<<PINB0);
PORTB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
}
int main(void) // Foprogram
{
unsigned char* tempDisplay;
KonfigUART();
init_interrupts();
ESZKOZOK_Inicializalas();
sei();
_delay_ms(100);
while(1) {
if(PORTB & (1<<PINB0)) PORTB &= ~(1<<PINB0);
else PORTB |= (1<<PINB0);
tempDisplay = getTemperature();
_delay_ms(200);
for(int i = 0;i< 5; i++) {
UARTAdatKuld(tempDisplay[i]);
}
UARTAdatKuld('\n');
UARTAdatKuld('\r');
_delay_ms(3000);
}
}
A hozzászólás módosítva: 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
OK, meg van oldva!
TWBR értéke rosszul volt beállítva!
|
|