OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů
Právě je 24 kvě 2017, 03:26

Všechny časy jsou v UTC + 1 hodina




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 4 ] 
Autor Zpráva
PříspěvekNapsal: 08 kvě 2017, 14:30 
Offline
Radil
Uživatelský avatar

Registrován: 18 kvě 2013, 13:56
Příspěvky: 440
Has thanked: 56 times
Been thanked: 107 times
Zdar,

pro nějaký projekt potřebuji na AT Mega 16 zprovoznit HW řízení toku dat. ATM16 HW řízení nemá, ale to jsem po pár experimentech vyřešil prostě tak, že softwarově řídím signál CTS směrem do PC.

RxD a TxD jsou zapojené na nohy 14 a 15, pro řízení CTS jsem využil pin 17 (PD3) a nakonec na RTS zbyla noha 16 (PD2).

Vytvořil jsem si malé pole bytů, které používám jako kruhový buffer se dvěma indexy (in, out) a proměnnou uchovávající počet bytů v poli, protože i když nastavím CTS tak, aby PC přestalo posílat data, tak to zřejmě PC pár bytů trvá než zareaguje (někde jsem se dočetl, že možná 2 - 3 byty, s čipy FTDI na USB prý to je horší než klasickými sériáky). Po pár experimentech se to ustálilo na velikosti 20 bytů buffer a 8 bytů hranice při které nastavuji CTS, 12 bytů je rezerva pro byty poslané CTS navzdory.

Data přijímám v přerušení. Kód vypadá takto:
Kód:
#define CTS_STOP        PORTD |= 0x04
#define CTS_RECIEVE     PORTD &= ~0x04
#define L3_ON           PORTC |= 0x80
#define L3_OFF          PORTC &= ~0x80
Kód:
#define USART_MAX_BYTES         8
#define USART_BUFFER_SIZE       20

volatile unsigned char usart_buffer [USART_BUFFER_SIZE];
volatile unsigned char usart_index_in;
volatile unsigned char usart_index_out;
volatile unsigned char usart_bytes;
Kód:
ISR (USART_RXC_vect)
{
   usart_buffer [usart_index_in] = UDR;
   usart_bytes++;

   if (usart_bytes > USART_MAX_BYTES) CTS_STOP;
   if (usart_bytes > USART_BUFFER_SIZE) LED3_ON;

   usart_index_in++;
   if (usart_index_in >= USART_BUFFER_SIZE) usart_index_in = 0;
}
V podstatě bezprostředně potom, co je byte přijmut do registru, tak ho uložím do kruhového bufferu, zvýším počet, posunu index, nastavím signál a jednu LED signalizující příp. přetečení bufferu ke kterému nedochází. Nic víc. Funguje to.

Někde jinde mám funkci, která z bufferu data vybírá, jsou-li tam nějaká a něco s nimi dělá. To je taky ok.

ALE chová se to nespolehlivě. ATM16 se občas resetuje. Někdy po pár stovkách bytů, někdy po desítkách tisíc. Náhodně.

Vypozoroval jsem, že
- záleží na taktu, čím víc, tím hůř, při 1MHz skoro 100% vše ok, při 8MHz jedno jestli RC oscilátor, nebo krystal, to občas nastane, při 16 i 20MHz nastává reset velmi často, třeba po pár stech bytů
- nezáleží na přenosové rychlosti, v podstatě stejně špatně se to chová jak pro 9600bps, tak pro 19200bps, rychleji komunikovat nepotřebuji (19200 pro daný účel stačí), při dalším experimentování mohu zkusit i jiné rychlosti
- do pinu 17, který používám pro řízení CTS proniká frekvence oscilátoru * 2, u 1MHz taktu to je téměř neznatelné, ale u 8MHz taktu byť z RC oscilátoru tam naměřím 16MHz cosi s amplitudou cca 200mV, analogicky pro jiné frekvence, s 20MHz krystalem tam byl skoro 40MHz skoro sinus, hádám, že to je nějaký přeslech uvnitř čipu
- určitě není problém s napájením, je důkladně blokováno dostatkem kondenzátorů (od fotky jich tam je pár navíc přímo u čipů), osciloskopem je na 5V minimální šum jak u ATM16, tak u MAX232 i na jiných částech nepájivého pole
- zkusil jsem např. i odpor mezi ATM16 a MAX232 (pár desítek ohmů), nebo kondenzátor na PD3 proti zemi (150pF, 220pF), nic nemělo pozorovatelný vliv

Na fotce - počítadlo se sedmisegmentovkami v pozadí ukazuje 9700, tj. 100* ASCII kód znaku malé A, kterými jsem v jeden okamžik testoval přenos. Později jsem z PC přenášel větší soubory se známou velikostí a počítaly přenesené byty.

Setkal jste se někdo s něčím podobným?

Až zas najdu čas, zkusím přemístit CTS na jinou nohu Atmelu (jiný port), zkusím jiný Atmel (kus i model) atd... pro tuto chvíli mne zajímá jestli to je nějaká známá anomálie ATM16. Možná má vliv i to, že to je konstrukce na nepájivém poli.


Přílohy:
IMG_4072_zmenseno.JPG
IMG_4072_zmenseno.JPG [ 779.71 KiB | Zobrazeno 170 krát ]

_________________
http://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS
Nahoru
 Profil  
 
PříspěvekNapsal: 08 kvě 2017, 17:16 
Offline
Radil

Registrován: 26 kvě 2013, 13:18
Příspěvky: 379
Bydliště: Šalingrad
Has thanked: 47 times
Been thanked: 35 times
PullUp/Pulldown rezistory jsi nezkoušel ?


Nahoru
 Profil  
 
PříspěvekNapsal: 08 kvě 2017, 18:22 
Offline
Radil
Uživatelský avatar

Registrován: 18 kvě 2013, 13:56
Příspěvky: 440
Has thanked: 56 times
Been thanked: 107 times
PvvS píše:
PullUp/Pulldown rezistory jsi nezkoušel ?
Zkoušel jsem přidávat 10k pulldown. Ale moc jsem tomu nepřikládal váhu a myslím, že se to taky nijak neprojevovalo.

Už jsem kdysi měl potíže s RS232 u nějakého PICu, tehdy jsem to vyřešil tím, že jsem RxD a TxD v TTL úrovních musel od sebe i od ostatních signálů na plošném spoji oddělit GND. Stejně tak GND musela být důsledně rozlitá okolo krystalu. Ale na nepájivém poli to neblblo a tohle blbne (signály drátem dost daleko od ostatních) a navíc i s interním RC oscilátorem.

Naopak v jiných situacích se ten Atmel choval dosud zcela korektně (řízení krokového motoru i s PWM výstupem z interních čítačů např.).

No, dostanu se k dalšímu experimentování možná až některý další večer v týdnu, nebo o víkendu, nevím, do té doby se snažím najít nápady.

_________________
http://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 21 kvě 2017, 12:54 
Offline
Radil
Uživatelský avatar

Registrován: 18 kvě 2013, 13:56
Příspěvky: 440
Has thanked: 56 times
Been thanked: 107 times
Jen pro info - po dalším čtvrtečním experimentování jsme zjistili.

- není to memory leak ani jiná SW chyba, MCU se tokem dat resetoval aniž by data zpracovával
- není to tím, že by Atmel skákal na obsluhu přerušení ke kterému obslužná funkce neexistuje
- nemá to souvislost se signálem CTS, ani s RTS, přesun na jiný port nemá vliv
- nemá to nic společného s napájením, stabilní s minimem šumu
- nemá to nic společného se signálem reset, pullup, nebo blokující kondenzátor nepomáhají
- nepomohla výměna za jiný kus AT Mega 16

Co nakonec pomohlo byl externí oscilátor. Jednoduchý oscilátor s 16MHz krystalem postavený z 74HC04 použitý jako clock místo interního RC oscilátoru, nebo prostě jen připojeného krystalu problém zřejmě řeší. Opakovaně jsem přenesl soubor velký přes 300kB, zatímco předtím to blblo i pár stovkách bytů.

Zatím jsem nezkoušel, jestli se to celé bude chovat stabilně při použití jiného Atmelu, třeba v desce s rozlitou GND okolo krystalu atd... namísto nepájivého pole. Určitě časem vyzkouším. Ale nemusí pomoct, RxD sousedí s krystalem, možná že problém je uvnitř čipu.

Zajímavé je, že to, co přichází z MAX232 do Atmelu se zdá být jako docela korektní TTL signál, žádné překmity ani na jednu stranu. Na první pohled osciloskopem nic, co by mělo způsobovat nestabilitu.

_________________
http://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 4 ] 

Všechny časy jsou v UTC + 1 hodina


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz