Fórum témák
» Több friss téma |
A wachdog timer törlése, de az csak akkor kell be van kapcsolva.
Megpróbáltam SPI eepromot kezelni, nem sok sikerrel. Biztos nem sikerült megértenem a hardver működését. Az eeprom adatlapja szerint kell kapjon először egy 8 bites parancsot ami olvasás esetén b'00000011' ezután egy 16 bites címet és erre válaszul adja a tárolt értéket. Próba képpen pickittel feltöltöttem az első pár címet különböző értékekkel. Szkóppal vizsgálva úgy tűnik, hogy csak a parancs megy ki, tehát az első bájt, a többi nem.
Valaki el tudná magyarázni a metodikáját?
25LC640:
Kell egy külön vonal, ami az EEProm CS jelét vezérli. 0. Felprogramozni az MSSI modult SPI master módra. Beleértem az órajel beállítását és az esetleges megszakítás beállítását is. 1. CS alacsony szintre kapcsolni. 2. SSPBUF kiolvasása (még akkor is, ha az adat nem fontos), SSPIF törlése 3. SSPBUF feltöltése az adattal. Ebben az esetben a kiolvasási parancs kódját kell beírni. 4. Várni, amíg kiküldi: while (SSPIF == 1) vagy a megszakítás megérkezik. 5. SSPBUF kiolvasása (még akkor is, ha az adat nem fontos), SSPIF törlése 6. SSPBUF feltöltése az adattal. Ebben az esetben a kiolvasandó adat címének felső byte-ját kell beírni. 7. Várni, amíg kiküldi: while (SSPIF == 1) vagy a megszakítás megérkezik. 8. SSPBUF kiolvasása (még akkor is, ha az adat nem fontos), SSPIF törlése 9. SSPBUF feltöltése az adattal. Ebben az esetben a kiolvasandó adat címének alsó byte-ját kell beírni. 10. Várni, amíg kiküldi: while (SSPIF == 1) vagy a megszakítás megérkezik. 11. SSPBUF kiolvasása (még akkor is, ha az adat nem fontos), SSPIF törlése 12. SSPBUF feltöltése a tetszőleges adattal. 13. Várni, amíg kiküldi: while (SSPIF == 1) vagy a megszakítás megérkezik. 14. SSPBUF kiolvasása. Végre az első értékes adat a memóriából kiolvasva, SSPIF törlése Ha kell még több, a 12..14 ismételhető. 15. CS magasra megy.
Üdv!
Mi a típusa az EEPROM-nak? Mert, ha 93C sorozat valamelyike, akkor az MicroWire. Majdnem SPI, de mégsem és kicsit trükkös. Én most SPI Flash-el és MicroWire-el bíbelődök. Flash-nél a következő a folyamat olvasásnál: CS alacsonra, Olvasás parancs kiküldés, Cím kiküldés, egy üres "Dummy" byte kiküldés. Ez az üres byte fogja beléptetni a az SSPxBUF-ba a vett adatot. CS magasra.
Ez igazán kimerítő válasz, köszönöm. A CS vonalat muszáj vezérelni? Ha csak egy ilyen eeprom van az áramkörben, nem elégséges ha gndre van kötve?
Hp41C pont eltalálta a típust. SPI az biztos. A CS vonal és/vagy a buffer kiolvasásának hiánya lesz a gond. Este kiderül. Köszönöm a segítséget neked is!
Idézet: Igen, szinte minden SPI képes eszköznél ez egy trigger is, enélkül általában nem végzi a dolgát/nem lehet szóra bírni. „A CS vonalat muszáj vezérelni?”
Azt hittem megértettem, de valami mégsem stimmel. A mellékelt képen látszik, hogy pickit2-vel visszaolvastam az eeprom tartalmát és a 0. valamint a 2. címen van adat. Az alábbi kódot próbáltam:
A CS vonalat a program elején állítom magasra. A végén a CS vonal magasra állítását követően az SPI_RX-ben lévő adatot küldöm LCD-re, de folyton nullákat kapok csak. A hozzászólás módosítva: Ápr 14, 2019
Sziasztok közben még én a tegnapi témámmal kapcsolatban mindig segítséget kérnék mert nem oldódott meg. A problémám tehát az, hogy mikroC ben megirom ezt a programot
Trisc=0; Portc=1; Feltoltom a k150es programozommal PIC16f676-os chippemre és semmit nem csinál(ledeket szeretnék megvilágítani vele) A válaszokat előre is köszönöm
Két utasítás az nem program! Hol a többi része? Ennyi infóval egymillió oka lehet, hogy nem működik.
Az kimaradt, hogy az SSP modul beállítására csak ennyit csináltam:
Nem teljesen világos, hogy az SSPSTAT,CKE és az SSPCON1,CKP biteket mi alapján kell beállítani. Az adatlapban vannak ábrák, táblázatok, hogy milyen hatással vannak ezek a működésre, csak azt nem tudom, hogy melyik beállítás kell nekem.
Az EEPROM adatlapjában leírtak alapján. Ha szerencséd van akkor konkrétan leírják az SPI módot is. Bővebben: Link
De szerintem ez kell neked, ha jól látom így kora reggel. SMP = 0; //Input data sampled at middle of data output time CKE = 1; //Transmit occurs on transition from active to Idle clock state CKP = 0; //Idle state for clock is a low level
Én az adatlapon nem láttam ilyet, pont ez a gondom. Ezek az értékek honnan vannak?
MSSI modul SSPSTAT regiszterében.
Pl. PIC18F2550 adatlapjában a 19.3.5 fejezet.
Ezt láttam, meg a táblázatot is, hogy 4 módot lehet beállítani, de azt honnan tudom, hogy az eepromnak melyik kell?
25LC640 adatlap Figure 3-1
Azt hiszem kezdem kapisgálni. Az már világos, hogy az órajel alacsony szintről indul. Ha jól látom az első bit érkezésének meg kell előznie az órajel első felfutását, tehát SPI BUS MODE 0,0-t kell beállítani, ahogy eSDi is írta.
Hát csak nem akarja az igazságot. Ezen adatlap FIGURE 1-2 szerint Mode 1,1 vagy Mode 0,0 kell neki. Kipróbáltam mindkét beállítással, de a helyzet változatlan.
Sikerült! A kiolvasás már megy! Az ANSELH törlése maradt el. Köszönöm a segítséget.
Gratulálok!
Nagy tanulság: TRIS bit 0, ANSEL bit 1 (analóg módban a láb): a kimeneten a legutoljára beírt adat szerinti szint mérhető, sőt az A/D is a magas vagy alacsony szint feszültségét méri. Azonban visszaolvasni nem lehet a szintet, mindig 0 -t kapunk. bsf, bcf, művelet a PORTA regiszterben képződő eredménnyel (xorwf PORTA,f) hibás adatot írhat vissza. Két kivétel van: clrf és a movwf. Sajnos a LAT bit sem olvasható vissza. (Csak néhány típuson vizsgáltam.) TRIS bit 1, ANSEL bit 1: Analóg mód, portról beolvasva 0 -t ad.
Elnézést kínálok, de ő 1,0 vagy 0,1-et írt, nem tudom a CKP, vagy a CKE van-e elöl. Viszont valóban 0,0 vagy 1,1 kell az adatlap szerint.
De látom már megolddott, gratula ![]() A hozzászólás módosítva: Ápr 15, 2019
Úgy tudom, hogy a Microchipnél a CKE fordítva értendő, tehát a CKP=0, CKE=1 valójában a 0,0 SPI módot jelenti.
A jelen esetben használt PIC18F14K22 esetén az adatlap szerint:
A hozzászólás módosítva: Ápr 16, 2019
Valóban, egyszer már belefutottam az MC különcködésébe.
Igen, a logikával ellentétben a mód "neve" nem tükrözi a CKP, CKE bitek állapotát.
Most, hogy működik az SPI kommunikáció szeretnék RFM12 modulokat használni. Találtam egy példa programot PIC16F886-ra írva. A fura az, hogy van benne egy változó ami a szimulátor szerint 16 bites. Nem tudom mennyire fontos, de gondolom azért van mert ebben a modulban a vezérlő utasítások 16 bitesek. Két kérdés:
1. Hogyan lehet ezt megoldani? 2. Kell ezzel feltétlenül foglalkozni? Hardveres SPI-vel egymás után elküldve a két bájtot is működhet?
Csatold a kódot, anélkül nehezen értelmezhető a kérdés.
Csatolva. Azóta rájöttem, hogy az MPlab-ban van mókolva valami amitől a watch ablakban 16 bitesnek mutatja. Ha újonnan létrehozom a projektet már csak 8 bitesként mutatja. Szóval az első kérdés már csak érdekesség szinten, a 2. kérdés második fele az igazán érdekes.
A hozzászólás módosítva: Ápr 17, 2019
|
Bejelentkezés
Hirdetés |