Witam,
Problem polega na tym, że po przesłaniu bajtu informacji ( nie zależnie od długości ), zawsze brakuje pierwszego bitu. Sprawdziłem to po przez ustawienie odpowiednio zapalenia lub mrygania na wartość bitu 0 lub 1.
Sprawdzając najpierw wiadomości 8 bitowe, a później schodząc w dół, doszedłem do wniosku, że bity są ustawione nie jak by się przypuszczało (np. 0xf0 = 1111 0000, 0x57 = 0101 0111) a w sposób miejscowy (np. dwa to zawsze dwa pierwsze bity zero, 5 to pierwszy i przed ostatni). Wybierając przypadkowe numery stwierdziłem, że niektóre kombinacje się powtarzają i że pierwszym bitem jest zawsze zero. Tak chyba nie powinno być, prawda?
Komunikowałem się z uC za pomocą Pythona (PySerial) i HyperTerminal Private Edition (mam Vistę).
W kodzie jest ustawione na 5 bitów, ale to tylko dlatego, żeby dokładniej sprawdzić czy rzeczywiście nie ma jednego bitu na wszystkich bajtach.
kod uC:
Problem polega na tym, że po przesłaniu bajtu informacji ( nie zależnie od długości ), zawsze brakuje pierwszego bitu. Sprawdziłem to po przez ustawienie odpowiednio zapalenia lub mrygania na wartość bitu 0 lub 1.
Sprawdzając najpierw wiadomości 8 bitowe, a później schodząc w dół, doszedłem do wniosku, że bity są ustawione nie jak by się przypuszczało (np. 0xf0 = 1111 0000, 0x57 = 0101 0111) a w sposób miejscowy (np. dwa to zawsze dwa pierwsze bity zero, 5 to pierwszy i przed ostatni). Wybierając przypadkowe numery stwierdziłem, że niektóre kombinacje się powtarzają i że pierwszym bitem jest zawsze zero. Tak chyba nie powinno być, prawda?
Komunikowałem się z uC za pomocą Pythona (PySerial) i HyperTerminal Private Edition (mam Vistę).
W kodzie jest ustawione na 5 bitów, ale to tylko dlatego, żeby dokładniej sprawdzić czy rzeczywiście nie ma jednego bitu na wszystkich bajtach.
kod uC:
#define F_CPU (1000000ul) // Hz
#define UART_BAUD (2400ul) // BAUD
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_BIT 0x01
#define LED_ON (LED_PORT = LED_BIT)
#define LED_OFF (LED_PORT = 0x00)
#define UBRR ((F_CPU/16ul/UART_BAUD)-1)
///////////////////////////////////////////////////////
// PRE_FUNCTIONS
uint16_t USART_receive(void);
void init(void);
void led_flashing(uint16_t);
void start_signal(void);
void command_signal(uint16_t);
uint8_t readByte(void);
................
//////////////////////////////////////////////////////////////////
// INITIALIZATION
void init(void){
LED_DDR = LED_BIT;
LED_OFF;
}
void USART_init(void)
{
// set UBRR / speed
UBRRH = (UBRR >> 8);
UBRRL = UBRR;
// clearing all errors
UCSRA &= ~( (1<<FE) | (1<<DOR) );
// enable Receive&Transmitt
UCSRB |= ( (1<<RXEN) | (1<<TXEN) );
// 5 bits, 1stop, Failing XCK Edge
UCSRC |= ( (1<<URSEL) | (0<<UCSZ1) | (0<<UCSZ0) | (1<<UCPOL) );
UDR = 0;
}
///////////////////////////////////////////////////////
// MAIN
int main(void)
{
uint16_t command;
init();
USART_init();
while(1)
{
// wait for command
command = USART_receive();
command_signal( command );
_delay_ms(240);
}
return 0;
}
///////////////////////////////////////////////////////
// FUNCTIONS
uint16_t USART_receive(void)
{
uint8_t most, least;
uint16_t data;
most = readByte();
least = readByte();
data = most;
data = ( data << 5 );
data|= (uint16_t)least;
return data;
}
uint8_t readByte(void)
{
while (!(UCSRA & (1<<RXC)));
c = UDR;
return c;
}
void command_signal(uint16_t data)
{
uint8_t i=10;
while(i)
{
if(data &(1<<9))
{
asm("nop");
logic_1();
}
else logic_0();
data <<= 1;
--i;
}
}
......................