Sida 1 av 2
C och olika dataformat?
Postat: 24 oktober 2005, 21:05:09
av jack
Eller nåt sånt.. Jag försöker allafall skicka lite data via en MAX203:a och en PIC18F452:a till COM-porten på datorn. Hårdvaran fungerar och jag kan skicka enstaka bokstäver eller "hex-koder". Jag använder kompilatorn MikroC. Problemet är att jag är kass på C och inte riktigt förstår hur jag kan skicka textsträngar eller vanliga integers. Finns det något enkelt sätt?
Detta fungerar tex:
Kod: Markera allt
void main() {
Usart_Init(2400);
do {
USART_Write('J');
USART_Write(0x31);
} while(1);
}
Tacksam för svar.
//jack
Postat: 24 oktober 2005, 21:15:57
av cyr
Strängar i C är arrays av bytes, med en nolla sist.
Kan skickas såhär:
Kod: Markera allt
void USART_Write_str(char *str)
{
while(*str) USART_Write(*(str++));
}
void main(void)
{
USART_Write_str("Hello World");
}
Integers och annat får du också skicka en byte åt gången, på en PIC tror jag en integer är 2 byte stor (oftast är det annars 4 byte).
Kräver kanske lite casting och annat som ser väldigt krångligt ut om man inte kan C
Kod: Markera allt
void USART_Write_anything(char *data, int n)
{
while(n--) USART_Write(*(data++));
}
void main(void)
{
int i = 42;
USART_Write_anything((char*)&i,sizeof(i));
}
Postat: 24 oktober 2005, 21:19:26
av jack
cyr skrev:
...som ser väldigt krångligt ut om man inte kan C
Got that right!
Men tack för ditt utförliga svar. Ska kolla och se om jag lyckas.
Postat: 24 oktober 2005, 21:28:40
av jack
Testade nu. String-funktionen fungerade alldeles utmärkt! Tack. Dock får jag bara ASCII-motsvarigheten när jag använder den andra för att skicka integers.
Postat: 24 oktober 2005, 21:36:21
av cyr
Ah, när du säger "skicka integer" så ville du ha ut text "12345" typ eller?
Det finns troligen redan färdiga funktioner för att skriva ut tal i olika format till din kompilator. Någon variant av printf eller liknande...
Postat: 24 oktober 2005, 21:49:21
av jack
cyr skrev:...ha ut text "12345" typ eller?
Exakt. Verkar inte finnas några färdiga funktioner vad jag kan se...
Var tog Sodjans inlägg vägen?
Postat: 24 oktober 2005, 21:57:16
av $tiff
I GCC hittar man i specifikationerna:
Kod: Markera allt
Non-standard(i.e. non-ISO C)functions.
(...)
char*itoa(int __val, char*__s, int __radix)
(...)
Funktionen "itoa" gör alltså om integers till strängar. Finns motsvarigheter för char, long, etc.
Det borde finnas motsvarande i ditt bibliotek.
Postat: 24 oktober 2005, 22:11:34
av sodjan
> Var tog Sodjans inlägg vägen?
Ähum, det plockades bort eftersom han upptäckte att det sannolikt var felaktigt p.g.a ett missförstånd från densamme...

Postat: 24 oktober 2005, 23:08:36
av jack
$tiff skrev:
Det borde finnas motsvarande i ditt bibliotek.
Mycket riktigt. Nämligen följande: void IntToStr(int number, char *output);
Tack alla för mycket bra svar.
Postat: 25 oktober 2005, 00:50:15
av jack
En till C-fråga: Hur kan jag "assigna" olika pinnar i en array? Så att tex PORTB.1 = kalle[1] och PORTB.2 = kalle[2].
Postat: 25 oktober 2005, 07:40:55
av Icecap
Den är en aning knepigare då du därmed måste instruera compilern om att just den byte (som man utgår ifrån) ligger på ett visst ställe i minnet.
Själva uppdelningen borde fungera såhär:
unsigned char Bits[8] : 1;
men jag vet inte om compilern tillåter det.
Sen förstår jag inte fördelen vid det, det går att göra mycket enklare och snabbare att komma åt de enstaka pinnar på en port.
Postat: 25 oktober 2005, 08:46:53
av speakman
Förklara gärna vad du tänkt göra istället (med arrayen t.ex.), så får du säkert en massa kreativa förslag.
Mvh
speakman
Postat: 25 oktober 2005, 09:37:39
av jack
Det jag vill göra är att loopa igenom PORTB.0-3 och PORTB.4-6 för att scanna av en vanlig 4x3-keypad. Tänkte mig nåt med en for-sats osv osv..
Postat: 25 oktober 2005, 10:18:45
av sodjan
Det skulle vara svårt för kompilatorn att fixa (och ineffektivt) eftersom pin-numret (0-7) är hårdkodat i själva maskin instruktionen. Kompilatorn skulle alltså behöva generera "rak" kod med en liten kodsnutt för varje pinne.
D.v.s att loop-variablen i FOR loopen inte kan användas som "index" till ett kommando som läser porten (i alla fall inte utan att kompilatorn skapar en massa kod) Enklast är nog att läsa PORTx till en variabel och sedan "do what you have to do" med variablen istället.
Scanning av en keypad kan ju även skrivas som en liten inline-asm snutt för att få full kontroll (och fart) på det. Kanske inte lika stor fördel i C som i t.ex Basic, men ändå...
Postat: 25 oktober 2005, 10:47:47
av speakman
Kanske inte lika stor fördel i C som i t.ex Basic, men ändå... - Nä såna enkla saker brukar optimeras ganska bra i C, om man själv optimerar C-koden vill säga.

En enkel rutin för att utföra det hela skulle kunna vara:
Kod: Markera allt
unsigned char x,y;
for(y = 0; y < 3; y++) {
PORTB = 1 << (y + 4);
for(x = 0; x < 4; x++) {
if(PORTB & (1 << x)) {
/* Knapp (x,y) är nedtryckt */
}
}
}
Förmodligen måste TRIS sättas osv, men jag är för dålig på PIC för å veta exakt, så det måste du ordna själv.