-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Rs-232 Funktioniert ?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45

    Rs-232 Funktioniert ?

    Anzeige

    Hi,
    ich hab das unten angehangene Program auf meinen ATMega32 gefalshed ich bekomme allerdings egal welches zeichen ich sende immer das gleiche zurück (À).

    SYSCLK und BAUD sind natürlich angepasst

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    #define SYSCLK		7372800
    #define BAUD		38400UL
    #define UBRR_BAUD	((SYSCLK/(16*BAUD))-1)
    
    /* USART initialisieren */
    void uart_init(void);
    void init(void);
    
    int main(void)
    {
    	/* USART initialisieren */
    	uart_init();
    
    	sei();
    
    	/* Nichts tun. Die Interrupts erledigten den Rest */
    	while (1)
    		;
    }
    
    void uart_init(void)
    {
    	/* Baudrate einstellen ( Normaler Modus ) */
    	UBRRH = (unsigned char) (UBRR_BAUD>>8);
    	UBRRL = (unsigned char) UBRR_BAUD;
    
    	/* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
    	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    
    	/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
    	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    /* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
    SIGNAL(SIG_UART_RECV)
    {
    	unsigned char buffer;
    
    	/* Daten aus dem Puffer lesen ... */
    	buffer = UDR;
    	
    	/* ... warten bis der Sendepuffer leer ist ... */
    	while ( !( UCSRA & (1<<UDRE)) )
    		;
    	/* ... und gleich wieder zurück schicken */
    	UDR = buffer;
    
    }
    void init(void)
    {
    	DDRB = 0xff;	// PortB als Ausgang deklarieren
    	PORTB = 0x00;	// Ports auf LOW schalten
    }

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45
    wie bekomm ich den raus ob der wirklich auf 16000000 läuft ? oder ob mein quarz nicht funktioniert (falsh angeschlossen ist )

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45
    mh funktioniert.. lag wohl an meinem monitor program ... nen program um den real takt anzuzeigen wäre aber schon cool ( =

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    Ist zwar nur ne grobe Hausnummer, aber lass doch eine LED im Sekundentakt blinken. 10 Zyklen stoppen und dann kannst Du abschätzen wie Dein tatsächlicher Takt ist.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45
    mh ich war wohl was voreilig ich bekomme zwar unterschiedliche zeichen zurück aber keine buchstaben die ich eigentlich auch sende ...

    if (buffer == "a") /* Falls Taster an PIN PB0 gedrueckt.. */
    PORTD = ( 1 << PD7 );

    würde das mit der if bedinung so funktionieren ?

    zu der led würde die nicht 10 mal jede sekunde blinken egal welcher takt eingestellt ist ? da der timer ja aus der taktrate berechnet wird ?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    es muss heissen:

    Code:
    if (buffer == 'a') 
    {
         PORTD = (1<<PD7);
    }

    weil buffer ja vom typ unsigned char ist.


    Den LED Takt im Code berechnest Du, z.B. aus SysCLK = 8000000.

    Wenn jetzt stattdessen die tatsächlice Taktrate des Chips nur 1MHz ist, blinkt die LED 8 mal langsamer.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45
    mh super danke jetz geht es ... mein atmega läuft nur auf 1000000 troz 16mhz quarz ... jemand da ne idee ?

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    28.09.2006
    Beiträge
    67
    hmm hast du die Fuse Bits richtig gesetzt ?
    Musst du zuerst auf externen Quarz umschalten.

    mfg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45
    also die zeichen kommen jetz richtig zurück bis auf einige wenige male ... wie werden die denn im buffer gespeichert als ASCII ? das ich die so wie oben geschrieben abfragen kann ?
    da die if bedingung nciht funktioniert ) =
    habs mal mit buffer =! a probiert ... dies funktioniert ... da auch das a zurück kommt denke ich mal das es nicht im ASCII format gespeichert wird

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    45
    sch**** ich wusste ich hatte was vergessen mach ich gleich mal bubi vieln dank

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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