webForumDet fria alternativet

Programmering till arduinokontroll

6 svar · 1 096 visningar · startad av simon.morris

simon.morrisMedlem sedan apr. 20103 inlägg
#1

Hallå, jag skulle behöva lite hjälp.

Det jag och mina kompisar försöker göra är det här. Det är en färdregistrator, som finns i svarta lådor på t.ex. flygplan. Det går ut på att man hämtar information från Wiikontrollen, och via en arduinokontroll så skickas rätt info vidare ut till en LCD-skärm, där g-krafter visas. Vi har dock problem med att få programmet att funka som det ska. Enligt manualen så ska man använda det här programmet. Problemet är att vi har en annan LCD-skärm, så det fungerar helt enkelt inte. Vi har jämfört databladen och bytt ut hex-koderna i LCDSerial.cpp till de rätta, men programmet fryser ändå så fort den skrivit ut första raden "WiiCoasterUI".
Den fastnar på det här steget:

wiichuck_setpowerpins();
delay(100);
wiichuck_begin();

och wiichuck_setpowerpins() grejen ser ut så här:
#define pwrpin PC3
#define gndpin PC2
DDRC |= _BV(pwrpin) | _BV(gndpin);
PORTC &=~ _BV(gndpin);
PORTC |= *_BV(pwrpin);

Behöver verkligen hjälp, och helst snabbt. Här är databladen till LCD-skärmen som de använder och den som vi använder

Tack i förhand

nitro2k01Medlem sedan aug. 20037 630 inlägg
#2

Välkommen till webForum! Ett litet tips till nästa inlägg: Inneslut programkod i

-taggar

Jag tror problemet ligger på denna rad:
[kod]PORTC |= *_BV(pwrpin);

Att börja ett uttryck med * är en pekaroperation, vilket jag inte tror är vad du vill göra i detta fall.

Edit: För övrigt tror jag att du kommer få ganska dålig mätprecision från Nunchucken om du ska integrera värdena och mäta hur långt du har färdats, men det kanske du kan stå ut med. ;)

simon.morrisMedlem sedan apr. 20103 inlägg
#3

Okej, så jag ska bara ta bort "*"?

nitro2k01Medlem sedan aug. 20037 630 inlägg
#4

Kanske, det beror ju på vad _BV gör och hur den ska användas. Att förstå vad man håller på med är A och O. Troligtvis returnerar _BV bitmask för en viss pinne.
Låt oss t ex analysera:

PORTC &=~ _BV(gndpin);

Låt säga att _BV(gndpin) returnerar ett värde med en bit satt, t ex 8, eller skrivet i binär form 00001000. Vad koden ovan gör att sätta den valda biten till noll. Det går till så att värdet först inverteras (~_BV(gndpin)) och blir 11110111. Sedan utförs en bitvis och-operation med det existerande värdet i PORTC. Alla bitar som är 1 i masken lämnas orörda medan alla bitar som är 0 i masken blir 0 i resultatet.

Låt säg att det värdet är 11011001 i utgängsläget. I det fallet sätts den fjärde biten från höger till noll och resultatet blir 11010001.
Eller uttryckt på annat vis...

  0000[B]1[/B]000  <- _BV(gndpin)
  1111[B]0[/B]111  <- ~_BV(gndpin)

  1101[B]1[/B]001  <- PORTC innan
& [U]1111[B]0[/B]111[/U]  <- ~_BV(gndpin)
  1101[B]0[/B]001  <- PORTC efter
PORTC |= _BV(pwrpin);

...funcerar isåfall på ett liknande sätt, fast omvänt: Målet är att sätta en eller flera bitar till 1. Eftersom operationen som utförs är logisk "eller" så lämnas bitar som är 0 i masken orörda medan bitar som är 1 blir 1 i resultatet.
Exempel:

  000000[B]1[/B]0  <- _BV(pwrpin)

  110100[B]0[/B]1  <- PORTC innan
| [U]000000[B]1[/B]0[/U]  <- _BV(pwrpin)
  110100[B]1[/B]1  <- PORTC efter

Samma sak med...

DDRC |= _BV(pwrpin) | _BV(gndpin);

...med skillnaden att man här sätter två bitar till 1. I det här fallet för att använda två pinnar på mikrokontrollern som utgångar. Principen är samma som innan för den bitvisa eller-operatorn, de bitar som är 0 i masken lämnas orörda, de bitar som är 1 sätts till 1.

  000000[B]1[/B]0  <- _BV(pwrpin)
| [U]0000[B]1[/B]000[/U]  <- _BV(gndpin)
  0000[B]1[/B]0[B]1[/B]0  <- _BV(pwrpin) | _BV(gndpin)

  1010[B]0[/B]0[B]0[/B]1  <- DDRC innan
| [U]0000[B]1[/B]0[B]1[/B]0[/U]  <- _BV(pwrpin) | _BV(gndpin)
  1010[B]1[/B]0[B]1[/B]1  <- DDRC efter

Observera att alla värden är påhittade och bara finns där i exempelsyfte.

LaspMedlem sedan juli 200010 197 inlägg
#5

Databladen för display ser ju rätt lika ut. Har du rätt hastighet och paritet satt?
Kolla med en serieport direkt på enklaste sätt med datorn och ett terminalprogram.
Här finns det annars mycket godsaker http://www.electrokit.se/
Annars får du väl gå direkt till ett slikt fora http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl

Lycka till. Kul grejor att labba med säger Lasp

simon.morrisMedlem sedan apr. 20103 inlägg
#6

nitro2k01 skrev:

Massor av text

Tack för hjälpen, men vi får den fortfarande inte att fungera. Vi läste någonstans att man kunde använda ett annat skript istället för originalet, då den inte var gjord för en Duemilanove med ATMEGA 328. Så vi testade den delen istället, som heter nunchuck_funcs.h, och tog bort twi_funcs.h och wiichuck_funcs.h.

Det är fortfarande i den här delen som det slutar fungera.

static void nunchuck_setpowerpins()
{
#define pwrpin PORTC3
#define gndpin PORTC2
    DDRC |= _BV(pwrpin) | _BV(gndpin);
    PORTC &=~ _BV(gndpin);
    PORTC |=  _BV(pwrpin);
    delay(100);  
}

Av det vi förstått så måste man använda det här för att ens kunna börja använda wiikontrollen. Men det fungerar inte helt enkelt. Har testat att säga till LCD-skärmen att skriva ut ett ord direkt efteråt men det händer inget. Programmet fryser fast.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#7

Om du helt struntar i att koppla in Nunchucken och försöka använda den, funkar displayen? Kan det eventuellt vara så att Nunchucken drar för mycket ström från Atmegans IO-pinnar så att Atmegan helt sonika hänger sig? (Eller att ni har kopplat fel...)

Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb