Great Cow BASIC FastHWSPITransfer werkt niet

IK kan dit niet aan de gang krijgen,
toegevoegd id de file.
Wie weet wat er aan de hand is ?

Guus@Sint-Michielsgestel

Heb je een externe 4MHz clock aan pin2 gelegd?
De tekening in de sourcecode tekent geen kristal dus denk ik dat de 4Mhz van een andere clocksource komt.

pic basic code:

       
        12F1822                         +--v--+
;                                  VCC  [     ]  GND
;                  EXT cl IN        B5 >[     ]> Data   B0  TDA Data
;                  ??               B4 <[     ]> Clk    B1  TDA clock
;        Drukknop naar GND     Vpp  B3 <[     ]> B2     WS Line
;                                       +-----+
;
;
#chip 12F1822, 4.000
#config OSC = OSC_HS, MCLRE = OFF, PWRTE = OFF, CP = OFF, WDT = OFF, BOREN = OFF
#config 2 PLLEN = ON , LVP = OFF
LDmicro user.

Ja er zit een 4 MHz crystal aan, niet getekend, maar werkt wel.
Er zit een stukje code voor fasthwspi, als ik dat run dan komt er een 250 ns puls uit. Dat klopt dus wel. Als fasthwspi " onzichtbaar" zou runnen dan zou er op A2/B2 een puls uit moeten komen. Ook dat gebeurd niet. Dus fasthwspi stopt de boel.

Ik heb een schakeling met een PIC18F2550 in PICbasic wel kunnen draaien.
Aangezien ik geen "Free " version van de 12F1822 heb ben ik sinds kort naar GWBasic gegaan.

Guus@Sint-Michielsgestel

Ik heb een regel aangepast:

;#define SPI_HardwareSPI MASTERFAST 'comment this out to make into Software SPI but, you may have to change clock lines

naar

SPIMode MasterFast,0

Nu werkt het wel, maar ik doe over 4 SPI write instructies maar liefst 30 u-seconden.
Alleen het aanroepen van de "Macro" kost all 15 instructies.

Is er een snellere manier ?

Bij Proton basic en een 18F2550 is de totale tijd van 6 u-sec haalbaar voor 4 SPI write instructies

Guus@Sint-Michielsgestel
Arco

Special Member

Tja,

4MHz is op zich al traag (1uS per cycle)
Als je geen macro gebruikt maar inline code spaar je dat ook al uit.
Die 6uS is trouwens de max haalbare waarde voor 1 SPI write, niet voor 4...

(er is ook niet zoiets als een 'SPI write' instructie, da's een functie van de compiler bestaande uit minimaal 6 instructies)

[Bericht gewijzigd door Arco op donderdag 6 mei 2021 11:53:00 (25%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hoi Arco, Met de PIC18F2550 zend ik 256 bytes binnen 1 msec mbv SPI naar een DAC.( Ik genereer een sinus van 1 kHz ermee ) Hier zit ook al de overhead in.
Volgens ik me kan herinneren is dat met een 20Mhz clock / 4.
Als ik de 12F1822 clock verdubbel tot 32MHz / 4 dan zit het er misschien wel in.
Ik heb die verdubbeling nog niet werkend. Maar vermoed dat GCBasic minder efficient is dan ProtonBasic.
Hoe werkt zo'n SPI write dan ? Er moeten ook 8 clockcycles meegezonden worden

Guus@Sint-Michielsgestel
Arco

Special Member

Volgens ik me kan herinneren is dat met een 20Mhz clock / 4.

Da's al 5x zo snel als dat je eerder zei... ;) (cycleclock is dan 200nS)

De SPI communicatie regelt de SPI hardware zelf (clock en data uitklokken)
Je moet wel de registers laden en kijken of de bus vrij is. (da's minimaal 7 cycles en meestal meer)

Mikrobasic is tot 4k code ook 'free'...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
marcob

Golden Member

Op 4 mei 2021 16:52:29 schreef Waters:
...Aangezien ik geen "Free " version van de 12F1822 heb ben ik sinds kort naar GWBasic gegaan.

Off-topic: Je kunt nu de office versie kopen voor net geen €50,-
https://www.ebay.co.uk/itm/Full-Proton-and-Proton24-PIC-BASIC-Compiler…

je krijgt een persoonlijke download link. Deze versie werkt zonder USB dongle. En je krijgt gelijk toegang tot de nieuwe ontwikkelomgeving Positron Studio.
zie: https://sites.google.com/view/rosetta-tech/home

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Arco, ik heb de PLLEN aan staan, dus draai op 4 MHz clock, dit is 250 nsec.
Ik kan dus nog 2 x zo snel met een 8MHz crystal. Ik heb de interne osc nog niet draaiend, weet niet waarom. Heb OSCCON aanstaan.
Ik ben erg slecht in assembler, alleen Basic, kun je me helpen met dat stukje code ?
Ik was even vergeten dat het een hardware implementatie is van SPI.
Bij voorbaat dank

Guus@Sint-Michielsgestel

Misschien kun je hier wat mee.

Ik heb een triacregeling draaien op 32Mhz met een 12F1840 en dat is een identieke pic met meer geheugen dan een 12F1822

De instellingen zijn als volgt:

Configword1 staat op hex 0FA4
Configword2 staat op hex 3FFF
Osccon register op hex F0

Omzetten in basic settings zul je zelf moeten doen.

LDmicro user.

Bedankt MGP, ik had een verkeerde interpretatie van Internal oscillator block, ik begreep dat het het block aan zette. Na correctie OK. Je moet wel 32MHz opgeven , en dan mag PLLEN toch uitstaan !!
Arco, ik heb nu een 8 MHz SPI clock, maar met de overhead aan instructies kom ik tot 16 usec voor de 4 transfers, kan ik jouw "asm " code zo ertussen zetten.

Ik heb twee spi writes die niks doen ( bedoeld voor het rechterkanaal van de DAC ), kan ik met een paar simpele instructies de 8MHz SPI clock genereren ?
Er hoeft geen data verzonden te worden

Guus@Sint-Michielsgestel
Arco

Special Member

Het wordt zo wel een zoekplaatje... :)
De clock is normaal de frequentie waarop de processor draait (Fosc), de cycle clock is de instructie cycle clock (Tcy, die is Fosc/4)

Als je 32MHz wilt gebruiken moet de PLL *altijd* aan staan, kan niet zonder. (kristal of int.osc. moet dan 8MHz zijn)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Het kan een artefact van GCBasic zijn dat PLLEN het niet doet, maar OKE.
Als ik met software 16 clockpulsen genereer dan kost me dat 16X2 instructies en dat is dan 4 usec, dan hou ik voor 2SPI transfers nog steeds maar 4 uSec over, dus geen winst.
Dus een aanroep van de FastHWSPITransfer zonder data zou wel winst opleveren

Guus@Sint-Michielsgestel
Arco

Special Member

De hardware SPI is niet bedoeld om een clock zonder data op te wekken. (SPI is nu eenmaal SPI, geen clockgenerator)
Is die paar uS extra dan echt zo'n probleem?
Bitbangen op de uitgang van de HW SPI doe je sowieso nooit natuurlijk.

[Bericht gewijzigd door Arco op vrijdag 7 mei 2021 13:48:06 (18%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hoi Arco,
Door alles in asm te zetten kan ik nu 4 SPI transfers doen in minder dan 7 uSeconden.
Hierbij schrijf ik steeds nullen als data.
De volgende horde is het lezen van de eeprom sequentieel.
Dit kost ook weer veel instructies. kun je me nog een keer helpen met de asm ? Bij voorbaat dank

Alle noppen zitten erin omdat ik niet check met een loop of alle data is verzonden.

Hier een stukje van de EPREAD in asm

;epread IZ, Table
banksel IZ
movf IZ,W
banksel EEADDRESS
movwf EEADDRESS
clrf EEADDRESS_H
banksel STATUS
call SYSEPREAD
banksel EEDATAVALUE
movf EEDATAVALUE,W
banksel TABLE
movwf TABLE

Guus@Sint-Michielsgestel