Val av microprocessor, RGB LED styrning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

och det kostar säkert en massa kod...

i min bok "Vägen till C" av U Bilting & J Skansholm står det på sidan 81:

sizeof-operatorn:
Man kan utnyttja sizeof-operatorn på fält. om rad är ett teckenfält ger t.ex. uttrycket sizeof rad antalet bytes, dvs antalet tecken i rad.

annars kan man ju göra som jag gjorde i min funktion: loopa igenom och stoppa vid nollan.
Virror
Inlägg: 1025
Blev medlem: 28 april 2004, 11:03:14
Ort: Göteborg
Kontakt:

Re: Val av microprocessor, RGB LED styrning

Inlägg av Virror »

Hmm, ok, det hade jag missat helt.
Håller dock med om att din metod nog är snabbast.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

det kanske har med prioritetsordningen på operatorerna (fast det tror jag inte är orsaken egentligen)...
man kan ju testa detta:

Kod: Markera allt

 for (char i=0; i<(sizeof ord); i++) {
fast det kan ju ha att göra med att fältet skickas som argument i funktionsanropet. Vad som egentligen skickas är ju bara en pekare till första elementet i fältet - ett integer på 2 bytes.Så det är väl längden av pekaren som avläses av sizeof, inte strängen den pekar på. hur skulle man kunna få den att fatta att det är strängen man vill ha storleken på?
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Testade med:

Kod: Markera allt

for (uint8_t i = 0; i < (sizeof(ord)); i++) {
Och fick samma resultat..
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Val av microprocessor, RGB LED styrning

Inlägg av snigelen »

Ja, eftersom sizeof(ord) är två, eftersom det är en en pekare (en adress) som är två bytes på avr.

T.ex ger följande på 32 bit Ubuntu (med 4 bytes pekare):

Kod: Markera allt

#include <stdio.h>

void print_size(char word[]) {
	printf("Word is %d bytes\n", sizeof(word));
}

int main(void)
{
	char test[] = "Test";  // Fyra tecken + avslutande \0 ger 5 totalt

	printf("test is %d bytes\n", sizeof(test));
	print_size(test);
}
utskriften

Kod: Markera allt

test is 5 bytes
Word is 4 bytes
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

japp. Du får helt enkelt köra med pekare... som i mitt exempel print() ovan.
eller, det behöver du ju inte heller om du inte vill , men byt if-satsen mot while(1) istället och ha en if-sats längre ner som kollar om tecknet är en nolla. (alla strängar slutar på "nolla" = ascii-kod noll)
Virror
Inlägg: 1025
Blev medlem: 28 april 2004, 11:03:14
Ort: Göteborg
Kontakt:

Re: Val av microprocessor, RGB LED styrning

Inlägg av Virror »

jesse, det var det jag menade när jag skrev min post.

dragon: testa jesses metod att loopa tills tecken = 0 eller att köra strlen(ord) istället för sizeof(ord)
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Denna?:
Kod:
void print(const uint8_t * string) {
uint8_t tecken;
while(1) {
tecken = pgm_read_byte(string++);
if (tecken == 0) break;
putChar(tecken);
}
}
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Räcker det med att byta sizeof mot strlen?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

jag tror strlen inte funkar i ditt fall.

jag antar väl att strlen(ord) är en funktion i C som letar efter nollan? I så fall blir det både dubbel kod och dubbelt jobb för processorn att använda den... förresten kommer den inte att funka ändå, eftersom strängen inte ligger i RAM utan i flashminnet - så den kommer att leta på fel ställe och det blir tokfel :D
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Val av microprocessor, RGB LED styrning

Inlägg av snigelen »

Det finns en strlen_P() för strängar i FLASH, http://www.nongnu.org/avr-libc/user-manual/index.html. Men i det här fallet är det väl bättre att leta efter nollan själv.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Jag försöker använda Jesses kod, och placera den först i slideLine så att längden kan ges direkt till for-satsen.
Men jag förstår mig inte riktigt på hur den fungerar och vad de olika variablerna är till för..
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

Kod: Markera allt

void print(const uint8_t * string) {
// argumentet är en sträng i flash t.ex print(HelloWorld);
// *string är en pekare som pekar på första tecknet i fältet.
	uint8_t tecken; // en variabel som kan lagra ett tecken tillfälligt
	while(1) { // en loop
		tecken = pgm_read_byte(string++); // du läser ett tecken från flash-minnet och pekaren string pekar på nästa tecken med ++ operatorn.
		if (tecken == 0) break; // om tecknet är nolla ska loopen avslutas = slut på texten
		putChar(tecken); // annars skrivs tecknet ut med funktionen putChar()
	}
}
Jag har gjort en egen funktion som heter putChar(); och som kan skriva ut ett tecken till t.ex. en display eller till en PC. I ditt fall får du väl byta ut putChar(tecken); mot aslide(tecken);
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Jag kom fram till att din kod borde vara mer komplicerad än vad som krävs.
Borde inte detta fungera:

Kod: Markera allt

	uint8_t antaltecken = 0;	

	while(1) {  	
			if(ord[antaltecken] == 0) break; 
			antaltecken++;
	}
Dock så fungerar det inte...
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Yay!
Jag löste det.

Kod: Markera allt

uint8_t antaltecken = 0;	

	while(1) {  	
			if(pgm_read_byte(&ord[antaltecken]) == 0) {break;} 
			antaltecken++;
	}
Det måste vara för att arrayen ord[] som skickas bara är en pekare, och inte arrayen. Vilket gör att man inte kan läsa som vanligt utan måste läsa den från programminnet.
Skriv svar