Εμφάνιση αποτελεσμάτων : 1 έως 2 από 2

Θέμα: 18F2550 sdcc/picprog απλό παράδειγμα

  1. #1
    Μέλος
    Όνομα
    Στέφανος
    Εγγραφή
    May 2011
    Περιοχή
    Αθήνα
    Μηνύματα
    124

    Προεπιλογή 18F2550 sdcc/picprog απλό παράδειγμα

    Επειδή δεν βρήκα κ πολλά παραδείγματα για C που να δουλεύουν κατευθείαν χωρίς αλλαγές με sdcc και χρειάστηκε να το ψάξω λίγο, παραθέτω το εξής για όποιον ενδιαφέρεται και είναι ψάρι με τους pic σαν κ εμένα

    Το πρόγραμμα δεν κάνει κ τρομερά πράγματα (δεν είναι τπτ ιδιαίτερο, απλά μια αρχή...):
    στην αρχή αναβοσβήνει εν αλλάξ τα 2 led για λίγο, κ μετά διαβάζει σε λούπα τον ADC στο AN0 και αναβοσβήνει το 1 led ανάλογα με την τιμή αυτή (όχι χρησιμοποιώντας το pwm, αλλά με delay καθώς δεν το χω ψάξει αρκετά ακόμα).
    Κάνοντας comment το 2ο while, και uncomment το 3ο μετά το αρχικό αναβόσβημα κάνει poll τα RC1 & RC2 στα οποία έχουν συνδεθεί διακόπτες και αναβοσβήνει τα led αναλόγως ποιος έκλεισε.


    Το κύκλωμα είναι πολύ απλό:
    1 led σε σειρά με 100Ω αντισταση στο RB4 (pin 25)
    1 led σε σειρά με 100Ω αντισταση στο RB5 (pin 26)
    1 VR τα άκρα στα +5 κ GND κ το μεσαίο στο AN0 (pin2)
    1 R 1kΩ από το RC1 (pin 12) στο +5
    1 SW ΝΟ μεταξύ RC1-GND
    1 R 1kΩ από το RC2 (pin 13) στο +5
    1 SW ΝΟ μεταξύ RC2-GND
    1 R 1kΩ από το MCLR (pin 1) στο +5
    1 C ~220nF κεραμικός στα VDD-VSS (pin 20, 19)
    +5V στο VDD (pin 20)
    GND στο VSS (pin 8 & 19)


    Να σημειώσω ότι πολύ χρήσιμο είναι να δει κανείς το header file (pic18f2550.h) που γίνεται include στην αρχή γιατί κάποια ports/registers κλπ έχουν ελαφρώς διαφορετικά ονόματα από αυτά που θα βρείτε σε παραδείγματα ή στο datasheet.

    Για compile:
    sdcc -mpic16 -p18f2550 tst.c

    Για γράψιμο:
    picprog --erase --burn --input tst.hex --pic /dev/ttyS0
    Σημ. το ttyS0 ίσως θέλει άλλη τιμή αντί για 0 ανάλογα με τη θύρα.

    Δοκιμασμένος προγραμματιστής:
    http://electronics-diy.com/electroni...tic.php?id=823

    Μερικές από τις πηγές:
    http://www.pic18f.com/uncategorized/...nversion-in-c/
    http://burningsmell.org/pic18f2550/

    Ελπίζω να τα βρει κάποιος χρήσιμα κ να μη τα έγραψα τζάμπα


    Κώδικας:
    #include <pic18f2550.h>
    
    static __code char __at(__CONFIG1H) conf1H = _OSC_INTOSC__USB_HS_1H;
    static __code char __at(__CONFIG1L) conf1L = _PLLDIV_DIVIDE_BY_5__20MHZ_INPUT__1L & _CPUDIV__OSC1_OSC2_SRC___1__96MHZ_PLL_SRC___2__1L;
    static __code char __at(__CONFIG2H) conf2H = _WDT_DISABLED_CONTROLLED_2H;
    static __code char __at(__CONFIG4L) conf4 = _LVP_OFF_4L & _ENHCPU_OFF_4L;// & _BACKBUG_OFF_4L & _STVR_OFF_4L;
    
    
    
    #define LED_AFF1 LATBbits.LATB4
    #define LED_AFF2 LATBbits.LATB5
    
    #define SW1 PORTCbits.RC1
    #define SW2 PORTCbits.RC2
    
    void delay_ms(long ms);
    unsigned char is_sw1_pressed(void);
    unsigned char is_sw2_pressed(void);
    long x;
    
    void main(void)
    {
    	PORTB = 0x00;
    	TRISB = 0x00;
    	
    	ADCON1 = 0b00001110;	//VSS,VDD ref. AN0 analog only
    	ADCON0 = 0x00;		//clear ADCON0 to select channel 0 (AN0)
    	ADCON2 = 0b00001000;	//ADCON2 setup: Left justified, Tacq=2Tad, Tad=2*Tosc (or Fosc/2)
    	ADCON0bits.ADON = 0x01;	//Enable A/D module
    
    	x = 20;
    	while(x>0) {
    		LED_AFF1 = 1;
    		LED_AFF2 = 0;
    		delay_ms(250);
    		LED_AFF2 = 1;
    		LED_AFF1 = 0;
    		
    		delay_ms(250);
    		x--;
    	}
    	
    
    	while(1)
    	{
    		ADCON0bits.GO = 1;			//Start A/D Conversion
    		while(ADCON0bits.GO != 0);		//Loop here until A/D conversion completes
    		LED_AFF1 = !LED_AFF1;			//Toggle LED Pin
    		if (ADRESH > 0) delay_ms(ADRESH);
    	}
    	
    	
    	
    /*	
    	while(1) {
          if(is_sw1_pressed()==1) {   // is key 1 pressed
                                  // yes
             LED_AFF1=1;     // turn ON LED1    
            }
            else
            {                        //no
                LED_AFF1=0;    //turn off LED1
            }
    
            if(is_sw2_pressed()==1)    // is key 2 pressed
            {                        // yes
                LED_AFF2=1;     // turn ON LED2    
            }
            else
            {                        //no
                LED_AFF2=0;    //turn off LED2
            }
        }
        */
    
    }
    
    
    
    
    
    
    
    void delay_ms(long ms) {
        long i;
        while (ms--) for (i=0; i < 2; i++);
    }
    
    
    
    
    
    
    unsigned char is_sw1_pressed(void)
    {
        if (SW1==0)        // is SW1 pressed?
        {                            //yes
            delay_ms(10);            // wait 10mS for debounce.
            if (SW1==0)    // is SW1 still has pressed status after 10mS delay?
            {                        // yes, we have key press
                return 1;
            }
        }
        return 0;// if key is not pressed, return 0
    }
    
    
    unsigned char is_sw2_pressed(void)
    {
        if (SW2==0)        // is SW1 pressed?
        {                            //yes
            delay_ms(10);            // wait 10mS for debounce.
            if (SW2==0)    // is SW1 still has pressed status after 10mS delay?
            {                        // yes, we have key press
                return 1;
            }
        }
        return 0;// if key is not pressed, return 0
    }
    edit: τα ms στο delay είναι παραπλανιτικά, δεν είναι ms, αλλά κάτι ψιλο στην τύχη ανάλογα με τη συχνότητα

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Δημήτρης
    Εγγραφή
    Feb 2007
    Περιοχή
    Κύπρος
    Μηνύματα
    124

    Προεπιλογή

    Φίλε Στέφανε, πολύ ωραίο το tutorial σου. +1 για το sdcc

    Έχεις χρησιμοποιήσει βιβλιοθήκες στο sdcc; Είναι εύχρηστες;

    0 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. Απλό συμμετρικό τροφοδοτικό
    By VirusX2 in forum Κυκλώματα Τροφοδοτικών
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 07-06-15, 21:20
  2. Παράδειγμα προς αποφυγή
    By toni31 in forum Hardware Η/Υ
    Απαντήσεις: 23
    Τελευταίο Μήνυμα: 15-08-13, 09:51
  3. Απλό ινβερτερ
    By spyropap in forum Κυκλώματα Τροφοδοτικών
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 26-01-12, 21:33
  4. Απλό πεδιόμετρο
    By xazopartalos in forum Παρουσίαση Ολοκληρωμένων Κατασκευών
    Απαντήσεις: 5
    Τελευταίο Μήνυμα: 30-09-09, 14:51
  5. Παράδειγμα προς αποφυγή:Killowatt Bob(KC3VO)!
    By aeonios in forum Ραδιοερασιτεχνισμός
    Απαντήσεις: 13
    Τελευταίο Μήνυμα: 28-08-09, 17:02

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας