/***************************************************************************
* HITECH C for PIC Program A_02- 08/11/2010 *
* Processor: PIC16F887 *
* Compiler: HI-TECH C PRO v9.65PL1 Lite *
• Discription: led aan poort C *
• PIN Assignments: led aan C *
**************************************************************************/
#include <16f887.h>
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled;
__CONFIG(HS & WDTDIS & LVPDIS)
#IRCF=0X07.
void main()
{
for (;
{TRISC=0x00;
PORTC=0x37;
}}
Kan iemand verklaren waarom dit simpele programma om mijn programmer en demobordje te testen problemen geeft in de compiler?
Build E:\Users\Eigenaar\Desktop\mplab testen\knipperlicht for device 16F887
Using driver C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe
Make: The target "E:\Users\Eigenaar\Desktop\mplab testen\pag_1_17.p1" is up to date.
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" -oknipperlicht.cof -mknipperlicht.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 pag_1_17.p1 --chip=16F887 -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.83
Copyright (C) 2011 Microchip Technology Inc.
Licensed for evaluation purposes only.
This licence will expire on Mon, 22 Jul 2013.
Error [800] C:\Users\....\pag_1_17.c; 13. undefined symbol "LVPDIS"
Error [800] C:\Users\.....\pag_1_17.c; 13. undefined symbol "WDTDIS"
Error [800] C:\Users\......\pag_1_17.c; 13. undefined symbol "HS"
********** Build failed! **********
Er mankeert een haakje ) zo ver ik kan zien...
Erik
Geen expert en zeker niet in hitec en microcontrollers.
Alles wat begint met /* en loopt tot */ is commentaar. Dus de hele eerste blok is niks voor de compiler.
Dan is er #include <16f887.h> Dat wil zeggen steek de file 16f887.h volledig in deze file en op deze plaats. Omdat je <> gebruikt hebt gaat de compiler die file zoeken in je path dat je opgegeven hebt met de /I compiler optie. Als die er niet is wat je voor je OS als INCLUDE path hebt opgegeven. Bekijk die file eens
Een .h file is een header file en bevat normaal gezien enkel variabele definities (welk type is het) en functie prototypes (welke argumenten neemt een functie en welk type geeft ze terug). Soms met wat commentaar erbij.
De lijn met // wil zeggen dat het commentaar is tot het einde van de lijn.
Komen we aan __CONFIG(HS & WDTDIS & LVPDIS) Dit is geen C, maar een instructie voor de PIC assembler. Hoe je dat moet gebruiken daar heeft Microchip wel documenten over. http://www.google.com/url?sa=t&rct=j&q=__CONFIG&source=web&cd=2&ved=0CDIQFjAB&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2FPIC%2520Config%2520bit%2520Format_Syntax_AndDefinitions.pdf&ei=axe2UbW0LO-Z0QXin4CQBg&usg=AFQjCNGDWK-bpE7450aw3oiTWP-kOT7bpw (http://www.google.com/url?sa=t&rct=j&q=__CONFIG&source=web&cd=2&ved=0CDIQFjAB&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2FPIC%2520Config%2520bit%2520Format_Syntax_AndDefinitions.pdf&ei=axe2UbW0LO-Z0QXin4CQBg&usg=AFQjCNGDWK-bpE7450aw3oiTWP-kOT7bpw)
Dan komen we aan je "void main()". Dat is het entrypunt van je programma.
Dan heb je iets dat niet klopt: for(;{TRISC=0x00;PORTC=0x37;} (de laaste } is het einde van je "main" functie) Een for statement is van de vorm
for(startvoorwaarde;doe bij iedere iteratie;eindvoorwaarde)
En dat heb je niet! Je hebt geen beginvoorwaarde, dat is geen probleem. Dan doe je {TRISC=0x00;PORTC=0x37;} Op zich ook geen probleem. Maar er is geen eindvoorwaarde. Die moet er niet zijn (je hebt dan een oneindige lus) maar dan moet je een "lege" instructie hebben en je for statement moet afsluiten met ")". En daarna moet een ; komen.
De error die de compiler geeft is gewoon dat hij symbolen tegenkomt die nog niet gedefinieert zijn. Je moet eerst de compiler uitleggen wat voor type LVPDIS, WDTDIS en HS zijn en welke waarde ze hebben.
Je gaat dan bvb zoiets moeten doen:
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_Xt_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
Gepikt op http://www.sq-1.com/config.html (http://www.sq-1.com/config.html) Maar dan aangepast aan jouw controller uiteraard. Vandaar ook de '&' operator. Je beschrijft welke bits voor elke functie welke waarde moeten krijgen en dan stel je de eindwaarde samen door een logische and. Lees die link eens, daar staat ook dat je een "list" directive moet hebben en welke file je moet includen omdat jouw compiler er iets van zou snappen.
Even op mijn PC gekeken en wat blijkt: bij de installatie van MPLab IDE heb ik de volledige installatie uitgevoerd en HI-TECH C staat er ook op!
Een vlugge blik:
#include <16f887.h> moet #include <pic16f877.h> worden (zie: "C:\Program Files\HI-TECH Software\PICC\9.83\include\"
void main(void)
{
}
is je hoofdprogramma. Voer je initialisaties uit voor je forever loop en schrijf je accolades mooi onder elkaar:
void main(void)
{
TRISC=0x00;
PORTC=0x37;
for (;;)
{
}
}
Je lus doet niets en dus je programma ook niet. Probeer dit al door de compiler te krijgen voor je verder gaat.
Heb je in MPLAB de juiste PIC ingesteld?
als je dat gedaan hebt, dan kan je #include <16F887.h> vervangen door #include <htc.h>
zet ook eens een puntcomma achter de __CONFIG lijn
de rest is al aangehaald door andere posters...
Geert
/**************************************************************************
* HITECH C for PIC Program A_02- 08/11/2010 *
* Processor: PIC16F887 *
* Compiler: HI-TECH C PRO v9.65PL1 Lite *
* Discription: led aan poort C *
* PIN Assignments: led aan C *
***************************************************************************/
#include <htc.h>
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled;
__CONFIG(HS & WDTDIS & LVPDIS);
void main()
{
for (;
{TRISC=0x00;
PORTC=0x37;
}
}
Dit geeft nog altijd problemen in de config code lijn... Ik begrijp niet dat zoiets kinderlijk eenvoudig verkeerd kan lopen?
Juiste PIC is ingesteld in MPlab? 16f887?
Voor de tweede keer :
The syntax for a for loop is
for ( variable initialization; condition; variable update ) {
Code to execute while the condition is true
}
Die 5 € transportkosten voor een komplete doos C-boeken-materiaal die ik u voorstelde, waren precies toch geen slecht voorstel...
Erik
/* **************************************************************************
* HITECH C for PIC program A_01- 08/11/2010 *
• Author: Vermeulen D *
****************************************************************************
* Processor: PIC16F877(A) *
* Compiler: HI-TECH C PRO v9.65PL1 Lite *
• Files required: none *
• Discription: light up led0 of port C *
• PIN Assignments: led at C0 *
************************************************************************* */
#include <htc.h>
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled
__CONFIG(HS & WDTDIS & LVPDIS);
void main()
{
TRISC = 0x00; // configure POORT C als output
PORTC = 0b00000001; // Pin C0 hoog
for (; { // loop forever
}
}
Dit komt uit de cursus elektronica en is het allereerste voorbeeldprogramma dat we gezien hebben. Op school hebben we dat getest en daar heeft dat gewerkt zonder problemen. Hier heb ik me op gebaseerd voor mijn programmertest.
(over welke boeken heb je het? Mail me!)
void main()
{
TRISC = 0b00000000;
PORTC = 0b00000001;
for ( ; ; ) {
;
}
}
het bovenstaande zal zo moeten werken, hoe dat zit met die CONFIG ERROR 800 zie ik niet direct ?
Deze omschrijving staat er in de HI-TECH C manual:
800) undefined symbol "*" The named symbol is not defined in this module, and has not been specified GLOBAL.
Mogelijk kan de compiler 16f887.h of htc.h niet vinden?
Mogelijk moet de juiste map geselecteerd worden waar deze staan?
EDIT: net gezien dat Peter(C) het main program ook al had voorgesteld 8)
Geert
zolang deze lijn in de code staat krijg ik hem niet door de compiler, compiler herinstalleren?
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled;
__CONFIG(HS & WDTDIS & LVPDIS);
her installeren zal ik niet doen, gewoon verder zoeken, het zal wel iets stom zijn zoals gewoonlijk ;)
Geert
Dat is net het vreemde,
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled;__CONFIG(HS & WDTDIS & LVPDIS);
heb ik uit de voorbeeldprogramma's van de cursus gekopieerd, waarvan ik weet dat ze hebben gewerkt op school. Koppige microcontrollers/programmeertaal. :(
In vele voorbeeldprogramma's zitten fouten, bewust of onbewust, zelfs drukfouten buiten de wil van de auteur om.
Een for-opdracht is for ( ; ; )
Het laatste ) -haakje zie ik niet staan in uw voorbeeld.
Erik
Boeken : zoek ik terug op.
puntkomma haakje vormt ;) en die smiley wordt in code niet weergegeven. Daarom mankeert ie hier op het forum, maar in de code staat het juist. En ik denk niet dat dat het probleem is, daarvoor krijg ik geen errors of warnings.
De voorbeeldprogramma's komen uit de cursus elektronica van op school en hebben we effectief getest en daar zaten geen fouten in.
OK
Erik
Citaat van: conducteur op 11 juni 2013, 15:21:55 PM
De voorbeeldprogramma's komen uit de cursus elektronica van op school en hebben we effectief getest en daar zaten geen fouten in.
Daarom denk ik dat het iets is met de instellingen van MPLAB?
Je topic naam is bewust goed gekozen... Je hebt echt een expert nodig, en dat ben ik niet :(
Geert
experten genoeg bij elkaar, dus door hen is mijn probleem nu min of meer opgelost.
http://www.circuitsonline.net/forum/view/message/1516583#1516583 (http://www.circuitsonline.net/forum/view/message/1516583#1516583)
Das wel straf dat de C-compiler na drie jaar belangrijke afkortingen wijzigt. Dus mijn oude code kan ik niet meer compileren op de nieuwste versie van MPLAB, goe dat ik dat weet ... Of kan de versie ergens ingesteld worden ?
Geert
Kan zijn dat je compiler de include files niet vindt. Vervang eens <pic16F877.h> door het volledige pad waar die file staat dus <c:\etcetc\pic16f887.h> Het kan zijn dat je paths niet goed ingesteld staan.
Bij windows moet je naar "my computer" gaan, rechts klikken, "properties", dan "advanced..." en dan "environment variables". Vergelijk eens wat je op school hebt met wat jij hebt. volgens mij ga je daar iets verschillend vinden.
Waar staat bij jou trouwens die pic16f887.h file? Kan je ook de inhoud van je make file eens posten?
Je CONFIG directieven voor de 16F877 zijn verkeerd. Voor de 16F877 moet het zijn:
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
Da's het rotte aan de PICs, er zitten veel verschillen op de defines per type µC, maar ik heb er een truucje voor. Ga op zoek waar je de HI-TECH compiler hebt geïnstalleerd en ga een eens kijken in de include directory (op mijn PC: D:\Program Files (x86)\HI-TECH Software\PICC\9.83\include). Je zal daar een pak .h bestanden terugvinden waaronder eentje pic16f877.h, deze bevat alle info die je nodig hebt...
Haha missie al voor 80% geslaagd, de bedoeling van dit eenvoudige programma was om m'n pickit2 eens te testen door wat met de ledjes te spelen die op het bijgeleverde demobordje zitten.
-->na het programmeren gaan de ledjes heel even aan, maar zoeken waarom ze niet aanblijven zal voor morgen zijn.
Prachtig, Rian !
De eerste horde is gezet.
De rest is gewoon programmeerwerk, met wat logisch nadenken.
De hardware onder controle krijgen is soms een harde knobbel, maar zover ben je al ! Tof.
Citaat van: conducteur op 11 juni 2013, 23:07:49 PM
-->na het programmeren gaan de ledjes heel even aan, maar zoeken waarom ze niet aanblijven zal voor morgen zijn.
Zorg dat je de watchdog disabled in het config register.
Beste,
Je probleem is misschien al opgelost, maar ik zag je vraag nu maar pas.
Probeer eens het volgende:
#include <16f887.h>
// Config: HS ext Xtal- Watchdogtimer disabled - LVP Disabled;
__CONFIG(HS & WDTDIS & LVPDIS)
#IRCF=0X07.
void main()
{
for (;TRISC=0x00;PORTC=0x37);
}
Ik heb de lus "gerepareerd", de lus bestaat uit 3 delen die van elkaar gescheiden zijn met een komma-punt. Het eerste deel is de initialisatie deze code wordt één maal uitgevoerd bij de start van de lus, maar die heb je niet dus komt na het open rond haakje een komma-punt. Het tweede deel is de test waarin bepaald wordt of de lus nog een keer moet worden uitgevoerd, dit is hier TRISC=0x00. Het derde deel wordt telkens op het einde van de lus uitgevoerd en dat is hier het bevel PORTC=0x37. Doordat de volledige lus opgenomen is in het for statement moet dit worden afgesloten met een komma-punt.
mvg,
Frank