Jump to content

Rickta59

Global Moderators
  • Content Count

    1,135
  • Joined

  • Last visited

  • Days Won

    71

Reputation Activity

  1. Like
    Rickta59 reacted to johnsondavies in Lisp for the MSP430 FR6989 LaunchPad   
    My Lisp interpreter for microcontrollers, uLisp, now supports the MSP430 FR6989 LaunchPad board, with the ability to write text to the LCD display from Lisp programs:

    For more information see uLisp for the MSP430 FR6989 LaunchPad.
  2. Like
    Rickta59 got a reaction from NurseBob in SD card bootloader - convert assembler to C++?   
    So I spent some time with the latest energia 1.8.7E21. It is still using msp430-gcc. That project I linked in the previous post won't work because that code is using the newer msp430-elf-gcc.   I did put together an example of using msp430-gcc style code and the blink project above that compiles and create asm only project .. well almost main has to jump to our asm code so there are a couple of instructions to get there.  Three files are needed:
    blink_with_msp430-gcc_asm.ino
    /* blink_with_msp430-gcc_asm.ino */ /* * we aren't going to use the .ino file */ main.cpp
    // We override the main function from Energia // and just jump to our __reset_vector__ routine // in blink.S int main() { asm("jmp _reset_vector__"); } blink.S
    ;------------------------------------------------------------------------------- ; blinkasm.S - gcc compatible interrupt driven led blinker in msp430 asm ; ; Version 1.0 - 10/22/2011 rick@kimballsoftware.com ; Version 1.01 - 7/22/2014 rick@kimballsoftware.com modified for msp430-elf-gcc ; Version 1.02 - 11/02/2014 rick@kimballsoftware.com more changes for msp430-elf-gcc ; $ msp430-elf-gcc blinkasm.S -D_GNU_ASSEMBLER_ -Wall -Os -g \ ; -fdata-sections -ffunction-sections -mmcu=msp430g2553 -T \ ; -T msp430g2553.ld -I/tmp/a/include -L /tmp/a/include/ -nostdlib ; Version 1.03 - 03/16/2019 rick@kimballsoftware.com made compatible with energia ; ;------------------------------------------------------------------------------- .file "blinkasm.S" #include <msp430.h> ;------------------------------------------------------------------------------- ;;; ---- gcc doesn't know about PC,SP,SR,CG1,CG2 ---- #define PC r0 #define SP r1 #define SR r2 ;------------------------------------------------------------------------------- ;;; ---- CONSTANTS ---- //#define TEST_IRQ_OVERHEAD #ifndef TEST_IRQ_OVERHEAD #define _50USEC (50-1) /* @1MHz MCLK results in 50uSec/interrupt */ #define _500MSEC 10000 /* @1MHz MCLK results in 500ms/LED toggle */ #else ;; This test illustrates the minimum CCR0 value that can be used ;; 22 cycles is based on the interrupt overhead #define _50USEC 22 /* @1MHz MCLK results in 23uSec/interrupt */ #define _500MSEC 1 /* @1MHz MCLK results in 23uSec/LED toggle */ #endif #define _LED_PIN BIT6 /* PORT1 pin, Launchpad has BIT0=Red and BIT6=Green */ ;------------------------------------------------------------------------------- ;;; ---- Registers used as globals ---- #define LED_PIN r4 #define TIMER_CYCLES r5 #define INTERVAL_CNT r6 #define CNT r7 ;; or you could use some ram variables .lcomm tcycles,2 ; example use of local bss data variable .lcomm cnt,2 ; example use of local bss data variable ;------------------------------------------------------------------------------- .section .text,"ax",@progbits ;------------------------------------------------------------------------------- .global _reset_vector__ ; it is important to name it "_reset_vector__" ; we prevent the C runtime start code from getting ; linked by using this name _reset_vector__: ;; disable watchdog and set stack to highest RAM addr mov.w #WDTPW|WDTHOLD,&WDTCTL mov.w #__stack,SP ; gcc ldscripts compute __stack based on mmcu ;; initialize clock,gpio,timer init: ;; configure DCO to precalibrated 1MHz clr.b &DCOCTL mov.b &CALBC1_1MHZ,&BCSCTL1 mov.b &CALDCO_1MHZ,&DCOCTL ;; initialize global register values mov.w #_LED_PIN,LED_PIN ; load constant into register constant mov.w #_50USEC,TIMER_CYCLES ; load constant into register constant mov.w #_500MSEC,INTERVAL_CNT ; load constant into register constant mov.w INTERVAL_CNT,CNT ; initialize register based counter ;; initialize GPIO bic.b LED_PIN,&P1OUT ; LED turned off to start bis.b LED_PIN,&P1DIR ; Configure P1.0 as output pin ;; initialize TimerA0 mov.w #CCIE,&TA0CCTL0 ; Enable TA0CCR0 interrupt mov.w TIMER_CYCLES,&TA0CCR0 ; Set TIMER_CYCLES cycles mov.w #TASSEL_2|MC_2,&TACTL ; SMCLK, Continuous Up Mode ;; enable interrupts and loop forever ;; real work done in the CCR0 interrupt nop eint loop: ;; Note: could sleep here instead jmp loop ; cycles:2 ;------------------------------------------------------------------------------- ; TIMER0_A3_ISR - Timer0_A3 CCR0 interrupt handler for vector 0xfff2 ;------------------------------------------------------------------------------- .global __isr_9 ; to insert an interrupt vector into the vector ; table from assembly, we have to use a specific ; naming convention we must call this function ; "__isr_9" this forces it into the 9th vector ; slot counting from 0 starting memory address ; 0xffe0. It is 9 because each vector is ; 2 bytes so we end up in slot 0xfff2 ; all this is because of the way msp430-gcc ; works with interrupts ; .vectors in the msp430g2553/memory.x starts ; @ 0xffe0 ; there are numbered isr_0 ... isr_14 even though ; there are 16 vectors. isr_15 is actually called ; _reset_vector__ you can see how we use it in this ; code. ; see the file: ; http://www.ti.com/lit/ds/symlink/msp430g2553.pdf ; look at the "Interrupt Vector Table" page 11 __isr_9: ;; before we even start running the mcu does a push PC, and a push SR cycles:6 dec.w CNT ; have we looped INTERVAL_CNT times? cycles:1 jnz 1f ; exit if we haven't reached 0 cycles:2 ;; toggle led pin after (INTERVAL * TIMER_CYCLES) has occured xor.b LED_PIN,&P1OUT ; cycles:4 mov.w INTERVAL_CNT,CNT ; reinitialize interval counter cycles:1 1: add.w TIMER_CYCLES,&TA0CCR0 ; set new CCR0 and go again cycles:4 reti ; cycles:5 ; vim: ts=8 sw=8 expandtab: Put those in a new Energia sketch compile it for an msp430g2553 and it should produce output that looks like this:
    blink_with_msp430-gcc_asm.ino.elf: file format elf32-msp430 Disassembly of section .text: 0000c000 <main>: c000: 03 3c jmp $+8 ;abs 0xc008 c002: 0f 43 clr r15 0000c004 <__ctors_end>: c004: 30 40 5e c0 br #0xc05e 0000c008 <_reset_vector__>: c008: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80 c00c: 20 01 c00e: 31 40 00 04 mov #1024, r1 ;#0x0400 0000c012 <init>: c012: c2 43 56 00 mov.b #0, &0x0056 ;r3 As==00 c016: d2 42 ff 10 mov.b &0x10ff,&0x0057 c01a: 57 00 c01c: d2 42 fe 10 mov.b &0x10fe,&0x0056 c020: 56 00 c022: 34 40 40 00 mov #64, r4 ;#0x0040 c026: 35 40 31 00 mov #49, r5 ;#0x0031 c02a: 36 40 10 27 mov #10000, r6 ;#0x2710 c02e: 07 46 mov r6, r7 c030: c2 c4 21 00 bic.b r4, &0x0021 c034: c2 d4 22 00 bis.b r4, &0x0022 c038: b2 40 10 00 mov #16, &0x0162 ;#0x0010 c03c: 62 01 c03e: 82 45 72 01 mov r5, &0x0172 c042: b2 40 20 02 mov #544, &0x0160 ;#0x0220 c046: 60 01 c048: 03 43 nop c04a: 32 d2 eint 0000c04c <loop>: c04c: ff 3f jmp $+0 ;abs 0xc04c 0000c04e <__isr_9>: c04e: 17 83 dec r7 c050: 03 20 jnz $+8 ;abs 0xc058 c052: c2 e4 21 00 xor.b r4, &0x0021 c056: 07 46 mov r6, r7 c058: 82 55 72 01 add r5, &0x0172 c05c: 00 13 reti 0000c05e <_unexpected_>: c05e: 00 13 reti Disassembly of section .vectors: 0000ffe0 <__ivtbl_16>: ffe0: 04 c0 04 c0 04 c0 04 c0 04 c0 04 c0 04 c0 04 c0 ................ fff0: 04 c0 4e c0 04 c0 04 c0 04 c0 04 c0 04 c0 08 c0 ..N............. To get your SD Card Bootloader running in Energia you would have to replace the blink.S with SDBSL-G2553.S and change your coding style to make msp430-gcc happy.  You would also have to replicate all the code that the normal C runtime code does to create an environment for a C++ application. Basically you have to setup the .data section (copying the initial values from flash to ram), initialize the .bss section all to zero, loop through all the global c++ constructors, then call the users main function.
     
    blink_with_msp430_asm.zip
  3. Like
    Rickta59 got a reaction from energia in Add MSP432 support to Arduino?   
    not json but instructions given for linux
    https://github.com/RickKimball/tivac-core
    Assumes you have openocd and arm-none-eabi-gcc in your path. Probably won't work for windows. Probably will work for OSX.
  4. Thanks
    Rickta59 got a reaction from Fmilburn in Add MSP432 support to Arduino?   
    not json but instructions given for linux
    https://github.com/RickKimball/tivac-core
    Assumes you have openocd and arm-none-eabi-gcc in your path. Probably won't work for windows. Probably will work for OSX.
  5. Like
    Rickta59 reacted to terjeio in RFC: CNC BoosterPack   
    Driver code for a few boards is available from my github account. A PCB design with reduced size allows two boards to be mounted to the EK-TM4C1294XL LaunchPad providing up to 6 axes of control (needs to be verified). I have also added TCP streaming to the EK-TM4C1294XL LaunchPad but usure if I can publish the code due to the "viral" clause in many of TIs files - even the startup code 🙁. Grbl is released under GPL and I have a hard time understanding the legalese related to that...
    I am currently working on a DRO/MPG for my lathe with Grbl running on a MSP432, and the DRO/MPG code on a Tiva C/MSP430 combo. Threading support is a part of that work and hopefully I'll be able to get it working reliably - looks promising this far.

     
  6. Like
    Rickta59 got a reaction from energia in Infinity Loop in file "Tcp.c" , function "void tcp_slowtmr(void)"   
    googling seems to indicate this is a known problem.
  7. Like
    Rickta59 got a reaction from energia in The problem about compiling "Blink" by Energia   
    this was fixed a long time ago. 
    https://github.com/robertinant/EnergiaNG/issues/10
    are you sure you have the latest stuff?
  8. Thanks
    Rickta59 got a reaction from Fmilburn in Serial Port Problem   
    With the G2 launchpad, the best thing to do is remove the TX/RX jumper pins and use an external dongle. USB dongles used to be expensive however you can get them now for less than $2.  Pick one that uses 3v3 signals or you will fry your launchpad chip.  
    Something like this will solve all your problems ($1.69 free shipping * at least in the US):
    https://www.ebay.com/itm/272758761169
    Just connect GND/TX/RX to your launchpad leave the 5v power unconnected (maybe even tape it back to the wire so you don't forget) As an added bonus, you will no longer be limited to 9600 baud.  I've run these pl2303 chips with an msp430g2553 at 230k without a problem.  These show up as /dev/ttyUSBx on linux.
    -rick
  9. Thanks
    Rickta59 got a reaction from Fmilburn in CoRTOS: An open source minimalist RTOS   
    Interesting chunk of code, however it doesn't seem like you've invested much effort in your msp430 port or cross platform compatibility. The code only seems to attempt only one msp430 mcu (msp430fr6989).  As there is no project file for CCS or a makefile, I created an empty CCS project using the TI C compiler for an msp430fr6989.  I imported the CoRTOSblinkyMSP.c source and all the headers. It has a bunch of obvious errors.  Have you tried to compile that file?  It doesn't compile, at least with CCS 7 on ubuntu.
    Hint 1: you can't use msp430-elf-gcc
    Hint 2: Edit CoRTOSuP.h and make the processor uP_MSP430 the default 
    Hint 3: Don't try this on a files system that is case sensitive. The source code and files provided uses a mix of upper and lower case. You need to fix the incorrect file name references or rename the files to match the names.
     
    First batch of errors:

    Description    Resource    Path    Location    Type
    #150 variable "task_stack_size" has already been initialized    CoRTOStask.c    /cortos    line 33    C/C++ Problem
    .. defined multiple times in the source

    #1965 cannot open source file "msp430FR6989.h"    CoRTOSkernel.c    /cortos    line 18    C/C++ Problem
    needs to be msp430fr6989.h" .. probably should be just <msp430.h>

    #20 identifier "t" is undefined    CoRTOSblinkyMSP.c    /cortos/apps    line 202    C/C++ Problem
    I don't see this declared anywhere, I'm assuming you meant "n" not "t"
     
    #20 identifier "tn" is undefined    CoRTOSblinkyMSP.c    /cortos/apps    line 208    C/C++ Problem
    not sure what you meant to pass to resume_task() .. guessing it is also "n" ?
     
    After I addressed those problems, I changed the code around so I could run it on an msp430fr5969 launchpad. The release build results in a multi-tasking blinky app that uses about 1k of code and 200 bytes of ram.  That seems to work, maybe I'll try a little more tomorrow.
    -rick
     
  10. Like
    Rickta59 reacted to jazz in Supported MSP430's   
    BTW, If you don't want to design board right now, I have 2 breakout boards left,  for MSP430x2xx 38 pin TSSOP devices.

  11. Like
    Rickta59 got a reaction from Marc in Changing the main.cpp   
    Just create a new tab and call it main.c
     

     
     
  12. Like
    Rickta59 got a reaction from Tauronts in Promotion of MSP430FR2433 MCU LaunchPad™ kit   
    Sorry to confuse. When I see a new msp430 chip I grep the header file for '_HAS_' which tells me what features are in the chip. I guess it would make more sense to read the datasheet
     
  13. Like
    Rickta59 reacted to zeke in Amazon FreeRTOS   
    And the documentation is now FREE!!!
    I paid big bucks for my copy last year!
    Just, Wow!
  14. Like
    Rickta59 got a reaction from bluehash in Suggestions on MCU/Chip Selection   
    nothing like a timely response 
  15. Like
    Rickta59 got a reaction from veryalive in neo430 - msp430 compatible FPGA processor   
    For a long time, I have had an interest in FPGA development. You can find boards that come with a JTAG programmer on ebay for less than $20. The following ebay link shows a board similar to the one I had purchased http://www.ebay.com/itm/361568712810  I experimented with it a lot for a while and then I probably got distracted by some new TI toy  Occasionally, I would pick it up and try different things with it. However, the cost and form factor of the chips discourages me from doing anything real with it.  For me these things are more of an educational plaything.
     
    Yesterday, I noticed the neo430 project on opencores.org. It is an msp430 compatible processor implemented in VHDL. It didn't take me long to get it installed and it actually seems to work pretty well. There are some difference between the neo430 and the msp430. ( see list below for the details ) Using the Altera Cyclone II EP2C5 board I linked above I was able to use the example code to create an msp430 like device with 4K of ROM and 4K of RAM. It runs a serial bootloader over its UART peripheral and allows you to toggle the pins using its parallel port peripheral. It has a simple timer peripheral. It has its own custom peripherals and 'C' header files setup to access those. It comes all setup to use msp430-gcc as a development tool with the device you create.
     
    The instructions are pretty complete neo430 instructions  , I just followed them to get started.  For my Altera chip, I used the free web edition of quartus II 13.0.1 sp1 to convert the VHDL code into a loadable bitstream. Once you load that on to the FPGA chip using the USB-Blaster, a serial terminal is used to interact with the bootloader and upload msp430-gcc compiled files.  The provided makefiles automate the msp430 code creation process.  I'm using this on linux and I had to make a few changes to point at the directory where my msp430-gcc is installed. If you are windows user it will probably just work out of the box for you.

    I'll try and post more on my experiments.  In the meantime, I thought others might find it interesting.
     
    Functional Diagram:

     
    Memory Layout:

     
  16. Like
    Rickta59 reacted to Rei Vilo in I2C Between 2 MSP430s   
    Have you visited http://energia.nu? A pins map is provided for each supported LaunchPad.
    Have you performed a search about I²C on this very forum? It contains the answer to your question —hint: pull-ups.
    Why are you posting the same question twice? One suffices. 
  17. Like
    Rickta59 got a reaction from agaelema in msp430G2553 WDT   
    His implementation is very simple but not so flexible. You can find a more complete c++ template implementation here:
     
    https://github.com/RickKimball/fabooh/blob/master/examples/serial/ascii_table_iostream/ascii_table_iostream.cpp - ascii table dump using operator insertion or standard function calls
    https://github.com/RickKimball/fabooh/tree/master/examples/math .. sine table prints using cordic, fixed math and floats
     
    fabooh support eusci, usci, software only (on any pin) with multiple instances and finally timer based serial.
  18. Like
    Rickta59 reacted to Fmilburn in MSP430 Infrared Controlled Wearable   
    Receiver Prototype Working
    After some stop and start I am back on this project and making progress.  Here is the latest iteration:

    The wearable IR receiver and WS2812 controller at bottom runs off of a single 2032 battery.  With only one LED lit at a time it is capable of easily running for an hour since current is  down in the 10-15 mA range.  It also transmits and receives with high reliability at 10 meters with two IR LEDs as shown. The transmitter is battery driven at the moment. I have a large number of IR LEDs on order so as to build a transmitter with a larger array of LEDs.
    It uses 2400 Baud UART for transmission.  The transmitter code was written with CCS and is done in software with two timers.  One timer maintains 2400 baud. To transmit a 1 bit the second timer is turned on and outputs a 38 KHz square wave over the IR LEDs until time for the next bit.  For a 0 bit nothing is transmitted.  The LEDs are rated for 100 mA each continuous but are being driven here at about 70 mA each with a NPN transistor hidden behind the jumper wires on the breadboard. 
    On the receiver side the IR receiver turns the transmission into input that can be directly input into the UART peripheral on the MSP430G2553.  A single byte is used to select the color and display mode of the WS2812 LEDs.  The driver for the WS2812s uses the SPI method which I have posted elsewhere.  There are some areas for improvement in the receiver PCB which I will incorporate in the next board spin but everything is working.
    A feature of this approach is that the receiver uses Energia with no tricks and even works on an Arduino Uno without modification other than pin changes.
    For the transmitter, I am still thinking about how best to implement.  One approach would be to continue using a microcontroller such as the MSP430F5529 I am currently using with a keypad and display.  Something like this mock-up:

    Alternatively, I could use something like a Raspberry Pi 3 and use Python to give Bluetooth LE access control over a phone.
  19. Like
    Rickta59 reacted to RobG in Products using MSP430   
    I went to Sears yesterday to get my new lawn mower and I got a free gift, Kenmore Alfie Voice-Controlled Intelligent Shopper.
    The regular price of Alfie is $49, but they are now on sale for $25. However, if you are SYW member and you spend more than $25, you get one for free (expires 7/1/17!) 
    BTW, I also found Alfie for $7.95 on Amazon (with free Prime shipping, even cheaper from other vendors.)
    What's the big deal about Alfie? Crack one open and you will find the following:
    CC3200R1 Single-Chip Wireless MCU (with W25Q32JV (32M-bit) serial Flash memory from Winbond and a chip antenna)
    TLV320AIC3100 Low-Power Audio Codec With Audio Processing and Mono Class-D Amplifier
    3.7V 500mAh LiPo battery
    12 WS2812B LEDs
    Other useful things are microphone, large speaker, 2 LEDs, 2 switches, and USB port
    In other words, IoT experimenter's treasure chest!
    Can't wait to hack that thing (there's what appears to be programming header on the board.)
     
     
     




  20. Like
    Rickta59 got a reaction from hemangjoshi37a in SD card not writing any data from microcontroller.   
    Did you read the limitations of the Petit FS?
    ...
    Petit FatFs Limitations:
    Petitfs specifically uses as little flash and stack as possible. This, however, comes at the expense of some functionality. Files are not able be created or increased in size, and only one file can be accessed at a time. 
    ...
    So if you create a zero length file (open a file in a text editor and save it without adding anything to it), it isn't going to do what you want.  If you search the forum or google this is expressed in thousands of posts.
    The comment above comes from this document: http://www.atmel.com/Images/Atmel-42776-Using-the-Petit-FAT-File-System-Module-with-AVR_ApplicationNote_AVR42776.pdf
     
    http://elm-chan.org/fsw/ff/pf/write.html ... 
    Description
    The write function has some restrictions listed below:
    Cannot create file. Only existing file can be written. Cannot expand file size. Cannot update time stamp of the file. Write operation can start/stop on the sector boundary only. Read-only attribute of the file cannot block write operation. File write operation must be done in following sequence.
    pf_lseek(ofs); read/write pointer must be moved to sector bundary prior to initiate the write operation, or it will be rounded-down to the sector boundary at first write operation. pf_write(buff, btw, &bw); Initiate write operation. Write first data to the file. pf_write(buff, btw, &bw); Write next data. Any other file function cannot be used while a write operation is in progress. pf_write(0, 0, &bw); Finalize the current write operation. If read/write pointer is not on the sector boundary, left bytes in the sector will be filled with zero. The read/write pointer in the file system object advances in number of bytes written. After the function succeeded, *bw should be checked to detect end of file. In case of *bw is less than btw, it means the read/write pointer reached end of file during the write operation. Once a write operation is initiated, it must be finalized properly, or the written data can be lost.
     
  21. Like
    Rickta59 got a reaction from tripwire in SD card not writing any data from microcontroller.   
    Did you read the limitations of the Petit FS?
    ...
    Petit FatFs Limitations:
    Petitfs specifically uses as little flash and stack as possible. This, however, comes at the expense of some functionality. Files are not able be created or increased in size, and only one file can be accessed at a time. 
    ...
    So if you create a zero length file (open a file in a text editor and save it without adding anything to it), it isn't going to do what you want.  If you search the forum or google this is expressed in thousands of posts.
    The comment above comes from this document: http://www.atmel.com/Images/Atmel-42776-Using-the-Petit-FAT-File-System-Module-with-AVR_ApplicationNote_AVR42776.pdf
     
    http://elm-chan.org/fsw/ff/pf/write.html ... 
    Description
    The write function has some restrictions listed below:
    Cannot create file. Only existing file can be written. Cannot expand file size. Cannot update time stamp of the file. Write operation can start/stop on the sector boundary only. Read-only attribute of the file cannot block write operation. File write operation must be done in following sequence.
    pf_lseek(ofs); read/write pointer must be moved to sector bundary prior to initiate the write operation, or it will be rounded-down to the sector boundary at first write operation. pf_write(buff, btw, &bw); Initiate write operation. Write first data to the file. pf_write(buff, btw, &bw); Write next data. Any other file function cannot be used while a write operation is in progress. pf_write(0, 0, &bw); Finalize the current write operation. If read/write pointer is not on the sector boundary, left bytes in the sector will be filled with zero. The read/write pointer in the file system object advances in number of bytes written. After the function succeeded, *bw should be checked to detect end of file. In case of *bw is less than btw, it means the read/write pointer reached end of file during the write operation. Once a write operation is initiated, it must be finalized properly, or the written data can be lost.
     
  22. Like
    Rickta59 got a reaction from zeke in What is your Backup Process?   
    I had taken a quick glance at the feature list and had noticed that it is supposed to support that feature. I thought I read a further comment stating at some point it starts throwing away old versions to make room. I didn't dig deeper. I thought you might have.
    While it is all well and good to backup files as they change, it seems like it would make sense for some scenarios to only create a backup if the contents change.  However, I can imagine other situations where it would be important to note file timestamp changes.
    I've noticed that simplistic approaches to backup schemes lead to data loss, while giving the user a false sense of safety that really isn't there.  They only find out about an unrecoverable data loss after the fact.
    Write open source software, share it with all your friends. If you ever lose a file you just reach out for a little help from your friends.
     
  23. Like
    Rickta59 got a reaction from yyrkoon in What is your Backup Process?   
    What happens when you do:
    $ for rev in $(seq 1000); do cat /dev/null >reallyimportant.c; echo $rev; sleep 1; done
    How many revisions does it save before it starts throwing out old copies and you end up with an empty c file?
     
  24. Like
    Rickta59 got a reaction from yyrkoon in What is your Backup Process?   
    In the 37 years I've been writing code, I've only asked an admin to recover a file for me once.  Turns out that file was on a disk that was being backed up by a SCSI tape drive that had been having problems and of course all the tapes were bad. However, it is always easier to write code the second time  : )
     
  25. Like
    Rickta59 got a reaction from NurseBob in What is your Backup Process?   
    In the 37 years I've been writing code, I've only asked an admin to recover a file for me once.  Turns out that file was on a disk that was being backed up by a SCSI tape drive that had been having problems and of course all the tapes were bad. However, it is always easier to write code the second time  : )
     
×
×
  • Create New...