PIC16F688 Intern oscillator. Och: Hur löser man problem?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av sodjan »

Det blir lite O.T här, men kan inte låta bli... :-)

> ...och att ha versionshantering...

Det är ju lite synd att det inte finns fler OS som har versionshantering "by default".
Själv är jag van/bortskämd med det sedan många år :

Kod: Markera allt

$ dir DKA200:[DANK.ARK.HV05]DAP020.OPT

Directory DKA200:[DANK.ARK.HV05]

DAP020.OPT;10              1/35       15-MAR-2005 16:02:27.49
DAP020.OPT;8               1/35        5-NOV-2004 14:10:56.44
DAP020.OPT;7               1/35        5-NOV-2004 14:10:56.44
DAP020.OPT;5               1/35       12-OCT-1999 10:41:28.38
DAP020.OPT;4               1/35       13-JAN-1986 16:30:05.00

Total of 5 files, 5/175 blocks.
$
Bara att kolla i version 4 av filen om man är nyfiken på vad man gjorde halv-5 i
mitten av Januari för 24 år sedan... :-) Ja, inte vad *jag* gjorde, jag har bara
haft hand om systemet i 2 år nu...

Ångrar man något man har gjort under dagen är det bara att göra t.ex DELETE/SINCE=TODAY
eller DELETE/SINCE=LOGIN eller DELETE/SINCE=<datum> för att "rensa"...
Eller PURGE för att rensa de *gamla* versionerna, eventuellt kombinerat med
/KEEP=n (n = antal att spara) eller /BEFORE=<datum> om man är lite osäker...

Sedan 2005 har det tydligen just detta varit stabilt (men det används för fullt i produktion).
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av AndersG »

Samma funktion finns i NetWare, samt Linux (om man kör NSS)

Bild
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av sodjan »

Hm, det verkar som om NetWare's lösning "bara" innebär att gamla versioner
"läggs undan" och att det inte kan användas direkt som vilken annan fil som helst.
Man måste köra speciella verktyg/kommandon för att göra "retreive" av dom om
man vill använda dom. I OpenVMS är versionsnumret en integrerad del av filnamnet
och alla tillgängliga (sparade) versioner kan användas hur man vill. Inte att
de gamla är "räddningsbara"... :-)

Det är ju väldigt långt från "samma funktion" och mer likt Windows "papperskorg"...
Jag lyckas inte hitta något om NSS mer än att det är en option och mer ser ut
som ett tillägg för att spara äldre versioner. Inte att det är en integrerad
del av filsystemet.

Det jag hittar som kommer lite i närheten är "SCO OpenServer"...
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av AndersG »

Hm, det verkar som om NetWare's lösning "bara" innebär att gamla versioner
"läggs undan"
Ja, hur många versioner som helst, du bestämmer själv när/hur de "purgas" och du behöver inte köra något speciellt kommando, det är integrerat i utforskaren. Jag ser skillnaden mot OpenVMS, men i praktiken så är det viktigaste för mig att man kan återställa en fil samt att man ser vem som raderat den.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av JimmyAndersson »

OpenVMS versionshantering ser väldigt användarvänlig och trevlig ut.



AndersG:
"Ett annat bra tips är att ändra en sak åt gången då man felsöker och att ha versionshantering."

Jag har en egen metod för det.
När jag ändrar saker så brukar jag först kopiera raden jag ska ändra. Sedan kommentera bort kopian och ändra den andra.
Då kan man jämföra det gamla med ändringarna.

Då och då (bl.a vid större ändringar/framsteg, delmål, klar-för-dagen, osv) tar jag en kopia på filerna,
lägger till datum och klockslag i slutet av filnamnet (t.ex belysning_20100525_1443.asm)
och sparar i en katalog ("Material och Backup") i projekt-katalogen.

Sambon har nästan samma system för bildredigering, men hon sätter datum/tiden först.
Det har visat sig vara smidigare för att spåra upp var en bild kommer ifrån.


De bästa versionhanteringsystemen borde vara de som är helt osynliga och inte bromsar arbetet när man behöver titta på en äldre version av något.
discomike
Inlägg: 445
Blev medlem: 22 juli 2007, 11:34:13
Ort: Göteborg

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av discomike »

Glömde skriva att även delay-loopar (räkneloopar) går fel.
Din Delay_1us rutin tar 6us vid 8MHz, kanske kan förklara några av dina observationer? (12 cykler, CALL + 8xNOP + RETURN).
Orka inte räkna om dina andra delay-loopar stämde..

Hur såg din pin-togglande testkod ut? använde du nån loop? = hopp tar 2 cykler.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av JimmyAndersson »

Uhm... Citatet kommer från ett av inläggen som handlar om MikroBasic-koden och du baserar "Din Delay_1us rutin tar 6us vid 8MHz" från assembler-koden som jag gjorde senare.
De delayrutinerna används inte ens.

Så jag vet inte riktigt vad du frågar efter tyvärr.


Testkoden var inget speciellt. Såhär:

Kod: Markera allt

program LEDbelysning

'PIC16F688. Intern oscillator på 8MHz.

' Lysdioder 1 - 6 : RC0 - RC5.
' Knapp (JP1) : RA4. (pin 3).
' Pot: RA2. (pin 11.)

'---------------------------------------------

symbol knapp = PORTA.4
symbol JP2 = PORTA.5

dim pot_hi as byte
dim pot_lo as byte
dim pot as word
dim tempknapp as byte


sub procedure Init
    TRISA = %00010100 ' Allt till utgångar, bortsett från knappen och poten.
    TRISC = $00 ' Alla till utgångar, för lysdioderna.
    
    PORTA = $00 ' Tomt
    PORTC = $FF ' Tomt  (Inverterat för lysdioderna pga PNP-drivning)

    knapplage = 0

    INTCON.GIE = 1    'Global interrupt enable bit  <--
    INTCON.PEIE = 1   'Enable unmasked peripheral interrupts <--
    INTCON.T0IE = 0   'Disable the Timer0 interrupt
    INTCON.INTE = 0   'Disable the RA2/INT external interrupt  <--
    INTCON.RAIE = 1   'Enable the PORTA change interrupt <--
    INTCON.T0IF = 0   'Timer0 did not overflow
    INTCON.INTF = 0   'RA2/INT external interrupt did not occur
    INTCON.RAIF = 0    'None of the PORTA-pins have changed state <--<<
    
    IOCA = %00010000   'RA4 interrupt on change. <--
    
    PIE1.EEIE = 0     'Disable the EE write complete interrupt
    PIE1.ADIE = 1     'Enable the ADC-interrupt <--
    PIE1.RCIE = 0     'Disable the EUSART receive interrupt
    PIE1.C2IE = 0     'Disable the comparator C2 interrupt
    PIE1.C1IE = 0     'Disable the comparator C1 interrupt
    PIE1.OSFIE = 0    'Disable the oscillator fail interrupt
    PIE1.TXIE = 0     'Disable the EUSART transmit interrupt
    PIE1.TMR1IE = 0   'Disable the Timer1 overflow interrupt

    PIR1 = $00        'Cleara alla interrupt
    PIR1.ADIF = 0     'AD interrupt clear <--

    PCON = %00000011  'Ingen Ultra Low-power Wake-up, BOR, POR eller BOR
    
    OSCCON.6 = 1      '8MHz IRCF2
    OSCCON.5 = 1      '8MHz IRCF1
    OSCCON.4 = 1      '8MHz IRCF0
    OSCCON.SCS = 0    'Fosc "är" systemklocka
    
    WPUA = $00        'Inga pull-up

    T1CON.TMR1ON = 0  'Timer1 avstängd
    
    CMCON0.CM2 = 1    'Comparators avstängda
    CMCON0.CM1 = 1    'Comparators avstängda
    CMCON0.CM0 = 1    'Comparators avstängda
    VRCON.VREN = 0    'CVref powered down

    ANSEL = %00000100 'AN2 (pin 11) analog. Resten digitala
    ADCON0.ADFM = 1   'Högerjusterad AD
    ADCON0.VCFG = 0   'Vdd som referens
    ADCON0.CHS2 = 0   'Channel: AN2 (pin 11)
    ADCON0.CHS1 = 1   'Channel: AN2 (pin 11)
    ADCON0.CHS0 = 0   'Channel: AN2 (pin 11)
    ADCON0.ADON = 1    'ADC enabled <--
    ADCON0.GO_DONE = 1 'AD-conversion in progress <-- 

    ADCON1.ADCS2 = 0  'AD Conversion clock: Fosc/32 = 250kHz
    ADCON1.ADCS1 = 1  'AD Conversion clock: Fosc/32 = 250kHz
    ADCON1.ADCS0 = 0  'AD Conversion clock: Fosc/32 = 250kHz

    TXSTA.TXEN = 0    'EUSART transmit disabled
    RCSTA = $00       'EUSART port disabled
    BAUDCTL.ABDEN = 0 'Auto-baud detect disabled

    
    WDTCON.SWDTEN = 0 'WDT turned off
    
end sub


sub procedure interrupt

    'Knapp-interrupt
    if TestBit(INTCON,RAIF) = 1 then
       tempknapp = knapp
       '
       ClearBit(INTCON,RAIF)
       SetBit(INTCON,RAIE)
    end if

    'Pot-interrupt
    if TestBit(PIR1,ADIF) = 1 then
       ClearBit(PIR1,ADIF)
       pot_lo = ADRESL
       pot_hi = ADRESH
       'pot = (word(pot_hi << 8)) OR pot_lo 'Slå ihop höga och låga delen (Blir 0 - 1024)
       
       SetBit(ADCON0, ADON)
       SetBit(ADCON0, GO_DONE)
    end if

end sub



Main:
    Init
    while true
        PORTC = %11000000
        delay_ms(1000)     ' Tar 5 gånger så lång tid när ADC-interrupt är enabled. <----
        PORTC = %11111111
        delay_ms(1000)
    wend
end.

edit:
Jag har under några dagar tänkt på råden jag fick i den här tråden (när det gäller problem rent generellt)
och även om det fortfarande går åt många timmar till att fundera på lösningar så känner jag helt klart att
assembler och jag har hittat tillbaka till varandra igen. :)
Visst fanns det stunder då jag tänkte på andra (C och MikroBasic), men assembler är ändå speciell.
Vi löser problem ihop och när det uppstår smarta lösningar så inser jag att de är mycket snyggare i assembler.

:hacker:
discomike
Inlägg: 445
Blev medlem: 22 juli 2007, 11:34:13
Ort: Göteborg

Re: PIC16F688 Intern oscillator. Och: Hur löser man problem?

Inlägg av discomike »

ok, nevermind =)
Skriv svar