G

gafbich

Members
  • Публикации

    34
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О gafbich

  • Звание
    Новенький

Информация

  • Город
    Москва
  1. G

    Еще один вопрос, в чем может быть затык в работе SPI на STM8S, к примеру настраивал на STM32 проблем вообще не было. а на данном камне мне посл каждой посылки (передачи) надо делать задержу в 20 nop`ОВ, а иначе выброс кривой, если что могу кинуть с лог анализатора что получается без nop а что с nop
  2. G

    Попробовал Ваш пример - не пашет( Вот в чем проблема не пойму. Прошу прощения, Ваш пример и в правду работает! Спасибо
  3. G

    Вы имеете ввиду UIF флаг (TIM1_SR1) void delay_us(unsigned int d) { TIM1_CNTRH=0;TIM1_CNTRL=0; TIM1_ARRH=((d&0xFF00)>>8); TIM1_ARRL=d&0x00FF; while((TIM1_SR1&(1<<0))!=1){}; TIM1_SR1&=~(1<<0); }
  4. G

    Объясните пожалуйста следующие, на руках имеется STM8S103F3P6, сначала была проблема запустить SPI, проблема была даже не в запуске а корректной работе - сделал! А вот с таймером я засел вообще. Хочу сделать программный delay по средствам таймера TIM1 без прерываний. Ниже скидываю инициализацию таймера TIM1 и обработчник(функция delay) Тактовая частота 2MHz. Где загвоздка? #include "iostm8s103f3.h" void TIM1_init(void); void delay_us(unsigned int d); void TIM1_init(void) { ////Величина автоперезагрузки//// unsigned int auto_preload = 65535; TIM1_ARRH=((auto_preload&0xFF00)>>8); TIM1_ARRL=auto_preload&0x00FF; //////////////////////////////// ////////Установка делителя////// unsigned int div_load = 2000; TIM1_PSCRH=((div_load&0xFF00)>>8); TIM1_PSCRL=div_load&0x00FF; //////////////////////////////// TIM1_CR1|=(1<<7)|(1<<1)|(1<<0); } void delay_us(unsigned int d) { TIM1_CNTRH=0;TIM1_CNTRL=0; TIM1_ARRH=((d&0xFF00)>>8); TIM1_ARRL=d&0x00FF; while(((unsigned int)((TIM1_CNTRH<<8)+TIM1_CNTRL))<d){}; } int main() { ///////////////////////////////////// //Отключаем Всю периферию // CLK_PCKENR1=0x00; CLK_PCKENR2=0x00; ///////////////////////////////////// CLK_PCKENR1|=(1<<7);//Включаем тактирование для TIM1 TIM1_init(); //Настройка ногодрыга для проверки таймера// PB_DDR|=(1<<5); PB_CR1|=(1<<5); PB_CR2|=(1<<5); //////////////////////////////////////////// while(1) { PB_ODR&=~(1<<5); delay_us(1000);//1сек PB_ODR|=(1<<5); delay_us(1000);//1сек } return 0; }
  5. G

    Есть сигнал от датчика, который передается по "воздуху", перехват сделал при помощи таймера и условия в прерывании, на данном этапе интересно применить захват и реализовать при помощи его!
  6. G

    Прошу помощи, не могу разобраться с режимом захвата таймера. как правильно настроить! Читал разные статьи, но понимания от этого не добавилось!
  7. Добрый день, необходим перевод страниц (с 6 по 10), текста мало в основном картинки, из технической документации на трансивер Si4432. AN463.pdf
  8. Проблема с настройкой внешнего прерывания на PA1 Настройки прерывания: #include "stm32f0xx_exti.h" #include "stm32f0xx_gpio.h" #include "stm32f0xx_rcc.h" #include "stm32f0xx_misc.h" #include "stm32f0xx_syscfg.h" EXTI_InitTypeDef exti; NVIC_InitTypeDef nvic; GPIO_InitTypeDef gpio; void RCC_Set(void); void exti_setting(void); void GPIO_Set(void); //############################################################// //##################Включаем тактирование#####################// //############################################################// void RCC_Set(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE); } //############################################################// //############################################################// //############################################################// //############################################################// //#######################Настройка GPIO#######################// //############################################################// void GPIO_Set(void) { gpio.GPIO_Mode=GPIO_Mode_OUT; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; gpio.GPIO_Speed=GPIO_Speed_Level_2; GPIO_Init(GPIOC,&gpio); gpio.GPIO_Mode=GPIO_Mode_IN; gpio.GPIO_OType=GPIO_OType_PP; gpio.GPIO_Pin=GPIO_Pin_1; gpio.GPIO_PuPd=GPIO_PuPd_NOPULL; gpio.GPIO_Speed=GPIO_Speed_Level_2; GPIO_Init(GPIOA,&gpio); } //############################################################// //############################################################// //############################################################// //############################################################// //###################Настройка Прерывания#####################// //############################################################// void exti_setting(void) { exti.EXTI_Line=EXTI_Line1; exti.EXTI_LineCmd=ENABLE; exti.EXTI_Mode=EXTI_Mode_Interrupt; exti.EXTI_Trigger=EXTI_Trigger_Rising_Falling; EXTI_Init(&exti); nvic.NVIC_IRQChannel=EXTI0_1_IRQn; nvic.NVIC_IRQChannelCmd=ENABLE; nvic.NVIC_IRQChannelPriority=0; NVIC_Init(&nvic); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); NVIC_EnableIRQ(EXTI0_1_IRQn); } //############################################################// //############################################################// //############################################################// int main(void) { RCC_Set(); GPIO_Set(); exti_setting(); while(1) { } } //############################################################// //##################Обработчик Прерывания#####################// //############################################################// void EXTI0_1_IRQHandler(void) { GPIOC->ODR^=GPIO_Pin_8; //Инвертируем состояние светодиода EXTI_ClearITPendingBit(EXTI_Line1); } //############################################################// //############################################################// //############################################################// Чтобы не подать на PA1, обработчик не отрабатывает! Что не так, что я упустил?
  9. G

    Тут достаточно было написать TIM3->CR1 = (1<<1); А здесь вместо "+" нужен "-". Точно не уверен, но вместо точки надо "->" На счет минуса я тоже согласен. Там все верно относительно синтаксиса.
  10. Есть отладочная плата (STM32F103C8T6 + внешний кварц 8МГц), при настройке и запуске таймера с дрыганием ноги за один такт, при всех настройках не могу добиться чтобы один такт ровнялся 1мкс. Вот мой код #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "stm32f10x_conf.h" void InitTMI(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM2->CR1=(0<<9)|(0<<8)|(1<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1); TIM2->ARR=3; TIM2->PSC=8-1; TIM2->CNT=0; TIM2->CR1|=(1<<0); } int main(void) { //RCC_HSE_ON; RCC->CR=RCC_HSE_ON; RCC->CFGR&=(~(1<<7)|(1<<6)|(1<<5)|(1<<4)); while (!(RCC->CR & RCC_CR_HSERDY)) {}; // Ожидание готовности HSE. RCC->CFGR &=~RCC_CFGR_SW; // Очистить биты SW0, SW1. RCC->CFGR |= RCC_CFGR_SW_HSE; // Выбрать HSE для тактирования SW0=1. GPIO_InitTypeDef gpioA; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); gpioA.GPIO_Mode=GPIO_Mode_Out_PP; gpioA.GPIO_Speed=GPIO_Speed_2MHz; gpioA.GPIO_Pin=GPIO_Pin_1; GPIO_Init(GPIOA,&gpioA); InitTMI(); while(1) { if(TIM2->CNT==1){GPIO_ResetBits(GPIOA,GPIO_Pin_1);} if(TIM2->CNT==2){GPIO_SetBits(GPIOA,GPIO_Pin_1);} //GPIO_ResetBits(GPIOA,GPIO_Pin_1); } }
  11. G

    В зачем чужие библы использовать, я свою написал. Работает норм. Все сделал на программном SPI.
  12. Необходимо запустить дисплей Nokia 5110 при помощи ATmega16, SPI сделал программный, пытаюсь инициализировать дисплей вроде все норм (Собирал схему в Proteus), а вывести не получается. Прошу помощи в данном вопросе, кто делал - поделитесь инфой
  13. G

    Проблема такая есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот же код (ПОДМОРОФЕЧЕННЫЙ) я компилирую в AVR Studio, заливаю в МК не работает, так же как и в Proteus. Под CAVR Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 16,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include <mega16.h> #include <delay.h> #define packet_MIN 7000 #define packet_MAX 9000 unsigned long p0_len,p0_prev_len; int prev_state; void PR_KEELOQ(void) { if(PINB.0==1) return; //Приходим после приема всего бита, когда на PINB.0 ноль if(((p0_prev_len+p0_len)>packet_MIN) && ((p0_prev_len+p0_len)<packet_MAX)) { //Если импульс пожходит по длительности PORTD.5=1; delay_ms(100); PORTD.5=0; delay_ms(100); return; //Выходим из функции } } void main(void) { TCNT1=0;//обнуляем регистр TCNT1 // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Function: Bit2=In Bit1=In Bit0=In DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0); // Port D initialization // Function: Bit6=In Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //xtall/8 prev_state = PINB.0; while (1) { if(PINB.0 != prev_state) { p0_len = TCNT1/2; TCNT1 = 0; prev_state = PINB.0; PR_packet(); p0_prev_len = p0_len; } } } А вот он же, но под AVR Studio уже не фурычит! #define F_CPU 16000000UL //16MHz #include <avr/io.h> #include <util/delay.h> #define LED_H PORTD|=(1<<5) #define LED_L PORTD&=(~(1<<5)) #define packet_MIN 7000 #define packet_MAX 9000 unsigned long p0_len,p0_prev_len; int prev_state; void PR_packet(void) { if((PINB&(1<<0))==1) return; //Приходим после приема всего бита, когда на RX единица if(((p0_prev_len+p0_len)>packet_MIN) && ((p0_prev_len+p0_len)<packet_MAX)) { //Если импульс подходит по длительности LED_H; _delay_ms(100); LED_L; _delay_ms(100); return; //Выход } } int main(void) { TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //xtall/8 // Port B initialization // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0); // Port D initialization // Function: Bit6=In Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off prev_state = PINB&(1<<0); while (1) { if((PINB&(1<<0)) != prev_state) { p0_len = TCNT1/2; TCNT1 = 0; prev_state = PINB&(1<<0); PR_packet(); p0_prev_len = p0_len; } } }
  14. Барабашка Извините если этим обидел. Ну конечно мне не следовало так писать. Вопрос открыт, необходима реализация SPI master на ATtiny2313, предпочтительно в AVR Studio
  15. Помогай, буду признателен))))