yetislawo napisał:
Andrzeju 1 jak pragnę zakwitać w zinie nic z tego nie pojmuję ;)
Witam
Jak próbowałem na patyczkach, to dowiedziałem się że nudne. Jak pominąłem podstawy,
to nie można mnie zrozumieć. Chyba się pochlastam.
Dzisiaj udało się uruchomić transmisję szeregową do PC. W ten sposób uzyskałem potężne
narzędzie do szukania błędów w programie. Mogę wysłać łańcuch do PC i wyświetlić go
na ekranie. Poprawna inicjalizacja portów ATMega32 z zegarem 16MHz aby otrzymać
transmisję szeregową RS232 z prędkością 9600 bez kontroli parzystości, 8bitów na znak, 1 bit stopu
wygląda tak :
Jest to fragment programu nie da się skompilować.
[code:1]
#define F_CPU 16000000ULL /* 16,0Mhz */
#define UART_BAUD_RATE 9600ULL /* 9600 baud */
#define UART_BAUD_SELECT ((F_CPU/(UART_BAUD_RATE*16ULL))-1ULL)
:
void WyslijZnak(unsigned char Znak)
{
while (!(UCSRA & (1<
UDR = Znak;
}
:
int main( void)
{
:
/* set baud rate to 9600 */
UBRRL = (unsigned char)UART_BAUD_SELECT;
UBRRH = (unsigned char )(UART_BAUD_SELECT >> 8);
/* URSEL bit must be High, 8bit char */
UCSRC = _BV( URSEL) | _BV( UCSZ1 ) | _BV( UCSZ0 );
/* enable TxD */
UCSRB = _BV( TXEN );
:
}
[/code:1]
Udało się również uruchomić inklinometr. Przyrząd ten wskazuje mi, czy okręt pochylony
jest na dziób czy na rufę. Zasada działania jest taka :
Inklinometr podaje w postaci napięcia odchylenie od pionu w trzech osiach. Ja używam tylko
jednej osi. Nie wiem co zrobić, gdy wykryłbym, że okręt ma szlagzajtę na jedną burtę, więc nie
pytam inklinometru o to.
Inicjalizacja procesu pomiarowego (przetwornik A/D). Przetwornik potrzebuje czasu na
wykonanie pomiaru. Zakończenie pomiaru sygnalizowane jest przerwaniem. Przerwanie ustawia
wartość przechyłu i flagę mówiącą o tym, że pomiar został wykonany. Ze względu na możliwe szumy
i zakłócenia biorę pod uwagę tylko starsze osiem bitów. Dwa najmłodsze pomijam.
Procedury obsługi wyglądają tak :
[code:1]
#include "stdafx.h"
#include "PortDefs.h"
#include "inklinometr.h"
// Inklinometr przylaczony jest do portu A bit 6
// Przetwornik jest jeden, mozna przetwarzac na raz tylko jeden sygnal
static volatile uint16_t przechyl = 0;
static volatile unsigned char PrzechylValid = 0;
SIGNAL( SIG_ADC )
{
przechyl = ADCH;
PrzechylValid = 1;
}
void StartMeasureShipInclination()
{
/*
REFS1, REFS2 = 01 - Napiecie odniesienia AVCC z zewnętrznym kondensatorem
ADLAR = 1 - osiem bitów w ADCH, najmlodsze pomijane
= 0 - operacja normalna
MUX4:0 = 00110 - ADC6
*/
ADMUX = 0b01100110;
/*
ADEN = 1 wlacz
ADSC = 1 start przetwarzania
ADATE = 0 wyzwalanie nie automatyczne
ADIF = 0 znacznik zakonczenia konwersji
ADIE = 1 koniec przetwarzania to przerwanie
ASPS2..0 = 111 preskaler 128 częstotliwosc pomiaru 16Mhz/128= 125kHz
*/
ADCSRA = 0b11001111;
PrzechylValid = 0;
}
unsigned char IsInclinationValid()
{
return PrzechylValid;
}
uint16_t GetInclination()
{
if ( IsInclinationValid() )
{
return przechyl;
}
return 0xFFFF;
}
[/code:1]
Nie ma gwarancji, że jest to całkiem poprawne, ale działa.
Z ukłonami
Andrzej Korycki