=DeaD= писал(а):Сергей писал(а):Скажи что написать нужно.
Так там есть список уроков, я пока кроме мигания светодиодом еще ничего не сделал, выбирай любой из списка:
[[Курс "Программирование МК AVR на Си"]]или список сюда продублировать?
Не нужно дублировать, я узнал что хотел.
=DeaD= писал(а):Я пока никакой в темах №4.3, 5.х, слабоват в теме 4.1, 4.2.
Разберемся. Буду делать и выкладывать сюда, с вики не дружу пока.
Добавлено спустя 30 минут 9 секунд:Вот пример 4.1
- Код: Выделить всё • Развернуть
#include <avr/io.h>
#include <stdint.h>
void usart0_init( uint32_t baudrate );
void usart0_putchar( uint8_t data );
uint8_t usart0_getchar( void );
void usart0_putstr( char *str );
void usart0_getstr( char *str, uint8_t length ) ;
void usart0_init( uint32_t baudrate )
{
uint16_t bauddiv = ( ( F_CPU + ( baudrate * 8L ) ) / ( baudrate * 16L ) - 1 );
UBRRL |= bauddiv;
UBRRH |= ( bauddiv >> 8 );
UCSRB |= ( 1 << TXEN ) | ( 1 << RXEN );
}
void usart0_putchar( uint8_t data )
{
while( !( UCSRA & ( 1 << UDRE ) ) );
UDR = data;
}
uint8_t usart0_getchar( void )
{
while( !( UCSRA & ( 1 << RXC ) ) );
return UDR;
}
void usart0_putstr( char *str )
{
while( *str )
usart0_putchar( *str++ );
}
void usart0_getstr( char *str, uint8_t length )
{
while( length )
{
*str = usart0_getchar();
if( *str == 'n' || *str == 'r' )
break;
str++;
length--;
}
}
int main( void )
{
char tmp_str[] = "Hello, world!nr";
usart0_init( 9600 );
usart0_putstr( tmp_str );
while( 1 )
{
char buffer[64] = { 0 };
usart0_getstr( buffer, 64 );
usart0_putstr( buffer );
}
return 0;
}
Добавлено спустя 14 минут 8 секунд:Вот пример 3.3, управляем светодиодом кнопками через INT0-1
- Код: Выделить всё • Развернуть
#include <avr/io.h>
ISR( INT0_vect )
{
PORTD |= ( 1 << PD4 );
}
ISR( INT1_vect )
{
PORTD &=~( 1 << PD4 );
}
int main( void )
{
DDRD &=~ ( 1 << PD2 ) | ( 1 << PD3 );
PORTD |= ( 1 << PD2 ) | ( 1 << PD3 ) | ( 1 << PD4 );
DDRD |= ( 1 << PD4 );
MCUCR = 0;
GICR |= ( 1 << INT0 ) | ( 1 << INT1 );
sei();
while( 1 );
return 0;
}
Добавлено спустя 30 минут 44 секунды:Работа с еепром по юарт. Правьте как нужно, другого ничего в голову не пришло, пойду спать. Считайте что это пример на 5.2
- Код: Выделить всё • Развернуть
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
void usart0_init( uint32_t baudrate );
void usart0_putchar( uint8_t data );
uint8_t usart0_getchar( void );
void usart0_putstr( char *str );
void usart0_getstr( char *str, uint8_t length );
void eeprom_write( uint16_t address, uint8_t data );
uint8_t eeprom_read( uint16_t address );
void usart0_init( uint32_t baudrate )
{
uint16_t bauddiv = ( ( F_CPU + ( baudrate * 8L ) ) / ( baudrate * 16L ) - 1 );
UBRRL |= bauddiv;
UBRRH |= ( bauddiv >> 8 );
UCSRB |= ( 1 << TXEN ) | ( 1 << RXEN );
}
void usart0_putchar( uint8_t data )
{
while( !( UCSRA & ( 1 << UDRE ) ) );
UDR = data;
}
uint8_t usart0_getchar( void )
{
while( !( UCSRA & ( 1 << RXC ) ) );
return UDR;
}
void usart0_putstr( char *str )
{
while( *str )
usart0_putchar( *str++ );
}
void usart0_getstr( char *str, uint8_t length )
{
while( length )
{
*str = usart0_getchar();
if( *str == '\n' || *str == '\r' )
break;
str++;
length--;
}
}
void eeprom_write( uint16_t address, uint8_t data )
{
while( EECR & ( 1 << EEWE ) );
EEAR = address;
EEDR = data;
EECR |= ( 1 << EEMWE );
EECR |= ( 1 << EEWE );
}
uint8_t eeprom_read( uint16_t address )
{
while( EECR & ( 1 << EEWE ) );
EEAR = address;
EECR |= ( 1 << EERE );
return EEDR;
}
int main( void )
{
char str_enter_cmd[] = "Enter command ( 'r' to read, 'w' to write ): ";
char str_enter_addr[] = "Enter address: ";
char str_enter_value[] = "Enter value: ";
char str_default[] = "Wrong command, try again!\n\r";
char str_value[] = "Value is: ";
usart0_init( 9600 );
while( 1 )
{
char buffer[8] = { 0 };
int addr = 0;
uint8_t value = 0;
usart0_putstr( str_enter_cmd );
switch( usart0_getchar() )
{
case 'r':
usart0_putchar( '\r' );
usart0_putstr( str_enter_addr );
usart0_getstr( buffer, sizeof( buffer ) );
addr = atoi( buffer );
memset( buffer, 0, sizeof( buffer ) );
value = eeprom_read( addr );
usart0_putstr( str_value );
usart0_putstr( itoa( value, buffer, 10 ) );
break;
case 'w':
usart0_putchar( '\r' );
usart0_putstr( str_enter_addr );
usart0_getstr( buffer, sizeof( buffer ) );
addr = atoi( buffer );
memset( buffer, 0, sizeof( buffer ) );
usart0_putchar( '\r' );
usart0_putstr( str_enter_value );
usart0_getstr( buffer, sizeof( buffer ) );
value = atoi( buffer );
memset( buffer, 0, sizeof( buffer ) );
eeprom_write( addr, value );
break;
default:
usart0_putstr( str_default );
break;
}
usart0_putchar( '\r' );
}
return 0;
}