Portál AbcLinuxu, 16. listopadu 2025 00:50
/* defines for backward compatibility */
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
int main(void) {
/* UART init */
UBRRH=0;
UBRRL=51;
sbi(UCSRB,RXEN);
sbi(UCSRB,TXEN);
cbi(UCSRC,UMSEL); //asynchornni prenos
cbi(UCSRC,UPM1);
cbi(UCSRC,UPM0); //odd parity
cbi(UCSRC,USBS); //1 stop bit
cbi(UCSRC,UCSZ2);
sbi(UCSRC,UCSZ1);
sbi(UCSRC,UCSZ0);//8 datovych bitu
while (1) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR = "5";
}
return 0;
}
Potom jsem nastavil port na PC:
stty -F /dev/ttyS1 9600 cs8 clocal cread -cstopb parenb parodd
a napsal jsem: cat /dev/ttyS1 a čekal...a ono prd.
#include <avr/io.h>
void print (char *string){
while (*string) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR = *string;
string++;
}
return;
}
int main(void) {
/* UART init */
sbi(UCSRB, RXEN);
sbi(UCSRB, TXEN);
UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
UBRRH = 0x01; /*479 is baud rate 1200*/
UBRRL = 0xdf; /*479 is baud rate 1200*/
while (1) {
print ("Hello world.\n");
}
return 0;
}
A do toho svého kódu napiš raději
UDR = '5';Nedokážu říct přesně kde máš chybu, protože používáme příliš odlišné postupy. Sériový port nastavuju jiným způsobem (viz mé články o sériové komunikaci), na programování jednočipu používám
uisp a ani by mě nenapadlo si nadefinovávat makra cbi a sbi pro "zpětnou kompatibilitu"

UCSRB = (1 << RXEN) | (1 << TXEN);. Procesor beží na vnitřní oscilátor (8Mhz).(CKSEL = 4 ) Port jsem nastavil takto:
stty -F /dev/ttyS1 1200 -parenb -cstopb cs8Tedy: Baudrate 1200, bez parity, 8datových bitů a 2 stopbity.
? Pokud si posíláš třeba mezi dvěma počítači data po seriáku tak ti to funguje? Jseš si jistý, že ten procesor opravdu funguje a kmitá? I když pokud šel naprogramovat tak asi ani. Máš ho v prostředí, kde může fungovat nebo se tvůj program ani provádět nezačne, protože procesor visí někde v bootbloku? Zkus se podívat třeba logickým analyzátorem jestli z něj vůbec něco leze, zkus si také stáhnout někde třeba jednoduchý blikač, napálit a podívej se jestli ti bliká, případně zkus napalovat na jiném programátoru jiným softem nejlépe u někoho, komu to funguje. Abys vyloučil, kde můžeš mít problém.TEXT TEXT TEXT TEXTKmitá určitě. Zkoušel jsem tam nahrát program na blikání ledkama. (tím vylučuju problém se softem a programátorem).
loop_until_bit_is_set(ten bit, co se nastavi když jsou v UDR nepřečtený data);Ale ted je možný, že už to půjde dobře.
stty -F /dev/ttyS1 1200 clocal cread -crtscts cs8 -cstopb hup -parenb parodd -brkint -icrnl ignbrk -igncr ignpar imaxbel -inlcr inpck -istrip -iuclc -ixany ixoff -ixon bs0 cr0 ff0 nl0 -ocrnl -ofdel -ofill -olcuc -onlcr -onlret onocr -opost tab0 vt0 -crterase crtkill -ctlecho -echo -echok -echonl -echoprt -icanon -iexten -isig -noflsh -tostop -xcase time 5 min 1
cat vyhodi:
śĄ×Ö.6!B
td▒7Fk
Z.H.
stty -F /dev/ttyS1 -a speed 1200 baud; rows 0; columns 0; line = 0; ... -parenb parodd cs8 hupcl -cstopb cread clocal -crtscts ignbrk -brkint ignpar -parmrk inpck -istrip -inlcr -igncr -icrnl -ixon ixoff -iuclc -ixany imaxbel -opost -olcuc -ocrnl -onlcr onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl echoke
ľś@nşśşśnşľ@ş@şś@ş@şľ@nşľśşś@şľś@nľśşľ@nşľśşľ@núşľś@şľś^▒^sTo se normálně vypisuje za chodu. Pokud jednocip vypnu, tak to jeste hodi tak 7-8 znaku a prestane. Pokud ho zapnu, zase zacne. Kdyby to misto tech kravin psalo normalni text, byl by maximalne spokojen.
˛`N N ˛`N ˛N ˛N ˛`N N ˛ ˛N N ˛`NNastavovani poctu stop-bitu nema vliv na predchozi dva pripady. Pokud zapnu jeden stop-bit v pripade s vyplou paritou, vysledek je:
]YŽ:śĄĄ v&▒twtkd×Ale zase se to vypise az po vypnuti. Nevim, jak je to mozne. Vsadil bych se, ze mikrokontroler je nastavenej tak, ze tam neni parita, dva stop-bity, rychlost 1200.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.