Witam,
Pracujê nad uk³adem, którego sercem jest uC Atmel AVR32 UC3B0256. Po¶ród innych, do uk³adu podpiête s± tranzystory i diody ¶wiec±ce (wyj¶cia PA05, PA06, PA07, PA08). Wej¶cie PA03 pracuje jako wej¶cie przetwornika analogowo-cyfrowego (kana³ nr 6). PA04 nie jest do niczego pod³±czone. Mam ponadto pod³±czony wy¶wietlacz LCD (2x24) obs³ugiwany za pomoc± mojej ma³ej biblioteczki. Kwarc 12MHz, uC pracuje na 60MHz.
Proszê spojrzeæ na przyk³adowy program ilustruj±cy zjawisko, które opiszê poni¿ej.
#include <avr32/io.h>
#include "pm.h" #include "gpio.h" #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "adc.h" #include "lcd.h"
/* w parametrach AVR32studio ustawiono USE_8_BITS_ADC,
- optymalizacja -O3
*/
#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency.
#define FOSC0 12000000 //!< Osc0 frequency: Hz. #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods.
#define ADC_CHANNEL 6 #define ADC_PIN AVR32_ADC_AD_6_PIN #define ADC_FUNCTION AVR32_ADC_AD_6_FUNCTION
static volatile avr32_adc_t * adc= (volatile avr32_adc_t *) &AVR32_ADC;
volatile avr32_gpio_port_t *gpio_port_A = &AVR32_GPIO.port[0];
void localStartPLL(void) { pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP); pm_pll_setup(&AVR32_PM, 0, // pll.
9, // mul.
1, // div.
0, // osc.
16); // lockcount. pm_pll_set_option(&AVR32_PM, 0, // pll.
1, // pll_freq.
1, // pll_div2.
0); // pll_wbwdisable. pm_pll_enable(&AVR32_PM, 0); pm_wait_for_pll0_locked(&AVR32_PM); pm_gc_setup(&AVR32_PM, 0,1,0,0,0); pm_gc_enable(&AVR32_PM, 0); pm_cksel(&AVR32_PM,
0, // pbadiv.
0, // pbasel.
0, // pbbdiv.
0, // pbbsel.
0, // hsbdiv.
0); // hsbsel.
//flashc_set_wait_state(1); pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); }
void initADC() { // GPIO pin/adc-function map. static const gpio_map_t ADC_GPIO_MAP = { {ADC_PIN, ADC_FUNCTION}, };
// Assign and enable GPIO pins to the ADC function. gpio_enable_module(ADC_GPIO_MAP, sizeof(ADC_GPIO_MAP) / sizeof(ADC_GPIO_MAP[0]));
// configure ADC adc_configure(adc);
/* MCK/2, if PRESCAL is 0, and MCK/128, if PRESCAL is set to 63 (0x3F)
- ADC Clock Frequency 10-bit resolution mode, 5MHz,
- ADC Clock Frequency 8-bit resoltuion mode, 8MHz
*/ adc->mr |= 63 << AVR32_ADC_PRESCAL_OFFSET;
gpio_port_A->puerc = 1 << (ADC_PIN & 0x1F);
adc_enable(adc, ADC_CHANNEL); }
int main(void) { char s[25];
localStartPLL();
gpio_local_init();
flashc_set_wait_state(1);
initLCD();
initADC();
gpio_port_A->oders = 1 << ((AVR32_PIN_PA05) & 0x1F);
gpio_port_A->ovrs = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!
while(1) { adc_start(adc); int aaa = adc_get_value(adc, ADC_CHANNEL);
setCursorPos(24); sprintf(s, "%d ", aaa); showString(s); }
return 0; }
Je¿eli uruchomiê powy¿ej przedstawiony program, to na wy¶wietlaczu LCD pojawi siê cyfra 4. Potencjometr pod³±czony do ADC jest skrêcony na minimum. Warto zauwa¿yæ, ¿e PA05 jest ustawiony na 1 -- odpowiednia dioda siê ¶wieci. Teraz za³ó¿my, ¿e modyfikujemy liniê oznaczon± w kodzie znakami !!!!!! z:
gpio_port_A->ovrs = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!
na:
gpio_port_A->ovrc = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!
Innymi s³owy, dioda pod³±czona do PA05 nie bêdzie teraz ¶wieciæ. Co dziwne, teraz na wy¶wietlaczu mo¿emy odczytaæ warto¶æ 1, a nie
4, jak by³o to uprzednio. (Zjawisko jest powtarzalne). Kto¶ móg³by powiedzieæ, ¿e w³±czenie tej diody powoduje jakie¶ obci±¿enie uk³adu i st±d inny wynik z ADC. Ale tak chyba nie jest bo po pierwsze warto¶æ w takim przypadku powinna byæ mniejsza, a nie wiêksza, a po drugie sprawdzane by³y wszelkie napiêcia i nie wahaj± siê one nawet o miliwolt. Ponadto, ¶cie¿ka zosta³a przeciêta przy samym uC, ¿eby odci±æ diodê, tranzystor, itp., ale to w ogóle nie wp³ynê³o na wynik (nadal w³±czenie PA05 powoduje, ¿e warto¶æ odczytana z ADC jest inna, ni¿ w przypadku, gdy PA05 jest wy³±czone). Dodam, ¿e zjawisko dotyczy tak¿e innych wyj¶æ z tranzystorami i diodami (PA06, PA07, PA08). Co dziwne, je¶li program zmodyfikujemy tak, ¿e zamiast PA05 sterujemy wyj¶ciem PA04 (do niego nic nie jest pod³±czone), to warto¶æ odczytywana z ADC jest stabilna, niezale¿nie od tego, czy PA04 jest ustawione, czy wyzerowane.
Pytanie: co mo¿e byæ przyczyn±?
Z góry uprzejmie dziêkujê za rady.
Robbo