Search the Community
Showing results for tags 'Atmega16A'.
-
Всем доброго дня! На данном сайте (http://smartep.ru/index.php?page=avr_asm_examples) нашел пример управления сервоприводом SG90 с помощью микроконтроллера Atmega16 на Ассемблере. С помощью программатора AVRasp, макетной платы и программы avrdude_prog-v.3.3 я прошил свой микроконтроллер Atmega16A. Все завершилось удачно. Я выставил в фьюзах 8Мгц частоты от внутреннего генератора, как указывал автор примера. Авто указывает - линия ШИМ сервопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Схему подключения автор не дает. У меня собрать рабочую схему не получается. Может кто подскажет, как исходя из кода Ассемблера собрать схему? Полный код программы в прикрепленном файле "Пример". Моя предположительная схема и фрагмент кода на фото. Пример Пример
-
Добрый вечер уважаемые форумчане! По каким адресам необходимо зашивать бутлоадер этим программатором? Что то не пойму... Пробовал по адресу: 1C00 и пробовал по 3b00 .Обе попытки не увенчались успехом... Бут не шлет символ '>' , пробую запускать бутлоадер в протеусе - все работает, и шлет данный символ. не полный код бута: void BootLoad(void) { // Send chip data to the programming software so that it knows // how to format transmissions putchar(DeviceID); putchar(FlashSize); putchar(BootSize); putchar(PageSize); // "!" means all ok and send the next data if there is more putchar('!'); while(1) { PageAddress = (unsigned int)getchar() << 8; // Receive PageAddress high byte PageAddress += getchar(); // Add PageAddress low byte if (PageAddress == 0xffff) ExecCode(); // The windows program sends this value when finished #if defined _CHIP_ATMEGA128_ if (PageAddress >> 8) RAMPZ = 1; else RAMPZ=0; #endif PageAddress = PageAddress << AddressLshift; //essentially the same as multiply by PageSize if (GetPage()) //receive one page of data followed by a checksum byte and verify data { for (i=0;i<PageByte;i+=2) //fill temporary buffer in 2 byte chunks from PageBuffer { Pagedata=PageBuffer[i]+(PageBuffer[i+1]<<8); while (SPMCR&1); //wait for spm complete CurrentAddress=PageAddress+i; spmcrval=1; #asm movw r30, r6 ;//move CurrentAddress to Z pointer mov r1, r3 ;//move Pagedata MSB reg 1 mov r0, r2 ;//move Pagedata LSB reg 1 sts SpmcrAddr, r10 ;//move spmcrval to SPM control register spm ;//store program memory #endasm } while (SPMCR&1); //wait for spm complete spmcrval=3; //erase page #asm movw r30, r4 ;//move PageAddress to Z pointer sts SpmcrAddr, r10 ;//move spmcrval to SPM control register spm ;//erase page #endasm while (SPMCR&1); //wait for spm complete spmcrval=5; //write page #asm movw r30, r4 ;//move PageAddress to Z pointer sts SpmcrAddr, r10 ;//move spmcrval to SPM control register spm ;//write page #endasm while (SPMCR&1); //wait for spm complete spmcrval=0x11; //enableRWW see mega8 datasheet for explanation // P. 212 Section "Prevent reading the RWW section // during self-programming #asm sts SpmcrAddr, r10 ;//move spmcrval to SPMCR spm #endasm if (CheckFlash()) putchar('!'); //all ok, send next page else putchar('@'); //there was an error, resend page } //end if (GetPage()) else putchar('@'); //there was an error ,resend page } } void main(void) { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; //UBRRH=0x00; //UBRRL=0x2F; ubbr = (unsigned long int)_MCU_CLOCK_FREQUENCY_ / (BAUDRATE * 16) - 1; UBRRH=ubbr >> 8; UBRRL = ubbr; putchar('>'); //I'm here, talk to me while ( (! (UCSRA&128)) &( i < 32000) ) i++; //wait for data in or timeout if (i < 32000) inchar= getchar(); if (inchar == '<') BootLoad(); // I'm here too, go ahead and load the program to flash ExecCode(); // set up and jump to application } Помогите пожалуйста решить проблему...