Форум РадиоКот https://radiokot.ru/forum/ |
|
Датчик tcs320 и atmega328p https://radiokot.ru/forum/viewtopic.php?f=57&t=175683 |
Страница 1 из 1 |
Автор: | Михаил_avr [ Вс фев 21, 2021 17:32:27 ] |
Заголовок сообщения: | Датчик tcs320 и atmega328p |
Здравствуйте, я хотел подключить датчик цвета tcs320 к микроконтроллеру atmega328p, написал код, но он не работает, подскажите где ошибка. #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define F_CPU 8000000 //---------- #define S0 6 #define S1 3 #define S2 6 #define S3 4 #define sensorOut 2 //---------- volatile unsigned char status; volatile int tim = 0; //---------- void red_value(void) { DDRD &= ~(1 << S2); DDRD &= ~(1 << S3); } //---------- void green_value(void) { DDRD &= ~(1 << S2); DDRD &= ~(1 << S3); } //---------- void blue_value(void) { DDRD &= ~(1 << S2); DDRD |= (1 << S3); } //---------- void data_ini(void) { DDRD = B11110111; //DDRD |= (1 << S2); // DDRD |= (1 << S3); } //---------- void int_ini(void) { //включим прерывания INT0 по нисходящему фронту EICRA |= (1 << ISC00); //разрешим внешнее прерывание INT0 и INT1 EIMSK |= (1 << INT0); } //---------- void TIMER_INI(void) { TCCR1A = 0x00; //обычный режим работы таймера TCCR1B = B00000010; //предделитель на 1024 TIMSK1 = 0x00; //прерывание по переполнению нет } //---------- int main(void) { Serial.begin(9600); data_ini(); int_ini(); TIMER_INI(); while (1) { red_value(); while ( status != 2 ); Serial.println(TCNT1); } } //---------- ISR(INT0_vect) { //проверяем уровень синала PD2( ECHO ) if (digitalRead(2)==1) { TCNT1 = 0; status = 1; } else { //задний фронт - запоминаем значение таймера tim = TCNT1; status = 2; } } |
Автор: | Михаил_avr [ Вт фев 23, 2021 12:04:02 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Одну ошибку нашёл в data-ini не тот бин на вход Добавлено after 3 minutes 19 seconds: Тут как с дальномером Hs-spor4 Добавлено after 28 seconds: Тут как с дальномером Hs-spor4 |
Автор: | Михаил_avr [ Вс мар 07, 2021 07:38:14 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Но код не работает |
Автор: | Demiurg [ Вс мар 07, 2021 19:55:52 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Подсказка. Разберитесь для начала, что такое DDRx PORTx. Также, как правильно выставлять управлять отдельными битами портов. |
Автор: | Михаил_avr [ Пн мар 08, 2021 07:48:46 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Здравствуйте, я прочитал про DDRX И PORTX. (Читал на сайте narodstream). Этот код я переделал чуть под hs-sr04, с ним работает а с ts-320 нет хотя функция счета длительности импульса одинаковая. #include <avr/interrupt.h> #include <avr/io.h> #define F_CPU 16000000UL //16MHz #include <util/delay.h> int trigPin = 3; // назначаем имя для Pin8 int echoPin = 2; // назначаем имя для Pin9 volatile unsigned char status; volatile int tim = 0; ISR(INT0_vect) { //проверяем уровень синала PD2( ECHO ) if (PIND & (1 << 2) ) { TCNT1 = 0; status = 1; } else { //задний фронт - запоминаем значение таймера tim = TCNT1; status = 2; } } void int_ini(void) { //включим прерывания INT0 по нисходящему фронту EICRA |= (1 << ISC00); //разрешим внешнее прерывание INT0 и INT1 EIMSK |= (1 << INT0); } //---------- void TIMER_INI(void) { TCCR1A = 0x00; //обычный режим работы таймера TCCR1B = B00000010; //предделитель TIMSK1 = 0x00; //прерывание по переполнению нет } void USORT_Init(unsigned int ubrr) { UBRR0H = (unsigned char)(ubrr >> ; UBRR0L = (unsigned char)ubrr; /*Enable receiver and transmitter */ UCSR0B = (1 << RXEN0) | (1 << TXEN0); UCSR0C = 0x06; /* Set frame format: 8data, 2stop*/ UCSR0C = (1 << USBS0) | (3 << UCSZ00); } void UARTSend(uint8_t data) { while (!(UCSR0A & (1 << UDRE0))); UDR0 = data; } void chislo_printin (unsigned char seg) { switch (seg) { case 1: UARTSend('1'); break; case 2: UARTSend('2'); break; case 3: UARTSend('3'); break; case 4: UARTSend('4'); break; case 5: UARTSend('5'); break; case 6: UARTSend('6'); break; case 7: UARTSend('7'); break; case 8: UARTSend('8'); break; case 9: UARTSend('9'); break; case 0: UARTSend('0'); break; } } //} void chislo_print(unsigned int number) { unsigned int r1 = number % 10; unsigned int r3 = number / 100; unsigned int r2 = (number - r3 * 100) / 10; chislo_printin(r3); chislo_printin(r2); chislo_printin(r1); } void data_ini(void) { DDRD |= (1 << 3); // назначаем trig, как выход DDRD &= ~(1 << 2); // назначаем echo, как вход } void hs_sro4_ini(void) { PORTD &= ~(1 << 3);; _delay_us(2); PORTD |= (1 << 3); _delay_us(10); PORTD &= ~(1 << 3); } int main(void) { data_ini(); USORT_Init(103);// подключаем монитор порта//speed 9600 TIMER_INI(); int_ini(); sei(); while (1) { hs_sro4_ini(); int cm; // назначаем переменную "cm" для показаний датчика status = 0; while ( status != 2 ); cm = tim / 58 / 2; // вычисляем расстояние в сантиметрах chislo_print(cm); // выводим расстояние в сантиметрах UARTSend('c'); UARTSend('m'); UARTSend(0x0d); UARTSend(0x0a); _delay_ms(1000); // ставим паузу в 1 секунду } } |
Автор: | Jack_A [ Пн мар 08, 2021 11:10:45 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Я на Сишках для АВР никогда не писа'л, но разве нельзя написать просто Код: UARTSend(seg + 0x30); вместо этой функции Код: void chislo_printin (unsigned char seg)
{ switch (seg) { case 1: UARTSend('1'); break; case 2: UARTSend('2'); break; case 3: UARTSend('3'); break; case 4: UARTSend('4'); break; case 5: UARTSend('5'); break; case 6: UARTSend('6'); break; case 7: UARTSend('7'); break; case 8: UARTSend('8'); break; case 9: UARTSend('9'); break; case 0: UARTSend('0'); break; } } |
Автор: | Михаил_avr [ Пн мар 08, 2021 14:01:02 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Спасибо большое ваша функция работает также, но она быстрее, и памяти занимает она меньше. Добавлено after 32 minutes 12 seconds: А если вы на ассемблере писали не могли бы вы подсказать тут где ошибка RJMP RESET RESET: LDI R16,LOW(RAMEND) OUT SPL,R16 LDI R16,HIGH(RAMEND) OUT SPH,R16 ; .DEF TempL = r16 .DEF TempH = r17 start: RCALL INIT_USART LDI R16,'m' RCALL UARTSEND rjmp start INIT_USART: LDI TempL, LOW(103) STS UBRR0L,R16 LDI TempH,HIGH(103) STS UBRR0H, R17 LDI TEMPL ,(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0) STS UCSR0B,TEMPL ;LDI TEMPL,0x06 ; STS UCSR0C , TEMPL LDI TEMPL,(1<<USBS0)|(3<<UCSZ00); STS UCSR0C , TEMPL RET UARTSEND: LDS R17,UCSR0A SBRS R17,UDRE0 RJMP UARTSEND STS UDR0,R16 RET |
Автор: | Jack_A [ Пн мар 08, 2021 22:34:40 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Нужно знать - в чём проявляется ошибка, что требуется - и что делает фактически. Да, я все свои поделки кропал на асме, в прошлом тысячелетии . Но если уточнишь (см. выше) - попробуем помараковать. Непонятная прога. Зациклена, непрерывно передаёт в UART букву m. Значения битов упр. регистров не смотрел пока. |
Автор: | Михаил_avr [ Вт мар 09, 2021 02:58:02 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Должна выводить непрерывно букву m на скорости 9600,а выводит знак '?' Заранее спасибо. |
Автор: | Jack_A [ Вт мар 09, 2021 10:29:00 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Что является приёмником ввода? Совпадают ли настройки UART у приёмника и передатчика? Частота кварца? Если МК тактируется от внутреннего RC генератора - могут быть грабли. Если есть осцилл - посмотреть - что действительно выводится. Для этого хорошо бы поставить небольшую задержку в цикле вывода. |
Автор: | Demiurg [ Вт мар 09, 2021 10:39:55 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Не понял, у вас в секции start зачем ret? Если она как отдельная функция, вопрос снят. Если нет, то вот одна ошибка уже есть. Вам нужно основной цикл закольцевать. |
Автор: | Jack_A [ Вт мар 09, 2021 10:51:06 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Всё закольцовано. Но неправильно. Вот так будет лучше: Код: start: RCALL INIT_USART
loop: LDI R16,'m' RCALL UARTSEND rjmp loop ......................... INIT_USART:...... |
Автор: | akl [ Вт мар 09, 2021 11:58:31 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
...на ассемблере ... где ошибка... Не думаю, что вести инициализацию во время передачи, хорошая затея.Код: UARTSEND:
;LDS R17,UCSR0A ;SBRS R17,UDRE0 ;RJMP UARTSEND STS UDR0,R16 WAIT_0: LDS R17,UCSR0A SBRS R17,UDRE0 RJMP WAIT_0 RET |
Автор: | Jack_A [ Вт мар 09, 2021 14:11:59 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
По'стом выше это я уже отметил. |
Автор: | Михаил_avr [ Вт мар 09, 2021 17:57:44 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Всем спасибо за помощь, вот исправленный и рабочий код Код: RJMP RESET
RESET: LDI R16,LOW(RAMEND) OUT SPL,R16 LDI R16,HIGH(RAMEND) OUT SPH,R16 ; .DEF TempL = r16 .DEF TempH = r17 main: RCALL INIT_USART loop: LDI R16,'M' RCALL UARTSEND LDI R16,'i' RCALL UARTSEND LDI R16,'s' RCALL UARTSEND LDI R16,'h' RCALL UARTSEND LDI R16,'a' RCALL UARTSEND LDI R16,0x0d RCALL UARTSEND LDI R16,0x0a RCALL UARTSEND rjmp loop INIT_USART: LDI TempL, LOW(103) STS UBRR0L,R16 LDI TempH,HIGH(103) STS UBRR0H, R17 LDI TEMPL ,(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0) STS UCSR0B,TEMPL LDI TEMPL,0x06 STS UCSR0C , TEMPL STS UCSR0C , TEMPL RET UARTSEND: LDS R17,UCSR0A SBRS R17,UDRE0 RJMP UARTSEND STS UDR0,R16 RET |
Автор: | Jack_A [ Вт мар 09, 2021 21:24:57 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Вот так, пожалуй, будет лучше. Особенно если строка длинная. Код: tmp: ldi ZH,High(MyArray*2) ;загрузка адреса 0-го .
ldi ZL,Low(MyArray*2) ;элемента в рег. пару Z loop: lpm ;загрузка из ПЗУ tst R0 breq tmp adiw ZL,1 mov R16,R0 rcall UARTSEND rjmp loop ................................... MyArray: .db "Aby shto",0xD,0xA,0 |
Автор: | Михаил_avr [ Ср мар 10, 2021 06:46:45 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Да так и правда будет лучше. Спасибо. А вот работа предыдущей программы. Добавлено after 1 hour 10 minutes 7 seconds: А ещё кто-нибудь знает как дизасемблирование делать в атмел студии 7? |
Автор: | Demiurg [ Ср мар 10, 2021 07:43:43 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Вкладка View Disassembler |
Автор: | Михаил_avr [ Ср мар 10, 2021 08:39:09 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
У меня нет такой вкладки |
Автор: | Jack_A [ Ср мар 10, 2021 11:44:30 ] |
Заголовок сообщения: | Re: Датчик tcs320 и atmega328p |
Насчёт 7 не знаю, но в 4-ке я тупо копипастил текст из окна симулятора в редактор. Всё равно там надо ещё руками поработать - имена дать осмысленные и пр. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |