- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 45

Thema: UART Interrupt und Time kommen sich in die Quere???

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Das is strange. dann mach mal

    if ( (inStr[inCnt]) < 32) || (inStr[inCnt]) > 96) )
    printf("CHAR RECEIVED: %i\n\r", (int)inStr[inCnt]);
    else
    printf("CHAR RECEIVED: %c\n\r", inStr[inCnt]);


    Edit: ausgebessert . muh muh !
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Nochwas: ich bin dann weg. bis morgen !
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    immernoch: bei kleinen Buchstaben andere Zeichen oder Piepsen. Bei Großbuchstaben der entsprechende int-Wert, bei Zahlen auch der entsprechende int-Wert.

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Ahh,
    sowas ist doch ätzend: scheinbar hat sich das terminal durch die Zeichen aufgehängt, die zur Servobewegung gesendet wurden. Sobald ich das bewegen weg lasse klappt alles.
    Dh. irgendwer müsste mir jetzt doch mal beibringen, wie ich TX auf einen anderen Pin verlege, damit das nicht über die selbe Leitung geht, die zur Kommunikation mit dem PC verwendet wird. Gibts da eine Tutorial oder so?

    Danke, dass ihr euch den Code angeschaut habt. War ja auch einiges Überflüssiges drin.

    mfg
    jagdfalke

  5. #15
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Bei bestimmten Zeichen hängt sich das Terminal auf. ich kann dir aber zeigen, wie du das vermeidest, auch ohne eigene Leitung. ich muß nur vorher einige Wege machen.
    Wie ist das mit den kleinbuchstaben gelaufen ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Seit dem Neustart des Terminals geht alles wunderbar. Von Großbuchstaben über Kleinbuchstaben bis zu Sonderzeichen geht alles.
    Wie kann ich das vermeiden? Ich habe aber gelesen, dass diese avrlibs einen Software UART bereitstellen.

    mfg
    jagdfalke

  7. #17
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn du NACH dem senden der Servo-Message (oder sonst was binäres)
    schick folgendes, das beruhigt die Nerven vom Terminal wieder
    Print "{015}{017}";
    Das ist ein <SI> und sicherheitshalber ein <XON>

    Ich hatte das gleiche Problem, is damit gelöst.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    bist du dir sicher, dass ich
    [code]
    printf("{015}{017}");
    [/code}
    schreiben muss? Du hast ja print ".."; geschrieben. Ist das ne Mischung aus Bascom und C ? Also was muss ich jetzt senden lassen?

  9. #19
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Mein Fehler,
    [code]
    print "{015}{017}"; 'BASCOM
    printf (%c%c", 15, 17); 'C (= 0x0F, 0x11)
    [/code}
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Also irgendwie kommt immer nur noch Müll dabei raus. Das was jetzt dabei raus kommt macht irgendwie überhaupt keinen Sinn und ein Muster ist auch nicht zu erkennen:
    Code:
    #define F_CPU	8000000
    #define BAUD_RATE 	9600
    
    #include <avr/delay.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <math.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/sfr_defs.h>
    
    
    #define stopsign '!'
    #define startsign '&'
    volatile char inStr[500];
    volatile int inCnt = 0;
    
    // -- METHODEN DEKLARATIONEN
    void 	keep_moving(void);
    void 	move(int servo, int pos);
    void 	calc_steps(void);
    int 	putChar(char c);
    int 	signum(int val);
    void 	uart_init(int tx, int rx);
    uint8_t uart_readChar(void);
    void 	parseInput(void);
    void 	input(void);
    
    
    volatile uint8_t char_flag = 0;
    
    // -- SERVO VARIABLES
    volatile uint8_t servo_flag = 0;
    
    volatile float shoulder_pos 	= 127.0;
    volatile float elbow_pos 	= 127.0;
    volatile float wrist_pos 	= 127.0;
    volatile float gripper_pos 	= 127.0;
    
    volatile uint8_t shoulder_dest 	= 255;
    volatile uint8_t elbow_dest 	= 1;
    volatile uint8_t wrist_dest	= 127;
    volatile uint8_t gripper_dest	= 250;
    
    volatile float shoulder_step 	= 0;
    volatile float elbow_step 	= 0;
    volatile float wrist_step 	= 0;
    volatile float gripper_step 	= 0;
    
    
    int main (void) {
    	//TIMER-IINTERRUPT AN
    	TCCR0 |= (1<<CS01) | (1<<CS00);
    	TIMSK |= (1<<TOIE0);
    	//UART-INTERRUPT AN
    	UCSRB |= (1<<RXCIE);
    	//UART INITIALISIEREN (RX UND TX ANSCHALTEN)
    	uart_init(1, 1);
    	//GLOBAL INTERRUPT AN
    	sei();
    	//PRINTF FÜR AUSGABE KONFIGURIEREN
      	fdevopen(putChar,NULL,0);
    	printf("\n\n\rSTART !!!\n\r");
    	//HAUPTSCHLEIFE
    	while(1)
    	{
    		//NUR AUFRUFEN, WENN EIN TIMER INTERUPT DA WAR
    		if(servo_flag == 1) {
    			calc_steps();
    			keep_moving();
    		}
    		if(char_flag == 1) {
    			cli();
    			input();
    			sei();
    		}
    	}
    	return 0;
    }
    
    void parseInput(void) {
    	// ANZAHL DER ZEICHEN: inCnt
    	// INDEX DES LETZTEN ZEICHENS inCnt-1
    	cli();
    	printf("\n\rPARSING %s ...\n\r", inStr);
    	int cnt = 0;
    	if(inStr[0] == 's') {
    		printf("SERVO COMMAND FOUND\n\r");
    		int hundreds = (int)inStr[2]-48;
    		int tens = (int)inStr[3]-48;
    		int ones = (int)inStr[4]-48;
    		int number = hundreds*100 + tens*10 + ones;
    		printf("NUMBER: %i\n\r", number);
    		int servo = (int)inStr[1] - 48;
    		switch(servo) {
    		case(1):
    			shoulder_dest = number;
    			printf("\n\rSHOULDER_DEST CHANGED\n\r");
    			break;
    		case(2):
    			elbow_dest = number;
    			printf("\n\rELBOW_DEST CHANGED\n\r");
    			break;
    		case(3):
    			wrist_dest = number;
    			printf("\n\rWRIST_DEST CHANGED\n\r");
    			break;
    		case(4):
    			gripper_dest =  number;
    			printf("\n\rGRIPPTER_DEST CHANGED\n\r");
    		}
    	}
    	sei();
    }
    
    void input(void) {
    	inStr[inCnt] = uart_readChar();
    
    	switch (inStr[inCnt])
    	{
    	case (stopsign):
    		parseInput();
    		inCnt=0;
    		break;
    	case (startsign):
    		inCnt=0;
    		break;
    	default:
    		inCnt++;
    		break;
    	}
    
    	char_flag = 0;
    }
    
    
    // -- METHODEN ZUM BEWEGEN DER Servos
    void keep_moving() {
    
    	//CALCULATE NEW POSITIONS
    	shoulder_pos 	= shoulder_pos + shoulder_step;
    	elbow_pos 	= elbow_pos + elbow_step;
    	wrist_pos	= wrist_pos + wrist_step;
    	gripper_pos	= gripper_pos + gripper_step;
    
    	//SET STEP=0 IF DEST. POSITION WAS REACHED
    	if( (int)(shoulder_pos) == shoulder_dest){ shoulder_step = 0; }
    	if( (int)(elbow_pos) == elbow_dest) { elbow_step = 0; }
    	if( (int)(wrist_pos) == wrist_dest) { wrist_step = 0; }
    	if( (int)(gripper_pos) == gripper_dest) { gripper_step = 0; }
    
    	//POSITIONEN SCHICKEN
    	move(1, (int)shoulder_pos);
    	move(2, (int)shoulder_pos);
    	move(3, (int)elbow_pos);
    	move(4, (int)wrist_pos);
    	move(5, (int)gripper_pos);
    	printf("%c%c", 15, 17);
    
    	printf("POSITION:\tSHOULDER:%i \tELBOW:%i \tWRIST:%i \t GRIPPER:%i\n\r", (int)shoulder_pos,(int)elbow_pos,(int)wrist_pos,(int)gripper_pos);
    
    
    	servo_flag = 0;
    }
    void calc_steps(void) {
    	float shoulder_to_go 	= shoulder_dest - shoulder_pos;
    	float elbow_to_go 	= elbow_dest - elbow_pos;
    	float wrist_to_go 	= wrist_dest - wrist_pos;
    	float gripper_to_go	= gripper_dest - gripper_pos;
    
    	float shoulder_absolute = abs(shoulder_to_go);
    	float elbow_absolute 	= abs(elbow_to_go);
    	float wrist_absolute 	= abs(wrist_to_go);
    	float gripper_absolute	= abs(gripper_to_go);
    
    	shoulder_step = 1;
    	elbow_step = 1;
    	wrist_step = 1;
    	gripper_step = 1;
    
    
    	//GET GREATEST VALUE
    	uint8_t largest_way_servo = shoulder_absolute;
    	if(elbow_absolute > largest_way_servo) { largest_way_servo = elbow_absolute; }
    	if(wrist_absolute > largest_way_servo) { largest_way_servo =  wrist_absolute; }
    	if(gripper_absolute > largest_way_servo) { largest_way_servo = gripper_absolute; }
    
    	//SET STEP DEPENDING ON GREATEST VALUE (BIGGEST STEP=1)
    	shoulder_step = (shoulder_absolute/largest_way_servo) * signum(shoulder_to_go);
    	elbow_step = (elbow_absolute/largest_way_servo) * signum(elbow_to_go);
    	wrist_step = (wrist_absolute/largest_way_servo) * signum(wrist_to_go);
    	gripper_step = (gripper_absolute/largest_way_servo) * signum(gripper_to_go);
    
    }
    void move(int servo, int pos){
          loop_until_bit_is_set(UCSRA, UDRE);
          UDR = '#';
          loop_until_bit_is_set(UCSRA, UDRE);
          UDR = 's';
          loop_until_bit_is_set(UCSRA, UDRE);
          UDR = servo;
          loop_until_bit_is_set(UCSRA, UDRE);
          UDR = pos;
    }
    
    
    //SIGNUM WIRD NUR IN calc_steps BENÖTIGT
    int signum(int val) {
    	if(val != 0) {
    		return val/abs(val);
    	} else {
    		return 0;
    	}
    }
    
    //INTERRUPTS
    SIGNAL (SIG_OVERFLOW0){
    	servo_flag = 1;
    }
    SIGNAL(SIG_USART_RECV) {
    	char_flag = 1;
    }
    
    // -- UART METHODEN
    void uart_init(int tx, int rx) {
       	UBRRL = (F_CPU/(BAUD_RATE*16l)-1);
    	if(tx == 1) {
    		UCSRB |= (1<<TXEN);
    	}
    	if(rx == 1) {
    		UCSRB |= (1<<RXEN);
    	}
    }
    int putChar(char c){
       while ( !( UCSRA & (1<<UDRE)) );
       UDR=c;
       return 0;
    }
    uint8_t uart_readChar(void) {
    	return UDR;
    }

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen