Witam
Zaczelem sie bawic transmisja szeregowa miedzy atmega a komptuerem.
Mam taki problem, ze jak pisze w asemblerze to wszystko dziala, a jak ten kod przerobie na C to wychodza jakies krzaki, czy ktos moze wie gdzie popelnilem blad
program asm:
.INCLUDE "m32def.inc"
ldi r17, high ((16000000 / (9600 * 16)) - 1)
ldi r16, low ((16000000 / (9600 * 16)) - 1)
out ubrrh, r17
out ubrrl, r16
ldi r16, (1<<ursel) | (1<<ucsz1) | (1<<ucsz0) | (1<<upm1)
out ucsrc, r16
ldi r16, (1<<rxen) | (1<<txen)
out ucsrb, r16
czekaj:
sbis ucsra, udre
rjmp czekaj
ldi r18, 'a'
out udr, r18
rjmp czekaj
Program w C:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define FCPU 16000000
#define VUART 19200
#define VUBRR (FCPU/(VUART*16))-1
#define sbi(port,bit) port |= (1<<bit)
#define cbi(port,bit) port &= ~(1<<bit)
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while (bit_is_clear(UCSRA,UDRE));//!( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}
int main(void)
{
UBRRH= (unsigned char) (VUBRR>>8);
UBRRL= (unsigned char) VUBRR;
UCSRC |= (1<<URSEL) | (1<<UCSZ1) |(1<<UCSZ0) | (1<<UPM1);
UCSRB |= (1<<RXEN) | (1<<TXEN);
while(1)
{
USART_Transmit('6');
}
return 0;
}
Bede bardzo wdzieczny za wskazowki
pozdrawiam
Dodano po 4 [minuty]:
Przy testowaniu oczywiscie przdkosci transmisji tu i tu ustawilem takiem same czyli 9600
Zaczelem sie bawic transmisja szeregowa miedzy atmega a komptuerem.
Mam taki problem, ze jak pisze w asemblerze to wszystko dziala, a jak ten kod przerobie na C to wychodza jakies krzaki, czy ktos moze wie gdzie popelnilem blad
program asm:
.INCLUDE "m32def.inc"
ldi r17, high ((16000000 / (9600 * 16)) - 1)
ldi r16, low ((16000000 / (9600 * 16)) - 1)
out ubrrh, r17
out ubrrl, r16
ldi r16, (1<<ursel) | (1<<ucsz1) | (1<<ucsz0) | (1<<upm1)
out ucsrc, r16
ldi r16, (1<<rxen) | (1<<txen)
out ucsrb, r16
czekaj:
sbis ucsra, udre
rjmp czekaj
ldi r18, 'a'
out udr, r18
rjmp czekaj
Program w C:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define FCPU 16000000
#define VUART 19200
#define VUBRR (FCPU/(VUART*16))-1
#define sbi(port,bit) port |= (1<<bit)
#define cbi(port,bit) port &= ~(1<<bit)
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while (bit_is_clear(UCSRA,UDRE));//!( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}
int main(void)
{
UBRRH= (unsigned char) (VUBRR>>8);
UBRRL= (unsigned char) VUBRR;
UCSRC |= (1<<URSEL) | (1<<UCSZ1) |(1<<UCSZ0) | (1<<UPM1);
UCSRB |= (1<<RXEN) | (1<<TXEN);
while(1)
{
USART_Transmit('6');
}
return 0;
}
Bede bardzo wdzieczny za wskazowki
pozdrawiam
Dodano po 4 [minuty]:
Przy testowaniu oczywiscie przdkosci transmisji tu i tu ustawilem takiem same czyli 9600