Ahoj.
Píšu v code vision program, který načte z EEPROM defaultní nastavení seriové komunikace (rychlost, parita apod…) a vypíše tento stav na terminál přes RS-232 (např. na putty).
Kód (jen ty podstatné věci):
//hlavičkové soubory
#include <MEGA32.h>
#include <mega32_bits.h>
//tady jsou uložené řetězce, které se vypíšou na terminál - žádná, sudá, lichá parita
volatile char *PARITY] = {"None", "Even", "Odd"};
//***********************************************************
//funkce, která by měla z UCSRC registru zjistit, jaká je nastavená parita a vrátit návratovou hodnotu:
//0 = žádná parita (None) - tj. UPM1[0] UPM0[0]
//1 = sudá parita (Even) - tj. UPM1[1] UPM0[0]
//2 = lichá parita (Odd) - tj. UPM1[1] UPM0[1]
unsigned char Parity_Set()
{
unsigned char PARITY_INDICATOR = 0;
unsigned char UCSRC_COPY = 0;
//zde provadim maskovani, abych ziskal pouze 4. a 5. bit (UPM0 a 1) registru UCSRC, podle kterých je nastavena parita
UCSRC_COPY = (UCSRC & 0b00110000);
if (UCSRC_COPY == 0x00){
PARITY_INDICATOR = 0; // parita NONE
};
if (UCSRC_COPY == 0x20){
PARITY_INDICATOR = 1; // parita suda (Even)
};
if (UCSRC_COPY == 0x30){
PARITY_INDICATOR = 2; // parita licha (Odd)
};
//návratová hodnota, která se dosazuje za proměnnou "index" ve funkci "settings"
return PARITY_INDICATOR;
}
//***********************************************************
//tato funkce vypíše na terminál pomocí řetězce, jaká je nastavená parita. K tomu si na pomoc volá funkci Parity_Set(), která zjistí jaká parita je přesně nastavena a pak to předá funkci usart_send(), který provede zápis na USART (terminál)
void settings()
{
unsigned char index = 0;
...
//do proměnné index uložím návratovou hodnotu z funkce Parity_Set. Tato hodnota může nabývat hodnoty 0, 1 nebo 2 a slouží jako index pole *PARITY pro výpis správaného řetězce z pole na USART.
index = Parity_Set();
usart_send(PARITY[index]);
return;
}
//***********************************************************
//funkce main
void main()
{
//načtení parametrů sériové komunikace z EEPROM (argumenty funkce EEPROM_read jsou jednotlivé adresy EEPROM)
UBRRH = EEPROM_read(0x000);
UBRRL = EEPROM_read(0x001);
UCSRB = EEPROM_read(0x002);
UCSRC = EEPROM_read(0x003);
...
//volám funkci pro nastavení (a zatím jen výpis) parametrů sér. komunikace
settings();
return;
}
A v čem je teda problém?
Když jsem do EEPROM nastavil na adresu 0x003 hodnotu 0xB6, tak má MCU s PC komunikovat ve formátu 8+1, lichá parita - což skutečně komunikuje.
Problém je v tom, že vždy vypíše řetězec “None”, tedy se to tváří že proměnná index byla nastavena do nuly na základě funkce “Parity_Set()”.
Když jsem tento kus kódu zkoušel ve Visual Studiu, tak to fungovalo dobře a pokud jsem měl nastaveno v UCSRC hodnotu 0xB6, tak vypsal řetězec “Odd”. Tam jsem měl ale tu hodnotu do UCSRC přiřazenou “natvrdo” přímo v programu. Zase na MCU mám také jistotu, že se do UCSRC dostala správná hodnota, protože když pozměním obsah v EEPROM, tak se podle toho opravdu mění parametry komunikace.
Příjde mi to, jako by funkce “Parity_Set()” neuměla číst registr UCSRC. Ten je ale definovaný v hlavičkovém souboru <MEGA32.h> a mám za to, že se chová jako globální proměnná a je možné k němu přistupovat odkudkoliv z programu, nebo žiju v bludu ?
Děkuji za nápady