Hledám zdrojový kód v C pro nastavení USART na ATmega8

Ano, má být 7373.

Předděličku použijeme tehdy, když počet kroků vyjde větší, než je rozsah čítače, který chceme použít.

Timer1 má max hodnotu 65535, takže pro 7373 kroků není třeba předděličky.

Ale např. pro 10 ms vyjde 73730 kroků, takže použijeme předdělič /stačí 8/.
Prostě použít co nejmenší předděličku, aby se žádaný počet kroků vešel do 16 bitů (nebo do osmi bitů u osmibitového čítače).

Skor 1.7 percenta :wink:

Ja to riesim tak, ze si pocitam pocet preruseni a kazde piate nastavim na 116.
(pre predvolbu 115 treba nastavit do OCR cislo 114 a pre predvolbu 116, cislo 115)
Tym vznikne presny deliaci pomer 115.2 v 2.5 ms. Aby to bolo v 2.5ms, prerusenie generujem kazdych 500us.
Ale chyba vznika v tej frekvencii Xtalu, lebo ta nie je 7.3730MHz, ale 7.3728MHz.
co je 0.0027%. Myslim, ze je pre bezne pouzitie uplne zanedbatelna.

no ak to chcem vsetko nastavit v kode ? :slight_smile: rozhodol som sa pre timer/counter1 (16bit) aby som nemusel pouzit predelicku. Ale co vsetko nastavit? alebo treba pouzit nejaky rezim (CTC,PWM…??), jedine co vime tak nastavit timer: TCCR1B|=(1<<CS10); potom ho checknut: if (TCNT1>=7373) … TCNT1=0; (reset) a dalej neviem ako nastavit reg. TIMSK(maskovanie prerusenia), TIFR(nastavenie priznaku)…

[code]
// pre cnt2

#define T2_CNT TCNT2
#define T2_PREDVOLBA OCR2A
#define POCET_PRVEJ_PREDVOLBY 5 // pocet priradenia hodnoty TB_DEFAULT_1 a TB_DEFAULT_2 do komparacneho registra
#define TB_DEFAULT_1 229 //230-1 pouzije sa POCET_PRVEJ_PREDVOLBY, alebo 115-1, ak mas pomalsi Xtal
#define TB_DEFAULT_2 231 //232-1 pouzije sa 1x, (ak POCET_PRVEJ_PREDVOLBY = 5, potom bude priemer 230.4) , alebo 116-1, ak mas pomalsi Xtal, potom bude priemer 115.2

uint8_t tb_cnt_count_int_tb = POCET_PRVEJ_PREDVOLBY;

// inicializacna cast

void cnt_ini(void)
{
TCCR2A = (1<<WGM21);
TCCR2B = (1<<CS22);
SET(TIMSK2,OCIE2A); // povolenie interuptu pri compare match
}

ISR(SIG_OUTPUT_COMPARE2A)
{

if (--tb_cnt_count_int_tb) {  // najprv sa dekrementuje pocitadlo vlozenia predvolieb a potom sa porovna
	TB_PREDVOLBA = TB_DEFAULT_1; 
}
else {
	tb_cnt_count_int_tb = POCET_PRVEJ_PREDVOLBY;
	TB_PREDVOLBA = TB_DEFAULT_2;
}

// … tu si daj co chces
// je to napisane narychlo, dufam, ze tam nebudu nejake neprekonatelne chyby
}[/code]

tak s timerom1 som si poradil :slight_smile: moja funkcia:

void Init_Timer(void)
{
//nastavenie timer1 pre CTC mod
TCCR1B |= (1 << WGM12);

//povolit CTC interrupt
TIMSK |= (1 << OCIE1A);

//nastavit CTC porovnavaciu hodnotu pri 7,3728MHz AVR-clock

//OCR1A = 9216; //pre 10ms
OCR1A = 7200; //pre 1s

//start timer

//TCCR1B |= (1 << CS11); //pre fcpu/8
TCCR1B |= (1 << CS12) | (1 << CS10); //pre fcpu/1024
}

potom main:
int main(void)
{

USARTInit(95);		//UBRR = 95 pre 7,3728 MHz external crystal

ak U2X=1
Init_Timer();

while(1)
{
	if (TIFR & (1 << OCF1A))
	{
		USARTWriteChar('P');
		TIFR = (1 << OCF1A);
	}	
}

}

ide to ako ma len ked chcem napriklad vypisovat kazdych 30sekund tak uz dostavam velku hodnotu ktora sa mi neznesti do 16bit timera.

30s=30 000ms=30 000 000 us,
pri predelicke max 1024 je hodnota OCR1A = 216 000 co je viac ako 65tis nieco, tak neviem ako sa tu teraz postupuje…

   if (--tb_cnt_count_int_tb) {  // najprv sa dekrementuje pocitadlo vlozenia predvolieb a potom sa porovna
      TB_PREDVOLBA = TB_DEFAULT_1;
   }
   else {
      tb_cnt_count_int_tb = POCET_PRVEJ_PREDVOLBY;
      TB_PREDVOLBA = TB_DEFAULT_2;
   }

presne tak, ako som Ti napisal … rozsirenie 8b je 16b, pouzi pre rozsirenie 16b na 24b

pouzil som funckciu case (switch) a av avr studiu ako by to nepoznalo; hlasi chybu:
…/usart_new.c:127: error: expected declaration or statement at end of input
make: *** [usart_new.o] Error 1

pouzivam len:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include “uart.h”

Zdravim,
poradil by mi nekdo kde je chyba v následujícím kódu? Melo by to jen načíst znak z klávesnice a poslat ho zpět… Díky
V hyperterminálu nastavuju rychlost 9600, datové bity 8, parita žádná, stop bit 1, řízení toku žádné

#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <stdio.h>

#define MYUBRR 51

void USART_Init( unsigned int ubrr)
{
/* Set baud rate /
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/
Enable receiver and transmitter /
UCSRB|=0x18;
/
Set frame format: 8data, 1stop bit */
UCSRC |=0x86;
}

void main( void )
{
char znak;

USART_Init ( MYUBRR );

while(1) {
znak=getchar();
putchar(znak);
}

}