simon.morrisMedlem sedan apr. 20103 inlägg
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
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
Okej, så jag ska bara ta bort "*"?
nitro2k01Medlem sedan aug. 20037 630 inlägg
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
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
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
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...)