Tak jsem trochu pozměnil funkce na přijímání a odesílání:
int posli(){
int a;
char *text;
! *text=*gets(3);
! puts (*text);
! a = atoi(*text );
if(PINA & (1<<PA0))
{
PORTA &= ~(1<<PA0);
}
else
{
PORTA |= 1<<PA0;
};
return a;
}
void posli2(int a){
int a1;
char *text;
! *text = *itoa( a);
! puts (*text);
! *text=*gets(3);
! a1 = atoi(*text );
if (a == a1){
if(PINA & (1<<PA0))
{
PORTA &= ~(1<<PA0);
}
else
{
PORTA |= 1<<PA0;
};
}
}
Build started 7.2.2010 at 13:47:05
avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT auto.o -MF dep/auto.o.d -c …/auto.c
…/auto.c: In function ‘posli’:
…/auto.c:11: warning: passing argument 1 of ‘gets’ makes pointer from integer without a cast
…/auto.c:12: warning: passing argument 1 of ‘puts’ makes pointer from integer without a cast
…/auto.c:13: warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast
…/auto.c: In function ‘posli2’:
…/auto.c:28: error: too few arguments to function ‘itoa’
…/auto.c:29: warning: passing argument 1 of ‘puts’ makes pointer from integer without a cast
…/auto.c:30: warning: passing argument 1 of ‘gets’ makes pointer from integer without a cast
…/auto.c:31: warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast
make: *** [auto.o] Error 1
Build failed with 1 errors and 6 warnings…
Jestli mi pomůžete i s tímhle, přestanu otravovat.
Tak s tímhle ti asi nikdo nepomůže… To je na ctrl+a a jedno velké DELETE
Vykřičník (= logická negace) ne levé straně výrazu je absolutní nesmysl. Hrušky z pravé strany se ukládají do košíku na levé. Jak chceš znegovat košík?
Jednodušší bude, když napíšeš co to má dělat a použitý procesor. Vytvoříme kus kódu a můžem se pobavit co a jak to dělá.
Teď jdu na dříví, takže k dispozici budu nejdřív za hoďku
Každopádně doporučuji zapomenout na všelijaké putchar a podobné výmysly. Místo nich použít testování příznaků v registrech uartu pro řízení s přímým zápisem do a čtení z UDR. Využívat přerušení by asi zatím bylo nad tvoje možnosti.
ty vykřičníky jsou tam, kde jsem měl chyby, aby to bylo vidět…
potřebuju int předělat na string a string odeslat přez UART, za druhý potřebuju přijmout string přez UART a předělat na int.
Pokud posíláš z 32b systému proměnnou int, tak je to znaménkové 32b celé číslo. Co s tím číslem v mcu chceš dělat? Kdy a co se má posílat zpět? Jak se to číslo přenáší (LSB first nebo MSB first)? Má to číslo omezený rozsah (třeba od 0 do +65535)? Nejsme jasnovidci. Když chceš pomoc, potřebujem vědět s čím…
jo, ale já jsem začátečník, tak nevim, co mám vědět, má to rozsah do 225, jak se přenáší, to nevím, má nejdřív odeslat proměnou a pak do proměnné načíst to, co přišlo. S tím zbytkem už si poradím, jen to posílání mi nejde.
Celé je to špatně. itoa má rozhodně více parametrů než 1 a neumíš pracovat s pointery což není pro začátečníka úplně triviální nicméně na netu o nich určitě informace najdeš. Pokud tě zajímají čísla, nechápu, proč to převádíš na text. Možná ti to přijde jednodušší, ale opak je pravdou.
Pokud z a do PC posíláš int(32b) a využitý rozsah je 0-255, tak využíváš pouze 1 byte. Nejjednodušší bude si vytvořit 4B pole typu unsigned char a do něho data z uartu načíst. Správný byte s hodnotou zjistíš pokusem, buď to bude nultý nebo třetí.
[code]unsigned char posli(void)
{
unsigned char temp[4], i;
// načtení 4 bytů
for(i=0; i<4; i++)
{
while ( !( UCSRA & (1<<RXC)) ); // počkat až přijde byte
data* = UDR; // načíst do pole
}
// odeslání 4 bytů zpět
for(i=0; i<4; i++)
{
while ( !( UCSRA & (1<<UDRE)) ); // počkat až se vyprázdní vysílací buffer
UDR = data*; // zápis do bufferu a odeslání
}
return data[0]; // žádaná hodnota by měla být tady nebo v data[3]
}[/code]
Nicméně stejně si troufám tipnout, že tvůj program nemá moc velkou naději na úspěch. Nekontroloval jsem přesná nastavení, ale snažit se v 1 obsluze přerušení čítače (pokud se vyskytuje častěji než po 200ms) vyřídit přenos několika bytů (624) rychlostí 9600bd je najivní **
No to je právě můj problém, že nevím, co za parametry tam má být. O pointerech jsem se snažil něco najít, ale marně. A vůbec nechápu, jak se vlastně spouští to přerušení. A string tam je, protože jsem našel, že se to takhle posílá, navíc se to hodí dobudoucna. Teda, jestli to vůbec zkonstruuju
Přerušení vznikne v okamžik, kdy se vyskytne událost, která ho vyvolává a měla by jeho obsluha skončit dřív, než se vyvolá znova. U tvého programu jsem vůbec nepochopil, co má dělat. Tudíž do toho moc nevrtám, nicméně bych řekl, že to bude na hony vzdáleno tomu, co bys rád. Ovvšem když se s námi o své požadavky nepodělíš, těžko to můžem posoudit. Třeba bysme ti už v druhém příspěvku řekli, že takto konstruovaný program nemůže fungovat a celou tu doteď zbytečnou (aspoň podle mne) diskuzi jsme si mohli odpustit a věnovat se funkčnímu řešení. S trochou štestí jsem však vedle a máš přeci jen naději .
Pointery ti tu na pár řádcích těžko někdo vysvětlí tak abys to pochopil a dokázal používat. Jaké má funkce parametry si najdi v manuálu překladače (máš jiný než já - GCC).
Hele tak to popíšu celý.
Potřebuju, aby komunikoval s počítačem po rs232, má dvě pwm. Z údajů, které přijme vyvodí směr pro H můstky (l1,l2,p1,p2) a velikost PWM. byl bych rád, kdyby to příjímání bylo v přerušení. a při každém přijetí to pro kontrolu stejný údaj odešle zpátky.
Já mám taky GCC.
No vidíš, ani to nebolelo. Stalo se to, co jsem předpokládal a předchozí 2 stránky byly úplně o ničem. Jesli se nepletu, chceš aby ti jela pwm a když přijde z PC po uartu nový nastavení pwm, tak ho do ní zapsat. Přerušení je správný měr, ovšem jeho výběr už nikoli. Ty potřebuješ obsluhovat přerušení od uartu a nikoli od pwm Teprve až ti po uartu přijdou data, tak je zapíšeš do pwm. Začneme nejdřív s tím uartem.
Pro začátek vytvoříme loopback - co pošleš do procesoru, to procesor vrátí do PC. Předpokládám, že chtít alespoň primitivní komunikační protokol by asi bylo moc, tak to zatím nebudem řešit. Určitě by ale bylo časem vhodné, aby když posíláš procesoru data, tak mu taky říct, co s nima má dělat - jesli na 1. pwm nebo druhou…
Vytvoř si obsluhu přerušení od příjmu (RXComplete, máš jinej překladač, takže moje by ti asi nešla) a do ní následující kód:
unsigned char temp;
temp = UDR; // načíst přijatý byte
while ( !( UCSRA & (1<<UDRE)) ); // počkat až se vyprázdní vysílací buffer
UDR = temp; // zápis do bufferu a odeslání zpět do PC
Ten program v Javě je tvůj výtvor? jen jesli se v něm dají dělat úpravy v tom, co se posílá…
co je to ten program v jave, k cemu ho pouzivas? nehces zkusit pro zacatek jenom hyperterminal? zde je pekny tutorial a popis jak nastavit pripojeni. sparkfun.com/commerce/tutori … als_id=104
pokud používáš avrstudio a GCC, tak to ti napíšu, mmntik…
To nastavení procesoru ti vygeneroval nějakej program? jen jesli mám počítat, že je určitě dobře… Jakou máš frekvenci procesoru?
edit: jsem taky trubka… že jde o gcc je tam vidět z těch chybových hlášek a ještě jsi mi to psal výš. Já akorát koukal na kód (obsluhu přerušení), který se od v gcc běžně používané konstrukce lišil