IK kan dit niet aan de gang krijgen,
toegevoegd id de file.
Wie weet wat er aan de hand is ?
IK kan dit niet aan de gang krijgen,
toegevoegd id de file.
Wie weet wat er aan de hand is ?
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
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.
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
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%)
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
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'...
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
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
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.
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
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)
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
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%)
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