Чт мар 29, 2018 11:05:15
Чт мар 29, 2018 13:00:47
32 Гц чем вас не устраивает
Чт мар 29, 2018 13:53:13
еще раз повторяю:bango писал(а):По расчетам должно быть так 16000000/1024/250 = 62,5Гц
а фактически вот так 16000000/1024/124 = 62,5Гц метод подбора сработал
Чт мар 29, 2018 14:27:48
Чт мар 29, 2018 14:39:08
Чт мар 29, 2018 15:27:09
Вт июл 03, 2018 13:42:23
#define F_CPU 16000000UL // 16 МГц
#include <avr/io.h>
#include <util/delay.h>
// I2C Bus functions
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include "lcdpcf8574/lcdpcf8574.h"
#define UART_BAUD_RATE 2400
#include "uart/uart.h"
#define PIN(x) (*(&x - 2)) /* address of input register of port x */
int main(void)
{
//init uart
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
sei();
uart_puts("starting...");
//init lcd
lcd_init(LCD_DISP_ON_BLINK);
//lcd go home
lcd_home();
uint8_t led = 0;
lcd_led(led); //set led
while(1) {
lcd_led(led); //set led
led = !led; //invert led for next loop
//test loop
int i = 0;
int line = 0;
for(i=0; i<10; i++) {
char buf[10];
itoa(i, buf, 10);
lcd_gotoxy(1, line);
lcd_puts("i= ");
itoa(i, buf, 10);
lcd_gotoxy(4, line);
lcd_puts(buf);
line++;
line %= 2;
uart_puts(buf);
uart_puts("\r\n");
_delay_ms(100);
} // end_for
} // end_while(1)
} // end_main
#ifndef UART_H
#define UART_H
/************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4
Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
License: GNU General Public License
Usage: see Doxygen manual
LICENSE:
Copyright (C) 2006 Peter Fleury
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
************************************************************************/
/**
* @defgroup pfleury_uart UART Library
* @code #include <uart.h> @endcode
*
* @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
*
* This library can be used to transmit and receive data through the built in UART.
*
* An interrupt is generated when the UART has finished transmitting or
* receiving a byte. The interrupt handling routines use circular buffers
* for buffering received and transmitted data.
*
* The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define
* the size of the circular buffers in bytes. Note that these constants must be a power of 2.
* You may need to adapt this constants to your target and your application by adding
* CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile.
*
* @note Based on Atmel Application Note AVR306
* @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
*/
/**@{*/
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
/*
** constants and macros
*/
/** @brief UART Baudrate Expression
* @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
* @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
*/
#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)
/** @brief UART Baudrate Expression for ATmega double speed mode
* @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
* @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
*/
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000)
/** Size of the circular receive buffer, must be power of 2 */
#ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 32
#endif
/** Size of the circular transmit buffer, must be power of 2 */
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 32
#endif
/* test if the size of the circular buffers fits into SRAM */
#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) )
#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM"
#endif
/*
** high byte error return code of uart_getc()
*/
#define UART_FRAME_ERROR 0x0800 /* Framing Error by UART */
#define UART_OVERRUN_ERROR 0x0400 /* Overrun condition by UART */
#define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */
#define UART_NO_DATA 0x0100 /* no receive data available */
/*
** function prototypes
*/
/**
@brief Initialize UART and set baudrate
@param baudrate Specify baudrate using macro UART_BAUD_SELECT()
@return none
*/
extern void uart_init(unsigned int baudrate);
/**
* @brief Get received byte from ringbuffer
*
* Returns in the lower byte the received character and in the
* higher byte the last receive error.
* UART_NO_DATA is returned when no data is available.
*
* @param void
* @return lower byte: received byte from ringbuffer
* @return higher byte: last receive status
* - \b 0 successfully received data from UART
* - \b UART_NO_DATA
* <br>no receive data available
* - \b UART_BUFFER_OVERFLOW
* <br>Receive ringbuffer overflow.
* We are not reading the receive buffer fast enough,
* one or more received character have been dropped
* - \b UART_OVERRUN_ERROR
* <br>Overrun condition by UART.
* A character already present in the UART UDR register was
* not read by the interrupt handler before the next character arrived,
* one or more received characters have been dropped.
* - \b UART_FRAME_ERROR
* <br>Framing Error by UART
*/
extern unsigned int uart_getc(void);
/**
* @brief Put byte to ringbuffer for transmitting via UART
* @param data byte to be transmitted
* @return none
*/
extern void uart_putc(unsigned char data);
/**
* @brief Put string to ringbuffer for transmitting via UART
*
* The string is buffered by the uart library in a circular buffer
* and one character at a time is transmitted to the UART using interrupts.
* Blocks if it can not write the whole string into the circular buffer.
*
* @param s string to be transmitted
* @return none
*/
extern void uart_puts(const char *s );
/**
* @brief Put string from program memory to ringbuffer for transmitting via UART.
*
* The string is buffered by the uart library in a circular buffer
* and one character at a time is transmitted to the UART using interrupts.
* Blocks if it can not write the whole string into the circular buffer.
*
* @param s program memory string to be transmitted
* @return none
* @see uart_puts_P
*/
extern void uart_puts_p(const char *s );
/**
* @brief Macro to automatically put a string constant into program memory
*/
#define uart_puts_P(__s) uart_puts_p(PSTR(__s))
/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */
extern void uart1_init(unsigned int baudrate);
/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */
extern unsigned int uart1_getc(void);
/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */
extern void uart1_putc(unsigned char data);
/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */
extern void uart1_puts(const char *s );
/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */
extern void uart1_puts_p(const char *s );
/** @brief Macro to automatically put a string constant into program memory */
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
/**@}*/
#endif // UART_H
Вт июл 03, 2018 17:12:30
Народ, если нет особых требований, типа поддержки ATXmega, обычно, пользуется АВР Студией 4.19, она, пожалуй, самая стабильная и хорошо работающая. Более поздние Студии, да, излишне тяжелые и тормозные, особенно на машинках постарше. А Студия 4.19 летает на любых машинках, начиная с 3-го Пентиума.Atmel-studio как-то излишне заморочена на мой взгляд, инсталятор ставит тьму всякой-всячины.
Ср июл 04, 2018 11:07:30
Ср июл 04, 2018 13:13:58
А зачем? ИМХО, лучший вариант для USBASP - прорамма AVRDUDEPROG 3.3. Первый раз собрал проект, запустил AVRDUDEPROG, нашел и открыл в ней хекс-файл, записал, попробовал, свернул AVRDUDEPROG в трей, и все, правь проект дальше. Сделал новую сборку, одним кликом поднял из трея AVRDUDEPROG, вторым прошил новый вариант, и вперед!..В AVR Studio 4, в Tools-Customise-Tools хотел добавить пунктик вызов avrdude чтобы вливать прошивку в МК через программатор USBASP
Ср июл 04, 2018 15:22:58
const unsigned char *Main_strings[13]PROGMEM={strng1,strng2,strng3,strng4};
const unsigned char strng1[]PROGMEM ={"строка1\0"};
const unsigned char strng2[]PROGMEM ={"строка2\0"};
const unsigned char strng3[]PROGMEM ={"строка3\0"};
const unsigned char strng4[]PROGMEM ={"строка4\0"};
const unsigned char * const Main_strings[]PROGMEM={strng1,strng2,strng3,strng4};
extern const unsigned char strng1[];
extern const unsigned char strng2[];
extern const unsigned char strng3[];
extern const unsigned char strng4[];
extern const unsigned char * const Main_Menu_strings[];
for(uint8_t i=0;i<13;i++){
strings[i]=(const unsigned char * const)pgm_read_byte(&(Main_strings[i]));
}
Ср июл 04, 2018 17:52:29
char stnames[][16] PROGMEM =
{
" ",
" Тенгри FM ", // 100.50
" Радио Текс ", // 101.20
"Русское радио ", // 102.80
" Love Radio ", // 104.80
" Радио NS ", // 105.60
" Авторадио ", // 106.30
" Что-то FM ", // 106.70
" Наше радио ", // 107.00
" Дала FM " // 107.70
};
Ср июл 04, 2018 21:59:13
Пт июл 06, 2018 03:33:02
Как сказать? Я решал ту же самую задачу: получить набор строк для выдачи на LCD-экранчик, но для ее решения применил не кучку отдельных строк с массивом указателей на них, а обыкновенный двумерный массив. Недостаток этого решения - фиксированная (и максимальная) длина строки, т.е. перерасход памяти на пробелы, дополняющие более короткие строки. Впрочем, не факт, что это недостаток - при изменении какой-либо строки на экране не надо отдельно стирать предыдущую - новая строка точно перекрывает старую. Для этого же служит и первая (нулевая) пробельная строка, но это актуально только для моего приложения.Вы сделали не правильно.
Как я понимаю, эта версия входит в свежую версию Студии, да? А нельзя ли как-нибудь прикрутить ее к Студии 4.19?вы используете свежую версию avr-gcc
Пт июл 06, 2018 06:51:48
почитайте о том, как avr-gcc распределяет память при инициализации строковых "переменных", чтобы понять, что я имел ввиду под "неправильно": Storing and Retrieving Strings in the Program Spaceafz писал(а):Как сказать
можно, путем тупого переписывания папки со "старым" тулчейном файлами из "нового". Если хочется сохранить и работоспособность старого - тогда при помощи компиляции "внешним" makefile.afz писал(а):А нельзя ли как-нибудь прикрутить ее к Студии 4.19?
Пт июл 06, 2018 08:17:37
Пт июл 06, 2018 08:36:44
не всегда помогает. я столкнулся с тем, что в последних версиях avr-gcc то ли папки как-то поменяли, то ли их содержимое стало другим, но просто указание СТАРОЙ студии пути к НОВОМУ тулчейну может привести к тому, что некоторые утилиты (типа avr-size или make) не смогут вызываться. не утверждаю, что так происходит всегда, но у меня так было...oleg110592 писал(а):и указать путь к toolchain
Пт июл 06, 2018 10:57:36
0000 04000000 2b000000 01000000 41565200 ....+.......AVR.
0010 00000000 00400000 60000000 00040000 .....@..`.......
0020 00000000 00020000 08000000 01000000 ................
0030 0061746d 65676131 36000000 .atmega16...
Пт июл 06, 2018 12:18:02
Ну посмотрел. Это же опять про массив указателей на кучку отдельных строк, и то, и другое в PROGMEM. Я же предложил банальный массив строк. И то, и другое средство позволяют получить доступ к строке по ее номеру - собственно, ради этого все и затевалось. Только массив указателей на отдельные строки позволяет делать сами строки различной произвольной длины, а массив строк должен набираться из строк одинаковой длины, поскольку адресация в него ведется банальным умножением первого индекса (номера строки) на длину одной строки (это я подглядел в дизасме). Да, время выполнения этого действия больше, чем достать указатель из таблицы, но кого это волнует? А про то, что менять строки на экране проще, поскольку новая строка точно перекрывает старую, я уже написал.ARV писал(а):как avr-gcc распределяет память при инициализации строковых "переменных"
Пт июл 13, 2018 19:38:45