filipson
Użytkownicy-
Zawartość
7 -
Rejestracja
-
Ostatnio
Wszystko napisane przez filipson
-
Układ jest zasilany z programatora usb, czyli 5V. Zwarłem TxD i RxD przejściówki i RealTerm zwraca symbol, który wysłałem, czyli OK. TxD i RxD jest dobrze podłączone do Atmegi, sprawdzałem zamianę. Może dzisiaj uda mi się sprawdzić częstotliwość na oscyloskopie. [EDIT] OK, udało się, zabrakło jednego wpisu do rejestru UCSRC, który był w datasheet ;/ (1<<URSEL) Dziękuję wszystkim za pomoc!
-
Dzięki za odzew:) co do funkcji ze "stringiem" to i tak nie jest wywoływana, poprostu siedzi w kodzie Jak na razie dostaję same zera w terminalu, ponoć jest to problem ze złym dobraniem częstotliwości. Jednak wszystko robiłem zgodnie z datasheet.
-
Witam ponownie mam problem z obsługą USART na Atmedze8 z wew. generatorem 8Mhz Używam przejściówki USB->RS232 na MAX232, i tu dziwne zjawisko: kiedy cały układ jest zasilany, podpięty do komupera, nic się nie dzieje. Jeśli odłączę przejściówkę od USB zaczynają w niej mrugać diody(sygnalizują transmisję?) kod z Atmegi: #include <avr/io.h> #include <util/delay.h> //void setAngle(int angle); //void InitServ(void); #include <inttypes.h> #include <avr/interrupt.h> #include <string.h> #include <stdint.h> #define USART_BAUD 9600 #define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1) /*UART*/ void USART_Init(unsigned int ubrr) ; void USART_Transmit( unsigned char data ) ; unsigned char USART_Receive( void ) ; void USART_TransmitString (unsigned char *str) ; void main(void) { unsigned char d[] = {'x','y','z'}; unsigned char z = 'a'; USART_Init(USART_UBBR_VALUE); //InitServ(); //int i; while(1) { USART_TransmitString (d); USART_Transmit(z); } } Z góry dzięki za jakąkolwiek pomoc! :) void USART_Init (unsigned int ubrr) { // Set baud rate UBRRH = (unsigned char)(USART_UBBR_VALUE>>8); UBRRL = (unsigned char)USART_UBBR_VALUE; // Enable receiver and transmitter UCSRB = (1<<RXEN)|(1<<TXEN); // Set frame format to 8 data bits, no parity, 1 stop bit UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCSZ2); } void USART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ) ; /* Put data into buffer, sends the data */ UDR = data; } void USART_TransmitString (unsigned char *str) { int i = 0; for (i=0; str[i]!='\0'; i++) { USART_Transmit(str[i]); _delay_ms(50); } } unsigned char USART_Receive(void) { // Wait until a byte has been received while((UCSRA&(1<<RXC)) == 0); // Return received data return UDR; }
-
Mam problem z czujnikami cny70 w moim lf-ie. Mam ich 5, z czego jeden ostatnio sie zepsuł więc dokupiłem nowy. problem z tym, że 4 czujniki przy czarnej lini dają ok 3V, a ten nowy ok 1V. Zauwazyłem małą różnicę w oznaczeniach. nowy czujnik to cny-70 v69 118, pozostale 4 to cny-70 v69 105 Nie znalazłem nic na temat tych oznaczeń w datasheet Myślicie, że różnica napięć może mieć związek z tą liczbą?
-
[C] ADC, pomiar z kolejnych kanałów
filipson odpisał w temacie użytkownika filipson • Mikrokontrolery
@Robodude OK, sprawdzilem, zmienilem prog bo faktycznie cos pomieszalem. Jednak najwazniejsze okazalo sie byc numerowanie zmiennej channel. Robilem to od 0 do 4 co nie mialo zbytniego sensu poniewaz czujniki sa na pinach PA3-PA7 wszystko dziala. musze wymienic jeden czujnik bo jest zepsuty(sprawdzalem aparatem, dioda IR nie swieci) @Harnas dzieki za funckje, jednak zalezalo mi na wykorzystaniu przerwan Pozdrawiam -
[C] ADC, pomiar z kolejnych kanałów
filipson odpisał w temacie użytkownika filipson • Mikrokontrolery
Nie wiem czy mnie dobrze zrozumiales przy czarnym mam ok 2,6V, a przy bialmy ok 0,1V\ to chyba odpowiedni zakres zmian? mam oporniki 200Ohm(inaczej niz w schemacie, robione na szybko a akurat nie mialem 330 w smd 0805) przy diodach i 47k przy kolektorze. -
witam. mam problem z moim algorytmem. mam 5 czujników CNY70(1 chwilowo zepsuty). Pomiary wykonuję poprzez przerwanie adc_vect. Mam napisana funkcje diagnostyczna void run_diagnostic(void) która zapala diody odpowiadające poszczególnym czujnikom w przypadku wykrycia koloru czarnego. Jednak ta sygnalizacja nijak ma się do rzeczywistości. Próg dobierałem kilka razy, ale nie ma to zbyt dużego wpływu. Starałem się zrobić to wg zasady wart_adc=Uzm/Uref*1024. U mnie Uzm dla czarnego to od 2,6 do 2,8V. /* * filbat.c * * Created: 2011-12-05 19:52:45 * Author: filip grzeszczak, aleksy kabat */ #include <avr/io.h> #include <util/delay.h> //#include <math.h> #include <avr/interrupt.h> #include "inc/porty.h" #include "inc/pid.h" #include "inc/silniki.h" /* F_CPU 16 000 000 */ #define ADC_P 600 //próg ADC uint8_t alg_flag; //flaga dla algorytmu uint8_t diag_flag; //flaga dla przelaczenia w trym serwisowy volatile uint8_t adc_flag; // flaga ADC volatile int sensors[5]; //tablica przechowujaca wartosci napiecia na czujnikach zwracane przez ADC volatile uint8_t channel=0; //indeks tablicy sensors[] /****************************run_lf******************************** funkcja odczytuje stan senow na pinach PA0..PA4 i zapisuje go w tablicy sen_status[]. Stan senow jest przemnazany zgodnie z przyjeta waga. Na podstawie koncowych wartosci skladowych sen_status[] obliczany jest blad diff. zmienna diff jest dalej przekazywana do funkcji pid. ******************************************************************/ void run_lf(void) { short int sen2L,sen1L,sen0,sen1R,sen2R; short int diff=0; //blad obliczany z wag czujnikow short int turn=0; //skret wyliczony przez PID na podstwie diff short int PowerL=0; short int PowerR=0; while(alg_flag){ //ADMUX |= (0x0F & channel); ADMUX &= 0xf0; ADCSRA |= (1<<ADSC); if(adc_flag) { if(sensors[0] > ADC_P) { sen2L = -4; //sen_channel++; } else sen2L = 0; if(sensors[1] > ADC_P) { sen1L = -2; //sen_channel++; } else sen1L = 0; if(sensors[2] > ADC_P) { sen0 = 0; //sen_channel++; } else sen0 = 0; if(sensors[3] > ADC_P) { sen1R = 2; //sen_channel++; } else sen1R = 0; if(sensors[4] > ADC_P) { sen2R = 4; //sen_channel++; } else sen2R = 0; diff=sen1L+sen2L+sen0+sen1R+sen2R; //sumowanie wag czujnikow } //endif turn=PIDcall(diff); if(turn==0) { PowerL=MAX_DUTY; PowerR=MAX_DUTY; }//endif else{ PowerR = MAX_DUTY - turn; PowerL = MAX_DUTY + turn; }//endelse GoAhead(PowerL,PowerR); adc_flag=0; //zerowanie flagi dla pomiaru if((PIND & (1<<PIND3))==0) { _delay_ms(100); alg_flag=0; } } //endwhile LED0_ON; }//end run_lf() void run_diagnostic(void) { ADMUX |= (0x0F & channel); ADCSRA |= (1<<ADSC); while(diag_flag) { if(adc_flag) { if(sensors[0] > ADC_P) { LED2L_ON; } else LED2L_OFF; if(sensors[1] > ADC_P) { LED1L_ON; } else LED1L_OFF; if(sensors[2] > ADC_P) { LED0_ON; } else LED0_OFF; if(sensors[3] > ADC_P) { LED1R_ON; } else LED1R_OFF; _delay_ms(100); ADMUX |= (0x0F & channel); ADCSRA |= (1<<ADSC); }//endif if((PIND & (1<<PIND2))==0) { diag_flag=0; } } LED0_ON;//endwhile }//end run_diagnostic() /*#######################################################*/ /*------------------------MAIN---------------------------*/ int main(void) { ports_init(); LED0_ON; ADMUX |= (1 << REFS0); // Włączenie ADC + napięcie odniesienia ADCSRA |= (1<<ADEN) | (1<<ADIE); // Interrupt Enable ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Częstotliwość pracy (preskaler = 128, fp=125kHz) sei(); //wlaczenie globalnych przerwan while(1) { if((PIND & (1<<PIND3))==0) { //wlacznik algorytmu _delay_ms(100); LED0_OFF; alg_flag=1; run_lf(); }//endif if((PIND & (1<<PIND2))==0) { //wlacznik trybu serwisowego, mozliwy tylko przy wylaczonym algorytmie _delay_ms(100); LED0_OFF; diag_flag=1; run_diagnostic(); } }//endwhile }//end main() // ***** OBSŁUGA PRZERWANIA ADC ***** // ISR(ADC_vect) { sensors[channel] = ADCW; channel++; //ADMUX |= (0x0F & channel); [b] //TEGO NIE ROZUMIEM DO KOŃCA![/b] ADMUX &= 0xf0; //zerowanie 4 młodszych bitów ADMUX |= channel; //ustawianie numeru kanału if(channel<5) { ADCSRA |= (1<<ADSC); //zainicjowanie kolejnego pomiaru } else { channel=0; //wyzerowanie licznika adc_flag=1; //ustawienie flagi sygnalizujacej zakonczenie pomiaru } } Część funkcji, min. PID i ustawianie portów są w innych plikach. Narazie nie mają znaczenia, chodzi o funkcję run_diagnostic i pomiar ADC. Myślę, żę błędnie przełączam kanały do kolejnych pomiarów. Prawde mówiąc nie do końca rozumiem ten zapis, skopiowałem go z innego algorytmu. Mam nadzieję, że ktoś pomoże mi to zrozumieć EDIT dodaje schemat :
