Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Rejestry (ADUC812)

grzenio84
-
-
Posty:3
Rejestracja:2 cze 2008, o 20:51
Lokalizacja:Warka
Rejestry (ADUC812)

Postautor: grzenio84 » 2 cze 2008, o 21:03

czy mógłby mi ktoś wyjaśnić dokładnie ten zapis programu w C dla mikrokontrolera ADUC812 i po co to??:

zmienna = ADCDATAL | ((ADCDATAH& 0x0F) <<8)

MDz
-
-
Posty:365
Rejestracja:29 mar 2003, o 13:35
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: MDz » 3 cze 2008, o 00:30

zmienna = ADCDATAL | ((ADCDATAH& 0x0F) <<8)
http://www.analog.com/UploadedFiles/Dat ... DUC812.pdf -> str.12

Wynikiem przetwarzania ADC jest słowo 12 bitowe rozbite w dwóch osobnych rejestrach ADCDATAH i ADCDATAL.

8 młodszych bitow wyniku mieści się w całości w rejestrze ADCDATAL.
4 najstarsze bity wyniku okupują młodszą połowkę rejestru ADCDATAH, współdzieląc go z numerem kanału (CH-ID) zakodowanym na starszych 4 bitach tegoż rejestru.

Do dalszych obliczeń musisz umieścić wynik przetwarzania w jednej zmiennej typu uint16. No i to właśnie jest zadaniem Twojego kawałka kodu.

ADCDATAH & 0x0F -> zeruje bity numeru kanału (tzn.: xxxxHHHH -> 0000HHHH)

(ADCDATAH& 0x0F) <<8 -> przesuwa użyteczne 4 bity wyniku o 8 miejsc w lewo, czyli de facto do starszego bajtu słowa uint16
(tzn. 0000000 0000HHHH -> 0000HHHH 00000000).

ADCDATAL | ((ADCDATAH& 0x0F) <<8) -> sumuje logicznie z mlodszymi 8 bitami wyniku,
czyli:

0000HHHH 00000000
or
00000000 LLLLLLLL
=
0000HHHH LLLLLLLL

c.n.d. ;)

--
MDz

grzenio84
-
-
Posty:3
Rejestracja:2 cze 2008, o 20:51
Lokalizacja:Warka

Postautor: grzenio84 » 11 cze 2008, o 12:57

Dzięki wielkie, bardzo mi to pomogło :)

[ Dodano: 11-06-2008, 14:23 ]
jest to program napisany w C dla mikrokontrolera ADU812. Wszystko jest jasne do momentu gdy następuje konfiguracja przetwornika A/C. Ustawiony jest tam tryb przeładowania licznika, w momencie gdy licznik chyba T2 zostanie przepełniony, następuje uruchomienie się przetwornika A/C.

Jeżeli jeszcze będziesz mi w stanie pomóc i wytłumaczyc to będe bardzo wdzięczny. Z góry dziękuję za pomoc.

#include <ADUC812.h>
#include <stdio.h>

unsigned int zmienna;
void adc_int () interrupt 6
{
zmienna=ADCDATAL |((ADCDATAH&0x0f)<<8);
P3^=0x10;
printf("Wynik przetwarzania ADC = %02BX%02BX\n",zmienna);
}

void main(void)
{
/* konfiguracja UART */
SCON = 0x52;
TMOD = 0x20;
TH1 = 0xFD;
TR1 = 1;
TI=1;

/*konfiguracja przetwornika A/C */
ADCCON1 = 0x62;
ADCCON2 = 0x01;
RCAP2L = 0x00;
RCAP2H = 0x4C;
TL2 = 0x00;
TH2 = 0x4C;

/*konfiguracja przetwornika C/A */
DACCON=0x7B;
IE = 0xC0;
T2CON = 0x04;

while(1)
{
DACCON&=~0x04;
DAC0H=zmienna >>8;
DAC0L=zmienna&0xff;
DACCON |= 0x04;
}
}

Wróć do „8051”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 17 gości