Onderstaande Samengevat :
TRISC4 = 1; // is een geldige instructie op de PIC16F877A
TRISC4 = 1; // is een ongeldige instructie op de PIC16F57 ---
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tamelijk bekend is de Pic16F seriereeks waarvan veel voorbeelden met de mid-range 16F877A op het net te vinden zijn.
Datablad 877
https://ww1.microchip.com...nts/DataSheets/39582C.pdf
Daarnaast heb ik de kleinere baseline 16F57 omdat die op de Parallax Basic Stamp zit maar de losse chip heeft geen PBasic Interpreter voorgeprogrammeerd dus die flash ik met C-code vanuit MPLab met Pickit3.
Datablad 57
https://ww1.microchip.com/downloads/en/DeviceDoc/41213D.pdf
Met veel minder voorbeelden beschikbaar voor de laatste probeer ik 877 codes over te zetten naar de 57.
Wat ik al een tijd niet goed begrijp is dat er verschil in TRIS bewerkingen zijn tussen die twee, hieronder wat bewerkingen op de 57 met daarnaast aangegeven wat wel compileert en wat niet.
TRISC = 0b00000011; // -- WERKT
TRISC0 = 0; // -- WERKT NIET
TRISC1 = 1; // -- WERKT NIET
TRISC = (1<<0) | (1<<1) ; // -- WERKT
TRISC | = (1 << 6) ; // Set bit 6 -- WERKT NIET en geeft deze error
main.c:29:9: error: expected expression
TRISC = TRISC &~(1<<4); // -- WERKT NIET en geeft deze error
main.c:28:: error: (1466) registers unavailable for code generation of this expression
vanuit de browser
(1466) registers * unavailable for code generation of this expression (Code Generator)
The compiler has been unable to generate code for this statement. This is essentially a “can’t generate code” error message (message 712), but the reason for this inability to compile relates to there not being enough registers available. See message 712 for suggested workarounds.
>> (712) can’t generate code for this expression (Code Generator)
This error indicates that a C expression is too difficult for the code generator to actually compile. >>
https://onlinedocs.microc...69-B5FA-A6EB2911F483.html
Van deze twee
TRISC0 = 0; // -- WERKT NIET
TRISC1 = 1; // -- WERKT NIET
verschijnt dit
main.c:27:1: error: use of undeclared identifier 'TRISC0'; did you mean 'TRISC'?
en daarvan weet ik zeker dat die wel op de 877 draaien, de rest heb ik o.a. van de Atmega32 geprobeerd te 'vertalen.'
Zit dat verschil nu in de compiler of in de hardware?
Na een aantal projectjes heb ik dit nog niet achterhaald al is het niet super storend want bijvoorbeeld dit
https://circuitdigest.com...terfacing-with-pic16f877a
is goed uitvoerbaar gebleken. Overzetten van de code naar de 57 ging in dit geval niet maar had een andere oorzaak namelijk te weinig geheugen. Circuit Digest gebruikt Proteus als simulatie maar daar heb ik alleen de Arduino-versie van; de PIC-module is mij iets te prijzig.
Als tip voor de geinteresseerde, een even goed bruikbare simulator is de freeware Simulide, zie plaatje
https://simulide.com/p/
:strip_exif()/f/image/GdSNjtfO3Z2ZttX7KPIxdxEb.jpg?f=fotoalbum_large)
:strip_exif()/f/image/2DvuQHKWNrxs8d483OwAXS3e.jpg?f=fotoalbum_large)
Misschien dat dit er iets mee te maken heeft ? Vanuit de 16F57 datasheet link hierboven
6.8.1 BIDIRECTIONAL I/O PORTS
Some instructions operate internally as read followed by write operations. The BCF and BSF instructions, for example, read the entire port into the CPU, execute the bit operation and re-write the result.
Er staat echter geen reden bij en deze 'bit-operatie' compileert zoals gezegd wel
TRISC = (1<<0) | (1<<1) ;
TRISC4 = 1; // is een geldige instructie op de PIC16F877A
TRISC4 = 1; // is een ongeldige instructie op de PIC16F57 ---
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tamelijk bekend is de Pic16F seriereeks waarvan veel voorbeelden met de mid-range 16F877A op het net te vinden zijn.
Datablad 877
https://ww1.microchip.com...nts/DataSheets/39582C.pdf
Daarnaast heb ik de kleinere baseline 16F57 omdat die op de Parallax Basic Stamp zit maar de losse chip heeft geen PBasic Interpreter voorgeprogrammeerd dus die flash ik met C-code vanuit MPLab met Pickit3.
Datablad 57
https://ww1.microchip.com/downloads/en/DeviceDoc/41213D.pdf
Met veel minder voorbeelden beschikbaar voor de laatste probeer ik 877 codes over te zetten naar de 57.
Wat ik al een tijd niet goed begrijp is dat er verschil in TRIS bewerkingen zijn tussen die twee, hieronder wat bewerkingen op de 57 met daarnaast aangegeven wat wel compileert en wat niet.
TRISC = 0b00000011; // -- WERKT
TRISC0 = 0; // -- WERKT NIET
TRISC1 = 1; // -- WERKT NIET
TRISC = (1<<0) | (1<<1) ; // -- WERKT
TRISC | = (1 << 6) ; // Set bit 6 -- WERKT NIET en geeft deze error
main.c:29:9: error: expected expression
TRISC = TRISC &~(1<<4); // -- WERKT NIET en geeft deze error
main.c:28:: error: (1466) registers unavailable for code generation of this expression
vanuit de browser
(1466) registers * unavailable for code generation of this expression (Code Generator)
The compiler has been unable to generate code for this statement. This is essentially a “can’t generate code” error message (message 712), but the reason for this inability to compile relates to there not being enough registers available. See message 712 for suggested workarounds.
>> (712) can’t generate code for this expression (Code Generator)
This error indicates that a C expression is too difficult for the code generator to actually compile. >>
https://onlinedocs.microc...69-B5FA-A6EB2911F483.html
Van deze twee
TRISC0 = 0; // -- WERKT NIET
TRISC1 = 1; // -- WERKT NIET
verschijnt dit
main.c:27:1: error: use of undeclared identifier 'TRISC0'; did you mean 'TRISC'?
en daarvan weet ik zeker dat die wel op de 877 draaien, de rest heb ik o.a. van de Atmega32 geprobeerd te 'vertalen.'
Zit dat verschil nu in de compiler of in de hardware?
Na een aantal projectjes heb ik dit nog niet achterhaald al is het niet super storend want bijvoorbeeld dit
https://circuitdigest.com...terfacing-with-pic16f877a
is goed uitvoerbaar gebleken. Overzetten van de code naar de 57 ging in dit geval niet maar had een andere oorzaak namelijk te weinig geheugen. Circuit Digest gebruikt Proteus als simulatie maar daar heb ik alleen de Arduino-versie van; de PIC-module is mij iets te prijzig.
Als tip voor de geinteresseerde, een even goed bruikbare simulator is de freeware Simulide, zie plaatje
https://simulide.com/p/
:strip_exif()/f/image/GdSNjtfO3Z2ZttX7KPIxdxEb.jpg?f=fotoalbum_large)
:strip_exif()/f/image/2DvuQHKWNrxs8d483OwAXS3e.jpg?f=fotoalbum_large)
Misschien dat dit er iets mee te maken heeft ? Vanuit de 16F57 datasheet link hierboven
6.8.1 BIDIRECTIONAL I/O PORTS
Some instructions operate internally as read followed by write operations. The BCF and BSF instructions, for example, read the entire port into the CPU, execute the bit operation and re-write the result.
Er staat echter geen reden bij en deze 'bit-operatie' compileert zoals gezegd wel
TRISC = (1<<0) | (1<<1) ;
[ Voor 40% gewijzigd door kitao op 19-05-2025 10:26 . Reden: Error codes opgezocht ]