Programmeren 16f1847 lukt niet

Alleen berichten met de trefwoorden “interrupt picbasic” worden getoond. Alle berichten tonen

Hallo allemaal,

Ben bezig met een projectje wat te groot wordt voor de 16f648A en heb bij voti de 16f1847 besteld. Hiervoor gekozen omdat ik hardwarematig vast zit aan een 18 pins Uc. (i.v.m. reeds gemaakte printjes)

Tot mijn grote schrik wil deze Uc niet geprogrammeerd worden door de door mij gebruikte programma's.

Ik gebruik:
Proton IDE ( die kent de Uc )
BumbleBee en de Wisp648 van Wouter van Ooien. (Voti.nl)
(bovenstaande zoals uitgelegd in de cursus van frits op picbasic.nl)
heb ook XwispW van voti geprobeerd maar ook daar lukt het mij niet mee.

Heb op internet al rond gekeken (ebay o.a.) en zie verschillende programmers maar bij de een staat dat de 16f1847 wel wordt ondersteund en bij de ander weer niet (bij hetzelfde apparaat). Voordat ik nu van alles bestel wat uiteindelijk weer niet werkt aan jullie de vraag:

Wat is voor mij de beste oplossing?

PS
Ben log-in codes kwijt, voorheen geregistreerd als Saunaganger

Schiet mij maar lek..

Gisteravond van alles geprobeerd maar krijg het ding niet aan de praat.
Uiteindelijk terug naar een 16f648A met een knipper led op poort A.1(pin 18)
(picbasic.nl cursus 1)

pic basic code:


DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
xtal = 10
Opnieuw:                      ;Label met zelf te verzinnen naam
TOGGLE PORTA.1                ;Aan moet uit, uit moet aan
DELAYMS 500                   ;500 milliseconden = 0,5 seconde
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma

Geschreven in Proton IDE en de hex file met PicKit3 Standalone geprogrammeerd. He, he er werkt weer eens iets.

Nieuwe hoop. De pic 16f1847 aangesloten op exact dezelfde manier. (Volgens mij lees ik geen verschil in aansluiten voor het programmeren als de 16F648A. En ja heb echt wel de device code veranderd.

Hetzelfde programma'tje geladen. Errormelding op het config commando MCLRE_OFF. Commando verwijdert.

Geen error melding maar verder... Niets dus.
Ik heb het vermoeden dat het zit in de config regel maar weet niet wat en waar.
Wie helpt me op weg om toch die #$%#@ 16F1847 aan de praat te krijgen.

@Arco. Het aansturen van een poort aan/uit is toch niet volledig anders als bij een 16f648A?

pic basic code:


DEVICE 16F1847                ;We gebruiken een 16F1847 type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

Opnieuw:                      ;Label met zelf te verzinnen naam
TOGGLE PORTA.1                ;Aan moet uit, uit moet aan
DELAYMS 500                   ;500 milliseconden = 0,5 seconde
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma
Arco

Special Member

In ieder geval is de config anders. Ik weet niet hoe dat gaat in picbasic, normaal heb je een CONFIG1 en een CONFIG2. Nu staat alles doorelkaar gehusseld op 1 regel...
(ook MCLRE moet op off)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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

@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: 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

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
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
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. 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
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