- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 3 von 3

Thema: Frage zu meinem C-Code!

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.01.2005
    Beiträge
    103

    Frage zu meinem C-Code!

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo
    ich hoff mir kann jemand weiterhelfen! ich programmiere meinen PIC16f877a in c mit mplab! der pic soll über die RS232 schnittstelle zeichen empfangen können und weiters soll der controller aber immer 2 eingelesene adc werte zu meinem pc schicken!!(also der pic soll immer daten zum pc senden)
    irgendwie funktioniert das nicht so wirklich!! ich steh ziemlich auf der leitung und weiß nicht mehr weiter
    hoff mir kann jemand helfen!!

    mfg doolitle

    Code:
    #include <16F877a.h>
    #device ADC=10			//10bit Auflösung
    #use delay (clock=4000000)
    #use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
    #fuses XT, NOWDT, NOPROTECT, NOLVP
    #include <stdlib.h>
    #include <string.h>
    
    
    
    void main (void)
    {
    	char empfangen[3], senden[2];
    	int8 duty1;
    	int8 duty2;
    	int8 i, a, zeit, counter;
    	int16 ad_wert1, ad_wert2;
    	float spannung1, spannung2;
    
    	spannung1 = 0;
    	spannung2 = 0;
    	duty1=0;
    	duty2=0;
    	i=0;
    	
    	setup_ccp1(CCP_PWM);					//setup capture unit 1 to
    	setup_ccp2(CCP_PWM);					//setup capture unit 1 to
    	setup_timer_2(T2_DIV_BY_1,100,1);		//setup period timer2
    
    	/* Initialisierung der ADC PORTS */
    	setup_adc(ADC_CLOCK_INTERNAL );
    	setup_adc_ports( ALL_ANALOG );			
    	while(TRUE)
    	{
    
    		/* Empfangsteil */
    
    			
    			do
    			{
    				if(kbhit())
    				{
    					for(i=0; i<=2; i++)
    					{
    						delay_ms(200);
    						empfangen[i] = getc();
    					}
    				}	
    			}
    			while (empfangen == 0);
    		
    	/* ************************************************************ */
    	/* Steuerungsteil */
    
    			
    			if(empfangen[0] == 'a') output_high(PIN_B5);
    			if(empfangen[1] == 's') output_high(PIN_B6);
    			if(empfangen[2] == 'd') output_high(PIN_B7);
    
    			if(empfangen[0] == 'q') output_low(PIN_B5);
    			if(empfangen[1] == 'w') output_low(PIN_B6);
    			if(empfangen[2] == 'e') output_low(PIN_B7);
    		
    		/* Mess- und Sensordaten einlesen */
    			set_adc_channel(1);					// Spannungsversorgung der Steuerelektronik	
    			ad_wert1 = read_adc();		
    			spannung1 = (ad_wert1 / 1023) * 5;	
    
    			delay_ms(200);
    
    			set_adc_channel(2);					// Spannungsversorgung der Motoren
    			ad_wert2 = read_adc();
    			spannung2 = (ad_wert2 / 1023) * 12;
    		
    		
    	/* ************************************************************ */
    	/* Sendeteil */
    
    		senden[0] = spannung1;
    		senden[1] = spannung2;
    		
    		for(a=0; a<=1; a++)
    		{
    			printf("\f%S\n",senden[a]);
    		}
    		
    	/* ************************************************************* */
    
    	}
    }

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    36
    Beiträge
    116
    Hi

    der ADC braucht eine gewisse Zeit nach dem Umschalten bis Du das Ergebnis abrufen kannst. Deswegen würd ich folgendes Vorschlagen:

    Das im Initialisierungsteil festlegen
    Code:
    set_adc_channel(1); // Spannungsversorgung der Steuerelektronik
    Folgendes abändern, so dass jedesmal nach dem Lesen gleich auf den nächsten Eingang geschaltet wird.
    Code:
    /* Mess- und Sensordaten einlesen */
    
    ad_wert1 = read_adc();      // deswegen oben im Initialisierungsteil channel(1) festgelegt weil es hier jetzt nicht mehr steht.
    
    spannung1 = (ad_wert1 / 1023) * 5;
    
    set_adc_channel(2);               // Spannungsversorgung der Motoren <- !! gleich umschalten damit der ADC genügend zeit hat   
    
    delay_ms(200);    // und die hat er 200ms sind mehr als ausreichend!
    
    ad_wert2 = read_adc();
    
    spannung2 = (ad_wert2 / 1023) * 12;
    
    set_adc_channel(1);               // Wieder nach dem Lesen auf den anderen Kanal schalten damit dieser sich aufladen kann!
    
    eventuell hier noch ein delay(20); einfügen wenns nicht funktoniert!
    Bis dahin funktioiert nur der ADC richtig dein Probnlem ist aber das die Routine nicht aufgerufen wird, denn folgender Code:

    Code:
    do
             {
                if(kbhit())
                {
                   for(i=0; i<=2; i++)
                   {
                      delay_ms(200);
                      empfangen[i] = getc();
                   }
                }   
             }
             while (empfangen == 0);
    Die do-Schleife wird dauernd wiederholt und erst verlassen (und mit dem weiteren Code fortgefahren) wenn der PIC ein Zeichen empfangen hat.
    Das musst Du noch abändern ich empfehle dir das so umzuschreiben das Du einen Interuppt für anklommende Daten benutzt udn keine do-Schleife die jedesmal überprüft ob was Empfangen wurde und den Rest blockiert.

    mfg
    Benny

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    16.05.2004
    Beiträge
    304
    Ich arbeite gerade an etwas ähnlichem und es funktioniert sicherer, wenn man zb ein Steuerzeichen vor dem Senden abfragt und erst dann versendet. Ich komm auf meinen 18F4550 und 20Mhz mit 2 mS je ADC aus. Beim Empfangen muss dann ja auch ein Delay eingefügt werden.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress