PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 24 oktober 2005, 21:05:09
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
cyr
Inlägg: 2712 Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:
Inlägg
av cyr » 24 oktober 2005, 21:15:57
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));
}
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 24 oktober 2005, 21:19:26
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.
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 24 oktober 2005, 21:28:40
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.
cyr
Inlägg: 2712 Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:
Inlägg
av cyr » 24 oktober 2005, 21:36:21
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...
Senast redigerad av
cyr 24 oktober 2005, 21:37:09, redigerad totalt 1 gång.
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 24 oktober 2005, 21:49:21
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?
$tiff
Inlägg: 4941 Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:
Inlägg
av $tiff » 24 oktober 2005, 21:57:16
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.
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 24 oktober 2005, 22:11:34
> 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...
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 24 oktober 2005, 23:08:36
$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.
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 25 oktober 2005, 00:50:15
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].
Icecap
Inlägg: 26647 Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark
Inlägg
av Icecap » 25 oktober 2005, 07:40:55
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.
speakman
Inlägg: 4838 Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge
Inlägg
av speakman » 25 oktober 2005, 08:46:53
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
jack
EF Sponsor
Inlägg: 2059 Blev medlem: 5 oktober 2004, 17:32:27
Inlägg
av jack » 25 oktober 2005, 09:37:39
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..
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 25 oktober 2005, 10:18:45
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å...
speakman
Inlägg: 4838 Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge
Inlägg
av speakman » 25 oktober 2005, 10:47:47
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.