- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Probleme mit Atmega über FT232 an USB

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    21.02.2015
    Beiträge
    65

    Probleme mit Atmega über FT232 an USB

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Guten Tag,

    ich bin dabei eine Verbindung von einem ATMEGA 1284 über UART / FT232 an den USB zu meinem Pc herzustellen.

    Mein Ziel ist es:
    Die Übertragung von zwei Arrays (ASCII) an meinen PC. Ich habe erst ein int_16t Array geffüllt mit random Zahlen und diese dann in ASCII gewandelt und mit einem Trennzeichen 'x' versehen.

    Mein PC erkennt das eigene Board. Wenn ich HTERM öffne bekome ich mich auch Verbunden nur erhalteich keine Daten. Ich bekomme garnichts angezeigt.

    Ich habe im Programm nach dem senden ma meine LED´s die auf den Board sind angesteuert. Die Leuchten dann auch alle ca. 25sekunden auf.

    Muss ich vlt in der Fuses was einsellen?
    An den RX von dem FT232 geht der TX von Atmega. Spricht gekreuzt habe ich.

    Klicke auf die Grafik für eine größere Ansicht

Name:	FT232.PNG
Hits:	15
Größe:	14,2 KB
ID:	29899
    Klicke auf die Grafik für eine größere Ansicht

Name:	Fuses.PNG
Hits:	13
Größe:	26,4 KB
ID:	29900


    Quelltext:

    Code:
    #define F_CPU 14745600UL		 // CPU Taktfrequenz
    #include <util/delay.h>			 //
    #include <avr/io.h>        	     //
    #include <inttypes.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    
    
    
    /////////////  ---- Baudrate ---- /////////////
    
    #define BAUD 9600UL      // Baudrate
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
    #endif
    
    
    
    /////////////  ---- Initalisiere UART ---- /////////////
    
    void uart_init(void) {
     	UBRR0H = UBRR_VAL >> 8;
     	UBRR0L = UBRR_VAL & 0xFF;
     
     	UCSR0B |= (1<<TXEN0) |(1<<RXEN0);  					// UART TX / RX einschalten
     	UCSR0C = (1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00);  	// Asynchron 8N1 
    }
    
    
    
    /////////////  ---- UART Senden  ---- /////////////
    
    
    int uart_putc(unsigned char sende) {
        while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
        {
        }                             
     
        UDR0 = sende;                      /* sende Zeichen */
        return 0;
    }
     
     
    /* puts ist unabhaengig vom Controllertyp */
    void uart_puts (char *s){
        while (*s)
        {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
            uart_putc (*s);
            s++;
        }
    }
    
    
    
    
    /////////////  ---- MAIN  ---- /////////////
    
    
    int main(void)
    {
       DDRC  = 0xFF; 
       int16_t zw = 0;					//interner Schleifenzähler
      				
       int16_t sendeDaten1 [5];		//WErte Array1
       int16_t sendeDaten2 [5];		//WErte Array2
       char daten1 [31];			//Sende Array1		--> [x32000x12345x67890x......]
       char daten2 [31];			//Sende Array2
      
       uart_init();
    
    while (1) {
    
       for (int16_t i=0; i<6; ++i){
    
       		sendeDaten1 [i] = rand() % 100;	//Zufallswerte in das 1. werte Array
       		sendeDaten2 [i] = rand() % 100;	//Zufallswerte in das 2. werte Array
    
    		daten1[zw] = 'x';					//Trennzeichen x vor jeden WErt
    		daten2[zw] = 'x';					//Trennzeichen x vor jeden WErt
    		
    		itoa (sendeDaten1 [i], daten1[zw+1], 10);	
    		itoa (sendeDaten1 [i], daten2[zw+1], 10);
    
    		zw = zw+6;						//
       }
    
    
       uart_puts( daten1 );			//erste daten Array als ASCII senden
       uart_puts( daten2 );			//zweites daten Array als ASCII seden
    	
    
    
    
    		///// Test Routine ´LED Test ///////
    			
    		PORTC |= (1<<PC0);		// Ausgang auf 1
    		_delay_ms(15);
    		PORTC |= (1<<PC1);    	
    		_delay_ms(15);
    		PORTC |= (1<<PC2);
        	_delay_ms(15);       	
    		
    		PORTC &= ~(1<<PC0);		// Ausgang auf 0
    		_delay_ms(15);
        	PORTC &= ~(1<<PC1);
    		_delay_ms(15);		   	
    		PORTC &= ~(1<<PC2);
        	_delay_ms(20);       	
    
    
    
    } 
     
        while (1) {
          ;
       }
     
       return 0; // never reached 
    }

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Hallo,
    du hast noch die CKDIV8-Fuse aktiv, d.h. der ATmega teilt die Taktfrequenz nochmal durch 8.
    Damit wird die Hardware auch nur 1/8 der im Programm eingestellten Baudrate erzeugen und im Terminal kommt Unsinn an.
    Deaktiviere diese Fuse und teste nochmal
    Grüße, Bernhard
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    21.02.2015
    Beiträge
    65
    Habe jetzt in der Fuses den Haken bei CKDIV8 entfernt.

    Habe dann auch mal die Zeit bei den Test LED auf 500ms erhöht.
    Jetzt blinkt mal und zu mal eine LED extrem kurz, scheinbar undkontrolliert.
    Die Verbindung zu HTERm läss sich weiterhin aufbauen, erhalte jedoch keine Daten, bzw bekomme nichts angezeigt.
    Wenn ich den ISP Adpater entferne, und den Controller neu starte, leuctet dann per zufall eine LED dauerhaft.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Wie wärs, wenn du erst einmal die LEDs im 1s Takt zum blinken bringst? Dann können wir auch über die komplizierteren Themen reden.

    Code:
    #define F_CPU 14745600UL
    #include <util/delay.h>
    #include <avr/io.h>
    
    
    
    
    int main(void) {
    	DDRC = 0xFF;
    
    
    	while(1) {
    		PortC |= (1<<PC0) | (1<<PC1) | (1<<PC2);
    		_delay_ms(1000);
    		
    		PortC &= ~((1<<PC0) | (1<<PC1) | (1<<PC2));
    		_delay_ms(1000);
    	}
    	
    	return 0;
    }
    mfg

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    21.02.2015
    Beiträge
    65
    In einem anderen Programm habe ich bereits diese Funktion getestet. (LED)
    Habe jetzt ebefalls in diesem Programm mal die Test Routine für die LED´s in einer seperaten while (1) Schleife direkt nach der initalisierung geschaltet. Funktoniert.

    Habe aber jetzt die LED Test routine wieder direkt nach dem UART sende Befehl.

    Ist in der Fuses der Hacken bei CKDIV8 NICHT gesetzt blinkt auch nichts. Ist der Hacken gesetzt, so funktioniert die LED test Routine aber wesentlich langsamer als die eingestellte zeit.
    Die LED Test routine habe ich nur als HILFE ob das Programm die Zeile abarbeitet.

    !! Aber um die LED´s geht es mir nicht. Mir geht es um die UART Verbindung. !!

    - - - Aktualisiert - - -

    Nah wie vor, bekomme ich in HTERM nichts angezeigt. Verbindung geht wohl, aber nichts angezeigt, kann es sein das ich bei HTERM auch noch was einstellen muss?

    Aber wenn die LED Testroutine nicht funktioniert, dann ist ja generell schonmal etwas nicht i.O.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    !! Aber um die LED´s geht es mir nicht. Mir geht es um die UART Verbindung. !!
    !! Aber es hat keinen Sinn, beim UART weiter zu machen wenn nicht mal sowas simples funktioniert !!

    mfg

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    21.02.2015
    Beiträge
    65
    Wie gesagt, die LED´s funktionieren, nur wenn ich sie hinter den UART befehl setzte funktionieren sie nicht.

    Habe noch zwei Warnings, wovon könnten diese kommen:
    ../UART.c:92: warning: passing argument 2 of 'itoa' makes pointer from integer without a cast
    ../UART.c:93: warning: passing argument 2 of 'itoa' makes pointer from integer without a cast

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Wie gesagt, die LED´s funktionieren, nur wenn ich sie hinter den UART befehl setzte funktionieren sie nicht.
    Ist der Hacken gesetzt, so funktioniert die LED test Routine aber wesentlich langsamer als die eingestellte zeit.
    Hört sich aber gar nicht so an...

    Also, blinken die LEDs genau im 1s Takt bei _delay_ms(1000)??

    mfg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    21.02.2015
    Beiträge
    65
    Nein wesentlich langsamer, tippe auf so ca. knapp 2sek.
    Wenn ich CKDIV8 den hacken setzte entsprechend noch langsamer.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    CKDIV8 nicht setzen und im sourcecode 8MHz bei f_cpu angeben. Dann nochmal testen.

    mfg

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. USB Modul mit FT232 an PIC?
    Von bjacke im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 24.12.2009, 08:33
  2. FT232 und Atmega32 Probleme (gelöst=
    Von Martin. im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 09.10.2009, 11:21
  3. Atmega 32 über Usb programmieren
    Von Seppi1203 im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 11.01.2007, 22:42
  4. Probleme mit RS232-Verbindung über USB-Serial-Adapter
    Von steph im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 25.12.2005, 00:23
  5. Probleme I/O über usb>RS232
    Von Jenzi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 10.11.2004, 08:20

Berechtigungen

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

Labornetzteil AliExpress