Programmeren 16f1847 lukt niet

download de fuseconfigurator van JohnGB. Ben je van al het gezeik over fuses af.

Check je poort en de bijbehorende TRIS register. Kijk ook of er nog andere registers betrokken zijn bij de poort die je wilt gebruiken.
Je denkt misschien dat het hetzelfde is, maar de modernere uC's gebruiken vaak meerdere SFR's voor de I/O poorten, bv ANSELA.
En je zult in ieder geval TRISA moeten instellen op output, want PORTA is default input. Hoofdstuk 12 van de datasheet.
All_digital heeft alleen betrekking op inputs.

Overigens is de implementatie van TOGGLE fout. Normaal zorgt de compiler dat TRISx wordt ingesteld op 0 bij typische output operaties, maar het moment waarop dat gebeurt is te laat (pas na de MOVLW 2, XORWF PORTA, F)

@Arco: op zich mag het op 1 regel. Je hebt gelijk dat MCLRE op OFF moet staan.

[Bericht gewijzigd door hadv op donderdag 2 juni 2016 23:22:03 (14%)

Just find out what you like and let it kill you
Arco

Special Member

Gebruikt picbasic ook automatisch LATx i.p.v. PORTx op enhanced pics voor bit/toggle output?

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

Hm, voor dit device niet.
En voor een 18F ook niet.
Strange.

Was me echter nooit opgevallen, als er LATx bestaat gebruik ik die in de code.

Aan de andere kant: ik vind dat de programmeur zelf ook wel een beetje mag nadenken...

Just find out what you like and let it kill you

@hadv Je schat me nu iets te hoog in. Ben beginnend. Heb de cursus van picbasic.nl gedaan en probeer er wat van te maken.
Heb het commando LATx nog niet eerder gezien.

(Ik kan autorijden maar een raket besturen gaat een stapje verder)

Het TRIS register wordt wel uitgelegd en daar zal ik mee aan de slag gaan.
Heb ook de fuseconfigurator geinstalleerd maar moet nu dus uit gaan zoeken wat wat is en hoe ze moeten staan.

Tenslotte, ben beginnend met Uc's bezig. Alles werkt prima in een 16f648A maar mijn programma wordt te groot. Zie start tekst van eerste vraag.
Mijn programma is niet meer dan frits zijn ontwerp van een afstandsbediening (Universele RC5/RC6 transceiver) met daarom heen programmaregels voor het bijhouden van scores, leven, patronen, speltijd en team indelingen.

Kijk ik dus op internet naar een Uc met groter geheugen en het vervolg is bekend. Moet nog veel leren.

Dus ook hier nog eens de vraag: wie weet een goed boek (liefst in het nederlands) over Uc's en picbasic.

Arco

Special Member

Heb het commando LATx nog niet eerder gezien.

Daarom is het ook verplichte kost om de datasheet te lezen, liefst voor het programmeren... ;)
Dat de picbasic cursus niet over LATx rept is niet bijzonder; dat gaat over de 16F628A en die had nog geen LATx registers...

De enhanced 16F1x en hoger:

Als er al iets te vinden is zal dat wel in het Engels zijn (zonder Engels kom je niet ver in de Elektronica, bijna alle datasheets zijn in Engels)

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

FEEST FEEST er gebeurt iets.
Met volgende code krijg ik een knipper led

pic basic code:


;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

DEVICE = 16F1847

CONFIG1 FOSC_INTOSC, WDTE_ON, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_ON, CLKOUTEN_OFF, IESO_ON, FCMEN_OFF
CONFIG2 WRT_OFF, PLLEN_ON, STVREN_ON, BORV_LO, LVP_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

;        76543210           <<<Een hulpregeltje
TRISA = %00000000             ;PORTA zijn nu uitgangen
ALL_DIGITAL TRUE              ;ALL_DIGITAL TRUE zet de Analoog naar Digitaal Converters (ADC) en comparators op non-actief (= disabled).
CLEAR
Opnieuw:                      ;Label met zelf te verzinnen naam
HIGH PORTA.1                  ;Poort A.1 (pin 18) AAN
DELAYMS 1000                 ;1000 milliseconden = 1 seconde
LOW PORTA.1                   ;Poort A.1 (pin 18) UIT
DELAYMS 1000    
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma

Alleen knippert hij te snel. Hij doet ongeveer 1 sec over aan EN uit.
Heb al gekeken in de datasheet over de clock instellingen maar kom er niet uit.
picbasic cursus praat over: SET_OSCCAL maar die kan niet met deze Uc

Waar moet ik zoeken?

Arco

Special Member

De XTAL = xxMHz setting ontbreekt. De compiler heeft nu geen idee hoe snel de boel loopt...
Waar je voor output PORTA.x gebruikt moet dus LATA.x zijn...

[Bericht gewijzigd door Arco op vrijdag 3 juni 2016 12:07:42 (25%)

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

@Arco: Die had ik ook al geprobeerd. Met verschillende getallen.

pic basic code:

;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

DEVICE = 16F1847

CONFIG1 FOSC_INTOSC, WDTE_ON, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_ON, CLKOUTEN_OFF, IESO_ON, FCMEN_OFF
CONFIG2 WRT_OFF, PLLEN_ON, STVREN_ON, BORV_LO, LVP_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
;        76543210           <<<Een hulpregeltje
XTAL=32
TRISA = %00000000             ;PORTA zijn nu uitgangen
ALL_DIGITAL TRUE              ;ALL_DIGITAL TRUE zet de Analoog naar Digitaal Converters (ADC) en comparators op non-actief (= disabled).
CLEAR
Opnieuw:                      ;Label met zelf te verzinnen naam
HIGH LATA.1                  ;Poort A.1 (pin 18) AAN
DELAYMS 1000                 ;1000 milliseconden = 1 seconde
LOW LATA.1                   ;Poort A.1 (pin 18) UIT
DELAYMS 1000    
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma

maar dan knippert er niets

Arco

Special Member

Default is 500kHz (zie datasheet ;) ), dus daar moet XTAL ook op staan.
Met OSCCON kun je de clockspeed wijzigen, maar die moet dan wel met XTAL overeenkomen. Instelbare waardes:

Je hebt ook WDTE op ON staan, dat gaat ook niet werken zo, moet op OFF

[Bericht gewijzigd door Arco op vrijdag 3 juni 2016 12:20:37 (16%)

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

En hoe stel ik dat in?

Krijg een error dat this device niet draait op 500 MHz
0,5 en 0.5 geeft ook een error bij compileren.

Arco

Special Member

Ik weet ook niet of Picbasic frequenties aan kan < 1MHz...
OSCCON instellen gaat gewoon met OSCCON = xxxx (xxxx de waarde die je wilt; voor 8MHz dus %01110000)

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

Welke waarden er mogen worden gebruikt staat in het manual, zoek in de inhoudsopgave naar 'Declare' en dan 'Oscillator'.
Het is dus aan te raden om eerst te kijken welke waarde voor dit device worden ondersteund:
"12-bit core device XTAL values:
Declare Xtal 4, 8, 10, 12, 16, or 20.
Standard 14-bit core device XTAL values:
Declare Xtal 3, 4, 7, 8, 10, 12, 14, 16, 19, 20, 22, or 24.
Enhanced 14-bit core device XTAL values:
Declare Xtal 3, 4, 7, 8, 10, 12, 14, 16, 19, 20, 22, 24, 32 or 48.
18F device XTAL values:
Declare Xtal 3, 4, 7, 8, 10, 12, 14, 16, 19, 20, 22, 24, 25, 29, 32, 33, 40, 48, or 64.
".
Daar kies je er een van die ook voorkomt in de lijst van OSCCON.
Vervolgens geef je OSCCON de juiste waarde en vul je Declare XTAL in.

Let op met PLLEN: je hebt deze op ON staan, dit betekent dat de PLL wordt gebruikt. Het effect daarvan is dat de snelheid 4x zo hoog is. (datasheet 5.2.1.4). Dus als je OSCCON zo instelt dat je bv 4 MHz (bits 6-3 1101) krijgt zal de interne clock effectief op 16 MHz draaien, dan moet je Declare XTAL = 16 schrijven.

Just find out what you like and let it kill you
Arco

Special Member

Vreemd dat de default waarde van 500kHz bij de Enhanced 14 bit (16F1x) niet eens gebruikt kan worden... :)
Ik gebruik ook vaak pics op 32768Hz (uit stroombesparings oogpunt), dat kan dus ook niet met picbasic.
Bij Mikrobasic kun je iedere willekeurige waarde ingeven. Lijkt me ook logisch; het berekenen is tenslotte een simpel klusje voor de compiler...

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

@hadv Dank voor je uitleg.
Kan het hier niet proberen, dat wordt morgen moet werken tot 22:30 uur. Maar ik kan je verhaal geloof ik wel volgen. Was al wel aan het testen geweest met OSCCON instellingen (via pickit3 scherm) maar geloof dat als ik het xtal commando gebruikte de led helemaal niets meer deed. Wordt vervolgd.

En dat van de PLLEN snap ik ook. Had ook al eens geprobeerd met de andere stand. In deze code stond hij weer anders dus. Moment op name. Gelukkig kun je een Uc vaak programmeren. :-)

@arco: het kan wel, maar dan zullen alle tijdsgerelateerde functie's het moeilijk krijgen. Delays kun je nog wel omrekenen maar I2C, UART en SPI zullen vrijwel zeker falen.
Dat het een gebrek is ben ik helemaal met je eens: zo moeilijk is het niet.

Just find out what you like and let it kill you
Arco

Special Member

Vroeger werden 3.58, 4.19, en 11.059MHz bijvoorbeeld veel gebruikt omdat ze goedkoop en overal leverbaar waren als resonator of kristal. Dat gaat met picbasic dus niet zo simpel...
Dat de peripherals niet meer goed werken op lage frequenties is niet zo erg. Meestal wordt met 32kHz toch iets van een rtcc gemaakt.

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

@Arco en hadv.
Dank voor jullie hulp. Heb het aan de praat met de volgende code.

pic basic code:


;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

DEVICE = 16F1847

CONFIG1 FOSC_INTOSC, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_ON, CLKOUTEN_OFF, IESO_ON, FCMEN_OFF
CONFIG2 WRT_OFF, PLLEN_OFF, STVREN_ON, BORV_LO, LVP_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

OSCCON = 0b01111000      'Set oscillator to internal, 8 MHz, LFINTOSC Stable
DECLARE XTAL = 16  
ALL_DIGITAL TRUE

ON_HARDWARE_INTERRUPT GOTO ISR_Tick

Nu laat ik in de subroutine ISR_Tick een klokje lopen. Daar tel ik het aantal keren dat het aangeroepen wordt.

pic basic code:


' Interrupt routine to handle each timer tick
'
ISR_Tick:

    CONTEXT SAVE
    IF INTCONbits_T0IF = 1 THEN             ' Is it a Timer0 interrupt?
    IF SpelGestart=0 THEN GOTO NoTimeChange            ;spel is nog niet gestart dus tijd terug zetten
        Ticks = Ticks + 1                   ' Yes. So count the pieces of seconds
        IF Ticks >= 222 THEN                 ;Moet 222 = ongeveer 1 seconde
            Ticks = 0
            Seconden = Seconden - 1
            IF BarelTemp > 3 THEN BarelTemp = BarelTemp - 3
            IF BarelTemp <= 3 THEN BarelTemp = 0
            IF Seconden < 1 THEN
                Seconden = 60
                Minuten = Minuten - 1
                IF Minuten <= 0 THEN
                    GOTO GameOver
                ENDIF            
            ENDIF
            PRINT AT 2,1,DEC2 Minuten,":",DEC2 Seconden                      ' Update LCD
        ENDIF
    NoTimeChange:

        INTCONbits_T0IF = 0                  ' Reset the timer flag
    ENDIF

   CONTEXT RESTORE    
'---------------------------------------------------------------------------------------------

Nu heb ik het aantal ticks gemeten met een stopwatch en kom ik op 222 en dan klopt het redelijk. Maar dat moet ik toch ook kunnen uitrekenen.
Wie wijst me de weg?

Arco

Special Member

Maar dat moet ik toch ook kunnen uitrekenen.

Wat bedoel je daar precies mee?
Je kunt met een rekenmachientje natuurlijk uitrekenen hoeveel timerticks er in een bepaalde periode zouden moeten zitten en met je stopwatch controleren of dat klopt.
Je hebt voor zo'n controle altijd een externe referentiebron nodig om te kunnen testen; de pic kan dat niet zelf...

Of 222 klopt is zo niet te zeggen; de timerinstellingen ontbreken in je code...

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

@Arco. Ik dacht begrepen te hebben dat de Uc een bepaalt aantal cycli doorloopt. Iets met een tellertje dat tot 255 telt en dan een interrupt genereert. (Mijn basis uitleg van een engelse tekst)
Als je nu weet hoeveel cycli per seconde worden gemaakt dan kun je toch de verlopen seconden uit rekenen?

mijn instellingen voor de interrupt:

pic basic code:


SYMBOL GIE  = INTCON.7 		   ;global interrupt enable
SYMBOL T0IE = INTCON.5 	     ;TMR0 overflow interrupt enable 
SYMBOL T0IF = INTCON.2 	     ;TMR0 overflow interrupt flag bit
SYMBOL PS0  = OPTION_REG.0   ;Prescaler ratio bit-0 
SYMBOL PS1  = OPTION_REG.1   ;Prescaler ratio bit-1 
SYMBOL PS2  = OPTION_REG.2   ;Prescaler ratio bit-2  
SYMBOL PSA  = OPTION_REG.3   ;Prescaler Assignment  
SYMBOL T0CS = OPTION_REG.5   ;Timer0 Clock Source Select

GIE = 0				               ;disable all global interrupts
PSA = 0                      ;Assign the prescaler to oscillator 
PS0 = 0                      ;Set the prescaler 
PS1 = 0                      ;to increment TMR0 
PS2 = 0                      ;every 2nd instruction cycle 
T0CS = 0                     ;Assign TMR0 clock to internal source
T0IE = 1			               ;TMR0 overflow interrupt enable
T0IF = 1			               ;TMR0 overflow interrupt flag bit
GIE = 1				               ;enable all global interrupts
TMR0 = 0                     ;zet tmr0 op 0
'----------------------------------------------------
    OPTION_REG = $55         ' Set TMR0 configuration
    INTCON = $A0             ' Enable TMR0 interrupts

maar dat heb ik ergens weg gecopieerd. Snap zelf niet helemaal wat je hier allemaal instelt. Onder het moto van: beter goed gejat dan slecht bedacht.

Arco

Special Member

Ik gebruik Timer0 nooit, omdat Timer 2/4/6 veel makkelijker werken (dat zijn auto-reload timers)
Maar volgens mij zou het: Ticks = 1/ ((1/FCy) * (Prescaler * (TMR0+1))) moeten zijn. (FCy = FOsc / 4)

Dat wordt dan:
1/ ((1/4000000) * (2 * 256)) = 7812.5 interrupts per seconde...

Met de default interne oscillator van 500kHz klopt 't beter:
1/ ((1/125000) * (2 * 256)) = 244.24 interrupts per seconde.

Ook het commentaar klopt van geen meter, in dat geval beter weglaten...
Ook de settings zijn vreemd. Eerst set/reset je los alle bits van option_reg/intcon, om vervolgens option_reg/intcon als geheel te benaderen.
(en dus alle voorheen ge(re)sette bits weer teniet te doen)

[Bericht gewijzigd door Arco op zondag 5 juni 2016 15:46:33 (17%)

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

Op 5 juni 2016 13:48:25 schreef Arco:Ook het commentaar klopt van geen meter, in dat geval beter weglaten...

Welk commentaar is niet goed dan, ik kan er zo gauw geen fout in vinden. Waarschijnlijk heeft TS het braaf overgetypt.

Just find out what you like and let it kill you
Arco

Special Member

Om er een te noemen: (ik was misschien iets te negatief...)

pic basic code:

OSCCON = 0b01111000      'Set oscillator to internal, 8 MHz, LFINTOSC Stable

1111 = 16MHz, en HFINTOSC... ;)

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

@Arco Zoals ik al schreef, soms weet ik zelf niet wat er allemaal staat. Ik wilde een klokje met de speltijd en dan ga je zoeken op "clock in basic".
Dan vindt je verschillende site's en daar pluk ik dan uit wat ik nodig heb. Of het allemaal zo netjes geprogrammeerd is weet ik niet (waarschijnlijk niet :-p) Maar het werkt wel.

Maar jij zegt dus dat alles van GIE=0 t/m TMR0=0 weg kan omdat het met de code

pic basic code:


OPTION_REG = $55         ' Set TMR0 configuration
    INTCON = $A0             ' Enable TMR0 interrupts

al wordt ingesteld?

En wat betreft het commentaar er achter. Ja wel gewoon mee gekopieerd van die site. Met het idee het later misschien te kunnen volgen. En je pakt dus precies de regel die ik zelf niet had veranderd maar na 300.000 x te hebben geprobeerd vergeet je wel eens ergens tekst aan te passen. Je bent allang blij dat het werkt.

Arco

Special Member

Ik zou het liever andersom doen (de bits bewaren en INTCON/OPTION_REG eruit halen. Losse bitnamen zijn wat duidelijker)
Of je moet de demo versie van Picbasic hebben, dan is het zoals jij zegt natuurlijk korter... ;)

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