Перейти к содержанию
    

Vetal-Soft

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Vetal-Soft

  • Звание
    Участник
    Участник

Контакты

  • ICQ
    Array
  1. КО: Надо сначала переключить порт микроконтроллера подключенный к DB0...DB7 как вход, а потом выставлять сигнал RW.
  2. Для обмена по UART правильнее использовать FIFO буфер. Вот пример под AVR Studio: /* Файл main.c */ //#define F_CPU 16000000UL #include <avr/io.h> #include <stdio.h> // стандартная библиотека ввода/вывод #include <avr/pgmspace.h> // утилиты пространства программ #include "uart.h" // Создаем поток для ввода/вывода на/с UART для использования стандартных // функции ввод/вывода FILE uart_file = FDEV_SETUP_STREAM(uart_put, uart_get, _FDEV_SETUP_RW); int main (void) { uart_init(); // название Ф-ции говорит само за себя stdout = stdin = &uart_file; // теперь стандартные потоки ссылаются на наш поток char str[50]; printf_P(PSTR("Hello, World!\n\r")); printf_P(PSTR("Input string:")); scanf_P(PSTR("%49s"),&str); printf_P(PSTR("%s\n\r"),str); fprintf(&uart_file, "Bye-bye\n\r"); // Так можно выбирать с каким именно // потоком работать (для примера) while (1); return 0; } /* file "uart.h" */ #ifndef UART #define UART #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #define UART_FIFO_SIZE 64 // Размер FIFO #define UART_BAUD 9600 // Скороть UART void uart_init(void); int uart_get (FILE *stream); uint8_t uart_test (void); int uart_put (char d, FILE *stream); #endif /* end UART */ /* file "uart.c" */ #include "uart.h" typedef struct { // Структура для FIFO uint8_t idx_w; // Указатель на конец очереди FIFO uint8_t idx_r; // Указатель на начало очереди FIFO uint8_t count; // Счетчик количества данных в FIFO uint8_t buff[uART_FIFO_SIZE]; // Сам FIFO } FIFO; static volatile FIFO txfifo, rxfifo; /* Initialize UART */ void uart_init() { rxfifo.idx_r = 0; rxfifo.idx_w = 0; rxfifo.count = 0; txfifo.idx_r = 0; txfifo.idx_w = 0; txfifo.count = 0; UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; // Настраиваем скорость работы UART UCSRB = _BV(RXEN)|_BV(RXCIE)|_BV(TXEN); // Включаем: прием, вызов прерывания по приему, передачу } uint8_t uart_test (void) { return rxfifo.count; } int uart_get (FILE *stream) // Ф-ция чтения FIFO для приемника { char d; uint8_t i; i = rxfifo.idx_r; while(rxfifo.count == 0); // Ожидание входящих данных d = rxfifo.buff[i++]; cli(); rxfifo.count--; sei(); if(i >= UART_FIFO_SIZE) i = 0; rxfifo.idx_r = i; uart_put(d,stream); // Эхо ответ return d; } int uart_put (char d, FILE *stream) // Ф-ция записи в FIFO для передатчика { uint8_t i; i = txfifo.idx_w; while(txfifo.count >= UART_FIFO_SIZE); // ждем когда освободится место в FIFO txfifo.buff[i++] = d; cli(); txfifo.count++; UCSRB |= _BV(UDRIE); // Включаем вызов прерывания по освобождению буфера передатчика sei(); if(i >= UART_FIFO_SIZE) i = 0; txfifo.idx_w = i; return 0; } ISR(USART_RXC_vect) // Прерывание по приему { uint8_t d, n, i; d = UDR; n = rxfifo.count; if(n < UART_FIFO_SIZE) // Если FIFO заполнен данные начнут теряться { rxfifo.count = ++n; i = rxfifo.idx_w; rxfifo.buff[i++] = d; if(i >= UART_FIFO_SIZE) i = 0; rxfifo.idx_w = i; } } ISR(USART_UDRE_vect) // Прерывание по освобождению буфера передатчика { uint8_t n, i; n = txfifo.count; if(n) { txfifo.count = --n; i = txfifo.idx_r; UDR = txfifo.buff[i++]; if(i >= UART_FIFO_SIZE) i = 0; txfifo.idx_r = i; } if(n == 0) // если FIFO пуст, UCSRB &= ~_BV(UDRIE); // то выключаем вызов прерывания по освобождению буфера передатчика }
  3. Да, думаю хелпа и примеров должно хватить. После праздников буду этим заниматся.
  4. В Keil MDK-ARM 4.60 встроена emWin.
  5. Полоса пропускания - это синусойда Скороть наростания - это скорость наростания синусойды частота которой лежит на границах пололсы пропускания Популярно както так))) Это не популярно, это безграмотно.
  6. Спасибо. Все встало на свои места)) Это моя первая программа на С++. С конструкторами и деструкторами более менее понятно. Буду плавно разбираться по мере изучения.
  7. Т.е. нельзя сначала объявить класс, а потом описать его? (как функцию в Си) ps. Еще хотел бы узнать как правильно вынести класс в отдельный файл.
  8. AVR Studio 6 C++

    Начал изучать С++. И сразу затык. Что я делаю не так? #include <avr/io.h> class StepMotor; int main(void) { StepMotor a; while(1) { a.initSpeed(20); a.initStep(20.0); } } class StepMotor { float Step; int Speed; public: void initStep (float step) { Step = step; } void initSpeed (int speed) { Speed = speed; } }; Не компилируется. Ошибка: aggregate 'StepMotor a' has incomplete type and cannot be defined #include <avr/io.h> class StepMotor { float Step; int Speed; public: void initStep (float step) { Step = step; } void initSpeed (int speed) { Speed = speed; } }; int main(void) { StepMotor a; while(1) { a.initSpeed(20); a.initStep(20.0); } } А так все нормально. Так же не понятно как правильно организовать проект состоящий из нескольких файлов.
  9. У Вас в makefile: #/* Select Boot Size in Words (select one, comment out the others) */ ## NO! BOOTSIZE=128 ## NO! BOOTSIZE=256 ## BOOTSIZE=512 ## BOOTSIZE=1024 BOOTSIZE=2048 ## BOOTSIZE=4096 2 кБайта, а в программаторе 2 кСлова
  10. Скорее всего заморочка с измерением памяти программ: В GCC - байты, у Atmel - слова. Настройте фъюзы на 2k.
  11. ))) А при спаде надо будет деть куда то 1000 Ватт (Киловатт(В*А))
×
×
  • Создать...