Генератор на Atmega8 (микросекунды) большие погрешности

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Ну так это же мне тут и показали :(
Это не хвост, это антенна
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Если нужно включить конкретные биты регистра не портя остальные, используют "ИЛИ - |", а чтобы сбросить используют "И - &"
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Пытаюсь подцепить юарт.
Спойлер

Код: Выделить всё

#define F_CPU 10000000UL

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "fifo.h"

FIFO(64) uart_tx_fifo;
FIFO(64) uart_rx_fifo;

void uart_init(unsigned int baudrate)
{
	UBRRH = (unsigned char) (baudrate>>8);                  
	UBRRL = (unsigned char) baudrate;
	UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
	UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
}


ISR(USART_RXC_vect)
{
  unsigned char rxbyte = UDR;
  if( !FIFO_IS_FULL( uart_rx_fifo ) ) {
    FIFO_PUSH( uart_rx_fifo, rxbyte );
  }
}

ISR(USART_UDRE_vect)
{
  if(FIFO_IS_EMPTY(uart_tx_fifo)){
    //если данных в fifo больше нет то запрещаем это прерывание
    UCSRB &= ~(1 << UDRIE);
  }
  else {
    //иначе передаем следующий байт
    char txbyte = FIFO_FRONT(uart_tx_fifo);
    FIFO_POP(uart_tx_fifo);
    UDR = txbyte;
  }
}

int uart_getc(FILE* file)
{
  int ret;
  cli();
  if(!FIFO_IS_EMPTY(uart_rx_fifo)){
    ret = FIFO_FRONT(uart_rx_fifo);
    FIFO_POP(uart_rx_fifo);
  }
  else {
    ret = _FDEV_EOF;
  }
  sei();
  return ret;
}

int uart_putc(  char c, FILE *file )
{
  int ret;
  cli(); //запрещаем прерывания
  if( !FIFO_IS_FULL( uart_tx_fifo ) ) {
    //если в буфере есть место, то добавляем туда байт
    FIFO_PUSH( uart_tx_fifo, c );
    //и разрешаем прерывание по освобождению передатчика
    UCSRB |= ( 1 << UDRIE );
    ret = 0;
  }
  else {
    ret = -1; //буфер переполнен
  }
  sei(); //разрешаем прерывания
  return ret;
}

int SetPrescaller(prescaller){	
	puts("OK\r\n");
	
	switch(prescaller){
		case('1'):
			puts("SET 256\r\n");
		break;
		case('2'):
			puts("SET 64\r\n");
		break;
		case('3'):
			puts("SET 8\r\n");
		break;
	}
}

FILE uart_stream = FDEV_SETUP_STREAM(uart_putc, uart_getc, _FDEV_SETUP_RW);

int main(void){
      
	stdout = stdin = &uart_stream;
	uart_init(67);
	sei();
	puts("Hello world\r\n");
   
	while(1)
	{
		int c = getchar();
		if(c!=EOF){
			char string[25];
			itoa(c, string, 10);
			
			puts("\r\n");
			puts(string);
			puts("\r\n");
			//printf("INT: %d, STRING: %s\n",c,string);
			//puts("\r\n");
			
			putchar(c);
			//SetPrescaller(c);
		}
	}
}
Изображение
Вложения
Снимок.png
(14.3 КБ) 644 скачивания
fifo.h
(761 байт) 327 скачиваний
Это не хвост, это антенна
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Как теперь с этим работать?
Насколько я понимаю это коты принятных символов
Это не хвост, это антенна
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»