Доброго времени суток. Готовлю мастер класс. Нужна помощь - как целиком выглядел код мигания 13 светодиодом до появления Arduino IDE и Wiring ?
наверно как-то так Код (C++): #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRB |= (1 << 5); while (1==1) { PORTB |= (1 << 5); _delay_ms(500); PORTB &= ~(1 << 5); _delay_ms(500); } return 0; } вот даже статья есть на вики http://wiki.amperka.ru/программирование:работа-с-attiny-через-stk500-и-чистый-си
вот тут очень многому можно научиться http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-1.html
Вот мой курсач 12-го года на камушке PIC18F2520. Если правильно помню, то это реализация мигания светодиода программным шимом, но с(или на, сложно уже проанализировать) аппаратным таймером. Код (Text): ;****************************************************************************** ; This file is a basic template for creating relocatable assembly code for * ; a PIC18F2520. Copy this file into your project directory and modify or * ; add to it as needed. * ; * ; The PIC18FXXXX architecture allows two interrupt configurations. This * ; template code is written for priority interrupt levels and the IPEN bit * ; in the RCON register must be set to enable priority levels. If IPEN is * ; left in its default zero state, only the interrupt vector at 0x008 will * ; be used and the WREG_TEMP, BSR_TEMP and STATUS_TEMP variables will not * ; be needed. * ; * ; Refer to the MPASM User's Guide for additional information on the * ; features of the assembler and linker. * ; * ; Refer to the PIC18Fxx20 Data Sheet for additional * ; information on the architecture and instruction set. * ; * ;****************************************************************************** ; * ; Filename: Kursovoj proekt po kursu CU&MP * ; Date: 21.12.12 * ; File Version: 1.0 * ; * ; Author: SuperGenius * ; Company: Home * ; * ;****************************************************************************** ; * ; Files required: P18F2520.INC * ; * ;****************************************************************************** LIST P=18F2520, F=INHX32 ;directive to define processor and file format #include <P18F2520.INC> ;processor specific variable definitions ;****************************************************************************** ;Configuration bits ;Microchip has changed the format for defining the configuration bits, please ;see the .inc file for futher details on notation. Below are a few examples. ; Oscillator Selection: ; CONFIG OSC = LP ;LP ;CONFIG OSC = INTIO67, CONFIG WDT = OFF,PBADEN = OFF ;LP CONFIG LVP = OFF, XINST = OFF ,DEBUG = ON ;****************************************************************************** ;Variable definitions ; These variables are only needed if low priority interrupts are used. ; More variables may be needed to store other special function registers used ; in the interrupt routines. UDATA WREG_TEMP RES 1 ;variable in RAM for context saving STATUS_TEMP RES 1 ;variable in RAM for context saving BSR_TEMP RES 1 ;variable in RAM for context saving UDATA_ACS EXAMPLE RES 1 ;example of a variable in access RAM KOL RES 1 KOLA RES 1 KOLB RES 1 DEV RES 1 SUML RES 1 SUMH RES 1 ;****************************************************************************** ;EEPROM data ; Data to be programmed into the Data EEPROM is defined here DATA_EEPROM CODE 0xf00000 DE "Test Data",0,1,2,3,4,5 ;****************************************************************************** ;Reset vector ; This code will start executing when a reset occurs. RESET_VECTOR CODE 0x0000 goto Main ;go to start of main code ;****************************************************************************** ;High priority interrupt vector ; This code will start executing when a high priority interrupt occurs or ; when any interrupt occurs if interrupt priorities are not enabled. HI_INT_VECTOR CODE 0x0008 bra HighInt ;go to high priority interrupt routine ;****************************************************************************** ;Low priority interrupt vector ; This code will start executing when a low priority interrupt occurs. ; This code can be removed if low priority interrupts are not used. LOW_INT_VECTOR CODE 0x0018 bra LowInt ;go to low priority interrupt routine ;****************************************************************************** ;High priority interrupt routine ; The high priority interrupt code is placed here. CODE HighInt: ; *** high priority interrupt code goes here *** btfsS PIR1,TMR1IF RESET bCf T1CON,TMR1ON ;вџключаю таймер movlw 0xEC movwf TMR1H movlw 0x77 movwf TMR1L bsf ADCON0, GO M2: BTFSS ADCON0, GO BRA M2 MOVFF ADRESL, INDF0 MOVLW .255 CPFSLT FSR0L INCF FSR0H INCF FSR0L MOVFF ADRESH, INDF0 MOVLW .255 CPFSLT FSR0L INCF FSR0H INCF FSR0L retfie FAST ;****************************************************************************** ;Low priority interrupt routine ; The low priority interrupt code is placed here. ; This code can be removed if low priority interrupts are not used. LowInt: movff STATUS,STATUS_TEMP ;save STATUS register movff WREG,WREG_TEMP ;save working register movff BSR,BSR_TEMP ;save BSR register ; *** low priority interrupt code goes here *** movff BSR_TEMP,BSR ;restore BSR register movff WREG_TEMP,WREG ;restore working register movff STATUS_TEMP,STATUS ;restore STATUS register retfie ;****************************************************************************** ;Start of main program MY_INC0: MOVLW .255 CPFSLT FSR0L INCF FSR0H INCF FSR0L RETURN MY_INC1: MOVLW .255 CPFSLT FSR1L INCF FSR1H INCF FSR1L RETURN DEVIDE_BY_16: ;процедура делени¤ на 4 с сохранением делимое и записью результата в акк MOVLW .5 MOVWF KOLB REPEAT3: BCF STATUS,C RRCF SUMH RRCF SUML DECFSZ KOLB,F BRA REPEAT3 RETURN Main: ; The main program code is placed here. bcf OSCCON,IRCF0 ; Fclk=4Mhz bsf OSCCON,IRCF1 bsf OSCCON,IRCF2 ;конфигурирую ј÷ѕ bsf ADCON0, ADON ;¬ Ћ ј÷ѕ BCF ADCON0, GO ; Ќј ¬—я »… —Ћ”„ј… ¬џ Ћ MOVLW b'00001110'; MOVWF ADCON1 MOVLW b'10011100'; CLRF ADRESH CLRF ADRESL clrf T1CON ;регистр конфигурации 1ого таймера очищаем bsf T1CON,RD16 ;таймер в 16 разр¤дном режиме bcf T1CON,T1CKPS1 ; 1/8 bsf T1CON,T1CKPS0 ; 1/8 movlw 0xEC movwf TMR1H movlw 0x77 movwf TMR1L ;обнулил значение таймера bcf PIR1,TMR1IF ;сбросил флаг прерывани¤ таймера1 bsf PIE1,TMR1IE ;разрешаю прерывани¤ от таймера1 bsf IPR1,TMR1IP ;low priority приоритет высокий прерываний таймера1 bsf RCON,IPEN ;разрешение приоритетной системы прерываний(совместимость с PIC16Cxxx не нужна) bsf INTCON,GIEH ;√лобально разрешаю прерывани¤ ;при таких параметрах 1 изменение таймера = 2мкс, т.е. 5000 изменений = 2 мс ;поэтому надо счетсчик предзаполн¤ть 0хFFFF-0x1388=65535-5000=60535=0xec77 bsf T1CON,TMR1ON ;включаю таймер LFSR FSR0,0x100;-;0x2FF MOVLW .255 MOVWF KOL ;считываем 100H с 100L значений REPEAT1: BTFSS PIR1,TMR1IF BRA REPEAT1 bsf T1CON,TMR1ON ;включаю таймер BCF PIR1,TMR1IF DECFSZ KOL,F ;уменьшаю KOL на 1 и сравниваю с нулем, если BRA REPEAT1 bCf T1CON,TMR1ON ;вџключаю таймер ;ќЅ–јЅј“џ¬ј≈ћ ѕќЋ”„≈ЌЌџ≈ «Ќј„≈Ќ»я LFSR FSR0,0x100;-;0x2FF LFSR FSR1,0x400;-;0x6FF MOVLW .255 MOVWF KOL REPEAT2: CLRF INDF1 MOVLW .16 MOVWF KOLA REPEATa: MOVF POSTINC0,W ADDWF SUML,F MOVF POSTINC0,W ADDWFC SUMH,F DECFSZ KOLA,F BRA REPEATa CALL DEVIDE_BY_16 MOVFF SUMH,INDF1 CALL MY_INC1 MOVFF SUML,INDF1 CALL MY_INC1 DECFSZ KOL,F ;уменьшаю KOL на 1 и сравниваю с нулем, если BRA REPEAT2 ; не 0, тогда к началу цикла ENDpr: bra ENDpr ; иначе(т.е. 0) зацикливаю программу на 1ой строке ;****************************************************************************** ;End of program END К сожалению, сохранились только исходники. Помню меня уже тогда затянуло в технику и делал всё на совесть и был красивый отчёт, но увы.
Ну на крайняк можно и на асме замутить Код (C++): // Для Atmega8 на 8 МГц .include "m8def.inc" // Подключаем заголовочный файл с адресами .def temp = r16 // Присваиваем символические имена регистрам общего назначения .dseg // Сегмент ОЗУ, он нам не нужен, но все равно оставим // на случай вдруг если в голову взбредет использовать его .cseg // Программный сегмент, все что тут есть, записывается в память программ .org 0 // Вектор прерывания Reset, раздел Interrupt в технической документации rjmp Reset // "rjmp" команда перехода на метку, в данном случае на метку Reset Reset: // Метка Reset ldi temp, high(RAMEND) //Инициализация стека out sph, temp ldi temp, low(RAMEND) out spl, temp sbi DDRB,5 // 5 нога порта В (D13 Arduino) на выход Proga: // Основная программа sbic PORTB, 5 //если светодиод отключен, пропустить следующую строку rjmp Otkl //переход на отключение светодиода sbi PORTB, 5 // включаем светодиод rjmp Delay //переход на задержку Otkl: //отключение светодиода cbi PORTB, 5 // гасим светодиод Delay: //задержка 1 сек ldi R17, $48 WGLOOP0: ldi R18, $BC WGLOOP1: ldi R19, $C4 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; delaying 6 cycles: ldi R17, $02 WGLOOP3: dec R17 brne WGLOOP3 ; ----------------------------- ; delaying 2 cycles: nop nop rjmp Proga //возврат на начало
Так это не я такой, а задание Вот ещё нашёл цикл на асме: Код (Text): ;СУММА{от 1 до 10}[(хi+7)and(87)] ;MOVF INDF0,0 ; ;Содержимое регистра f пересылается в регистр W, если d = 0, и в тот же регистр f, ;если d = 1. Назначение d=1 имеет смысл использовать для проверки регистра на ноль, ;покскольку команда изменяет флаг Z. MOVLW .10 ;запись в акк число 10, кол-во эл-тов по заданию MOVWF KOL ;записываю число 10 в регистор KOL clrf SUM ;обнуляю регистр SUM lfsr FSR0, 0x0100 ;Назначаю начало считывания эл-тов, адресс 1ого эл-нта 0х0100 ,29 получим ответ 10 repeat: ;начало цикла суммирования MOVLW .7 ;в акк записывается цифра 7 ADDWF INDF0,W ;складываю акк с регистром INDF0 ANDLW .87 ;осуществляю логическое умножение акк на цифру 87, ответ в акк ADDWF SUM,F ;прибавляю к значению регистра SUM полученное значение и записываю в регистр SUM INCF FSR0L,F ;увеличиваю значение младшей квадратуры регистра FSR0, т.е. меняю адресс на следующий DECFSZ KOL,F ;уменьшаю KOL на 1 и сравниваю с нулем, если BRA repeat ; не 0, тогда к началу цикла ENDprogr: bra ENDprogr ; иначе(т.е. 0) зацикливаю программу на 1ой строке (перед этим выполняется какое-то шаманство, но я не понимаю уже что оно делает, поэтому не выкладываю). Кажется регистр INDF0 указывает на данные ячейки с адресом, который хранится в регистре FSRO0. Меняя ФСРО0 организуется перебор массива.
У меня он так выглядел http://forum.amperka.ru/threads/msp430fr-поморгаем.18740/ Это с шимом, если че)
У атмела в библиотеках есть. Но туда надо тактовую частоту передавать, чтобы библиотека правильное количество нопов вставила.
Ну так не интересно с чужими библиотеками. Вот нашёл ещё, код просто мимими. По нажатию на кнопку "псевдорандомно" (АЦП) зажигается 1 из 2ух светодиодов и по таймеру выключаются (ATtiny45), и да, там есть бесконечный цикл с nop. В коде очень много комментариев, это я учился аврасм: Код (C++): .include "tn45def.inc" ;This is included in "Atmel AVR Studio" .include "AVR.inc" ;.def _0 = r15 ;.def temp = r18 ;----------------------------------------------------------; ; Program Code .cseg ; Interrupt Vectors (ATtiny45) rjmp reset ; Reset rjmp 0 ; INT0 rjmp 0;pcint_int ; PCINT0 rjmp 0 ; TC1_COMA rjmp 0;t1ovf_int ; TC1_OVF rjmp tmr_int ; TC0_OVF rjmp 0 ; EE_RDY rjmp 0;comp_int; ANA_COMP rjmp ADC_rdy ; ADC rjmp 0 ; TC1_COMB rjmp 0;tmr_int ; TC0_COMA rjmp 0 ; TC0_COMB rjmp 0;wdt_int ; WDT rjmp 0 ; USI_START rjmp 0 ; USI_OVF ;--------------------------------------------------------------------; ; Program Code reset: ; ATtiny25/45/85 ; +------+ ; (PCINT5/RESET/ADC0/dW) PB5 ---|* |--- VCC ;(PCINT3/XTAL1/CLKI/OC1B/ADC3) PB3 ---| |--- PB2 (SCK /USCK/SCL/ADC1/T0/INT0/ PCINT2) ;(PCINT4/XTAL2/CLKO/OC1B/ADC2) PB4 ---| |--- PB1 (MISO/DO/ AIN1/OC0B/OC1A/ PCINT1) ; GND ---| |--- PB0 (MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0) ; +------+ ; ; ATtiny85 ; +------+ ; (NoP) PB5 ---|* |--- VCC ; (Nop) PB3 ---| |--- PB2 (On/Off work Out) ; (NoP) PB4 ---| |--- PB1 (AIN1-Holl) ; GND ---| |--- PB0 (AIN0) ; +------+ ; ;********************************CLOCK************************* ; outi OSCCAL, 0b00000000 ;Oscillator Calibration Register outi CLKPR, 0b10000000 ;Clock Prescale Register ; |||||||| ; ||||CLKPS3-(0) - prescale ; |NaN ; CLKPCE - clock prescale change enable outi CLKPR, 0b00000110 ; fclk/64 ;********************************POWER & INTERRUPS************************* outi MCUCR, 0b00110000 ;MCU Control Register ; |||||||| ; ||||||ISC01-(2) реагировать на спад ; |||||BODSE - BOD Sleep Enable 0 NaN ; |||SM1-(0) - sleep mode - режим сна ; ||SE - Sleep Enable - разрешение сна ; |PUD ; BODS - BOD Sleep 0 NaN ;********************************I/O************************* ; 2-вх ; 4 | 0-вых ; 5|3|1|ых ; |||||| outi DDRB, 0b000011 ;/ outi PORTB, 0b000000 ;Initalize Port B ;********************************TIMER0 & 1************************* ; outi GTCCR, 0b00000000 ;General Timer/Counter Control Register ; |||||||| ; |||||||запись 1 сбрасывать предделитель timer0 ; ||||||запись 1 сбрасывать предделитель timer1 ; |||||0 - ; ||||0 ; ||| ; || ; |PWMB ; outi TIMSK, 0b00000010 ; |||||||| ; |||||||NaN ; ||||||int overflow timer0 off ; |||||int overflow timer1 on ; ||||int compare ocr0B off ; |||int compare ocr0A off ; ||int compare ocr1B off ; |int compare ocr1A off ; NaN ; outi TIFR, 0b00000000 ; |||||||| ; |||||||NaN ; ||||||flag overflow timer0 off ; |||||flag overflow timer1 off ; ||||flag compare ocr0B off ; |||flag compare ocr0A off ; ||flag compare ocr1B off ; |flag compare ocr1A off ; NaN ; ;********************************TIMER0************************* outi TCCR0A, 0b00000000 ;Timer/Counter Control Register A ; |||||||| ; ||||||WGM01-(0) - Waveform Generation Mode - режим работы таймера0 wgm02 в tccr0b ; ||||NaN ; ||COM0B1-(0) - Compare Match Output B Mode - режим сравнения по каналу В timer0 ; COM0A1-(0) - Compare Match Output A Mode - режим сравнения по каналу A timer0 outi TCCR0B, 0b00000101 ;Timer/Counter Control Register B ; |||||||| ; |||||CS02-(0) - Clock Select - предделитель ; ||||WGM02 - Waveform Generation Mode TCCR0A ; ||NaN ; |FOC0B - Force Output Compare B ; FOC0A - Force Output Compare A ; outi TCNT0, 0b00000000 ;Timer/Counter Register ; outi OCR0A, 0b00000000 ;Output Compare Register A ; outi OCR0B, 0b00000000 ;Output Compare Register B ; ;********************************ADC************************* outi ADMUX, 0b00100011 ; |||||||| ; ||||MUX3-0 - ADC3 = PB3 ; ||||REFS2 - Vcc как источник ; ||ADLAR - 8! или 10 бит (направление записи) ; |REFS0 - Vcc как источник ; REFS1 - Vcc как источник outi ADCSRB, 0b00000000 ; |||||||| ; |||||ADTS2-0 - источник автоматического запуска АЦП ; |||NaN ; ||IPR - 1 бит тратится на знак ; |для компаратора ; BIN - двухполярный режим (выкл) outi DIDR0, 0b00001000 ; |||||||| ; ||||||для компаратора ; |||||ADC1D - отключение цифрового буфера пина РВ2 ; ||||ADC3D - отключение цифрового буфера пина РВ3 ; |||ADC2D - отключение цифрового буфера пина РВ4 ; ||ADC0D - отключение цифрового буфера пина РВ5 ; NaN outi ADCSRA, 0b11011111 ; |||||||| ; |||||ADPS2-0 - делитель частоты тактирования = 128 ; ||||ADIE - разрешение прерывания ; |||ADIF - Прерывание флаг ; ||ADATE - автоматическое включение АЦП (выключено) ; |ADSC - запуск одиночного АЦП-ирования ; ADEN - включение АЦП ;********************************MAIN PROCEDURES************************* sei nop rjmp PC-1 ;********************************PROCEDURES************************* ;********************************INTERRUP PROCEDURES************************* ADC_rdy: sbic ADCH,0 rjmp set_1 rjmp set_0 set_1: sbi PORTB, 1 rjmp end set_0: sbi PORTB, 0 rjmp end end: outi ADCSRA, 0b00010111 sei reti tmr_int: cbi PORTB, 0 cbi PORTB, 1 outi PRR, 0b00001111 sleep rjmp PC-1 reti Надеюсь ТС что-нибудь выберет для детишек)
Ну, тогда ещё и на брейнфаке держите Код (C++): #include <BrainFuck.h> /////////////////////////////////////////////////////////// // // Программа на BrainFuck // Обыкновенный Blink с частотой прибл. 1гц // программу нужно просто вставить в loop // static char * bfBlink = (char *) "+<<<<<<<<<<<<[-.>>>>>>>>>>>>[-]<<<<<<<<<<<<[-]]" ">>>>>>>>>>>>[<<<<<<<<<<<<+.[-]]+++++++[>+++++++" "+[>++++++++[>++++++++[>++++++++[-]<-]<-]<-]<-]"; void setup(void) { pinMode(13, OUTPUT); } void loop(void) { BrainFuck(bfBlink); }
Доброго времени суток помогите пожалуйста в написании скетча для ардуино! задача такая мне надо чтоб ардуино считал количество нажатий на кнопку. Допустим потенциометром я выставляю 5 если нажимать на кнопку меньше пяти раз в секунду загорится зеленый светодиод а если больше пяти раз в секунду то красный. Спасибо
Ещё раз повторюсь здесь: показывай, что пытался сделать. Говори, что именно не получается. Выкладывай код, который пытался писать. Тогда поможем. А то сессию не сдашь, в армию надо будет топать.
djmikola, родной, тебе ж на соседнем сайте уже всё сказали, заказывай плати, сделают. И нечего другой форум искать - они все одинаковые. А как поступают на форумах с просителями "написать прошивку" можешь почитать вот здесь (со слов "начинается брожение по интернетам ..."). Очень понятно написано.