AD -> UART, pomoc s programem

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 02:00
Bydliště: Praha

#16 Příspěvek od WLAB »

Andrea píše:Tak třeba ATmega48/88/168 a vůbec novější ATmegy umí spouštět od T/C0, T/C1, Int0 a analogového komparátoru.
To je uz rozumne, ale neni to pripad te ATmegy8....
Jeste by mohli zavest alespon 2 urovnovy prerusovaci system a spousta aplikaci by se na tom psala lepe.

Uživatelský avatar
_serafin_
Příspěvky: 37
Registrován: 30 zář 2010, 02:00

#17 Příspěvek od _serafin_ »

Ahoj všem, konečně si mi snad podařilo sepsat zdrojový kód (za pomoci různých článků, datasheetu a různých jiných kódů). Moc Vás prosím o kontrolu.
#include <avr/io.h>
#include <inttypes.h>

void InitADC()
{
//reference je napájecí napětí, zarovnání doprava (rozlišení bude 8bit)
ADMUX|= (1<<REFS0)|(1<<ADLAR);

//zapne adc, dělící poměr je 64
ADCSRA|= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);
}

uint8_t ReadADC()
{
// spustí první konverzi a pokračuje ve free running modu
ADCSRA|= (1<<ADSC)|(1<<ADFR);

return (ADCH);
}

void InitUSART(uint16_t ubrr_value)
{
//nastaví přenosovou rychlost na 9600baud
UBRRL= ubrr_value;
UBRRH= (ubrr_value >>8 );


//nastaví formát rámce, asynchronní mode, bez parity, 1 stopbit, délak slova 8bit
UCSRC= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

// povolí vysílač
UCSRB= (1<<TXEN);
}

void USARTWriteChar(char data)
{
// počká, dokud vysálač není připraven
while(!(UCSRA & (1<<UDRE)))
{
//nedělá nic
}

// vynuluje bit TxC
UCSRA|= (1<<TXC);

// zapíše data do buffru USARTu
UDR= data;
}

void main()
{
char data;

// inicializace USART
InitUSART(51);

// inicializace ADC
InitADC();


// přečte data z ADC
data= ReadADC(0);

// odešle data z ADC skrz TxD
USARTWriteChar(data);


while(1);

}
}
}
Procesor by měl fungovat tak, že hned po připojení napájení se spustí ADC a odesílání přes USART (i kdyby nakonec na monitoru měla být jen rovná čára). Převod i komunikace bude fungovat dokud bude připojeno napájení.

Děkuji všem :-).
Naposledy upravil(a) _serafin_ dne 23 říj 2010, 00:20, celkem upraveno 1 x.

Uživatelský avatar
WLAB
Příspěvky: 867
Registrován: 13 zář 2005, 02:00
Bydliště: Praha

#18 Příspěvek od WLAB »

A zkousel jsi to prelozit :?: :?: :?:

At glance:
- na konci je nejak moc zavorek
- program provede cosi s daty a pak skonci ve while(1); bud to dej cele do while cyklu, nebo pred ten while dej "do" a operace s adc a uartem dej mezi to do bloku.
- u ADC se mi zda ze necekas na validni vysledek prevodu
- ADC ve freerunu startuj jinde,nez v te cteci procedure.
- kdyz funkce nema zadny parametr nemuze tam nic predavat, ani tu nulu
- u tech deklaraci ti chybu v parametrech void
.
.
.
.

Uživatelský avatar
_serafin_
Příspěvky: 37
Registrován: 30 zář 2010, 02:00

#19 Příspěvek od _serafin_ »

to WLAB: Přeložit jsem to ještě nezkoušel. Nějak nemůžu rozchodit AVR studio. Ať zkouším přeložit cokoliv (i úplně primitivní program), tak mi to zkončí chybou:

make: Makefile: No such file or directory
make: *** No rule to make target `Makefile'. Stop.

Instaloval jsem to podle tohoto návodu http://forum.mcontrollers.com/viewtopic.php?p=5779#5779 a stejně mi to končí chybou.

Závorka sem, závorka tam :lol:, už jsem to opravil tak to snad sedí.

S tím "do" jsi to myslel takhle:
#include <avr/io.h>

.
.
.


void main()
{
char data;

do{

// inicializace USART
InitUSART(51);

// inicializace ADC
InitADC();


// přečte data z ADC
data= ReadADC(0);

// odešle data z ADC skrz TxD
USARTWriteChar(data);
}
while(1);
}
a nebo takhle:
#include <avr/io.h>

.
.
.


void main()
{
char data;

// inicializace USART
InitUSART(51);

// inicializace ADC
InitADC();

do{
// přečte data z ADC
data= ReadADC(0);

// odešle data z ADC skrz TxD
USARTWriteChar(data);
}
while(1);
}
:?:

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“