AT90USB162 EEPROM segítség

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

AT90USB162 EEPROM segítség

Hozzászólás Szerző: douggutaby »

Sziasztok!

Új vagyok itt is meg hardware programozásban is valamennyire.

Az alábbi kódrészletnek az lenne a lényege, hogy egy eszköz különböző gombnyomással indítva más funkciót lát el. Ez még működik is. Csakhogy az előző állapotot is megakarom őrizni, így gombnyomás nélkül indítva is működjön. Erre kellene az EEPROM.

A probléma az, hogy nem azt olvassa ki az eeprom-ból, amit kellene. Sokszor olyan mintha 4-es lenne a memóriában, mert joystick-ként jön be ha nem nyomok gombot.

Tudna valaki ebben segíteni?

Köszi

Ja és a lényeg:

Kód: Egész kijelölése

int main(void)
{
	Buttons_Init();
	uint8_t ButtonStatus_LCL = Buttons_GetStatus();

	if (ButtonStatus_LCL & BUTTONS_BUTTON2)
	{
		if(eeprom_read_byte((uint8_t*)1) != 2)
		{
			MODE = 2;
			eeprom_write_byte((uint8_t*)1, MODE);
		}
	}
	if (ButtonStatus_LCL & BUTTONS_BUTTON3)
	{
		if(eeprom_read_byte((uint8_t*)1) != 3)
		{
			MODE = 3;
			eeprom_write_byte((uint8_t*)1, MODE);
		}
	}
	if (ButtonStatus_LCL & BUTTONS_BUTTON4)
	{
		if(eeprom_read_byte((uint8_t*)1) != 4)	
		{
			MODE = 4;
			eeprom_write_byte((uint8_t*)1, MODE);
		}
	}
		

	switch(eeprom_read_byte((uint8_t*)1))
	{
		case 2: SetupHardware_Key();
				main_keyboard();
				break;
		case 3: SetupHardware_Mouse();
				main_mouse();
				break;
		case 4: SetupHardware_Joy();
				main_joystick();
				break;
	}
	return 0;
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Milyen alappanelt használsz? Mitől joystick?


Ahogy nézem, a != miatt jön ez be. Azaz a nemegyenlőt használod...
Emiatt fut a 4-re....
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

Hozzászólás Szerző: douggutaby »

Kibeleztem egy meglévőt, csináltam hozzá új panel, összekötögettem a megfelelően at90usb162-vel (ebben volt segítségem), és kész.

Annyi a lényeg, hogy HID eszközként működik. Megcsináltam külön billentyűzetnek, egérnek, és joysticknak is (igazából gamepad, de ez nem lényeges). Mind tökéeletesen működnek.

Aztán megcsináltam a fent említett mindent egybe dolgot is. Ez is működik, a váltás is, csak az eeprom része nem.

A

Kód: Egész kijelölése

if(eeprom_read_byte((uint8_t*)1) != 4)
sorra gondoltál?
Az korábban nem is volt ott, csak ma raktam bele, hogy ne írja feleslegesen a memóriát. Meg ha nem nyomok gombot, akkor van gond, olyankor abba nem is fut bele.

Egyébként ez miért probléma?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Igen, arra...


bascom alatt a következő lenne:

Kód: Egész kijelölése

if gomb1=0 then writeeeprom 1,1'eeprom beírás
if gomb2=0 then writeeeprom 2,1'eeprom beírás
if gomb3=0 then writeeeprom 4,1'eeprom beírás

Readeeprom a, 1 'első cím beolvasása

select case a
    case 1: 'HID
    case 2: 'mouse
    case 4: 'joy
    case else : 'HID
end select
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

Hozzászólás Szerző: douggutaby »

bascom-hoz nem értek, de ahogy látom át is került a téma másik témakörbe, amit köszönök.

Szerintem én is ugyanezt csináltam C-ben, amit te leírtál.
Olvastam olyan dolgokról, hogy EEMEM (ami ahhoz kellene, hogy fix címre írjak), vagy hogy néha régi adatot olvas be az eeprom-ból, de nem sikerült megoldanom ezekkel sem.

Igazából ezt a hol jó hol nem dolgot nem értem. Pl van, hogy csak a 3. reset után lesz rossz a működés.

Lehet esetleg az a gond, hogy még a resetnek nincs gombja, csak a vezetéket érintem a földhöz, és így mit tudom én sokszor hozzáér, és gondot okoz?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Elvileg ami benne lehet, hogy az EEPROM írás a 0. címre TILOS, mert hibás lehet!
Az eepromíró pointert illik átállítani a nem használt címre írás után... Ha kiolvasod a EEPROM tartalmat (programozóval) akkor hibás? Vagy csak a program rontja el?
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

Hozzászólás Szerző: douggutaby »

Meg tudom valahogy nézni az eeprom tartalmat?
Jelenleg annyit csinálok, hogy a build után kapott hex-et flip programmal rátölötm és kész.
Igazából debug-olni sem tudok, ez a legnagyobb bajom.
AVR studio-ban nem tudok rácsatlakozni.

Egyébként próbáltam olyat, hogy a 4-es gomb megnyomásakor történő írást kikommenteltem. Így a 3-asra ugrott át néha mikor a 2-es volt elvileg mentve. De ebben már nem vagyok biztos, annyi féleképpen kipróbáltam már, hogy nem is emlékszem mindre.
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

Hozzászólás Szerző: douggutaby »

Másik fórumon ajánlották, hogy minden eeprom művelet előtt hívjam meg az eeprom_busy_wait() függvényt. Úgy néz ki ez lesz a megoldás. Most is hibázik ritkán, de sokkal megbízhatóbb lett. Valószínű a switchet kellene esetleg szét bontanom if-ekre, és mindegyik előtt meghívni az eeprom_busy_wait()-t.

Köszi a segítséget
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az eeprom olvasás során is kell wait? (Bascom ezt lekezeli...)

A FLIPpel olvasni is tudod a chip tartalmat, nem csak írni:) Így az EEPROM tartalmat is! Csak fileba kell menteni... de mintha tudna olyat, hogy a buffert meg lehet online nézni....
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

Hozzászólás Szerző: douggutaby »

Úgy látszik tévedtem. Mégsem lett jobb. Csak most nem a joystick, hanem a bill ragad bent és resetre az jön be.

Flip-pel ha nem csatlakozok rá, akkor ugye nem látom az eeprom tartalmat. Ha pedig igen akkor bootloader módban vagyok, akkor pedig device protected ha read buffert szeretnék. Mit csinálok rosszul?

Egyébként kicsit változtattam rajta, most így néz ki:

Kód: Egész kijelölése



#include "complete.h"

int main(void)
{
	Buttons_Init();
	uint8_t ButtonStatus_LCL = Buttons_GetStatus();
	
	eeprom_busy_wait();
	MODE = eeprom_read_byte((uint8_t*)1);
	if (ButtonStatus_LCL & BUTTONS_BUTTON2)
	{
		if(MODE != 2)
		{
			MODE = 2;
			eeprom_busy_wait();
			eeprom_update_byte((uint8_t*)1, MODE);
		}
	}
	else
	{
		if (ButtonStatus_LCL & BUTTONS_BUTTON3)
		{
			if(MODE != 3)
			{
				MODE = 3;
				eeprom_busy_wait();
				eeprom_update_byte((uint8_t*)1, MODE);
			}
		}
		else
		{
			if (ButtonStatus_LCL & BUTTONS_BUTTON4)
			{
				if(MODE != 4)	
				{
					MODE = 4;
					eeprom_busy_wait();
					eeprom_update_byte((uint8_t*)1, MODE);
				}
			}
		}
	}

	eeprom_busy_wait();
	MODE = eeprom_read_byte((uint8_t*)1);
	switch(MODE)
	{
		case 2: SetupHardware_Key();
				main_keyboard();
				break;
		case 3: SetupHardware_Mouse();
				main_mouse();
				break;
		case 4: SetupHardware_Joy();
				main_joystick();
				break;
	}

	return 0;

}
Avatar
douggutaby
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. október 25. hétfő, 6:00

Hozzászólás Szerző: douggutaby »

Megszületett a megoldás. A uint8_t ButtonStatus_LCL = Buttons_GetStatus(); sor elé beraktam egy késleltetést. Úgy néz ki ott volt a probléma, nem is az eeprom.
De ez sem saját kútfőből, segítettek :)

Köszi mindent
Válasz küldése